diff --git a/.travis.yml b/.travis.yml index 178fe2b63d..9dde9454e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,8 @@ before_install: before_script: - sleep 15 # wait for mongodb to be ready - "mongo mydb_test --eval 'db.createUser({user:\"travis\", pwd: \"test\", roles: []});'" - - sh -c "if [ '$DB' = 'mongodb' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"mongo\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"hAN3Eg8W\\\",\\\"admin:password:confirm\\\":\\\"hAN3Eg8W\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":27017,\\\"database\\\":0}\"; fi" - - sh -c "if [ '$DB' = 'redis' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567/forum\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"redis\\\",\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"hAN3Eg8W\\\",\\\"admin:password:confirm\\\":\\\"hAN3Eg8W\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":6379,\\\"database\\\":0}\"; fi" + - sh -c "if [ '$DB' = 'mongodb' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"mongo\\\",\\\"mongo:host\\\":\\\"127.0.0.1\\\",\\\"mongo:port\\\":27017,\\\"mongo:username\\\":\\\"\\\",\\\"mongo:password\\\":\\\"\\\",\\\"mongo:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"hAN3Eg8W\\\",\\\"admin:password:confirm\\\":\\\"hAN3Eg8W\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":27017,\\\"database\\\":\\\"travis_ci_test\\\"}\"; fi" + - sh -c "if [ '$DB' = 'redis' ]; then node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567/forum\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"redis\\\",\\\"redis:host\\\":\\\"127.0.0.1\\\",\\\"redis:port\\\":6379,\\\"redis:password\\\":\\\"\\\",\\\"redis:database\\\":0,\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"hAN3Eg8W\\\",\\\"admin:password:confirm\\\":\\\"hAN3Eg8W\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":6379,\\\"database\\\":1}\"; fi" - sh -c "if [ '$DB' = 'postgres' ]; then psql -c 'create database nodebb;' -U postgres; psql -c 'create database travis_ci_test;' -U postgres; node app --setup=\"{\\\"url\\\":\\\"http://127.0.0.1:4567\\\",\\\"secret\\\":\\\"abcdef\\\",\\\"database\\\":\\\"postgres\\\",\\\"postgres:host\\\":\\\"127.0.0.1\\\",\\\"postgres:port\\\":5432,\\\"postgres:password\\\":\\\"\\\",\\\"postgres:database\\\":\\\"nodebb\\\",\\\"admin:username\\\":\\\"admin\\\",\\\"admin:email\\\":\\\"test@example.org\\\",\\\"admin:password\\\":\\\"hAN3Eg8W\\\",\\\"admin:password:confirm\\\":\\\"hAN3Eg8W\\\"}\" --ci=\"{\\\"host\\\":\\\"127.0.0.1\\\",\\\"port\\\":5432,\\\"username\\\":\\\"postgres\\\",\\\"database\\\":\\\"travis_ci_test\\\"}\"; fi" after_success: - "npm run coveralls" diff --git a/CHANGELOG.md b/CHANGELOG.md index 26444d0188..652b086e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,465 @@ -#### 1.11.0 (2018-12-14) +### 1.12.0 (2019-03-06) + +##### Chores + +* incrementing version number - v1.12.0 (d87f8c52) +* incrementing version number - v1.11.2 (757bff27) +* **deps:** + * update node:8.15.1 docker digest to 287b8a5 (0b8d1833) + * update node.js to v8.15.1 (ae89db28) + * update dependency mocha to v6 (#7387) (30bdb1a1) + * update dependency coveralls to v3.0.3 (#7397) (cf74904c) + * update dependency eslint to v5.14.1 (4df9c206) + * update dependency jsdom to v13.2.0 (cb5e3d83) + * update node:8.15.0 docker digest to a8a9d8e (edcb5314) + * update dependency nyc to v13.3.0 (a78f5da5) + * update dependency lint-staged to v8.1.4 (18c90913) + * update dependency eslint to v5.14.0 (9d8d2d0d) + * update commitlint monorepo (aed5b29d) + * update dependency eslint-plugin-import to v2.16.0 (e0fa6965) + * update dependency @commitlint/cli to v7.4.0 (362d9397) + * update dependency lint-staged to v8.1.1 (96644350) + +##### Documentation Changes + +* updated changelog (aec2f210) + +##### New Features + +* admin/groups style change (2b6f1a05) +* add process cpu usage to admin (db477538) +* pass options to digest (23da3009) +* revamp email templates to be more style agnostic (#7375) (f32a9922) +* lower search timeout (fc830c0f) +* quick search (8a0e1280) +* add vote status to getPostData API call (eafe76de) +* make topic search a function (d2b83967) +* quick search (c01d43e0) +* check overide (ba90bf31) +* check CI failure (f2d7f75e) +* logging password resets and errors into event log (0c09b740) +* add `action:alert.new`, `action:alert.update` hooks (daadcc48) +* allow themes to define custom classes for categories via filter:admin.category.get (5031bfe8) +* show more unread notifs (d75a0d77) +* pass topic creation data to action:topic.save (cd2f72fb) +* textcomplete over jquery-textcomplete, closes #7309 (02a8ed9b) +* new hook filter:privileges.posts.edit (f659ef4d) +* new hook type: `response` (a23854e3) + +##### Bug Fixes + +* **deps:** + * update dependency nodebb-theme-persona to v9.1.24 (0f2d3181) + * update dependency nodebb-plugin-composer-default to v6.2.7 (#7411) (9ebc900a) + * bump markdown (82c8ee3f) + * bump markdown (7ce5a81f) + * bump persona (a0b71f09) + * update dependency nodebb-theme-vanilla to v10.1.21 (#7404) (699eddcb) + * update dependency nodebb-theme-persona to v9.1.22 (#7403) (d87751ea) + * update dependency nodebb-theme-persona to v9.1.21 (#7401) (f721155d) + * update dependency nodebb-theme-slick to v1.2.21 (#7398) (f6e55651) + * update dependency nodebb-widget-essentials to v4.0.14 (#7399) (f812e0b7) + * update dependency nodebb-theme-persona to v9.1.19 (#7392) (deff7b34) + * update dependency nodebb-plugin-composer-default to v6.2.6 (#7389) (fab32a49) + * update dependency nodebb-theme-persona to v9.1.18 (042b81a0) + * update dependency nodebb-theme-persona to v9.1.17 (#7379) (546e04e1) + * update dependency nodebb-plugin-composer-default to v6.2.5 (#7374) (d0874f34) + * update dependency async to v2.6.2 (#7365) (264eadde) + * update dependency nodebb-plugin-composer-default to v6.2.4 (30ff4582) + * update dependency nodebb-theme-persona to v9.1.16 (65df6711) + * update dependency nodebb-plugin-markdown to v8.9.0 (07b29d59) + * bump contenteditable to v0.1.1, #7325 (fbbe2ab7) + * update dependency nodebb-plugin-composer-default to v6.2.3 (#7341) (176efb5f) + * update dependency nodebb-theme-persona to v9.1.15 (#7295) (8f69ffd4) + * update dependency nodebb-theme-slick to v1.2.20 (#7197) (a82bd3d0) + * update dependency nodebb-theme-lavender to v5.0.9 (#7322) (b350be27) + * update dependency nodebb-plugin-composer-default to v6.2.2 (99f82fb3) + * update dependency winston to v3.2.1 (#7317) (7e872d32) + * update dependency nodebb-plugin-markdown to v8.8.8 (#7314) (9cf81afe) + * update dependency nodebb-plugin-dbsearch to v3.0.6 (#7305) (d48ef6d8) + * update dependency nodebb-plugin-dbsearch to v3.0.5 (#7304) (57e3f162) + * update dependency nodebb-theme-vanilla to v10.1.19 (#7301) (443dcee4) + * update dependency winston to v3.2.0 (#7299) (6f957cb9) + * update dependency nodebb-plugin-spam-be-gone to v0.6.0 (247ac828) +* #7413 (684175f7) +* #7414 (e331f6b5) +* l2spread @baris nib (0360f6e1) +* restored email logo to all outgoing emails (6c1f9c3c) +* die hydra!!! (ad6c8dcc) +* incorrect teaserPost logic (97313508) +* normalized font sizes for paragraphs in digest (43c4eb23) +* removed notification subheader translation string (6f272e34) +* broken 50% border radius on emails, failing tests (d3a10628) +* hook names getting objectified by winston (6472a065) +* failing tests from revamped-emails branch (3a7f1c19) +* #7395 (03305db8) +* mounting of all-route middlewares to router instead of app (d722f3b8) +* incorrect returnTo set in registerComplete (f972f752) +* search.api not working on subfolder (158f68eb) +* tests for #7385 (7a534453) +* #7385 better handling for errors in Adv>Databases (57069a5c) +* no relative path needed in req.session.returnTo (949b10f1) +* don't refresh page when enabling/disabling categories (d5ece9a4) +* #7373 (c2e7ae7f) +* autocomplete not triggered if chat switched (ab0e547d) +* #7366 (6c2f48f1) +* #7357 (45c322ae) +* #7359 (2996a5dc) +* re-introducing indeterminate checkbox state to ACP privs (e8f3c256) +* #7354 (c6ad8fae) +* uid check (efd7d953) +* uid checks (c24dcf78) +* only allow numbers as scores (#7356) (5917dec2) +* #7231, missing success alert on group name change in ACP (0fffcb38) +* remove debug logs (fe63fca8) +* don't use same db as prod values (39e35275) +* database 0 was being replaced with undefined because 0 is falsy (bcd62586) +* #7352 (2e2c3ac1) +* #7261, banned users still get digests (aca05560) +* #7346, panel-header widget colours in ACP (91a7b907) +* #7350 (8c68780e) +* eslint failure from daadcc4889a91b9bbd279d49db348610cc079ccc (96b6ce1f) +* prevent crash if results.stats or results.serverStatus is undefined (fab52b84) +* move `action:alert.update` to after translator (d864da1a) +* #7098 (fc6767e1) +* #7232 (70d9c6c4) +* #7229 (e59b907d) +* #7339 (12c58990) +* #7338 (8e3bf581) +* dont crash if userData is undefined #7262 (56a493d8) +* #7240 (a2f08e7d) +* give default privs on new install to guests/spiders (cd120990) +* #6806 (c72da559) +* #7334 (ae779ea4) +* closes #7217 (9d1fcf4e) +* merge post notifs (6e69a9ab) +* don't crash if body doesn't have `skin-` (f6cfbbb5) +* #7324 (c7abf07a) +* allow regular groups to local login (0366cfd8) +* #7316 (5353960a) +* #7306 (8aebe884) +* #7312 (7a4a8ea4) +* #7311, missing dependencies (263e58df) +* #7300 (920efad0) +* #6848 (70f8b418) +* #7298 privilege header misalignment (df6f75eb) +* #7211 (cf918078) +* #7215 (7a9780f6) +* #7296, local login privilege available to registered-users only (7fb3c168) +* #7094 (d03220cd) + +#### 1.11.2 (2019-01-24) + +##### Chores + +* incrementing version number - v1.11.2 (757bff27) +* incrementing version number - v1.11.1 (2104877c) +* **deps:** + * update node:8.15.0 docker digest to cb66110 (1719cd77) + * update dependency eslint-plugin-import to v2.15.0 (f7191eb9) + * update dependency eslint to v5.12.1 (d928c54d) + * update dependency @commitlint/cli to v7.3.2 (6ae2b972) + * update node.js to v8.15.0 (ac39fe90) + * update dependency eslint to v5.12.0 (f96ef7bb) + * update commitlint monorepo to v7.3.1 (50594118) + * update dependency smtp-server to v3.5.0 (00063708) + * update dependency husky to v1.3.1 (719995a4) + * update dependency eslint to v5.11.0 (#7151) (26f3bdbf) + * update dependency husky to v1.3.0 (eb606281) + * update dependency jsdom to v13.1.0 (60e9430b) + * update dependency eslint to v5.10.0 (#7084) (dae861da) + * update dependency husky to v1.2.1 (63f4b569) + * update node:8.14.0 docker digest to dd2381f (7449ae3e) + * update node.js to v8.14.0 (8a5a031d) + * update dependency lint-staged to v8.1.0 (dd7f8a14) + * update dependency husky to v1.2.0 (aee21628) + * update node:8.12.0 docker digest to 5dae8ea (0ef451dd) + * update dependency husky to v1.1.4 (95d6ab06) + * update dependency eslint to v5.9.0 (92441794) + * pin dependencies (b0483f21) + * update dependency eslint-config-airbnb-base to v13 (#6599) (64b9dabf) + * update node.js to v8.12.0 (fa3afbd2) + * update dependency husky to v1.1.3 (6cee5b8e) + * update dependency lint-staged to v8.0.4 (9d258668) + * update dependency lint-staged to v8.0.3 (aaa6fe9e) + * update dependency lint-staged to v8 (95d7a5fa) + * update dependency jsdom to v13 (52f141c9) +* **husky:** setting up husky as recommended in docs (e8a3d929) + +##### Documentation Changes + +* updated changelog for v1.11.1 (c04e192d) + +##### New Features + +* new hook filter:user.logout (63061ffd) +* explicit handling of SSO success and failure (059a4be2) +* additional options for SSO plugins (2b9322e1) +* get rid of disk access (ed5d2d6d) +* support for one-click unsubscribe from email clients (#7203) (70a87d43) +* added new hook `static:sockets.validateSession` (#7189) (0263b4da) +* #7120 (f4ea2c43) +* #7032 (0c1ac4d6) +* small fixes (fef7e13c) +* name topic controller (b9b9d8b2) +* header (0cb9bba4) +* more naming (ae0fe5e8) +* give the rest of the middlewares names (f88db22c) +* give names to more middlewares (fdfbcc6e) +* give names to middlewares (53793e16) +* change sortedSetsScore (d2c2d56f) +* Allow getting logfile path from config (#7044) (f3e8e065) +* remove uid::ignored:cids (#7099) (263c9180) +* cache category tag whitelist (78fa7340) +* make user cards look less derpy (31bb2ae9) +* added new middleware authenticateOrGuest (4fba1492) +* closes #7070 (7ca62b83) +* added README.md in languages folder (648964fa) +* up composer (7eee8e1d) +* allow array results (54c127d1) +* #7023 (f581c052) +* close #7002, console message if mismatched origins (89c025d1) +* added changelog file to root of repo (e89b4fca) +* enabling commitlint (c58a41ed) +* allow disabling of GDPR features via ACP toggle, closes #6847 (4919e9ef) +* **deps:** update bootstrap to v3.4.0 (#7106) (d1ea5d15) +* **email:** don't escape html in notification bodies. (#7042) (d7c55bc3) + +##### Bug Fixes + +* test (bc41848a) +* #7235 (7064fd06) +* use ACP config value for checking online status (ef0e7808) +* log error to prevent headers already sent (a22a3a98) +* #7289 timeago shorthand toggle fails on non-existant language (cee47f78) +* #7276 improper request for client-noskin.css (5ee173c2) +* #7274 incorrect handling of client script 404s (831d0795) +* #7270 Flags graph label not translatable (8ceb35f5) +* #7266 body does not contain skin class (f122fc44) +* generate timeago codes from files (7524d3c3) +* removal of timeago fallback middleware (#7259) (c831ff0d) +* post queue notifs (ac655564) +* added missing translation and error state for password change (51b5fb98) +* #7236, header search stops working after header update (3859d417) +* #7226, added placeholder styling for fa-nbb-none (87c2d108) +* escape hook method (9328eeca) +* #7216, hide taskbar on chat modal invocation on mobile (a70db885) +* #7208 (428f587c) +* #7054 (a662f118) +* #7209 (b9833483) +* missing notification (1a3838e1) +* #7193, closes #7194 (7809ba28) +* #https://github.com/barisusakli/nodebb-plugin-dbsearch/issues/49 (6f1fb4eb) +* #7187 (28459d04) +* #7176, FUOC on app.reskin() (954af0f0) +* #7174 (9aa1aa68) +* #7181 (0d409610) +* #7142 (8da3b2a4) +* #7179 (03299736) +* #7169 Fixed logout being broken (b0eaa858) +* #7167, composer and chat not closing on logout (629b3554) +* shorter function (43e7cc0a) +* #7162 (2da0a657) +* uid filtering (72afc180) +* dont crash if default cover is invalid (41fb5cca) +* #7136 socket.disconnect() now called on invalid session (8e9de540) +* RTL not respected when changed in user settings, related to #7146 (4873a339) +* #7146 Better RTL handling on (de-)authentication (d81e0a5f) +* #7118, invoking autoLocale middleware on logout (900f0a0b) +* closes #6784 (#7137) (7fb29f42) +* 7100 (ab81cca7) +* #7139 (3917022a) +* #7116 (7e828404) +* #7138 (29a85aec) +* lint (b47f939b) +* #7091, #7093 (69e0dbbf) +* #7131 (d31684e8) +* remove cache (b2a74b41) +* loop (60390c01) +* #7124 (4650a760) +* unread badge (9f506268) +* move the check to get methods (99e0895e) +* #7115 (989879a6) +* #6979 (29b63ae7) +* upgrade script key (0eef3e1c) +* remove log (00afc5b3) +* #7108 (81697390) +* dont save data for non-positive uids (62f01a83) +* #7103 (f103390a) +* dont update cid::tids:votes if topic is pinned (2f57a4b9) +* #7102 (d117df77) +* #7102 (85a07e99) +* don't explode if there is no css el (74d0e88d) +* db info page (26ccd8f6) +* logAttempt conditional (a6c8e0ab) +* #7087, server-side protection against guest blocks (33d4956b) +* don't crash in flags.validate if user blocked target (81aa3a0b) +* dont send empty strings (555c092f) +* #7085 (fe0f95a2) +* #7086 (e55fb437) +* wrong variable #7085 (71163421) +* admins&mods when there are mutliple lines of users (de437e36) +* refreshing settings page on save if language changed (ed46c5e2) +* not calling authenticate middleware on resource direct access routes (eeaee8cc) +* #7038, autoLocale logic not playing nicely with no-refresh auths (#7059) (5f3d1c76) +* #7074 (2604cf63) +* #7071 buildSkinAsset won't rebuild continuously (a07d9898) +* #7063, logout code should do hard page nav to / or data.next (6df5668e) +* #7061 (eab297bd) +* skin not changing after login or logout, #7038 (28a1fa78) +* #7040 (a63ddbe2) +* #7041 (ec0c50d4) +* #7043 (8d7c3897) +* add missing render function (cb7c2d8c) +* #7033 (8808a033) +* #7037 (b86f1556) +* #6991, add timeout for version Github request (43c3bb02) +* #7030 (58d4376f) +* added admin/manage/uploads to tx config (7357926f) +* #7013, add cache buster to js-enabled.css (f6b92c1d) +* removal of scroll anchoring code in favour of browser handling (98c14e0e) +* custom navigation item not showing groups (d9452bf3) +* flags detail page crash if reporter blocks author (d027207f) +* #6922, skin assets not including plugin LESS files (a5022ce4) +* #6921, allow square brackets in usernames (da10ca08) +* interstitial redirects failing if done via ajaxify (3c8939a8) +* username trim on login, closes #6894 (157bea69) +* **deps:** + * update dependency nodebb-widget-essentials to v4.0.13 (#7293) (22cbcc3e) + * update dependency mongodb to v3.1.13 (1aadbc3c) + * update dependency postcss to v7.0.14 (4d64de76) + * #7271, updating autoprefixer to latest version (a7af0198) + * #7270 (b48f1b4d) + * update dependency sharp to v0.21.3 (#7267) (8a64667f) + * theme upgrades for #7266 (5607261c) + * update dependency mongodb to v3.1.12 (eeab7d20) + * update dependency mongodb to v3.1.11 (#7252) (b5f188b6) + * update dependency validator to v10.11.0 (77dc8fc7) + * update dependency nodebb-plugin-composer-default to v6.1.21 (2fbb2614) + * update dependency postcss to v7.0.12 (f1842295) + * update dependency postcss to v7.0.11 (57bec2fb) + * update dependency sharp to v0.21.2 (8f3c4b09) + * update dependency postcss to v7.0.10 (82475fe5) + * update dependency postcss to v7.0.9 (f171c169) + * update dependency nodebb-theme-vanilla to v10.1.15 (ea059e89) + * update dependency nodebb-theme-persona to v9.1.10 (96482569) + * update dependency nodebb-theme-persona to v9.1.9 (bbe05043) + * update dependency nodebb-theme-vanilla to v10.1.14 (6cc5dbc8) + * update dependency nodebb-theme-persona to v9.1.8 (e5443690) + * update dependency pg-cursor to v2 (29acad42) + * update dependency diff to v4 (#7198) (84e228bb) + * update dependency nodebb-plugin-mentions to v2.5.2 (#7199) (0a647316) + * update dependency nodebb-plugin-markdown to v8.8.7 (90b4d40e) + * update dependency rimraf to v2.6.3 (f4cc3122) + * update dependency spider-detector to v1.0.19 (#7177) (0faba325) + * update dependency nodemailer to v5 (4993b03c) + * update dependency json-2-csv to v3 (80cee665) + * update dependency nodebb-plugin-composer-default to v6.1.20 (07bf0b98) + * update dependency nodebb-theme-persona to v9.1.7 (#7161) (c68d4ae8) + * update dependency nodebb-plugin-composer-default to v6.1.19 (#7159) (07af46ea) + * update dependency nodebb-plugin-composer-default to v6.1.18 (#7158) (584b45fc) + * update dependency validator to v10.10.0 (#7152) (8003bed8) + * update dependency nodebb-plugin-mentions to v2.5.0 (792dce14) + * update dependency nodebb-theme-persona to v9.1.6 (#7141) (325b0293) + * update dependency nodebb-plugin-dbsearch to v3.0.4 (ddd07c1a) + * update dependency nodebb-widget-essentials to v4.0.12 (#7133) (f614a44d) + * update dependency nodebb-plugin-mentions to v2.4.0 (9ab31d7e) + * update dependency postcss to v7.0.7 (7ef8c3fd) + * update dependency sharp to v0.21.1 (#7082) (bf75f3e3) + * update dependency nodebb-theme-vanilla to v10.1.13 (#7114) (fc5598b9) + * update dependency nodebb-theme-slick to v1.2.19 (#7113) (56ad43aa) + * update dependency nodebb-theme-persona to v9.1.5 (#7112) (953f8fe5) + * update dependency nodebb-plugin-composer-default to v6.1.17 (3bcfd7fc) + * update dependency nodebb-theme-persona to v9.1.4 (b6ad5fd4) + * update dependency nodebb-plugin-markdown to v8.8.6 (#7079) (46fb365d) + * update dependency nodebb-theme-persona to v9.1.3 (#7075) (d2aea57a) + * update dependency nodebb-theme-persona to v9.1.2 (42e792ab) + * update dependency nodebb-theme-persona to v9.1.1 (#7069) (bdb33056) + * update dependency postcss to v7.0.6 (6b5428c5) + * update dependency nodebb-plugin-composer-default to v6.1.14 (#7058) (e48ed6e0) + * update dependency nodebb-plugin-composer-default to v6.1.13 (#7057) (ada1d6d0) + * update dependency nodebb-plugin-composer-default to v6.1.12 (#7056) (9f9f72da) + * update dependency nodebb-plugin-composer-default to v6.1.11 (#7055) (89acb896) + * update dependency nodebb-theme-slick to v1.2.18 (#7049) (b6cb77c1) + * update dependency nodebb-theme-slick to v1.2.17 (#7048) (7334c45b) + * update dependency nodebb-theme-slick to v1.2.16 (#7047) (1cb1af0c) + * update dependency connect-mongo to v2.0.3 (#7046) (d0d0c7f0) + * update dependency nodebb-plugin-dbsearch to v3.0.3 (#7035) (adb1b5f3) + * update dependency lru-cache to v4.1.5 (#7031) (887582eb) + * update dependency socket.io to v2.2.0 (b9d49867) + * update dependency socket.io-client to v2.2.0 (824bd541) + * update dependency nodebb-plugin-dbsearch to v3.0.2 (#7028) (11f1b409) + * update dependency nodebb-plugin-dbsearch to v3.0.1 (#7027) (e71f443c) + * update dependency nodebb-theme-vanilla to v10.1.12 (cf928f44) + * update dependency nodebb-theme-persona to v9.1.0 (179be9ed) + * update dependency nodebb-theme-persona to v9.0.63 (#7019) (68ae3eb6) + * update dependency nodebb-plugin-markdown to v8.8.5 (d3ab7d1b) + * update dependency nodebb-theme-persona to v9.0.60 (#6984) (cbd50a80) + * update dependency nodebb-theme-vanilla to v10.1.10 (#6982) (4c769487) + * update dependency nodebb-theme-slick to v1.2.15 (#6981) (acaf1a05) + * update dependency nodebb-theme-persona to v9.0.59 (#6980) (5863bb2c) + * update dependency lru-cache to v4.1.4 (#6977) (375ab769) + * update dependency connect-mongo to v2.0.2 (#6975) (e1597b83) + * update dependency nodebb-plugin-markdown to v8.8.4 (84d1013d) + * update dependency nodebb-plugin-composer-default to v6.1.8 (fee7e336) + * update dependency nodebb-plugin-markdown to v8.8.3 (b182a195) + * update dependency nodebb-plugin-composer-default to v6.1.7 (#6966) (1101f327) + * update dependency nodebb-theme-persona to v9.0.58 (#6964) (6ade156b) + * update dependency mongodb to v3.1.10 (#6962) (662215fa) + * update dependency nodebb-theme-persona to v9.0.57 (#6956) (1bf1a439) + * update dependency nodebb-theme-persona to v9.0.55 (#6955) (e06683f7) + * update dependency nodebb-plugin-composer-default to v6.1.6 (c51ceaf0) + * update dependency nodebb-theme-persona to v9.0.54 (bb940b01) + * update dependency nodebb-plugin-mentions to v2.2.12 (#6936) (e12a803b) + * update dependency nodebb-theme-vanilla to v10.1.9 (#6935) (b480c321) + * update dependency nodebb-theme-slick to v1.2.14 (#6934) (9cdd5316) + * update dependency nodebb-theme-persona to v9.0.53 (#6933) (9ee1c2f8) + * update dependency nodebb-plugin-dbsearch to v2.0.23 (#6931) (dba1db9c) + * update dependency jsesc to v2.5.2 (511b4edc) + * update dependency validator to v10.9.0 (032caafa) + * update dependency spdx-license-list to v5 (a639b6b8) + * update dependency nodebb-theme-vanilla to v10.1.8 (eb0a322d) + * update dependency nodebb-theme-persona to v9.0.52 (6566a0cb) + * update dependency nodebb-plugin-dbsearch to v2.0.22 (#6916) (7808e58c) + * update dependency mongodb to v3.1.9 (#6914) (9a9f2af9) + * update dependency nodebb-theme-persona to v9.0.51 (e2274fe0) + * update dependency nodebb-theme-slick to v1.2.13 (3005428d) + * update dependency nodebb-theme-persona to v9.0.50 (#6902) (22140a20) + * update dependency nodebb-plugin-markdown to v8.8.2 (0b4c9a80) + * update dependency nodebb-theme-vanilla to v10.1.7 (3150a2fc) + * update dependency nodebb-theme-slick to v1.2.12 (#6881) (9bcda7f7) + * update dependency nodebb-theme-persona to v9.0.49 (#6880) (e0dc00da) + * update dependency nodebb-theme-persona to v9.0.48 (2b6f5eec) +* **i18n:** pushed notifications source to tx, pulled fallbacks (8dd8370b) +* **uploads:** ugly filenames on uploaded asset downloading (f96208a0) +* **acp:** + * small UI fixes for ACP privileges category selector (#6946) (57b39d5b) + * hard-to-discover dropdown selector in ACP (b3f96d28) +* **l10n:** some translations (34cbd1fc) + +##### Other Changes + +* //github.com/NodeBB/nodebb-theme-persona/issues/363 (702be3f6) +* //github.com/NodeBB/NodeBB/issues/6433 (7e00d6b9) +* #6408 (f0f30041) +* #6425 (fbf52407) +* //github.com/NodeBB/NodeBB/issues/6073 (5da24b41) +* #5862, setting chat list height even if no message list is present (bc9a1250) +* //github.com/Schamper/nodebb-plugin-poll/issues/86 (c0f39032) + +##### Refactors + +* use loash when possible (#7230) (e1ca2d81) + +##### Code Style Changes + +* lint fix (fbe6ccd7) +* **eslint:** + * match operator-linebreak preferences (ba619c7e) + * newlines in public/src as well (f7bd398e) + * enforcing newline on chained calls (95cc27f1) + +#### 1.11.1 (2018-12-14) ##### Chores diff --git a/Dockerfile b/Dockerfile index 89b051103d..2de61215ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # The base image is the latest 8.x node (LTS) -FROM node:8.15.0@sha256:5aebe186c00da3308c8fde5b3a246d1927a56947a1b51f5c4308b7318adf74f4 +FROM node:8.15.1@sha256:918f0be3932f555cd2645ca828b9c231a2dab10d9cf2dbb58896411207bbe52f RUN mkdir -p /usr/src/app WORKDIR /usr/src/app diff --git a/install/data/defaults.json b/install/data/defaults.json index 717d4eae52..c99c67b42d 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -59,7 +59,6 @@ "allowProfileImageUploads": 1, "teaserPost": "last-reply", "allowPrivateGroups": 1, - "allowGroupCreation": 0, "unreadCutoff": 2, "bookmarkThreshold": 5, "autoDetectLang": 1, @@ -91,6 +90,7 @@ "postsPerPage": 20, "userSearchResultsPerPage": 50, "maximumGroupNameLength": 255, + "maximumGroupTitleLength": 40, "preventTopicDeleteAfterReplies": 0, "feeds:disableSitemap": 0, "sitemapTopics": 500, @@ -99,6 +99,8 @@ "maximumInvites": 0, "username:disableEdit": 0, "email:disableEdit": 0, + "email:sendmail:rateLimit": 2, + "email:sendmail:rateDelta": 1000, "hideFullname": 0, "allowGuestHandles": 0, "disableRecentCategoryFilter": 0, diff --git a/install/package.json b/install/package.json index 40db66a770..8365f4f0e1 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "1.11.1", + "version": "1.12.0", "homepage": "http://www.nodebb.org", "repository": { "type": "git", @@ -31,8 +31,8 @@ "dependencies": { "ace-builds": "^1.2.9", "archiver": "^3.0.0", - "async": "2.6.1", - "autoprefixer": "^9.0.0", + "async": "2.6.2", + "autoprefixer": "^9.4.6", "bcryptjs": "2.4.3", "benchpressjs": "^1.2.5", "body-parser": "^1.18.2", @@ -49,7 +49,7 @@ "connect-mongo": "2.0.3", "connect-multiparty": "^2.1.0", "connect-pg-simple": "^5.0.0", - "connect-redis": "3.4.0", + "connect-redis": "3.4.1", "continuation-local-storage": "^3.2.1", "cookie-parser": "^1.4.3", "cron": "^1.3.0", @@ -62,7 +62,7 @@ "express-useragent": "^1.0.12", "graceful-fs": "^4.1.11", "helmet": "^3.11.0", - "html-to-text": "^4.0.0", + "html-to-text": "^5.0.0", "ipaddr.js": "^1.5.4", "jquery": "^3.2.1", "jsesc": "2.5.2", @@ -75,31 +75,31 @@ "material-design-lite": "^1.3.0", "mime": "^2.2.0", "mkdirp": "^0.5.1", - "mongodb": "3.1.12", + "mongodb": "3.2.2", "morgan": "^1.9.0", "mousetrap": "^1.6.1", "mubsub-nbb": "^1.5.0", "nconf": "^0.10.0", - "nodebb-plugin-composer-default": "6.1.22", - "nodebb-plugin-dbsearch": "3.0.4", + "nodebb-plugin-composer-default": "6.2.11", + "nodebb-plugin-dbsearch": "3.0.6", "nodebb-plugin-emoji": "^2.2.5", "nodebb-plugin-emoji-android": "2.0.0", - "nodebb-plugin-markdown": "8.8.7", + "nodebb-plugin-markdown": "8.9.2", "nodebb-plugin-mentions": "2.5.2", "nodebb-plugin-soundpack-default": "1.0.0", - "nodebb-plugin-spam-be-gone": "0.5.5", + "nodebb-plugin-spam-be-gone": "0.6.1", "nodebb-rewards-essentials": "0.0.13", - "nodebb-theme-lavender": "5.0.8", - "nodebb-theme-persona": "9.1.14", - "nodebb-theme-slick": "1.2.19", - "nodebb-theme-vanilla": "10.1.16", - "nodebb-widget-essentials": "4.0.12", - "nodemailer": "^5.0.0", + "nodebb-theme-lavender": "5.0.9", + "nodebb-theme-persona": "9.1.29", + "nodebb-theme-slick": "1.2.23", + "nodebb-theme-vanilla": "10.1.25", + "nodebb-widget-essentials": "4.0.17", + "nodemailer": "^6.0.0", "passport": "^0.4.0", "passport-local": "1.0.0", "pg": "^7.4.0", "pg-cursor": "^2.0.0", - "postcss": "7.0.12", + "postcss": "7.0.14", "postcss-clean": "1.1.0", "promise-polyfill": "^8.0.0", "prompt": "^1.0.0", @@ -108,42 +108,44 @@ "rimraf": "2.6.3", "rss": "^1.2.2", "sanitize-html": "^1.16.3", - "semver": "^5.4.1", + "semver": "^6.0.0", "serve-favicon": "^2.4.5", - "sharp": "0.21.3", + "sharp": "0.22.0", "sitemap": "^2.0.0", "socket.io": "2.2.0", "socket.io-adapter-cluster": "^1.0.1", "socket.io-adapter-mongo": "^2.0.1", - "socket.io-adapter-postgres": "^1.0.1", + "socket.io-adapter-postgres": "^1.2.0", "socket.io-client": "2.2.0", "socket.io-redis": "5.2.0", "socketio-wildcard": "2.0.0", - "spdx-license-list": "^5.0.0", + "spdx-license-list": "^6.0.0", "spider-detector": "1.0.19", + "textcomplete": "^0.17.1", + "textcomplete.contenteditable": "^0.1.1", "toobusy-js": "^0.5.1", "uglify-es": "^3.3.9", "validator": "10.11.0", - "winston": "3.1.0", + "winston": "3.2.1", "xml": "^1.0.1", "xregexp": "^4.1.1", "zxcvbn": "^4.4.2" }, "devDependencies": { - "@commitlint/cli": "7.3.2", - "@commitlint/config-angular": "7.3.1", - "coveralls": "3.0.2", - "eslint": "5.12.1", + "@commitlint/cli": "7.5.2", + "@commitlint/config-angular": "7.5.0", + "coveralls": "3.0.3", + "eslint": "5.15.3", "eslint-config-airbnb-base": "13.1.0", - "eslint-plugin-import": "2.14.0", - "grunt": "1.0.3", + "eslint-plugin-import": "2.16.0", + "grunt": "1.0.4", "grunt-contrib-watch": "1.1.0", "husky": "1.3.1", - "jsdom": "13.1.0", - "lint-staged": "8.1.0", - "mocha": "5.2.0", + "jsdom": "14.0.0", + "lint-staged": "8.1.5", + "mocha": "6.0.2", "mocha-lcov-reporter": "1.3.0", - "nyc": "13.1.0", + "nyc": "13.3.0", "smtp-server": "3.5.0" }, "bugs": { diff --git a/install/web.js b/install/web.js index 097d3eb9b6..ed87011440 100644 --- a/install/web.js +++ b/install/web.js @@ -50,6 +50,7 @@ var scripts = [ 'public/vendor/xregexp/unicode/unicode-base.js', 'public/src/utils.js', 'public/src/installer/install.js', + 'node_modules/zxcvbn/dist/zxcvbn.js', ]; var installing = false; @@ -131,6 +132,7 @@ function welcome(req, res) { success: success, values: req.body, minimumPasswordLength: defaults.minimumPasswordLength, + minimumPasswordStrength: defaults.minimumPasswordStrength, installing: installing, }); } diff --git a/public/images/emails/banneduser.png b/public/images/emails/banneduser.png deleted file mode 100644 index 4eac70d8ca..0000000000 Binary files a/public/images/emails/banneduser.png and /dev/null differ diff --git a/public/images/emails/digestheader.jpg b/public/images/emails/digestheader.jpg deleted file mode 100644 index 4c873e41b7..0000000000 Binary files a/public/images/emails/digestheader.jpg and /dev/null differ diff --git a/public/images/emails/emailconfirm.png b/public/images/emails/emailconfirm.png deleted file mode 100644 index d066015bd9..0000000000 Binary files a/public/images/emails/emailconfirm.png and /dev/null differ diff --git a/public/images/emails/invitation.png b/public/images/emails/invitation.png deleted file mode 100644 index 283372c9fa..0000000000 Binary files a/public/images/emails/invitation.png and /dev/null differ diff --git a/public/images/emails/newtopic.png b/public/images/emails/newtopic.png deleted file mode 100644 index bc5718563a..0000000000 Binary files a/public/images/emails/newtopic.png and /dev/null differ diff --git a/public/images/emails/nodebb.png b/public/images/emails/nodebb.png deleted file mode 100644 index 9cfe1cd70c..0000000000 Binary files a/public/images/emails/nodebb.png and /dev/null differ diff --git a/public/images/emails/notification.png b/public/images/emails/notification.png deleted file mode 100644 index 0e10a1580c..0000000000 Binary files a/public/images/emails/notification.png and /dev/null differ diff --git a/public/images/emails/password.png b/public/images/emails/password.png deleted file mode 100644 index 7a7358e082..0000000000 Binary files a/public/images/emails/password.png and /dev/null differ diff --git a/public/images/emails/triangularbackground.png b/public/images/emails/triangularbackground.png deleted file mode 100644 index c47ad51810..0000000000 Binary files a/public/images/emails/triangularbackground.png and /dev/null differ diff --git a/public/images/emails/unreadpost.png b/public/images/emails/unreadpost.png deleted file mode 100644 index 8228478618..0000000000 Binary files a/public/images/emails/unreadpost.png and /dev/null differ diff --git a/public/language/ar/admin/advanced/database.json b/public/language/ar/admin/advanced/database.json index 95538f5ff3..cb68e704a0 100644 --- a/public/language/ar/admin/advanced/database.json +++ b/public/language/ar/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/ar/admin/general/navigation.json b/public/language/ar/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/ar/admin/general/navigation.json +++ b/public/language/ar/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/ar/admin/manage/categories.json b/public/language/ar/admin/manage/categories.json index 550c92cd40..13a9b12b94 100644 --- a/public/language/ar/admin/manage/categories.json +++ b/public/language/ar/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/ar/admin/manage/privileges.json b/public/language/ar/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/ar/admin/manage/privileges.json +++ b/public/language/ar/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/ar/admin/settings/group.json b/public/language/ar/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/ar/admin/settings/group.json +++ b/public/language/ar/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/ar/admin/settings/tags.json b/public/language/ar/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/ar/admin/settings/tags.json +++ b/public/language/ar/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/ar/admin/settings/user.json b/public/language/ar/admin/settings/user.json index 4dede3c264..e5b3905d31 100644 --- a/public/language/ar/admin/settings/user.json +++ b/public/language/ar/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "عدم السماح بتغيير البريد الالكتروني", "disable-password-changes": "عدم السماح بتغيير كلمة المرور", "allow-account-deletion": "السماح بحذف الحساب", - "user-info-private": "إخفاء قائمة المستخدم والبيانات عن الزوار", "hide-fullname": "إخفاء الإسم الكامل عن المستخدمين", "hide-email": "إخفاء البريد الإلكتروني عن المستخدمين", "themes": "القوالب", diff --git a/public/language/ar/email.json b/public/language/ar/email.json index 396281bc08..75c910ad2b 100644 --- a/public/language/ar/email.json +++ b/public/language/ar/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "آخر المستجدات من %1", "digest.cta": "انقر هنا لمشاهدة %1", "digest.unsub.info": "تم إرسال هذا الإشعار بآخر المستجدات وفقا لخيارات تسجيلكم.", - "digest.no_topics": "ليس هناك مواضيع نشيطة في %1 الماضي", "digest.day": "يوم", "digest.week": "أسبوع", "digest.month": "شهر", "digest.subject": "إستهلاك ل", + "digest.title": "Your Daily Digest", "notif.chat.subject": "هناك محادثة جديدة من %1", "notif.chat.cta": "انقر هنا لمتابعة المحادثة", "notif.chat.unsub.info": "تم إرسال هذا الإشعار بوجودة محادثة جديدة وفقا لخيارات تسجيلك.", diff --git a/public/language/ar/error.json b/public/language/ar/error.json index b3d3d43487..9fcde9c07c 100644 --- a/public/language/ar/error.json +++ b/public/language/ar/error.json @@ -33,6 +33,7 @@ "username-too-short": "اسم المستخدم قصير.", "username-too-long": "اسم المستخدم طويل", "password-too-long": "كلمة السر طويلة ", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "المستخدم محظور", "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)", diff --git a/public/language/ar/flags.json b/public/language/ar/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/ar/flags.json +++ b/public/language/ar/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/ar/notifications.json b/public/language/ar/notifications.json index 17faabfd36..1e725aa87d 100644 --- a/public/language/ar/notifications.json +++ b/public/language/ar/notifications.json @@ -5,20 +5,20 @@ "mark_all_read": "اجعل كل التنبيهات مقروءة", "back_to_home": "عودة إلى %1", "outgoing_link": "رابط خارجي", - "outgoing_link_message": "You are now leaving %1", + "outgoing_link_message": "أنت تغادر اﻻن %1", "continue_to": "استمر إلى %1", "return_to": "عودة إى %1", - "new_notification": "You have a new notification", + "new_notification": "لديك تنبيه جديد", "you_have_unread_notifications": "لديك تنبيهات غير مقروءة.", - "all": "All", - "topics": "Topics", - "replies": "Replies", - "chat": "Chats", - "follows": "Follows", - "upvote": "Upvotes", + "all": "الكل", + "topics": "مواضيع", + "replies": "ردود", + "chat": "محادثات", + "follows": "متابعون", + "upvote": "الموافقين", "new-flags": "New Flags", "my-flags": "Flags assigned to me", - "bans": "Bans", + "bans": "الحظر", "new_message_from": "رسالة جديدة من %1", "upvoted_your_post_in": "%1 أضاف صوتًا إيجابيا إلى مشاركتك في %2.", "upvoted_your_post_in_dual": "%1 and %2 have upvoted your post in %3.", @@ -40,17 +40,17 @@ "user_started_following_you_multiple": "%1 and %2 others started following you.", "new_register": "%1 sent a registration request.", "new_register_multiple": "There are %1 registration requests awaiting review.", - "flag_assigned_to_you": "Flag %1 has been assigned to you", + "flag_assigned_to_you": "تم تخصيص العلامة 1% لك", "post_awaiting_review": "Post awaiting review", "email-confirmed": "تم التحقق من عنوان البريد الإلكتروني", "email-confirmed-message": "شكرًا على إثبات صحة عنوان بريدك الإلكتروني. صار حسابك مفعلًا بالكامل.", "email-confirm-error-message": "حدث خطأ أثناء التحقق من عنوان بريدك الإلكتروني. ربما رمز التفعيل خاطئ أو انتهت صلاحيته.", "email-confirm-sent": "تم إرسال بريد التفعيل.", "none": "None", - "notification_only": "Notification Only", - "email_only": "Email Only", - "notification_and_email": "Notification & Email", - "notificationType_upvote": "When someone upvotes your post", + "notification_only": "التنبيهات فقط", + "email_only": "البريد الالكتروني فقط", + "notification_and_email": "التنبيهات والبريد اﻻلكتروني", + "notificationType_upvote": "عندما يوافقك احدهم على منشورك", "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_follow": "When someone starts following you", diff --git a/public/language/ar/search.json b/public/language/ar/search.json index b687f214c5..d62d1c1710 100644 --- a/public/language/ar/search.json +++ b/public/language/ar/search.json @@ -43,5 +43,6 @@ "clear-preferences": "ازالة التفضيلات", "search-preferences-saved": "تم حفظ تفضيلات البحث", "search-preferences-cleared": "تم ازالة تفضيلات البحث", - "show-results-as": "عرض النتائج كـ" + "show-results-as": "عرض النتائج كـ", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/bg/admin/advanced/database.json b/public/language/bg/admin/advanced/database.json index 649bf03fb8..12c75258d5 100644 --- a/public/language/bg/admin/advanced/database.json +++ b/public/language/bg/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Байтове ИЗХ", "mongo.num-requests": "Брой заявки", "mongo.raw-info": "Сурови данни от MongoDB", + "mongo.unauthorized": "NodeBB не успя да получи нужните статистики от MongoDB. Моля, уверете се, че потребителят, който се използва от NodeBB, включва ролята „clusterMonitor“ за базата данни „admin“.", "redis": "Redis", "redis.version": "Версия на Redis", diff --git a/public/language/bg/admin/general/navigation.json b/public/language/bg/admin/general/navigation.json index 1002528cb0..eee7a0e588 100644 --- a/public/language/bg/admin/general/navigation.json +++ b/public/language/bg/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Подсказка:", "text": "Текст:", "text-class": "Текстов клас: незадължително", + "class": "Клас: незадължително", "id": "Идентификатор: незадължително", "properties": "Свойства:", diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index 922b62b159..e97d092b0f 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Изберете категория", "set-parent-category": "Задайте базова категория", - "privileges.description": "В тази секция можете да настроите правомощията за достъп до тази категория. Правомощията могат да бъдат давани на отделни потребители или на цели групи. Изберете обхвата на приложение от падащото меню по-долу.", + "privileges.description": "В тази секция можете да настроите правомощията за достъп до различните части на уеб сайта Правомощията могат да бъдат давани на отделни потребители или на цели групи. Изберете обхвата на приложение от падащото меню по-долу.", "privileges.category-selector": "Настройване на правомощията за ", "privileges.warning": "Забележка: Настройките за правомощията влизат в сила моментално. Не е нужно да запазвате категорията след като промените тези настройки.", "privileges.section-viewing": "Правомощия за преглед", "privileges.section-posting": "Правомощия за публикуване", "privileges.section-moderation": "Правомощия за модериране", + "privileges.section-other": "Други", "privileges.section-user": "Потребител", "privileges.search-user": "Добавяне на потребител", "privileges.no-users": "В тази категория няма правомощия за отделни потребители.", diff --git a/public/language/bg/admin/manage/privileges.json b/public/language/bg/admin/manage/privileges.json index da24b2599c..7db491f79e 100644 --- a/public/language/bg/admin/manage/privileges.json +++ b/public/language/bg/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Търсене на съдържание", "search-users": "Търсене на потребители", "search-tags": "Търсене на етикети", + "view-users": "Преглед на потребителите", + "view-tags": "Преглед на етикетите", + "view-groups": "Преглед на групите", "allow-local-login": "Локално вписване", + "allow-group-creation": "Създаване на групи", "find-category": "Търсене на категория", "access-category": "Достъп до категория", diff --git a/public/language/bg/admin/settings/group.json b/public/language/bg/admin/settings/group.json index d5edd3607f..c514b417af 100644 --- a/public/language/bg/admin/settings/group.json +++ b/public/language/bg/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Частни групи", "private-groups.help": "Ако е включено, присъединяването към групи ще изисква одобрение от собственик на групата. (По подразбиране: включено)", "private-groups.warning": "Внимание! Ако това е изключено и имате частни групи, те автоматично ще станат публични.", - "allow-creation": "Позволяване на създаването на групи", - "allow-creation-help": "Ако е включено, потребителите ще могат да създават групи. (По подразбиране: изключено)", "allow-multiple-badges-help": "Това може да се използва, за да позволи на потребителите да избират множество значки за групите. Изисква поддържа на теми.", "max-name-length": "Минимална дължина на името на група", + "max-title-length": "Максимална дължина на заглавието на група", "cover-image": "Изображение на корицата за групата", "default-cover": "Стандартни изображения на корицата", "default-cover-help": "Добавете стандартни изображения на корицата (разделени със запетаи) за групите, които нямат качено такова." diff --git a/public/language/bg/admin/settings/tags.json b/public/language/bg/admin/settings/tags.json index 6ac72e6bfb..7f10b81328 100644 --- a/public/language/bg/admin/settings/tags.json +++ b/public/language/bg/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Минимална дължина на етикетите", "max-length": "Максимална дължина на етикетите", "goto-manage": "Щракнете тук, за да отворите страницата за управление на етикетите.", - "privacy": "Поверителност", - "list-private": "Списъкът с етикети да бъде частен", "related-topics": "Свързани теми", "max-related-topics": "Максимален брой свързани теми, които да бъдат показвани (ако това се поддържа от темата)" } \ No newline at end of file diff --git a/public/language/bg/admin/settings/user.json b/public/language/bg/admin/settings/user.json index cb45427735..69d9b8130b 100644 --- a/public/language/bg/admin/settings/user.json +++ b/public/language/bg/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Забраняване на промяната на е-пощата", "disable-password-changes": "Забраняване на промяната на паролата", "allow-account-deletion": "Позволяване на изтриването на профила", - "user-info-private": "Скриване на списъка от потребители и данните от гостите.", "hide-fullname": "Скриване на пълното име от потребителите", "hide-email": "Скриване на е-пощата от потребителите", "themes": "Теми", diff --git a/public/language/bg/email.json b/public/language/bg/email.json index d849fd31d0..dad0a11dfb 100644 --- a/public/language/bg/email.json +++ b/public/language/bg/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Последни теми от %1", "digest.cta": "Натиснете тук, за да посетите %1", "digest.unsub.info": "Това резюме беше изпратено до Вас поради настройките Ви за абонаментите.", - "digest.no_topics": "Не е имало дейност по темите в последните %1", "digest.day": "ден", "digest.week": "месец", "digest.month": "година", "digest.subject": "Резюме за %1", + "digest.title": "Дневното Ви резюме", "notif.chat.subject": "Получено е ново съобщение от %1", "notif.chat.cta": "Натиснете тук, за да продължите дискусията", "notif.chat.unsub.info": "Това известие за разговор беше изпратено до Вас поради настройките Ви за абонаментите.", diff --git a/public/language/bg/error.json b/public/language/bg/error.json index 25e2d2f199..1f4247c059 100644 --- a/public/language/bg/error.json +++ b/public/language/bg/error.json @@ -33,6 +33,7 @@ "username-too-short": "Потребителското име е твърде кратко", "username-too-long": "Потребителското име е твърде дълго", "password-too-long": "Паролата е твърде дълга", + "reset-rate-limited": "Твърде много подновявания на паролата (има ограничение на честотата)", "user-banned": "Потребителят е блокиран", "user-banned-reason": "За съжаление, този акаунт е блокиран (Причина: %1)", "user-banned-reason-until": "За съжаление, този акаунт е блокиран до %1 (Причина: %2)", diff --git a/public/language/bg/flags.json b/public/language/bg/flags.json index f649220a5c..80e8e6b014 100644 --- a/public/language/bg/flags.json +++ b/public/language/bg/flags.json @@ -9,6 +9,7 @@ "updated": "Обновено", "target-purged": "Съдържанието, за което се отнася този доклад, е било изтрито и вече не е налично.", + "graph-label": "Дневни етикети", "quick-filters": "Бързи филтри", "filter-active": "В този списък с доклади има един или повече филтри", "filter-reset": "Премахване на филтрите", diff --git a/public/language/bg/search.json b/public/language/bg/search.json index a418387946..06d56e78d9 100644 --- a/public/language/bg/search.json +++ b/public/language/bg/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Изчистване на предпочитанията", "search-preferences-saved": "Предпочитанията за търсене бяха запазени", "search-preferences-cleared": "Предпочитанията за търсене бяха изчистени", - "show-results-as": "Показване на резултатите като" + "show-results-as": "Показване на резултатите като", + "see-more-results": "Показване на още резултати (%1)" } \ No newline at end of file diff --git a/public/language/bn/admin/advanced/database.json b/public/language/bn/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/bn/admin/advanced/database.json +++ b/public/language/bn/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/bn/admin/general/navigation.json b/public/language/bn/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/bn/admin/general/navigation.json +++ b/public/language/bn/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/bn/admin/manage/categories.json b/public/language/bn/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/bn/admin/manage/categories.json +++ b/public/language/bn/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/bn/admin/manage/privileges.json b/public/language/bn/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/bn/admin/manage/privileges.json +++ b/public/language/bn/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/bn/admin/settings/group.json b/public/language/bn/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/bn/admin/settings/group.json +++ b/public/language/bn/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/bn/admin/settings/tags.json b/public/language/bn/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/bn/admin/settings/tags.json +++ b/public/language/bn/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/bn/admin/settings/user.json b/public/language/bn/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/bn/admin/settings/user.json +++ b/public/language/bn/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/bn/email.json b/public/language/bn/email.json index b3e443d4d2..cbf77c5d49 100644 --- a/public/language/bn/email.json +++ b/public/language/bn/email.json @@ -1,18 +1,18 @@ { - "test-email.subject": "Test Email", - "password-reset-requested": "Password Reset Requested!", + "test-email.subject": "পরীক্ষামূলক ইমেইল", + "password-reset-requested": "নতুন পাসওয়ার্ডের জন্য অনুরোধ করা হয়েছে!", "welcome-to": "%1 এ স্বাগতম", "invite": "%1 থেকে আমন্ত্রণ", "greeting_no_name": "স্বাগতম", "greeting_with_name": "স্বাগতম %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "দয়া করে ইমেইল যাচাই করুন", + "email.verify.text1": "আপনার ইমেইল পরিবর্তন হয়েছে!", "welcome.text1": "%1 এ নিবন্ধন করার জন্য আপনাকে ধন্যবাদ!", "welcome.text2": "আপনার একাউন্ট এ্যাক্টিভেট করার জন্য, আপনি যে ইমেইল এড্রেস ব্যাবহার করে নিবন্ধন করেছেন তা যাচাই করতে হবে", "welcome.text3": "An administrator has accepted your registration application. You can login with your username/password now.", "welcome.cta": "আপনার ইমেইল এড্রেস নিশ্চিত করার জন্য এখানে ক্লিক করুন", "invitation.text1": "%1 আপনাকে %2 তে যোগ দিতে আমন্ত্রণ জানিয়েছেন ", - "invitation.text2": "Your invitation will expire in %1 days.", + "invitation.text2": "আপনার আমন্ত্রন পত্র %1 দিন পর বাতিল হয়ে যাবে", "invitation.ctr": "আপনার একাউন্ট খুলতে এখানে ক্লিক করুন", "reset.text1": "আমরা আপনার পাসওয়ার্ড রিসেট করার অনুরোধ পেয়েছি, সম্ভবত আপনি আপনার পাসওয়ার্ড ভুলে গিয়েছেন বলেই। তবে যদি তা না হয়ে থাকে, তাহলে এই মেইলকে উপেক্ষা করতে পারেন।", "reset.text2": "পাসওয়ার্ড রিসেট করতে নিচের লিংকে ক্লিক করুন", @@ -24,22 +24,22 @@ "digest.latest_topics": "%1 এর সর্বশেষ টপিকসমূহ", "digest.cta": "%1 ভিজিট করতে এখানে ক্লিক করুন", "digest.unsub.info": "আপনার সাবস্ক্রীপশন সেটিংসের কারনে আপনাকে এই ডাইজেষ্টটি পাঠানো হয়েছে।", - "digest.no_topics": "%1 এ কোন সক্রিয় টপিক নেই।", - "digest.day": "day", - "digest.week": "week", - "digest.month": "month", + "digest.day": "দিন", + "digest.week": "সপ্তাহ", + "digest.month": "মাস", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "%1 এর থেকে নতুন মেসেজ এসেছে।", "notif.chat.cta": "কথপোকথন চালিয়ে যেতে এখানে ক্লিক করুন", "notif.chat.unsub.info": "আপনার সাবস্ক্রীপশন সেটিংসের কারনে আপনার এই নোটিফিকেশন পাঠানো হয়েছে", "notif.post.cta": "পুরো বিষয়টি পড়তে এখানে ক্লিক করুন", "notif.post.unsub.info": "আপনার সাবস্ক্রিপশন সেটিংসের কারনে আপনার এই বার্তাটি পাঠানো হয়েছে", - "notif.cta": "Click here to go to forum", + "notif.cta": "ফোরামে যেতে এখানে ক্লিক করুন", "test.text1": "আপনি সঠিকভাবে নোডবিবির জন্য মেইলার সেটাপ করেছেন কিনা নিশ্চিত করার জন্য এই টেষ্ট ইমেইল পাঠানো হয়েছে", "unsub.cta": "সেটিংসগুলো পরিবর্তন করতে এখানে ক্লিক করুন", - "banned.subject": "You have been banned from %1", - "banned.text1": "The user %1 has been banned from %2.", + "banned.subject": "আপনি %1 এ নিষিদ্ধ হয়েছেন", + "banned.text1": "ব্যবহারকারি %1 %2 তে নিষিদ্ধ হয়েছেন", "banned.text2": "This ban will last until %1.", - "banned.text3": "This is the reason why you have been banned:", + "banned.text3": "এই কারনে আপনি নিষিদ্ধ হয়েছেন :", "closing": "ধন্যবাদ!" } \ No newline at end of file diff --git a/public/language/bn/error.json b/public/language/bn/error.json index 32c6a68796..5b4ae6170d 100644 --- a/public/language/bn/error.json +++ b/public/language/bn/error.json @@ -33,6 +33,7 @@ "username-too-short": "খুব ছোট ইউজারনেম", "username-too-long": "ইউজারনেম বড় হয়ে গিয়েছে", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "ব্যবহারকারী নিষিদ্ধ", "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)", diff --git a/public/language/bn/flags.json b/public/language/bn/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/bn/flags.json +++ b/public/language/bn/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/bn/global.json b/public/language/bn/global.json index dc56a364c5..0f00d5112f 100644 --- a/public/language/bn/global.json +++ b/public/language/bn/global.json @@ -3,13 +3,13 @@ "search": "অনুসন্ধান", "buttons.close": "বন্ধ", "403.title": "প্রবেশাধিকার প্রত্যাখ্যাত", - "403.message": "You seem to have stumbled upon a page that you do not have access to.", - "403.login": "Perhaps you should try logging in?", + "403.message": "আপনি এমন জায়গাতে যেতে চাচ্ছেন যেখানে আপনার প্রবেশাধিকার নেই।", + "403.login": "সম্ভবত আপনার লগইন করা উচিত", "404.title": "পাওয়া যায়নি", - "404.message": "You seem to have stumbled upon a page that does not exist. Return to the home page.", + "404.message": "আপনি এমন জায়গাতে যেতে চাচ্ছেন যার কোন অস্তিত্ব নাই। প্রথম পাতায় ফিরে যান ।", "500.title": "Internal Error.", "500.message": "ওহো! কিছু ভুল হয়েছে মনে হচ্ছে!", - "400.title": "Bad Request.", + "400.title": "ভুল ঠিকানা", "400.message": "It looks like this link is malformed, please double-check and try again. Otherwise, return to the home page.", "register": "নিবন্ধন", "login": "প্রবেশ", diff --git a/public/language/bn/search.json b/public/language/bn/search.json index e4270fdfc8..7d92ead42a 100644 --- a/public/language/bn/search.json +++ b/public/language/bn/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "ফলাফল দেখানো হোক : " + "show-results-as": "ফলাফল দেখানো হোক : ", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/bn/users.json b/public/language/bn/users.json index b0fc3fc663..e7ba22f9f6 100644 --- a/public/language/bn/users.json +++ b/public/language/bn/users.json @@ -2,7 +2,7 @@ "latest_users": "সর্বশেষ নিবন্ধিত সদস্যরা:", "top_posters": "সর্বোচ্চ পোষ্টকারী", "most_reputation": "সর্বোচ্চ সম্মাননাধারী", - "most_flags": "Most Flags", + "most_flags": "সর্বোচ্চ অভিযোগ", "search": "খুঁজুন", "enter_username": "ইউজারনেম এর ভিত্তিতে সার্চ করুন", "load_more": "আরো লোড করুন", @@ -10,7 +10,7 @@ "filter-by": "ফিল্টার করার ধরন", "online-only": "শুধুমাত্র অনলাইন", "invite": "ইনভাইট", - "prompt-email": "Emails:", + "prompt-email": "ইমেইল", "invitation-email-sent": "%1 কে একটি ইনভাইটেশন ইমেইল পাঠানো হয়েছে", "user_list": "সদস্য তালিকা", "recent_topics": "সাম্প্রতিক টপিক", diff --git a/public/language/cs/admin/advanced/database.json b/public/language/cs/admin/advanced/database.json index 95089916ea..e973a366dc 100644 --- a/public/language/cs/admin/advanced/database.json +++ b/public/language/cs/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bajtů <-", "mongo.num-requests": "Počet požadavků", "mongo.raw-info": "Raw informace MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Verze Redis", diff --git a/public/language/cs/admin/general/navigation.json b/public/language/cs/admin/general/navigation.json index b4810248ec..3cdd2fd824 100644 --- a/public/language/cs/admin/general/navigation.json +++ b/public/language/cs/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tip:", "text": "Text:", "text-class": "Textová třída: doporučené", + "class": "Class: optional", "id": "ID: doporučené", "properties": "Vlastnosti:", diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index bdf2d81292..9c8d983c5a 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Vyberte kategorii", "set-parent-category": "Nastavit nadřazenou kategorii", - "privileges.description": "Můžete upravit oprávnění přístupu pro kategorii ve v této části. Oprávnění může být uděleno na uživatele nebo na celou skupinu. Vyberte si z vysouvacího seznamu.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Konfigurace oprávnění pro", "privileges.warning": "Poznámka: nastavení oprávnění má okamžitý vliv. Není tedy nutné uložit kategorii pro upravení těchto nastavení", "privileges.section-viewing": "Oprávnění prohlížení", "privileges.section-posting": "Oprávnění příspěvků", "privileges.section-moderation": "Oprávnění moderování", + "privileges.section-other": "Other", "privileges.section-user": "Uživatel", "privileges.search-user": "Přidat uživatele", "privileges.no-users": "V této kategorii není nastaveno žádné oprávnění uživatele.", diff --git a/public/language/cs/admin/manage/privileges.json b/public/language/cs/admin/manage/privileges.json index 138e845d4f..1a8ec94b1e 100644 --- a/public/language/cs/admin/manage/privileges.json +++ b/public/language/cs/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Hledat obsah", "search-users": "Hledat uživatele", "search-tags": "Hledat označení", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Místní přihlášení", + "allow-group-creation": "Group Create", "find-category": "Hledat kategorii", "access-category": "Přístup ke kategorii", diff --git a/public/language/cs/admin/settings/group.json b/public/language/cs/admin/settings/group.json index 4c7adee0f7..cec97e0698 100644 --- a/public/language/cs/admin/settings/group.json +++ b/public/language/cs/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Soukromé skupiny", "private-groups.help": "Je-li povoleno, připojení ke skupině vyžaduje schválení zakladatele skupiny (výchozí: povoleno)", "private-groups.warning": "Ale pozor, je-li tato možnost zakázána a vy máte soukromé skupiny, stanou se automaticky veřejnými.", - "allow-creation": "Povolit vytvoření skupin", - "allow-creation-help": "Je-li povoleno, uživatelé mohou vytvořit skupiny (výchozí: zakázáno)", "allow-multiple-badges-help": "Toto označení může být použito, aby uživatelé mohly vybrat několik skupinových symbolů, vyžaduje podporu motivu.", "max-name-length": "Maximální délka názvu skupiny", + "max-title-length": "Maximum Group Title Length", "cover-image": "Obrázek skupiny", "default-cover": "Výchozí obrázek", "default-cover-help": "Pro skupiny, které nemají nahraný obrázek, přidejte výchozí obrázky oddělené čárkami" diff --git a/public/language/cs/admin/settings/tags.json b/public/language/cs/admin/settings/tags.json index 3932e65eef..982b58dca4 100644 --- a/public/language/cs/admin/settings/tags.json +++ b/public/language/cs/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimální délka značky", "max-length": "Maximální délka značky", "goto-manage": "Pro přejití na stránku správy značek, klikněte zde.", - "privacy": "Soukromí", - "list-private": "Seznam značek je soukromí", "related-topics": "Související témata", "max-related-topics": "Maximální počet zobrazených souvisejících témat (je-li podporováno motivem)" } \ No newline at end of file diff --git a/public/language/cs/admin/settings/user.json b/public/language/cs/admin/settings/user.json index f14b96ffbc..912d45ce27 100644 --- a/public/language/cs/admin/settings/user.json +++ b/public/language/cs/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Zakázat změnu e-mailu", "disable-password-changes": "Zakázat změnu hesla", "allow-account-deletion": "Povolit smazání účtu", - "user-info-private": "Skrýt seznam uživatelů a data před hosty", "hide-fullname": "Skrýt jméno před uživateli", "hide-email": "Skrýt e-mail před uživateli", "themes": "Motivy", diff --git a/public/language/cs/email.json b/public/language/cs/email.json index ffa404387e..39581ba592 100644 --- a/public/language/cs/email.json +++ b/public/language/cs/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Nejnovější témata od %1", "digest.cta": "Kliknutím zde navštívíte %1", "digest.unsub.info": "Tento výtah vám byl odeslán, protože jste si to nastavili ve vašich odběrech.", - "digest.no_topics": "Dosud tu nebyly žádné aktivní témata %1", "digest.day": "den", "digest.week": "týden", "digest.month": "měsíc", "digest.subject": "Výběr pro %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Nová zpráva z chatu od %1", "notif.chat.cta": "Chcete-li pokračovat v konverzaci, klikněte zde.", "notif.chat.unsub.info": "Toto upozornění na chat vám bylo odesláno na základě vašeho nastavení odběru.", diff --git a/public/language/cs/error.json b/public/language/cs/error.json index 532f79b982..ed9a31dad9 100644 --- a/public/language/cs/error.json +++ b/public/language/cs/error.json @@ -33,6 +33,7 @@ "username-too-short": "Uživatelské jméno je moc krátké", "username-too-long": "Uživatelské jméno je moc dlouhé", "password-too-long": "Heslo je moc dlouhé", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Uživatel byl zablokován", "user-banned-reason": "Omlouváme se, ale tento účet byl zablokován (důvod: %1)", "user-banned-reason-until": "Omlouváme se, ale tento účet je zablokován do %1 (důvod: %2)", diff --git a/public/language/cs/flags.json b/public/language/cs/flags.json index aaca99cf95..a5173241dc 100644 --- a/public/language/cs/flags.json +++ b/public/language/cs/flags.json @@ -9,6 +9,7 @@ "updated": "Aktualizováno", "target-purged": "Obsah, na který se toto označení vztahuje, byl vymazán a již není k dispozici.", + "graph-label": "Daily Flags", "quick-filters": "Rychlé filtry", "filter-active": "V tomto seznamu označení je jeden nebo více aktivních filtrů", "filter-reset": "Vyjmout filtry", diff --git a/public/language/cs/search.json b/public/language/cs/search.json index de1c762624..a570704634 100644 --- a/public/language/cs/search.json +++ b/public/language/cs/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Smazat nastavení", "search-preferences-saved": "Hledat dle uložených nastavení", "search-preferences-cleared": "Hledat dle smazaných nastavení", - "show-results-as": "Zobrazit výsledek jako" + "show-results-as": "Zobrazit výsledek jako", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/da/admin/advanced/database.json b/public/language/da/admin/advanced/database.json index 348798c1ad..3e7c77f2f3 100644 --- a/public/language/da/admin/advanced/database.json +++ b/public/language/da/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Rå Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/da/admin/general/navigation.json b/public/language/da/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/da/admin/general/navigation.json +++ b/public/language/da/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/da/admin/manage/categories.json b/public/language/da/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/da/admin/manage/categories.json +++ b/public/language/da/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/da/admin/manage/privileges.json b/public/language/da/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/da/admin/manage/privileges.json +++ b/public/language/da/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/da/admin/settings/group.json b/public/language/da/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/da/admin/settings/group.json +++ b/public/language/da/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/da/admin/settings/tags.json b/public/language/da/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/da/admin/settings/tags.json +++ b/public/language/da/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/da/admin/settings/user.json b/public/language/da/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/da/admin/settings/user.json +++ b/public/language/da/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/da/email.json b/public/language/da/email.json index db25a806ef..a2d6267d89 100644 --- a/public/language/da/email.json +++ b/public/language/da/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Nyeste emne fra %1", "digest.cta": "Klik her for at gå til %1", "digest.unsub.info": "Du har fået tilsendt dette sammendrag pga. indstillingerne i dit abonnement.", - "digest.no_topics": "Der har ikke været nogen aktive emner de/den sidste %1", "digest.day": "dag", "digest.week": "uge", "digest.month": "måned", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Ny chat besked modtaget fra %1", "notif.chat.cta": "Klik her for at forsætte med samtalen", "notif.chat.unsub.info": "Denne chat notifikation blev sendt til dig pga. indstillingerne i dit abonnement.", diff --git a/public/language/da/error.json b/public/language/da/error.json index 81fb8b159e..1d879e8f4b 100644 --- a/public/language/da/error.json +++ b/public/language/da/error.json @@ -33,6 +33,7 @@ "username-too-short": "Brugernavn er for kort", "username-too-long": "Brugernavn er for langt", "password-too-long": "Kodeord er for langt", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Bruger er bortvist", "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)", diff --git a/public/language/da/flags.json b/public/language/da/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/da/flags.json +++ b/public/language/da/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/da/search.json b/public/language/da/search.json index ab41eae40a..59852be36a 100644 --- a/public/language/da/search.json +++ b/public/language/da/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Slet præferencer", "search-preferences-saved": "Søgnings præferencer gemt", "search-preferences-cleared": "Søgnings præferencer slettet", - "show-results-as": "Vis resultater som" + "show-results-as": "Vis resultater som", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/de/admin/advanced/database.json b/public/language/de/admin/advanced/database.json index 834fc7deb4..abe33cdd07 100644 --- a/public/language/de/admin/advanced/database.json +++ b/public/language/de/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes ausgehend", "mongo.num-requests": "Anzahl an Anfragen", "mongo.raw-info": "MongoDB Rohinfo", + "mongo.unauthorized": "NodeBB konnte die MongoDB Datenbank für relevante Statistiken nicht abfragen. Stellen Sie bitte sicher, dass der von NodeBB verwendete Benutzer über die Rolle "clusterMonitor" für die "admin" Datenbank verfügt.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/de/admin/general/navigation.json b/public/language/de/admin/general/navigation.json index bea4cfceb5..1bedf15f20 100644 --- a/public/language/de/admin/general/navigation.json +++ b/public/language/de/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Klasse: optional", + "class": "Klasse optional", "id": "ID: optional", "properties": "Eigenschaften:", diff --git a/public/language/de/admin/manage/categories.json b/public/language/de/admin/manage/categories.json index 2d007891b8..2e6fb1d3e2 100644 --- a/public/language/de/admin/manage/categories.json +++ b/public/language/de/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Kategorie auswählen", "set-parent-category": "Übergeordnete Kategorie festlegen", - "privileges.description": "In diesem Bereich können die Zugriffsberechtigungen für diese Kategorie konfiguriert werden. Berechtigungen können pro Benutzer oder pro Gruppe gewährt werden. Du kannst einen neuen Benutzer zu dieser Tabelle hinzufügen, indem du sie in dem folgenden Formular suchst. ", + "privileges.description": "In diesem Abschnitt können Sie die Zugriffssteuerungsberechtigungen für Teile der Seite konfigurieren. Berechtigungen können auf Benutzerbasis oder auf Gruppenbasis gewährt werden. Wählen Sie aus der Dropdown-Liste die Effektdomäne aus.", "privileges.category-selector": "Konfiguriere Privilegien für", "privileges.warning": "Hinweis: Die Zugriffsberechtigungen werden sofort wirksam. Es ist nicht notwendig, die Kategorie zu speichern, nachdem du die Einstellungen angepasst hast.", "privileges.section-viewing": "Ansichtsberechtigungen", "privileges.section-posting": "Schreibberechtigungen", "privileges.section-moderation": "Moderationsberechtigungen", + "privileges.section-other": "Andere", "privileges.section-user": "Benutzer", "privileges.search-user": "Benutzer hinzufügen", "privileges.no-users": "Keine benutzerspezifischen Berechtigungen in dieser Kategorie.", diff --git a/public/language/de/admin/manage/privileges.json b/public/language/de/admin/manage/privileges.json index 88744254b5..0c5eecf54e 100644 --- a/public/language/de/admin/manage/privileges.json +++ b/public/language/de/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Inhalt durchsuchen", "search-users": "Benutzersuche", "search-tags": "Tags suchen", + "view-users": "Benutzer ansehen", + "view-tags": "Tags ansehen", + "view-groups": "Gruppen ansehen", "allow-local-login": "Lokaler Login", + "allow-group-creation": "Gruppen erstellen", "find-category": "Kategorie finden", "access-category": "Kategoriezutritt", diff --git a/public/language/de/admin/settings/group.json b/public/language/de/admin/settings/group.json index 8b13a8ed7b..8ea19fd505 100644 --- a/public/language/de/admin/settings/group.json +++ b/public/language/de/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Gruppen", "private-groups.help": "Wenn aktiviert, erfordert das Beitreten einer Gruppe die Bestätigung des jeweiligen Besitzers(Standard: aktiviert)", "private-groups.warning": "Vorsicht! Wenn diese Option deaktiviert ist, und es private Gruppen gibt, werden diese automatisch öffentlich.", - "allow-creation": "Erstellung von Gruppen erlauben", - "allow-creation-help": "Wenn aktiviert können Nutzer Gruppen erstellen (Standard: deaktiviert)", "allow-multiple-badges-help": "Diese Eintellung kann verwendet werden um Benutzern zu erlauben mehrere Gruppen abzeichen auszuwählen, benötigt Theme unterstützung.", "max-name-length": "Maximale Länge von Gruppennamen", + "max-title-length": "Maximale Gruppentitellänge", "cover-image": "Gruppen-Deckbild", "default-cover": "Standard-Deckbild", "default-cover-help": "Fügen Sie Komma-getrennte standard-Deckbilder für Gruppen hinzu, welche kein Deckbild hochgeladen haben" diff --git a/public/language/de/admin/settings/tags.json b/public/language/de/admin/settings/tags.json index ae52d414ae..e2fd0853d3 100644 --- a/public/language/de/admin/settings/tags.json +++ b/public/language/de/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimale Tag Länge", "max-length": "Maximale Tag Länge", "goto-manage": "Klicken Sie hier um die Tag Managementseite aufzurufen.", - "privacy": "Privatsphäre", - "list-private": "Tag-Liste privatisieren", "related-topics": "Zusammenhängende Themen", "max-related-topics": "Maximale Anzahl an Zusammenhängenden Themen die angezeigt werden sollen (Wenn vom Design unterstützt)" } \ No newline at end of file diff --git a/public/language/de/admin/settings/user.json b/public/language/de/admin/settings/user.json index 41ca3880c4..62b873c8ad 100644 --- a/public/language/de/admin/settings/user.json +++ b/public/language/de/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Deaktiviere Änderungen der E-Mail Adresse", "disable-password-changes": "Deaktiviere Änderungen des Passwortes", "allow-account-deletion": "Erlaube löschen des Kontos", - "user-info-private": "Die Benutzerliste mit Informationen vor Gästen verstecken", "hide-fullname": "Den 'Kompletten Namen' von Benutzern verstecken", "hide-email": "Die Email-Adresse von Benutzern verstecken", "themes": "Themes", @@ -71,8 +70,8 @@ "follow-created-topics": "Themen folgen, die du erstellst", "follow-replied-topics": "Themen folgen, auf die du antwortest", "default-notification-settings": "Standardbenachrichtigungseinstellungen", - "categoryWatchState": "Default category watch state", - "categoryWatchState.watching": "Watching", - "categoryWatchState.notwatching": "Not Watching", - "categoryWatchState.ignoring": "Ignoring" + "categoryWatchState": "Standardmäßige Beobachtung", + "categoryWatchState.watching": "Beobachtet", + "categoryWatchState.notwatching": "Nicht beobachtet", + "categoryWatchState.ignoring": "Ignoriert" } \ No newline at end of file diff --git a/public/language/de/category.json b/public/language/de/category.json index 878081bd57..80bbdf284a 100644 --- a/public/language/de/category.json +++ b/public/language/de/category.json @@ -11,7 +11,7 @@ "ignore": "Ignorieren", "watching": "Beobachte", "not-watching": "Nicht beobachtet", - "ignoring": "Ignoriere", + "ignoring": "Ignoriert", "watching.description": "Zeige Themen in Ungelesen und Aktuell", "not-watching.description": "Zeige keine Themen in Ungelesen, zeige sie in Aktuell", "ignoring.description": "Zeige keine Themen in Ungelesen und Aktuell", diff --git a/public/language/de/email.json b/public/language/de/email.json index 1ed7a3711d..f94d4ef829 100644 --- a/public/language/de/email.json +++ b/public/language/de/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Neueste Themen auf %1", "digest.cta": "Klicke hier, um %1 zu besuchen", "digest.unsub.info": "Diese Zusammenfassung wurde dir aufgrund deiner Abonnement-Einstellungen gesendet.", - "digest.no_topics": "Es gab keine aktiven Themen innerhalb %1", "digest.day": "des letzten Tages", "digest.week": "der letzten Woche", "digest.month": "des letzen Monats", - "digest.subject": "Übersicht für %1", + "digest.subject": "Zusammenfassung für %1", + "digest.title": "Deine tägliche Zusammenfassung", "notif.chat.subject": "Neue Chatnachricht von %1 erhalten", "notif.chat.cta": "Klicke hier, um die Unterhaltung fortzusetzen", "notif.chat.unsub.info": "Diese Chat-Benachrichtigung wurde dir aufgrund deiner Abonnement-Einstellungen gesendet.", diff --git a/public/language/de/error.json b/public/language/de/error.json index 769f655411..61777f3b2d 100644 --- a/public/language/de/error.json +++ b/public/language/de/error.json @@ -33,6 +33,7 @@ "username-too-short": "Benutzername ist zu kurz", "username-too-long": "Benutzername ist zu lang", "password-too-long": "Passwort ist zu lang", + "reset-rate-limited": "Zu viele Anfragen zum Zurücksetzen des Passworts (Rate begrenzt)", "user-banned": "Benutzer ist gesperrt", "user-banned-reason": "Entschuldige, dieses Konto wurde gesperrt (Grund: %1)", "user-banned-reason-until": "Entschuldigung, dieses Konto wurde bis %1 (Reason: %2) gesperrt.", diff --git a/public/language/de/flags.json b/public/language/de/flags.json index e61187737d..e271638b2b 100644 --- a/public/language/de/flags.json +++ b/public/language/de/flags.json @@ -9,6 +9,7 @@ "updated": "Aktualisiert", "target-purged": "Der Inhalt auf den diese Meldung hingewiesen hat, wurde gelöscht und ist nicht mehr verfügbar.", + "graph-label": "Tägliche Meldungen", "quick-filters": "Schnell-Filter", "filter-active": "Ein oder mehrere Filter sind in dieser Meldungs-Liste aktiv", "filter-reset": "Filter Entfernen", diff --git a/public/language/de/notifications.json b/public/language/de/notifications.json index 8bfa0370d2..7426284d64 100644 --- a/public/language/de/notifications.json +++ b/public/language/de/notifications.json @@ -56,7 +56,7 @@ "notificationType_follow": "Wenn dir jemand neues folgt", "notificationType_new-chat": "Wenn du eine Chat Nachricht erhältst", "notificationType_group-invite": "Wenn du eine Gruppeneinladung erhältst", - "notificationType_group-request-membership": "When someone requests to join a group you own", + "notificationType_group-request-membership": "Wenn jemand einer Gruppe beitreten möchte, die dir gehört", "notificationType_new-register": "Wenn jemand der Registrierungswarteschlange hinzugefügt wird", "notificationType_post-queue": "Wenn ein neuer Beitrag eingereiht wird", "notificationType_new-post-flag": "Wenn ein Beitrag gemeldet wird", diff --git a/public/language/de/search.json b/public/language/de/search.json index 70fee26a67..ab22f9a3aa 100644 --- a/public/language/de/search.json +++ b/public/language/de/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Einstellungen löschen", "search-preferences-saved": "Sucheinstellungen gespeichert", "search-preferences-cleared": "Sucheinstellungen gelöscht", - "show-results-as": "Ergebnisse anzeigen als" + "show-results-as": "Ergebnisse anzeigen als", + "see-more-results": "Weitere Ergebnisse anzeigen (%1)" } \ No newline at end of file diff --git a/public/language/de/user.json b/public/language/de/user.json index 2e317b490a..89200148fc 100644 --- a/public/language/de/user.json +++ b/public/language/de/user.json @@ -28,7 +28,7 @@ "watched_categories": "Beobachtete Kategorien", "watched": "Beobachtet", "ignored": "Ignoriert", - "default-category-watch-state": "Default category watch state", + "default-category-watch-state": "Standardmäßige Beobachtung", "followers": "Follower", "following": "Folge ich", "blocks": "Blockiert", @@ -49,7 +49,7 @@ "change_picture": "Profilbild ändern", "change_username": "Benutzernamen ändern", "change_email": "E-Mail ändern", - "email_same_as_password": "Please enter your current password to continue – you've entered your new email again", + "email_same_as_password": "Gebe bitte dein aktuelles Passwort ein um fortzufahren – Du hast deine neue E-Mail erneut eingegeben", "edit": "Ändern", "edit-profile": "Profil ändern", "default_picture": "Standardsymbol", diff --git a/public/language/el/admin/advanced/database.json b/public/language/el/admin/advanced/database.json index 77105661c2..0077b67799 100644 --- a/public/language/el/admin/advanced/database.json +++ b/public/language/el/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Έκδοση Redis", diff --git a/public/language/el/admin/general/navigation.json b/public/language/el/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/el/admin/general/navigation.json +++ b/public/language/el/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/el/admin/manage/categories.json b/public/language/el/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/el/admin/manage/categories.json +++ b/public/language/el/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/el/admin/manage/privileges.json b/public/language/el/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/el/admin/manage/privileges.json +++ b/public/language/el/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/el/admin/settings/group.json b/public/language/el/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/el/admin/settings/group.json +++ b/public/language/el/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/el/admin/settings/tags.json b/public/language/el/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/el/admin/settings/tags.json +++ b/public/language/el/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/el/admin/settings/user.json b/public/language/el/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/el/admin/settings/user.json +++ b/public/language/el/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/el/email.json b/public/language/el/email.json index fff8f6dc45..b85612a123 100644 --- a/public/language/el/email.json +++ b/public/language/el/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Πρόσφατα θέματα στο %1", "digest.cta": "Κάνε κλικ εδώ για να επισκεφτείς το %1", "digest.unsub.info": "Αυτή η σύνοψη σου στάλθηκε λόγω των ρυθμίσεών σου.", - "digest.no_topics": "There have been no active topics in the past %1", "digest.day": "day", "digest.week": "week", "digest.month": "month", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Νέο μήνυμα συνομιλίας από τον/την %1", "notif.chat.cta": "Κάνε κλικ εδώ για να πας στην συνομιλία", "notif.chat.unsub.info": "Αυτή η ειδοποίηση για συνομιλία σου στάλθηκε λόγω των ρυθμίσεών σου. ", diff --git a/public/language/el/error.json b/public/language/el/error.json index 5913687970..569bb0dfda 100644 --- a/public/language/el/error.json +++ b/public/language/el/error.json @@ -33,6 +33,7 @@ "username-too-short": "Το όνομα χρήστη είναι πολύ μικρό", "username-too-long": "Το όνομα χρήστη είναι πολύ μεγάλο", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Ο Χρήστης είναι αποκλεισμένος/η", "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)", diff --git a/public/language/el/flags.json b/public/language/el/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/el/flags.json +++ b/public/language/el/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/el/search.json b/public/language/el/search.json index d5f8bda7c5..cdbd358137 100644 --- a/public/language/el/search.json +++ b/public/language/el/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/en-GB/admin/advanced/database.json b/public/language/en-GB/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/en-GB/admin/advanced/database.json +++ b/public/language/en-GB/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/en-GB/admin/development/info.json b/public/language/en-GB/admin/development/info.json index 0a4ae6fe2c..c095a9718b 100644 --- a/public/language/en-GB/admin/development/info.json +++ b/public/language/en-GB/admin/development/info.json @@ -7,7 +7,8 @@ "online": "online", "git": "git", "memory": "memory", - "load": "load", + "load": "system load", + "cpu-usage": "cpu usage", "uptime": "uptime", "registered": "Registered", diff --git a/public/language/en-GB/admin/general/navigation.json b/public/language/en-GB/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/en-GB/admin/general/navigation.json +++ b/public/language/en-GB/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/en-GB/admin/manage/categories.json b/public/language/en-GB/admin/manage/categories.json index c14eadea0c..7e49aef36b 100644 --- a/public/language/en-GB/admin/manage/categories.json +++ b/public/language/en-GB/admin/manage/categories.json @@ -17,6 +17,7 @@ "parent-category": "Parent Category", "optional-parent-category": "(Optional) Parent Category", "parent-category-none": "(None)", + "copy-parent": "Copy Parent", "copy-settings": "Copy Settings From", "optional-clone-settings": "(Optional) Clone Settings From Category", "clone-children": "Clone Children Categories And Settings", @@ -29,12 +30,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/en-GB/admin/manage/groups.json b/public/language/en-GB/admin/manage/groups.json index c019ec9823..814eebaa0f 100644 --- a/public/language/en-GB/admin/manage/groups.json +++ b/public/language/en-GB/admin/manage/groups.json @@ -1,8 +1,12 @@ { "name": "Group Name", + "badge": "Badge", + "properties": "Properties", "description": "Group Description", "member-count": "Member Count", - "system": "System Group", + "system": "System", + "hidden": "Hidden", + "private": "Private", "edit": "Edit", "search-placeholder": "Search", "create": "Create Group", @@ -17,6 +21,7 @@ "edit.user-title": "Title of Members", "edit.icon": "Group Icon", "edit.label-color": "Group Label Color", + "edit.text-color": "Group Text Color", "edit.show-badge": "Show Badge", "edit.private-details": "If enabled, joining of groups requires approval from a group owner.", "edit.private-override": "Warning: Private groups is disabled at system level, which overrides this option.", diff --git a/public/language/en-GB/admin/manage/privileges.json b/public/language/en-GB/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/en-GB/admin/manage/privileges.json +++ b/public/language/en-GB/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/en-GB/admin/manage/users.json b/public/language/en-GB/admin/manage/users.json index 6a17cbf016..05fc3f043f 100644 --- a/public/language/en-GB/admin/manage/users.json +++ b/public/language/en-GB/admin/manage/users.json @@ -6,6 +6,7 @@ "validate-email": "Validate Email", "send-validation-email": "Send Validation Email", "password-reset-email": "Send Password Reset Email", + "force-password-reset": "Force Password Reset & Log User Out", "ban": "Ban User(s)", "temp-ban": "Ban User(s) Temporarily", "unban": "Unban User(s)", @@ -81,7 +82,9 @@ "alerts.confirm-remove-moderator": "Do you really want to remove this moderator?", "alerts.remove-moderator-success": "User is no longer moderator.", "alerts.confirm-validate-email": "Do you want to validate email(s) of these user(s)?", + "alerts.confirm-force-password-reset": "Are you sure you want to force the password reset and log out these user(s)?", "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 reversable! Only the user account will be deleted, their posts and topics will remain.", "alerts.delete-success": "User(s) Deleted!", diff --git a/public/language/en-GB/admin/settings/email.json b/public/language/en-GB/admin/settings/email.json index 50ad2e06ea..4a27edbeec 100644 --- a/public/language/en-GB/admin/settings/email.json +++ b/public/language/en-GB/admin/settings/email.json @@ -4,6 +4,9 @@ "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", "from": "From Name", "from-help": "The from name to display in the email.", + "sendmail-rate-limit": "Send X emails...", + "sendmail-rate-delta": "... every X milliseconds", + "sendmail-rate-help": "Instructs the NodeBB mailer to limit the number of messages sent at once in order to not overwhelm email receiving services. These options do not apply if SMTP Transport is enabled (below).", "smtp-transport": "SMTP Transport", "smtp-transport.enabled": "Use an external email server to send emails", diff --git a/public/language/en-GB/admin/settings/group.json b/public/language/en-GB/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/en-GB/admin/settings/group.json +++ b/public/language/en-GB/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/en-GB/admin/settings/tags.json b/public/language/en-GB/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/en-GB/admin/settings/tags.json +++ b/public/language/en-GB/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/en-GB/admin/settings/user.json b/public/language/en-GB/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/en-GB/admin/settings/user.json +++ b/public/language/en-GB/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/en-GB/email.json b/public/language/en-GB/email.json index 813ba0f2ce..f8a083bebd 100644 --- a/public/language/en-GB/email.json +++ b/public/language/en-GB/email.json @@ -28,15 +28,14 @@ "reset.notify.text1": "We are notifying you that on %1, your password was changed successfully.", "reset.notify.text2": "If you did not authorise this, please notify an administrator immediately.", - "digest.notifications": "You have unread notifications from %1:", "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.no_topics": "There have been no active topics in the past %1", "digest.day": "day", "digest.week": "week", "digest.month": "month", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "New chat message received from %1", "notif.chat.cta": "Click here to continue the conversation", diff --git a/public/language/en-GB/error.json b/public/language/en-GB/error.json index 5adc3351e2..072fbdcc88 100644 --- a/public/language/en-GB/error.json +++ b/public/language/en-GB/error.json @@ -39,6 +39,7 @@ "username-too-short": "Username too short", "username-too-long": "Username too long", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "User banned", "user-banned-reason": "Sorry, this account has been banned (Reason: %1)", diff --git a/public/language/en-GB/flags.json b/public/language/en-GB/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/en-GB/flags.json +++ b/public/language/en-GB/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/en-GB/groups.json b/public/language/en-GB/groups.json index c18335bb5e..00019c35d6 100644 --- a/public/language/en-GB/groups.json +++ b/public/language/en-GB/groups.json @@ -41,7 +41,8 @@ "details.description": "Description", "details.badge_preview": "Badge Preview", "details.change_icon": "Change Icon", - "details.change_colour": "Change Colour", + "details.change_label_colour": "Change Label Colour", + "details.change_text_colour": "Change Text Colour", "details.badge_text": "Badge Text", "details.userTitleEnabled": "Show Badge", "details.private_help": "If enabled, joining of groups requires approval from a group owner", diff --git a/public/language/en-GB/search.json b/public/language/en-GB/search.json index 061cd0423c..55b0c5793d 100644 --- a/public/language/en-GB/search.json +++ b/public/language/en-GB/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results (%1)" } diff --git a/public/language/en-US/admin/advanced/database.json b/public/language/en-US/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/en-US/admin/advanced/database.json +++ b/public/language/en-US/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/en-US/admin/general/navigation.json b/public/language/en-US/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/en-US/admin/general/navigation.json +++ b/public/language/en-US/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/en-US/admin/manage/categories.json b/public/language/en-US/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/en-US/admin/manage/categories.json +++ b/public/language/en-US/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/en-US/admin/manage/privileges.json b/public/language/en-US/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/en-US/admin/manage/privileges.json +++ b/public/language/en-US/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/en-US/admin/settings/group.json b/public/language/en-US/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/en-US/admin/settings/group.json +++ b/public/language/en-US/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/en-US/admin/settings/tags.json b/public/language/en-US/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/en-US/admin/settings/tags.json +++ b/public/language/en-US/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/en-US/admin/settings/user.json b/public/language/en-US/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/en-US/admin/settings/user.json +++ b/public/language/en-US/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/en-US/email.json b/public/language/en-US/email.json index 51506cf884..356cf0d7c3 100644 --- a/public/language/en-US/email.json +++ b/public/language/en-US/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.no_topics": "There have been no active topics in the past %1", "digest.day": "day", "digest.week": "week", "digest.month": "month", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "New chat message received from %1", "notif.chat.cta": "Click here to continue the conversation", "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.", diff --git a/public/language/en-US/error.json b/public/language/en-US/error.json index 9a140cbb8d..5b18f5f9aa 100644 --- a/public/language/en-US/error.json +++ b/public/language/en-US/error.json @@ -33,6 +33,7 @@ "username-too-short": "Username too short", "username-too-long": "Username too long", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "User banned", "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)", diff --git a/public/language/en-US/flags.json b/public/language/en-US/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/en-US/flags.json +++ b/public/language/en-US/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/en-US/search.json b/public/language/en-US/search.json index f044781ff7..2e966d40f7 100644 --- a/public/language/en-US/search.json +++ b/public/language/en-US/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/advanced/database.json b/public/language/en-x-pirate/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/en-x-pirate/admin/advanced/database.json +++ b/public/language/en-x-pirate/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/en-x-pirate/admin/general/navigation.json b/public/language/en-x-pirate/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/en-x-pirate/admin/general/navigation.json +++ b/public/language/en-x-pirate/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/en-x-pirate/admin/manage/categories.json b/public/language/en-x-pirate/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/en-x-pirate/admin/manage/categories.json +++ b/public/language/en-x-pirate/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/en-x-pirate/admin/manage/privileges.json b/public/language/en-x-pirate/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/en-x-pirate/admin/manage/privileges.json +++ b/public/language/en-x-pirate/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/en-x-pirate/admin/settings/group.json b/public/language/en-x-pirate/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/en-x-pirate/admin/settings/group.json +++ b/public/language/en-x-pirate/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/en-x-pirate/admin/settings/tags.json b/public/language/en-x-pirate/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/en-x-pirate/admin/settings/tags.json +++ b/public/language/en-x-pirate/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/settings/user.json b/public/language/en-x-pirate/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/en-x-pirate/admin/settings/user.json +++ b/public/language/en-x-pirate/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/en-x-pirate/email.json b/public/language/en-x-pirate/email.json index 6ef582f0be..48dd739fa8 100644 --- a/public/language/en-x-pirate/email.json +++ b/public/language/en-x-pirate/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.no_topics": "There have been no active topics in the past %1", "digest.day": "day", "digest.week": "week", "digest.month": "month", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "New chat message received from %1", "notif.chat.cta": "Click here to continue the conversation", "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.", diff --git a/public/language/en-x-pirate/error.json b/public/language/en-x-pirate/error.json index 9a140cbb8d..5b18f5f9aa 100644 --- a/public/language/en-x-pirate/error.json +++ b/public/language/en-x-pirate/error.json @@ -33,6 +33,7 @@ "username-too-short": "Username too short", "username-too-long": "Username too long", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "User banned", "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)", diff --git a/public/language/en-x-pirate/flags.json b/public/language/en-x-pirate/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/en-x-pirate/flags.json +++ b/public/language/en-x-pirate/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/en-x-pirate/search.json b/public/language/en-x-pirate/search.json index f044781ff7..2e966d40f7 100644 --- a/public/language/en-x-pirate/search.json +++ b/public/language/en-x-pirate/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/es/admin/advanced/database.json b/public/language/es/admin/advanced/database.json index 71e50d1e76..2a91b28673 100644 --- a/public/language/es/admin/advanced/database.json +++ b/public/language/es/admin/advanced/database.json @@ -20,8 +20,9 @@ "mongo.mapped-memory": "Memoria Mapeada", "mongo.bytes-in": "Bytes In", "mongo.bytes-out": "Bytes Out", - "mongo.num-requests": "Number of Requests", + "mongo.num-requests": "Número de solicitudes", "mongo.raw-info": "Fila de Información MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Versión de Redis", diff --git a/public/language/es/admin/general/dashboard.json b/public/language/es/admin/general/dashboard.json index 0c28bacf1b..b0151c802d 100644 --- a/public/language/es/admin/general/dashboard.json +++ b/public/language/es/admin/general/dashboard.json @@ -65,9 +65,9 @@ "high-presence-topics": "Temas con Alta Presencia", "graphs.page-views": "Vista de la Pagina", - "graphs.page-views-registered": "Page Views Registered", - "graphs.page-views-guest": "Page Views Guest", - "graphs.page-views-bot": "Page Views Bot", + "graphs.page-views-registered": "Vistas de la página registradas", + "graphs.page-views-guest": "Vistas de la página visitantes", + "graphs.page-views-bot": "Vistas de la página Bot", "graphs.unique-visitors": "Visitantes Unicos", "graphs.registered-users": "Usuarios Registrados", "graphs.anonymous-users": "Usuarios Anónimos", diff --git a/public/language/es/admin/general/navigation.json b/public/language/es/admin/general/navigation.json index 1d7cab7bbe..22cad76ef8 100644 --- a/public/language/es/admin/general/navigation.json +++ b/public/language/es/admin/general/navigation.json @@ -5,10 +5,11 @@ "tooltip": "Nota de ayuda:", "text": "Texto:", "text-class": "Clase de Texto: opcional", + "class": "Clase opcional", "id": "ID: opcional", "properties": "Propiedades:", - "groups": "Groups:", + "groups": "Grupos:", "open-new-window": "Abrir en una ventana nueva", "btn.delete": "Borrar", diff --git a/public/language/es/admin/manage/categories.json b/public/language/es/admin/manage/categories.json index 6d6265a27f..a8416593f8 100644 --- a/public/language/es/admin/manage/categories.json +++ b/public/language/es/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Seleccionar Categoría", "set-parent-category": "Fijar Categoría Superior", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", - "privileges.category-selector": "Configuring privileges for ", + "privileges.description": "Puede configurar los privilegios de control de acceso para partes del sitio en esta sección. Los privilegios se pueden otorgar por usuario o por grupo. Seleccione el dominio de efecto de la lista desplegable a continuación.", + "privileges.category-selector": "Configurando privilegios para", "privileges.warning": "Nota: La configuracion de los privilegios toma efecto inmediataente. No es necesario guardar la categoría despué de ajustar estas configuraciones.", "privileges.section-viewing": "Privilegios de Visionado", "privileges.section-posting": "Privilegios de Respuesta", "privileges.section-moderation": "Privilegios de Moderación", + "privileges.section-other": "Otro", "privileges.section-user": "Usuario", "privileges.search-user": "Añadir Usuario", "privileges.no-users": "No hay privilegios específicos de usuario en esta categoría.", @@ -70,5 +71,5 @@ "alert.group-search": "Buscar un grupo aquí...", "collapse-all": "Minimizar Todo", "expand-all": "Expandir Todo", - "disable-on-create": "Disable on create" + "disable-on-create": "Desactivar en crear" } \ No newline at end of file diff --git a/public/language/es/admin/manage/privileges.json b/public/language/es/admin/manage/privileges.json index 922cf76f93..b2680b882b 100644 --- a/public/language/es/admin/manage/privileges.json +++ b/public/language/es/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Buscar Contenido", "search-users": "Buscar Usuarios", "search-tags": "Buscar Tags", - "allow-local-login": "Local Login", + "view-users": "Ver Usuarios", + "view-tags": "Ver etiquetas", + "view-groups": "Ver grupos", + "allow-local-login": "Inicio de sesión local", + "allow-group-creation": "Crear grupo", "find-category": "Buscar Categoría", "access-category": "Acceder Categoría", diff --git a/public/language/es/admin/manage/uploads.json b/public/language/es/admin/manage/uploads.json index 21bc8201fc..41eae146e3 100644 --- a/public/language/es/admin/manage/uploads.json +++ b/public/language/es/admin/manage/uploads.json @@ -1,9 +1,9 @@ { - "upload-file": "Upload File", - "filename": "Filename", - "usage": "Post Usage", - "orphaned": "Orphaned", - "size/filecount": "Size / Filecount", - "confirm-delete": "Do you really want to delete this file?", - "filecount": "%1 files" + "upload-file": "Subir archivo", + "filename": "Nombre del archivo", + "usage": "Uso de Publicaciones", + "orphaned": "Huérfano", + "size/filecount": "Tamaño / Recuento de archivos", + "confirm-delete": "¿Realmente quieres borrar este archivo?", + "filecount": "%1 archivos" } \ No newline at end of file diff --git a/public/language/es/admin/manage/users.json b/public/language/es/admin/manage/users.json index bb9dce3500..562b95bf18 100644 --- a/public/language/es/admin/manage/users.json +++ b/public/language/es/admin/manage/users.json @@ -93,7 +93,7 @@ "alerts.error-x": "Error

%1

", "alerts.create-success": "¡Usuario creado!", - "alerts.prompt-email": "Emails: ", + "alerts.prompt-email": "Correos electrónico:", "alerts.email-sent-to": "Un email de invitación ha sido enviado a %1", "alerts.x-users-found": "¡%1 usuario(s) encontrado(s)! La búsqueda tardó %2 ms." } \ No newline at end of file diff --git a/public/language/es/admin/settings/advanced.json b/public/language/es/admin/settings/advanced.json index 273c042848..f4d9bea266 100644 --- a/public/language/es/admin/settings/advanced.json +++ b/public/language/es/admin/settings/advanced.json @@ -12,7 +12,7 @@ "headers.acac": "Credenciales-Control-Permitir-Acceso", "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", - "hsts": "Strict Transport Security", + "hsts": "Seguridad estricta del transporte", "hsts.enabled": "Enabled HSTS (recommended)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", diff --git a/public/language/es/admin/settings/group.json b/public/language/es/admin/settings/group.json index 17da28d18d..60808df66e 100644 --- a/public/language/es/admin/settings/group.json +++ b/public/language/es/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Grupos Privados", "private-groups.help": "Si se habilita, unirse a grupos requiere la aprobación del dueño del grupo (Por defecto: habilitado)", "private-groups.warning": "¡Cuidado! Si esta opción está deshabilitada y tienes grupos privados, se convertirán en grupos públicos automáticamente.", - "allow-creation": "Permitir Creación de Grupos", - "allow-creation-help": "Si se encuentra habilitado, los usuarios podrán crear grupos (Por defecto: deshabilitado)", "allow-multiple-badges-help": "Esta opción puede ser usadas para permitir a los usuarios seleccionar múltiples medallas de grupo, requiere de soporte del theme/plantilla.", "max-name-length": "Longitud Máxima de Nombre de Grupo", + "max-title-length": "Longitud máxima del título del grupo", "cover-image": "Imagen de Portada de Grupo", "default-cover": "Imágenes de Portada por Defecto", "default-cover-help": "Añadir lista separada por comas de imágenes de portada por defecto para grupos que no han subido una imagen de portada" diff --git a/public/language/es/admin/settings/tags.json b/public/language/es/admin/settings/tags.json index 510d4c055f..f0c27c0954 100644 --- a/public/language/es/admin/settings/tags.json +++ b/public/language/es/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Longitud Mínima de Etiqueta (tag)", "max-length": "Longitud Máxima de Etiqueta (tag)", "goto-manage": "Click aquí para visitar la página de administración de etiquetas (tags)", - "privacy": "Privacidad", - "list-private": "Hacer la lista de etiquetas (tags ) privada", "related-topics": "Temas Relacionados", "max-related-topics": "Máximo de temas relacionados para mostrar (si lo soporta el theme/plantilla)" } \ No newline at end of file diff --git a/public/language/es/admin/settings/uploads.json b/public/language/es/admin/settings/uploads.json index b6c7347a9b..c33407a808 100644 --- a/public/language/es/admin/settings/uploads.json +++ b/public/language/es/admin/settings/uploads.json @@ -2,20 +2,20 @@ "posts": "Mensajes", "allow-files": "Permitir a los usuarios subir archivos habituales", "private": "Hacer las subidas de archivos privadas", - "private-extensions": "File extensions to make private", + "private-extensions": "Extensiones de archivo para hacer privadas.", "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", - "resize-image-width-threshold": "Resize images if they are wider than specified width", + "resize-image-width-threshold": "Cambiar el tamaño de las imágenes si son más anchas que el ancho especificado", "resize-image-width-threshold-help": "(in pixels, default: 1520 pixels, set to 0 to disable)", - "resize-image-width": "Resize images down to specified width", - "resize-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)", + "resize-image-width": "Cambiar el tamaño de las imágenes hasta el ancho especificado", + "resize-image-width-help": "(En píxeles, predeterminado: 760 píxeles, configúrelo 0 para desactivar)", "resize-image-quality": "Calidad a utlizar cuando se redimensionen imágenes", "resize-image-quality-help": "Usar una calidad inferior para reducir el tamaño de archivo de las imágenes redimensionadas.", "max-file-size": "Tamaño Máximo de Archivo (en KiB)", "max-file-size-help": "(en kibibytes, por defecto: 2048 KiB)", - "reject-image-width": "Maximum Image Width (in pixels)", - "reject-image-width-help": "Images wider than this value will be rejected.", - "reject-image-height": "Maximum Image Height (in pixels)", - "reject-image-height-help": "Images taller than this value will be rejected.", + "reject-image-width": "Ancho máximo de la imágen (en píxeles)", + "reject-image-width-help": "Las imágenes más anchas que este valor serán rechazadas.", + "reject-image-height": "Altura máxima de la imágen (en píxeles)", + "reject-image-height-help": "Las imágenes más altas que este valor serán rechazadas.", "allow-topic-thumbnails": "Permitir a los usuarios subir imágenes en miniatura para los temas", "topic-thumb-size": "Tamaño de la Imagen en Miniatura para el Tema", "allowed-file-extensions": "Permitir Extensiones de Archivo", diff --git a/public/language/es/admin/settings/user.json b/public/language/es/admin/settings/user.json index e253c318d8..85594d985b 100644 --- a/public/language/es/admin/settings/user.json +++ b/public/language/es/admin/settings/user.json @@ -8,13 +8,12 @@ "allow-login-with.username": "Solo Nombre de Usuario", "allow-login-with.email": "Solo Email", "account-settings": "Configuración de la Cuenta", - "gdpr_enabled": "Enable GDPR consent collection", + "gdpr_enabled": "Habilitar la recolección del consentimiento 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.", "disable-username-changes": "Desactivar cambios de nombre de usuario", "disable-email-changes": "Desactivar cambios de email", "disable-password-changes": "Desactivar cambios de contraseña", "allow-account-deletion": "Permitir borrar cuenta", - "user-info-private": "Esconder lista de usuarios y datos de invitados", "hide-fullname": "Esconder nombre completo de los usuarios", "hide-email": "Esconder email de los usuarios", "themes": "Plantillas", @@ -27,12 +26,12 @@ "lockout-duration": "Duración del Bloqueo de una Cuenta (minutos)", "login-days": "Días para recordar los sesiones de inicio de usuario", "password-expiry-days": "Forzar reseteo de contraseña después de un número de días determinado", - "session-time": "Session Time", - "session-time-days": "Days", - "session-time-seconds": "Seconds", + "session-time": "Tiempo de sesión", + "session-time-days": "Días", + "session-time-seconds": "Segundos", "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.", + "online-cutoff": "Minutos después de que el usuario se considere inactivo", + "online-cutoff-help": "Si el usuario no realiza acciones durante este tiempo, se considerarán inactivos y no recibirán actualizaciones en tiempo real.", "registration": "Registro de Usuario", "registration-type": "Tipo de Registro", "registration-type.normal": "Normal", @@ -72,7 +71,7 @@ "follow-replied-topics": "Seguir los temas a los que contestas", "default-notification-settings": "Configuración de notificación por defecto", "categoryWatchState": "Default category watch state", - "categoryWatchState.watching": "Watching", + "categoryWatchState.watching": "Vigilando ", "categoryWatchState.notwatching": "Not Watching", - "categoryWatchState.ignoring": "Ignoring" + "categoryWatchState.ignoring": "Ignorando" } \ No newline at end of file diff --git a/public/language/es/category.json b/public/language/es/category.json index 8090f614b0..f175476324 100644 --- a/public/language/es/category.json +++ b/public/language/es/category.json @@ -12,11 +12,11 @@ "watching": "Siguiendo", "not-watching": "Not Watching", "ignoring": "Ignorando", - "watching.description": "Show topics in unread and recent", - "not-watching.description": "Do not show topics in unread, show in recent", - "ignoring.description": "Do not show topics in unread and recent", - "watching.message": "You are now watching updates from this category and all subcategories", - "notwatching.message": "You are not watching updates from this category and all subcategories", - "ignoring.message": "You are now ignoring updates from this category and all subcategories", + "watching.description": "Mostrar temas en no leídos y recientes", + "not-watching.description": "No mostrar temas en no leído, mostrar en reciente", + "ignoring.description": "No mostrar temas en no leídos y recientes.", + "watching.message": "Ahora estás viendo las actualizaciones de esta categoría y todas las subcategorías", + "notwatching.message": "No estás viendo las actualizaciones de esta categoría y todas las subcategorías.", + "ignoring.message": "Ahora estás ignorando las actualizaciones de esta categoría y todas las subcategorías", "watched-categories": "Categorías seguidas" } \ No newline at end of file diff --git a/public/language/es/email.json b/public/language/es/email.json index 562e1ea2b8..072144417c 100644 --- a/public/language/es/email.json +++ b/public/language/es/email.json @@ -1,6 +1,6 @@ { "test-email.subject": "Test Email", - "password-reset-requested": "Password Reset Requested!", + "password-reset-requested": "¡Restablecimiento de contraseña solicitada!", "welcome-to": "Bienvenido a %1", "invite": "Invitación de %1", "greeting_no_name": "Hola", @@ -24,11 +24,11 @@ "digest.latest_topics": "Últimos temas de %1", "digest.cta": "Cliquea aquí para visitar %1", "digest.unsub.info": "Este compendio te fue enviado debido a tus ajustes de subscripción.", - "digest.no_topics": "No han habido temas activos anteriores %1", "digest.day": "día", "digest.week": "semana", "digest.month": "mes", "digest.subject": "Resumen de %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Nuevo mensaje de chat recibido de %1", "notif.chat.cta": "Haz click aquí para continuar la conversación", "notif.chat.unsub.info": "Esta notificación de chat se te envió debido a tus ajustes de suscripción.", diff --git a/public/language/es/error.json b/public/language/es/error.json index 82f1f87150..0d65c325c2 100644 --- a/public/language/es/error.json +++ b/public/language/es/error.json @@ -33,6 +33,7 @@ "username-too-short": "Nombre de usuario es demasiado corto", "username-too-long": "Nombre de usuario demasiado largo", "password-too-long": "Contraseña muy corta", + "reset-rate-limited": "Demasiadas solicitudes de restablecimiento de contraseña (tasa limitada)", "user-banned": "Usuario baneado", "user-banned-reason": "Lo siento, esta cuenta ha sido baneada ( Razon: %1 )", "user-banned-reason-until": "Lo siento, esta cuenta ha sido baneada hasta %1 ( Razon: %2 )", @@ -78,7 +79,7 @@ "still-uploading": "Por favor, espera a que terminen las subidas.", "file-too-big": "El tamaño de fichero máximo es de %1 kB - por favor, suba un fichero más pequeño", "guest-upload-disabled": "Las subidas están deshabilitadas para los invitados", - "cors-error": "Unable to upload image due to misconfigured CORS", + "cors-error": "No se puede subir la imágen debido a CORS mal configurado", "already-bookmarked": "Ya marcaste este mensaje", "already-unbookmarked": "Ya desmarcarste este mensaje", "cant-ban-other-admins": "¡No puedes expulsar a otros administradores!", @@ -88,7 +89,7 @@ "invalid-image-type": "Tipo de imagen inválido. Los tipos permitidos son: %1", "invalid-image-extension": "Extensión de imagen inválida", "invalid-file-type": "Tipo de fichero inválido. Los tipos permitidos son: %1", - "invalid-image-dimensions": "Image dimensions are too big", + "invalid-image-dimensions": "Las dimensiones de la imágen son demasiado grandes.", "group-name-too-short": "Nombre del grupo es demasiado corto.", "group-name-too-long": "Nombre de grupo demasiado largo", "group-already-exists": "El grupo ya existe.", @@ -120,7 +121,7 @@ "chat-edit-duration-expired": "Sólo se te permite editar mensajes de chat durante %1 segundo(s) después de enviar el mensaje", "chat-delete-duration-expired": "Sólo se te permite borrar mensajes de chat durante %1 segundo(s) después de enviar el mensaje", "chat-deleted-already": "Este mensaje de chat ya ha sido borrado.", - "chat-restored-already": "This chat message has already been restored.", + "chat-restored-already": "Este mensaje de chat ya ha sido restaurado.", "already-voting-for-this-post": "Ya has votado a este mensaje.", "reputation-system-disabled": "El sistema de reputación está deshabilitado.", "downvoting-disabled": "La votación negativa está deshabilitada.", @@ -153,8 +154,8 @@ "cant-move-to-same-topic": "¡No puedes mover el mensaje al mismo tema!", "cannot-block-self": "¡No puedes bloquearte a tí mismo!", "cannot-block-privileged": "No puedes bloquear administradores o moderadores globales", - "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", + "cannot-block-guest": "Los invitados no pueden bloquear a otros usuarios", + "already-blocked": "Este usuario ya está bloqueado.", + "already-unblocked": "Este usuario ya está desbloqueado.", "no-connection": "Parece haber un problema con tu conexión a internet" } \ No newline at end of file diff --git a/public/language/es/flags.json b/public/language/es/flags.json index 0ddcd0629d..0bf14181a7 100644 --- a/public/language/es/flags.json +++ b/public/language/es/flags.json @@ -9,6 +9,7 @@ "updated": "Actualizado", "target-purged": "El contenido al que se refiere este indicador ha sido purgado y ya no está disponible.", + "graph-label": "Daily Flags", "quick-filters": "Filtros rapidos", "filter-active": "Hay uno o más filtros activos en esta lista de indicadores.", "filter-reset": "Quitar filtros", diff --git a/public/language/es/modules.json b/public/language/es/modules.json index 4adfd1595d..80410a8922 100644 --- a/public/language/es/modules.json +++ b/public/language/es/modules.json @@ -47,7 +47,7 @@ "composer.formatting.italic": "Itálica", "composer.formatting.list": "Lista", "composer.formatting.strikethrough": "Tachado", - "composer.formatting.code": "Code", + "composer.formatting.code": "Código", "composer.formatting.link": "Enlace", "composer.formatting.picture": "Foto", "composer.upload-picture": "Subir foto", diff --git a/public/language/es/notifications.json b/public/language/es/notifications.json index 5931dd0a08..a12cb1b2ba 100644 --- a/public/language/es/notifications.json +++ b/public/language/es/notifications.json @@ -8,7 +8,7 @@ "outgoing_link_message": "Ahora estás saliendo %1", "continue_to": "Continuar a %1", "return_to": "Regresar a %1", - "new_notification": "You have a new notification", + "new_notification": "Tú tienes una nueva notificación ", "you_have_unread_notifications": "Tienes notificaciones sin leer.", "all": "Todo", "topics": "Temas", diff --git a/public/language/es/pages.json b/public/language/es/pages.json index c9a42463f5..8ffed47e67 100644 --- a/public/language/es/pages.json +++ b/public/language/es/pages.json @@ -6,10 +6,10 @@ "popular-month": "Temas populares del mes", "popular-alltime": "Temas populares de siempre", "recent": "Temas recientes", - "top-day": "Top voted topics today", - "top-week": "Top voted topics this week", - "top-month": "Top voted topics this month", - "top-alltime": "Top Voted Topics", + "top-day": "Temas más votados hoy", + "top-week": "Temas más votados de esta semana", + "top-month": "Temas más votados este mes", + "top-alltime": "Temas más votados", "moderator-tools": "Herramientas de Moderadores", "flagged-content": "Contenido reportado", "ip-blacklist": "Lista negra de IPS", @@ -45,7 +45,7 @@ "account/posts": "Publicados por %1", "account/topics": "Temas creados por %1", "account/groups": "Grupos de %1", - "account/watched_categories": "%1's Watched Categories", + "account/watched_categories": "%1 Categorías seguidas", "account/bookmarks": "%1's Mensajes marcados", "account/settings": "Preferencias", "account/watched": "Temas seguidos por %1", diff --git a/public/language/es/search.json b/public/language/es/search.json index 28129e8e21..42f279f013 100644 --- a/public/language/es/search.json +++ b/public/language/es/search.json @@ -17,7 +17,7 @@ "at-most": "De máximo", "relevance": "Relevancia", "post-time": "Fecha de publicación", - "votes": "Votes", + "votes": "Votos", "newer-than": "Más reciente que", "older-than": "Más antiguo que", "any-date": "Cualquier fecha", @@ -31,7 +31,7 @@ "sort-by": "Ordenar por", "last-reply-time": "Fecha de última respuesta", "topic-title": "Título de tema", - "topic-votes": "Topic votes", + "topic-votes": "Votos de tema", "number-of-replies": "Número de respuestas", "number-of-views": "Número de visualizaciones", "topic-start-date": "Fecha de inicio del tema", @@ -43,5 +43,6 @@ "clear-preferences": "Descartar preferencias", "search-preferences-saved": "Preferencias de búsqueda guardadas", "search-preferences-cleared": "Preferencias de búsqueda descartadas", - "show-results-as": "Mostrar resultados como" + "show-results-as": "Mostrar resultados como", + "see-more-results": "Ver mas resultados (%1)" } \ No newline at end of file diff --git a/public/language/es/user.json b/public/language/es/user.json index 226d5522c0..359957bdd2 100644 --- a/public/language/es/user.json +++ b/public/language/es/user.json @@ -25,7 +25,7 @@ "profile_views": "Visitas", "reputation": "Reputación", "bookmarks": "Marcadores", - "watched_categories": "Watched categories", + "watched_categories": "Categorías seguidas", "watched": "Suscritos", "ignored": "Ignorado", "default-category-watch-state": "Default category watch state", @@ -34,7 +34,7 @@ "blocks": "Bloqueos", "block_toggle": "Cambiar Bloqueo", "block_user": "Bloquear usuario", - "unblock_user": "Unblock User", + "unblock_user": "Desbloquear usuario", "aboutme": "Sobre mí", "signature": "Firma", "birthday": "Cumpleaños", @@ -49,7 +49,7 @@ "change_picture": "Cambiar imagen", "change_username": "Cambiar nombre de usuario", "change_email": "Cambiar email", - "email_same_as_password": "Please enter your current password to continue – you've entered your new email again", + "email_same_as_password": "Por favor ingrese su contraseña actual para continuar – tú has introducido tu nuevo correo electrónico de nuevo", "edit": "Editar", "edit-profile": "Editar Perfil", "default_picture": "Icono por defecto", @@ -113,7 +113,7 @@ "upvote-notif-freq.all": "Todos los Votos Positivos", "upvote-notif-freq.first": "First Per Post", "upvote-notif-freq.everyTen": "Cada Diez Votos Positivos", - "upvote-notif-freq.threshold": "On 1, 5, 10, 25, 50, 100, 150, 200...", + "upvote-notif-freq.threshold": "En 1, 5, 10, 25, 50, 100, 150, 200...", "upvote-notif-freq.logarithmic": "A los 10, 100, 1000...", "upvote-notif-freq.disabled": "Desactivado", "browsing": "Preferencias de navegación.", @@ -150,7 +150,7 @@ "info.moderation-note": "Nota de Moderación", "info.moderation-note.success": "Nota de moderación guardada", "info.moderation-note.add": "Añadir nota", - "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.", + "sessions.description": "Esta página le permite ver las sesiones activas en este foro y revocarlas si es necesario. Puedes revocar tu propia sesión cerrando sesión en tu cuenta.", "consent.title": "Tus derechos & Consentimiento", "consent.lead": "Este foro recolecta y procesa su información personal", "consent.intro": "Usamos esta información estrictamente para personalizar su experiencia en esta comunidad, así como para asociar los mensajes que haga con su cuenta de usuario. Durante el registro se le pidió que proporcionara un nombre de usuario y dirección de correo electrónico, puede también proveer información adicional para completar su perfil en esta web.

Conservamos esta información mientras su cuenta de usuario exista, y podrá retirar su consentimiento en cualquier momento borrando esta cuenta de usuario. A su vez, puede pedir una copia de su contribución a este sitio través de la página de Derechos & Consentimiento.

Si tiene cualquier pregunta o preocupación, le animamos a dirigirse al equipo de administración de este foro.", diff --git a/public/language/es/users.json b/public/language/es/users.json index 228b89daf3..9fc683b9c1 100644 --- a/public/language/es/users.json +++ b/public/language/es/users.json @@ -10,7 +10,7 @@ "filter-by": "Filtrar Por", "online-only": "Sólo en línea", "invite": "Invitar", - "prompt-email": "Emails:", + "prompt-email": "Correos electrónico:", "invitation-email-sent": "Un correo de invitación ha sido enviado a %1", "user_list": "Lista de Usuarios", "recent_topics": "Temas Recientes", diff --git a/public/language/et/admin/advanced/database.json b/public/language/et/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/et/admin/advanced/database.json +++ b/public/language/et/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/et/admin/general/navigation.json b/public/language/et/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/et/admin/general/navigation.json +++ b/public/language/et/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/et/admin/manage/categories.json b/public/language/et/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/et/admin/manage/categories.json +++ b/public/language/et/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/et/admin/manage/privileges.json b/public/language/et/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/et/admin/manage/privileges.json +++ b/public/language/et/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/et/admin/settings/group.json b/public/language/et/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/et/admin/settings/group.json +++ b/public/language/et/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/et/admin/settings/tags.json b/public/language/et/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/et/admin/settings/tags.json +++ b/public/language/et/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/et/admin/settings/user.json b/public/language/et/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/et/admin/settings/user.json +++ b/public/language/et/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/et/email.json b/public/language/et/email.json index 282c9ed0cd..b8a074c869 100644 --- a/public/language/et/email.json +++ b/public/language/et/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Viimased teemad %1 poolt", "digest.cta": "Vajuta siia et külastada %1", "digest.unsub.info": "See uudiskiri on saadetud teile tellimuse seadistuse tõttu.", - "digest.no_topics": "Viimase %1 jooksul ei ole olnud ühtegi aktiivset teemat", "digest.day": "päev", "digest.week": "nädal", "digest.month": "kuu", "digest.subject": "Ima 1% jaoks", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Sulle on saabunud uus sõnum kasutajalt %1", "notif.chat.cta": "Vajuta siia, et jätkata vestlusega", "notif.chat.unsub.info": "See chat teavitus on saadetud teile tellimuse seadistuse tõttu.", diff --git a/public/language/et/error.json b/public/language/et/error.json index 2d5be07a5c..d2e0c6adb9 100644 --- a/public/language/et/error.json +++ b/public/language/et/error.json @@ -33,6 +33,7 @@ "username-too-short": "Kasutajanimi on liiga lühike", "username-too-long": "Kasutajanimi on liiga pikk", "password-too-long": "Parool liiga pikk", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Kasutaja bannitud", "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)", diff --git a/public/language/et/flags.json b/public/language/et/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/et/flags.json +++ b/public/language/et/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/et/search.json b/public/language/et/search.json index a40e903fab..cbe608d207 100644 --- a/public/language/et/search.json +++ b/public/language/et/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Kustuta eelistused", "search-preferences-saved": "Otsingueelistused salvestatud", "search-preferences-cleared": "Otsingueelistused kustutatud", - "show-results-as": "Näita tulemusi kui" + "show-results-as": "Näita tulemusi kui", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/advanced/database.json b/public/language/fa-IR/admin/advanced/database.json index b85c642f93..d8f4c57681 100644 --- a/public/language/fa-IR/admin/advanced/database.json +++ b/public/language/fa-IR/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/fa-IR/admin/general/navigation.json b/public/language/fa-IR/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/fa-IR/admin/general/navigation.json +++ b/public/language/fa-IR/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/fa-IR/admin/manage/categories.json b/public/language/fa-IR/admin/manage/categories.json index 5e5c16dc3f..5b009e0045 100644 --- a/public/language/fa-IR/admin/manage/categories.json +++ b/public/language/fa-IR/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/fa-IR/admin/manage/privileges.json b/public/language/fa-IR/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/fa-IR/admin/manage/privileges.json +++ b/public/language/fa-IR/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/fa-IR/admin/settings/group.json b/public/language/fa-IR/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/fa-IR/admin/settings/group.json +++ b/public/language/fa-IR/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/fa-IR/admin/settings/tags.json b/public/language/fa-IR/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/fa-IR/admin/settings/tags.json +++ b/public/language/fa-IR/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/settings/user.json b/public/language/fa-IR/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/fa-IR/admin/settings/user.json +++ b/public/language/fa-IR/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/fa-IR/email.json b/public/language/fa-IR/email.json index dea5fda19f..b0e4407859 100644 --- a/public/language/fa-IR/email.json +++ b/public/language/fa-IR/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "آخرین پست های %1:", "digest.cta": "برای دیدن %1 اینجا کلیک کنید", "digest.unsub.info": "این اعداد که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", - "digest.no_topics": "در %1 گذشته هیچ موضوعی فعال نبوده است", "digest.day": "روز", "digest.week": "هفته", "digest.month": "ماه", "digest.subject": "خلاصه برای %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "پیام چتی جدیدی از %1 دریافت شد", "notif.chat.cta": "برای ادامه‌ی چت اینجا کلیک کنید", "notif.chat.unsub.info": "این اطلاعیه ی چتیی که برای شما فرستاده شده به علت تنظیمات اشترک شماست.", diff --git a/public/language/fa-IR/error.json b/public/language/fa-IR/error.json index 9da7cc8e9b..31145f755e 100644 --- a/public/language/fa-IR/error.json +++ b/public/language/fa-IR/error.json @@ -33,6 +33,7 @@ "username-too-short": "نام کاربری خیلی کوتاه است.", "username-too-long": "نام کاربری بسیار طولانیست", "password-too-long": "کلمه عبور بسیار طولانیست", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "کاربر اخراج شد", "user-banned-reason": "با عرض پوزش، این حساب کاربری از انجمن اخراج شده است (دلیل: %1)", "user-banned-reason-until": "با عرض پوزش، این حساب کاربری تا %1 اخراج شده است (دلیل: %2)", diff --git a/public/language/fa-IR/flags.json b/public/language/fa-IR/flags.json index f59bb99dc9..8d3edae59b 100644 --- a/public/language/fa-IR/flags.json +++ b/public/language/fa-IR/flags.json @@ -9,6 +9,7 @@ "updated": "به روز رسانی شد", "target-purged": "محتوای این گزارش حذف شده است و در دسترس نیست.", + "graph-label": "Daily Flags", "quick-filters": "فیلتر های سریع", "filter-active": "یک یا تعداد بیشتری از فیلتر ها در لیست گزارش ها فعال هستند", "filter-reset": "حذف فیلتر ها", diff --git a/public/language/fa-IR/search.json b/public/language/fa-IR/search.json index 2feb2d2311..15f0c04009 100644 --- a/public/language/fa-IR/search.json +++ b/public/language/fa-IR/search.json @@ -43,5 +43,6 @@ "clear-preferences": "پاک کردن تنظیمات", "search-preferences-saved": "تنظیمات جستحو ذخیره شد", "search-preferences-cleared": "تنظیمات جستجو پاک شد", - "show-results-as": "نمایش نتایج به عنوان" + "show-results-as": "نمایش نتایج به عنوان", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/fi/admin/advanced/database.json b/public/language/fi/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/fi/admin/advanced/database.json +++ b/public/language/fi/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/fi/admin/general/navigation.json b/public/language/fi/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/fi/admin/general/navigation.json +++ b/public/language/fi/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/fi/admin/manage/categories.json b/public/language/fi/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/fi/admin/manage/categories.json +++ b/public/language/fi/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/fi/admin/manage/privileges.json b/public/language/fi/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/fi/admin/manage/privileges.json +++ b/public/language/fi/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/fi/admin/settings/group.json b/public/language/fi/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/fi/admin/settings/group.json +++ b/public/language/fi/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/fi/admin/settings/tags.json b/public/language/fi/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/fi/admin/settings/tags.json +++ b/public/language/fi/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/fi/admin/settings/user.json b/public/language/fi/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/fi/admin/settings/user.json +++ b/public/language/fi/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/fi/email.json b/public/language/fi/email.json index 71d18c1f48..d23fa2b752 100644 --- a/public/language/fi/email.json +++ b/public/language/fi/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Viimeisimmät viestiketjut henkilöltä %1", "digest.cta": "Click here to visit %1", "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.no_topics": "There have been no active topics in the past %1", "digest.day": "päivä", "digest.week": "viikko", "digest.month": "kuukausi", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Uusi chatviesti henkilöltä %1", "notif.chat.cta": "Click here to continue the conversation", "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.", diff --git a/public/language/fi/error.json b/public/language/fi/error.json index 6a50aa71f6..fca85df2ab 100644 --- a/public/language/fi/error.json +++ b/public/language/fi/error.json @@ -33,6 +33,7 @@ "username-too-short": "Käyttäjänimi on liian lyhyt", "username-too-long": "Käyttäjänimi on liian pitkä", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Käyttäjä on estetty", "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)", diff --git a/public/language/fi/flags.json b/public/language/fi/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/fi/flags.json +++ b/public/language/fi/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/fi/search.json b/public/language/fi/search.json index 9afcb49462..2428b84808 100644 --- a/public/language/fi/search.json +++ b/public/language/fi/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/fr/admin/advanced/database.json b/public/language/fr/admin/advanced/database.json index 29be4f8f26..3a18a83f74 100644 --- a/public/language/fr/admin/advanced/database.json +++ b/public/language/fr/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Données sorties", "mongo.num-requests": "Nombre de requêtes", "mongo.raw-info": "Informations brutes MongoDB", + "mongo.unauthorized": "NodeBB n'a pas pu interroger la base de données MongoDB pour obtenir des statistiques pertinentes. Assurez-vous que l'utilisateur utilisé par NodeBB contient le message "clusterMonitor" pour le rôle "admin" des bases de données.", "redis": "Redis", "redis.version": "Version de Redis", diff --git a/public/language/fr/admin/general/navigation.json b/public/language/fr/admin/general/navigation.json index 8b505abab5..02d6a7fbeb 100644 --- a/public/language/fr/admin/general/navigation.json +++ b/public/language/fr/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Info-bulle :", "text": "Texte :", "text-class": "Classe de texte : optionnel", + "class": "Classe: facultatif", "id": "ID : optionnel", "properties": "Propriétés :", diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index 3355ba1122..26f6a7a297 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Sélectionner une catégorie", "set-parent-category": "Définissez une catégorie parente", - "privileges.description": "Vous pouvez configurer les privilèges de contrôle d'accès pour cette catégorie dans cette section. Les privilèges peuvent être accordés par utilisateur ou par groupe. Sélectionnez le domaine d’effet dans le menu déroulant ci-dessous.", + "privileges.description": "Vous pouvez configurer les privilèges d'accès pour des sections du site. Les privilèges peuvent être accordés par utilisateur ou par groupe. Sélectionnez les droits d'accès dans le menu déroulant ci-dessous.", "privileges.category-selector": "Configuration des privilèges pour", "privileges.warning": "Note: Les paramètres de privilège prennent effet instantanément . Il n'est pas nécessaire de sauvegarder la catégorie après avoir ajusté ces paramètres.", "privileges.section-viewing": "Afficher les Privilèges", "privileges.section-posting": "Privilège de posting", "privileges.section-moderation": "Privilèges de modération", + "privileges.section-other": "Autres", "privileges.section-user": "Utilisateur", "privileges.search-user": "Ajouter un utilisateur", "privileges.no-users": "Aucun privilège spécifique aux utilisateurs dans cette catégorie.", diff --git a/public/language/fr/admin/manage/privileges.json b/public/language/fr/admin/manage/privileges.json index e0ac1db499..173779e8eb 100644 --- a/public/language/fr/admin/manage/privileges.json +++ b/public/language/fr/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Rechercher un contenu", "search-users": "Rechercher des utilisateurs", "search-tags": "Rechercher les tags", + "view-users": "Afficher les Utilisateurs", + "view-tags": "Afficher les Tags", + "view-groups": "Afficher les Groupes", "allow-local-login": "Identifiant local", + "allow-group-creation": "Groupe Créer", "find-category": "Rechercher une catégorie", "access-category": "Droits des catégories", diff --git a/public/language/fr/admin/settings/group.json b/public/language/fr/admin/settings/group.json index 147eb40a2f..75c107c3fb 100644 --- a/public/language/fr/admin/settings/group.json +++ b/public/language/fr/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Groupes privés", "private-groups.help": "Si cette case est cochée, rejoindre un groupe nécessitera l'accord d'un propriétaire du groupe (Par défaut : activé)", "private-groups.warning": "Attention ! Si cette option est désactivée et que vous avez des groupes privés, ils deviendront automatiquement publics.", - "allow-creation": "Autoriser la création de groupes", - "allow-creation-help": "Si activé, les utilisateurs peuvent créer des groupes (Par défaut : Désactivé)", "allow-multiple-badges-help": "Cet affichage peut être utilisé pour permettre aux utilisateurs de sélectionner plusieurs badges de groupe, nécessite que votre thème le supporte.", "max-name-length": "Longueur maximum des noms de groupes", + "max-title-length": "Longueur maximale du titre de groupe", "cover-image": "Image de couverture du groupe", "default-cover": "Images de couverture par défaut", "default-cover-help": "Ajouter des images de couvertures par défaut séparées par des virgules pour les groupes n'ayant pas téléchargé d'image de couverture" diff --git a/public/language/fr/admin/settings/tags.json b/public/language/fr/admin/settings/tags.json index 25d1c01e1d..bf62bb18ec 100644 --- a/public/language/fr/admin/settings/tags.json +++ b/public/language/fr/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Longueur minimum des mots-clés", "max-length": "Longueur maximum des mots-clés", "goto-manage": "Cliquez ici pour visiter la page de gestion des mots-clés", - "privacy": "Politique de confidentialité", - "list-private": "Rendre privée la liste des mots-clés", "related-topics": "Sujets connexes", "max-related-topics": "Nombre maximum de sujets connexes à afficher (si supporté par le thème)" } \ No newline at end of file diff --git a/public/language/fr/admin/settings/user.json b/public/language/fr/admin/settings/user.json index d17ff27680..b41502ba28 100644 --- a/public/language/fr/admin/settings/user.json +++ b/public/language/fr/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Désactiver le changement d'adresse e-mail", "disable-password-changes": "Désactiver le changement de mot de passe", "allow-account-deletion": "Autoriser la suppression des comptes", - "user-info-private": "Masquer la liste et les données utilisateurs aux invités", "hide-fullname": "Masquer le nom complet aux utilisateurs", "hide-email": "Masquer les emails aux utilisateurs", "themes": "Thèmes", diff --git a/public/language/fr/email.json b/public/language/fr/email.json index 0105fb5a03..71ce766319 100644 --- a/public/language/fr/email.json +++ b/public/language/fr/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Derniers sujets de %1 :", "digest.cta": "Cliquez ici pour aller sur %1", "digest.unsub.info": "Ce message vous a été envoyé en raison de vos paramètres d'abonnement.", - "digest.no_topics": "Il n'y a eu aucun sujet actifs durant %1", "digest.day": "jour", "digest.week": "semaine", "digest.month": "mois", "digest.subject": "Résumé de l'actualité de %1", + "digest.title": "Votre résumé quotidien ", "notif.chat.subject": "Nouveau message de chat reçu de %1", "notif.chat.cta": "Cliquez ici pour continuer la conversation", "notif.chat.unsub.info": "Cette notification de chat a été envoyé en raison de vos paramètres d'abonnement.", diff --git a/public/language/fr/error.json b/public/language/fr/error.json index 7294e5b458..56bba33b52 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -33,6 +33,7 @@ "username-too-short": "Nom d'utilisateur trop court", "username-too-long": "Nom d'utilisateur trop long", "password-too-long": "Mot de passe trop long", + "reset-rate-limited": "Trop de demandes de réinitialisation de mot de passe (demandes limitées)", "user-banned": "Utilisateur banni", "user-banned-reason": "Désolé, ce compte a été banni (Raison : %1)", "user-banned-reason-until": "Désolé, ce compte a été banni jusqu'au %1 (Raison : %2).", diff --git a/public/language/fr/flags.json b/public/language/fr/flags.json index ef8740f72e..2a00538f82 100644 --- a/public/language/fr/flags.json +++ b/public/language/fr/flags.json @@ -9,6 +9,7 @@ "updated": "Mis à jour", "target-purged": "Le contenu référencé par ce signalement a été supprimé et n'est plus accessible", + "graph-label": "Résumé des signalements", "quick-filters": "Filtres rapides", "filter-active": "Il y a un ou plusieurs filtres actifs dans cette liste de signalements", "filter-reset": "Supprimer les filtres", diff --git a/public/language/fr/search.json b/public/language/fr/search.json index b6facc2a1c..fc6a840218 100644 --- a/public/language/fr/search.json +++ b/public/language/fr/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Réinitialiser les préférences", "search-preferences-saved": "Préférences de recherche enregistrées", "search-preferences-cleared": "Préférences de recherche réinitialisées", - "show-results-as": "Affichez les résultats comme" + "show-results-as": "Affichez les résultats comme", + "see-more-results": "Voir plus de résultats (%1)" } \ No newline at end of file diff --git a/public/language/gl/admin/advanced/database.json b/public/language/gl/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/gl/admin/advanced/database.json +++ b/public/language/gl/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/gl/admin/general/navigation.json b/public/language/gl/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/gl/admin/general/navigation.json +++ b/public/language/gl/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/gl/admin/manage/categories.json b/public/language/gl/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/gl/admin/manage/categories.json +++ b/public/language/gl/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/gl/admin/manage/privileges.json b/public/language/gl/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/gl/admin/manage/privileges.json +++ b/public/language/gl/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/gl/admin/settings/group.json b/public/language/gl/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/gl/admin/settings/group.json +++ b/public/language/gl/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/gl/admin/settings/tags.json b/public/language/gl/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/gl/admin/settings/tags.json +++ b/public/language/gl/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/gl/admin/settings/user.json b/public/language/gl/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/gl/admin/settings/user.json +++ b/public/language/gl/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/gl/email.json b/public/language/gl/email.json index 5eff709386..79bb0dd609 100644 --- a/public/language/gl/email.json +++ b/public/language/gl/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Últimos temas de %1", "digest.cta": "Pica aquí para ir %1", "digest.unsub.info": "Envióuseche o seguinte resumo polas túas opcións de subscrición.", - "digest.no_topics": "Non houbo temas activos no pasado %1", "digest.day": "día", "digest.week": "semana", "digest.month": "mes", "digest.subject": "Resumo de 1%", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Nova charla recibida de %1", "notif.chat.cta": "Pica aquí para continuar a conversación", "notif.chat.unsub.info": "Esta notificación de charla foiche enviada polas túas opcións de subscrición.", diff --git a/public/language/gl/error.json b/public/language/gl/error.json index 0792da9ad1..184c922c53 100644 --- a/public/language/gl/error.json +++ b/public/language/gl/error.json @@ -33,6 +33,7 @@ "username-too-short": "Nome de usuario demasiado curto", "username-too-long": "Nome de usuario demasiado longo.", "password-too-long": "Contrasinal moi longa", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Usuario expulsado", "user-banned-reason": "Desculpa, esta conta foi baneada (Razón: %1)", "user-banned-reason-until": "Sorry, this account has been banned until %1 (Reason: %2)", diff --git a/public/language/gl/flags.json b/public/language/gl/flags.json index 0fe7f027ea..ff4ef258cd 100644 --- a/public/language/gl/flags.json +++ b/public/language/gl/flags.json @@ -9,6 +9,7 @@ "updated": "Actualizado", "target-purged": "O contido marcado foi purgado e xa non está dispoñible", + "graph-label": "Daily Flags", "quick-filters": "Filtros rápidos", "filter-active": "Hai un ou máis filtros na lista de avisos", "filter-reset": "Eliminar filtros", diff --git a/public/language/gl/search.json b/public/language/gl/search.json index d6a63ebb1d..2b0b6f1a88 100644 --- a/public/language/gl/search.json +++ b/public/language/gl/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Desbotar preferencias", "search-preferences-saved": "Preferencias de búsqueda gardadas", "search-preferences-cleared": "Preferencias de búsqueda desbotadas", - "show-results-as": "Amosar resultados como" + "show-results-as": "Amosar resultados como", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/he/admin/admin.json b/public/language/he/admin/admin.json index d232fa076d..acd77058eb 100644 --- a/public/language/he/admin/admin.json +++ b/public/language/he/admin/admin.json @@ -2,6 +2,6 @@ "alert.confirm-rebuild-and-restart": "האם אתה בטוח שאתה רוצה לבנות מחדש ולאתחל את ה NodeBB?", "alert.confirm-restart": "האם אתה בטוח שאתה רוצה לאתחל מחדש את NodeBB?", - "acp-title": "%1 | לוח בקרה לאדמין NodeBB", + "acp-title": "%1 | לוח בקרה למנהל NodeBB", "settings-header-contents": "תוכן" } \ No newline at end of file diff --git a/public/language/he/admin/advanced/database.json b/public/language/he/admin/advanced/database.json index f3bbcb8d34..f0825dcb0f 100644 --- a/public/language/he/admin/advanced/database.json +++ b/public/language/he/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "מידע לא מעובד מMongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "גרסת Redis", diff --git a/public/language/he/admin/general/dashboard.json b/public/language/he/admin/general/dashboard.json index cd420c4ff4..4a8617e9e8 100644 --- a/public/language/he/admin/general/dashboard.json +++ b/public/language/he/admin/general/dashboard.json @@ -1,76 +1,76 @@ { - "forum-traffic": "Forum Traffic", - "page-views": "Page Views", - "unique-visitors": "Unique Visitors", + "forum-traffic": "תעבורת הפורום", + "page-views": "צפיות בדפים", + "unique-visitors": "מבקרים ייחודיים", "users": "משתמשים", "posts": "פוסטים", "topics": "נושאים", "page-views-seven": "7 ימים אחרונים", "page-views-thirty": "30 ימים אחרונים", "page-views-last-day": "24 שעות אחרונות", - "page-views-custom": "Custom Date Range", - "page-views-custom-start": "Range Start", - "page-views-custom-end": "Range End", - "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", - "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", + "page-views-custom": "טווח תאריך ידני", + "page-views-custom-start": "תחילת טווח", + "page-views-custom-end": "סוף טווח", + "page-views-custom-help": "הכנס טווח תאריך עבור התקופה שבה תרצה לצפות בצפיות העמודים. הפורמט הנדרש הוא YYYY-MM-DD", + "page-views-custom-error": "נא הזן טווח תאריכים תקין כלהלן YYYY-MM-DD", "stats.day": "יום", "stats.week": "שבוע", "stats.month": "חודש", - "stats.all": "All Time", + "stats.all": "כל הזמנים", - "updates": "Updates", - "running-version": "You are running NodeBB v%1.", - "keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.", - "up-to-date": "

You are up-to-date

", + "updates": "עדכונים", + "running-version": "אתה עובד עם NodeBB גרסה%1", + "keep-updated": "תמיד תוודא שמערכת NodeBB שלך עדכנית לטובת עדכוני אבטחה ותיקוני באגים", + "up-to-date": "

אתה עדכני

", "upgrade-available": "

A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-upgrade-available": "

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", "running-in-development": "Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.", - "latest-lookup-failed": "

Failed to look up latest available version of NodeBB

", + "latest-lookup-failed": "

נכשל בבדיקת גרסה חדשה זמינה עבור NodeBB

", - "notices": "Notices", - "restart-not-required": "Restart not required", - "restart-required": "Restart required", - "search-plugin-installed": "Search Plugin installed", - "search-plugin-not-installed": "Search Plugin not installed", - "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", + "notices": "הודעות", + "restart-not-required": "לא נדרש אתחול מחדש", + "restart-required": "נדרש אתחול מחדש", + "search-plugin-installed": "תוסף חיפוש הותקן", + "search-plugin-not-installed": "תוסף חיפוש לא הותקן", + "search-plugin-tooltip": "התקן את תוסף החיפוש מעמוד התוספים על מנת להפעיל את אפשרות החיפוש", - "control-panel": "System Control", - "rebuild-and-restart": "Rebuild & Restart", - "restart": "Restart", - "restart-warning": "Rebuilding or Restarting your NodeBB will drop all existing connections for a few seconds.", - "restart-disabled": "Rebuilding and Restarting your NodeBB has been disabled as you do not seem to be running it via the appropriate daemon.", - "maintenance-mode": "Maintenance Mode", - "maintenance-mode-title": "Click here to set up maintenance mode for NodeBB", - "realtime-chart-updates": "Realtime Chart Updates", + "control-panel": "שליטה מערכתית", + "rebuild-and-restart": "בנייה מחדש ואתחול", + "restart": "אתחול", + "restart-warning": "בנייה או אתחול מערכת NodeBB תנתק את כל המשתמשים הקיימים למספר שניות", + "restart-disabled": "בניית ואתחול מערכת NodeBB לא אפשרית, מאחר ואתה לא מריץ את המערכת בדרך הנדרשת", + "maintenance-mode": "מצב תחזוקה", + "maintenance-mode-title": "לחץ כאן על מנת להכניס את NodeBB למצב תחזוקה", + "realtime-chart-updates": "עדכון זמן אמת של הגרף", - "active-users": "Active Users", + "active-users": "משתמשים פעילים", "active-users.users": "משתמשים", "active-users.guests": "אורחים", - "active-users.total": "Total", - "active-users.connections": "Connections", + "active-users.total": "סך הכל", + "active-users.connections": "חיבורים", - "anonymous-registered-users": "Anonymous vs Registered Users", - "anonymous": "Anonymous", - "registered": "Registered", + "anonymous-registered-users": "משתמשים רשומים כנגד אורחים", + "anonymous": "אורחים", + "registered": "רשום", - "user-presence": "User Presence", - "on-categories": "On categories list", - "reading-posts": "Reading posts", - "browsing-topics": "Browsing topics", - "recent": "Recent", - "unread": "Unread", + "user-presence": "נוכחות משתמש", + "on-categories": "על רשימת הקטגוריות", + "reading-posts": "קריאת פוסטים", + "browsing-topics": "חיפוש נושאים", + "recent": "לאחרונה", + "unread": "לא נקראו", - "high-presence-topics": "High Presence Topics", + "high-presence-topics": "פוסטים עם נוכחות גבוהה", - "graphs.page-views": "Page Views", - "graphs.page-views-registered": "Page Views Registered", - "graphs.page-views-guest": "Page Views Guest", - "graphs.page-views-bot": "Page Views Bot", - "graphs.unique-visitors": "Unique Visitors", - "graphs.registered-users": "Registered Users", - "graphs.anonymous-users": "Anonymous Users", - "last-restarted-by": "Last restarted by", - "no-users-browsing": "No users browsing" + "graphs.page-views": "צפיות בדפים", + "graphs.page-views-registered": "צפיות בדפים של רשומים", + "graphs.page-views-guest": "צפיות בדפים של אורחים", + "graphs.page-views-bot": "צפיות של בוטים", + "graphs.unique-visitors": "מבקרים ייחודיים", + "graphs.registered-users": "משתמשים רשומים", + "graphs.anonymous-users": "משתמשים אנונימיים", + "last-restarted-by": "אותחל לארונה על ידי", + "no-users-browsing": "אין משתמשים גולשים" } diff --git a/public/language/he/admin/general/navigation.json b/public/language/he/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/he/admin/general/navigation.json +++ b/public/language/he/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/he/admin/manage/categories.json b/public/language/he/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/he/admin/manage/categories.json +++ b/public/language/he/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/he/admin/manage/privileges.json b/public/language/he/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/he/admin/manage/privileges.json +++ b/public/language/he/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/he/admin/menu.json b/public/language/he/admin/menu.json index 6033ed2cf0..9e64da2feb 100644 --- a/public/language/he/admin/menu.json +++ b/public/language/he/admin/menu.json @@ -1,41 +1,41 @@ { - "section-general": "General", - "general/dashboard": "Dashboard", + "section-general": "כללי", + "general/dashboard": "לוח מחוונים", "general/homepage": "דף הבית", "general/navigation": "ניווט", "general/languages": "שפות", - "general/sounds": "Sounds", + "general/sounds": "שמע", "general/social": "Social", - "section-manage": "Manage", + "section-manage": "ניהול", "manage/categories": "קטגוריות", - "manage/privileges": "Privileges", + "manage/privileges": "הרשאות", "manage/tags": "תגיות", "manage/users": "משתמשים", - "manage/admins-mods": "Admins & Mods", - "manage/registration": "Registration Queue", - "manage/post-queue": "Post Queue", - "manage/groups": "Groups", - "manage/ip-blacklist": "IP Blacklist", - "manage/uploads": "Uploads", + "manage/admins-mods": "מנהלים ומנהלים כלליים", + "manage/registration": "תור הרשמה", + "manage/post-queue": "תור פוסטים", + "manage/groups": "קבוצות", + "manage/ip-blacklist": "רשימה שחורה של כתובות IP", + "manage/uploads": "העלאות", - "section-settings": "Settings", - "settings/general": "General", - "settings/reputation": "Reputation", - "settings/email": "Email", - "settings/user": "User", - "settings/group": "Group", + "section-settings": "הגדרות", + "settings/general": "כללי", + "settings/reputation": "מוניטין", + "settings/email": "דוא\"ל", + "settings/user": "משתמש", + "settings/group": "קבוצה", "settings/guest": "אורח", - "settings/uploads": "Uploads", - "settings/post": "Post", + "settings/uploads": "העלאות", + "settings/post": "פוסט", "settings/chat": "צ'אט", "settings/pagination": "Pagination", - "settings/tags": "Tags", - "settings/notifications": "Notifications", - "settings/cookies": "Cookies", + "settings/tags": "תגיות", + "settings/notifications": "התראות", + "settings/cookies": "עוגיות", "settings/web-crawler": "Web Crawler", "settings/sockets": "Sockets", - "settings/advanced": "Advanced", + "settings/advanced": "מתקדם", "settings.page-title": "%1 Settings", diff --git a/public/language/he/admin/settings/group.json b/public/language/he/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/he/admin/settings/group.json +++ b/public/language/he/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/he/admin/settings/tags.json b/public/language/he/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/he/admin/settings/tags.json +++ b/public/language/he/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/he/admin/settings/user.json b/public/language/he/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/he/admin/settings/user.json +++ b/public/language/he/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/he/email.json b/public/language/he/email.json index 21845ed71d..941fc47b23 100644 --- a/public/language/he/email.json +++ b/public/language/he/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "נושאים אחרונים מ%1", "digest.cta": "לחץ כאן כדי לבקר ב %1", "digest.unsub.info": "תקציר זה נשלח אליך על-פי הגדרות החשבון שלך.", - "digest.no_topics": "אין נושאים פעילים ב%1 האחרון/ים", "digest.day": "יום", "digest.week": "שבוע", "digest.month": "חודש", "digest.subject": "מקבץ עבור %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "הודעת צ'אט חדשה התקבלה מ%1", "notif.chat.cta": "לחץ כאן כדי להמשיך את השיחה", "notif.chat.unsub.info": "התראה הצ'אט הזו נשלחה אליך על-פי הגדרות החשבון שלך.", diff --git a/public/language/he/error.json b/public/language/he/error.json index 31dade5372..fc59abc16d 100644 --- a/public/language/he/error.json +++ b/public/language/he/error.json @@ -33,6 +33,7 @@ "username-too-short": "שם משתמש קצר מדי", "username-too-long": "שם משתמש ארוך מדי", "password-too-long": "הסיסמה ארוכה מדי", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "המשתמש מושעה", "user-banned-reason": "מצטערים, חשבון זה הורחק (סיבה: %1)", "user-banned-reason-until": "מצטערים, חשבון זה הורחק עד %1 (סיבה: %2)", diff --git a/public/language/he/flags.json b/public/language/he/flags.json index 141dd1607e..6ac395a759 100644 --- a/public/language/he/flags.json +++ b/public/language/he/flags.json @@ -9,6 +9,7 @@ "updated": "עודכן", "target-purged": "התוכן שסומן נוקה ולא קיים יותר.", + "graph-label": "Daily Flags", "quick-filters": "סינון מהיר", "filter-active": "קיים סנן אחד או יותר ברשימת הסימונים הזו", "filter-reset": "הסר סינון", diff --git a/public/language/he/search.json b/public/language/he/search.json index 4501b556c9..bc98b7a84c 100644 --- a/public/language/he/search.json +++ b/public/language/he/search.json @@ -43,5 +43,6 @@ "clear-preferences": "נקה העדפות", "search-preferences-saved": "חפש העדפות שנשמרו", "search-preferences-cleared": "חפש העדפות שנוקו", - "show-results-as": "צפה בתוצאות בתור" + "show-results-as": "צפה בתוצאות בתור", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/hr/admin/advanced/database.json b/public/language/hr/admin/advanced/database.json index eb28162b48..e146eba570 100644 --- a/public/language/hr/admin/advanced/database.json +++ b/public/language/hr/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB sirove informacije", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis verzija", diff --git a/public/language/hr/admin/general/navigation.json b/public/language/hr/admin/general/navigation.json index 58534df8f2..4921e75e6c 100644 --- a/public/language/hr/admin/general/navigation.json +++ b/public/language/hr/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Napomena:", "text": "Tekst:", "text-class": "Text Class: opcija", + "class": "Class: optional", "id": "ID: opcionalno", "properties": "Postavke", diff --git a/public/language/hr/admin/manage/categories.json b/public/language/hr/admin/manage/categories.json index c361f67a67..10654e6f3b 100644 --- a/public/language/hr/admin/manage/categories.json +++ b/public/language/hr/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Odabri kategoriju", "set-parent-category": "Postavi roditeljsku kategoriju ", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Privilegije pogleda", "privileges.section-posting": "Privilegije objave", "privileges.section-moderation": "Dozvole moderiranja", + "privileges.section-other": "Other", "privileges.section-user": "Korisnik", "privileges.search-user": "Dodaj korisnika", "privileges.no-users": "U ovoj kategoriji nema privilegije za korisnika.", diff --git a/public/language/hr/admin/manage/privileges.json b/public/language/hr/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/hr/admin/manage/privileges.json +++ b/public/language/hr/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/hr/admin/settings/group.json b/public/language/hr/admin/settings/group.json index de93d66227..38d9c7b362 100644 --- a/public/language/hr/admin/settings/group.json +++ b/public/language/hr/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Privatne grupe", "private-groups.help": "Ako je uključeno,ulazak u grupe zahtjevati će odobrenje vlasnika grupe (Default: enabled)", "private-groups.warning": "Pazi! Ako je ova opcija isključena,a imate privatne grupe,automatski će postati javne.", - "allow-creation": "Dozvoli kreiranje grupe", - "allow-creation-help": "Ako je uključeno,korisnicima će biti omogućeno stvaranje grupa (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maksimalna dužina imena grupe", + "max-title-length": "Maximum Group Title Length", "cover-image": "Slika grupe", "default-cover": " ", "default-cover-help": "Dodaj slike sa zarezima između za grupe koje nemaju učitanu naslovnu sliku" diff --git a/public/language/hr/admin/settings/tags.json b/public/language/hr/admin/settings/tags.json index ea7284a928..a2f0fa40f7 100644 --- a/public/language/hr/admin/settings/tags.json +++ b/public/language/hr/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimalna dužina oznake", "max-length": "Maksimalna dužina oznaka", "goto-manage": "Klikni ovdje za upravljanje oznakama.", - "privacy": "Privatnost", - "list-private": "Postavi listu oznaka privatno", "related-topics": "Slične teme", "max-related-topics": "Maksimalni broj povezanih tema za prikaz(ako je podržano unutar predloška)" } \ No newline at end of file diff --git a/public/language/hr/admin/settings/user.json b/public/language/hr/admin/settings/user.json index 650d4bfbcb..7e6ca73169 100644 --- a/public/language/hr/admin/settings/user.json +++ b/public/language/hr/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Onemogući promjenu emaila", "disable-password-changes": "Onemogući promjenu lozinke", "allow-account-deletion": "Dozvoli brisanje računa korisnicima", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Predlošci", diff --git a/public/language/hr/email.json b/public/language/hr/email.json index 7dad832731..26dfbf241b 100644 --- a/public/language/hr/email.json +++ b/public/language/hr/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Posljednje teme s %1", "digest.cta": "Kliknite ovdje kako biste posjetili %1", "digest.unsub.info": "Ovaj pregled je poslan zbog Vaših postavki pretplata.", - "digest.no_topics": "Nije bilo aktivnih tema u posljednjih %1", "digest.day": "Dan", "digest.week": "Tjedan", "digest.month": "Mjesec", "digest.subject": "Pregled za %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Nova poruka od %1", "notif.chat.cta": "Klikni ovdje za nastavak razgovora ", "notif.chat.unsub.info": "Ova obavijest razgovora Vam je poslana na temelju vaših postavki pretplate.", diff --git a/public/language/hr/error.json b/public/language/hr/error.json index 0ee4aacbf0..c3356aa926 100644 --- a/public/language/hr/error.json +++ b/public/language/hr/error.json @@ -33,6 +33,7 @@ "username-too-short": "Korisničko ime prekratko", "username-too-long": "Korisničko ime predugo", "password-too-long": "Lozinka je preduga", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Korisnik blokiran", "user-banned-reason": "Ovaj račun je blokiran (Razlog: %1)", "user-banned-reason-until": "Ovaj račun je blokiran do %1 (Razlog: %2)", diff --git a/public/language/hr/flags.json b/public/language/hr/flags.json index 34f0ef61c9..cbdad71322 100644 --- a/public/language/hr/flags.json +++ b/public/language/hr/flags.json @@ -9,6 +9,7 @@ "updated": "Nadograđeno", "target-purged": "Sadržaj koji je označen zastavom je odbačen i više nije dostupan.", + "graph-label": "Daily Flags", "quick-filters": "Brzi filteri", "filter-active": "Postoje jedan ili više filtera aktivnih u popisu zastava", "filter-reset": "Ukloni filtere", diff --git a/public/language/hr/search.json b/public/language/hr/search.json index c3013c7db2..cf7b83e0b6 100644 --- a/public/language/hr/search.json +++ b/public/language/hr/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Očisti postavke", "search-preferences-saved": "Postavke pretraživanja spremljene", "search-preferences-cleared": "Postavke pretraživanja očišćene ", - "show-results-as": "Prikaži rezultate kao" + "show-results-as": "Prikaži rezultate kao", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/hu/admin/advanced/database.json b/public/language/hu/admin/advanced/database.json index 5d805a2fac..dffbddae05 100644 --- a/public/language/hu/admin/advanced/database.json +++ b/public/language/hu/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB nyers információ", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis verzió", diff --git a/public/language/hu/admin/general/navigation.json b/public/language/hu/admin/general/navigation.json index 7ca723d0ce..0d96c33984 100644 --- a/public/language/hu/admin/general/navigation.json +++ b/public/language/hu/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Elemleírás:", "text": "Szöveg:", "text-class": "Szövegosztály: nem kötelező", + "class": "Class: optional", "id": "ID: nem kötelező", "properties": "Tulajdonságok:", diff --git a/public/language/hu/admin/manage/categories.json b/public/language/hu/admin/manage/categories.json index be77290f91..7ef5905aff 100644 --- a/public/language/hu/admin/manage/categories.json +++ b/public/language/hu/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Kategória kiválasztása", "set-parent-category": "Szülő kategória beállítása", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Megtekintési előjogok", "privileges.section-posting": "Hozzászólási előjogok", "privileges.section-moderation": "Moderációs előjogok", + "privileges.section-other": "Other", "privileges.section-user": "Felhasználó", "privileges.search-user": "Felhasználó hozzáadása", "privileges.no-users": "Nincsenek felhasználó-specifikus előjogok ebbe na kategóriában.", diff --git a/public/language/hu/admin/manage/privileges.json b/public/language/hu/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/hu/admin/manage/privileges.json +++ b/public/language/hu/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/hu/admin/settings/group.json b/public/language/hu/admin/settings/group.json index e68d64c3b3..69aa385ba0 100644 --- a/public/language/hu/admin/settings/group.json +++ b/public/language/hu/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Privát csoportok", "private-groups.help": "Ha engedélyezve van, a csoporthoz való csatlakozáshoz szükség van a csoport tulajdonosának jóváhagyására (Alapértelmezett: engedélyezve)", "private-groups.warning": "Vigyázat! Ha ez a lehetőség le van tiltva, és vannak privát csoportjaid, azok automatikusan nyilvánosak lesznek.", - "allow-creation": "Csoport Létrehozás Engedélyezése", - "allow-creation-help": "Ha engedélyezve van, a felhasználók létrehozhatnak csoportokat (Alapértelmezett: letiltva)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximális Csoportnév Hossz", + "max-title-length": "Maximum Group Title Length", "cover-image": "Csoport borítókép", "default-cover": "Alapértelmezett borítóképek", "default-cover-help": "Alapértelmezett borítóképek hozzáadása vesszővel elválasztva olyan csoportokhoz, amelyeknek nincs feltöltött borítóképük." diff --git a/public/language/hu/admin/settings/tags.json b/public/language/hu/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/hu/admin/settings/tags.json +++ b/public/language/hu/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/hu/admin/settings/user.json b/public/language/hu/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/hu/admin/settings/user.json +++ b/public/language/hu/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/hu/email.json b/public/language/hu/email.json index 9fc6787020..12f4a93ae5 100644 --- a/public/language/hu/email.json +++ b/public/language/hu/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Legutóbbi témakörök a következőből: %1", "digest.cta": "Kattints ide a(z) %1 meglátogatásához", "digest.unsub.info": "Ez a hírlevél a feliratkozási beállításaid miatt lett kiküldve.", - "digest.no_topics": "Nem volt aktív témakör az elmúlt %1", "digest.day": "napban", "digest.week": "héten", "digest.month": "hónapban", "digest.subject": "%1 hírlevél", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Új chat üzenet érkezett a következőtől: %1", "notif.chat.cta": "Kattints ide a beszélgetés folytatásához", "notif.chat.unsub.info": "Ez a chat-értesítés a feliratkozási beállításaid miatt lett kiküldve.", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index 074c3c2efb..6ef85f773c 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -33,6 +33,7 @@ "username-too-short": "Túl rövid felhasználónév", "username-too-long": "Túl hosszú felhasználónév", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Kitiltott felhasználó", "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)", diff --git a/public/language/hu/flags.json b/public/language/hu/flags.json index c662f608bc..8121cb5b3a 100644 --- a/public/language/hu/flags.json +++ b/public/language/hu/flags.json @@ -9,6 +9,7 @@ "updated": "Frissítve", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/hu/search.json b/public/language/hu/search.json index a3fa87b4a7..c47594b388 100644 --- a/public/language/hu/search.json +++ b/public/language/hu/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Beállítások törlése", "search-preferences-saved": "Keresési beállítások mentve", "search-preferences-cleared": "Keresési beállítások törölve", - "show-results-as": "Megjelenő találatok" + "show-results-as": "Megjelenő találatok", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/id/admin/admin.json b/public/language/id/admin/admin.json index 099ca5144c..5e2a478c24 100644 --- a/public/language/id/admin/admin.json +++ b/public/language/id/admin/admin.json @@ -1,5 +1,5 @@ { - "alert.confirm-rebuild-and-restart": "Are you sure you wish to rebuild and restart NodeBB?", + "alert.confirm-rebuild-and-restart": "Anda yakin ingin membangun ulang asset dan mulai ulang NodeBB?", "alert.confirm-restart": "Anda yakin ingin mulai ulang NodeBB?", "acp-title": "%1 | Kontrol Panel Admin NodeBB", diff --git a/public/language/id/admin/advanced/database.json b/public/language/id/admin/advanced/database.json index 5daf6500a6..2842cd7d35 100644 --- a/public/language/id/admin/advanced/database.json +++ b/public/language/id/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Versi Redis", diff --git a/public/language/id/admin/general/navigation.json b/public/language/id/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/id/admin/general/navigation.json +++ b/public/language/id/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/id/admin/manage/categories.json b/public/language/id/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/id/admin/manage/categories.json +++ b/public/language/id/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/id/admin/manage/privileges.json b/public/language/id/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/id/admin/manage/privileges.json +++ b/public/language/id/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/id/admin/settings/group.json b/public/language/id/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/id/admin/settings/group.json +++ b/public/language/id/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/id/admin/settings/tags.json b/public/language/id/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/id/admin/settings/tags.json +++ b/public/language/id/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/id/admin/settings/user.json b/public/language/id/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/id/admin/settings/user.json +++ b/public/language/id/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/id/email.json b/public/language/id/email.json index 1e2c3edaba..0172afcbeb 100644 --- a/public/language/id/email.json +++ b/public/language/id/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Topik-topik terbaru dari %1", "digest.cta": "Klik di sini untuk mengunjungi %1", "digest.unsub.info": "Sesuai pengaturan langganan anda, maka ringkasan ini di kirimkan untuk anda ", - "digest.no_topics": "Tidak ada topik yang aktif selama %1", "digest.day": "day", "digest.week": "week", "digest.month": "month", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Pesan yang baru diterima dari %1", "notif.chat.cta": "Klik di sini untuk melanjutkan percakapan", "notif.chat.unsub.info": "Sesuai pengaturan langganan anda, notifikasi obrolan ini dikirmkan kepada anda", diff --git a/public/language/id/error.json b/public/language/id/error.json index 4cf65a0436..e9257732d3 100644 --- a/public/language/id/error.json +++ b/public/language/id/error.json @@ -33,6 +33,7 @@ "username-too-short": "Username terlalu pendek", "username-too-long": "Username terlalu panjang", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Pengguna dibanned", "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)", diff --git a/public/language/id/flags.json b/public/language/id/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/id/flags.json +++ b/public/language/id/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/id/search.json b/public/language/id/search.json index c744841912..3763b6fb14 100644 --- a/public/language/id/search.json +++ b/public/language/id/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/it/admin/admin.json b/public/language/it/admin/admin.json index e72790cff5..7bf6227d81 100644 --- a/public/language/it/admin/admin.json +++ b/public/language/it/admin/admin.json @@ -1,5 +1,5 @@ { - "alert.confirm-rebuild-and-restart": "Sei sicuro di voler ricompilare gli assets e riavviare NodeBB?", + "alert.confirm-rebuild-and-restart": "Sei sicuro di voler riorganizza e riavviare NodeBB?", "alert.confirm-restart": "Sei sicuro di voler riavviare NodeBB?", "acp-title": "%1 | Pannello di controllo amministratore NodeBB", diff --git a/public/language/it/admin/advanced/cache.json b/public/language/it/admin/advanced/cache.json index 281f02b258..b89fc01fc2 100644 --- a/public/language/it/admin/advanced/cache.json +++ b/public/language/it/admin/advanced/cache.json @@ -1,11 +1,11 @@ { - "post-cache": "Post nella Cache", + "post-cache": "Cache Post", "posts-in-cache": "Post nella Cache", - "average-post-size": "Grandezza media Post", + "average-post-size": "Dimensione media Post", "length-to-max": "Lunghezza / Max", "percent-full": "%1% Pieno", - "post-cache-size": "Grandezza Cache dei Post", + "post-cache-size": "Dimensione Cache dei Post", "items-in-cache": "Elementi nella Cache", "control-panel": "Pannello di controllo", - "update-settings": "Aggiorna le impostazioni della Cache" + "update-settings": "Aggiorna impostazioni Cache" } \ No newline at end of file diff --git a/public/language/it/admin/advanced/database.json b/public/language/it/admin/advanced/database.json index 49716dfaf1..ca0a1cb8aa 100644 --- a/public/language/it/admin/advanced/database.json +++ b/public/language/it/admin/advanced/database.json @@ -2,50 +2,51 @@ "x-b": "%1 b", "x-mb": "%1 mb", "x-gb": "%1 gb", - "uptime-seconds": "Uptime in secondi", - "uptime-days": "Uptime in giorni", + "uptime-seconds": "Tempo di caricamento in secondi", + "uptime-days": "Tempo di caricamento in giorni", "mongo": "Mongo", "mongo.version": "Versione MongoDB", - "mongo.storage-engine": "Storage Engine", - "mongo.collections": "Collections", + "mongo.storage-engine": "Motore di archiviazione", + "mongo.collections": "Collezioni", "mongo.objects": "Oggetti", - "mongo.avg-object-size": "Dimensione Media dell'Oggetto", - "mongo.data-size": "Dimensione del Data", - "mongo.storage-size": "Dimensione dello Spazio di Archiviazione", - "mongo.index-size": "Dimensione dell'Indice", + "mongo.avg-object-size": "Dimensione media dell'oggetto", + "mongo.data-size": "Dimensione dei dati", + "mongo.storage-size": "Dimensione di archiviazione", + "mongo.index-size": "Dimensione dell'indice", "mongo.file-size": "Dimensione del file", - "mongo.resident-memory": "Memoria Allocata", - "mongo.virtual-memory": "Memoria Virtuale", - "mongo.mapped-memory": "Memoria Mappata", - "mongo.bytes-in": "Bytes In", - "mongo.bytes-out": "Bytes Out", - "mongo.num-requests": "Number of Requests", - "mongo.raw-info": "MongoDB Raw Info", + "mongo.resident-memory": "Memoria allocata", + "mongo.virtual-memory": "Memoria virtuale", + "mongo.mapped-memory": "Memoria mappata", + "mongo.bytes-in": "Byte in ingresso", + "mongo.bytes-out": "Byte in uscita", + "mongo.num-requests": "Numero di richieste", + "mongo.raw-info": "Info MongoDB Raw", + "mongo.unauthorized": "NodeBBB non è stato in grado di interrogare il database MongoDB per le statistiche pertinenti. Assicurati che l'utente in uso da NodeBBB contenga il "clusterMonitor" ruolo per l' "admin" database.", "redis": "Redis", "redis.version": "Versione Redis", - "redis.keys": "Keys", - "redis.expires": "Expires", - "redis.avg-ttl": "Average TTL", - "redis.connected-clients": "Clients Connessi", - "redis.connected-slaves": "Slaves connessi", - "redis.blocked-clients": "Clients Bloccati", - "redis.used-memory": "Memoria Usata", - "redis.memory-frag-ratio": "Rateo della Frammentazione della Memoria", - "redis.total-connections-recieved": "Totale Connessioni Ricevute", - "redis.total-commands-processed": "Totale Comandi Processati", - "redis.iops": "Operazioni Instantanee al Secondo", - "redis.iinput": "Instantaneous Input Per Second", - "redis.ioutput": "Instantaneous Output Per Second", - "redis.total-input": "Total Input", - "redis.total-output": "Total Ouput", + "redis.keys": "Chiavi", + "redis.expires": "Scaduti", + "redis.avg-ttl": "TTL media", + "redis.connected-clients": "Client connessi", + "redis.connected-slaves": "Slave connessi", + "redis.blocked-clients": "Client bloccati", + "redis.used-memory": "Memoria usata", + "redis.memory-frag-ratio": "Rapporto di frammentazione della memoria", + "redis.total-connections-recieved": "Totale connessioni ricevute", + "redis.total-commands-processed": "Totale comandi processati", + "redis.iops": "Operazioni istantanee al secondo", + "redis.iinput": "Ingressi istantanei al secondo", + "redis.ioutput": "Uscite istantanee al secondo", + "redis.total-input": "Totale ingressi", + "redis.total-output": "Totale uscite", - "redis.keyspace-hits": "Keyspace Hits", - "redis.keyspace-misses": "Keyspace Misses", - "redis.raw-info": "Redis Raw Info", + "redis.keyspace-hits": "Keyspace riuscite", + "redis.keyspace-misses": "Keyspace perse", + "redis.raw-info": "Info Redis Raw", - "postgres": "Postgress", + "postgres": "Postgres", "postgres.version": "Versione di PostgreSQL", - "postgres.raw-info": "Postgres Raw Info" + "postgres.raw-info": "Info Postgres Raw" } diff --git a/public/language/it/admin/advanced/errors.json b/public/language/it/admin/advanced/errors.json index ca148b1236..aff94ff327 100644 --- a/public/language/it/admin/advanced/errors.json +++ b/public/language/it/admin/advanced/errors.json @@ -1,14 +1,14 @@ { "figure-x": "Figura %1", "error-events-per-day": "%1 eventi per giorno", - "error.404": "404 Non Trovato", - "error.503": "503 Servizio Non Disponibile", - "manage-error-log": "Gestisci il Registro degli Errori", - "export-error-log": "Esporta il Registro degli Errori (CSV)", - "clear-error-log": "Cancella il Registro degli Errori", + "error.404": "404 Non trovato", + "error.503": "503 Servizio non disponibile", + "manage-error-log": "Gestisci il registro degli errori", + "export-error-log": "Esporta il registro degli errori (CSV)", + "clear-error-log": "Cancella il registro degli errori", "route": "Strada", - "count": "Numero", - "no-routes-not-found": "Hooray! Nessun Errore 404!", - "clear404-confirm": "Sei sicuro di voler cancellare il Registro degli Errori 404?", - "clear404-success": "Error \"404 Non Trovato\" Cancellati" + "count": "Conteggio", + "no-routes-not-found": "Evviva! Nessun errore 404!", + "clear404-confirm": "Sei sicuro di voler cancellare il registro degli errori 404?", + "clear404-success": "Errori \"404 Non trovato\" cancellati" } \ No newline at end of file diff --git a/public/language/it/admin/advanced/events.json b/public/language/it/admin/advanced/events.json index ca64e626db..cc332cb217 100644 --- a/public/language/it/admin/advanced/events.json +++ b/public/language/it/admin/advanced/events.json @@ -1,6 +1,6 @@ { "events": "Eventi", - "no-events": "Non ci sono Eventi", - "control-panel": "Pannello di controllo degli Eventi", - "delete-events": "Cancella gli Eventi" + "no-events": "Non ci sono eventi", + "control-panel": "Pannello di controllo dei registri", + "delete-events": "Cancella eventi" } \ No newline at end of file diff --git a/public/language/it/admin/advanced/logs.json b/public/language/it/admin/advanced/logs.json index 72b330fb5c..4347994ef0 100644 --- a/public/language/it/admin/advanced/logs.json +++ b/public/language/it/admin/advanced/logs.json @@ -1,7 +1,7 @@ { "logs": "Registri", - "control-panel": "Pannello di Controllo dei Registri", - "reload": "Ricarica i Registri", - "clear": "Cancella i Registri", - "clear-success": "Registri Cancellati!" + "control-panel": "Pannello di controllo dei registri", + "reload": "Ricarica i registri", + "clear": "Cancella i registri", + "clear-success": "Registri cancellati!" } \ No newline at end of file diff --git a/public/language/it/admin/appearance/customise.json b/public/language/it/admin/appearance/customise.json index 240f28599e..a3e0457a00 100644 --- a/public/language/it/admin/appearance/customise.json +++ b/public/language/it/admin/appearance/customise.json @@ -1,16 +1,16 @@ { - "custom-css": "Codice CSS o LESS personalizzato", - "custom-css.description": "Inserisci il tuo codice CSS o LESS di seguito, verrà applicato dopo tutti gli altri stili.", - "custom-css.enable": "Abilita personalizzazione di CSS o LESS ", + "custom-css": "CSS/LESS personalizzato", + "custom-css.description": "Inserisci qui le tue dichiarazioni CSS /LESS, che saranno applicate dopo tutti gli altri stili.", + "custom-css.enable": "Abilita CSS/LESS personalizzati", - "custom-js": "Codice Javascript personalizzato", - "custom-js.description": "Inserisci di seguito il tuo codice Javascript che verrà eseguito dopo l'intero caricamento della pagina.", - "custom-js.enable": "Abilita personalizzazione codice Javascript ", + "custom-js": "Javascript personalizzato", + "custom-js.description": "Inserisci qui il tuo javascript. Sarà eseguito dopo che la pagina è stata caricata completamente.", + "custom-js.enable": "Abilita Javascript personalizzato", - "custom-header": "Intestazione Personalizzata", - "custom-header.description": "Inserisci di seguito il tuo codice HTML (come Meta Tags, ecc), che verrà inserito in coda nella sezione <head>del markup del tuo forum. Sono permessi i tags Script, sebbene si preferisca l'utilizzo del codice Javascript personalizzato.", - "custom-header.enable": "Abilita l'Intestazione Personalizzata", + "custom-header": "Intestazione personalizzata", + "custom-header.description": "Inserire l'HTML personalizzato qui (es. Meta Tags, ecc), che sarà aggiunto alla sezione <head>del markup del tuo forum. I tag degli script sono permessi, ma sono sconsigliati, in quanto è disponibile la scheda Javascript personalizzato.", + "custom-header.enable": "Abilita Intestazione personalizzata", "custom-css.livereload": "Abilita riavvio a caldo (Live Reolad)", - "custom-css.livereload.description": "Abilita questa opzione per forzare il refresh di tutte le sessioni dei tuoi account una volta salvate le modifiche." + "custom-css.livereload.description": "Abilitala per forzare tutte le sessioni su ogni dispositivo sotto il tuo account ad aggiornarsi ogni volta che si fa clic su Salva" } \ No newline at end of file diff --git a/public/language/it/admin/appearance/skins.json b/public/language/it/admin/appearance/skins.json index e7c26359b5..fee91909b9 100644 --- a/public/language/it/admin/appearance/skins.json +++ b/public/language/it/admin/appearance/skins.json @@ -1,9 +1,9 @@ { - "loading": "Caricamento Skins", - "homepage": "Pagina Home", + "loading": "Caricamento Skin...", + "homepage": "Pagina Iniziale", "select-skin": "Seleziona la Skin", - "current-skin": "Skin Corrente", - "skin-updated": "Skin Aggiornata", + "current-skin": "Skin corrente", + "skin-updated": "Skin aggiornata", "applied-success": "%1 skin è stata applicata con successo", "revert-success": "Skin riportata ai colori base" } \ No newline at end of file diff --git a/public/language/it/admin/appearance/themes.json b/public/language/it/admin/appearance/themes.json index 14ed4639e9..27ab006674 100644 --- a/public/language/it/admin/appearance/themes.json +++ b/public/language/it/admin/appearance/themes.json @@ -1,11 +1,11 @@ { - "checking-for-installed": "Controllando se ci sono temi installati...", - "homepage": "Pagina Home", - "select-theme": "Seleziona il Tema", - "current-theme": "Tema Corrente", + "checking-for-installed": "Verifica dei temi installati.....", + "homepage": "Pagina Iniziale", + "select-theme": "Seleziona Tema", + "current-theme": "Tema corrente", "no-themes": "Nessun tema installato trovato", - "revert-confirm": "Sei sicuro di voler ripristinare al tema originale di NodeBB?", - "theme-changed": "Tema Cambiato", - "revert-success": "Hai correttamente ripristinato il tuo NodeBB al tema originale.", - "restart-to-activate": "Please rebuild and restart your NodeBB to fully activate this theme." + "revert-confirm": "Sei sicuro di voler ripristinare al tema predefinito di NodeBB?", + "theme-changed": "Tema cambiato", + "revert-success": "Hai correttamente ripristinato il tuo NodeBB al tema predefinito.", + "restart-to-activate": "Per favore, riorganizza e riavvia il tuo NodeBB per attivare completamente questo tema." } \ No newline at end of file diff --git a/public/language/it/admin/development/info.json b/public/language/it/admin/development/info.json index 0b3f1c8d37..5370a3c256 100644 --- a/public/language/it/admin/development/info.json +++ b/public/language/it/admin/development/info.json @@ -1,17 +1,17 @@ { "you-are-on": "Informazione - Tu sei su %1:%2", - "nodes-responded": "%1 nodes responded within %2ms!", + "nodes-responded": "%1 nodi hanno risposto entro %2ms!", "host": "host", "pid": "pid", "nodejs": "nodejs", "online": "online", "git": "git", - "memory": "memory", + "memory": "memoria", "load": "carica", "uptime": "tempo di caricamento", "registered": "Registrato", - "sockets": "Sockets", + "sockets": "Socket", "guests": "Ospiti", "info": "Informazioni" diff --git a/public/language/it/admin/development/logger.json b/public/language/it/admin/development/logger.json index d8d6dc3608..2e3d19ccd7 100644 --- a/public/language/it/admin/development/logger.json +++ b/public/language/it/admin/development/logger.json @@ -1,12 +1,12 @@ { "logger-settings": "Impostazioni del Registratore", - "description": "Abilitando le \"check boxes\", riceverai i registri sul tuo terminale. Se vuoi specificare un percorso, i registri verranno invece salvati in un file. Registrare l' HTTP è utile per collezionare statistiche su chi, quando, e a cosa le persone hanno accesso sul tuo forum. In più sul registrare le richieste HTTP, in combinazione con il monitoraggio redis-cli, può essere veramente utile per imparare l'interno di NodeBB", - "explanation": "Simply check/uncheck the logging settings to enable or disable logging on the fly. No restart needed.", - "enable-http": "Enable HTTP logging", - "enable-socket": "Enable socket.io event logging", - "file-path": "Percorso per i file di log", - "file-path-placeholder": "/path/to/log/file.log ::: lascia in bianco per loggare sul tuo terminale", + "description": "Abilitando le caselle di controllo, riceverai i registri sul tuo terminale. Se specifichi un percorso, i registri saranno invece salvati in un file. La registrazione HTTP è utile per raccogliere statistiche su chi, quando e quali persone accedono al tuo forum. Oltre a registrare le richieste HTTP, possiamo anche registrare gli eventi socket.io. La registrazione Socket.io, in combinazione con il monitoraggio redis-cli, può essere molto utile per l'apprendimento dell'interno di NodeBBB.", + "explanation": "È sufficiente selezionare/deselezionare le impostazioni di registrazione per abilitare o disabilitare la registrazione al volo. Non è necessario riavviare.", + "enable-http": "Abilita la registrazione HTTP", + "enable-socket": "Abilita la registrazione degli eventi socket.io", + "file-path": "Percorso del file di registro", + "file-path-placeholder": "/path/to/log/file.log ::: lascia vuoto per accedere al tuo terminale", - "control-panel": "Logger Control Panel", - "update-settings": "Update Logger Settings" + "control-panel": "Pannello di controllo registratore", + "update-settings": "Aggiornare impostazioni registratore" } \ No newline at end of file diff --git a/public/language/it/admin/extend/plugins.json b/public/language/it/admin/extend/plugins.json index 005d9044ae..906e80dee1 100644 --- a/public/language/it/admin/extend/plugins.json +++ b/public/language/it/admin/extend/plugins.json @@ -1,53 +1,53 @@ { - "installed": "Installed", - "active": "Active", - "inactive": "Inactive", - "out-of-date": "Out of Date", - "none-found": "No plugins found.", - "none-active": "No Active Plugins", - "find-plugins": "Find Plugins", + "installed": "Installato", + "active": "Attivo", + "inactive": "Inattivo", + "out-of-date": "Obsoleto", + "none-found": "Nessun plugin trovato.", + "none-active": "Nessun plugin attivo", + "find-plugins": "Trova Plugin", - "plugin-search": "Plugin Search", - "plugin-search-placeholder": "Search for plugin...", - "reorder-plugins": "Re-order Plugins", - "order-active": "Order Active Plugins", - "dev-interested": "Interested in writing plugins for NodeBB?", - "docs-info": "Full documentation regarding plugin authoring can be found in the NodeBB Docs Portal.", + "plugin-search": "Ricerca Plugin", + "plugin-search-placeholder": "Ricerca per plugin...", + "reorder-plugins": "Riordina Plugin", + "order-active": "Ordina Plugin attivi", + "dev-interested": "Sei interessato a scrivere plugin per NodeBB?", + "docs-info": "La documentazione completa riguardante la creazione di plugin può essere trovata nel portale NodeBBB Docs Portal.", - "order.description": "Certain plugins work ideally when they are initialised before/after other plugins.", - "order.explanation": "Plugins load in the order specified here, from top to bottom", + "order.description": "Alcuni plugin funzionano perfettamente quando sono inizializzati prima/dopo altri plugin.", + "order.explanation": "Caricamento dei Plugin nell'ordine qui specificato, dall'alto verso il basso", - "plugin-item.themes": "Themes", - "plugin-item.deactivate": "Deactivate", - "plugin-item.activate": "Activate", - "plugin-item.install": "Install", - "plugin-item.uninstall": "Uninstall", - "plugin-item.settings": "Settings", - "plugin-item.installed": "Installed", - "plugin-item.latest": "Latest", - "plugin-item.upgrade": "Upgrade", - "plugin-item.more-info": "For more information:", - "plugin-item.unknown": "Unknown", - "plugin-item.unknown-explanation": "The state of this plugin could not be determined, possibly due to a misconfiguration error.", + "plugin-item.themes": "Temi", + "plugin-item.deactivate": "Disattivare", + "plugin-item.activate": "Attivare", + "plugin-item.install": "Installa", + "plugin-item.uninstall": "Disinstallare", + "plugin-item.settings": "Impostazioni", + "plugin-item.installed": "Installato", + "plugin-item.latest": "Ultimo", + "plugin-item.upgrade": "Aggiornamento", + "plugin-item.more-info": "Per ulteriori informazioni:", + "plugin-item.unknown": "Sconosciuto", + "plugin-item.unknown-explanation": "Lo stato di questo plugin non può essere determinato, forse a causa di un errore di configurazione.", - "alert.enabled": "Plugin Enabled", - "alert.disabled": "Plugin Disabled", - "alert.upgraded": "Plugin Upgraded", - "alert.installed": "Plugin Installed", - "alert.uninstalled": "Plugin Uninstalled", - "alert.activate-success": "Please restart your NodeBB to fully activate this plugin", - "alert.deactivate-success": "Plugin successfully deactivated", - "alert.upgrade-success": "Please rebuild and restart your NodeBB to fully upgrade this plugin.", - "alert.install-success": "Plugin successfully installed, please activate the plugin.", - "alert.uninstall-success": "The plugin has been successfully deactivated and uninstalled.", - "alert.suggest-error": "

NodeBB could not reach the package manager, proceed with installation of latest version?

Server returned (%1): %2
", - "alert.package-manager-unreachable": "

NodeBB could not reach the package manager, an upgrade is not suggested at this time.

", - "alert.incompatible": "

Your version of NodeBB (v%1) is only cleared to upgrade to v%2 of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.

", - "alert.possibly-incompatible": "

No Compatibility Information Found

This plugin did not specify a specific version for installation given your NodeBB version. Full compatibility cannot be guaranteed, and may cause your NodeBB to no longer start properly.

In the event that NodeBB cannot boot properly:

$ ./nodebb reset plugin=\"%1\"

Continue installation of latest version of this plugin?

", - "alert.reorder": "Plugins Re-ordered", - "alert.reorder-success": "Please rebuild and restart your NodeBB to fully complete the process.", + "alert.enabled": "Plugin abilitato", + "alert.disabled": "Plugin disabilitato", + "alert.upgraded": "Plugin aggiornato", + "alert.installed": "Plugin installato", + "alert.uninstalled": "Plugin disinstallato", + "alert.activate-success": "Si prega di riavviare il vostro NodeBB per attivare completamente questo plugin", + "alert.deactivate-success": "Plugin disattivato con successo", + "alert.upgrade-success": "Per favore, riorganizza e riavvia il tuo NodeBB per aggiornare completamente questo plugin.", + "alert.install-success": "Plugin installato correttamente, per favore attiva il plugin.", + "alert.uninstall-success": "Il plugin è stato disattivato e disinstallato con successo.", + "alert.suggest-error": "

NodeBB non è riuscito a contattare il gestore pacchetti, procedere con l'installazione dell'ultima versione?

il Server ha restituito (%1): %2", + "alert.package-manager-unreachable": "

NodeBB non è riuscito a contattare il gestore pacchetti, un aggiornamento non è suggerito in questo momento.

", + "alert.incompatible": "

La tua versione di NodeBB (v%1) è autorizzata solo per l'aggiornamento alla v%2 di questo plugin. Si prega di aggiornare il proprio NodeBB se si desidera installare una nuova versione di questo plugin.

", + "alert.possibly-incompatible": "

Nessuna informazione trovata sulla compatibilità

Questo plugin non ha specificato una versione specifica per l'installazione data la tua versione di NodeBB. La piena compatibilità non può essere garantita, e potrebbe causare l'avvio non corretto di NodeBB.

Nel caso in cui NodeBB non possa avviarsi correttamente:

$ ./nodebb reset plugin=\"%1\"

Continuare l'installazione dell'ultima versione di questo plugin?

", + "alert.reorder": "Plugin riordinati", + "alert.reorder-success": "Per favore, riorganizza e riavvia il tuo NodeBB per completare completamente il processo.", - "license.title": "Plugin License Information", - "license.intro": "The plugin %1 is licensed under the %2. Please read and understand the license terms prior to activating this plugin.", - "license.cta": "Do you wish to continue with activating this plugin?" + "license.title": "Informazioni Licenza Plugin", + "license.intro": "Il plugin %1 è concesso in licenza ai sensi della %2. Si prega di leggere e comprendere i termini della licenza prima di attivare questo plugin.", + "license.cta": "Vuoi continuare con l'attivazione di questo plugin?" } diff --git a/public/language/it/admin/extend/rewards.json b/public/language/it/admin/extend/rewards.json index 5383a90b33..1f1e6bc50f 100644 --- a/public/language/it/admin/extend/rewards.json +++ b/public/language/it/admin/extend/rewards.json @@ -1,17 +1,17 @@ { - "rewards": "Rewards", - "condition-if-users": "If User's", - "condition-is": "Is:", - "condition-then": "Then:", - "max-claims": "Amount of times reward is claimable", - "zero-infinite": "Enter 0 for infinite", - "delete": "Delete", - "enable": "Enable", - "disable": "Disable", - "control-panel": "Rewards Control", - "new-reward": "New Reward", + "rewards": "Premi", + "condition-if-users": "Se l'utente", + "condition-is": "È:", + "condition-then": "Allora:", + "max-claims": "Numero di volte che il premio è reclamabile", + "zero-infinite": "Inserisci 0 per infinito", + "delete": "Elimina", + "enable": "Abilita", + "disable": "Disabilita", + "control-panel": "Controllo dei premi", + "new-reward": "Nuovo premio", - "alert.delete-success": "Successfully deleted reward", - "alert.no-inputs-found": "Illegal reward - no inputs found!", - "alert.save-success": "Successfully saved rewards" + "alert.delete-success": "Premi eliminati con successo", + "alert.no-inputs-found": "Premio illegale - immissioni non trovate!", + "alert.save-success": "Premi salvati con successo" } \ No newline at end of file diff --git a/public/language/it/admin/extend/widgets.json b/public/language/it/admin/extend/widgets.json index 909693571b..7e497e522e 100644 --- a/public/language/it/admin/extend/widgets.json +++ b/public/language/it/admin/extend/widgets.json @@ -1,22 +1,22 @@ { - "available": "Available Widgets", - "explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.", - "none-installed": "No widgets found! Activate the essential widgets plugin in the plugins control panel.", - "clone-from": "Clone widgets from", - "containers.available": "Available Containers", - "containers.explanation": "Drag and drop on top of any active widget", - "containers.none": "None", - "container.well": "Well", + "available": "Widget disponibili", + "explanation": "Selezionare un widget dal menu a discesa e poi trascinalo e rilascialo nell'area widget di un modello a sinistra.", + "none-installed": "Nessun widget trovato! Attivare il plugin essenziale dei widget nel pannello di controllo plugin.", + "clone-from": "Clona i widget da", + "containers.available": "Contenitori disponibili", + "containers.explanation": "Trascina e rilascia su qualsiasi widget attivo", + "containers.none": "Nessuno", + "container.well": "Bene", "container.jumbotron": "Jumbotron", "container.panel": "Pannello", - "container.panel-header": "Panel Header", - "container.panel-body": "Panel Body", - "container.alert": "Alert", + "container.panel-header": "Intestazione Pannello", + "container.panel-body": "Corpo Pannello", + "container.alert": "Avviso", - "alert.confirm-delete": "Are you sure you wish to delete this widget?", - "alert.updated": "Widgets Updated", - "alert.update-success": "Successfully updated widgets", - "alert.clone-success": "Successfully cloned widgets", + "alert.confirm-delete": "Sei sicuro di voler eliminare questo widget?", + "alert.updated": "Widget aggiornati", + "alert.update-success": "Widget aggiornati con successo", + "alert.clone-success": "Widget clonati con successo", - "error.select-clone": "Please select a page to clone from" + "error.select-clone": "Si prega di selezionare una pagina da clonare da" } \ No newline at end of file diff --git a/public/language/it/admin/general/dashboard.json b/public/language/it/admin/general/dashboard.json index cfec2cd754..43584ef14a 100644 --- a/public/language/it/admin/general/dashboard.json +++ b/public/language/it/admin/general/dashboard.json @@ -1,76 +1,76 @@ { - "forum-traffic": "Forum Traffic", - "page-views": "Page Views", - "unique-visitors": "Unique Visitors", - "users": "Users", - "posts": "Posts", - "topics": "Topics", - "page-views-seven": "Last 7 Days", - "page-views-thirty": "Last 30 Days", - "page-views-last-day": "Last 24 hours", - "page-views-custom": "Custom Date Range", - "page-views-custom-start": "Range Start", - "page-views-custom-end": "Range End", - "page-views-custom-help": "Enter a date range of page views you would like to view. If no date picker is available, the accepted format is YYYY-MM-DD", - "page-views-custom-error": "Please enter a valid date range in the format YYYY-MM-DD", + "forum-traffic": "Traffico Forum", + "page-views": "Pagine viste", + "unique-visitors": "Visitatori Unici", + "users": "Utenti", + "posts": "Post", + "topics": "Discussioni", + "page-views-seven": "Ultimi 7 giorni", + "page-views-thirty": "Ultimi 30 giorni", + "page-views-last-day": "Ultime 24 ore", + "page-views-custom": "Intervallo data personalizzato", + "page-views-custom-start": "Inizio intervallo", + "page-views-custom-end": "Fine intervallo", + "page-views-custom-help": "Immettere un intervallo di date, delle pagine viste, che si desidera visualizzare. Se non è disponibile un selezionatore di date, il formato accettato è il seguente YYYY-MM-DD", + "page-views-custom-error": "Si prega di inserire un intervallo di date valido nel formato YYYY-MM-DD", - "stats.day": "Day", - "stats.week": "Week", - "stats.month": "Month", - "stats.all": "All Time", + "stats.day": "Giorno", + "stats.week": "Settimana", + "stats.month": "Mese", + "stats.all": "Sempre", - "updates": "Updates", - "running-version": "You are running NodeBB v%1.", - "keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.", - "up-to-date": "

You are up-to-date

", - "upgrade-available": "

A new version (v%1) has been released. Consider upgrading your NodeBB.

", - "prerelease-upgrade-available": "

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", - "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", - "running-in-development": "Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.", - "latest-lookup-failed": "

Failed to look up latest available version of NodeBB

", + "updates": "Aggiornamenti", + "running-version": "Stai eseguendo NodeBB v%1.", + "keep-updated": "Assicurati sempre che il tuo NodeBB sia aggiornato con le ultime patch di sicurezza e correzioni per bug.", + "up-to-date": "

Seiaggiornato

", + "upgrade-available": "

È stata rilasciata una nuova versione (v%1). Considera di aggiornare il tuo NodeBB.

", + "prerelease-upgrade-available": "

Questa è una versione pre-release sorpassata di NodeBB. È stata rilasciata una nuova versione (v%1). Considerare di aggiornare il tuo NodeBB.

", + "prerelease-warning": "

Questa è una versione pre-release di NodeBB. Possono verificarsi bug non intenzionali.

", + "running-in-development": "Forum è in esecuzione in modalità sviluppo. Il forum potrebbe essere aperto a potenziali vulnerabilità; si prega di contattare il proprio amministratore di sistema.", + "latest-lookup-failed": "

Ricerca dell'ultima versione disponibile di NodeBB non riuscita

", - "notices": "Notices", - "restart-not-required": "Restart not required", - "restart-required": "Restart required", - "search-plugin-installed": "Search Plugin installed", - "search-plugin-not-installed": "Search Plugin not installed", - "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", + "notices": "Annunci", + "restart-not-required": "Riavvio non richiesto", + "restart-required": "Riavvio richiesto", + "search-plugin-installed": "Ricerca Plugin installato", + "search-plugin-not-installed": "Ricerca Plugin non installato", + "search-plugin-tooltip": "Installa un plugin di ricerca dalla pagina plugin per attivare la funzionalità di ricerca", - "control-panel": "System Control", - "rebuild-and-restart": "Rebuild & Restart", - "restart": "Restart", - "restart-warning": "Rebuilding or Restarting your NodeBB will drop all existing connections for a few seconds.", - "restart-disabled": "Rebuilding and Restarting your NodeBB has been disabled as you do not seem to be running it via the appropriate daemon.", - "maintenance-mode": "Maintenance Mode", - "maintenance-mode-title": "Click here to set up maintenance mode for NodeBB", - "realtime-chart-updates": "Realtime Chart Updates", + "control-panel": "Controllo sistema", + "rebuild-and-restart": "Riorganizza & Riavvia", + "restart": "Riavvia", + "restart-warning": "Riorganizzando o Riavviando il tuo NodeBB cadranno tutte le connessioni esistenti per alcuni secondi.", + "restart-disabled": "La Riorganizzazione e il Riavvio del tuo NodeBB sono stati disabilitati in quanto non sembra che tu lo stia eseguendo tramite il demone appropriato.", + "maintenance-mode": "Modalità Manutenzione", + "maintenance-mode-title": "Clicca qui per impostare la modalità di manutenzione per NodeBB", + "realtime-chart-updates": "Aggiornamento grafici in tempo reale", - "active-users": "Active Users", - "active-users.users": "Users", - "active-users.guests": "Guests", - "active-users.total": "Total", - "active-users.connections": "Connections", + "active-users": "Utenti Attivi", + "active-users.users": "Utenti", + "active-users.guests": "Ospiti", + "active-users.total": "Totale", + "active-users.connections": "Connessioni", - "anonymous-registered-users": "Anonymous vs Registered Users", - "anonymous": "Anonymous", - "registered": "Registered", + "anonymous-registered-users": "Anonimi vs Utenti Registrati", + "anonymous": "Anonimi", + "registered": "Registrati", - "user-presence": "User Presence", - "on-categories": "On categories list", - "reading-posts": "Reading posts", - "browsing-topics": "Browsing topics", - "recent": "Recent", - "unread": "Unread", + "user-presence": "Presenza utente", + "on-categories": "Nella lista delle categorie", + "reading-posts": "Lettura post", + "browsing-topics": "Navigazione discussioni", + "recent": "Recenti", + "unread": "Non letto", - "high-presence-topics": "High Presence Topics", + "high-presence-topics": "Alta presenza discussioni", - "graphs.page-views": "Page Views", - "graphs.page-views-registered": "Page Views Registered", - "graphs.page-views-guest": "Page Views Guest", - "graphs.page-views-bot": "Page Views Bot", - "graphs.unique-visitors": "Unique Visitors", - "graphs.registered-users": "Registered Users", - "graphs.anonymous-users": "Anonymous Users", - "last-restarted-by": "Last restarted by", - "no-users-browsing": "No users browsing" + "graphs.page-views": "Pagine viste", + "graphs.page-views-registered": "Pagine viste Registrati", + "graphs.page-views-guest": "Pagine viste Ospite", + "graphs.page-views-bot": "Pagine viste Bot", + "graphs.unique-visitors": "Visitatori Unici", + "graphs.registered-users": "Utenti Registrati", + "graphs.anonymous-users": "Utenti Anonimi", + "last-restarted-by": "Ultimo riavvio di", + "no-users-browsing": "Nessun utente sta navigando" } diff --git a/public/language/it/admin/general/homepage.json b/public/language/it/admin/general/homepage.json index 7428d59eeb..93c5b3e964 100644 --- a/public/language/it/admin/general/homepage.json +++ b/public/language/it/admin/general/homepage.json @@ -1,8 +1,8 @@ { - "home-page": "Home Page", - "description": "Choose what page is shown when users navigate to the root URL of your forum.", - "home-page-route": "Home Page Route", - "custom-route": "Custom Route", - "allow-user-home-pages": "Allow User Home Pages", - "home-page-title": "Title of the home page (default \"Home\")" + "home-page": "Pagina Iniziale", + "description": "Scegliere quale pagina visualizzare quando gli utenti navigano all'URL principale del forum.", + "home-page-route": "Percorso Pagina Iniziale", + "custom-route": "Percorso personalizzato", + "allow-user-home-pages": "Consenti Pagina Iniziale Utente", + "home-page-title": "Titolo della pagina iniziale (impostazione predefinita \"Home\")" } \ No newline at end of file diff --git a/public/language/it/admin/general/languages.json b/public/language/it/admin/general/languages.json index bdd57849b3..321d12f8e4 100644 --- a/public/language/it/admin/general/languages.json +++ b/public/language/it/admin/general/languages.json @@ -1,6 +1,6 @@ { - "language-settings": "Language Settings", - "description": "The default language determines the language settings for all users who are visiting your forum.
Individual users can override the default language on their account settings page.", - "default-language": "Default Language", - "auto-detect": "Auto Detect Language Setting for Guests" + "language-settings": "Impostazioni lingua", + "description": "La lingua predefinita determina le impostazioni della lingua per tutti gli utenti che visitano il tuo forum.
I singoli utenti possono sovrascrivere la lingua predefinita nella pagina delle impostazioni dell'account.", + "default-language": "Lingua predefinita", + "auto-detect": "Rilevazione automatica della lingua impostata per gli Ospiti" } \ No newline at end of file diff --git a/public/language/it/admin/general/navigation.json b/public/language/it/admin/general/navigation.json index 94a7d38c53..04cd16e1a6 100644 --- a/public/language/it/admin/general/navigation.json +++ b/public/language/it/admin/general/navigation.json @@ -2,21 +2,22 @@ "icon": "Icona:", "change-icon": "modifica", "route": "Percorso:", - "tooltip": "Tooltip:", + "tooltip": "Suggerimento:", "text": "Testo:", - "text-class": "Text Class: optional", - "id": "ID: optional", + "text-class": "Classe Testo: opzionale", + "class": "Classe: opzionale", + "id": "ID: opzionale", "properties": "Proprietà:", - "groups": "Groups:", - "open-new-window": "Open in a new window", + "groups": "Gruppi:", + "open-new-window": "Apri in una nuova finestra", "btn.delete": "Elimina", "btn.disable": "Disabilita", "btn.enable": "Abilita", - "available-menu-items": "Available Menu Items", - "custom-route": "Custom Route", + "available-menu-items": "Voci di Menu disponibili", + "custom-route": "Percorso personalizzato", "core": "core", "plugin": "plugin" } \ No newline at end of file diff --git a/public/language/it/admin/general/social.json b/public/language/it/admin/general/social.json index 23aedfcfaa..0a2eeb5181 100644 --- a/public/language/it/admin/general/social.json +++ b/public/language/it/admin/general/social.json @@ -1,5 +1,5 @@ { - "post-sharing": "Post Sharing", - "info-plugins-additional": "Plugins can add additional networks for sharing posts.", - "save-success": "Successfully saved Post Sharing Networks!" + "post-sharing": "Condivisione Post", + "info-plugins-additional": "I plugin possono aggiungere reti aggiuntive per la condivisione dei post.", + "save-success": "Salvato con successo Reti Condivisione Post!" } \ No newline at end of file diff --git a/public/language/it/admin/general/sounds.json b/public/language/it/admin/general/sounds.json index 95ccbde0f1..0392f2954b 100644 --- a/public/language/it/admin/general/sounds.json +++ b/public/language/it/admin/general/sounds.json @@ -1,9 +1,9 @@ { - "notifications": "Notifications", - "chat-messages": "Chat Messages", + "notifications": "Notifiche", + "chat-messages": "Messaggi di chat", "play-sound": "Play", - "incoming-message": "Incoming Message", - "outgoing-message": "Outgoing Message", - "upload-new-sound": "Upload New Sound", - "saved": "Settings Saved" + "incoming-message": "Messaggio in arrivo", + "outgoing-message": "Messaggio in uscita", + "upload-new-sound": "Carica nuovo suono", + "saved": "Impostazioni salvate" } \ No newline at end of file diff --git a/public/language/it/admin/manage/admins-mods.json b/public/language/it/admin/manage/admins-mods.json index e0f39ed5d4..938fee206e 100644 --- a/public/language/it/admin/manage/admins-mods.json +++ b/public/language/it/admin/manage/admins-mods.json @@ -1,10 +1,10 @@ { - "administrators": "Administrators", - "global-moderators": "Global Moderators", - "no-global-moderators": "No Global Moderators", - "moderators-of-category": "%1 Moderators", - "no-moderators": "No Moderators", - "add-administrator": "Add Administrator", - "add-global-moderator": "Add Global Moderator", - "add-moderator": "Add Moderator" + "administrators": "Amministratori", + "global-moderators": "Moderatori Globali", + "no-global-moderators": "Nessun Moderatore Globale", + "moderators-of-category": "%1 Moderatori", + "no-moderators": "Nessun Moderatore", + "add-administrator": "Aggiungi Amministratore", + "add-global-moderator": "Aggiungi Moderatore Globale", + "add-moderator": "Aggiungi Moderatore" } \ No newline at end of file diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/it/admin/manage/privileges.json b/public/language/it/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/it/admin/manage/privileges.json +++ b/public/language/it/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/it/admin/settings/cookies.json b/public/language/it/admin/settings/cookies.json index f8b0f0538b..3282a6d527 100644 --- a/public/language/it/admin/settings/cookies.json +++ b/public/language/it/admin/settings/cookies.json @@ -1,11 +1,11 @@ { - "eu-consent": "EU Consent", - "consent.enabled": "Enabled", - "consent.message": "Notification message", - "consent.acceptance": "Acceptance message", - "consent.link-text": "Policy Link Text", - "consent.blank-localised-default": "Leave blank to use NodeBB localised defaults", - "settings": "Settings", - "cookie-domain": "Session cookie domain", - "blank-default": "Leave blank for default" + "eu-consent": "Consenso UE", + "consent.enabled": "Abilitato", + "consent.message": "Messaggio di notifica", + "consent.acceptance": "Messaggio di accettazione", + "consent.link-text": "Testo del link all'informativa sulla privacy", + "consent.blank-localised-default": "Lascia vuoto per usare i valori predefiniti localizzati di NodeBB", + "settings": "Impostazioni", + "cookie-domain": "Dominio cookie di sessione", + "blank-default": "Lascia vuoto per predefinito" } \ No newline at end of file diff --git a/public/language/it/admin/settings/email.json b/public/language/it/admin/settings/email.json index 50ad2e06ea..a191703718 100644 --- a/public/language/it/admin/settings/email.json +++ b/public/language/it/admin/settings/email.json @@ -1,37 +1,37 @@ { - "email-settings": "Email Settings", - "address": "Email Address", - "address-help": "The following email address refers to the email that the recipient will see in the \"From\" and \"Reply To\" fields.", - "from": "From Name", - "from-help": "The from name to display in the email.", + "email-settings": "Impostazioni Email", + "address": "Indirizzo Email", + "address-help": "Il seguente indirizzo email si riferisce all'email che il destinatario vedrà nei campi \"Da\" e \"Rispondi a\".", + "from": "Da Nome", + "from-help": "Il nome da visualizzare nell'email.", - "smtp-transport": "SMTP Transport", - "smtp-transport.enabled": "Use an external email server to send emails", - "smtp-transport-help": "You can select from a list of well-known services or enter a custom one.", - "smtp-transport.service": "Select a service", - "smtp-transport.service-custom": "Custom Service", - "smtp-transport.service-help": "Select a service name above in order to use the known information about it. Alternatively, select 'Custom Service' and enter the details below.", + "smtp-transport": "Trasporto SMTP", + "smtp-transport.enabled": "Utilizza un server di posta elettronica esterno per inviare le email", + "smtp-transport-help": "Puoi selezionare da un elenco di servizi noti o inserirne uno personalizzato.", + "smtp-transport.service": "Seleziona un servizio", + "smtp-transport.service-custom": "Servizio personalizzato", + "smtp-transport.service-help": "Seleziona un servizio nominano sopra per utilizzare le informazioni conosciute su di esso. In alternativa, seleziona \"Servizio personalizzato\" ed inserisci i dettagli qui sotto.", "smtp-transport.gmail-warning1": "There have been reports of the Gmail service not working on accounts with heightened security. In those scenarios, you will have to configure your GMail account to allow less secure apps.", "smtp-transport.gmail-warning2": "For more information about this workaround, please consult this NodeMailer article on the issue. An alternative would be to utilise a third-party emailer plugin such as SendGrid, Mailgun, etc. Browse available plugins here.", - "smtp-transport.host": "SMTP Host", - "smtp-transport.port": "SMTP Port", - "smtp-transport.security": "Connection security", - "smtp-transport.security-encrypted": "Encrypted", + "smtp-transport.host": "Host SMTP", + "smtp-transport.port": "Porta SMTP", + "smtp-transport.security": "Sicurezza connessione", + "smtp-transport.security-encrypted": "Crittografata", "smtp-transport.security-starttls": "StartTLS", - "smtp-transport.security-none": "None", - "smtp-transport.username": "Username", - "smtp-transport.username-help": "For the Gmail service, enter the full email address here, especially if you are using a Google Apps managed domain.", + "smtp-transport.security-none": "Nessuna", + "smtp-transport.username": "Nome utente", + "smtp-transport.username-help": "Per il servizio Gmail, inserisci qui l'indirizzo email completo, specialmente se stai usando un dominio gestito da Google Apps.", "smtp-transport.password": "Password", - "template": "Edit Email Template", - "template.select": "Select Email Template", - "template.revert": "Revert to Original", - "testing": "Email Testing", - "testing.select": "Select Email Template", - "testing.send": "Send Test Email", - "testing.send-help": "The test email will be sent to the currently logged in user's email address.", - "subscriptions": "Email Subscriptions", - "subscriptions.disable": "Disable subscriber notification emails", - "subscriptions.hour": "Digest Hour", - "subscriptions.hour-help": "Please enter a number representing the hour to send scheduled email digests (e.g. 0 for midnight, 17 for 5:00pm). Keep in mind that this is the hour according to the server itself, and may not exactly match your system clock.
The approximate server time is:
The next daily digest is scheduled to be sent " + "template": "Modifica Modello Email", + "template.select": "Seleziona Modello Email", + "template.revert": "Torna all'originale", + "testing": "Prova Email", + "testing.select": "Seleziona Modello Email", + "testing.send": "Invia Email di prova", + "testing.send-help": "L'email di prova sarà inviata all'indirizzo email dell'utente attualmente connesso.", + "subscriptions": "Iscrizioni email", + "subscriptions.disable": "Disabilita le email di notifica degli iscritti", + "subscriptions.hour": "Ora di invio", + "subscriptions.hour-help": "Si prega di inserire un numero che rappresenta l'ora per l'invio dell'email programmate (es. 0per mezzanotte, 17per le 17: 00). Tieni presente che questa è l'ora secondo il server stesso, e potrebbe non combaciare esattamente al tuo orologio di sistema.
L'orario approssimativo del server è:
La prossima trasmissione giornaliera è prevista alle " } \ No newline at end of file diff --git a/public/language/it/admin/settings/general.json b/public/language/it/admin/settings/general.json index 948123f7cb..388e24ce82 100644 --- a/public/language/it/admin/settings/general.json +++ b/public/language/it/admin/settings/general.json @@ -1,35 +1,35 @@ { - "site-settings": "Site Settings", - "title": "Site Title", + "site-settings": "Impostazioni Sito", + "title": "Titolo Sito", "title.url": "URL", - "title.url-placeholder": "The URL of the site title", - "title.url-help": "When the title is clicked, send users to this address. If left blank, user will be sent to the forum index.", - "title.name": "Your Community Name", - "title.show-in-header": "Show Site Title in Header", - "browser-title": "Browser Title", - "browser-title-help": "If no browser title is specified, the site title will be used", - "title-layout": "Title Layout", - "title-layout-help": "Define how the browser title will be structured ie. {pageTitle} | {browserTitle}", - "description.placeholder": "A short description about your community", - "description": "Site Description", - "keywords": "Site Keywords", - "keywords-placeholder": "Keywords describing your community, comma-separated", - "logo": "Site Logo", - "logo.image": "Image", - "logo.image-placeholder": "Path to a logo to display on forum header", - "logo.upload": "Upload", + "title.url-placeholder": "L'URL del titolo del sito", + "title.url-help": "Quando si clicca sul titolo, invia gli utenti a questo indirizzo. Se lasciato vuoto, l'utente sarà inviato all'indice del forum.", + "title.name": "Il Nome della Comunità", + "title.show-in-header": "Mostra Titolo Sito nell'Intestazione", + "browser-title": "Titolo Browser", + "browser-title-help": "Se nessun titolo browser è specificato, sarà utilizzato il titolo del sito", + "title-layout": "Layout del Titolo", + "title-layout-help": "Definire come sarà strutturato il titolo del browser, ad es. {pageTitle} | {browserTitle}", + "description.placeholder": "Una breve descrizione della tua comunità", + "description": "Descrizione del sito", + "keywords": "Parole chiave del sito", + "keywords-placeholder": "Parole chiave che descrivono la vostra comunità, separate da virgole", + "logo": "Logo del sito", + "logo.image": "Immagine", + "logo.image-placeholder": "Percorso del logo da visualizzare sull'intestazione del forum", + "logo.upload": "Carica", "logo.url": "URL", - "logo.url-placeholder": "The URL of the site logo", - "logo.url-help": "When the logo is clicked, send users to this address. If left blank, user will be sent to the forum index.", - "logo.alt-text": "Alt Text", - "log.alt-text-placeholder": "Alternative text for accessibility", + "logo.url-placeholder": "L'URL del logo del sito", + "logo.url-help": "Quando si fa clic sul logo, invia gli utenti a questo indirizzo. Se lasciato vuoto, l'utente sarà inviato all'indice del forum.", + "logo.alt-text": "Testo alternativo", + "log.alt-text-placeholder": "Testo alternativo per l'accessibilità", "favicon": "Favicon", - "favicon.upload": "Upload", - "touch-icon": "Homescreen/Touch Icon", - "touch-icon.upload": "Upload", - "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", - "outgoing-links": "Outgoing Links", - "outgoing-links.warning-page": "Use Outgoing Links Warning Page", - "search-default-sort-by": "Search default sort by", - "outgoing-links.whitelist": "Domains to whitelist for bypassing the warning page" + "favicon.upload": "Carica", + "touch-icon": "Schermata Iniziale/Icona Touch", + "touch-icon.upload": "Carica", + "touch-icon.help": "Dimensioni e formato consigliati: 192x192, solo formato PNG. Se nessuna icona touch è specificata, NodeBB tornerà a usare la favicon.", + "outgoing-links": "Collegamenti in uscita", + "outgoing-links.warning-page": "Usa pagina di avviso collegamenti in uscita", + "search-default-sort-by": "Ricerca predefinita ordinata per", + "outgoing-links.whitelist": "Domini nella whitelist per aggirare la pagina di avviso" } \ No newline at end of file diff --git a/public/language/it/admin/settings/group.json b/public/language/it/admin/settings/group.json index fe3e39915b..83fe887d8a 100644 --- a/public/language/it/admin/settings/group.json +++ b/public/language/it/admin/settings/group.json @@ -1,13 +1,12 @@ { - "general": "General", - "private-groups": "Private Groups", - "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", - "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", - "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", - "max-name-length": "Maximum Group Name Length", - "cover-image": "Group Cover Image", - "default-cover": "Default Cover Images", - "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" + "general": "Generale", + "private-groups": "Gruppi Privati", + "private-groups.help": "Se abilitato, l'ingresso ai gruppi richiede l'approvazione del proprietario del gruppo (Predefinito: abilitato)", + "private-groups.warning": "Attenzione! Se questa opzione è disattivata e si hanno gruppi privati, questi diventano automaticamente pubblici.", + "allow-multiple-badges-help": "Questo flag può essere utilizzato per consentire agli utenti di selezionare più badge di gruppo, richiede il supporto del tema.", + "max-name-length": "Lunghezza massima Nome Gruppo", + "max-title-length": "Lunghezza massima Titolo Gruppo", + "cover-image": "Immagine Copertina Gruppo", + "default-cover": "Immagini Copertina Predefinite", + "default-cover-help": "Aggiungi immagini di copertina separate da virgole per i gruppi che non hanno caricato un'immagine copertina." } \ No newline at end of file diff --git a/public/language/it/admin/settings/guest.json b/public/language/it/admin/settings/guest.json index a8b9d458f0..f9aa27ef6d 100644 --- a/public/language/it/admin/settings/guest.json +++ b/public/language/it/admin/settings/guest.json @@ -1,5 +1,5 @@ { - "handles": "Guest Handles", - "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\"" + "handles": "Gestione Ospite", + "handles.enabled": "Consenti gestione ospiti", + "handles.enabled-help": "Questa opzione mostra un nuovo campo che permette agli ospiti di scegliere un nome da associare ad ogni post che fanno. Se disabilitata, saranno semplicemente chiamati \"Ospite\"." } \ No newline at end of file diff --git a/public/language/it/admin/settings/notifications.json b/public/language/it/admin/settings/notifications.json index ebd2775314..31f018ed79 100644 --- a/public/language/it/admin/settings/notifications.json +++ b/public/language/it/admin/settings/notifications.json @@ -1,7 +1,7 @@ { "notifications": "Notifiche", "welcome-notification": "Notifica di benvenuto", - "welcome-notification-link": "Collegamento della notifica di benvenuto", - "welcome-notification-uid": "Welcome Notification User (UID)", - "notification-alert-timeout": "Notification Alert Timeout" + "welcome-notification-link": "Collegamento a Notifica di benvenuto", + "welcome-notification-uid": "Notifica di benvenuto utente (UID)", + "notification-alert-timeout": "Timeout Notifica Avviso" } \ No newline at end of file diff --git a/public/language/it/admin/settings/pagination.json b/public/language/it/admin/settings/pagination.json index c830374dbb..d32d1f3073 100644 --- a/public/language/it/admin/settings/pagination.json +++ b/public/language/it/admin/settings/pagination.json @@ -1,10 +1,10 @@ { - "pagination": "Impostazioni di paginazione", - "enable": "Pagina le discussioni e i post al posto di usale lo scrolling infinito", - "topics": "Paginazione della discussione", + "pagination": "Impostazioni di impaginazione", + "enable": "Impaginare discussioni e post al posto di usare lo scorrimento infinito", + "topics": "Impaginazione Discussione", "posts-per-page": "Post per pagina", "max-posts-per-page": "Numero massimo di post per pagina", - "categories": "Categorie per pagina", + "categories": "Categoria Impaginazione", "topics-per-page": "Discussioni per pagina", - "max-topics-per-page": "Discussioni massime per pagina" + "max-topics-per-page": "Numero massimo di Discussioni per pagina" } \ No newline at end of file diff --git a/public/language/it/admin/settings/tags.json b/public/language/it/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/it/admin/settings/tags.json +++ b/public/language/it/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/it/admin/settings/user.json b/public/language/it/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/it/admin/settings/user.json +++ b/public/language/it/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/it/admin/settings/web-crawler.json b/public/language/it/admin/settings/web-crawler.json index 2e0d31d12b..9fa4708e84 100644 --- a/public/language/it/admin/settings/web-crawler.json +++ b/public/language/it/admin/settings/web-crawler.json @@ -1,10 +1,10 @@ { - "crawlability-settings": "Crawlability Settings", - "robots-txt": "Custom Robots.txt Leave blank for default", - "sitemap-feed-settings": "Sitemap & Feed Settings", - "disable-rss-feeds": "Disable RSS Feeds", - "disable-sitemap-xml": "Disable Sitemap.xml", - "sitemap-topics": "Number of Topics to display in the Sitemap", - "clear-sitemap-cache": "Clear Sitemap Cache", - "view-sitemap": "View Sitemap" + "crawlability-settings": "Impostazioni Crawlability", + "robots-txt": "Robots.txt personalizzato Lascia vuoto per predefinito", + "sitemap-feed-settings": "Impostazioni Mappa Sito & Feed", + "disable-rss-feeds": "Disabilita Feed RSS", + "disable-sitemap-xml": "Disabilita Sitemap.xml", + "sitemap-topics": "Numero di Discussioni da visualizzare in Mappa Sito", + "clear-sitemap-cache": "Cancella Cache Mappa Sito", + "view-sitemap": "Visualizza Mappa Sito" } \ No newline at end of file diff --git a/public/language/it/category.json b/public/language/it/category.json index 4dd7aa06b1..cd098034aa 100644 --- a/public/language/it/category.json +++ b/public/language/it/category.json @@ -2,21 +2,21 @@ "category": "Categoria", "subcategories": "Sottocategorie", "new_topic_button": "Nuova Discussione", - "guest-login-post": "Effettua il Log in per pubblicare", + "guest-login-post": "Accedi per postare", "no_topics": "Non ci sono discussioni in questa categoria.
Perché non ne inizi una?", - "browsing": "visualizzando", + "browsing": "navigazione", "no_replies": "Nessuno ha risposto", - "no_new_posts": "Nessun nuovo post.", - "watch": "Osserva", + "no_new_posts": "Nessuna nuova discussione.", + "watch": "Segui", "ignore": "Ignora", "watching": "Seguito", - "not-watching": "Not Watching", + "not-watching": "Non seguito", "ignoring": "Ignorato", - "watching.description": "Show topics in unread and recent", - "not-watching.description": "Do not show topics in unread, show in recent", - "ignoring.description": "Do not show topics in unread and recent", - "watching.message": "You are now watching updates from this category and all subcategories", - "notwatching.message": "You are not watching updates from this category and all subcategories", - "ignoring.message": "You are now ignoring updates from this category and all subcategories", - "watched-categories": "Categorie osservate" + "watching.description": "Mostra discussioni in non letti e recenti", + "not-watching.description": "Non mostrare discussioni in non letti, mostra in recenti", + "ignoring.description": "Non mostrare discussioni in non letti e recenti", + "watching.message": "Ora stai seguendo gli aggiornamenti di questa categoria e di tutte le sottocategorie", + "notwatching.message": "Ora non stai seguendo gli aggiornamenti di questa categoria e di tutte le sottocategorie", + "ignoring.message": "Ora stai ignorando gli aggiornamenti di questa categoria e di tutte le sottocategorie", + "watched-categories": "Categorie seguite" } \ No newline at end of file diff --git a/public/language/it/email.json b/public/language/it/email.json index 46307a44ad..8f87c61161 100644 --- a/public/language/it/email.json +++ b/public/language/it/email.json @@ -1,45 +1,45 @@ { - "test-email.subject": "Test Email", - "password-reset-requested": "Password Reset Requested!", + "test-email.subject": "Email di prova", + "password-reset-requested": "Richiesto Reset Password!", "welcome-to": "Benvenuto in %1", "invite": "Invito da %1", "greeting_no_name": "Ciao", "greeting_with_name": "Ciao %1", - "email.verify-your-email.subject": "Please verify your email", - "email.verify.text1": "Your email address has changed!", + "email.verify-your-email.subject": "Per favore verificare la tua email", + "email.verify.text1": "Il tuo indirizzo email è cambiato!", "welcome.text1": "Grazie per esserti registrato su %1!", "welcome.text2": "Per attivare completamente il tuo account dobbiamo verificare che sei il proprietario dell'indirizzo email con cui ti sei registrato.", "welcome.text3": "Un amministratore ha accettato la tua registrazione. Adesso puoi collegarti con il tuo nome utente/password.", "welcome.cta": "Clicca qui per confermare il tuo indirizzo email", "invitation.text1": "%1 ti ha invitato a entrare in %2", - "invitation.text2": "Your invitation will expire in %1 days.", + "invitation.text2": "Il tuo invito scadrà tra %1 giorno.", "invitation.ctr": "Clicca qui per creare il tuo account.", "reset.text1": "Abbiamo ricevuto una richiesta di reset della tua password, probabilmente perché l'hai dimenticata. Se non è così si prega di ignorare questa email.", "reset.text2": "Per confermare il reset della password per favore clicca il seguente link:", "reset.cta": "Clicca qui per resettare la tua password", "reset.notify.subject": "Password modificata con successo.", - "reset.notify.text1": "Ti informiamo che in data %1, la password è stata cambiata con successo.", - "reset.notify.text2": "Se non hai autorizzato questo, per favore notifica immediatamente un amministratore.", + "reset.notify.text1": "Ti informiamo che il %1, la password è stata cambiata con successo.", + "reset.notify.text2": "Se non hai autorizzato questo, per favore informa immediatamente l'amministratore.", "digest.notifications": "Hai una notifica non letta da %1:", - "digest.latest_topics": "Ultime discussioni su %1", + "digest.latest_topics": "Ultime discussioni da %1", "digest.cta": "Clicca qui per visitare %1", "digest.unsub.info": "Questo sommario ti è stato inviato perché lo hai sottoscritto nelle tue impostazioni.", - "digest.no_topics": "Non ci sono state discussioni attive nell'ultimo %1", "digest.day": "giorno", "digest.week": "settimana", "digest.month": "mese", "digest.subject": "Sommario per %1", + "digest.title": "Il tuo sommario quotidiano", "notif.chat.subject": "Nuovo messaggio in chat da %1", "notif.chat.cta": "Clicca qui per continuare la conversazione", - "notif.chat.unsub.info": "Questa notifica di chat ti è stata inviata perché l'hai scelta nelle impostazioni.", + "notif.chat.unsub.info": "Questa notifica di chat ti è stata inviata perché l'hai sottoscritta nelle impostazioni.", "notif.post.cta": "Clicca qui per leggere la discussione completa", - "notif.post.unsub.info": "Questo post ti è stato notificato in base alle tue impostazioni di sottoscrizione.", - "notif.cta": "Vai alla discussione", - "test.text1": "Questa è una email di test per verificare che il servizio di invio email è configurato correttamente sul tuo NodeBB.", + "notif.post.unsub.info": "Questa notifica di discussione ti è stata inviata perché l'hai sottoscritta nelle impostazioni.", + "notif.cta": "Clicca qui per andare al forum", + "test.text1": "Questa è una email di prova per verificare che il servizio di invio email è configurato correttamente sul tuo NodeBB.", "unsub.cta": "Clicca qui per modificare queste impostazioni", "banned.subject": "Sei stato bannato da %1", - "banned.text1": "%1 è stato bannato da %2", + "banned.text1": "L'utente %1 è stato bannato da %2", "banned.text2": "Questo ban durerà fino a %1.", - "banned.text3": "Il motivo del ban è:", + "banned.text3": "Questo è il motivo per cui sei stato bannato:", "closing": "Grazie!" } \ No newline at end of file diff --git a/public/language/it/error.json b/public/language/it/error.json index 4533f50eb0..2bc614b87f 100644 --- a/public/language/it/error.json +++ b/public/language/it/error.json @@ -1,9 +1,9 @@ { "invalid-data": "Dati non validi", - "invalid-json": "JSON invalido", - "not-logged-in": "Non sembri essere loggato.", + "invalid-json": "JSON non valido", + "not-logged-in": "Non sembra che tu abbia effettuato l'accesso.", "account-locked": "Il tuo account è stato bloccato temporaneamente", - "search-requires-login": "La ricerca richiede un account! Si prega di loggarsi o registrarsi!", + "search-requires-login": "La ricerca richiede un account! Si prega di effettuare l'accesso o registrarsi!", "goback": "Premi indietro per tornare alla pagina precedente", "invalid-cid": "ID Categoria non valido", "invalid-tid": "ID Topic non valido", @@ -15,37 +15,38 @@ "invalid-user-data": "Dati utente non validi", "invalid-password": "Password non valida", "invalid-login-credentials": "Credenziali di accesso non valide", - "invalid-username-or-password": "Si prega di specificare sia un nome utente che una password", + "invalid-username-or-password": "Si prega di specificare sia un nome utente sia la password", "invalid-search-term": "Termine di ricerca non valido", - "invalid-url": "URL invalido", - "local-login-disabled": "Il sistema di login locale è stato disabilitato per gli account non-privileged.", - "csrf-invalid": "Non siamo riusciti a farti connettere, probabilmente perché la sessione è scaduta. Per favore riprova.", - "invalid-pagination-value": "Valore di paginazione non valido, deve essere almeno %1 ed al massimo %2", + "invalid-url": "URL non valido", + "local-login-disabled": "Il sistema di accesso locale è stato disabilitato per gli account senza privilegi.", + "csrf-invalid": "Non siamo riusciti a farti accedere, probabilmente perché la sessione è scaduta. Per favore riprova.", + "invalid-pagination-value": "Valore di impaginazione non valido, deve essere almeno %1 ed al massimo %2", "username-taken": "Nome utente già esistente", "email-taken": "Email già esistente", - "email-not-confirmed": "La tua Email deve essere ancora confermata, per favore clicca qui per confermare la tua Email.", - "email-not-confirmed-chat": "Non potrai chattare finchè non avrai confermato la tua email, per favore clicca qui per farlo ora.", - "email-not-confirmed-email-sent": "La tua email non è ancora stata confermata, per favore controlla la tua casella di posta elettronica per l'email di conferma.", - "no-email-to-confirm": "Questo forum richiede la conferma dell'indirizzo email, per favore clicca qui per inserirne uno", - "email-confirm-failed": "Non possiamo confermare la tua email, per favore prova ancora più tardi.", - "confirm-email-already-sent": "Email di conferma già inviata, per favore attendere %1 minuti per richiederne un'altra.", - "sendmail-not-found": "Non è stato possibile trovare l'eseguibile sendmail, per favore assicurati che sia installato ed eseguibile dall'utente su cui è installato NodeBB.", + "email-not-confirmed": "La tua email non è stata ancora confermata, clicca qui per confermare la tua email.", + "email-not-confirmed-chat": "Non puoi chattare finché non confermi la tua email, per favore clicca qui per confermare la tua email.", + "email-not-confirmed-email-sent": "La tua email non è ancora stata confermata, per favore controlla la tua casella di posta per l'email di conferma.", + "no-email-to-confirm": "Questo forum richiede una conferma via email, clicca qui per inserire un'email", + "email-confirm-failed": "Non abbiamo potuto confermare la tua email, per favore riprovaci più tardi.", + "confirm-email-already-sent": "Email di conferma già inviata, per favore attendere %1 minuto(i) per inviarne un'altra.", + "sendmail-not-found": "Impossibile trovare l'eseguibile di sendmail, per favore assicurati che sia installato ed eseguibile dall'utente che esegue NodeBB.", "username-too-short": "Nome utente troppo corto", "username-too-long": "Nome utente troppo lungo", "password-too-long": "Password troppo lunga", + "reset-rate-limited": "Troppe richieste di reimpostazione password (richieste limitate)", "user-banned": "Utente bannato", "user-banned-reason": "Spiacente, questo account è stato bannato (Motivazione: %1)", "user-banned-reason-until": "Spiacente, questo account è stato bannato fino a %1 (Motivazione: %2)", - "user-too-new": "Devi attendere %1 secondi prima di creare il tuo primo post", - "blacklisted-ip": "Purtroppo il tuo indirizzo IP è stato bannato da questa community. Se credi che ci sia stato un errore contatta un amministratore.", - "ban-expiry-missing": "Per favore fornisci una data finale per questo ban", + "user-too-new": "Spiacente, devi attendere %1 secondo(i) prima di creare il tuo primo post", + "blacklisted-ip": "Spiacente, il tuo indirizzo IP è stato bannato da questa comunità. Se ritieni che si tratti di un errore, contatta un amministratore.", + "ban-expiry-missing": "Per favore fornire una data di termine per questo ban", "no-category": "La Categoria non esiste", - "no-topic": "La discussione non esiste", + "no-topic": "La Discussione non esiste", "no-post": "Il Post non esiste", "no-group": "Il Gruppo non esiste", - "no-user": "L'User non esiste", + "no-user": "L'Utente non esiste", "no-teaser": "Teaser non esiste", - "no-privileges": "Tu non hai i privilegi giusti per questa azione", + "no-privileges": "Non hai abbastanza privilegi per questa azione.", "category-disabled": "Categoria disabilitata", "topic-locked": "Discussione Bloccata", "post-edit-duration-expired": "Ti è consentito modificare un post per %1 secondi dopo averlo inviato", diff --git a/public/language/it/flags.json b/public/language/it/flags.json index 1a2c75c910..75ba9493e0 100644 --- a/public/language/it/flags.json +++ b/public/language/it/flags.json @@ -1,65 +1,66 @@ { "state": "Stato", "reporter": "Segnalatore", - "reported-at": "Segnalato il", + "reported-at": "Segnalato a", "description": "Descrizione", - "no-flags": "Hurra! nessun flag trovato", + "no-flags": "Evviva! Nessuna segnalazione trovata.", "assignee": "Assegnatario", - "update": "Aggiornamento", + "update": "Aggiorna", "updated": "Aggiornato", - "target-purged": "Il contenuto a cui si riferisce questa flag è stato eliminato e non è più disponibile.", + "target-purged": "Il contenuto di questa segnalazione è stato eliminato e non è più disponibile.", - "quick-filters": "Filtri rapidi", - "filter-active": "Ci sono uno o più filtri attivi in questa lista di flag", - "filter-reset": "Rimuovi filtri", - "filters": "Opzioni filtri", - "filter-reporterId": "Reporter UID", - "filter-targetUid": "Flagged UID", - "filter-type": "Flag Type", - "filter-type-all": "Tutto il contenuto", + "graph-label": "Segnalazioni Giornaliere", + "quick-filters": "Filtri Rapidi", + "filter-active": "Ci sono uno o più filtri attivi in questa lista di segnalazioni", + "filter-reset": "Rimuovi Filtri", + "filters": "Opzioni Filtri", + "filter-reporterId": "Segnalatore UID", + "filter-targetUid": "UID segnalato", + "filter-type": "Tipo Segnalazione", + "filter-type-all": "Tutto il Contenuto", "filter-type-post": "Post", - "filter-type-user": "User", - "filter-state": "Specifica il motivo per cui contrassegnare% 1% 2 per la revisione. In alternativa, utilizza uno dei pulsanti di rapporto rapido, se applicabile.", - "filter-assignee": "Assignee UID", + "filter-type-user": "Utente", + "filter-state": "Stato", + "filter-assignee": "UID assegnato", "filter-cid": "Categoria", "filter-quick-mine": "Assegnato a me", "filter-cid-all": "Tutte le categorie", - "apply-filters": "Applica filtri", + "apply-filters": "Applica Filtri", - "quick-links": "Collegamenti veloci", - "flagged-user": "Flagged User", + "quick-links": "Collegamenti Rapidi", + "flagged-user": "Utente Segnalato", "view-profile": "Vedi Profilo", - "start-new-chat": "Inizia una nuova chat", - "go-to-target": "View Flag Target", + "start-new-chat": "Inizia Nuova Chat", + "go-to-target": "Visualizza oggetto segnalazione", "user-view": "Vedi Profilo", "user-edit": "Modifica Profilo", - "notes": "Flag Notes", - "add-note": "Aggiungi nota", + "notes": "Note Segnalazione", + "add-note": "Aggiungi Nota", "no-notes": "Nessuna nota condivisa", - "history": "Cronologia flag", - "back": "Back to Flags List", - "no-history": "Nessuna cronologia flag", + "history": "Cronologia Segnalazione", + "back": "Torna all'elenco Segnalazioni", + "no-history": "Nessuna cronologia segnalazione.", - "state-all": "All states", + "state-all": "Tutti gli stati", "state-open": "Nuovo/Apri", - "state-wip": "Lavori in Corso", + "state-wip": "Lavori in corso", "state-resolved": "Risolto", "state-rejected": "Rifiutato", - "no-assignee": "Non Assegnato", + "no-assignee": "Non assegnato", "note-added": "Nota aggiunta", "modal-title": "Segnala Contenuto Inappropriato", - "modal-body": "Specifica il motivo per cui contrassegnare% 1% 2 per la revisione. In alternativa, utilizza uno dei pulsanti di rapporto rapido, se applicabile.", + "modal-body": "Specifica il motivo per cui contrassegni %1 %2 per la revisione. In alternativa, utilizza uno dei pulsanti di segnalazione rapida, se applicabile.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Offensivo", - "modal-reason-other": "Altro (Specificare di seguito)", - "modal-reason-custom": "Motivazione della segnalazione...", - "modal-submit": "Invia la Segnalazione", - "modal-submit-success": "Il contenuto è stato segnalato.", - "modal-submit-confirm": "Conferma la Segnalazione", - "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-other": "Altro (specifica di seguito)", + "modal-reason-custom": "Motivo per cui segnali questo contenuto...", + "modal-submit": "Invia segnalazione", + "modal-submit-success": "Il contenuto è stato segnalato per la moderazione.", + "modal-submit-confirm": "Conferma richiesta", + "modal-submit-confirm-text": "Hai già specificato un motivo personalizzato. Sei sicuro di voler inviare una segnalazione rapida?", + "modal-submit-confirm-text-help": "L'invio di una segnalazione rapida sovrascrive qualsiasi motivo personalizzato definito." } \ No newline at end of file diff --git a/public/language/it/global.json b/public/language/it/global.json index fc8163e3ad..952890e6c4 100644 --- a/public/language/it/global.json +++ b/public/language/it/global.json @@ -2,42 +2,42 @@ "home": "Home", "search": "Cerca", "buttons.close": "Chiudi", - "403.title": "Accesso Proibito", + "403.title": "Accesso Negato", "403.message": "Sembra tu sia arrivato ad una pagina a cui non hai accesso.", "403.login": "Forse dovresti effettuare l'accesso?", - "404.title": "Non trovato", - "404.message": "Sembra tu sia arrivato ad una pagina che non esiste. Torna alla home page.", + "404.title": "Non Trovato", + "404.message": "Sembra tu sia arrivato ad una pagina che non esiste. Torna alla pagina iniziale.", "500.title": "Errore interno.", "500.message": "Oops! Qualcosa non funziona come si deve!", "400.title": "Richiesta non valida.", - "400.message": "Sembra che questo link sia stato mal formulato, per favore ricontrolla e riprova. Altrimenti ritorna alla home page.", - "register": "Registrazione", - "login": "Login", + "400.message": "Sembra che questo link non sia corretto, per favore ricontrolla e riprova. Altrimenti ritorna alla pagina iniziale.", + "register": "Registrati", + "login": "Accedi", "please_log_in": "Per favore Accedi", "logout": "Logout", - "posting_restriction_info": "L'inserimento è attualmente ristretto ai soli utenti registrati, clicca qui per effettuare l'accesso.", + "posting_restriction_info": "L'inserimento di nuovi post è attualmente limitato ai soli utenti registrati, clicca qui per effettuare l'accesso.", "welcome_back": "Bentornato", - "you_have_successfully_logged_in": "Login avvenuto con successo", - "save_changes": "Salva cambiamenti", + "you_have_successfully_logged_in": "Accesso effettuato con successo", + "save_changes": "Salva Modifiche", "save": "Salva", "close": "Chiudi", - "pagination": "Paginazione", + "pagination": "Impaginazione", "pagination.out_of": "%1 di %2", - "pagination.enter_index": "Inserisci numero", + "pagination.enter_index": "Inserisci un numero di pagina", "header.admin": "Amministratore", "header.categories": "Categorie", "header.recent": "Recenti", "header.unread": "Non letti", - "header.tags": "Tags", + "header.tags": "Tag", "header.popular": "Popolare", "header.users": "Utenti", "header.groups": "Gruppi", - "header.chats": "Messaggi", + "header.chats": "Chat", "header.notifications": "Notifiche", "header.search": "Cerca", "header.profile": "Profilo", "header.navigation": "Navigazione", - "notifications.loading": "Caricamento delle Notifiche", + "notifications.loading": "Caricamento Notifiche", "chats.loading": "Caricamento Messaggi", "motd.welcome": "Benvenuti in NodeBB, la piattaforma di discussione del futuro.", "previouspage": "Pagina Precedente", @@ -62,8 +62,8 @@ "reputation": "Reputazione", "read_more": "per saperne di più", "more": "Altro", - "posted_ago_by_guest": "scritto %1 di Ospite", - "posted_ago_by": "scritto %1 di %2", + "posted_ago_by_guest": "scritto %1 da Ospite", + "posted_ago_by": "scritto %1 da %2", "posted_ago": "postato %1", "posted_in": "postato in %1", "posted_in_by": "postato in %1 da %2", @@ -93,12 +93,12 @@ "unfollow": "Non seguire", "delete_all": "Elimina Tutto", "map": "Mappa", - "sessions": "Sessioni di Login", + "sessions": "Sessioni di accesso", "ip_address": "Indirizzo IP", "enter_page_number": "Inserisci il numero della pagina", "upload_file": "Carica file", "upload": "Carica", - "uploads": "Uploads", + "uploads": "Caricati", "allowed-file-types": "Le estensioni permesse dei file sono %1", "unsaved-changes": "Hai delle modifiche non salvate. Sei sicuro che vuoi lasciare la pagina?", "reconnecting-message": "Sembra che la tua connessione a %1 sia stata persa, per favore attendi mentre proviamo a riconnetterti.", diff --git a/public/language/it/groups.json b/public/language/it/groups.json index 6d5549c0c5..461a0c1c4e 100644 --- a/public/language/it/groups.json +++ b/public/language/it/groups.json @@ -5,55 +5,55 @@ "new_group": "Crea Nuovo Gruppo", "no_groups_found": "Non ci sono gruppi da vedere", "pending.accept": "Accetta", - "pending.reject": "Rigetta", + "pending.reject": "Rifiuta", "pending.accept_all": "Accetta tutti", "pending.reject_all": "Rifiuta tutti", - "pending.none": "Non ci sono membri in attesa", - "invited.none": "Non ci sono inviti in sospeso", + "pending.none": "Non ci sono membri in attesa in questo momento", + "invited.none": "Non ci sono membri invitati in questo momento", "invited.uninvite": "Revoca invito", - "invited.search": "Ricerca un utente da invitare in questo gruppo", - "invited.notification_title": "Sei stato invitato a entrare in %1", + "invited.search": "Cerca un utente da invitare in questo gruppo", + "invited.notification_title": "Sei stato invitato ad unirti a %1", "request.notification_title": "Richiesta di iscrizione al gruppo da %1", - "request.notification_text": "%1 ha richiesto di essere iscritto a %2", + "request.notification_text": "%1 ha chiesto di diventare membro di %2", "cover-save": "Salva", - "cover-saving": "Salvando", + "cover-saving": "Salvataggio", "details.title": "Dettagli Gruppo", "details.members": "Lista Membri", "details.pending": "Membri in attesa", "details.invited": "Membri invitati", - "details.has_no_posts": "I membri di questo gruppo non hanno ancora postato.", + "details.has_no_posts": "I membri di questo gruppo non hanno creato nessun post.", "details.latest_posts": "Ultimi Post", "details.private": "Privato", - "details.disableJoinRequests": "Disabilita le richieste d'adesione", - "details.grant": "Concedi / Rimuovi la Proprietà", + "details.disableJoinRequests": "Disabilita le richieste d'iscrizione", + "details.grant": "Concedi/Revoca la Proprietà", "details.kick": "Espelli", "details.kick_confirm": "Sei sicuro di voler rimuovere questo membro dal gruppo?", "details.add-member": "Aggiungi Membro", - "details.owner_options": "Amministratore del Grupo", + "details.owner_options": "Amministratore Gruppo", "details.group_name": "Nome Gruppo", - "details.member_count": "Totale Membri", - "details.creation_date": "Data di Creazione", + "details.member_count": "Numero Membri", + "details.creation_date": "Data Creazione", "details.description": "Descrizione", - "details.badge_preview": "Anteprima del Badge", + "details.badge_preview": "Anteprima Badge", "details.change_icon": "Cambia Icona", "details.change_colour": "Cambia Colore", - "details.badge_text": "Testo del Badge", - "details.userTitleEnabled": "Visualizza il Badge", + "details.badge_text": "Testo Badge", + "details.userTitleEnabled": "Visualizza Badge", "details.private_help": "Se abilitato, l'ingresso ai gruppi richiede l'approvazione di uno dei proprietari", "details.hidden": "Nascosto", "details.hidden_help": "Se abilitato, questo gruppo non sarà visibile nella lista dei gruppi e gli utenti dovranno essere invitati manualmente", - "details.delete_group": "Elimina il Gruppo", - "details.private_system_help": "I gruppi privati sono disabilitati dal livello del sistema, questa opzione non fa nulla", + "details.delete_group": "Elimina Gruppo", + "details.private_system_help": "I gruppi privati sono disabilitati a livello di sistema, questa opzione non fa nulla", "event.updated": "I dettagli del Gruppo sono stati aggiornati", "event.deleted": "Il gruppo \"%1\" è stato eliminato", "membership.accept-invitation": "Accetta l'invito", "membership.invitation-pending": "Invito in sospeso", - "membership.join-group": "Entra nel Gruppo", + "membership.join-group": "Unisciti al Gruppo", "membership.leave-group": "Lascia il Gruppo", "membership.reject": "Rifiuta", "new-group.group_name": "Nome Gruppo:", - "upload-group-cover": "Carica copertina del gruppo", + "upload-group-cover": "Carica copertina gruppo", "bulk-invite-instructions": "Inserisci una lista di nomi utente da invitare in questo gruppo separati da virgole", - "bulk-invite": "Invita in Massa", + "bulk-invite": "Invito Collettivo", "remove_group_cover_confirm": "Sei sicuro di voler rimuovere l'immagine copertina?" } \ No newline at end of file diff --git a/public/language/it/login.json b/public/language/it/login.json index 1561a8484b..5cd7956463 100644 --- a/public/language/it/login.json +++ b/public/language/it/login.json @@ -6,7 +6,7 @@ "forgot_password": "Password dimenticata?", "alternative_logins": "Accessi Alternativi", "failed_login_attempt": "Tentativo di accesso fallito", - "login_successful": "Sei entrato con successo!", + "login_successful": "Hai effettuato l'accesso con successo!", "dont_have_account": "Non hai un account?", "logged-out-due-to-inactivity": "Sei stato disconnesso dal Pannello di Controllo Amministratore per inattività" } \ No newline at end of file diff --git a/public/language/it/search.json b/public/language/it/search.json index 98170cc032..568d99c165 100644 --- a/public/language/it/search.json +++ b/public/language/it/search.json @@ -8,7 +8,7 @@ "match-words": "Parole corrispondenti", "all": "Tutti", "any": "Nessuno", - "posted-by": "Pubblicato da", + "posted-by": "Postato da", "in-categories": "In Categorie", "search-child-categories": "Cerca nelle sottocategorie", "has-tags": "Ha i tag", @@ -16,7 +16,7 @@ "at-least": "Almeno", "at-most": "Al massimo", "relevance": "Rilevanza", - "post-time": "Ora invio", + "post-time": "Ora Post", "votes": "Votes", "newer-than": "Più nuovi di", "older-than": "Più vecchi di", @@ -43,5 +43,6 @@ "clear-preferences": "Pulisci preferenze", "search-preferences-saved": "Cerca nelle preferenze salvate", "search-preferences-cleared": "Cerca nelle preferenze pulite", - "show-results-as": "Visualizza risultati come" + "show-results-as": "Visualizza risultati come", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/it/topic.json b/public/language/it/topic.json index fbc5737ec3..5f6183de5e 100644 --- a/public/language/it/topic.json +++ b/public/language/it/topic.json @@ -7,7 +7,7 @@ "post_is_deleted": "Questo post è eliminato!", "topic_is_deleted": "Questa discussione è stata eliminata", "profile": "Profilo", - "posted_by": "Pubblicato da: %1", + "posted_by": "Postato da: %1", "posted_by_guest": "Scritto da Ospite", "chat": "Chat", "notify_me": "Ricevi notifiche di nuove risposte in questa discussione", @@ -44,7 +44,7 @@ "markAsUnreadForAll.success": "Discussione segnata come non letta per tutti.", "mark_unread": "Segna come non letto", "mark_unread.success": "Discussione è stata marcata come non letta.", - "watch": "Osserva", + "watch": "Segui", "unwatch": "Non osservare più", "watch.title": "Ricevi notifiche di nuove risposte in questa discussione", "unwatch.title": "Smetti di osservare questa discussione", @@ -62,12 +62,12 @@ "thread_tools.lock": "Blocca Discussione", "thread_tools.unlock": "Sblocca Discussione", "thread_tools.move": "Sposta Discussione", - "thread_tools.move-posts": "Sposta posts", + "thread_tools.move-posts": "Sposta Post", "thread_tools.move_all": "Sposta Tutto", "thread_tools.select_category": "Seleziona Categoria", "thread_tools.fork": "Dividi Discussione", "thread_tools.delete": "Elimina Discussione", - "thread_tools.delete-posts": "Cancella post", + "thread_tools.delete-posts": "Cancella Post", "thread_tools.delete_confirm": "Sei sicuro di voler eliminare questa discussione?", "thread_tools.restore": "Ripristina Discussione", "thread_tools.restore_confirm": "Sei sicuro di voler ripristinare questa discussione?", @@ -118,8 +118,8 @@ "sort_by": "Ordina per", "oldest_to_newest": "Da Vecchi a Nuovi", "newest_to_oldest": "Da Nuovi a Vecchi", - "most_votes": "Sposta dei Voti", - "most_posts": "Sposta dei Posts", + "most_votes": "Più Voti", + "most_posts": "Più Post", "stale.title": "Preferisci creare una nuova discussione?", "stale.warning": "Il topic al quale stai rispondendo è abbastanza vecchio. Vorresti piuttosto creare un nuovo topic in riferimento a questo nella tua risposta?", "stale.create": "Crea una nuova discussione", diff --git a/public/language/it/user.json b/public/language/it/user.json index 86f37b7f5a..40da8fc917 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -41,7 +41,7 @@ "chat": "Chat", "chat_with": "Continua la chat con %1", "new_chat_with": "Inizia una nuova chat con %1", - "flag-profile": "Flag Profilo", + "flag-profile": "Segnala Profilo", "follow": "Segui", "unfollow": "Smetti di seguire", "more": "Altro", @@ -127,9 +127,9 @@ "no-group-title": "Nessun titolo al gruppo", "select-skin": "Seleziona uno Skin", "select-homepage": "Seleziona una Pagina Iniziale", - "homepage": "Pagina iniziale", + "homepage": "Pagina Iniziale", "homepage_description": "Seleziona una pagina da usare come pagina iniziale o \"Nessuna\" per usare quella di default.", - "custom_route": "Percorso della Homepage personalizzato", + "custom_route": "Percorso Pagina Iniziale Personalizzato", "custom_route_help": "Inserisci qui un nome percorso, senza nessuno slash precedente (p.es. \"recent\", o \"popular\")", "sso.title": "Servizi Single-Sign-On", "sso.associated": "Associa con", diff --git a/public/language/ja/admin/advanced/database.json b/public/language/ja/admin/advanced/database.json index dd8ee5aa0f..89ac74de61 100644 --- a/public/language/ja/admin/advanced/database.json +++ b/public/language/ja/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "バイトアウト", "mongo.num-requests": "リクエスト数", "mongo.raw-info": "MongoDBのRaw情報", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redisのバージョン", diff --git a/public/language/ja/admin/general/navigation.json b/public/language/ja/admin/general/navigation.json index f439f7743c..f263418193 100644 --- a/public/language/ja/admin/general/navigation.json +++ b/public/language/ja/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "ツールチップ:", "text": "テキスト:", "text-class": " テキストのClass:任意", + "class": "Class: optional", "id": "ID: 任意", "properties": "プロパティ:", diff --git a/public/language/ja/admin/manage/categories.json b/public/language/ja/admin/manage/categories.json index 86bbd59a31..b0383a5c13 100644 --- a/public/language/ja/admin/manage/categories.json +++ b/public/language/ja/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "カテゴリを選択", "set-parent-category": "親カテゴリとして設定", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": ":特権の設定はすぐに有効になります。これらの設定を調整した後は、カテゴリを保存する必要はありません。", "privileges.section-viewing": "特権の表示", "privileges.section-posting": "権限の譲渡", "privileges.section-moderation": "モデレート特権", + "privileges.section-other": "Other", "privileges.section-user": "ユーザー", "privileges.search-user": "ユーザーを追加", "privileges.no-users": "このカテゴリにはユーザー固有の権限はありません。", diff --git a/public/language/ja/admin/manage/privileges.json b/public/language/ja/admin/manage/privileges.json index 07d0a4de50..0db45acc4b 100644 --- a/public/language/ja/admin/manage/privileges.json +++ b/public/language/ja/admin/manage/privileges.json @@ -1,22 +1,26 @@ { - "global": "Global", - "global.no-users": "No user-specific global privileges.", + "global": "グローバル", + "global.no-users": "ユーザー固有のグローバル特権はありません。", - "chat": "Chat", - "upload-images": "Upload Images", - "upload-files": "Upload Files", - "signature": "Signature", + "chat": "チャット", + "upload-images": "画像をアップロード", + "upload-files": "ファイルをアップロード", + "signature": "署名", "ban": "Ban", - "search-content": "Search Content", - "search-users": "Search Users", - "search-tags": "Search Tags", - "allow-local-login": "Local Login", + "search-content": "コンテンツを検索", + "search-users": "ユーザー検索", + "search-tags": "タグ検索", + "view-users": "ユーザーを表示", + "view-tags": "タグを表示", + "view-groups": "グループを表示", + "allow-local-login": "ローカルログイン", + "allow-group-creation": "グループを作成", - "find-category": "Find Category", - "access-category": "Access Category", - "access-topics": "Access Topics", - "create-topics": "Create Topics", - "reply-to-topics": "Reply to Topics", + "find-category": "カテゴリを検索", + "access-category": "カテゴリにアクセス", + "access-topics": "トピックスにアクセス", + "create-topics": "トピックスを作成", + "reply-to-topics": "トピックスに返信", "tag-topics": "Tag Topics", "edit-posts": "Edit Posts", "view-edit-history": "View Edit History", diff --git a/public/language/ja/admin/settings/group.json b/public/language/ja/admin/settings/group.json index a983f07e9f..24bd3a76ed 100644 --- a/public/language/ja/admin/settings/group.json +++ b/public/language/ja/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "プライベートグループ", "private-groups.help": "有効の場合、グループへの参加はグループ管理人からの承認が必要です。(デフォルト: 有効)", "private-groups.warning": "注意!このオプションが無効で、プライベートグループがある場合、自動的に公開されます。", - "allow-creation": "グループの作成を有効にする", - "allow-creation-help": "有効にすると、ユーザーはグループを作成できます(デフォルト:無効)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "グループ名の最大文字数", + "max-title-length": "Maximum Group Title Length", "cover-image": "グループ表紙イメージ", "default-cover": "デフォルトのカバー画像", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image\n日本語\nアップロードされたカバー画像を持たないグループで、カンマ区切りのデフォルト表紙画像を追加する。" diff --git a/public/language/ja/admin/settings/tags.json b/public/language/ja/admin/settings/tags.json index 08c54008f7..d49f47b16e 100644 --- a/public/language/ja/admin/settings/tags.json +++ b/public/language/ja/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "タグの最小文字数", "max-length": "タグの最大文字数", "goto-manage": "タグ管理ページにアクセスするには、ここをクリックしてください。", - "privacy": "プライバシー", - "list-private": "タグリストを非公開にする", "related-topics": "関連スレッド", "max-related-topics": "表示する関連スレッドの最大数(テーマでサポートされている場合)" } \ No newline at end of file diff --git a/public/language/ja/admin/settings/user.json b/public/language/ja/admin/settings/user.json index 3bb00cd12d..360818e454 100644 --- a/public/language/ja/admin/settings/user.json +++ b/public/language/ja/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Eメールの変更を無効にする", "disable-password-changes": "パスワードの変更を無効にする", "allow-account-deletion": "アカウントが解除されました", - "user-info-private": "ゲストから、ユーザーリストとデータが見えないようにする。", "hide-fullname": "ユーザーから、フルネームが見えないようにする。", "hide-email": "ユーザーから、Emailが見えないようにする。", "themes": "テーマ", diff --git a/public/language/ja/email.json b/public/language/ja/email.json index d8c824666d..ce110507be 100644 --- a/public/language/ja/email.json +++ b/public/language/ja/email.json @@ -24,16 +24,16 @@ "digest.latest_topics": "%1からの新しいスレッド", "digest.cta": "クリックで%1を見る", "digest.unsub.info": "このまとめはあなたの購読設定により送られました。", - "digest.no_topics": "%1にはアクティブなスレッドがありません。", "digest.day": "日", "digest.week": "週", "digest.month": "月", "digest.subject": "%1のダイジェスト", + "digest.title": "Your Daily Digest", "notif.chat.subject": "%1さんからの新しいチャットメッセージがあります。", "notif.chat.cta": "クリックして会話を続ける", "notif.chat.unsub.info": "このチャットの通知はあなたの購読設定により送られました。", "notif.post.cta": "ここをクリックして全て読みます", - "notif.post.unsub.info": "この投稿の通知はあなたの申し込み設定により送られました。", + "notif.post.unsub.info": "この投稿の通知はあなたの購読設定により送られました。", "notif.cta": "Click here to go to forum", "test.text1": "このメールはNodeBBのメーラー(emailer)が正しく設定されているか確認をするためのメールです。", "unsub.cta": "ここをクリックして設定を変更する", diff --git a/public/language/ja/error.json b/public/language/ja/error.json index d96468198f..fd0947599c 100644 --- a/public/language/ja/error.json +++ b/public/language/ja/error.json @@ -33,6 +33,7 @@ "username-too-short": "ユーザー名が短すぎます", "username-too-long": "ユーザー名が長すぎます", "password-too-long": "パスワードが長すぎます", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "ユーザーは停止されています", "user-banned-reason": "申し訳ありませんが、このアカウントは停止されています。 (理由: %1)", "user-banned-reason-until": "申し訳ありませんが、このアカウントは%1(理由:%2)まで禁止されています。", diff --git a/public/language/ja/flags.json b/public/language/ja/flags.json index d464cf6ef6..8dade9b6b6 100644 --- a/public/language/ja/flags.json +++ b/public/language/ja/flags.json @@ -9,6 +9,7 @@ "updated": "更新されました", "target-purged": "このフラグが参照しているコンテンツは切り離されており、利用できません。", + "graph-label": "Daily Flags", "quick-filters": "クイックフィルター", "filter-active": "このフラグのリストには1つまたは複数のフィルタが有効です。", "filter-reset": "フィルターを削除", diff --git a/public/language/ja/search.json b/public/language/ja/search.json index c4870d1d4c..22158c06f6 100644 --- a/public/language/ja/search.json +++ b/public/language/ja/search.json @@ -43,5 +43,6 @@ "clear-preferences": "設定をクリア", "search-preferences-saved": "検索設定は保存されました", "search-preferences-cleared": "検索設定をクリア", - "show-results-as": "結果を表示" + "show-results-as": "結果を表示", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/ko/admin/advanced/database.json b/public/language/ko/admin/advanced/database.json index 9504b749de..5e4fe5427c 100644 --- a/public/language/ko/admin/advanced/database.json +++ b/public/language/ko/admin/advanced/database.json @@ -22,12 +22,13 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis 버젼", "redis.keys": "Keys", "redis.expires": "Expires", - "redis.avg-ttl": "Average TTL", + "redis.avg-ttl": "평균 TTL", "redis.connected-clients": "연결된 클라이언트", "redis.connected-slaves": "연결된 slaves", "redis.blocked-clients": "차단된 클라이언트", diff --git a/public/language/ko/admin/advanced/errors.json b/public/language/ko/admin/advanced/errors.json index af520c8d00..635cd74431 100644 --- a/public/language/ko/admin/advanced/errors.json +++ b/public/language/ko/admin/advanced/errors.json @@ -1,6 +1,6 @@ { "figure-x": "그림 %1", - "error-events-per-day": "하루당 %1개의 이벤트 ", + "error-events-per-day": "%1 이벤트의 일 개수", "error.404": "404 찾을 수 없음", "error.503": "503 서비스를 사용할 수 없음", "manage-error-log": "오류 로그 관리", diff --git a/public/language/ko/admin/general/navigation.json b/public/language/ko/admin/general/navigation.json index 360b15d596..9adb375c75 100644 --- a/public/language/ko/admin/general/navigation.json +++ b/public/language/ko/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "툴팁:", "text": "텍스트:", "text-class": "텍스트 클래스: 선택 사항", + "class": "Class: optional", "id": "ID: 선택 사항", "properties": "속성:", diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 6e80d12e2b..a20e89fbcc 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "게시판 선택", "set-parent-category": "상위 게시판 설정", - "privileges.description": "이 섹션에서 이 카테고리에 대한 접근 제어 권한을 구성 할 수 있습니다. 권한은 사용자별 또는 그룹별로 부여 할 수 있습니다. 아래 드롭 다운에서 적용하고자 하는 도메인을 선택하십시오.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "다음에 대한 권한 구성", "privileges.warning": "참고: 권한 설정은 즉시 적용됩니다. 설정을 변경한 후 게시판을 따로 저장할 필요가 없습니다.", "privileges.section-viewing": "권한 보기", "privileges.section-posting": "게시물 작성 권한", "privileges.section-moderation": "(준)관리자 권한", + "privileges.section-other": "Other", "privileges.section-user": "사용자", "privileges.search-user": "사용자 추가", "privileges.no-users": "이 게시판에는 사용자 별 권한이 없습니다.", diff --git a/public/language/ko/admin/manage/privileges.json b/public/language/ko/admin/manage/privileges.json index 25b734b39b..62d138927d 100644 --- a/public/language/ko/admin/manage/privileges.json +++ b/public/language/ko/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "콘텐츠 검색", "search-users": "사용자 검색", "search-tags": "태그 검색", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "로컬 로그인", + "allow-group-creation": "Group Create", "find-category": "카테고리 찾기", "access-category": "카테고리 접근", diff --git a/public/language/ko/admin/manage/tags.json b/public/language/ko/admin/manage/tags.json index 8e0fde510d..2f744a3ca3 100644 --- a/public/language/ko/admin/manage/tags.json +++ b/public/language/ko/admin/manage/tags.json @@ -6,7 +6,7 @@ "description": "태그를 클릭하거나 드래그해서 선택하고, Shift 를 눌러 다중 선택하세요.", "create": "태그 생성", "modify": "태그 수정", - "rename": "Rename Tags", + "rename": "태그 이름 바꾸기", "delete": "선택된 태그 삭제", "search": "태그 검색", "settings": "태그 설정 페이지를 방문하시려면 클릭하세요", diff --git a/public/language/ko/admin/manage/users.json b/public/language/ko/admin/manage/users.json index e81fb03392..3231cb4727 100644 --- a/public/language/ko/admin/manage/users.json +++ b/public/language/ko/admin/manage/users.json @@ -45,7 +45,7 @@ "users.username": "사용자명", "users.email": "이메일", "users.postcount": "글 개수", - "users.reputation": "등급", + "users.reputation": "평판", "users.flags": "신고", "users.joined": "가입됨", "users.last-online": "마지막 로그인", @@ -72,14 +72,14 @@ "alerts.flag-reset-success": "신고가 리셋됐습니다!", "alerts.no-remove-yourself-admin": "관리자이기 때문에 본인을 삭제할 수 없습니다!", "alerts.make-admin-success": "이 사용자는 이제 최고관리자 입니다.", - "alerts.confirm-remove-admin": "Do you really want to remove this administrator?", - "alerts.remove-admin-success": "User is no longer administrator.", - "alerts.make-global-mod-success": "User is now global moderator.", + "alerts.confirm-remove-admin": "정말 이 관리자를 삭제하시겠습니까?", + "alerts.remove-admin-success": "사용자는 더이상 관리자가 아닙니다.", + "alerts.make-global-mod-success": "사용자는 이제 전역 중재자입니다.", "alerts.confirm-remove-global-mod": "Do you really want to remove this global moderator?", - "alerts.remove-global-mod-success": "User is no longer global moderator.", - "alerts.make-moderator-success": "User is now moderator.", - "alerts.confirm-remove-moderator": "Do you really want to remove this moderator?", - "alerts.remove-moderator-success": "User is no longer moderator.", + "alerts.remove-global-mod-success": "사용자는 더이상 전역 중재자가 아닙니다.", + "alerts.make-moderator-success": "사용자는 이제 중재자입니다.", + "alerts.confirm-remove-moderator": "정말 이 중재자를 삭제하시겠습니까?", + "alerts.remove-moderator-success": "사용자는 더이상 중재자가 아닙니다.", "alerts.confirm-validate-email": "이 사용자(들)의 이메일을 인증하시겠습니까?", "alerts.validate-email-success": "이메일 인증됨", "alerts.password-reset-confirm": "이 사용자(들)에게 패스워드 리셋 이메일을 보내시겠습니까?", diff --git a/public/language/ko/admin/menu.json b/public/language/ko/admin/menu.json index e2c30adbaf..92fad72ac5 100644 --- a/public/language/ko/admin/menu.json +++ b/public/language/ko/admin/menu.json @@ -21,10 +21,10 @@ "section-settings": "설정", "settings/general": "일반", - "settings/reputation": "등급", + "settings/reputation": "평판", "settings/email": "이메일", "settings/user": "사용자", - "settings/group": "룹", + "settings/group": "그룹", "settings/guest": "미가입 사용자", "settings/uploads": "로드", "settings/post": "글", @@ -42,7 +42,7 @@ "section-appearance": "스타일", "appearance/themes": "테마", "appearance/skins": "스킨", - "appearance/customise": "사용자 정의 콘텐츠 ((HTML/JS/CSS)", + "appearance/customise": "사용자 정의 콘텐츠 (HTML/JS/CSS)", "section-extend": "추가 기능", "extend/plugins": "플러그인", diff --git a/public/language/ko/admin/settings/advanced.json b/public/language/ko/admin/settings/advanced.json index 5896bb26e6..576ff41fe5 100644 --- a/public/language/ko/admin/settings/advanced.json +++ b/public/language/ko/admin/settings/advanced.json @@ -13,7 +13,7 @@ "headers.acam": "Access-Control-Allow-Methods", "headers.acah": "Access-Control-Allow-Headers", "hsts": "Strict Transport Security", - "hsts.enabled": "Enabled HSTS (recommended)", + "hsts.enabled": "HSTS 활성화 (권장)", "hsts.subdomains": "Include subdomains in HSTS header", "hsts.preload": "Allow preloading of HSTS header", "hsts.help": "If enabled, an HSTS header will be set for this site. You can elect to include subdomains and preloading flags in your header. If in doubt, you can leave these unchecked. More information ", diff --git a/public/language/ko/admin/settings/general.json b/public/language/ko/admin/settings/general.json index 4c4c5cdcb0..3b30ac4167 100644 --- a/public/language/ko/admin/settings/general.json +++ b/public/language/ko/admin/settings/general.json @@ -2,8 +2,8 @@ "site-settings": "사이트 관리", "title": "사이트 제목", "title.url": "URL", - "title.url-placeholder": "The URL of the site title", - "title.url-help": "When the title is clicked, send users to this address. If left blank, user will be sent to the forum index.", + "title.url-placeholder": "사이트 제목의 URL", + "title.url-help": "제목을 클릭하면 사용자가 이 주소로 이동합니다. 비워두면 사용자가 포럼 인덱스로 이동합니다.", "title.name": "커뮤니티 이름", "title.show-in-header": "헤더에 사이트 제목 표시", "browser-title": "브라우저 타이틀", diff --git a/public/language/ko/admin/settings/group.json b/public/language/ko/admin/settings/group.json index fff7c623b0..593a68487f 100644 --- a/public/language/ko/admin/settings/group.json +++ b/public/language/ko/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "비공개 그룹", "private-groups.help": " 활성화 되어있다면 그룹에 가입하는 것은 그룹 관리자의 허가를 필요로 합니다. (기본 설정: 활성화)", "private-groups.warning": "주의 이 옵션이 비활성화 돼있고 당신에게 비공개 그룹이 있다면 그 그룹들은 모두 공개로 전환될 것입니다.", - "allow-creation": "그룹 생성 허용", - "allow-creation-help": "활성화 돼있다면 유저가 그룹을 생성할 수 있습니다. (기본: 비활성화)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "그룹 명 최대 길이", + "max-title-length": "Maximum Group Title Length", "cover-image": "그룹 커버 사진", "default-cover": "기본 커버 사진", "default-cover-help": "기본 커버 사진 목록을 콤마(,) 로 구분지어 입력해 주세요. " diff --git a/public/language/ko/admin/settings/post.json b/public/language/ko/admin/settings/post.json index 7d3cea3e49..30973373a9 100644 --- a/public/language/ko/admin/settings/post.json +++ b/public/language/ko/admin/settings/post.json @@ -3,14 +3,14 @@ "sorting.post-default": "기본 포스트 정렬", "sorting.oldest-to-newest": "오래된 순", "sorting.newest-to-oldest": "최신 순", - "sorting.most-votes": "추천수 순으로 정렬", - "sorting.most-posts": "Most Posts", + "sorting.most-votes": "투표수 순", + "sorting.most-posts": "게시글 개수 순", "sorting.topic-default": "게시물 정렬기준 기본값", - "length": "Post Length", + "length": "게시글 길이", "restrictions": "글 작성 제약사항", - "restrictions-new": "New User Restrictions", + "restrictions-new": "신규 사용자 제한", "restrictions.post-queue": "게시 대기열 사용", - "restrictions-new.post-queue": "Enable new user restrictions", + "restrictions-new.post-queue": "신규 사용자 제한 활성화", "restrictions.post-queue-help": "게시 대기열을 사용하면 사용자의 게시물이 대기열에 넣어집니다.", "restrictions-new.post-queue-help": "Enabling new user restrictions will set restrictions on posts created by new users.", "restrictions.seconds-between": "Seconds between posts", @@ -50,5 +50,5 @@ "composer.custom-help": "사용자 설정 \"도움말\" 내용", "ip-tracking": "IP 추적", "ip-tracking.each-post": "모든 글의 IP 주소 추적", - "enable-post-history": "Enable Post History" + "enable-post-history": "게시글 기록 활성화" } \ No newline at end of file diff --git a/public/language/ko/admin/settings/tags.json b/public/language/ko/admin/settings/tags.json index d07917070b..8ae7a7779c 100644 --- a/public/language/ko/admin/settings/tags.json +++ b/public/language/ko/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "태그 최소 길이", "max-length": "태그 최대 길이", "goto-manage": "태그 관리 페이지를 방문하시려면 클릭하세요", - "privacy": "개인 정보 보호", - "list-private": "태그 리스트를 개인만 볼 수 있게 바꿉니다.", "related-topics": "관련된 주제들", "max-related-topics": "테마가 지원하는 보여질 관련된 주제들의 최대 개수" } \ No newline at end of file diff --git a/public/language/ko/admin/settings/uploads.json b/public/language/ko/admin/settings/uploads.json index 04162a1067..edf8d7e8de 100644 --- a/public/language/ko/admin/settings/uploads.json +++ b/public/language/ko/admin/settings/uploads.json @@ -2,8 +2,8 @@ "posts": "게시물", "allow-files": "사용자가 (이미지가 아닌) 일반 파일을 업로드하는것을 허용", "private": "업로드된 파일들을 개인만 볼 수 있게 바꿉니다.", - "private-extensions": "File extensions to make private", - "private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. pdf,xls,doc). An empty list means all files are private.", + "private-extensions": "파일 확장자를 비밀로 만들기", + "private-uploads-extensions-help": "여기에서 비공개로 설정하려면 쉼표로 구분 된 파일 확장명 목록을 입력하세요. (예: pdf, xls, doc). 빈 목록은 모든 파일이 비공개임을 의미합니다.", "resize-image-width-threshold": "Resize images if they are wider than specified width", "resize-image-width-threshold-help": "(in pixels, default: 1520 pixels, set to 0 to disable)", "resize-image-width": "Resize images down to specified width", @@ -11,7 +11,7 @@ "resize-image-quality": "Quality to use when resizing images", "resize-image-quality-help": "Use a lower quality setting to reduce the file size of resized images.", "max-file-size": "최대 파일 사이즈(KB)", - "max-file-size-help": "(in kibibytes, default: 2048 KiB)", + "max-file-size-help": "(키비바이트로, 기본: 2048 KiB)", "reject-image-width": "Maximum Image Width (in pixels)", "reject-image-width-help": "Images wider than this value will be rejected.", "reject-image-height": "Maximum Image Height (in pixels)", @@ -28,9 +28,9 @@ "profile-image-dimension": "프로필 사진 규격", "profile-image-dimension-help": "(단위: 픽셀, 기본값: 128 픽셀)", "max-profile-image-size": "프로필 사진 최대 크기", - "max-profile-image-size-help": "(in kibibytes, default: 256 KiB)", + "max-profile-image-size-help": "(키비바이트로, 기본: 256 KiB)", "max-cover-image-size": "커버 사진 최대 크기", - "max-cover-image-size-help": "(in kibibytes, default: 2,048 KiB)", + "max-cover-image-size-help": "(키비바이트로, 기본: 2,048 KiB)", "keep-all-user-images": "이전 프로필 사진과 커버 사진 서버에 저장", "profile-covers": "프로필 커버 사진", "default-covers": "기본 커버 사진", diff --git a/public/language/ko/admin/settings/user.json b/public/language/ko/admin/settings/user.json index 19ff1c4711..0ec8ae4754 100644 --- a/public/language/ko/admin/settings/user.json +++ b/public/language/ko/admin/settings/user.json @@ -1,35 +1,34 @@ { "authentication": "로그인", "require-email-confirmation": "이메일 인증 필수화", - "email-confirm-interval": "다음의 경우 사용자는 인증 이메일을 재전송할 수 없습니다:", - "email-confirm-email2": "분 후", + "email-confirm-interval": "사용자는", + "email-confirm-email2": "분이 지나기 전까지 확인 메일을 다시 보낼수 없습니다", "allow-login-with": "로그인 허용 수단", "allow-login-with.username-email": "사용자명 또는 이메일", "allow-login-with.username": "사용자명", "allow-login-with.email": "이메일", "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.", + "gdpr_enabled": "GDPR 동의 수집 활성화", + "gdpr_enabled_help": "활성화하면, 모든 새 가입자는 General Data Protection Regulation (GDPR) 하의 데이터 수집 및 사용에 대한 동의를 명시적으로 하도록 요구될 것입니다. 참고: GDPR을 활성화하는 것은 이전에 존재한 사용자에게 동의를 하도록 강제하지 않습니다. 그렇게 하려면, GDPR 플러그인을 설치해야 합니다.", "disable-username-changes": "사용자명 변경 비활성화", "disable-email-changes": "이메일 주소 변경 비활성화", "disable-password-changes": "패스워드 변경 비활성화", "allow-account-deletion": "계정 삭제 허용", - "user-info-private": "Hide user list and data from guests", - "hide-fullname": "Hide fullname from users", - "hide-email": "Hide email from users", + "hide-fullname": "사용자에게서 이름 숨기기", + "hide-email": "사용자에게서 이메일 숨기기", "themes": "테마", "disable-user-skins": "일반 사용자가 스킨 지정 금지", "account-protection": "계정 보호", - "admin-relogin-duration": "Admin relogin duration (minutes)", + "admin-relogin-duration": "관리자 재 로그인 지속 시간 (분)", "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-help": "사용자의 로그인 시도가 이 횟수제한을 초과하면 정해진 시간만큼 해당 계정이 잠깁니다.", "lockout-duration": "계정 잠금 기간 (분)", - "login-days": "사용자 로그인 세션 유지 기간 (일)", + "login-days": "사용자 로그인 세션 유지일", "password-expiry-days": "주기적으로 패스워드 리셋", - "session-time": "Session Time", - "session-time-days": "Days", - "session-time-seconds": "Seconds", + "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.", @@ -70,9 +69,9 @@ "email-post-notif": "내가 구독한 주제에 답글이 달리면 메일 보내기", "follow-created-topics": "작성한 게시물 팔로우", "follow-replied-topics": "답글 단 게시물을 팔로우", - "default-notification-settings": "Default notification settings", - "categoryWatchState": "Default category watch state", - "categoryWatchState.watching": "Watching", - "categoryWatchState.notwatching": "Not Watching", - "categoryWatchState.ignoring": "Ignoring" + "default-notification-settings": "기본 알림 설정", + "categoryWatchState": "기본 카테고리 주시 상태", + "categoryWatchState.watching": "주시하기", + "categoryWatchState.notwatching": "주시하지 않기", + "categoryWatchState.ignoring": "무시하기" } \ No newline at end of file diff --git a/public/language/ko/category.json b/public/language/ko/category.json index f8ac18a799..b085e16432 100644 --- a/public/language/ko/category.json +++ b/public/language/ko/category.json @@ -10,7 +10,7 @@ "watch": "관심 주제", "ignore": "관심 해제", "watching": "관심있음", - "not-watching": "Not Watching", + "not-watching": "주시하지 않기", "ignoring": "무시하기", "watching.description": "읽지 않은 글 및 최근 글 보기", "not-watching.description": "읽지 않은 글 및 최근 글 보지 않기", diff --git a/public/language/ko/email.json b/public/language/ko/email.json index b08137e554..ce2189bf26 100644 --- a/public/language/ko/email.json +++ b/public/language/ko/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "%1의 최근 주제", "digest.cta": "%1에 방문하시려면 클릭하세요.", "digest.unsub.info": "이 대화는 사용자의 구독 설정에 따라 전송되었습니다.", - "digest.no_topics": "%1 동안 활성화된 주제가 없습니다.", "digest.day": "일", "digest.week": "주", "digest.month": "월", "digest.subject": "%1님을 위한 다이제스트", + "digest.title": "Your Daily Digest", "notif.chat.subject": "%1님이 대화 메시지를 보냈습니다.", "notif.chat.cta": "대화를 계속하려면 여기를 클릭하세요.", "notif.chat.unsub.info": "이 대화 알림은 사용자의 구독 설정에 따라 전송되었습니다.", diff --git a/public/language/ko/error.json b/public/language/ko/error.json index b4504edde5..59700ebe68 100644 --- a/public/language/ko/error.json +++ b/public/language/ko/error.json @@ -28,11 +28,12 @@ "email-not-confirmed-email-sent": "아직 이메일이 인증되지 않았습니다. 메일함을 확인 해주세요.", "no-email-to-confirm": "이메일 인증이 필요합니다. 이곳을 클릭하여 이메일 입력하세요.", "email-confirm-failed": "이메일 인증이 실패하였습니다. 잠시 후에 다시 시도하세요.", - "confirm-email-already-sent": "인증 메일이 이미 발송되었습니다. %1 분 이후에 재 발송이 가능합니다.", + "confirm-email-already-sent": "확인 메일이 이미 발송되었습니다. 다시 보내려면 %1 분을 기다리세요.", "sendmail-not-found": "Sendmail 실행파일을 찾을 수 없었습니다. 사용자가 sendmail을 설치했고 실행 가능한지 확인해 주시기 바랍니다.", "username-too-short": "사용자 이름이 너무 짧습니다.", "username-too-long": "사용자 이름이 너무 깁니다.", "password-too-long": "패스워드가 너무 깁니다.", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "차단된 사용자입니다.", "user-banned-reason": "죄송합니다. 해당 계정은 차단되었습니다. (사유: %1)", "user-banned-reason-until": "죄송합니다. 해당 계정은 %1 까지 차단되었습니다. (사유: %2)", @@ -117,15 +118,15 @@ "cant-edit-chat-message": "이 메세지를 수정 할 권한이 없습니다.", "cant-remove-last-user": "마지막 사용자를 삭제할 수 없습니다.", "cant-delete-chat-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-edit-duration-expired": "채팅 메시지를 게시한 뒤 %1초 뒤부터 메시지를 수정할 수 있습니다.", + "chat-delete-duration-expired": "채팅 메시지를 게시한 뒤 %1초 뒤부터 삭제가 가능합니다.", "chat-deleted-already": "이미 삭제된 대화 메시지입니다.", "chat-restored-already": "이 채팅 메시지는 이미 복원되었습니다.", "already-voting-for-this-post": "이미 이 포스트에 투표하셨습니다.", - "reputation-system-disabled": "인지도 시스템이 비활성 상태입니다.", + "reputation-system-disabled": "평판 시스템이 비활성화되어있습니다.", "downvoting-disabled": "비추천 기능이 비활성 상태입니다.", "not-enough-reputation-to-downvote": "인지도가 낮아 이 포스트를 비추천할 수 없습니다.", - "not-enough-reputation-to-flag": "인지도가 낮아 이 포스트를 신고할 수 없습니다.", + "not-enough-reputation-to-flag": "평판이 낮아 이 포스트를 신고할 수 없습니다.", "not-enough-reputation-min-rep-website": "인지도가 낮아 웹사이트를 추가 할 수 없습니다.", "not-enough-reputation-min-rep-aboutme": "인지도가 낮아 자기소개를 추가 할 수 없습니다.", "not-enough-reputation-min-rep-signature": "인지도가 낮아 서명을 추가 할 수 없습니다.", @@ -138,7 +139,7 @@ "parse-error": "서버로 부터의 응답을 읽는 동안 문제가 발생했습니다.", "wrong-login-type-email": "이메일 주소를 통해 로그인하세요.", "wrong-login-type-username": "사용자명을 통해 로그인하세요.", - "sso-registration-disabled": "Registration has been disabled for %1 accounts, please register with an email address first", + "sso-registration-disabled": "%1 계정의 가입이 비활성화되었습니다. 이메일 주소로 먼저 가입하세요.", "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": "초대 한도 만큼의 사용자를 초대했습니다. (%2명 중 %1을 초대)", "no-session-found": "로그인 세션을 찾을 수 없습니다.", diff --git a/public/language/ko/flags.json b/public/language/ko/flags.json index 6804d4f59a..972fcf645b 100644 --- a/public/language/ko/flags.json +++ b/public/language/ko/flags.json @@ -9,6 +9,7 @@ "updated": "업데이트 되었습니다.", "target-purged": "해당 신고된 컨텐츠는 완전 삭제 되었으며, 더이상 존재하지 않습니다.", + "graph-label": "Daily Flags", "quick-filters": "간편 필터", "filter-active": "적용된 하나 이상의 필터가 있습니다.", "filter-reset": "필터 제거", diff --git a/public/language/ko/language.json b/public/language/ko/language.json index f052cb6449..4e3a5a6ef7 100644 --- a/public/language/ko/language.json +++ b/public/language/ko/language.json @@ -1,5 +1,5 @@ { - "name": "영어 (영국/캐나다)", + "name": "한국어 (대한민국)", "code": "ko", "dir": "ltr" } \ No newline at end of file diff --git a/public/language/ko/modules.json b/public/language/ko/modules.json index 31846c1a3a..b258d85c21 100644 --- a/public/language/ko/modules.json +++ b/public/language/ko/modules.json @@ -1,5 +1,5 @@ { - "chat.chatting_with": "Chat with", + "chat.chatting_with": "대화하기", "chat.placeholder": "메시지를 여기에 입력한 후 엔터를 눌러 전송하세요.", "chat.send": "전송", "chat.no_active": "활성화된 채팅이 없습니다.", @@ -21,16 +21,16 @@ "chat.three_months": "3개월", "chat.delete_message_confirm": "이 메세지를 삭제 하시겠습니까?", "chat.retrieving-users": "Retrieving users...", - "chat.manage-room": "Manage Chat Room", + "chat.manage-room": "대화방 관리", "chat.add-user-help": "Search for users here. When selected, the user will be added to the chat. The new user will not be able to see chat messages written before they were added to the conversation. Only room owners () may remove users from chat rooms.", "chat.confirm-chat-with-dnd-user": "이 사용자는 자신의 상태를 DnD (방해금지)로 설정했습니다. 그래도 대화를 요청 하시겠습니까?", "chat.rename-room": "방 이름 바꾸기", "chat.rename-placeholder": "여기에 방명을 입력하십시오", "chat.rename-help": "The room name set here will be viewable by all participants in the room.", "chat.leave": "채팅에서 나가기", - "chat.leave-prompt": "Are you sure you wish to leave this chat?", + "chat.leave-prompt": "정말로 이 채팅에서 나가시겠어요?", "chat.leave-help": "Leaving this chat will remove you from future correspondence in this chat. If you are re-added in the future, you will not see any chat history from prior to your re-joining.", - "chat.in-room": "In this room", + "chat.in-room": "이 방에서", "chat.kick": "추방", "chat.show-ip": "IP 보이기", "chat.owner": "방 소유자", diff --git a/public/language/ko/notifications.json b/public/language/ko/notifications.json index b9b7954075..ebe767bddc 100644 --- a/public/language/ko/notifications.json +++ b/public/language/ko/notifications.json @@ -56,9 +56,9 @@ "notificationType_follow": "누군가 사용자님을 팔로우 하면", "notificationType_new-chat": "채팅 메시지를 받으면", "notificationType_group-invite": "그룹 초대를 받으면", - "notificationType_group-request-membership": "When someone requests to join a group you own", + "notificationType_group-request-membership": "누군가가 당신이 소유한 그룹에 참여를 요청했을 때", "notificationType_new-register": "When someone gets added to registration queue", - "notificationType_post-queue": "When a new post is queued", + "notificationType_post-queue": "새로운 게시글이 등록되었을 때", "notificationType_new-post-flag": "게시글이 신고되면", "notificationType_new-user-flag": "사용자가 신고되면" } \ No newline at end of file diff --git a/public/language/ko/reset_password.json b/public/language/ko/reset_password.json index 7b32496822..d018692d66 100644 --- a/public/language/ko/reset_password.json +++ b/public/language/ko/reset_password.json @@ -9,7 +9,7 @@ "repeat_password": "패스워드 확인", "enter_email": "이메일 주소를 입력하면 패스워드를 재설정하는 방법을 메일로 알려드립니다.", "enter_email_address": "이메일 주소를 입력하세요.", - "password_reset_sent": "A password reset email has been sent to the specified address. Please note that only one email will be sent per minute.", + "password_reset_sent": "비밀번호 재설정 이메일이 입력한 이메일로 전송되었습니다. 1분에 한 개의 이메일만 보내질 것이라는 점을 참고해주세요.", "invalid_email": "올바르지 않거나 가입되지 않은 이메일입니다.", "password_too_short": "입력한 패스워드가 너무 짧습니다, 다시 입력하세요.", "passwords_do_not_match": "패스워드와 패스워드 확인이 일치하지 않습니다.", diff --git a/public/language/ko/search.json b/public/language/ko/search.json index 10624186c3..f16b4f542a 100644 --- a/public/language/ko/search.json +++ b/public/language/ko/search.json @@ -5,9 +5,9 @@ "in": "검색 기준", "titles": "제목", "titles-posts": "제목과 내용", - "match-words": "Match words", - "all": "All", - "any": "Any", + "match-words": "일치하는 단어 순", + "all": "전체", + "any": "아무거나", "posted-by": "작성자", "in-categories": "게시판 지정", "search-child-categories": "하위 게시판도 검색", @@ -17,7 +17,7 @@ "at-most": "최대", "relevance": "관련도", "post-time": "작성시간", - "votes": "Votes", + "votes": "추천", "newer-than": "이전", "older-than": "이후", "any-date": "모든 시간", @@ -31,7 +31,7 @@ "sort-by": "정렬 기준", "last-reply-time": "마지막으로 답글이 달린 시간", "topic-title": "게시물 제목", - "topic-votes": "Topic votes", + "topic-votes": "게시물 투표", "number-of-replies": "답글 수", "number-of-views": "조회 수", "topic-start-date": "게시물이 작성된 날짜", @@ -43,5 +43,6 @@ "clear-preferences": "설정 초기화", "search-preferences-saved": "검색 설정이 저장되었습니다.", "search-preferences-cleared": "검색 설정이 초기화되었습니다.", - "show-results-as": "검색결과 표시방법" + "show-results-as": "검색결과 표시방법", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/ko/topic.json b/public/language/ko/topic.json index ec9759b160..29b9983303 100644 --- a/public/language/ko/topic.json +++ b/public/language/ko/topic.json @@ -30,12 +30,12 @@ "locked": "잠긴 게시물", "pinned": "고정된 게시물", "moved": "이동된 게시물", - "copy-ip": "Copy IP", - "ban-ip": "Ban IP", - "view-history": "Edit History", + "copy-ip": "IP 복사", + "ban-ip": "IP 차단", + "view-history": "편집 기록", "bookmark_instructions": "이 스레드에서 읽은 마지막 포스트로 이동하시려면 여기를 클릭 하세요.", "flag_title": "이 포스트를 신고", - "merged_message": "This topic has been merged into %2", + "merged_message": "이 게시물은 %2(으)로 병합되었습니다", "deleted_message": "이 게시물은 삭제됐습니다. 게시물 관리 권한이 있는 사용자만 볼 수 있습니다.", "following_topic.message": "이제 이 게시물에 새 답글이 달리면 알림을 받습니다.", "not_following_topic.message": "이 게시물을 아직 읽지 않은 게시물 목록에서 볼 수 있지만, 이 주제에 달린 포스트에 대해서는 알림을 받지 않습니다.", @@ -96,7 +96,7 @@ "fork_pid_count": "%1 개의 포스트(들)이 선택되었습니다", "fork_success": "게시물이 분리되었습니다! 분리된 게시물을 보려면 여기를 클릭 하세요.", "delete_posts_instruction": "삭제할 포스트를 선택하세요.", - "merge_topics_instruction": "Click the topics you want to merge", + "merge_topics_instruction": "병합할 게시물을 클릭하세요", "move_posts_instruction": "Click the posts you want to move", "composer.title_placeholder": "게시물 제목을 입력하세요.", "composer.handle_placeholder": "이름", @@ -118,8 +118,8 @@ "sort_by": "정렬 기준", "oldest_to_newest": "오래된 순으로 정렬", "newest_to_oldest": "최신 순으로 정렬", - "most_votes": "Most Votes", - "most_posts": "Most Posts", + "most_votes": "투표수 순", + "most_posts": "게시글 개수 순", "stale.title": "새로운 게시물을 생성 하시겠습니까?", "stale.warning": "현재 답글을 작성중인 게시물은 오래전에 작성 되었습니다. 새로 게시물을 생성하시고 이 게시물을 인용 하시겠습니까?", "stale.create": "새로운 게시물 작성", @@ -127,7 +127,7 @@ "link_back": "답글: [%1](%2)", "diffs.title": "글 수정 기록", "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.no-revisions-description": "이 게시글에는 %1번의 수정이 있습니다.", "diffs.current-revision": "현재 리비젼", "diffs.original-revision": "원래의 리비젼" } \ No newline at end of file diff --git a/public/language/ko/user.json b/public/language/ko/user.json index 83e2946fcd..44c7987797 100644 --- a/public/language/ko/user.json +++ b/public/language/ko/user.json @@ -23,12 +23,12 @@ "lastonline": "최근 온라인 시점", "profile": "프로필", "profile_views": "프로필 조회 수", - "reputation": "등급", + "reputation": "평판", "bookmarks": "즐겨찾기", "watched_categories": "주시중인 카테고리", "watched": "관심있는 게시물", "ignored": "무시됨", - "default-category-watch-state": "Default category watch state", + "default-category-watch-state": "기본 카테고리 주시 상태", "followers": "팔로워", "following": "팔로잉", "blocks": "차단", diff --git a/public/language/lt/admin/advanced/database.json b/public/language/lt/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/lt/admin/advanced/database.json +++ b/public/language/lt/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/lt/admin/general/navigation.json b/public/language/lt/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/lt/admin/general/navigation.json +++ b/public/language/lt/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/lt/admin/manage/categories.json b/public/language/lt/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/lt/admin/manage/categories.json +++ b/public/language/lt/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/lt/admin/manage/privileges.json b/public/language/lt/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/lt/admin/manage/privileges.json +++ b/public/language/lt/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/lt/admin/settings/group.json b/public/language/lt/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/lt/admin/settings/group.json +++ b/public/language/lt/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/lt/admin/settings/tags.json b/public/language/lt/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/lt/admin/settings/tags.json +++ b/public/language/lt/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/lt/admin/settings/user.json b/public/language/lt/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/lt/admin/settings/user.json +++ b/public/language/lt/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/lt/email.json b/public/language/lt/email.json index a95806010e..344b9cebfc 100644 --- a/public/language/lt/email.json +++ b/public/language/lt/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Paskutinės temos iš %1", "digest.cta": "Kad aplankyti %1, spauskite čia", "digest.unsub.info": "Ši santrauka buvo išsiųsta į tavo prenumeratos nustatymus", - "digest.no_topics": "Nebuvo aktyvių temų praeityje %1", "digest.day": "diena", "digest.week": "savaitė", "digest.month": "mėnuo", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Nauja pokalbio žinutė gauta iš %1", "notif.chat.cta": "Pokalbio pratęsimui spauskite čia", "notif.chat.unsub.info": "Šios žinutės perpėjimas buvo išsiųstas į tavo prenumeratos nustatymus", diff --git a/public/language/lt/error.json b/public/language/lt/error.json index 523d83fecb..55c0b9cdec 100644 --- a/public/language/lt/error.json +++ b/public/language/lt/error.json @@ -33,6 +33,7 @@ "username-too-short": "Slapyvardis per trumpas", "username-too-long": "Vartotojo vardas per ilgas", "password-too-long": "Slaptažodis per ilgas", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Vartotojas užblokuotas", "user-banned-reason": "Atsiprašome, ši paskyra buvo užblokuota (Priežastis: %1)", "user-banned-reason-until": "Atsiprašome, ši paskyra užblokuota iki %1 (Priežastis: %2)", diff --git a/public/language/lt/flags.json b/public/language/lt/flags.json index a278900a1d..1a9465a288 100644 --- a/public/language/lt/flags.json +++ b/public/language/lt/flags.json @@ -9,6 +9,7 @@ "updated": "Atnaujinta", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/lt/search.json b/public/language/lt/search.json index e372b20823..a17094f199 100644 --- a/public/language/lt/search.json +++ b/public/language/lt/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Išvalyti nustatymus", "search-preferences-saved": "Paieškos nustatymai išsaugoti", "search-preferences-cleared": "Paieškos nuostatos išvalytos", - "show-results-as": "Rodyti rezultatus kaip" + "show-results-as": "Rodyti rezultatus kaip", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/lv/admin/advanced/database.json b/public/language/lv/admin/advanced/database.json index c1959b2f8b..ea18ef8ac6 100644 --- a/public/language/lv/admin/advanced/database.json +++ b/public/language/lv/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB info kods", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis versija", diff --git a/public/language/lv/admin/general/navigation.json b/public/language/lv/admin/general/navigation.json index 257ad71e36..c6908195e0 100644 --- a/public/language/lv/admin/general/navigation.json +++ b/public/language/lv/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Paskaidre:", "text": "Teksts:", "text-class": "Teksta klase: neobligāta", + "class": "Class: optional", "id": "ID: neobligāts", "properties": "Īpašības:", diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index bd7e44baa7..bbd591ab87 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Atlasīt kategoriju", "set-parent-category": "Iestatīt virskategoriju", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Privileģiju konfigurēšana", "privileges.warning": "Piezīme: Privilēģiju maiņas stājas spēkā uzreiz. Pēc maiņām nav nepieciešams saglabāt kategoriju.", "privileges.section-viewing": "Skatīšanas privilēģijas", "privileges.section-posting": "Publicēšanas privilēģijas", "privileges.section-moderation": "Moderatora privilēģijas", + "privileges.section-other": "Other", "privileges.section-user": "Lietotājs", "privileges.search-user": "Pievienot lietotāju", "privileges.no-users": "Nav lietotājiem īpašo privilēģiju šinī kategorijā.", diff --git a/public/language/lv/admin/manage/privileges.json b/public/language/lv/admin/manage/privileges.json index 99baf10a4a..872b3465b3 100644 --- a/public/language/lv/admin/manage/privileges.json +++ b/public/language/lv/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Meklēt saturā", "search-users": "Meklēt lietotājos", "search-tags": "Meklēt birkās", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Vietējā ielogošanās", + "allow-group-creation": "Group Create", "find-category": "Meklēt kategorijās", "access-category": "Piekļūt kategorijām", diff --git a/public/language/lv/admin/settings/group.json b/public/language/lv/admin/settings/group.json index 2bc2d9d68f..7cf9063096 100644 --- a/public/language/lv/admin/settings/group.json +++ b/public/language/lv/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Privātās grupas", "private-groups.help": "Pievienoties grupai nepieciešama grupas īpašnieka apstiprināšana (iespējots pēc noklusējama)", "private-groups.warning": "Ja šī opcija ir atspējota un privātās grupas ir iespējotas, tās automātiski kļūst par publiskām.", - "allow-creation": "Atļaut grupu pievienošanu", - "allow-creation-help": "Lietotāji var pievienot grupas (atspējots pēc noklusējuma)", "allow-multiple-badges-help": "Atļaut lietotājiem izvēlēties vairākas grupu etiķetas, nepieciešams tēmas atbalsts.", "max-name-length": "Maksimālais grupas nosaukuma garums", + "max-title-length": "Maximum Group Title Length", "cover-image": "Galvenes bildes", "default-cover": "Noklusējama galvenes bildes", "default-cover-help": "Pievienot ar komatu atdalītu sarakstu no noklusējuma galvenes bildēm tām grupām, kam nav augšupielādēta galvenes bilde" diff --git a/public/language/lv/admin/settings/tags.json b/public/language/lv/admin/settings/tags.json index 751964b9c4..06b18036b2 100644 --- a/public/language/lv/admin/settings/tags.json +++ b/public/language/lv/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimālais birkas nosaukuma garums", "max-length": "Maksimālais birkas nosaukuma garums", "goto-manage": "Noklikšķini, lai apmeklētu birku vadības lapu.", - "privacy": "Privātums", - "list-private": "Iestatīt birku sarakstu kā privātu", "related-topics": "Saistītie temati", "max-related-topics": "Maksimālais skaits saistīto tematu, ko rādīt (ja tema tos atbalsta)" } \ No newline at end of file diff --git a/public/language/lv/admin/settings/user.json b/public/language/lv/admin/settings/user.json index 1e95e7e2ce..604159378c 100644 --- a/public/language/lv/admin/settings/user.json +++ b/public/language/lv/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Atspējot e-pasta adreses izmaiņas", "disable-password-changes": "Atspējot paroles izmaiņas", "allow-account-deletion": "Atļaut konta izdzēšanu", - "user-info-private": "Slēpt lietotāju sarakstu un datus no viesiem", "hide-fullname": "Slēpt vārdu un uzvārdu no lietotājiem", "hide-email": "Slēpt e-pasta adresi no lietotājiem", "themes": "Tēmas", diff --git a/public/language/lv/email.json b/public/language/lv/email.json index 11069051a6..4119776cd9 100644 --- a/public/language/lv/email.json +++ b/public/language/lv/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Jaunākie temati no %1", "digest.cta": "Noklikšķini, lai apmeklētu %1", "digest.unsub.info": "Šis kopsavilkums tika nosūtīts Tev Tavu abonēšanas iestatījumu dēļ.", - "digest.no_topics": "Nav neviena aktīvā temata %1", "digest.day": "diena", "digest.week": "nedēļa", "digest.month": "mēness", "digest.subject": "Kopsavilkums par %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Jauna saruna saņemta no %1", "notif.chat.cta": "Noklikšķini, lai turpinātu sarunu", "notif.chat.unsub.info": "Sarunas paziņojums tika Tev nosūtīts Tavu abonēšanas iestatījumu dēļ.", diff --git a/public/language/lv/error.json b/public/language/lv/error.json index 8fdba5a4dd..93871c1cbf 100644 --- a/public/language/lv/error.json +++ b/public/language/lv/error.json @@ -33,6 +33,7 @@ "username-too-short": "Pārāk īss lietotājvārds", "username-too-long": "Pārāk garš lietotājvārds", "password-too-long": "Pārāk gara parole", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Lietotājs ir bloķēts", "user-banned-reason": "Diemžēl šis konts ir bloķēts (Iemesls: %1)", "user-banned-reason-until": "Diemžēl šis konts ir bloķēts līdz %1 (Iemesls: %2)", diff --git a/public/language/lv/flags.json b/public/language/lv/flags.json index 805badf665..c9b5e1418e 100644 --- a/public/language/lv/flags.json +++ b/public/language/lv/flags.json @@ -9,6 +9,7 @@ "updated": "Atjaunots", "target-purged": "Saturs, uz kā attiecas atzīme, ir iztīrīts un vairs nav pieejams.", + "graph-label": "Daily Flags", "quick-filters": "Ātrie filtri", "filter-active": "Atzīmju sarakstā ir aktīvs viens vai vairāki filtri", "filter-reset": "Noņemt filtrus", diff --git a/public/language/lv/search.json b/public/language/lv/search.json index 641daf48d8..3a476229da 100644 --- a/public/language/lv/search.json +++ b/public/language/lv/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Notīrīt izvēles", "search-preferences-saved": "Meklēšanas izvēles saglabātas", "search-preferences-cleared": "Meklēšanas izvēles notīrītas", - "show-results-as": "Rādīt rezultātus kā" + "show-results-as": "Rādīt rezultātus kā", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/ms/admin/advanced/database.json b/public/language/ms/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/ms/admin/advanced/database.json +++ b/public/language/ms/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/ms/admin/general/navigation.json b/public/language/ms/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/ms/admin/general/navigation.json +++ b/public/language/ms/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/ms/admin/manage/categories.json b/public/language/ms/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/ms/admin/manage/categories.json +++ b/public/language/ms/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/ms/admin/manage/privileges.json b/public/language/ms/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/ms/admin/manage/privileges.json +++ b/public/language/ms/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/ms/admin/settings/group.json b/public/language/ms/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/ms/admin/settings/group.json +++ b/public/language/ms/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/ms/admin/settings/tags.json b/public/language/ms/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/ms/admin/settings/tags.json +++ b/public/language/ms/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/ms/admin/settings/user.json b/public/language/ms/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/ms/admin/settings/user.json +++ b/public/language/ms/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/ms/email.json b/public/language/ms/email.json index c3157facea..acbce29fa0 100644 --- a/public/language/ms/email.json +++ b/public/language/ms/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Topik terkini dari %1", "digest.cta": "Klik sini untuk melawat %1", "digest.unsub.info": "Ringkasan ini dihantar berdasarkan tetapan langganan anda.", - "digest.no_topics": "Tiada topik yang aktif selama %1", "digest.day": "day", "digest.week": "week", "digest.month": "month", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Pesanan baru diterima dari %1", "notif.chat.cta": "Klik sini untuk meneruskan perbualan", "notif.chat.unsub.info": "Pemberitahuan sembang ini dihantar berdasarkan tetapan langganan anda.", diff --git a/public/language/ms/error.json b/public/language/ms/error.json index 6827bf326f..71148992d4 100644 --- a/public/language/ms/error.json +++ b/public/language/ms/error.json @@ -33,6 +33,7 @@ "username-too-short": "Nama pengunna terlalu pendek", "username-too-long": "Nama pengunna terlalu panjang", "password-too-long": "Kata laluan terlalu panjang", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Pengguna diharamkan", "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)", diff --git a/public/language/ms/flags.json b/public/language/ms/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/ms/flags.json +++ b/public/language/ms/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/ms/search.json b/public/language/ms/search.json index 1be5157fda..79d486a54e 100644 --- a/public/language/ms/search.json +++ b/public/language/ms/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Bersihkan butiran", "search-preferences-saved": "Cari butiran yang disimpan", "search-preferences-cleared": "Cari butiran yang diersihkan", - "show-results-as": "Tunjuk hasil sebagai" + "show-results-as": "Tunjuk hasil sebagai", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/nb/admin/advanced/database.json b/public/language/nb/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/nb/admin/advanced/database.json +++ b/public/language/nb/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/nb/admin/general/navigation.json b/public/language/nb/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/nb/admin/general/navigation.json +++ b/public/language/nb/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/nb/admin/manage/categories.json b/public/language/nb/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/nb/admin/manage/categories.json +++ b/public/language/nb/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/nb/admin/manage/privileges.json b/public/language/nb/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/nb/admin/manage/privileges.json +++ b/public/language/nb/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/nb/admin/settings/group.json b/public/language/nb/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/nb/admin/settings/group.json +++ b/public/language/nb/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/nb/admin/settings/tags.json b/public/language/nb/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/nb/admin/settings/tags.json +++ b/public/language/nb/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ 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 a504f5ef8d..2cfb16addc 100644 --- a/public/language/nb/admin/settings/user.json +++ b/public/language/nb/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/nb/email.json b/public/language/nb/email.json index 22893eb989..f328c0aa48 100644 --- a/public/language/nb/email.json +++ b/public/language/nb/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Siste 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.no_topics": "Det har ikke vært noen aktive emner i det siste %1", "digest.day": "day", "digest.week": "week", "digest.month": "month", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "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.", diff --git a/public/language/nb/error.json b/public/language/nb/error.json index b6167a46ba..6ab59c907e 100644 --- a/public/language/nb/error.json +++ b/public/language/nb/error.json @@ -33,6 +33,7 @@ "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)", "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)", diff --git a/public/language/nb/flags.json b/public/language/nb/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/nb/flags.json +++ b/public/language/nb/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/nb/search.json b/public/language/nb/search.json index e27d33a922..7c29c67866 100644 --- a/public/language/nb/search.json +++ b/public/language/nb/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Tøm innstillinnger", "search-preferences-saved": "Søkeinnstillinger lagret", "search-preferences-cleared": "Søkeinnstillinger tømt", - "show-results-as": "Vis resultater som" + "show-results-as": "Vis resultater som", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/nl/admin/advanced/database.json b/public/language/nl/admin/advanced/database.json index a3187bb795..4ebec48004 100644 --- a/public/language/nl/admin/advanced/database.json +++ b/public/language/nl/admin/advanced/database.json @@ -18,16 +18,17 @@ "mongo.resident-memory": "Resident geheugen", "mongo.virtual-memory": "Virtueel geheugen", "mongo.mapped-memory": "Mapped geheugen", - "mongo.bytes-in": "Bytes In", - "mongo.bytes-out": "Bytes Out", - "mongo.num-requests": "Number of Requests", + "mongo.bytes-in": "Bytes Inkomend", + "mongo.bytes-out": "Bytes Uitgaand", + "mongo.num-requests": "Aantal requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis versie", - "redis.keys": "Keys", - "redis.expires": "Expires", - "redis.avg-ttl": "Average TTL", + "redis.keys": "Sleutels", + "redis.expires": "Verloopt", + "redis.avg-ttl": "Gemiddelde TTL", "redis.connected-clients": "Verbonden clients", "redis.connected-slaves": "Verbonden slaves", "redis.blocked-clients": "Geblokkeerde clients", diff --git a/public/language/nl/admin/general/dashboard.json b/public/language/nl/admin/general/dashboard.json index cfec2cd754..7e99e1f24b 100644 --- a/public/language/nl/admin/general/dashboard.json +++ b/public/language/nl/admin/general/dashboard.json @@ -49,7 +49,7 @@ "active-users.users": "Users", "active-users.guests": "Guests", "active-users.total": "Total", - "active-users.connections": "Connections", + "active-users.connections": "Connecties", "anonymous-registered-users": "Anonymous vs Registered Users", "anonymous": "Anonymous", @@ -71,6 +71,6 @@ "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.anonymous-users": "Anonymous Users", - "last-restarted-by": "Last restarted by", + "last-restarted-by": "Laatst herstart door", "no-users-browsing": "No users browsing" } diff --git a/public/language/nl/admin/general/navigation.json b/public/language/nl/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/nl/admin/general/navigation.json +++ b/public/language/nl/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/nl/admin/manage/categories.json b/public/language/nl/admin/manage/categories.json index c14eadea0c..229bd92aff 100644 --- a/public/language/nl/admin/manage/categories.json +++ b/public/language/nl/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", @@ -62,7 +63,7 @@ "alert.copy-success": "Settings Copied!", "alert.set-parent-category": "Set Parent Category", "alert.updated": "Updated Categories", - "alert.updated-success": "Category IDs %1 successfully updated.", + "alert.updated-success": "Category IDs %1 zijn succesvol geüpdatet.", "alert.upload-image": "Upload category image", "alert.find-user": "Find a User", "alert.user-search": "Search for a user here...", diff --git a/public/language/nl/admin/manage/privileges.json b/public/language/nl/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/nl/admin/manage/privileges.json +++ b/public/language/nl/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/nl/admin/settings/general.json b/public/language/nl/admin/settings/general.json index c47481fe11..1977c9678a 100644 --- a/public/language/nl/admin/settings/general.json +++ b/public/language/nl/admin/settings/general.json @@ -6,7 +6,7 @@ "title.url-help": "Wanneer de titel word aangeklikt stuur gebruikers naar dit adress. Is het leeg gelaten dan worden gebruikers naar de forum hoofdpagina gestuurd.", "title.name": "Jouw Communiy Naam", "title.show-in-header": "Toon Site Titel in Header", - "browser-title": "Browser Title", + "browser-title": "Browser Titel", "browser-title-help": "Als geen browser titel is gespecificeerd dan word de site titel gebruikt", "title-layout": "Titel Lay-out", "title-layout-help": "Defineer hoe de browser titel gestructureerd word. bijv: {paginaTitel} | {browserTitel}", @@ -27,7 +27,7 @@ "favicon.upload": "Uploaden", "touch-icon": "Startscherm / Aanraakpictogram", "touch-icon.upload": "Uploaden", - "touch-icon.help": "Recommended size and format: 192x192, PNG format only. If no touch icon is specified, NodeBB will fall back to using the favicon.", + "touch-icon.help": "Aangeraden grootte en formaat: 192x192, alleen PNG formaat. Als er geen touch icoon is gespecificeerd zal NodeBB terugvallen op het favicon.", "outgoing-links": "Outgoing Links", "outgoing-links.warning-page": "Use Outgoing Links Warning Page", "search-default-sort-by": "Search default sort by", diff --git a/public/language/nl/admin/settings/group.json b/public/language/nl/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/nl/admin/settings/group.json +++ b/public/language/nl/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/nl/admin/settings/tags.json b/public/language/nl/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/nl/admin/settings/tags.json +++ b/public/language/nl/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/nl/admin/settings/user.json b/public/language/nl/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/nl/admin/settings/user.json +++ b/public/language/nl/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/nl/email.json b/public/language/nl/email.json index 5020f76c72..628f3b2d1e 100644 --- a/public/language/nl/email.json +++ b/public/language/nl/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "De meest recente onderwerpen van %1", "digest.cta": "Klik hier om %1 te bezoeken ", "digest.unsub.info": "Deze samenvatting hebben we naar je verzonden omdat je dat hebt ingesteld.", - "digest.no_topics": "In de afgelopen %1 zijn er geen actieve onderwerpen geweest.", "digest.day": "dag", "digest.week": "week", "digest.month": "maand", "digest.subject": "Samenvatting voor %1", + "digest.title": "Uw dagelijkse samenvatting", "notif.chat.subject": "Nieuw chatbericht van %1", "notif.chat.cta": "Klik hier om het gesprek te hervatten", "notif.chat.unsub.info": "Deze notificatie is verzonden vanwege de gebruikersinstellingen voor abonnementen.", diff --git a/public/language/nl/error.json b/public/language/nl/error.json index 9a3ac6922e..853f68e182 100644 --- a/public/language/nl/error.json +++ b/public/language/nl/error.json @@ -33,6 +33,7 @@ "username-too-short": "Gebruikersnaam is te kort", "username-too-long": "Gebruikersnaam is te lang", "password-too-long": "Wachtwoord is te lang", + "reset-rate-limited": "Te veel verzoeken voor wachtwoordherstel (snelheid beperkt)", "user-banned": "Gebruiker verbannen", "user-banned-reason": "Sorry, dit account is verbannen (Reden: %1)", "user-banned-reason-until": "Sorry, dit account is verbannen tot %1 (Reden: %2)", diff --git a/public/language/nl/flags.json b/public/language/nl/flags.json index 65bb827055..528aa0499c 100644 --- a/public/language/nl/flags.json +++ b/public/language/nl/flags.json @@ -9,6 +9,7 @@ "updated": "Bijgewerkt", "target-purged": "De inhoud waar deze markering naar verwijst is verwijderd en niet meer beschikbaar.", + "graph-label": "Dagelijkse markeringen", "quick-filters": "Snelfilters", "filter-active": "Er zijn een of meer filters actief in deze lijst van markeringen", "filter-reset": "Filters verwijderen", diff --git a/public/language/nl/search.json b/public/language/nl/search.json index 60783df8d9..bebf61212c 100644 --- a/public/language/nl/search.json +++ b/public/language/nl/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Voorkeuren verwijderen", "search-preferences-saved": "Zoek voorkeuren opgeslagen", "search-preferences-cleared": "Zoek voorkeuren verwijderd", - "show-results-as": "Toon resultaten als" + "show-results-as": "Toon resultaten als", + "see-more-results": "Meer resultaten zien (%1)" } \ No newline at end of file diff --git a/public/language/pl/admin/advanced/database.json b/public/language/pl/admin/advanced/database.json index 6f0e4364f4..2602a51f10 100644 --- a/public/language/pl/admin/advanced/database.json +++ b/public/language/pl/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bajtów wyjścia", "mongo.num-requests": "Liczba żądań", "mongo.raw-info": "Informacje MongoDB", + "mongo.unauthorized": "NodeBB nie był w stanie przetworzyć bazy danych MongoDB dla odpowiednich statystyk. Upewnij się, że użytkownik w użyciu przez NodeBB zawiera "clusterMonitor" dla "admin" bazy danych.", "redis": "Redis", "redis.version": "Wersja Redis", diff --git a/public/language/pl/admin/general/navigation.json b/public/language/pl/admin/general/navigation.json index 7bd88cf4c2..42a9e7c98c 100644 --- a/public/language/pl/admin/general/navigation.json +++ b/public/language/pl/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Tekst:", "text-class": "Klasa tekstu opcjonalnie", + "class": "Klasa: opcjonalnie", "id": "ID: opcjonalnie", "properties": "Ustawienia:", diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index ddb744c5d7..176634a2b0 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Wybierz kategorię", "set-parent-category": "Ustaw nadrzędną kategorie", - "privileges.description": "W tej sekcji możesz skonfigurować uprawnienia kontroli dla tej kategorii. Uprawnienia mogą być przyznawane dla poszczególnych użytkowników lub grup. Wybierz domenę efektu z poniższego menu.", + "privileges.description": "Możesz skonfigurować uprawnienia kontroli dostępu do części witryny w tej sekcji. Uprawnienia mogą być przyznawane dla poszczególnych użytkowników lub grup. Wybierz domenę efektu z poniższego menu.", "privileges.category-selector": "Konfigurowanie uprawnień dla", "privileges.warning": "Uwaga: Uprawnienia zapisują się natychmiastowo. Nie ma potrzeby zapisywania kategorii po zmianie ustawień.", "privileges.section-viewing": "Lista uprawnień", "privileges.section-posting": "Uprawnienia pisania", "privileges.section-moderation": "Uprawnienia moderowania", + "privileges.section-other": "Inne", "privileges.section-user": "Użytkownik", "privileges.search-user": "Dodaj użytkownika", "privileges.no-users": "Brak uprawnień specyficznych dla użytkowników w tej kategorii", diff --git a/public/language/pl/admin/manage/post-queue.json b/public/language/pl/admin/manage/post-queue.json index 0942d503ee..8d8e1f48c6 100644 --- a/public/language/pl/admin/manage/post-queue.json +++ b/public/language/pl/admin/manage/post-queue.json @@ -1,6 +1,6 @@ { "post-queue": "Kolejka postów", - "description": "Brak postów w kolejce.
W celu włączenia tej funkcji, przejdź do Ustawienia → Posty → Ograniczenia pisania i włącz Kolejkę postów. ", + "description": "Brak postów w kolejce.
W celu włączenia tej funkcji, przejdź do Ustawienia → Posty → Ograniczenia pisania i włącz Kolejkę postów. ", "user": "Użytkownik", "category": "Kategoria", "title": "Tytuł", diff --git a/public/language/pl/admin/manage/privileges.json b/public/language/pl/admin/manage/privileges.json index 6f92075b59..85b8f45e4c 100644 --- a/public/language/pl/admin/manage/privileges.json +++ b/public/language/pl/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Szukanie treści", "search-users": "Szukanie użytkowników", "search-tags": "Szukanie tagów", + "view-users": "Wyświetlanie użytkowników", + "view-tags": "Wyświetlanie tagów", + "view-groups": "Wyświetlanie grup", "allow-local-login": "Logowanie lokalne", + "allow-group-creation": "Tworzenie grup", "find-category": "Szukanie kategorii", "access-category": "Dostęp do kategorii", diff --git a/public/language/pl/admin/settings/group.json b/public/language/pl/admin/settings/group.json index 6fe5347fa5..f319a56c9f 100644 --- a/public/language/pl/admin/settings/group.json +++ b/public/language/pl/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Grupy prywatne", "private-groups.help": "Jeśli ta opcja jest włączona, dołączenie do grupy wymaga zatwierdzenia przez właściciela grupy (domyślnie: włączone)", "private-groups.warning": "Uwaga! Jeśli ta opcja jest wyłączona i masz prywatne grupy, automatycznie stają się one publiczne.", - "allow-creation": "Zezwalaj na tworzenie grup", - "allow-creation-help": "Jeśli ta opcja jest włączona, użytkownicy mogą tworzyć grupy (domyślnie: wyłączone)", "allow-multiple-badges-help": "Dzięki tej fladze użytkownicy mogą wybierać różne etykiety dla grup, w zależności od tematu.", "max-name-length": "Maksymalna długość nazwy grupy", + "max-title-length": "Maksymalna długość tytułu grupy", "cover-image": "Obraz profilowy grupy", "default-cover": "Domyślne obrazy profilowe", "default-cover-help": "Dodaj rozdzielone przecinkiem domyślne obrazy profilowe dla grup, które nie przesłały własnych" diff --git a/public/language/pl/admin/settings/tags.json b/public/language/pl/admin/settings/tags.json index d323ec9d1f..ed06da9631 100644 --- a/public/language/pl/admin/settings/tags.json +++ b/public/language/pl/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimalna długość tagu", "max-length": "Maksymalna długość tagu", "goto-manage": "Kliknij tutaj, by przejść do strony zarządzania tagami", - "privacy": "Prywatność", - "list-private": "Uczyń listę tagów prywatną", "related-topics": "Powiązane tematy", "max-related-topics": "Maksymalna liczba powiązanych tematów do wyświetlenia (jeśli możliwe w ramach tematu)" } \ No newline at end of file diff --git a/public/language/pl/admin/settings/user.json b/public/language/pl/admin/settings/user.json index ae83a9df44..234a75b64e 100644 --- a/public/language/pl/admin/settings/user.json +++ b/public/language/pl/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Wyłącz możliwość zmiany adresu e-mail", "disable-password-changes": "Wyłącz możliwość zmiany hasła", "allow-account-deletion": "Zezwalaj na usunięcie konta", - "user-info-private": "Ukrywaj listę oraz dane użytkowników przed gośćmi", "hide-fullname": "Ukrywaj pełne imię i nazwisko przed innymi użytkownikami", "hide-email": "Ukryj adresy e-mail użytkowników", "themes": "Motywy", diff --git a/public/language/pl/email.json b/public/language/pl/email.json index bfbf7cdffa..51cadfb08a 100644 --- a/public/language/pl/email.json +++ b/public/language/pl/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Ostatnie tematy z %1", "digest.cta": "Kliknij tutaj, by przejść do %1", "digest.unsub.info": "To podsumowanie zostało wysłane zgodnie z Twoimi ustawieniami.", - "digest.no_topics": "Nie było żadnych aktywnych tematów w ciągu ostatnich %1", "digest.day": "dni", "digest.week": "tygodni", "digest.month": "miesięcy", "digest.subject": "Podsumowanie z %1", + "digest.title": "Twój codzienny przegląd", "notif.chat.subject": "Nowa wiadomość na czacie od %1", "notif.chat.cta": "Kliknij tutaj, aby kontynuować rozmowę", "notif.chat.unsub.info": "To powiadomienie o czacie zostało wysłane zgodnie z Twoimi ustawieniami.", diff --git a/public/language/pl/error.json b/public/language/pl/error.json index c8a6b4ffab..1c2b00c07a 100644 --- a/public/language/pl/error.json +++ b/public/language/pl/error.json @@ -33,6 +33,7 @@ "username-too-short": "Nazwa użytkownika za krótka", "username-too-long": "Zbyt długa nazwa użytkownika", "password-too-long": "Hasło jest za długie", + "reset-rate-limited": "Zbyt wiele żądań resetowania hasła (ograniczona ilość)", "user-banned": "Użytkownik zbanowany", "user-banned-reason": "Twoje konto zostało zablokowane (Powód: %1)", "user-banned-reason-until": "Przepraszamy, to konto zostało zbanowane do %1 (Powód: %2)", diff --git a/public/language/pl/flags.json b/public/language/pl/flags.json index 241866f0ea..5ee1188034 100644 --- a/public/language/pl/flags.json +++ b/public/language/pl/flags.json @@ -9,6 +9,7 @@ "updated": "Zaaktualizowano", "target-purged": "Treści, do których odnosi się ta flaga, zostały usunięte i nie są już dostępne.", + "graph-label": "Codzienne flagi", "quick-filters": "Szybkie filtry", "filter-active": "Istnieje co najmniej jeden aktywny filtr w tej liście flag", "filter-reset": "Usuń filtry", diff --git a/public/language/pl/search.json b/public/language/pl/search.json index a7fcb08d49..ba8ae8327a 100644 --- a/public/language/pl/search.json +++ b/public/language/pl/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Wyczyść ustawienia", "search-preferences-saved": "Ustawienia wyszukiwania zapisane", "search-preferences-cleared": "Ustawienia wyszukiwania wyczyszczone", - "show-results-as": "Pokazuj wyniki jako" + "show-results-as": "Pokazuj wyniki jako", + "see-more-results": "Wyświetl więcej wyników (%1)" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/advanced/database.json b/public/language/pt-BR/admin/advanced/database.json index f16cb6fee0..d6289d4b46 100644 --- a/public/language/pt-BR/admin/advanced/database.json +++ b/public/language/pt-BR/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "Informação Raw do MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Versão do Redis", diff --git a/public/language/pt-BR/admin/general/navigation.json b/public/language/pt-BR/admin/general/navigation.json index 7ac0f96709..0242453dc5 100644 --- a/public/language/pt-BR/admin/general/navigation.json +++ b/public/language/pt-BR/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Texto:", "text-class": "Classe do Texto: optional", + "class": "Class: optional", "id": "ID: opcional", "properties": "Propriedades:", diff --git a/public/language/pt-BR/admin/manage/categories.json b/public/language/pt-BR/admin/manage/categories.json index 0fd84390cb..b622473fc2 100644 --- a/public/language/pt-BR/admin/manage/categories.json +++ b/public/language/pt-BR/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Escolher Categoria", "set-parent-category": "Definir Categoria Mãe", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Nota: Configurações de privilégio entram em efeito imediatamente. Não é necessário salvar a categoria após ajustar estas configurações.", "privileges.section-viewing": "Privilégios de Visualização", "privileges.section-posting": "Privilégios de Postagem", "privileges.section-moderation": "Privilégios de Moderação", + "privileges.section-other": "Other", "privileges.section-user": "Usuário", "privileges.search-user": "Adicionar Usuário", "privileges.no-users": "Sem privilégios específicos de usuário nesta categoria.", diff --git a/public/language/pt-BR/admin/manage/privileges.json b/public/language/pt-BR/admin/manage/privileges.json index 357ae46430..c469fd0464 100644 --- a/public/language/pt-BR/admin/manage/privileges.json +++ b/public/language/pt-BR/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Pesquisar Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/pt-BR/admin/settings/group.json b/public/language/pt-BR/admin/settings/group.json index 8fef4d61d7..a7365cb01b 100644 --- a/public/language/pt-BR/admin/settings/group.json +++ b/public/language/pt-BR/admin/settings/group.json @@ -3,10 +3,9 @@ "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-creation": "Permitir Criação de Grupo", - "allow-creation-help": "Se habilitado, usuários podem criar grupos (Padrão: desligado)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Tamanho Máximo do Nome de Grupos", + "max-title-length": "Maximum Group Title Length", "cover-image": "Imagem de Capa do Grupo", "default-cover": "Imagens de Capa Padrão", "default-cover-help": "Adicione uma lista separada por vírgulas de imagens de capa padrão para grupo que não tenham enviado uma imagem de capa" diff --git a/public/language/pt-BR/admin/settings/tags.json b/public/language/pt-BR/admin/settings/tags.json index e2bc3becd2..204b090f39 100644 --- a/public/language/pt-BR/admin/settings/tags.json +++ b/public/language/pt-BR/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Tamanho Mínimo das Tags", "max-length": "Tamanho Máximo das Tags", "goto-manage": "Clique aqui para visitar a página de administração da tag.", - "privacy": "Privacidade", - "list-private": "Tornar a lista de tags privada", "related-topics": "Tópicos Relacionados", "max-related-topics": "Máximo de tópicos relacionados para exibir (se suportado pelo tema)" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/settings/user.json b/public/language/pt-BR/admin/settings/user.json index f154d884e7..6b4117a2d6 100644 --- a/public/language/pt-BR/admin/settings/user.json +++ b/public/language/pt-BR/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Desabilitar mudanças de email", "disable-password-changes": "Desabilitar mudanças de senha", "allow-account-deletion": "Permitir exclusão de conta", - "user-info-private": "Esconder lista e dados de usuários de visitantes", "hide-fullname": "Esconder nome completo de outros usuários", "hide-email": "Esconder email de outros usuários", "themes": "Temas", diff --git a/public/language/pt-BR/email.json b/public/language/pt-BR/email.json index 4cd0db0493..a78eace69e 100644 --- a/public/language/pt-BR/email.json +++ b/public/language/pt-BR/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Últimos tópicos 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.no_topics": "Não há tópicos ativos nos últimos %1", "digest.day": "dia", "digest.week": "semana", "digest.month": "mês", "digest.subject": "Resumo de %1", + "digest.title": "Your Daily Digest", "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.", diff --git a/public/language/pt-BR/error.json b/public/language/pt-BR/error.json index 0c985d02ed..efbd53e807 100644 --- a/public/language/pt-BR/error.json +++ b/public/language/pt-BR/error.json @@ -33,6 +33,7 @@ "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": "Too many password reset requests (rate limited)", "user-banned": "Usuário banido", "user-banned-reason": "Desculpa, esta conta foi banida (Motivo: %1)", "user-banned-reason-until": "Desculpe, esta conta foi banida até %1 (Motivo: %2)", diff --git a/public/language/pt-BR/flags.json b/public/language/pt-BR/flags.json index c65f34b23e..658ff25695 100644 --- a/public/language/pt-BR/flags.json +++ b/public/language/pt-BR/flags.json @@ -9,6 +9,7 @@ "updated": "Atualizado", "target-purged": "O conteúdo ao qual essa sinalização se referia foi removido e não está mais disponível.", + "graph-label": "Daily Flags", "quick-filters": "Filtros Rápidos", "filter-active": "Há um ou mais filtros ativos nesta lista de sinalizações", "filter-reset": "Remover Filtros", diff --git a/public/language/pt-BR/search.json b/public/language/pt-BR/search.json index 49ea52b527..e19a8ed51a 100644 --- a/public/language/pt-BR/search.json +++ b/public/language/pt-BR/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Limpar preferências", "search-preferences-saved": "Preferências de pesquisa salvas", "search-preferences-cleared": "Preferências de pesquisa limpas", - "show-results-as": "Mostrar resultados como" + "show-results-as": "Mostrar resultados como", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/advanced/database.json b/public/language/pt-PT/admin/advanced/database.json index c4efe2a9ee..9bf1992ffd 100644 --- a/public/language/pt-PT/admin/advanced/database.json +++ b/public/language/pt-PT/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "Informação MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Versão Redis", diff --git a/public/language/pt-PT/admin/appearance/customise.json b/public/language/pt-PT/admin/appearance/customise.json index dedfa8eb8a..30dc6fa15a 100644 --- a/public/language/pt-PT/admin/appearance/customise.json +++ b/public/language/pt-PT/admin/appearance/customise.json @@ -3,14 +3,14 @@ "custom-css.description": "Insere aqui as tuas próprias declarações de CSS/LESS, que serão aplicadas depois de todos os outros estilos.", "custom-css.enable": "Ativar CSS/LESS Personalizado", - "custom-js": "Custom Javascript", + "custom-js": "Javascript Personalizado", "custom-js.description": "Enter your own javascript here. It will be executed after the page is loaded completely.", - "custom-js.enable": "Enable Custom Javascript", + "custom-js.enable": "Ativar Javascript Personalizado", "custom-header": "Cabeçalho Personalizado", "custom-header.description": "Insere aqui HTML personalizado (ex. Meta Tags, etc.), que será acrescentado à secção <head> do teu fórum. Script Tags também são permitidas, mas não recomendados usar, uma vez que já existe o separador Custom Javascript exatamente para essa função.", "custom-header.enable": "Ativar Cabeçalho Personalizado", - "custom-css.livereload": "Enable Live Reload", - "custom-css.livereload.description": "Enable this to force all sessions on every device under your account to refresh whenever you click save" + "custom-css.livereload": "Ativar recarregar ao vivo", + "custom-css.livereload.description": "Ativa isto para forçar todas as sessões da tua conta a serem atualizadas em todos os dispositivos sempre que clicares em guardar" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/appearance/themes.json b/public/language/pt-PT/admin/appearance/themes.json index 6eb4a58025..339ae1e902 100644 --- a/public/language/pt-PT/admin/appearance/themes.json +++ b/public/language/pt-PT/admin/appearance/themes.json @@ -6,6 +6,6 @@ "no-themes": "Não foram encontrados temas instalados", "revert-confirm": "Tens a certeza que desejas restaurar o tema predefinido do NodeBB?", "theme-changed": "Tema Alterado", - "revert-success": "You have successfully reverted your NodeBB back to it's default theme.", + "revert-success": "Tu reverteste com sucesso o teu NodeBB de volta ao seu tema padrão.", "restart-to-activate": "Por favor reconstrói e reinicia o teu NodeBB para aplicar totalmente este tema." } \ No newline at end of file diff --git a/public/language/pt-PT/admin/extend/widgets.json b/public/language/pt-PT/admin/extend/widgets.json index c86abbdfa1..b8137f175a 100644 --- a/public/language/pt-PT/admin/extend/widgets.json +++ b/public/language/pt-PT/admin/extend/widgets.json @@ -1,10 +1,10 @@ { - "available": "Available Widgets", - "explanation": "Select a widget from the dropdown menu and then drag and drop it into a template's widget area on the left.", - "none-installed": "No widgets found! Activate the essential widgets plugin in the plugins control panel.", - "clone-from": "Clone widgets from", - "containers.available": "Available Containers", - "containers.explanation": "Drag and drop on top of any active widget", + "available": "Widgets Disponíveis", + "explanation": "Seleciona um widget no menu suspenso e, em seguida, arrasta-o e solta-o para uma das área de widgets à esquerda.", + "none-installed": "Não foram encontrados widgets! Ativa o plugin widget-essentials no painel de controlo de plugins.", + "clone-from": "Clonar widgets de", + "containers.available": "Containers Disponíveis", + "containers.explanation": "Arrasta e solta em cima de qualquer widget ativo", "containers.none": "Nada", "container.well": "Well", "container.jumbotron": "Jumbotron", @@ -13,10 +13,10 @@ "container.panel-body": "Panel Body", "container.alert": "Alert", - "alert.confirm-delete": "Are you sure you wish to delete this widget?", - "alert.updated": "Widgets Updated", - "alert.update-success": "Successfully updated widgets", - "alert.clone-success": "Successfully cloned widgets", + "alert.confirm-delete": "Tens a certeza que desejas eliminar este widget?", + "alert.updated": "Widgets Atualizados", + "alert.update-success": "Widgets atualizados com sucesso", + "alert.clone-success": "Widgets clonados com sucesso", "error.select-clone": "Please select a page to clone from" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/general/navigation.json b/public/language/pt-PT/admin/general/navigation.json index fec286dfb2..9d850e2894 100644 --- a/public/language/pt-PT/admin/general/navigation.json +++ b/public/language/pt-PT/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Título:", "text": "Texto:", "text-class": "Classe: opcional", + "class": "Class: optional", "id": "ID: opcional", "properties": "Propriedades:", diff --git a/public/language/pt-PT/admin/manage/categories.json b/public/language/pt-PT/admin/manage/categories.json index 92b3972949..67f86cc6f4 100644 --- a/public/language/pt-PT/admin/manage/categories.json +++ b/public/language/pt-PT/admin/manage/categories.json @@ -16,7 +16,7 @@ "category-image": "Imagem da Categoria", "parent-category": "Categoria Pai", "optional-parent-category": "(Opcional) Categoria Pai", - "parent-category-none": "(Nenhum)", + "parent-category-none": "(Nenhuma)", "copy-settings": "Copiar Definições de ", "optional-clone-settings": "(Opcional) Clonar Definições da Categoria", "clone-children": "Copiar as categorias-filho e definições", @@ -29,12 +29,13 @@ "select-category": "Selecionar Categoria", "set-parent-category": "Definir uma Categoria Pai", - "privileges.description": "Podes configurar os privilégios de controlo de acesso para esta categoria nesta secção. Os privilégios podem ser concedidos por utilizador ou por grupo. Seleciona o domínio de efeito na lista suspensa abaixo.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "A configurar privilégios para", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Privilégios de Visualização", "privileges.section-posting": "Privilégios de Publicação", "privileges.section-moderation": "Privilégios de Moderação", + "privileges.section-other": "Other", "privileges.section-user": "Utilizador", "privileges.search-user": "Adicionar Utilizador", "privileges.no-users": "Não existem privilégios específicos para utilizadores nesta categoria.", @@ -62,7 +63,7 @@ "alert.copy-success": "Definições Copiadas!", "alert.set-parent-category": "Definir uma Categoria Pai", "alert.updated": "Categorias Atualizadas", - "alert.updated-success": "Category IDs %1 successfully updated.", + "alert.updated-success": "IDs das categorias %1 atualizados com sucesso!", "alert.upload-image": "Enviar imagem da categoria", "alert.find-user": "Encontrar um Utilizador", "alert.user-search": "Procurar por um utilizador aqui...", diff --git a/public/language/pt-PT/admin/manage/privileges.json b/public/language/pt-PT/admin/manage/privileges.json index 5869efb063..b65d04a21b 100644 --- a/public/language/pt-PT/admin/manage/privileges.json +++ b/public/language/pt-PT/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Procurar Conteúdo", "search-users": "Procurar Utilizadores", "search-tags": "Procurar Marcadores", + "view-users": "Ver Utilizadores", + "view-tags": "Ver Etiquetas", + "view-groups": "Ver Grupos", "allow-local-login": "Início de Sessão Local", + "allow-group-creation": "Criar Grupos", "find-category": "Encontrar Categoria", "access-category": "Aceder à Categoria", diff --git a/public/language/pt-PT/admin/settings/cookies.json b/public/language/pt-PT/admin/settings/cookies.json index f8b0f0538b..25e1bb004b 100644 --- a/public/language/pt-PT/admin/settings/cookies.json +++ b/public/language/pt-PT/admin/settings/cookies.json @@ -7,5 +7,5 @@ "consent.blank-localised-default": "Leave blank to use NodeBB localised defaults", "settings": "Settings", "cookie-domain": "Session cookie domain", - "blank-default": "Leave blank for default" + "blank-default": "Deixa em branco para a predefinir" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/settings/email.json b/public/language/pt-PT/admin/settings/email.json index bbe89115b3..67bc99a401 100644 --- a/public/language/pt-PT/admin/settings/email.json +++ b/public/language/pt-PT/admin/settings/email.json @@ -24,10 +24,10 @@ "smtp-transport.password": "Palavra-passe", "template": "Edit Email Template", - "template.select": "Select Email Template", - "template.revert": "Revert to Original", + "template.select": "Escolher Modelo de E-mail", + "template.revert": "Reverter para o Original", "testing": "Teste de E-mail", - "testing.select": "Select Email Template", + "testing.select": "Escolher Modelo de E-mail", "testing.send": "Enviar E-mail de Teste", "testing.send-help": "The test email will be sent to the currently logged in user's email address.", "subscriptions": "Email Subscriptions", diff --git a/public/language/pt-PT/admin/settings/group.json b/public/language/pt-PT/admin/settings/group.json index 0772eb5694..a3d2bcf670 100644 --- a/public/language/pt-PT/admin/settings/group.json +++ b/public/language/pt-PT/admin/settings/group.json @@ -1,12 +1,11 @@ { - "general": "General", - "private-groups": "Private Groups", + "general": "Geral", + "private-groups": "Grupos Privados", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", - "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Permitir Criação de Grupos", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", + "private-groups.warning": "Cuidado! Se esta opção estiver desativada e tu tiveres grupos privados, eles automaticamente vão se tornar públicos.", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", - "max-name-length": "Maximum Group Name Length", + "max-name-length": "Comprimento Máximo do Nome do Grupo", + "max-title-length": "Comprimento Máximo do Título do Grupo", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/pt-PT/admin/settings/tags.json b/public/language/pt-PT/admin/settings/tags.json index c1c14eda34..d5c0444635 100644 --- a/public/language/pt-PT/admin/settings/tags.json +++ b/public/language/pt-PT/admin/settings/tags.json @@ -1,12 +1,10 @@ { - "tag": "Tag Settings", - "min-per-topic": "Mínimo de Marcadores por Tópico", - "max-per-topic": "Máximo de Marcadores por Tópico", - "min-length": "Minimum Tag Length", - "max-length": "Maximum Tag Length", - "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Tornar a lista de marcadores privada", + "tag": "Definições das Etiquetas", + "min-per-topic": "Mínimo de Etiquetas por Tópico", + "max-per-topic": "Máximo de Etiquetas por Tópico", + "min-length": "Comprimento Mínimo da Etiqueta", + "max-length": "Comprimento Máximo da Etiqueta", + "goto-manage": "Clica aqui para visitares a página de gestão das etiquetas. ", "related-topics": "Tópicos Relacionados", - "max-related-topics": "Maximum related topics to display (if supported by theme)" + "max-related-topics": "Máximo de tópicos relacionados a mostrar (se for suportado pelo tema)" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/settings/uploads.json b/public/language/pt-PT/admin/settings/uploads.json index 437cd2816a..9ae1437f3b 100644 --- a/public/language/pt-PT/admin/settings/uploads.json +++ b/public/language/pt-PT/admin/settings/uploads.json @@ -31,7 +31,7 @@ "max-profile-image-size-help": "(in kibibytes, default: 256 KiB)", "max-cover-image-size": "Maximum Cover Image File Size", "max-cover-image-size-help": "(in kibibytes, default: 2,048 KiB)", - "keep-all-user-images": "Keep old versions of avatars and profile covers on the server", + "keep-all-user-images": "Manter versões antigas das fotos de perfil e das fotos de capa no servidor", "profile-covers": "Profile Covers", "default-covers": "Default Cover Images", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" diff --git a/public/language/pt-PT/admin/settings/user.json b/public/language/pt-PT/admin/settings/user.json index 625d910ec8..a5a7c9a6d9 100644 --- a/public/language/pt-PT/admin/settings/user.json +++ b/public/language/pt-PT/admin/settings/user.json @@ -1,25 +1,24 @@ { - "authentication": "Authentication", + "authentication": "Autenticação", "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": "Permitir início de sessão com", "allow-login-with.username-email": "Nome de Utilizador ou E-mail", "allow-login-with.username": "Nome de Utilizador Apenas", - "allow-login-with.email": "Email Only", - "account-settings": "Account Settings", + "allow-login-with.email": "Apenas E-mail", + "account-settings": "Definições de Conta", "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": "Desativar mudanças de nomes de utilizador", - "disable-email-changes": "Disable email changes", + "disable-email-changes": "Desativar mudanças de e-mail", "disable-password-changes": "Desativar alterações de palavras-passe", "allow-account-deletion": "Permitir eliminação da conta", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Esconder o nome completo dos utilizadores", "hide-email": "Esconder o e-mail dos utilizadores", "themes": "Temas", "disable-user-skins": "Impedir utilizadores de escolherem uma máscara personalizada", - "account-protection": "Account Protection", + "account-protection": "Proteção de Conta", "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": "Tentativas de início de sessão por hora", @@ -33,8 +32,8 @@ "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": "Minutos após o utilizador ser considerado inativo", "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", + "registration": "Registo de Utilizadores", + "registration-type": "Tipo de Registo", "registration-type.normal": "Normal", "registration-type.admin-approval": "Aprovado por um Administrador", "registration-type.admin-approval-ip": "Aprovado por um Administrador para IPs", @@ -49,29 +48,29 @@ "invite-expiration-help": "# of days invitations expire in.", "min-username-length": "Comprimento Mínimo do Nome de Utilizador", "max-username-length": "Comprimento Máximo do Nome de Utilizador", - "min-password-length": "Minimum Password Length", + "min-password-length": "Comprimento Mínimo da Palavra-Passe", "min-password-strength": "Minimum Password Strength", "max-about-me-length": "Comprimento Máximo do \"Sobre Mim\"", - "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", + "terms-of-use": "Termos de Uso do Fórum (Deixa em branco para desativar)", + "user-search": "Procura de Utilizadores", + "user-search-results-per-page": "Número de resultados a mostrar", + "default-user-settings": "Definições Predefinidas do Utilizador", + "show-email": "Mostrar e-mail", + "show-fullname": "Mostrar nome completo", "restrict-chat": "Apenas permitir mensagens de utilizadores que eu sigo", - "outgoing-new-tab": "Open outgoing links in new tab", + "outgoing-new-tab": "Abrir links externos num novo separador", "topic-search": "Enable In-Topic Searching", "digest-freq": "Subscribe to Digest", "digest-freq.off": "Desligado", - "digest-freq.daily": "Daily", - "digest-freq.weekly": "Weekly", - "digest-freq.monthly": "Monthly", + "digest-freq.daily": "Diariamente ", + "digest-freq.weekly": "Semanalmente", + "digest-freq.monthly": "Mensalmente", "email-chat-notifs": "Enviar um e-mail se receber uma nova mensagem e não estiver 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", "default-notification-settings": "Default notification settings", - "categoryWatchState": "Default category watch state", + "categoryWatchState": "Estado predefinido da subscrição de categorias", "categoryWatchState.watching": "Watching", "categoryWatchState.notwatching": "Not Watching", "categoryWatchState.ignoring": "Ignoring" diff --git a/public/language/pt-PT/email.json b/public/language/pt-PT/email.json index e810aeafc1..c1891603ab 100644 --- a/public/language/pt-PT/email.json +++ b/public/language/pt-PT/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Tópicos recentes de %1", "digest.cta": "Clica aqui para visitares %1", "digest.unsub.info": "Este resumo foi-te enviado devido às tuas definições de subscrição.", - "digest.no_topics": "Não existem tópicos ativos desde %1", "digest.day": "dia", "digest.week": "semana", "digest.month": "mês", "digest.subject": "Resumo para %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Nova mensagem de %1", "notif.chat.cta": "Clique aqui para continuar a conversa", "notif.chat.unsub.info": "Esta notificação de chat foi enviada devido às suas definições de subscrição", diff --git a/public/language/pt-PT/error.json b/public/language/pt-PT/error.json index 94d39e0acc..adefefa74b 100644 --- a/public/language/pt-PT/error.json +++ b/public/language/pt-PT/error.json @@ -4,7 +4,7 @@ "not-logged-in": "Não tens sessão iniciada.", "account-locked": "A sua conta foi bloqueada temporariamente", "search-requires-login": "A pesquisa requer uma conta de utilizador - por favor inicia sessão ou cria uma conta.", - "goback": "Press back to return to the previous page", + "goback": "Pressione Voltar para retornar à página anterior", "invalid-cid": "ID de categoria inválido", "invalid-tid": "ID de tópico inválido", "invalid-pid": "ID de post inválido", @@ -33,6 +33,7 @@ "username-too-short": "Nome de utilizador muito curto", "username-too-long": "Nome de utilizador muito longo", "password-too-long": "Palavra-passe muito longa", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Utilizador banido", "user-banned-reason": "Desculpa, esta conta foi banida (Motivo: %1)", "user-banned-reason-until": "Desculpa, esta conta foi banida até %1 (Motivo: %2)", @@ -117,10 +118,10 @@ "cant-edit-chat-message": "Não tens permissão para editar esta mensagem", "cant-remove-last-user": "Não podes remover o último utilizador", "cant-delete-chat-message": "Não tens permissão para eliminar esta mensagem", - "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-edit-duration-expired": "Só tens permissão para editar mensagens do chat %1 segundo(s) depois de publicares", + "chat-delete-duration-expired": "Só tens permissão para apagar mensagens do chat %1 segundo(s) depois de publicares", "chat-deleted-already": "Esta mensagem já foi apagada.", - "chat-restored-already": "This chat message has already been restored.", + "chat-restored-already": "Esta mensagem já foi restaurada.", "already-voting-for-this-post": "Já votaste nesta publicação.", "reputation-system-disabled": "Sistema de reputação desativado.", "downvoting-disabled": "Os votos negativos estão desativados", @@ -153,7 +154,7 @@ "cant-move-to-same-topic": "Não podes mover publicações para o mesmo tópico!", "cannot-block-self": "Não podes bloquear-te a ti próprio!", "cannot-block-privileged": "Não podes bloquear administradores ou moderadores globais", - "cannot-block-guest": "Guest are not able to block other users", + "cannot-block-guest": "Convidados não podem bloquear outros utilizadores", "already-blocked": "Este utilizador já está bloqueado", "already-unblocked": "Este utilizador já está desbloqueado", "no-connection": "Parece haver um problema com a tua conexão à Internet" diff --git a/public/language/pt-PT/flags.json b/public/language/pt-PT/flags.json index 57f97ca6c1..713fd75064 100644 --- a/public/language/pt-PT/flags.json +++ b/public/language/pt-PT/flags.json @@ -9,6 +9,7 @@ "updated": "Atualizado", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "graph-label": "Denúncias Diárias", "quick-filters": "Filtros Rápidos", "filter-active": "There are one or more filters active in this list of flags", "filter-reset": "Remover Filtros", @@ -55,11 +56,11 @@ "modal-body": "Please specify your reason for flagging %1 %2 for review. Alternatively, use one of the quick report buttons if applicable.", "modal-reason-spam": "Spam", "modal-reason-offensive": "Ofensivo", - "modal-reason-other": "Other (specify below)", + "modal-reason-other": "Outra (especificar abaixo)", "modal-reason-custom": "Motivo para denunciar este conteúdo...", "modal-submit": "Submeter Denúncia", "modal-submit-success": "Este conteúdo foi denunciado para moderação.", - "modal-submit-confirm": "Confirm Submission", + "modal-submit-confirm": "Confirmar Submissão", "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." } \ No newline at end of file diff --git a/public/language/pt-PT/global.json b/public/language/pt-PT/global.json index 63d969ec1f..700dd16a8e 100644 --- a/public/language/pt-PT/global.json +++ b/public/language/pt-PT/global.json @@ -75,7 +75,7 @@ "norecentposts": "Não existen publicações recentes", "norecenttopics": "Não existem tópicos recentes", "recentposts": "Publicações recentes", - "recentips": "Recentemente logged em IPs", + "recentips": "Recentemente com sessões iniciadas em IPs", "moderator_tools": "Ferramentas de moderador", "away": "Ausente", "dnd": "Não perturbar", @@ -108,6 +108,6 @@ "cookies.learn_more": "Aprende Mais", "edited": "Edited", "disabled": "Desativado", - "select": "Select", + "select": "Selecionar", "user-search-prompt": "Digita algo aqui para encontrar utilizadores..." } \ No newline at end of file diff --git a/public/language/pt-PT/notifications.json b/public/language/pt-PT/notifications.json index 9ce82f98d7..24f72dd636 100644 --- a/public/language/pt-PT/notifications.json +++ b/public/language/pt-PT/notifications.json @@ -56,7 +56,7 @@ "notificationType_follow": "Quando alguém começa a seguir-te", "notificationType_new-chat": "Quando recebes uma mensagem numa conversa", "notificationType_group-invite": "Quando recebes um convite para um grupo", - "notificationType_group-request-membership": "When someone requests to join a group you own", + "notificationType_group-request-membership": "Quando alguém pede para entrar num grupo que é teu", "notificationType_new-register": "Quando alguém é adicionado à fila de espera de registo", "notificationType_post-queue": "Quando uma nova publicação está à espera de aprovação", "notificationType_new-post-flag": "Quando uma publicação é denunciada", diff --git a/public/language/pt-PT/pages.json b/public/language/pt-PT/pages.json index 7d68622db7..057bfb9ba8 100644 --- a/public/language/pt-PT/pages.json +++ b/public/language/pt-PT/pages.json @@ -23,7 +23,7 @@ "users/search": "Pesquisa por utilizadores", "notifications": "Notificações", "tags": "Marcadores", - "tag": "Topics tagged under "%1"", + "tag": "Tópicos marcados sobre "%1"", "register": "Registar uma conta", "registration-complete": "Registro completo", "login": "Inicia sessão na tua conta", diff --git a/public/language/pt-PT/search.json b/public/language/pt-PT/search.json index fb78ef1d25..5b9853e0b3 100644 --- a/public/language/pt-PT/search.json +++ b/public/language/pt-PT/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Limpar preferências", "search-preferences-saved": "Preferências de pesquisa guardadas", "search-preferences-cleared": "Preferências de pesquisa gravadas", - "show-results-as": "Mostrar resultados como" + "show-results-as": "Mostrar resultados como", + "see-more-results": "Ver mais resultados (%1)" } \ No newline at end of file diff --git a/public/language/pt-PT/topic.json b/public/language/pt-PT/topic.json index c2dc7f548e..74945e942e 100644 --- a/public/language/pt-PT/topic.json +++ b/public/language/pt-PT/topic.json @@ -101,7 +101,7 @@ "composer.title_placeholder": "Insere aqui o título do tópico...", "composer.handle_placeholder": "Nome", "composer.discard": "Descartar", - "composer.submit": "Submeter", + "composer.submit": "Publicar", "composer.replying_to": "Respondendo a %1", "composer.new_topic": "Novo tópico", "composer.uploading": "carregando...", diff --git a/public/language/pt-PT/user.json b/public/language/pt-PT/user.json index d2cde8e4fc..52e55f5630 100644 --- a/public/language/pt-PT/user.json +++ b/public/language/pt-PT/user.json @@ -28,7 +28,7 @@ "watched_categories": "Categorias subscritas", "watched": "Subscritos", "ignored": "Ignorados", - "default-category-watch-state": "Default category watch state", + "default-category-watch-state": "Estado predefinido da subscrição de categorias", "followers": "Seguidores", "following": "Seguindo", "blocks": "Bloqueados", @@ -117,7 +117,7 @@ "upvote-notif-freq.logarithmic": "Aos 10, 100, 1000...", "upvote-notif-freq.disabled": "Desativado", "browsing": "Definições de navegação", - "open_links_in_new_tab": "Abrir links num novo separador", + "open_links_in_new_tab": "Abrir links externos num novo separador", "enable_topic_searching": "Permitir pesquisa dentro dos tópicos", "topic_search_help": "Se ativada, a pesquisa dentro de tópicos irá sobrepor-se ao comportamento normal de pesquisa do browser pré-definido e irá permitir-te pesquisar ao longo de todo o tópico, em vez de pesquisar somente no que é mostrado no ecrã", "scroll_to_my_post": "Depois de publicar uma resposta, mostrar a nova publicação", @@ -128,7 +128,7 @@ "select-skin": "Seleciona uma máscara", "select-homepage": "Seleciona a página inicial", "homepage": "Página Inicial", - "homepage_description": "Seleciona a página que irás usar como página inicial do fórum ou \"Nenhum\" para usar a página inicial por defeito", + "homepage_description": "Seleciona a página que irás usar como página inicial do fórum ou \"Nenhuma\" para usar a página inicial por defeito", "custom_route": "Rota para a página inicial personalizada", "custom_route_help": "Introduz aqui o nome da rota, sem uma barra a preceder (por exemplo: \"recente\", ou \"popular\")", "sso.title": "Serviços de login único", diff --git a/public/language/ro/admin/advanced/database.json b/public/language/ro/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/ro/admin/advanced/database.json +++ b/public/language/ro/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/ro/admin/general/navigation.json b/public/language/ro/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/ro/admin/general/navigation.json +++ b/public/language/ro/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/ro/admin/manage/categories.json b/public/language/ro/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/ro/admin/manage/categories.json +++ b/public/language/ro/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/ro/admin/manage/privileges.json b/public/language/ro/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/ro/admin/manage/privileges.json +++ b/public/language/ro/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/ro/admin/settings/group.json b/public/language/ro/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/ro/admin/settings/group.json +++ b/public/language/ro/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/ro/admin/settings/tags.json b/public/language/ro/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/ro/admin/settings/tags.json +++ b/public/language/ro/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/ro/admin/settings/user.json b/public/language/ro/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/ro/admin/settings/user.json +++ b/public/language/ro/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/ro/email.json b/public/language/ro/email.json index 00c4a7d3e4..d55effa430 100644 --- a/public/language/ro/email.json +++ b/public/language/ro/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Ultimele mesaje de la %1", "digest.cta": "Apasă aici pentru a vizita %1", "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.no_topics": "There have been no active topics in the past %1", "digest.day": "zi", "digest.week": "saptămână", "digest.month": "lună", "digest.subject": "Rezumat pentru %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Ai primit un mesaj de la %1", "notif.chat.cta": "Apasă aici pentru a continua conversația", "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.", diff --git a/public/language/ro/error.json b/public/language/ro/error.json index 1eb9536889..abfabf0cac 100644 --- a/public/language/ro/error.json +++ b/public/language/ro/error.json @@ -33,6 +33,7 @@ "username-too-short": "Numele de utilizator este prea scurt", "username-too-long": "Numele de utilizator este prea lung", "password-too-long": "Parola prea lunga.", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Utilizator banat", "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)", diff --git a/public/language/ro/flags.json b/public/language/ro/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/ro/flags.json +++ b/public/language/ro/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/ro/search.json b/public/language/ro/search.json index 20b243d5d3..b30dc172f6 100644 --- a/public/language/ro/search.json +++ b/public/language/ro/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/ru/admin/advanced/database.json b/public/language/ru/admin/advanced/database.json index 0a3c3bf16f..f1ad2d7ed8 100644 --- a/public/language/ru/admin/advanced/database.json +++ b/public/language/ru/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "Сырые данные о MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Версия Redis", diff --git a/public/language/ru/admin/general/navigation.json b/public/language/ru/admin/general/navigation.json index a502a25a26..4f0a6caa30 100644 --- a/public/language/ru/admin/general/navigation.json +++ b/public/language/ru/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Подсказка:", "text": "Текст:", "text-class": "Класс текста: опциоально", + "class": "Class: optional", "id": "ID: опциоанально", "properties": "Свойства:", diff --git a/public/language/ru/admin/manage/categories.json b/public/language/ru/admin/manage/categories.json index 68ea65b2e0..666b39df71 100644 --- a/public/language/ru/admin/manage/categories.json +++ b/public/language/ru/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Указать категорию", "set-parent-category": "Указать родительскую категорию", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Замечание: Настройки прав применяются немедленно. Нет необходимости сохранять категорию после изменения настроек.", "privileges.section-viewing": "Права на просмотр", "privileges.section-posting": "Права на создание поста", "privileges.section-moderation": "Права модераторов", + "privileges.section-other": "Other", "privileges.section-user": "Пользователь", "privileges.search-user": "Добавить пользователя", "privileges.no-users": "В этой категории нет специально заданных прав пользователя.", diff --git a/public/language/ru/admin/manage/privileges.json b/public/language/ru/admin/manage/privileges.json index 555df9a8ca..9e4540e108 100644 --- a/public/language/ru/admin/manage/privileges.json +++ b/public/language/ru/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Поиск по содержимому", "search-users": "Поиск участников", "search-tags": "Поиск тегов", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Локальная авторизация", + "allow-group-creation": "Group Create", "find-category": "Поиск категории", "access-category": "Доступ к категории", diff --git a/public/language/ru/admin/settings/group.json b/public/language/ru/admin/settings/group.json index 68fbb33e62..4f9d84de9a 100644 --- a/public/language/ru/admin/settings/group.json +++ b/public/language/ru/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Приватные группы", "private-groups.help": "Если включено, то вступление в группы требует подтверждение хозяина группы (Включено по умолчанию)", "private-groups.warning": "Внимание! если эта настройка выключена и у вас есть приватные группы, то они автоматически станут публичными.", - "allow-creation": "Разрешить создание групп", - "allow-creation-help": "Если включено, то участники могут создавать группы (Выключено по умолчанию)", "allow-multiple-badges-help": "Этот флаг может быть использован чтобы позволить участникам выбрать несколько бейджей групп, функция требует поддержки темы.", "max-name-length": "Максимальная длина названия группы", + "max-title-length": "Maximum Group Title Length", "cover-image": "Картинка группы", "default-cover": "Картинки по умолчанию", "default-cover-help": "Добавьте через запятую картинки для групп, которые не имеют своих" diff --git a/public/language/ru/admin/settings/tags.json b/public/language/ru/admin/settings/tags.json index a327f262d5..ae5b50c6eb 100644 --- a/public/language/ru/admin/settings/tags.json +++ b/public/language/ru/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Минимальная длина метки", "max-length": "Максимальная длина метки", "goto-manage": "Нажмите сюда чтобы перейти на страницу управления метками", - "privacy": "Приватность", - "list-private": "Сделать список меток приватным", "related-topics": "Похожие темы", "max-related-topics": "Максимальное количество похожих тем для отображения (если тема поддерживает эту настройку)" } \ No newline at end of file diff --git a/public/language/ru/admin/settings/user.json b/public/language/ru/admin/settings/user.json index 7f8fc4231e..e4fc2d6e85 100644 --- a/public/language/ru/admin/settings/user.json +++ b/public/language/ru/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Отключить изменение email пользователя", "disable-password-changes": "Отключить изменение пароля", "allow-account-deletion": "Разрешить удаление аккаунта", - "user-info-private": "Спрятать список пользователей и их данные от гостей", "hide-fullname": "Спрятать полные имена от пользователей", "hide-email": "Спрятать email от пользователей", "themes": "Темы", diff --git a/public/language/ru/email.json b/public/language/ru/email.json index 5ed2ae25cd..9817bf7813 100644 --- a/public/language/ru/email.json +++ b/public/language/ru/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Последние темы %1", "digest.cta": "Нажмите здесь для просмотра %1", "digest.unsub.info": "Вам были отправлены новости сайта в соответствии с вашими настройками.", - "digest.no_topics": "Нет активных тем за %1", "digest.day": "день", "digest.week": "неделя", "digest.month": "месяц", "digest.subject": "Новости для %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Новое сообщение от %1", "notif.chat.cta": "Нажмите, чтобы ответить", "notif.chat.unsub.info": "Вы получили это уведомление в соответствии с настройками своей подписки на новости сайта.", diff --git a/public/language/ru/error.json b/public/language/ru/error.json index 95c3c03f46..68aa89494a 100644 --- a/public/language/ru/error.json +++ b/public/language/ru/error.json @@ -33,6 +33,7 @@ "username-too-short": "Слишком короткое имя пользователя", "username-too-long": "Имя пользователя слишком длинное", "password-too-long": "Пароль слишком длинный", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Участник заблокирован", "user-banned-reason": "Учетная запись заблокирована (Причина: %1)", "user-banned-reason-until": "Извините, этот аккаунт забанен до %1 (Причина: %2)", diff --git a/public/language/ru/flags.json b/public/language/ru/flags.json index 8b7c2dcb3e..5daf1aa285 100644 --- a/public/language/ru/flags.json +++ b/public/language/ru/flags.json @@ -9,6 +9,7 @@ "updated": "Обновлено", "target-purged": "Содержимое указанной метки было очищено и больше не доступно.", + "graph-label": "Daily Flags", "quick-filters": "Быстрые фильтры", "filter-active": "В этом списке меток есть один или несколько фильтров", "filter-reset": "Убрать фильтры", diff --git a/public/language/ru/search.json b/public/language/ru/search.json index 05e273ef01..5e0d2f21cb 100644 --- a/public/language/ru/search.json +++ b/public/language/ru/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Очистить настройки", "search-preferences-saved": "Настройки поиска сохранены", "search-preferences-cleared": "Настройки поиска очищены", - "show-results-as": "Показать результаты как:" + "show-results-as": "Показать результаты как:", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/rw/admin/advanced/database.json b/public/language/rw/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/rw/admin/advanced/database.json +++ b/public/language/rw/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/rw/admin/general/navigation.json b/public/language/rw/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/rw/admin/general/navigation.json +++ b/public/language/rw/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/rw/admin/manage/categories.json b/public/language/rw/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/rw/admin/manage/categories.json +++ b/public/language/rw/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/rw/admin/manage/privileges.json b/public/language/rw/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/rw/admin/manage/privileges.json +++ b/public/language/rw/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/rw/admin/settings/group.json b/public/language/rw/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/rw/admin/settings/group.json +++ b/public/language/rw/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/rw/admin/settings/tags.json b/public/language/rw/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/rw/admin/settings/tags.json +++ b/public/language/rw/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/rw/admin/settings/user.json b/public/language/rw/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/rw/admin/settings/user.json +++ b/public/language/rw/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/rw/email.json b/public/language/rw/email.json index 9524e3aea0..f93117ed23 100644 --- a/public/language/rw/email.json +++ b/public/language/rw/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Ibiganiro biheruka bya %1", "digest.cta": "Kanda hano kugirango usure %1", "digest.unsub.info": "Izi ngingo z'ingenzi zakohererejwe kuko waziyandikishijeho", - "digest.no_topics": "Nta biganiro bishyushye byagaragaye mu gihe gishize cya %1", "digest.day": "umunsi", "digest.week": "icyumweru", "digest.month": "ukwezi", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Ubutumwa bwo mu gikari bwaturutse kuri %1", "notif.chat.cta": "Kanda hano kugirango ukomeze", "notif.chat.unsub.info": "Iri tangazo rijyanye n'ubutumwa bwo mu gikari waryohererejwe kubera ko wabihisemo mu byo uzajya umenyeshwa", diff --git a/public/language/rw/error.json b/public/language/rw/error.json index b85698b104..7ef814fdbe 100644 --- a/public/language/rw/error.json +++ b/public/language/rw/error.json @@ -33,6 +33,7 @@ "username-too-short": "Izina ni rigufi cyane", "username-too-long": "Izina ni rirerire cyane", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Umuntu wirukanwe", "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)", diff --git a/public/language/rw/flags.json b/public/language/rw/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/rw/flags.json +++ b/public/language/rw/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/rw/search.json b/public/language/rw/search.json index f226017170..42b3e8dd5e 100644 --- a/public/language/rw/search.json +++ b/public/language/rw/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Hanagura ibyo wahisemo", "search-preferences-saved": "Ibyo wahisemo mu gihe cy'ishaka byabitswe", "search-preferences-cleared": "Ibyo wahisemo mu gihe cy'ishaka byahanaguwe", - "show-results-as": "Ibiboneka bigaragazwe nk'" + "show-results-as": "Ibiboneka bigaragazwe nk'", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/sc/admin/advanced/database.json b/public/language/sc/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/sc/admin/advanced/database.json +++ b/public/language/sc/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/sc/admin/general/navigation.json b/public/language/sc/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/sc/admin/general/navigation.json +++ b/public/language/sc/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/sc/admin/manage/categories.json b/public/language/sc/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/sc/admin/manage/categories.json +++ b/public/language/sc/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/sc/admin/manage/privileges.json b/public/language/sc/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/sc/admin/manage/privileges.json +++ b/public/language/sc/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/sc/admin/settings/group.json b/public/language/sc/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/sc/admin/settings/group.json +++ b/public/language/sc/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/sc/admin/settings/tags.json b/public/language/sc/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/sc/admin/settings/tags.json +++ b/public/language/sc/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/sc/admin/settings/user.json b/public/language/sc/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/sc/admin/settings/user.json +++ b/public/language/sc/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/sc/email.json b/public/language/sc/email.json index 51506cf884..356cf0d7c3 100644 --- a/public/language/sc/email.json +++ b/public/language/sc/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Latest topics from %1", "digest.cta": "Click here to visit %1", "digest.unsub.info": "This digest was sent to you due to your subscription settings.", - "digest.no_topics": "There have been no active topics in the past %1", "digest.day": "day", "digest.week": "week", "digest.month": "month", "digest.subject": "Digest for %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "New chat message received from %1", "notif.chat.cta": "Click here to continue the conversation", "notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.", diff --git a/public/language/sc/error.json b/public/language/sc/error.json index 9a140cbb8d..5b18f5f9aa 100644 --- a/public/language/sc/error.json +++ b/public/language/sc/error.json @@ -33,6 +33,7 @@ "username-too-short": "Username too short", "username-too-long": "Username too long", "password-too-long": "Password too long", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "User banned", "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)", diff --git a/public/language/sc/flags.json b/public/language/sc/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/sc/flags.json +++ b/public/language/sc/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/sc/search.json b/public/language/sc/search.json index f044781ff7..2e966d40f7 100644 --- a/public/language/sc/search.json +++ b/public/language/sc/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/sk/admin/advanced/database.json b/public/language/sk/admin/advanced/database.json index 37b3b66953..6d2b239a61 100644 --- a/public/language/sk/admin/advanced/database.json +++ b/public/language/sk/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "Raw informácie MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Verzia Redis", diff --git a/public/language/sk/admin/general/navigation.json b/public/language/sk/admin/general/navigation.json index 067c8e30f6..24125b086b 100644 --- a/public/language/sk/admin/general/navigation.json +++ b/public/language/sk/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tip:", "text": "Text:", "text-class": "Textová trieda: doporučené", + "class": "Class: optional", "id": "ID: doporučené", "properties": "Vlastnosti:", diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index 9ead6282ef..35fb1a91dd 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Vyberte kategóriu", "set-parent-category": "Nastaviť nadradenú kategóriu", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Poznámka: nastavenie oprávnení má okamžitý vplyv. Nie je teda nutné uložiť kategóriu pre upravenie týchto nastavení", "privileges.section-viewing": "Oprávnenie prehliadania", "privileges.section-posting": "Oprávnenie príspevkov", "privileges.section-moderation": "Oprávnenie moderovania", + "privileges.section-other": "Other", "privileges.section-user": "Používateľ", "privileges.search-user": "Pridať používateľa", "privileges.no-users": "V tejto kategórií nie je nastavené žiadne oprávnenie používateľa.", diff --git a/public/language/sk/admin/manage/privileges.json b/public/language/sk/admin/manage/privileges.json index 7db8d62fc1..a9c380ad2b 100644 --- a/public/language/sk/admin/manage/privileges.json +++ b/public/language/sk/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Vyhľadať obsah", "search-users": "Vyhľadať používateľov", "search-tags": "Vyhľadať značky", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Nájsť kategóriu", "access-category": "Prístup ku kategórií", diff --git a/public/language/sk/admin/settings/group.json b/public/language/sk/admin/settings/group.json index b910658585..5503544eb8 100644 --- a/public/language/sk/admin/settings/group.json +++ b/public/language/sk/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Súkromné ​​skupiny", "private-groups.help": "Ak je povolené, pripojenie k skupine vyžaduje schválenie zakladateľa skupiny (Predvolené: povolené)", "private-groups.warning": "Ale pozor, ak je táto možnosť zakázaná a vy máte súkromné ​​skupiny, stanú sa automaticky verejnými.", - "allow-creation": "Povoliť vytvorenie skupín", - "allow-creation-help": "Ak je povolené, používatelia môžu vytvoriť skupiny (Predvolené: zakázané)", "allow-multiple-badges-help": "Toto označenie môže byť použité, aby používatelia mohli vybrať niekoľko skupinových symbolov, vyžaduj podporu motívov.", "max-name-length": "Maximálna dĺžka názvu skupiny", + "max-title-length": "Maximum Group Title Length", "cover-image": "Obrázok skupiny", "default-cover": "Predvolený obrázok", "default-cover-help": "Pre skupiny, ktoré nemajú nahraný obrázok, pridajte predvolené obrázky oddelené čiarkami" diff --git a/public/language/sk/admin/settings/tags.json b/public/language/sk/admin/settings/tags.json index d86fa52667..342c7be91f 100644 --- a/public/language/sk/admin/settings/tags.json +++ b/public/language/sk/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimálna dĺžka značky", "max-length": "Maximálna dĺžka značky", "goto-manage": "K presunu na stránku správy značiek, kliknite sem.", - "privacy": "Súkromie", - "list-private": "Zoznam značiek je súkromný", "related-topics": "Súvisiace témy", "max-related-topics": "Maximálny počet zobrazených súvisiacich tém (ak je podporované motívom)" } \ No newline at end of file diff --git a/public/language/sk/admin/settings/user.json b/public/language/sk/admin/settings/user.json index f69cf571da..e2c8170e41 100644 --- a/public/language/sk/admin/settings/user.json +++ b/public/language/sk/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Zakázať zmenu e-mailu", "disable-password-changes": "Zakázať zmenu hesla", "allow-account-deletion": "Povoliť zmazanie účtu", - "user-info-private": "Skryť zoznam používateľov a údaje pred hosťami", "hide-fullname": "Skryť meno pred používateľom", "hide-email": "Skryť e-mail pre používateľmi", "themes": "Vzhľady", diff --git a/public/language/sk/email.json b/public/language/sk/email.json index afdfa2b901..34ebd4fb42 100644 --- a/public/language/sk/email.json +++ b/public/language/sk/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Najnovšie témy od %1", "digest.cta": "Kliknite sem a navštívite %1", "digest.unsub.info": "Tento oznam ste prijali na základe Vašich nastavení odoberania.", - "digest.no_topics": "Za posledných %1 neboli žiadne aktívne témy", "digest.day": "deň", "digest.week": "týždeň", "digest.month": "mesiac", "digest.subject": "Prehľad za %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Máte novú správu od %1", "notif.chat.cta": "Kliknite sem pre pokračovanie v konverzácii", "notif.chat.unsub.info": "Túto správu konverzácie ste prijali na základe Vašich nastavení odoberania.", diff --git a/public/language/sk/error.json b/public/language/sk/error.json index c4d0aec403..55208be761 100644 --- a/public/language/sk/error.json +++ b/public/language/sk/error.json @@ -33,6 +33,7 @@ "username-too-short": "Užívateľské meno je príliš krátke", "username-too-long": "Užívateľské meno je príliš dlhé", "password-too-long": "Heslo je príliš dlhé", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Užívateľ je zablokovaný", "user-banned-reason": "Prepáčte, tento účet bol zablokovaný (Dôvod: %1)", "user-banned-reason-until": "Ospravedlňujeme sa, tento účet bol zablokovaný do %1 (Dôvod: %2)", diff --git a/public/language/sk/flags.json b/public/language/sk/flags.json index 0c69cc04e1..b530bb7394 100644 --- a/public/language/sk/flags.json +++ b/public/language/sk/flags.json @@ -9,6 +9,7 @@ "updated": "Aktualizované", "target-purged": "Obsah, na ktorý sa vzťahuje toto označenie, bol odstránený a už nie je k dispozícii.", + "graph-label": "Daily Flags", "quick-filters": "Rýchle filtre", "filter-active": "V tomto zozname označení je aktívny jeden alebo viac filtrov", "filter-reset": "Odstrániť filtre", diff --git a/public/language/sk/search.json b/public/language/sk/search.json index 6a008e5275..4c83ac7db1 100644 --- a/public/language/sk/search.json +++ b/public/language/sk/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Vyčistiť predvoľby", "search-preferences-saved": "Vyhľadávacie predvoľby uložené", "search-preferences-cleared": "Vyhľadávacie predvoľby vyčistené", - "show-results-as": "Zobraziť výsledky ako" + "show-results-as": "Zobraziť výsledky ako", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/sl/admin/advanced/database.json b/public/language/sl/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/sl/admin/advanced/database.json +++ b/public/language/sl/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/sl/admin/general/navigation.json b/public/language/sl/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/sl/admin/general/navigation.json +++ b/public/language/sl/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/sl/admin/manage/categories.json b/public/language/sl/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/sl/admin/manage/categories.json +++ b/public/language/sl/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/sl/admin/manage/privileges.json b/public/language/sl/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/sl/admin/manage/privileges.json +++ b/public/language/sl/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/sl/admin/settings/group.json b/public/language/sl/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/sl/admin/settings/group.json +++ b/public/language/sl/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/sl/admin/settings/tags.json b/public/language/sl/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/sl/admin/settings/tags.json +++ b/public/language/sl/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/sl/admin/settings/user.json b/public/language/sl/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/sl/admin/settings/user.json +++ b/public/language/sl/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/sl/email.json b/public/language/sl/email.json index 6f1da70fe0..5c76aa0bb7 100644 --- a/public/language/sl/email.json +++ b/public/language/sl/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Zadnje teme na forumu %1", "digest.cta": "Kliknite tu za obisk foruma %1.", "digest.unsub.info": "Ta povzetek vam je bil poslan zaradi nastavitev vaše naročnine.", - "digest.no_topics": "%1 ni bilo aktivnih tem.", "digest.day": "Dan", "digest.week": "Teden", "digest.month": "Mesec", "digest.subject": "Povzetek za %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Uporabnik %1 vam je poslal novo sporočilo za klepet.", "notif.chat.cta": "Kliknite tu za nadaljevanje pogovora.", "notif.chat.unsub.info": "Obvestilo o klepetu vam je bilo poslano zaradi nastavitev vaše naročnine.", diff --git a/public/language/sl/error.json b/public/language/sl/error.json index 54bc907625..11087be496 100644 --- a/public/language/sl/error.json +++ b/public/language/sl/error.json @@ -33,6 +33,7 @@ "username-too-short": "Uporabniško ime je prekratko.", "username-too-long": "Uporabniško ime je predolgo.", "password-too-long": "Geslo je predolgo.", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Uporabnik je izločen.", "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)", diff --git a/public/language/sl/flags.json b/public/language/sl/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/sl/flags.json +++ b/public/language/sl/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/sl/search.json b/public/language/sl/search.json index aaaed9e804..9733678356 100644 --- a/public/language/sl/search.json +++ b/public/language/sl/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Počisti nastavitve", "search-preferences-saved": "Poišči shranjene nastavitve", "search-preferences-cleared": "Poišči počiščene nastavitve", - "show-results-as": "Prikaži rezultate kot" + "show-results-as": "Prikaži rezultate kot", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/sr/admin/advanced/database.json b/public/language/sr/admin/advanced/database.json index ff749ac7e3..a529f06370 100644 --- a/public/language/sr/admin/advanced/database.json +++ b/public/language/sr/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "Sirove informacije o MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis verzija", diff --git a/public/language/sr/admin/general/navigation.json b/public/language/sr/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/sr/admin/general/navigation.json +++ b/public/language/sr/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/sr/admin/manage/categories.json b/public/language/sr/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/sr/admin/manage/categories.json +++ b/public/language/sr/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/sr/admin/manage/privileges.json b/public/language/sr/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/sr/admin/manage/privileges.json +++ b/public/language/sr/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/sr/admin/settings/group.json b/public/language/sr/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/sr/admin/settings/group.json +++ b/public/language/sr/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/sr/admin/settings/tags.json b/public/language/sr/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/sr/admin/settings/tags.json +++ b/public/language/sr/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/sr/admin/settings/user.json b/public/language/sr/admin/settings/user.json index 7cc55264a2..1d8e88292a 100644 --- a/public/language/sr/admin/settings/user.json +++ b/public/language/sr/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Onemogući promenu email-a", "disable-password-changes": "Onemogući promenu šifre", "allow-account-deletion": "Dozvoli brisanje naloga", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Teme", diff --git a/public/language/sr/email.json b/public/language/sr/email.json index 2965377f4f..61c4699623 100644 --- a/public/language/sr/email.json +++ b/public/language/sr/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Недавне теме од %1", "digest.cta": "Кликните овде да посетите %1", "digest.unsub.info": "Овај сажетак вам је послат услед вашег подешавања претплате.", - "digest.no_topics": "Није било активних тема у последњих %1", "digest.day": "Дан", "digest.week": "Недеља", "digest.month": "Месец", "digest.subject": "Сажетак за %1", + "digest.title": "Ваш дневни сажетак", "notif.chat.subject": "Примљена је нова порука ћаскања од %1", "notif.chat.cta": "Кликните овде да наставите са разговором", "notif.chat.unsub.info": "Ова обавештење о ћаскању вам је послато услед вашег подешавања претплате.", diff --git a/public/language/sr/error.json b/public/language/sr/error.json index 3302a06b65..8eb5f2cc97 100644 --- a/public/language/sr/error.json +++ b/public/language/sr/error.json @@ -33,6 +33,7 @@ "username-too-short": "Корисничко име је прекратко", "username-too-long": "Корисничко име је предуго", "password-too-long": "Шифра је предугачка.", + "reset-rate-limited": "Превише захтева за поништавање лозинке (ограничена стопа)", "user-banned": "Корисник је забрањен", "user-banned-reason": "Овај налог је забрањен (Разлог: %1)", "user-banned-reason-until": "Овај налог је забрањен до %1 (Разлог: %2)", diff --git a/public/language/sr/flags.json b/public/language/sr/flags.json index f071885b4b..d255f03598 100644 --- a/public/language/sr/flags.json +++ b/public/language/sr/flags.json @@ -9,6 +9,7 @@ "updated": "Ажурирано", "target-purged": "Садржај на који се односи ова заставица је очишћен и није више доступан.", + "graph-label": "Дневне заставице", "quick-filters": "Брзи филтери", "filter-active": "Постоји један или више активних филтера на овом списку заставица", "filter-reset": "Уклони заставице", diff --git a/public/language/sr/search.json b/public/language/sr/search.json index 9bf3a0750d..8a95aebdf7 100644 --- a/public/language/sr/search.json +++ b/public/language/sr/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Очисти поставке", "search-preferences-saved": "Поставке претраге су сачуване", "search-preferences-cleared": "Поставке претраге су очишћене", - "show-results-as": "Прикажи резултате као" + "show-results-as": "Прикажи резултате као", + "see-more-results": "Прикажи више резултата (%1)" } \ No newline at end of file diff --git a/public/language/sv/admin/advanced/database.json b/public/language/sv/admin/advanced/database.json index 9fccd39b48..9167b381ed 100644 --- a/public/language/sv/admin/advanced/database.json +++ b/public/language/sv/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB Raw Info", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Version", diff --git a/public/language/sv/admin/general/navigation.json b/public/language/sv/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/sv/admin/general/navigation.json +++ b/public/language/sv/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/sv/admin/manage/categories.json b/public/language/sv/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/sv/admin/manage/categories.json +++ b/public/language/sv/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/sv/admin/manage/privileges.json b/public/language/sv/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/sv/admin/manage/privileges.json +++ b/public/language/sv/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/sv/admin/settings/group.json b/public/language/sv/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/sv/admin/settings/group.json +++ b/public/language/sv/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/sv/admin/settings/tags.json b/public/language/sv/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/sv/admin/settings/tags.json +++ b/public/language/sv/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/sv/admin/settings/user.json b/public/language/sv/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/sv/admin/settings/user.json +++ b/public/language/sv/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/sv/email.json b/public/language/sv/email.json index 18a8010ae4..63eca46853 100644 --- a/public/language/sv/email.json +++ b/public/language/sv/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Senaste ämnen från %1", "digest.cta": "Klicka här för att besöka %1", "digest.unsub.info": "Det här meddelandet fick du på grund av dina inställningar för prenumeration. ", - "digest.no_topics": "Inga aktiva ämnen de senaste %1", "digest.day": "dag", "digest.week": "vecka", "digest.month": "månad", "digest.subject": "Sammanställt flöde för %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Nytt meddelande från %1", "notif.chat.cta": "Klicka här för att fortsätta konversationen", "notif.chat.unsub.info": "Denna notifikation skickades till dig på grund av dina inställningar för prenumerationer.", diff --git a/public/language/sv/error.json b/public/language/sv/error.json index abe326df9f..4b4dcfd518 100644 --- a/public/language/sv/error.json +++ b/public/language/sv/error.json @@ -33,6 +33,7 @@ "username-too-short": "Användarnamnet är för kort", "username-too-long": "Användarnamnet är för långt", "password-too-long": "Lösenordet är för långt", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Användare bannlyst", "user-banned-reason": "Vi beklagar, men detta konto har blivit bannlyst (Anledning: %1)", "user-banned-reason-until": "Vi beklagar, men detta konto har blivit bannlyst till %1 (Anledning: %2)", diff --git a/public/language/sv/flags.json b/public/language/sv/flags.json index 8e0476d5f7..399752a53e 100644 --- a/public/language/sv/flags.json +++ b/public/language/sv/flags.json @@ -9,6 +9,7 @@ "updated": "Uppdatering", "target-purged": "Innehållet denna flagga refererar till har rensats bort och är inte längre tillgängligt.", + "graph-label": "Daily Flags", "quick-filters": "Snabbfilter", "filter-active": "Ett eller flera filter är aktiva i denna lista med flaggor", "filter-reset": "Ta bort filter", diff --git a/public/language/sv/search.json b/public/language/sv/search.json index 6d8a297300..60350b7d31 100644 --- a/public/language/sv/search.json +++ b/public/language/sv/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Rensa inställningar", "search-preferences-saved": "Sökinställningar sparade", "search-preferences-cleared": "Sökinställningar rensade", - "show-results-as": "Visa resultat som" + "show-results-as": "Visa resultat som", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/th/admin/advanced/database.json b/public/language/th/admin/advanced/database.json index f73d0bddd7..9f196b465b 100644 --- a/public/language/th/admin/advanced/database.json +++ b/public/language/th/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "ข้อมูลดิบของ MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis เวอร์ชั่น", diff --git a/public/language/th/admin/general/navigation.json b/public/language/th/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/th/admin/general/navigation.json +++ b/public/language/th/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/th/admin/manage/categories.json b/public/language/th/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/th/admin/manage/categories.json +++ b/public/language/th/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/th/admin/manage/privileges.json b/public/language/th/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/th/admin/manage/privileges.json +++ b/public/language/th/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/th/admin/settings/group.json b/public/language/th/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/th/admin/settings/group.json +++ b/public/language/th/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/th/admin/settings/tags.json b/public/language/th/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/th/admin/settings/tags.json +++ b/public/language/th/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/th/admin/settings/user.json b/public/language/th/admin/settings/user.json index eda2151395..d88af19459 100644 --- a/public/language/th/admin/settings/user.json +++ b/public/language/th/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "ธีม", diff --git a/public/language/th/email.json b/public/language/th/email.json index e737a129f8..4dd9481efe 100644 --- a/public/language/th/email.json +++ b/public/language/th/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "หัวข้อสนทนาล่าสุดจาก %1", "digest.cta": "กดตรงนี้เพื่อเข้าดู %1", "digest.unsub.info": "คำชี้แจงถูกส่งไปให้คุณแล้ว เนื่องมาจากการตั้งค่าสมาชิกของคุณ", - "digest.no_topics": "ไม่มีกระทู้ใดๆเลยใน %1 ที่ผ่านมา", "digest.day": "วัน", "digest.week": "สัปดาห์", "digest.month": "เดือน", "digest.subject": "คำชี้แจงสำหรับ %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "ได้รับข้อความแชทใหม่จาก %1", "notif.chat.cta": "กดตรงนี้เพื่อกลับไปยังบทสนทนา", "notif.chat.unsub.info": "การแจ้งเตือนแชทนี้ถูกส่งไปหาคุณเนื่องจากการตั้งค่าสมาชิกของคุณ", diff --git a/public/language/th/error.json b/public/language/th/error.json index 60df1ca6bd..c2b7a93b08 100644 --- a/public/language/th/error.json +++ b/public/language/th/error.json @@ -33,6 +33,7 @@ "username-too-short": "ชื่อบัญชีผู้ใช้ สั้นเกินไป", "username-too-long": "ชื่อบัญชีผู้ใช้ ยาวเกินไป", "password-too-long": "รหัสผ่านยาวเกินไป", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "ผู้ใช้ได้รับการแบน", "user-banned-reason": "ขออภัย บัญชีผู้ใช้นี้ได้รับการแบน (เหตุผล : %1)", "user-banned-reason-until": "ขออภัย บัญชีผู้ใช้นี้ได้รับการแบนจนถึง %1 (เหตุผล : %2)", diff --git a/public/language/th/flags.json b/public/language/th/flags.json index d2acc00697..c64d0d599e 100644 --- a/public/language/th/flags.json +++ b/public/language/th/flags.json @@ -9,6 +9,7 @@ "updated": "ได้รับการอัพเดท", "target-purged": "เนื้อหาที่ธงนี้อ้างถึงถูกลบออกและไม่มีอยู่ในระบบอีกต่อไป", + "graph-label": "Daily Flags", "quick-filters": "ฟิลเตอร์แบบด่วน", "filter-active": "ไม่มีฟิลเตอร์ใดๆในรายการปักธง", "filter-reset": "ลบฟิลเตอร์ออก", diff --git a/public/language/th/search.json b/public/language/th/search.json index bc7878eb8e..51eb32da76 100644 --- a/public/language/th/search.json +++ b/public/language/th/search.json @@ -43,5 +43,6 @@ "clear-preferences": "ล้างการตั้งค่า", "search-preferences-saved": "ค้นหาการตั้งค่าที่บันทึกไว้", "search-preferences-cleared": "ค้นหาการตั้งค่าที่ลบล้างไป", - "show-results-as": "แสดงผลลัพธ์แบบ" + "show-results-as": "แสดงผลลัพธ์แบบ", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/tr/admin/advanced/database.json b/public/language/tr/admin/advanced/database.json index 8fa44d8074..4c9055afd4 100644 --- a/public/language/tr/admin/advanced/database.json +++ b/public/language/tr/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "gönderilen bayt", "mongo.num-requests": "İsteklerin Sayısı", "mongo.raw-info": "İşlenmemiş MongoDB Bilgisi", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis Versiyonu", diff --git a/public/language/tr/admin/general/navigation.json b/public/language/tr/admin/general/navigation.json index 42d907d2be..576c9e67a4 100644 --- a/public/language/tr/admin/general/navigation.json +++ b/public/language/tr/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Araç ipucu:", "text": "Yazı:", "text-class": "Metin Sınıfı: opsiyonel", + "class": "Class: optional", "id": "ID: opsiyonel", "properties": "Özellikler:", diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index 5064cc9781..c76997cdeb 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Kategori Seç", "set-parent-category": "Ana Kategori Ayarla", - "privileges.description": "Bu bölümde bu kategori için erişim denetimi ayrıcalıklarını yapılandırabilirsiniz. Ayrıcalıklar kullanıcı başına veya grup bazında verilebilir. Aşağıdaki açılır listeden etki alanını seçin.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "için yapılandırılan ayrıcalıklar", "privileges.warning": "Not: Ayrıcalık ayarları hemen yürürlüğe girer. Bu ayarları yaptıktan sonra kategoriyi kaydetmek gerekli değildir.", "privileges.section-viewing": "Ayrıcalıkları Görüntüle", "privileges.section-posting": "Gönderme Ayrıcalıkları", "privileges.section-moderation": "Moderatörlük Ayrıcalıkları", + "privileges.section-other": "Other", "privileges.section-user": "Kullanıcı", "privileges.search-user": "Kullanıcı Ekle", "privileges.no-users": "Bu kategoride kullanıcıya-özel ayrıcalıklar yok.", diff --git a/public/language/tr/admin/manage/privileges.json b/public/language/tr/admin/manage/privileges.json index c6f486390e..c1c8e54bc7 100644 --- a/public/language/tr/admin/manage/privileges.json +++ b/public/language/tr/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "İçerik Arama", "search-users": "Kullanıcıları Ara", "search-tags": "Etiketleri Ara", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Yerel Giriş", + "allow-group-creation": "Group Create", "find-category": "Kategori Bul", "access-category": "Kategoriye Eriş", diff --git a/public/language/tr/admin/settings/group.json b/public/language/tr/admin/settings/group.json index feb7c8ebb4..9c6ac12028 100644 --- a/public/language/tr/admin/settings/group.json +++ b/public/language/tr/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Gizli Grup", "private-groups.help": "Eğer etkinse, gruba katılmak için grup sahibinin onayı gerekir. (Varsayılan: Etkin)", "private-groups.warning": "Dikkat! Eğer bu opsiyon devre dışıysa ve özel gruplarınız varsa, onlar otomatik olarak genele dönüşecektir.", - "allow-creation": "Grup Oluşturmaya İzin Ver", - "allow-creation-help": "Eğer etkinse kullanıcılar grup oluşturabilir (Varsayılan: Pasif)", "allow-multiple-badges-help": "Bu bayrak, kullanıcıların birden fazla grup rozetini seçmelerine izin vermek için kullanılabilir, tema desteği gerektirir.", "max-name-length": "Maksimum Grup Adı Uzunluğu", + "max-title-length": "Maximum Group Title Length", "cover-image": "Grup Kapak Resmi", "default-cover": "Varsayılan Kapak Resmi", "default-cover-help": "Kapak resmi olmayan grupları, varsayılan kapak resimlerini kullanmaları için virgülle ayırarak ekleyin" diff --git a/public/language/tr/admin/settings/tags.json b/public/language/tr/admin/settings/tags.json index 6d572b2a14..fcaddb72c5 100644 --- a/public/language/tr/admin/settings/tags.json +++ b/public/language/tr/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Etiket Uzunluğu", "max-length": "Maksimum Etiket Uzunluğu", "goto-manage": "Etiketi yönetim sayfasını ziyaret etmek için buraya tıklayın", - "privacy": "Gizlilik", - "list-private": "Etiket listesini özel yap", "related-topics": "İlgili Konular", "max-related-topics": "Görüntülenecek maksimum ilgili konu sayısı (Tema destekliyorsa)" } \ No newline at end of file diff --git a/public/language/tr/admin/settings/user.json b/public/language/tr/admin/settings/user.json index 58348a09b0..d4dbcfa188 100644 --- a/public/language/tr/admin/settings/user.json +++ b/public/language/tr/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "E-posta değişikliklerini devre dışı bırak", "disable-password-changes": "Parola değişikliği kapalı", "allow-account-deletion": "Hesap silmeye izin ver", - "user-info-private": "Kullanıcı listesini ve verilerini ziyaretçilerden gizle", "hide-fullname": "Kullanıcı adını gizle", "hide-email": "E-posta adresini kullanıcılardan gizle", "themes": "Temalar", diff --git a/public/language/tr/email.json b/public/language/tr/email.json index c865d121b9..34ecc9d52c 100644 --- a/public/language/tr/email.json +++ b/public/language/tr/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "En güncel konular", "digest.cta": "Ziyaret etmek için buraya tıklayın", "digest.unsub.info": "Bu e-posta seçtiğiniz ayarlar nedeniyle gönderildi.", - "digest.no_topics": "Geçtiğimiz %1 içinde aktif bir konu yok.", "digest.day": "gün", "digest.week": "hafta", "digest.month": "ay", "digest.subject": "%1 için özet", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Okunmamış bazı iletileriniz var", "notif.chat.cta": "Sohbete devam etmek için buraya tıklayın", "notif.chat.unsub.info": "Bu bildirim şectiğiniz ayarlar yüzünden gönderildi.", diff --git a/public/language/tr/error.json b/public/language/tr/error.json index f6666f72ba..79502ee6cd 100644 --- a/public/language/tr/error.json +++ b/public/language/tr/error.json @@ -33,6 +33,7 @@ "username-too-short": "Kullanıcı ismi çok kısa", "username-too-long": "Kullanıcı ismi çok uzun.", "password-too-long": "Parola çok uzun", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Kullanıcı Yasaklı", "user-banned-reason": "Maalesef, bu hesap yasaklandı (Sebep: %1)", "user-banned-reason-until": "Maalesef, bu hesap %1 kadar yasaklandı (Sebep: %2)", diff --git a/public/language/tr/flags.json b/public/language/tr/flags.json index be282c9e9f..31679b4f71 100644 --- a/public/language/tr/flags.json +++ b/public/language/tr/flags.json @@ -9,6 +9,7 @@ "updated": "Güncellendi", "target-purged": "İlgili bayrağın içeriği temizlendi ve artık mevcut değil.", + "graph-label": "Daily Flags", "quick-filters": "Akıllı Filtre", "filter-active": "Bayraklar listesinde etkin olan bir veya daha fazla filtre var", "filter-reset": "Filtreleri Kaldır", diff --git a/public/language/tr/login.json b/public/language/tr/login.json index adbfba03c1..9b44474774 100644 --- a/public/language/tr/login.json +++ b/public/language/tr/login.json @@ -1,5 +1,5 @@ { - "username-email": "Kullancı Adı / E-posta Adresi", + "username-email": "Kullanıcı Adı / E-posta Adresi", "username": "Kullanıcı Adı", "email": "E-posta Adresi", "remember_me": "Beni Hatırla!", diff --git a/public/language/tr/register.json b/public/language/tr/register.json index 42ad051df3..9dd2e6be0a 100644 --- a/public/language/tr/register.json +++ b/public/language/tr/register.json @@ -19,7 +19,7 @@ "terms_of_use_error": "Kullanım şartlarını kabul etmen gerekiyor", "registration-added-to-queue": "Kayıt olma isteğiniz kabul listesine eklenmiştir. Yönetici tarafından kabul edildiğinizde e-posta alacaksınız.", "interstitial.intro": "Hesabınızı yaratmadan önce bazı ekstra bilgiler gerekiyor.", - "interstitial.errors-found": "Kaydınınız tamamlanmadı:", + "interstitial.errors-found": "Kaydınız tamamlanmadı:", "gdpr_agree_data": "Bu web sitesinde kişisel bilgilerimin toplanmasını ve işlenmesini kabul ediyorum.", "gdpr_agree_email": "Bu web sitesinden özet ve bildirim e-posta almaya izin veriyorum.", "gdpr_consent_denied": "Bilgilerinizi toplamak/işlemek ve size e-posta göndermek için bu siteye onay vermelisiniz." diff --git a/public/language/tr/search.json b/public/language/tr/search.json index 2b5090339f..39ede6091b 100644 --- a/public/language/tr/search.json +++ b/public/language/tr/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Tercihleri Sil", "search-preferences-saved": "Arama tercihleri kaydedildi", "search-preferences-cleared": "Arama tercihleri temizlendi", - "show-results-as": "Sonuçları göster : " + "show-results-as": "Sonuçları göster : ", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/tr/users.json b/public/language/tr/users.json index c47c0b15c8..346587747a 100644 --- a/public/language/tr/users.json +++ b/public/language/tr/users.json @@ -2,7 +2,7 @@ "latest_users": "En Yeni Kullanıcılar", "top_posters": "En Fazla Gönderim Yapanlar", "most_reputation": "En Saygın", - "most_flags": "En Fazla Bayrak", + "most_flags": "En Fazla Şikayet", "search": "Ara", "enter_username": "Aramak için bir kullanıcı adı girin", "load_more": "Daha Fazla Yükle", diff --git a/public/language/uk/admin/advanced/database.json b/public/language/uk/admin/advanced/database.json index bbb58fce7b..a904c115a4 100644 --- a/public/language/uk/admin/advanced/database.json +++ b/public/language/uk/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "Сирі дані від MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Версія Redis", diff --git a/public/language/uk/admin/general/navigation.json b/public/language/uk/admin/general/navigation.json index 8195353667..7e80dd4304 100644 --- a/public/language/uk/admin/general/navigation.json +++ b/public/language/uk/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Підказка:", "text": "Текст:", "text-class": "Класс тексту: необов'язковий", + "class": "Class: optional", "id": "ID: необов'язковий", "properties": "Властивості:", diff --git a/public/language/uk/admin/manage/categories.json b/public/language/uk/admin/manage/categories.json index d6098090e2..1c3e18db59 100644 --- a/public/language/uk/admin/manage/categories.json +++ b/public/language/uk/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Вибрати категорію", "set-parent-category": "Встановити батьківську категорію", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Увага: Налаштування прав миттєво вступають у дію. Необов'язкового зберігати категорію після зміни цих налаштувань.", "privileges.section-viewing": "Права перегляду", "privileges.section-posting": "Права постингу", "privileges.section-moderation": "Права модерації", + "privileges.section-other": "Other", "privileges.section-user": "Користувач", "privileges.search-user": "Додати користувача", "privileges.no-users": "Для цієї категорії не задано особливих прав.", diff --git a/public/language/uk/admin/manage/privileges.json b/public/language/uk/admin/manage/privileges.json index c276fe291c..fc9ca5e771 100644 --- a/public/language/uk/admin/manage/privileges.json +++ b/public/language/uk/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Шукати Зміст", "search-users": "Шукати Користувачів", "search-tags": "Шукати Теги", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Знайти Категорію", "access-category": "Доступ до Категорії", diff --git a/public/language/uk/admin/settings/group.json b/public/language/uk/admin/settings/group.json index e92f0896e3..183d361a88 100644 --- a/public/language/uk/admin/settings/group.json +++ b/public/language/uk/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Приватні групи", "private-groups.help": "Якщо увімкнено, приєднання до групи вимагає підтвердження власника (По замовчуванню: увімкнено)", "private-groups.warning": "Увага! Якщо ця опція вимикається і у вас є приватні групи, вони автоматично стають публічними.", - "allow-creation": "Дозволити створення груп", - "allow-creation-help": "Якщо увімкнено, користувачі можуть створювати групи (По замовчуванню: вимкнено)", "allow-multiple-badges-help": "Цей прапорець може бути використаний, щоб надати можливість користувачам обирати кілька бейджів груп, необхідна підтримка цієї можливості темою.", "max-name-length": "Максимальна довжина імені групи", + "max-title-length": "Maximum Group Title Length", "cover-image": "Зображення обкладинки групи", "default-cover": "Зображення обкладинки по замовчуванню", "default-cover-help": "Вкажіть розділені комами зображення обкладинок, що будуть використовуватись по замовчуванню для груп, що не завантажили власних" diff --git a/public/language/uk/admin/settings/tags.json b/public/language/uk/admin/settings/tags.json index d1bdbbd82c..c4bf5e8cb1 100644 --- a/public/language/uk/admin/settings/tags.json +++ b/public/language/uk/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Мінімальна довжина тега", "max-length": "Максимальна довжина тега", "goto-manage": "Натисніть тут, щоб перейти на сторінку налаштування тегів.", - "privacy": "Приватність", - "list-private": "Зробити список тегів приватним", "related-topics": "Пов'язані теми", "max-related-topics": "Максимальна кількість пов'язаних тем до показу (якщо підтримується темою)" } \ No newline at end of file diff --git a/public/language/uk/admin/settings/user.json b/public/language/uk/admin/settings/user.json index cb24270d1c..049e0214b5 100644 --- a/public/language/uk/admin/settings/user.json +++ b/public/language/uk/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Вимкнути зміну електронної пошти", "disable-password-changes": "Вимкнути зміну пароля", "allow-account-deletion": "Дозволити видалення акаунту", - "user-info-private": "Приховати список користувачів та дані від гостей", "hide-fullname": "Приховати повне ім'я від користувачів", "hide-email": "Приховати електронну пошту від користувачів", "themes": "Теми", diff --git a/public/language/uk/email.json b/public/language/uk/email.json index 42ac82765e..0ca9deb809 100644 --- a/public/language/uk/email.json +++ b/public/language/uk/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Останні теми від %1", "digest.cta": "Натисніть, щоб відвідати %1", "digest.unsub.info": "Цей дайджест був висланий вам, згідно ваших налаштувань підписки", - "digest.no_topics": "Не було активних тем за останні %1", "digest.day": "день", "digest.week": "тиждень", "digest.month": "місяць", "digest.subject": "Дайджест для %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Отримане нове повідомлення чату від %1", "notif.chat.cta": "Натисніть тут, щоб продовжити розмову", "notif.chat.unsub.info": "Це повідомлення чату було вислано вам, згідно ваших налаштувань підписки", diff --git a/public/language/uk/error.json b/public/language/uk/error.json index 1d72289574..a2378ee962 100644 --- a/public/language/uk/error.json +++ b/public/language/uk/error.json @@ -33,6 +33,7 @@ "username-too-short": "Ім'я користувача закоротке", "username-too-long": "Ім'я користувача задовге", "password-too-long": "Пароль задовгий", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Користувача забанено", "user-banned-reason": "Вибачте, але цей акаунт було забанено (Причина: %1)", "user-banned-reason-until": "Вибачте, цей акаунт забанений до %1 (Причина: %2)", diff --git a/public/language/uk/search.json b/public/language/uk/search.json index 756c59775a..029e8707f5 100644 --- a/public/language/uk/search.json +++ b/public/language/uk/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Очистити налаштування", "search-preferences-saved": "Налаштування пошуку збережено", "search-preferences-cleared": "Налаштування пошуку очищені", - "show-results-as": "Показати результати як" + "show-results-as": "Показати результати як", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/vi/admin/advanced/database.json b/public/language/vi/admin/advanced/database.json index bc6c735528..6f592de7a0 100644 --- a/public/language/vi/admin/advanced/database.json +++ b/public/language/vi/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "Thông tin MongoDB", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Phiên bản Redis", diff --git a/public/language/vi/admin/general/navigation.json b/public/language/vi/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/vi/admin/general/navigation.json +++ b/public/language/vi/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/vi/admin/manage/privileges.json b/public/language/vi/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/vi/admin/manage/privileges.json +++ b/public/language/vi/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/vi/admin/settings/group.json b/public/language/vi/admin/settings/group.json index fe3e39915b..a28bd10c00 100644 --- a/public/language/vi/admin/settings/group.json +++ b/public/language/vi/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "Private Groups", "private-groups.help": "If enabled, joining of groups requires the approval of the group owner (Default: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "Allow Group Creation", - "allow-creation-help": "If enabled, users can create groups (Default: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "Maximum Group Name Length", + "max-title-length": "Maximum Group Title Length", "cover-image": "Group Cover Image", "default-cover": "Default Cover Images", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/vi/admin/settings/tags.json b/public/language/vi/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/vi/admin/settings/tags.json +++ b/public/language/vi/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/vi/admin/settings/user.json b/public/language/vi/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/vi/admin/settings/user.json +++ b/public/language/vi/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/vi/email.json b/public/language/vi/email.json index 75d443b3cc..8662fd5a8c 100644 --- a/public/language/vi/email.json +++ b/public/language/vi/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "Chủ đề mới nhất từ %1", "digest.cta": "Click vào đây để truy cập %1", "digest.unsub.info": "Tập san này được gửi đến bạn dựa theo cài đặt theo dõi của bạn.", - "digest.no_topics": "Không có chủ đề nào hoạt động trong %1 ", "digest.day": "ngày", "digest.week": "tuần", "digest.month": "tháng", "digest.subject": "Tóm tắt cho %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "Bạn có tin nhắn mới từ %1", "notif.chat.cta": "Nhấn vào đây để tiếp tục cuộc hội thoại", "notif.chat.unsub.info": "Thông báo tin nhắn này được gửi tới dựa theo cài đặt theo dõi của bạn.", diff --git a/public/language/vi/error.json b/public/language/vi/error.json index 884f6efbdb..423815e0f9 100644 --- a/public/language/vi/error.json +++ b/public/language/vi/error.json @@ -33,6 +33,7 @@ "username-too-short": "Tên đăng nhập quá ngắn", "username-too-long": "Tên đăng nhập quá dài", "password-too-long": "Mật khẩu quá dài", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "Tài khoản bị ban", "user-banned-reason": "Xin lỗi, tài khoản này đã bị khóa (Lí do: %1)", "user-banned-reason-until": "Rất tiếc, tài khoản này đã bị cấm cho đến %1 (Lý do: %2)", diff --git a/public/language/vi/flags.json b/public/language/vi/flags.json index 35fc87011a..9b8658dceb 100644 --- a/public/language/vi/flags.json +++ b/public/language/vi/flags.json @@ -9,6 +9,7 @@ "updated": "Updated", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "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", diff --git a/public/language/vi/search.json b/public/language/vi/search.json index 637cca235c..0dc45cd6a9 100644 --- a/public/language/vi/search.json +++ b/public/language/vi/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Xoá tuỳ chọn", "search-preferences-saved": "Tìm kiếm tuỳ chọn đã lưu", "search-preferences-cleared": "Tìm kiếm tuỳ chọn đã xoá", - "show-results-as": "Hiện thị kết quả theo" + "show-results-as": "Hiện thị kết quả theo", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/advanced/database.json b/public/language/zh-CN/admin/advanced/database.json index fad0bff091..96c440c8e0 100644 --- a/public/language/zh-CN/admin/advanced/database.json +++ b/public/language/zh-CN/admin/advanced/database.json @@ -18,10 +18,11 @@ "mongo.resident-memory": "驻留内存", "mongo.virtual-memory": "虚拟内存", "mongo.mapped-memory": "已映射内存", - "mongo.bytes-in": "Bytes In", - "mongo.bytes-out": "Bytes Out", + "mongo.bytes-in": "字节输入", + "mongo.bytes-out": "字节输出", "mongo.num-requests": "请求数量", "mongo.raw-info": "MongoDB 原始信息", + "mongo.unauthorized": "NodeBB无法从MongoDB数据库请求相应的统计信息。请确保NodeBB使用的用户含有"admin"数据库的"clusterMonitor"角色。", "redis": "Redis", "redis.version": "Redis 版本", @@ -36,10 +37,10 @@ "redis.total-connections-recieved": "已接收的连接总数", "redis.total-commands-processed": "已执行命令总数", "redis.iops": "每秒实时操作数", - "redis.iinput": "Instantaneous Input Per Second", - "redis.ioutput": "Instantaneous Output Per Second", - "redis.total-input": "Total Input", - "redis.total-output": "Total Ouput", + "redis.iinput": "每秒实时输入", + "redis.ioutput": "每秒实时输出", + "redis.total-input": "总输入", + "redis.total-output": "总输出", "redis.keyspace-hits": "Keyspace 命中", "redis.keyspace-misses": "Keyspace 未命中", diff --git a/public/language/zh-CN/admin/general/navigation.json b/public/language/zh-CN/admin/general/navigation.json index 886174ced8..25680bcb54 100644 --- a/public/language/zh-CN/admin/general/navigation.json +++ b/public/language/zh-CN/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "提示:", "text": "文本:", "text-class": "文本分类“可选", + "class": "Class: optional", "id": "ID:可选", "properties": "属性:", diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index 1aca5799c4..078874155d 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "选择版块", "set-parent-category": "设置父版块", - "privileges.description": "您可以在此部分中配置此版块的访问控制权限。 可以分别为每个用户或每个群组授予权限。 从下面的下拉列表中选择要配置的版块。", + "privileges.description": "您可以在此面板中为站点的某些部分配置访问控制权。可以分别为每个用户或每个用户组授予权限。从下方的下拉列表中选择作用域名。", "privileges.category-selector": "为该版块配置权限:", "privileges.warning": "注意:权限设置会立即生效。 调整这些设置后,无需保存。", "privileges.section-viewing": "查看权限", "privileges.section-posting": "发帖权限", "privileges.section-moderation": "审核权限", + "privileges.section-other": "其他", "privileges.section-user": "用户", "privileges.search-user": "添加用户", "privileges.no-users": "此版块中没有用户特定的权限。", diff --git a/public/language/zh-CN/admin/manage/privileges.json b/public/language/zh-CN/admin/manage/privileges.json index faa716f670..4c7b07c793 100644 --- a/public/language/zh-CN/admin/manage/privileges.json +++ b/public/language/zh-CN/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "搜索内容", "search-users": "搜索用户", "search-tags": "搜索话题", + "view-users": "浏览用户", + "view-tags": "浏览话题", + "view-groups": "浏览群组", "allow-local-login": "本地登录", + "allow-group-creation": "新建群组", "find-category": "版块可见", "access-category": "访问版块", diff --git a/public/language/zh-CN/admin/settings/group.json b/public/language/zh-CN/admin/settings/group.json index c5b06a2b10..fec69063a0 100644 --- a/public/language/zh-CN/admin/settings/group.json +++ b/public/language/zh-CN/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "私有群组", "private-groups.help": "启用此选项后,加入用户组需要群组所有者审批(默认启用)。", "private-groups.warning": "注意!如果这个选项未启用并且你有私有群组,那么你的群组将变为公共的。", - "allow-creation": "允许创建群组", - "allow-creation-help": "如果启用,用户就可以创建群组(默认:不启用)", "allow-multiple-badges-help": "启用此选项后,用户可以选择显示多个群组徽章,需要主题支持。", "max-name-length": "群组名字的最大长度", + "max-title-length": "群组标题最大长度", "cover-image": "群组封面图片", "default-cover": "默认封面图片", "default-cover-help": "为没有上传封面图片的群组添加以逗号分隔的默认封面图片" diff --git a/public/language/zh-CN/admin/settings/tags.json b/public/language/zh-CN/admin/settings/tags.json index c72093340f..cb79b9f71a 100644 --- a/public/language/zh-CN/admin/settings/tags.json +++ b/public/language/zh-CN/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "最短话题长度", "max-length": "最大话题长度", "goto-manage": "点击这里访问话题管理页面。", - "privacy": "隐私", - "list-private": "使话题列表私有化", "related-topics": "相关主题", "max-related-topics": "最大相关主题显示量(如果主题支持)" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/settings/user.json b/public/language/zh-CN/admin/settings/user.json index 1b10507fbb..a295e0c9b9 100644 --- a/public/language/zh-CN/admin/settings/user.json +++ b/public/language/zh-CN/admin/settings/user.json @@ -8,13 +8,12 @@ "allow-login-with.username": "仅限用户名", "allow-login-with.email": "仅限邮箱", "account-settings": "用户设置", - "gdpr_enabled": "Enable GDPR consent collection", + "gdpr_enabled": "启用通用数据保护条例(GDPR)许可的个人信息收集", "gdpr_enabled_help": "当启用时,所有的新注册用户需要明确同意允许数据采集和在通用数据保护协议(GDPR)保护下的使用。注意:开启GDPR不一定要之前已经存在的用户同意。在这之前,你需要去安装GDPR插件。", "disable-username-changes": "禁用修改用户名", "disable-email-changes": "禁用修改邮箱", "disable-password-changes": "禁用修改密码", "allow-account-deletion": "允许消除帐号", - "user-info-private": "使用户信息私有化", "hide-fullname": "隐藏用户的全名", "hide-email": "隐藏用户的电子邮箱", "themes": "主题", @@ -30,9 +29,9 @@ "session-time": "Session 过期时间", "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.", + "session-time-help": "这些值将用于控制用户在登录时选中"记住我"后能够保持登录的时长。注意以下数值中只有一个将被使用。若值为空我们将回退使用。若值为空我们将使用默认值14天。", "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.", + "online-cutoff-help": "若用户在此时间后未作出任何动作,他们将被视为不活跃状态且不会收到实时更新。", "registration": "用户注册", "registration-type": "注册方式", "registration-type.normal": "通常", diff --git a/public/language/zh-CN/email.json b/public/language/zh-CN/email.json index 1e29c7854d..d91018b4e4 100644 --- a/public/language/zh-CN/email.json +++ b/public/language/zh-CN/email.json @@ -1,6 +1,6 @@ { - "test-email.subject": "Test Email", - "password-reset-requested": "Password Reset Requested!", + "test-email.subject": "测试邮件", + "password-reset-requested": "已申请密码重置!", "welcome-to": "欢迎来到 %1", "invite": "来自%1的邀请", "greeting_no_name": "您好", @@ -24,11 +24,11 @@ "digest.latest_topics": "来自 %1 的最新主题", "digest.cta": "点击这里访问 %1", "digest.unsub.info": "根据您的订阅设置,为您发送此摘要。", - "digest.no_topics": "最近 %1 没有活跃的主题", "digest.day": "天", "digest.week": "周", "digest.month": "月", "digest.subject": "%1 的摘要", + "digest.title": "Your Daily Digest", "notif.chat.subject": "收到来自 %1 的新聊天消息", "notif.chat.cta": "点击这里继续会话", "notif.chat.unsub.info": "根据您的订阅设置,为您发送此聊天提醒。", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index b07bf6470c..f52a5b5e90 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -33,6 +33,7 @@ "username-too-short": "用户名太短", "username-too-long": "用户名太长", "password-too-long": "密码太长", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "用户已禁止", "user-banned-reason": "抱歉,此帐号已经被封禁 (原因:%1)", "user-banned-reason-until": "抱歉,此帐户已被封禁,直到%1(原因:%2)", @@ -120,7 +121,7 @@ "chat-edit-duration-expired": "您只能在发布 %1 秒后修改聊天信息", "chat-delete-duration-expired": "您只能在发布 %1 秒后删除聊天信息", "chat-deleted-already": "聊天消息已经被删除", - "chat-restored-already": "This chat message has already been restored.", + "chat-restored-already": "此聊天消息已经恢复。\n", "already-voting-for-this-post": "您已为此帖回复投过票了。", "reputation-system-disabled": "声望系统已禁用。", "downvoting-disabled": "踩已被禁用", @@ -153,8 +154,8 @@ "cant-move-to-same-topic": "无法将帖子移动到相同的主题中!", "cannot-block-self": "您不能把自己屏蔽!", "cannot-block-privileged": "您不能屏蔽管理员或者全局版主", - "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", + "cannot-block-guest": "游客无法屏蔽其他用户", + "already-blocked": "此用户已被屏蔽", + "already-unblocked": "此用户已被取消屏蔽", "no-connection": "您的网络连接似乎存在问题" } \ No newline at end of file diff --git a/public/language/zh-CN/flags.json b/public/language/zh-CN/flags.json index 1813b4b4ab..a75f78068c 100644 --- a/public/language/zh-CN/flags.json +++ b/public/language/zh-CN/flags.json @@ -9,6 +9,7 @@ "updated": "已更新", "target-purged": "被举报的内容已经被清除,不再可用。", + "graph-label": "Daily Flags", "quick-filters": "快速过滤器", "filter-active": "该列中有一个或更多激活的过滤器", "filter-reset": "删除过滤器", diff --git a/public/language/zh-CN/notifications.json b/public/language/zh-CN/notifications.json index 32e8a6b9f2..31a7161d3d 100644 --- a/public/language/zh-CN/notifications.json +++ b/public/language/zh-CN/notifications.json @@ -8,7 +8,7 @@ "outgoing_link_message": "您正在离开 %1", "continue_to": "继续前往 %1", "return_to": "返回 %1", - "new_notification": "You have a new notification", + "new_notification": "您有一个新的通知", "you_have_unread_notifications": "您有未读的通知。", "all": "所有", "topics": "主题", @@ -56,7 +56,7 @@ "notificationType_follow": "当有人关注您时", "notificationType_new-chat": "当您收到聊天消息时", "notificationType_group-invite": "当您收到群组邀请时", - "notificationType_group-request-membership": "When someone requests to join a group you own", + "notificationType_group-request-membership": "当有人请求加入您拥有的用户组时", "notificationType_new-register": "当有人被添加到申请队列时", "notificationType_post-queue": "当有新帖子等待审核时", "notificationType_new-post-flag": "当有新的帖子举报时", diff --git a/public/language/zh-CN/search.json b/public/language/zh-CN/search.json index 570cf68194..ad4fbe45f5 100644 --- a/public/language/zh-CN/search.json +++ b/public/language/zh-CN/search.json @@ -43,5 +43,6 @@ "clear-preferences": "清除设置", "search-preferences-saved": "搜索设置已保存", "search-preferences-cleared": "搜索设置已清除", - "show-results-as": "结果显示为" + "show-results-as": "结果显示为", + "see-more-results": "查看更多结果 (%1)" } \ No newline at end of file diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index e19808dad7..c6a5e5cb51 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -49,7 +49,7 @@ "change_picture": "更改头像", "change_username": "更改用户名", "change_email": "更改电子邮箱", - "email_same_as_password": "Please enter your current password to continue – you've entered your new email again", + "email_same_as_password": "请输入您当前的密码以继续 –您已经再次输入了您的新电子邮箱", "edit": "编辑", "edit-profile": "编辑资料", "default_picture": "默认图标", diff --git a/public/language/zh-TW/admin/advanced/database.json b/public/language/zh-TW/admin/advanced/database.json index 546e6c8ffa..99b81b487b 100644 --- a/public/language/zh-TW/admin/advanced/database.json +++ b/public/language/zh-TW/admin/advanced/database.json @@ -22,6 +22,7 @@ "mongo.bytes-out": "Bytes Out", "mongo.num-requests": "Number of Requests", "mongo.raw-info": "MongoDB 原始資訊", + "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "Redis 版本", diff --git a/public/language/zh-TW/admin/general/navigation.json b/public/language/zh-TW/admin/general/navigation.json index 8313be9656..13dd01aae7 100644 --- a/public/language/zh-TW/admin/general/navigation.json +++ b/public/language/zh-TW/admin/general/navigation.json @@ -5,6 +5,7 @@ "tooltip": "Tooltip:", "text": "Text:", "text-class": "Text Class: optional", + "class": "Class: optional", "id": "ID: optional", "properties": "Properties:", diff --git a/public/language/zh-TW/admin/manage/categories.json b/public/language/zh-TW/admin/manage/categories.json index c14eadea0c..60524dd329 100644 --- a/public/language/zh-TW/admin/manage/categories.json +++ b/public/language/zh-TW/admin/manage/categories.json @@ -29,12 +29,13 @@ "select-category": "Select Category", "set-parent-category": "Set Parent Category", - "privileges.description": "You can configure the access control privileges for this category in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", + "privileges.description": "You can configure the access control privileges for portions of the site in this section. Privileges can be granted on a per-user or a per-group basis. Select the domain of effect from the dropdown below.", "privileges.category-selector": "Configuring privileges for ", "privileges.warning": "Note: Privilege settings take effect immediately. It is not necessary to save the category after adjusting these settings.", "privileges.section-viewing": "Viewing Privileges", "privileges.section-posting": "Posting Privileges", "privileges.section-moderation": "Moderation Privileges", + "privileges.section-other": "Other", "privileges.section-user": "User", "privileges.search-user": "Add User", "privileges.no-users": "No user-specific privileges in this category.", diff --git a/public/language/zh-TW/admin/manage/privileges.json b/public/language/zh-TW/admin/manage/privileges.json index 07d0a4de50..5e6d451b67 100644 --- a/public/language/zh-TW/admin/manage/privileges.json +++ b/public/language/zh-TW/admin/manage/privileges.json @@ -10,7 +10,11 @@ "search-content": "Search Content", "search-users": "Search Users", "search-tags": "Search Tags", + "view-users": "View Users", + "view-tags": "View Tags", + "view-groups": "View Groups", "allow-local-login": "Local Login", + "allow-group-creation": "Group Create", "find-category": "Find Category", "access-category": "Access Category", diff --git a/public/language/zh-TW/admin/settings/group.json b/public/language/zh-TW/admin/settings/group.json index 82a1f941d5..e17b1aa434 100644 --- a/public/language/zh-TW/admin/settings/group.json +++ b/public/language/zh-TW/admin/settings/group.json @@ -3,10 +3,9 @@ "private-groups": "私人群組", "private-groups.help": "如果開啟,加入群組需要經過群組擁有者批準 (預設: enabled)", "private-groups.warning": "Beware! If this option is disabled and you have private groups, they automatically become public.", - "allow-creation": "允許建立群組", - "allow-creation-help": "如果開啟,使用者可自行建立群組 (預設: disabled)", "allow-multiple-badges-help": "This flag can be used to allow users to select multiple group badges, requires theme support.", "max-name-length": "群組最大名稱長度", + "max-title-length": "Maximum Group Title Length", "cover-image": "群組封面圖像", "default-cover": "預設封面圖像", "default-cover-help": "Add comma-separated default cover images for groups that don't have an uploaded cover image" diff --git a/public/language/zh-TW/admin/settings/tags.json b/public/language/zh-TW/admin/settings/tags.json index 6f31f60ba0..d329cff68b 100644 --- a/public/language/zh-TW/admin/settings/tags.json +++ b/public/language/zh-TW/admin/settings/tags.json @@ -5,8 +5,6 @@ "min-length": "Minimum Tag Length", "max-length": "Maximum Tag Length", "goto-manage": "Click here to visit the tag management page.", - "privacy": "Privacy", - "list-private": "Make the tags list private", "related-topics": "Related Topics", "max-related-topics": "Maximum related topics to display (if supported by theme)" } \ No newline at end of file diff --git a/public/language/zh-TW/admin/settings/user.json b/public/language/zh-TW/admin/settings/user.json index a504f5ef8d..2cfb16addc 100644 --- a/public/language/zh-TW/admin/settings/user.json +++ b/public/language/zh-TW/admin/settings/user.json @@ -14,7 +14,6 @@ "disable-email-changes": "Disable email changes", "disable-password-changes": "Disable password changes", "allow-account-deletion": "Allow account deletion", - "user-info-private": "Hide user list and data from guests", "hide-fullname": "Hide fullname from users", "hide-email": "Hide email from users", "themes": "Themes", diff --git a/public/language/zh-TW/email.json b/public/language/zh-TW/email.json index 295725d575..642e58dede 100644 --- a/public/language/zh-TW/email.json +++ b/public/language/zh-TW/email.json @@ -24,11 +24,11 @@ "digest.latest_topics": "來自 %1 的最新主題", "digest.cta": "點擊這裡訪問 %1", "digest.unsub.info": "本摘要依照你的訂閱設置發送給你。", - "digest.no_topics": "在過去 %1 沒有活躍的主題", "digest.day": "日", "digest.week": "週", "digest.month": "月", "digest.subject": "摘要於 %1", + "digest.title": "Your Daily Digest", "notif.chat.subject": "收到來自 %1 的聊天訊息", "notif.chat.cta": "點擊此處繼續聊天對話", "notif.chat.unsub.info": "本聊天通知按你的訂閱設置發送給你。", diff --git a/public/language/zh-TW/error.json b/public/language/zh-TW/error.json index 77bfc7f1ee..38f04103d0 100644 --- a/public/language/zh-TW/error.json +++ b/public/language/zh-TW/error.json @@ -33,6 +33,7 @@ "username-too-short": "帳號太短", "username-too-long": "帳號太長", "password-too-long": "密碼太長", + "reset-rate-limited": "Too many password reset requests (rate limited)", "user-banned": "該使用者已被停用", "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)", diff --git a/public/language/zh-TW/flags.json b/public/language/zh-TW/flags.json index cac2293840..d614bba332 100644 --- a/public/language/zh-TW/flags.json +++ b/public/language/zh-TW/flags.json @@ -9,6 +9,7 @@ "updated": "更新完成", "target-purged": "The content this flag referred to has been purged and is no longer available.", + "graph-label": "Daily Flags", "quick-filters": "快速篩選", "filter-active": "There are one or more filters active in this list of flags", "filter-reset": "移除篩選", diff --git a/public/language/zh-TW/search.json b/public/language/zh-TW/search.json index 34e2339545..25da7d17bf 100644 --- a/public/language/zh-TW/search.json +++ b/public/language/zh-TW/search.json @@ -43,5 +43,6 @@ "clear-preferences": "清除我的最愛", "search-preferences-saved": "搜尋我的最愛已儲存", "search-preferences-cleared": "搜尋我的最愛已清除", - "show-results-as": "結果顯示" + "show-results-as": "結果顯示", + "see-more-results": "See more results (%1)" } \ No newline at end of file diff --git a/public/language/zh-TW/user.json b/public/language/zh-TW/user.json index 2e6a45f06f..ea330044ab 100644 --- a/public/language/zh-TW/user.json +++ b/public/language/zh-TW/user.json @@ -1,7 +1,7 @@ { "banned": "封鎖", "offline": "下線", - "deleted": "Deleted", + "deleted": "已刪除", "username": "使用者名稱", "joindate": "加入時間", "postcount": "文章數量", @@ -12,8 +12,8 @@ "ban_account_confirm": "你確定要禁用這個使用者?", "unban_account": "取消禁用帳號", "delete_account": "刪除帳戶", - "delete_account_confirm": "Are you sure you want to 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": "你確定要刪除這個帳戶?
此操作是不能還原的,你將無法回復任何資料
", + "delete_account_confirm": "您確定要刪除您自己的帳戶?
此項操作是不能還原的,而且您將無法回復任何您的所有資料。

輸入您的密碼用以確認您決定要刪除這個帳戶。", + "delete_this_account_confirm": "您確定要刪除這個帳戶?
此操作是不能還原的,您將無法回復任何資料
", "account-deleted": "帳號已刪除", "fullname": "全名", "website": "網站", @@ -24,10 +24,10 @@ "profile": "個人資料", "profile_views": "資料被查看", "reputation": "聲譽", - "bookmarks": "Bookmarks", - "watched_categories": "Watched categories", + "bookmarks": "書籤", + "watched_categories": "已檢視目錄", "watched": "觀看者", - "ignored": "Ignored", + "ignored": "已略過", "default-category-watch-state": "Default category watch state", "followers": "跟隨者", "following": "正在關注", diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index 9a772ae08e..dc657a37ec 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -117,20 +117,20 @@ body { .box-header-font; } - .panel { + .panel:not([data-container-html]) { background-color: #FFF; box-sizing: border-box; border-radius: 3px; box-shadow: 0px 1px 3px 0px rgba(165, 165, 165, 0.75); margin-bottom: 20px; - &.panel-default .panel-heading { + &.panel-default >.panel-heading { .acp-panel-heading; background: #fefefe; color: #333; } - &.panel-danger .panel-heading { + &.panel-danger >.panel-heading { .acp-panel-heading; } } diff --git a/public/less/admin/manage/categories.less b/public/less/admin/manage/categories.less index 28eb9c7ff9..ce2293beae 100644 --- a/public/less/admin/manage/categories.less +++ b/public/less/admin/manage/categories.less @@ -42,7 +42,7 @@ div.categories { } } - .disabled { + .disabled > .category-row { .icon, .category-header, .description { opacity: 0.5; diff --git a/public/less/admin/paper/bootswatch.less b/public/less/admin/paper/bootswatch.less index cceb643cf6..36957a3092 100644 --- a/public/less/admin/paper/bootswatch.less +++ b/public/less/admin/paper/bootswatch.less @@ -328,6 +328,22 @@ input[type="checkbox"], .transition(240ms); } + &:indeterminate:before { + content: ""; + position: absolute; + top: 6px; + left: 6px; + display: table; + width: 6px; + height: 12px; + border-top: 2px solid #fff; + } + + &:indeterminate:after { + background-color: @brand-primary; + border-color: @brand-primary; + } + &:checked:before { content: ""; position: absolute; diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js index 409e5fd02f..e85e93d873 100644 --- a/public/src/admin/manage/categories.js +++ b/public/src/admin/manage/categories.js @@ -27,12 +27,20 @@ define('admin/manage/categories', [ var cid = $this.attr('data-cid'); var parentEl = $this.parents('li[data-cid="' + cid + '"]'); var disabled = parentEl.hasClass('disabled'); - - var children = parentEl.find('li[data-cid]').map(function () { + var childrenEls = parentEl.find('li[data-cid]'); + var childrenCids = childrenEls.map(function () { return $(this).attr('data-cid'); }).get(); - Categories.toggle([cid].concat(children), !disabled); + parentEl.toggleClass('disabled', !disabled); + childrenEls.toggleClass('disabled', !disabled); + + $this.translateText(!disabled ? '[[admin/manage/categories:enable]]' : '[[admin/manage/categories:disable]]'); + $this.toggleClass('btn-primary', !disabled).toggleClass('btn-danger', disabled); + childrenEls.find('button[data-action="toggle"]').translateText(!disabled ? '[[admin/manage/categories:enable]]' : '[[admin/manage/categories:disable]]'); + childrenEls.find('button[data-action="toggle"]').toggleClass('btn-primary', !disabled).toggleClass('btn-danger', disabled); + + Categories.toggle([cid].concat(childrenCids), !disabled); return false; }); @@ -162,7 +170,6 @@ define('admin/manage/categories', [ if (err) { return app.alertError(err.message); } - ajaxify.refresh(); }); }; diff --git a/public/src/admin/manage/category.js b/public/src/admin/manage/category.js index 6a8372dc88..05ee5daef9 100644 --- a/public/src/admin/manage/category.js +++ b/public/src/admin/manage/category.js @@ -4,11 +4,9 @@ define('admin/manage/category', [ 'uploader', 'iconSelect', 'admin/modules/colorpicker', - 'autocomplete', - 'translator', 'categorySelector', 'benchpress', -], function (uploader, iconSelect, colorpicker, autocomplete, translator, categorySelector, Benchpress) { +], function (uploader, iconSelect, colorpicker, categorySelector, Benchpress) { var Category = {}; var modified_categories = {}; @@ -126,13 +124,46 @@ define('admin/manage/category', [ }); $('.copy-settings').on('click', function () { - categorySelector.modal(function (cid) { - socket.emit('admin.categories.copySettingsFrom', { fromCid: cid, toCid: ajaxify.data.category.cid }, function (err) { - if (err) { - return app.alertError(err.message); + Benchpress.parse('admin/partials/categories/copy-settings', { + categories: ajaxify.data.allCategories, + }, function (html) { + var selectedCid; + var modal = bootbox.dialog({ + title: '[[modules:composer.select_category]]', + message: html, + buttons: { + save: { + label: '[[modules:bootbox.confirm]]', + className: 'btn-primary', + callback: function () { + if (!selectedCid) { + return; + } + + socket.emit('admin.categories.copySettingsFrom', { + fromCid: selectedCid, + toCid: ajaxify.data.category.cid, + copyParent: modal.find('#copyParent').prop('checked'), + }, function (err) { + if (err) { + return app.alertError(err.message); + } + + modal.modal('hide'); + app.alertSuccess('[[admin/manage/categories:alert.copy-success]]'); + ajaxify.refresh(); + }); + return false; + }, + }, + }, + }); + modal.find('.modal-footer button').prop('disabled', true); + categorySelector.init(modal.find('[component="category-selector"]'), function (selectedCategory) { + selectedCid = selectedCategory && selectedCategory.cid; + if (selectedCid) { + modal.find('.modal-footer button').prop('disabled', false); } - app.alertSuccess('[[admin/manage/categories:alert.copy-success]]'); - ajaxify.refresh(); }); }); return false; @@ -157,6 +188,7 @@ define('admin/manage/category', [ $('#category-image').on('change', function () { $('.category-preview').css('background-image', $(this).val() ? ('url("' + $(this).val() + '")') : ''); + modified($('#category-image')); }); $('.delete-image').on('click', function (e) { diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index 92ef056630..7d205dd065 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -12,6 +12,7 @@ define('admin/manage/group', [ var groupIcon = $('#group-icon'); var changeGroupUserTitle = $('#change-group-user-title'); var changeGroupLabelColor = $('#change-group-label-color'); + var changeGroupTextColor = $('#change-group-text-color'); var groupLabelPreview = $('#group-label-preview'); var groupName = ajaxify.data.group.name; @@ -30,6 +31,10 @@ define('admin/manage/group', [ groupLabelPreview.css('background', changeGroupLabelColor.val() || '#000000'); }); + changeGroupTextColor.keyup(function () { + groupLabelPreview.css('color', changeGroupTextColor.val() || '#ffffff'); + }); + $('[component="groups/members"]').on('click', '[data-action]', function () { var btnEl = $(this); var userRow = btnEl.parents('[data-uid]'); @@ -72,14 +77,20 @@ define('admin/manage/group', [ } }); - $('#group-icon').on('click', function () { - iconSelect.init(groupIcon); + $('#group-icon, #group-icon-label').on('click', function () { + iconSelect.init(groupIcon, function () { + $('#group-icon-preview').attr('class', 'fa fa-fw ' + (groupIcon.attr('value') || 'hidden')); + }); }); colorpicker.enable(changeGroupLabelColor, function (hsb, hex) { groupLabelPreview.css('background-color', '#' + hex); }); + colorpicker.enable(changeGroupTextColor, function (hsb, hex) { + groupLabelPreview.css('color', '#' + hex); + }); + $('#save').on('click', function () { socket.emit('admin.groups.update', { groupName: groupName, @@ -89,6 +100,7 @@ define('admin/manage/group', [ description: $('#change-group-desc').val(), icon: groupIcon.attr('value'), labelColor: changeGroupLabelColor.val(), + textColor: changeGroupTextColor.val(), userTitleEnabled: $('#group-userTitleEnabled').is(':checked'), private: $('#group-private').is(':checked'), hidden: $('#group-hidden').is(':checked'), @@ -102,11 +114,11 @@ define('admin/manage/group', [ var newName = $('#change-group-name').val(); // If the group name changed, change url - if (groupName === newName) { - app.alertSuccess('[[admin/manage/groups:edit.save-success]]'); - } else { + if (groupName !== newName) { ajaxify.go('admin/manage/groups/' + encodeURIComponent(newName), undefined, true); } + + app.alertSuccess('[[admin/manage/groups:edit.save-success]]'); }); return false; }); diff --git a/public/src/admin/manage/privileges.js b/public/src/admin/manage/privileges.js index ef575e9fbd..f43ebef04f 100644 --- a/public/src/admin/manage/privileges.js +++ b/public/src/admin/manage/privileges.js @@ -85,7 +85,7 @@ define('admin/manage/privileges', [ } }); for (var x = 0, numPrivs = privs.length; x < numPrivs; x += 1) { - var inputs = $('.privilege-table tr[data-group-name]:not([data-group-name="registered-users"],[data-group-name="guests"]) td[data-privilege="' + privs[x] + '"] input'); + var inputs = $('.privilege-table tr[data-group-name]:not([data-group-name="registered-users"],[data-group-name="guests"],[data-group-name="spiders"]) td[data-privilege="' + privs[x] + '"] input'); inputs.each(function (idx, el) { if (!el.checked) { el.indeterminate = true; diff --git a/public/src/admin/manage/registration.js b/public/src/admin/manage/registration.js index 048aafbf96..08f8b6722b 100644 --- a/public/src/admin/manage/registration.js +++ b/public/src/admin/manage/registration.js @@ -9,7 +9,7 @@ define('admin/manage/registration', function () { var parent = $(this).parents('[data-username]'); var action = $(this).attr('data-action'); var username = parent.attr('data-username'); - var method = action === 'accept' ? 'admin.user.acceptRegistration' : 'admin.user.rejectRegistration'; + var method = action === 'accept' ? 'user.acceptRegistration' : 'user.rejectRegistration'; socket.emit(method, { username: username }, function (err) { if (err) { @@ -25,7 +25,7 @@ define('admin/manage/registration', function () { var email = parent.attr('data-invitation-mail'); var invitedBy = parent.attr('data-invited-by'); var action = $(this).attr('data-action'); - var method = 'admin.user.deleteInvitation'; + var method = 'user.deleteInvitation'; var removeRow = function () { var nextRow = parent.next(); diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 9efb1807be..73e33b391b 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -175,6 +175,19 @@ define('admin/manage/users', ['translator', 'benchpress'], function (translator, }); }); + $('.force-password-reset').on('click', function () { + var uids = getSelectedUids(); + if (!uids.length) { + return; + } + + bootbox.confirm('[[admin/manage/users:alerts.confirm-force-password-reset]]', function (confirm) { + if (confirm) { + socket.emit('admin.user.forcePasswordReset', uids, done('[[admin/manage/users:alerts.validate-force-password-reset-success]]')); + } + }); + }); + $('.delete-user').on('click', function () { var uids = getSelectedUids(); if (!uids.length) { diff --git a/public/src/admin/modules/colorpicker.js b/public/src/admin/modules/colorpicker.js index c219df634f..6000c416d6 100644 --- a/public/src/admin/modules/colorpicker.js +++ b/public/src/admin/modules/colorpicker.js @@ -20,6 +20,10 @@ define('admin/modules/colorpicker', function () { $(colpkr).css('z-index', 1051); }, }); + + $(window).one('action:ajaxify.start', function () { + $this.ColorPickerHide(); + }); }); }; diff --git a/public/src/admin/settings/email.js b/public/src/admin/settings/email.js index 336abf34fa..3e3fdc1280 100644 --- a/public/src/admin/settings/email.js +++ b/public/src/admin/settings/email.js @@ -87,18 +87,20 @@ define('admin/settings/email', ['ace/ace', 'admin/settings'], function (ace) { return app.alertError(err.message); } - now = new Date(now); + var date = new Date(now.timestamp); + var offset = (new Date().getTimezoneOffset() - now.offset) / 60; + date.setHours(date.getHours() + offset); - $('#serverTime').text(now.toString()); + $('#serverTime').text(date.toLocaleTimeString()); - now.setHours(parseInt(hour, 10), 0, 0, 0); + date.setHours(parseInt(hour, 10) - offset, 0, 0, 0); // If adjusted time is in the past, move to next day - if (now.getTime() < Date.now()) { - now.setDate(now.getDate() + 1); + if (date.getTime() < Date.now()) { + date.setDate(date.getDate() + 1); } - $('#nextDigestTime').text(now.toString()); + $('#nextDigestTime').text(date.toLocaleString()); }); } diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index 77dd6d1d3e..d8753b9a9f 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -71,7 +71,7 @@ $(document).ready(function () { apiXHR.abort(); } - app.previousUrl = window.location.href; + app.previousUrl = !['reset'].includes(ajaxify.currentPage) ? window.location.href : app.previousUrl; url = ajaxify.start(url); diff --git a/public/src/app.js b/public/src/app.js index bf68b520c8..1a8e1a65e5 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -134,9 +134,9 @@ app.cacheBuster = null; // Re-render top bar menu var toRender = { + 'slideout-menu': $('.slideout-menu'), menu: $('#header-menu .container'), 'chats-menu': $('#chats-menu'), - 'slideout-menu': $('.slideout-menu'), }; Promise.all(Object.keys(toRender).map(function (tpl) { return Benchpress.render('partials/' + tpl, data.header).then(function (render) { @@ -149,7 +149,7 @@ app.cacheBuster = null; Unread.initUnreadTopics(); Notifications.prepareDOM(); Chat.prepareDOM(); - app.reskin(data.config.bootswatchSkin); + app.reskin(data.header.bootswatchSkin); translator.switchTimeagoLanguage(callback); bootbox.setLocale(config.userLang); @@ -157,6 +157,8 @@ app.cacheBuster = null; app.handleSearch(); } + handleStatusChange(); + $(window).trigger('action:app.updateHeader'); }); }); @@ -194,6 +196,11 @@ app.cacheBuster = null; $(window).trigger('action:app.loggedOut', data); if (data.next) { + if (data.next.startsWith('http')) { + window.location.href = data.next; + return; + } + ajaxify.go(data.next); } else { ajaxify.refresh(); @@ -559,21 +566,79 @@ app.cacheBuster = null; }); } + app.enableTopicSearch = function (options) { + var quickSearchResults = options.resultEl; + var inputEl = options.inputEl; + var template = options.template || 'partials/quick-search-results'; + var searchTimeoutId = 0; + inputEl.on('keyup', function () { + if (searchTimeoutId) { + clearTimeout(searchTimeoutId); + searchTimeoutId = 0; + } + if (inputEl.val().length < 3) { + return; + } + + searchTimeoutId = setTimeout(function () { + if (!inputEl.is(':focus')) { + return quickSearchResults.addClass('hidden'); + } + require(['search'], function (search) { + var data = { + term: inputEl.val(), + in: 'titles', + searchOnly: 1, + }; + search.api(data, function (data) { + if (!data.matchCount) { + quickSearchResults.html('').addClass('hidden'); + return; + } + data.posts.forEach(function (p) { + p.snippet = utils.escapeHTML($(p.content).text().slice(0, 80) + '...'); + }); + app.parseAndTranslate(template, data, function (html) { + html.find('.timeago').timeago(); + quickSearchResults.html(html).removeClass('hidden').show(); + }); + }); + }); + }, 250); + }); + }; + app.handleSearch = function () { var searchButton = $('#search-button'); var searchFields = $('#search-fields'); var searchInput = $('#search-fields input'); + var quickSearchResults = $('#quick-search-results'); $('#search-form .advanced-search-link').on('mousedown', function () { ajaxify.go('/search'); }); - $('#search-form').on('submit', dismissSearch); + $('#search-form').on('submit', function () { + searchInput.blur(); + }); searchInput.on('blur', dismissSearch); + searchInput.on('focus', function () { + if (searchInput.val() && quickSearchResults.children().length) { + quickSearchResults.removeClass('hidden').show(); + } + }); + + app.enableTopicSearch({ + inputEl: searchInput, + resultEl: quickSearchResults, + }); function dismissSearch() { searchFields.addClass('hidden'); searchButton.removeClass('hidden'); + setTimeout(function () { + quickSearchResults.addClass('hidden'); + }, 100); } searchButton.on('click', function (e) { @@ -770,6 +835,20 @@ app.cacheBuster = null; return; } + var currentSkinClassName = $('body').attr('class').split(/\s+/).filter(function (className) { + return className.startsWith('skin-'); + }); + if (!currentSkinClassName[0]) { + return; + } + var currentSkin = currentSkinClassName[0].slice(5); + currentSkin = currentSkin !== 'noskin' ? currentSkin : ''; + + // Stop execution if skin didn't change + if (skinName === currentSkin) { + return; + } + var linkEl = document.createElement('link'); linkEl.rel = 'stylesheet'; linkEl.type = 'text/css'; @@ -778,13 +857,8 @@ app.cacheBuster = null; clientEl.parentNode.removeChild(clientEl); // Update body class with proper skin name - var currentSkinClassName = $('body').attr('class').split(/\s+/).filter(function (className) { - return className.startsWith('skin-'); - }); $('body').removeClass(currentSkinClassName.join(' ')); - if (skinName) { - $('body').addClass('skin-' + skinName); - } + $('body').addClass('skin-' + (skinName || 'noskin')); }; document.head.appendChild(linkEl); diff --git a/public/src/client/categories.js b/public/src/client/categories.js index 72b1ff2bcb..b19ba2d0cd 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -33,6 +33,9 @@ define('forum/categories', ['components'], function (components) { if (!numRecentReplies || !parseInt(numRecentReplies, 10)) { return; } + if (!category.find('[component="topic/teaser"]').length) { + return; + } var recentPosts = category.find('[component="category/posts"]'); diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 861306f8f4..f5b1d094cb 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -9,7 +9,8 @@ define('forum/chats', [ 'forum/chats/search', 'forum/chats/messages', 'benchpress', -], function (components, translator, mousetrap, recentChats, search, messages, Benchpress) { + 'composer/autocomplete', +], function (components, translator, mousetrap, recentChats, search, messages, Benchpress, autocomplete) { var Chats = { initialised: false, }; @@ -27,7 +28,6 @@ define('forum/chats', [ recentChats.init(); Chats.addEventListeners(); - Chats.createAutoComplete($('[component="chat/input"]')); Chats.resizeMainWindow(); if (env === 'md' || env === 'lg') { @@ -58,6 +58,7 @@ define('forum/chats', [ Chats.addScrollHandler(ajaxify.data.roomId, ajaxify.data.uid, $('.chat-content')); Chats.addCharactersLeftHandler($('[component="chat/main-wrapper"]')); Chats.addIPHandler($('[component="chat/main-wrapper"]')); + Chats.createAutoComplete($('[component="chat/input"]')); $('[data-action="close"]').on('click', function () { Chats.switchChat(); @@ -357,22 +358,26 @@ define('forum/chats', [ }; Chats.createAutoComplete = function (element) { + if (!element.length) { + return; + } + var data = { element: element, strategies: [], options: { - zIndex: 20000, - listPosition: function (position) { - this.$el.css(this._applyPlacement(position)); - this.$el.css('position', 'absolute'); - return this; + style: { + 'z-index': 20000, + flex: 0, + top: 'inherit', }, + placement: 'top', }, }; $(window).trigger('chat:autocomplete:init', data); if (data.strategies.length) { - data.element.textcomplete(data.strategies, data.options); + autocomplete.setup(data); } }; diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 10704698ac..6051d21173 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -132,8 +132,10 @@ define('forum/groups/details', [ Details.prepareSettings = function () { var settingsFormEl = components.get('groups/settings'); - var colorBtn = settingsFormEl.find('[data-action="color-select"]'); - var colorValueEl = settingsFormEl.find('[name="labelColor"]'); + var labelColorBtn = settingsFormEl.find('[data-action="label-color-select"]'); + var textColorBtn = settingsFormEl.find('[data-action="text-color-select"]'); + var labelColorValueEl = settingsFormEl.find('[name="labelColor"]'); + var textColorValueEl = settingsFormEl.find('[name="textColor"]'); var iconBtn = settingsFormEl.find('[data-action="icon-select"]'); var previewEl = settingsFormEl.find('.label'); var previewIcon = previewEl.find('i'); @@ -142,10 +144,10 @@ define('forum/groups/details', [ var iconValueEl = settingsFormEl.find('[name="icon"]'); // Add color picker to settings form - colorBtn.ColorPicker({ - color: colorValueEl.val() || '#000', + labelColorBtn.ColorPicker({ + color: labelColorValueEl.val() || '#000', onChange: function (hsb, hex) { - colorValueEl.val('#' + hex); + labelColorValueEl.val('#' + hex); previewEl.css('background-color', '#' + hex); }, onShow: function (colpkr) { @@ -153,6 +155,17 @@ define('forum/groups/details', [ }, }); + textColorBtn.ColorPicker({ + color: textColorValueEl.val() || '#fff', + onChange: function (hsb, hex) { + textColorValueEl.val('#' + hex); + previewEl.css('color', '#' + hex); + }, + onShow: function (colpkr) { + $(colpkr).css('z-index', 1051); + }, + }); + // Add icon selection interface iconBtn.on('click', function () { iconSelect.init(previewIcon, function () { diff --git a/public/src/client/login.js b/public/src/client/login.js index 70c96088de..b571ebf021 100644 --- a/public/src/client/login.js +++ b/public/src/client/login.js @@ -69,7 +69,7 @@ define('forum/login', [], function () { return false; }); - if ($('#content #username').attr('readonly')) { + if ($('#content #username').val()) { $('#content #password').val('').focus(); } else { $('#content #username').focus(); diff --git a/public/src/client/search.js b/public/src/client/search.js index efcd6c347f..54e81242a3 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -65,7 +65,9 @@ define('forum/search', ['search', 'autocomplete', 'storage'], function (searchMo } function fillOutForm() { - var params = utils.params(); + var params = utils.params({ + disableToType: true, + }); var searchData = searchModule.getSearchPreferences(); var formData = utils.merge(searchData, params); diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index fa2b07d1c4..edfa5068b5 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -130,6 +130,7 @@ define('forum/topic/events', [ editedPostEl.html(translator.unescape(data.post.content)); editedPostEl.find('img:not(.not-responsive)').addClass('img-responsive'); images.wrapImagesInLinks(editedPostEl.parent()); + posts.addBlockquoteEllipses(editedPostEl.parent()); editedPostEl.fadeIn(250); var editData = { diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index f4f69ef215..4d29d966dd 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -248,7 +248,7 @@ define('forum/topic/postTools', [ tid: tid, pid: toPid, topicName: ajaxify.data.titleRaw, - text: username ? username + ' ' : '', + text: username ? username + ' ' : ($('[component="topic/quickreply/text"]').val() || ''), }); } }); diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index ffbc0a5ace..f794354abc 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -253,7 +253,7 @@ define('forum/topic/posts', [ images.wrapImagesInLinks(posts); Posts.showBottomPostBar(); posts.find('[component="post/content"] img:not(.not-responsive)').addClass('img-responsive'); - addBlockquoteEllipses(posts.find('[component="post/content"] > blockquote > blockquote')); + Posts.addBlockquoteEllipses(posts); hidePostToolsForDeletedPosts(posts); }; @@ -287,14 +287,15 @@ define('forum/topic/posts', [ }); } - function addBlockquoteEllipses(blockquotes) { + Posts.addBlockquoteEllipses = function (posts) { + var blockquotes = posts.find('[component="post/content"] > blockquote > blockquote'); blockquotes.each(function () { var $this = $(this); if ($this.find(':hidden:not(br)').length && !$this.find('.toggle').length) { $this.append(''); } }); - } + }; return Posts; }); diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index 7fc6ced0e9..3a52470171 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -212,6 +212,16 @@ define('forum/topic/threadTools', [ components.get('topic/purge').toggleClass('hidden', !data.isDelete).parent().attr('hidden', !data.isDelete ? '' : null); components.get('topic/deleted/message').toggleClass('hidden', !data.isDelete); + if (data.isDelete) { + app.parseAndTranslate('partials/topic/deleted-message', { + deleter: data.user, + deleted: true, + deletedTimestampISO: utils.toISOString(Date.now()), + }, function (html) { + components.get('topic/deleted/message').replaceWith(html); + html.find('.timeago').timeago(); + }); + } var hideReply = data.isDelete && !ajaxify.data.privileges.isAdminOrMod; components.get('topic/reply/container').toggleClass('hidden', hideReply); diff --git a/public/src/installer/install.js b/public/src/installer/install.js index 6c912f00ac..ba8efa7261 100644 --- a/public/src/installer/install.js +++ b/public/src/installer/install.js @@ -1,5 +1,6 @@ 'use strict'; +/* global zxcvbn */ $('document').ready(function () { setupInputs(); @@ -75,6 +76,9 @@ $('document').ready(function () { } else if (field.length < $('[name="admin:password"]').attr('data-minimum-length')) { parent.addClass('error'); help.html('Password is too short.'); + } else if (zxcvbn(field).score < parseInt($('[name="admin:password"]').attr('data-minimum-strength'), 10)) { + parent.addClass('error'); + help.html('Password is too weak.'); } else { parent.removeClass('error'); } diff --git a/public/src/modules/alerts.js b/public/src/modules/alerts.js index 0094c88f96..fc7cbe9558 100644 --- a/public/src/modules/alerts.js +++ b/public/src/modules/alerts.js @@ -52,6 +52,8 @@ define('alerts', ['translator', 'components', 'benchpress'], function (translato fadeOut(alert); }); } + + $(window).trigger('action:alert.new', { alert: alert, params: params }); }); }); } @@ -74,6 +76,7 @@ define('alerts', ['translator', 'components', 'benchpress'], function (translato translator.translate(alert.html(), function (translatedHTML) { alert.children().fadeIn(100); alert.html(translatedHTML); + $(window).trigger('action:alert.update', { alert: alert, params: params }); }); // Handle changes in the clickfn diff --git a/public/src/modules/handleBack.js b/public/src/modules/handleBack.js index f5c9f61848..b6c2c16540 100644 --- a/public/src/modules/handleBack.js +++ b/public/src/modules/handleBack.js @@ -18,10 +18,12 @@ define('handleBack', [ function saveClickedIndex() { $('[component="category"]').on('click', '[component="topic/header"]', function () { var clickedIndex = $(this).parents('[data-index]').attr('data-index'); + var windowScrollTop = $(window).scrollTop(); $('[component="category/topic"]').each(function (index, el) { - if ($(el).offset().top - $(window).scrollTop() > 0) { + if ($(el).offset().top - windowScrollTop > 0) { storage.setItem('category:bookmark', $(el).attr('data-index')); storage.setItem('category:bookmark:clicked', clickedIndex); + storage.setItem('category:bookmark:offset', $(el).offset().top - windowScrollTop); return false; } }); @@ -42,10 +44,6 @@ define('handleBack', [ bookmarkIndex = Math.max(0, parseInt(bookmarkIndex, 10) || 0); clickedIndex = Math.max(0, parseInt(clickedIndex, 10) || 0); - if (!bookmarkIndex && !clickedIndex) { - return; - } - if (config.usePagination) { var page = Math.ceil((parseInt(bookmarkIndex, 10) + 1) / config.topicsPerPage); if (parseInt(page, 10) !== ajaxify.data.pagination.currentPage) { @@ -57,7 +55,7 @@ define('handleBack', [ } } else { if (bookmarkIndex === 0) { - handleBack.highlightTopic(clickedIndex); + handleBack.scrollToTopic(bookmarkIndex, clickedIndex); return; } @@ -88,7 +86,9 @@ define('handleBack', [ var scrollTo = components.get('category/topic', 'index', bookmarkIndex); if (scrollTo.length) { - $(window).scrollTop(scrollTo.offset().top); + var offset = storage.getItem('category:bookmark:offset'); + storage.removeItem('category:bookmark:offset'); + $(window).scrollTop(scrollTo.offset().top - offset); handleBack.highlightTopic(clickedIndex); navigator.update(); } diff --git a/public/src/modules/helpers.js b/public/src/modules/helpers.js index 210164b956..4462971e00 100644 --- a/public/src/modules/helpers.js +++ b/public/src/modules/helpers.js @@ -40,13 +40,15 @@ return false; } - var loggedIn = data.config ? data.config.loggedIn : false; + if (item.route.match('/users') && data.user && !data.user.privileges['view:users']) { + return false; + } - if (item.route.match('/users') && data.privateUserInfo && !loggedIn) { + if (item.route.match('/tags') && data.user && !data.user.privileges['view:tags']) { return false; } - if (item.route.match('/tags') && data.privateTagListing && !loggedIn) { + if (item.route.match('/groups') && data.user && !data.user.privileges['view:groups']) { return false; } @@ -178,8 +180,11 @@ } } return states.map(function (priv) { - var guestDisabled = ['groups:moderate', 'groups:posts:upvote', 'groups:posts:downvote']; - var disabled = member === 'guests' && guestDisabled.includes(priv.name); + var guestDisabled = ['groups:moderate', 'groups:posts:upvote', 'groups:posts:downvote', 'groups:local:login', 'groups:group:create']; + var spidersEnabled = ['groups:find', 'groups:read', 'groups:topics:read', 'groups:view:users', 'groups:view:tags', 'groups:view:groups']; + var disabled = + (member === 'guests' && guestDisabled.includes(priv.name)) || + (member === 'spiders' && !spidersEnabled.includes(priv.name)); return ''; }).join(''); @@ -200,14 +205,14 @@ function renderDigestAvatar(block) { if (block.teaser) { if (block.teaser.user.picture) { - return ''; + return ''; } - return '
' + block.teaser.user['icon:text'] + '
'; + return '
' + block.teaser.user['icon:text'] + '
'; } if (block.user.picture) { - return ''; + return ''; } - return '
' + block.user['icon:text'] + '
'; + return '
' + block.user['icon:text'] + '
'; } function userAgentIcons(data) { diff --git a/public/src/modules/pictureCropper.js b/public/src/modules/pictureCropper.js index 8f7ba364dd..029b9ace31 100644 --- a/public/src/modules/pictureCropper.js +++ b/public/src/modules/pictureCropper.js @@ -45,7 +45,7 @@ define('pictureCropper', ['cropper'], function (Cropper) { aspectRatio: data.aspectRatio, autoCropArea: 1, viewMode: 1, - checkCrossOrigin: false, + checkCrossOrigin: true, cropmove: function () { if (data.restrictImageDimension) { if (cropperTool.cropBoxData.width > data.imageDimension) { @@ -143,7 +143,11 @@ define('pictureCropper', ['cropper'], function (Cropper) { try { imageData = data.imageType ? cropperTool.getCroppedCanvas().toDataURL(data.imageType) : cropperTool.getCroppedCanvas().toDataURL(); } catch (err) { - if (err.message === 'Failed to execute \'toDataURL\' on \'HTMLCanvasElement\': Tainted canvases may not be exported.') { + var corsErrors = [ + 'The operation is insecure.', + 'Failed to execute \'toDataURL\' on \'HTMLCanvasElement\': Tainted canvases may not be exported.', + ]; + if (corsErrors.indexOf(err.message) !== -1) { app.alertError('[[error:cors-error]]'); } else { app.alertError(err.message); diff --git a/public/src/modules/search.js b/public/src/modules/search.js index ea0f775fd1..b6b6593d49 100644 --- a/public/src/modules/search.js +++ b/public/src/modules/search.js @@ -23,6 +23,16 @@ define('search', ['navigator', 'translator', 'storage'], function (nav, translat } }; + Search.api = function (data, callback) { + var apiURL = config.relative_path + '/api/search?' + createQueryString(data); + data.searchOnly = undefined; + var searchURL = config.relative_path + '/search?' + createQueryString(data); + $.get(apiURL, function (result) { + result.url = searchURL; + callback(result); + }); + }; + function createQueryString(data) { var searchIn = data.in || 'titlesposts'; var postedBy = data.by || ''; @@ -76,6 +86,10 @@ define('search', ['navigator', 'translator', 'storage'], function (nav, translat query.showAs = data.showAs; } + if (data.searchOnly) { + query.searchOnly = data.searchOnly; + } + $(window).trigger('action:search.createQueryString', { query: query, data: data, diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index 8bce483e44..8466af852d 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -273,6 +273,10 @@ return Promise.resolve(self.modules[namespace](key, args)); } + if (namespace && result.length === 1) { + return Promise.resolve('[[' + namespace + ']]'); + } + if (namespace && !key) { warn('Missing key in translation token "' + name + '"'); return Promise.resolve('[[' + namespace + ']]'); @@ -586,6 +590,10 @@ if (!adaptor.timeagoShort) { var languageCode = utils.userLangToTimeagoCode(config.userLang); + if (!config.timeagoCodes.includes(languageCode + '-short')) { + languageCode = 'en'; + } + var originalSettings = assign({}, jQuery.timeago.settings.strings); jQuery.getScript(config.relative_path + '/assets/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '-short.js').done(function () { adaptor.timeagoShort = assign({}, jQuery.timeago.settings.strings); @@ -602,6 +610,9 @@ delete adaptor.timeagoShort; var languageCode = utils.userLangToTimeagoCode(config.userLang); + if (!config.timeagoCodes.includes(languageCode + '-short')) { + languageCode = 'en'; + } jQuery.getScript(config.relative_path + '/assets/vendor/jquery/timeago/locales/jquery.timeago.' + languageCode + '.js').done(callback); }, diff --git a/public/src/sockets.js b/public/src/sockets.js index cad6a67e70..41bc0ba4c7 100644 --- a/public/src/sockets.js +++ b/public/src/sockets.js @@ -154,7 +154,7 @@ app.isConnected = false; if ( config.socketioOrigins && - config.socketioOrigins !== '*' && + config.socketioOrigins !== '*:*' && config.socketioOrigins.indexOf(location.hostname) === -1 ) { console.error( diff --git a/public/src/utils.js b/public/src/utils.js index 05e069ed14..e3b0347de0 100644 --- a/public/src/utils.js +++ b/public/src/utils.js @@ -649,7 +649,7 @@ params.forEach(function (param) { var val = param.split('='); var key = decodeURI(val[0]); - var value = options.skipToType[key] ? decodeURI(val[1]) : utils.toType(decodeURI(val[1])); + var value = options.disableToType || options.skipToType[key] ? decodeURI(val[1]) : utils.toType(decodeURI(val[1])); if (key) { if (key.substr(-2, 2) === '[]') { diff --git a/src/categories/activeusers.js b/src/categories/activeusers.js index 40ff7bc016..726f612a6a 100644 --- a/src/categories/activeusers.js +++ b/src/categories/activeusers.js @@ -7,10 +7,13 @@ var posts = require('../posts'); var db = require('../database'); module.exports = function (Categories) { - Categories.getActiveUsers = function (cid, callback) { + Categories.getActiveUsers = function (cids, callback) { + if (!Array.isArray(cids)) { + cids = [cids]; + } async.waterfall([ function (next) { - db.getSortedSetRevRange('cid:' + cid + ':pids', 0, 24, next); + db.getSortedSetRevRange(cids.map(cid => 'cid:' + cid + ':pids'), 0, 24, next); }, function (pids, next) { posts.getPostsFields(pids, ['uid'], next); diff --git a/src/categories/create.js b/src/categories/create.js index e144bcad05..4836db2d0b 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -153,7 +153,7 @@ module.exports = function (Categories) { const oldParent = parseInt(destination.parentCid, 10) || 0; const newParent = parseInt(results.source.parentCid, 10) || 0; - if (copyParent) { + if (copyParent && newParent !== parseInt(toCid, 10)) { tasks.push(async.apply(db.sortedSetRemove, 'cid:' + oldParent + ':children', toCid)); tasks.push(async.apply(db.sortedSetAdd, 'cid:' + newParent + ':children', results.source.order, toCid)); tasks.push(function (next) { @@ -170,6 +170,7 @@ module.exports = function (Categories) { destination.link = results.source.link; destination.numRecentReplies = results.source.numRecentReplies; destination.class = results.source.class; + destination.image = results.source.image; destination.imageClass = results.source.imageClass; if (copyParent) { diff --git a/src/categories/index.js b/src/categories/index.js index a1275481e8..b201e8e204 100644 --- a/src/categories/index.js +++ b/src/categories/index.js @@ -345,7 +345,7 @@ Categories.getChildrenCids = function (rootCid, callback) { if (err) { return callback(err); } - + childrenCids = childrenCids.filter(cid => !allCids.includes(parseInt(cid, 10))); if (!childrenCids.length) { return callback(); } @@ -395,6 +395,7 @@ Categories.getTree = function (categories, parentCid) { const parents = {}; cids.forEach((cid, index) => { if (cid) { + categories[index].children = undefined; cidToCategory[cid] = categories[index]; parents[cid] = _.clone(categories[index]); } diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js index dc3fa11271..3b9c8e51be 100644 --- a/src/categories/recentreplies.js +++ b/src/categories/recentreplies.js @@ -21,7 +21,7 @@ module.exports = function (Categories) { db.getSortedSetRevRange('cid:' + cid + ':pids', 0, count - 1, next); }, function (pids, next) { - privileges.posts.filter('read', pids, uid, next); + privileges.posts.filter('topics:read', pids, uid, next); }, function (pids, next) { posts.getPostSummaryByPids(pids, uid, { stripTags: true }, next); @@ -92,7 +92,7 @@ module.exports = function (Categories) { function (results, next) { var tids = _.uniq(_.flatten(results).filter(Boolean)); - privileges.topics.filterTids('read', tids, uid, next); + privileges.topics.filterTids('topics:read', tids, uid, next); }, function (tids, next) { getTopics(tids, uid, next); diff --git a/src/controllers/404.js b/src/controllers/404.js index baa8d05650..b34926aa5e 100644 --- a/src/controllers/404.js +++ b/src/controllers/404.js @@ -9,7 +9,7 @@ var plugins = require('../plugins'); exports.handle404 = function handle404(req, res) { var relativePath = nconf.get('relative_path'); - var isClientScript = new RegExp('^' + relativePath + '\\/assets\\/src\\/.+\\.js$'); + var isClientScript = new RegExp('^' + relativePath + '\\/assets\\/src\\/.+\\.js(\\?v=\\w+)?$'); if (plugins.hasListeners('action:meta.override404')) { return plugins.fireHook('action:meta.override404', { diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js index a0ecfcfe1c..9e46fa3e63 100644 --- a/src/controllers/accounts/helpers.js +++ b/src/controllers/accounts/helpers.js @@ -189,7 +189,6 @@ helpers.getUserDataByUserSlug = function (userslug, callerUID, callback) { userData.websiteLink = !userData.website.startsWith('http') ? 'http://' + userData.website : userData.website; userData.websiteName = userData.website.replace(validator.escape('http://'), '').replace(validator.escape('https://'), ''); - userData.email = validator.escape(String(userData.email || '')); userData.fullname = validator.escape(String(userData.fullname || '')); userData.location = validator.escape(String(userData.location || '')); userData.signature = validator.escape(String(userData.signature || '')); diff --git a/src/controllers/admin/categories.js b/src/controllers/admin/categories.js index 4c443da076..73c8eb74db 100644 --- a/src/controllers/admin/categories.js +++ b/src/controllers/admin/categories.js @@ -15,7 +15,20 @@ categoriesController.get = function (req, res, callback) { async.parallel({ category: async.apply(categories.getCategories, [req.params.category_id], req.uid), parent: async.apply(categories.getParents, [req.params.category_id]), - allCategories: async.apply(categories.buildForSelect, req.uid, 'read'), + allCategories: function (next) { + async.waterfall([ + function (next) { + categories.getAllCidsFromSet('categories:cid', next); + }, + function (cids, next) { + categories.getCategories(cids, req.uid, next); + }, + function (categoryData, next) { + categoryData = categories.getTree(categoryData); + categories.buildForSelectCategories(categoryData, next); + }, + ], next); + }, }, next); }, function (data, next) { @@ -35,14 +48,17 @@ categoriesController.get = function (req, res, callback) { req: req, res: res, category: category, + customClasses: [], allCategories: data.allCategories, }, next); }, function (data) { data.category.name = translator.escape(String(data.category.name)); + res.render('admin/manage/category', { category: data.category, allCategories: data.allCategories, + customClasses: data.customClasses, }); }, ], callback); diff --git a/src/controllers/admin/database.js b/src/controllers/admin/database.js index 147747822c..3a3946395f 100644 --- a/src/controllers/admin/database.js +++ b/src/controllers/admin/database.js @@ -5,7 +5,7 @@ var nconf = require('nconf'); var databaseController = module.exports; -databaseController.get = function (req, res, next) { +databaseController.get = function (req, res) { async.waterfall([ function (next) { async.parallel({ @@ -35,8 +35,15 @@ databaseController.get = function (req, res, next) { }, }, next); }, - function (results) { - res.render('admin/advanced/database', results); - }, - ], next); + ], function (err, results) { + Object.assign(results, { error: err }); + + // Override mongo error with more human-readable error + if (err && err.name === 'MongoError' && err.codeName === 'Unauthorized') { + err.friendlyMessage = '[[admin/advanced/database:mongo.unauthorized]]'; + delete results.mongo; + } + + res.render('admin/advanced/database', results); + }); }; diff --git a/src/controllers/admin/groups.js b/src/controllers/admin/groups.js index ab452c6eb3..3ae86ceb6c 100644 --- a/src/controllers/admin/groups.js +++ b/src/controllers/admin/groups.js @@ -69,6 +69,8 @@ groupsController.get = function (req, res, callback) { group: result.group, groupNames: result.groupNames, allowPrivateGroups: meta.config.allowPrivateGroups, + maximumGroupNameLength: meta.config.maximumGroupNameLength, + maximumGroupTitleLength: meta.config.maximumGroupTitleLength, }); }, ], callback); diff --git a/src/controllers/admin/info.js b/src/controllers/admin/info.js index 92572840b9..2649c5c1ee 100644 --- a/src/controllers/admin/info.js +++ b/src/controllers/admin/info.js @@ -65,6 +65,7 @@ function getNodeInfo(callback) { version: process.version, memoryUsage: process.memoryUsage(), uptime: process.uptime(), + cpuUsage: process.cpuUsage(), }, os: { hostname: os.hostname(), @@ -75,7 +76,10 @@ function getNodeInfo(callback) { load: os.loadavg().map(function (load) { return load.toFixed(2); }).join(', '), }, }; - + data.process.cpuUsage.user /= 1000000; + data.process.cpuUsage.user = data.process.cpuUsage.user.toFixed(2); + data.process.cpuUsage.system /= 1000000; + data.process.cpuUsage.system = data.process.cpuUsage.system.toFixed(2); data.process.memoryUsage.humanReadable = (data.process.memoryUsage.rss / (1024 * 1024)).toFixed(2); async.waterfall([ diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 4a63d33ba8..8aef187347 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -290,6 +290,20 @@ function uploadImage(filename, folder, uploadedFile, req, res, next) { height: 50, }), async.apply(meta.configs.set, 'brand:emailLogo', path.join(nconf.get('upload_url'), 'system/site-logo-x50.png')), + function (next) { + image.size(imageData.path, function (err, size) { + if (err) { + return next(err); + } + + meta.configs.setMultiple({ + 'brand:logo:width': size.width, + 'brand:logo:height': size.height, + }, function (err) { + next(err); + }); + }); + }, ], function (err) { next(err, imageData); }); diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index c31de51453..743834e1d7 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -1,7 +1,6 @@ 'use strict'; var async = require('async'); -var validator = require('validator'); var nconf = require('nconf'); var user = require('../../user'); @@ -156,7 +155,6 @@ function getUsers(set, section, min, max, req, res, next) { }, function (results) { results.users = results.users.filter(function (user) { - user.email = validator.escape(String(user.email || '')); return user && parseInt(user.uid, 10); }); var data = { diff --git a/src/controllers/api.js b/src/controllers/api.js index 5f37721935..8649259b2b 100644 --- a/src/controllers/api.js +++ b/src/controllers/api.js @@ -12,6 +12,7 @@ var categories = require('../categories'); var privileges = require('../privileges'); var plugins = require('../plugins'); var translator = require('../translator'); +var languages = require('../languages'); var apiController = module.exports; @@ -62,6 +63,7 @@ apiController.loadConfig = function (req, callback) { config.bootswatchSkin = meta.config.bootswatchSkin || ''; config.enablePostHistory = (meta.config.enablePostHistory || 1) === 1; config.notificationAlertTimeout = meta.config.notificationAlertTimeout || 5000; + config.timeagoCodes = languages.timeagoCodes; if (config.useOutgoingLinksPage) { config.outgoingLinksWhitelist = meta.config['outgoingLinks:whitelist']; @@ -131,14 +133,16 @@ apiController.getPostData = function (pid, uid, callback) { post: function (next) { posts.getPostData(pid, next); }, + voted: async.apply(posts.hasVoted, pid, uid), }, function (err, results) { if (err || !results.post) { return callback(err); } var post = results.post; - var privileges = results.privileges[0]; + Object.assign(post, results.voted); + var privileges = results.privileges[0]; if (!privileges.read || !privileges['topics:read']) { return callback(); } diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js index 98b352050a..061359394c 100644 --- a/src/controllers/authentication.js +++ b/src/controllers/authentication.js @@ -173,7 +173,7 @@ authenticationController.registerComplete = function (req, res, next) { return res.redirect(nconf.get('relative_path') + '/?register=' + encodeURIComponent(data.message)); } if (req.session.returnTo) { - res.redirect(req.session.returnTo); + res.redirect(nconf.get('relative_path') + req.session.returnTo); } else { res.redirect(nconf.get('relative_path') + '/'); } @@ -273,13 +273,20 @@ function continueLogin(req, res, next) { if (passwordExpiry && passwordExpiry < Date.now()) { winston.verbose('[auth] Triggering password reset for uid ' + userData.uid + ' due to password policy'); req.session.passwordExpired = true; - user.reset.generate(userData.uid, function (err, code) { + + async.series({ + code: async.apply(user.reset.generate, userData.uid), + buildHeader: async.apply(middleware.buildHeader, req, res), + header: async.apply(middleware.generateHeader, req, res, {}), + }, function (err, payload) { if (err) { return helpers.noScriptErrors(req, res, err.message, 403); } res.status(200).send({ - next: nconf.get('relative_path') + '/reset/' + code, + next: nconf.get('relative_path') + '/reset/' + payload.code, + header: payload.header, + config: res.locals.config, }); }); } else { @@ -331,6 +338,15 @@ authenticationController.doLogin = function (req, uid, callback) { }; authenticationController.onSuccessfulLogin = function (req, uid, callback) { + // If already called once, return prematurely + if (req.res.locals.user) { + if (typeof callback === 'function') { + return setImmediate(callback); + } + + return true; + } + var uuid = utils.generateUUID(); req.uid = uid; @@ -373,6 +389,9 @@ authenticationController.onSuccessfulLogin = function (req, uid, callback) { function (next) { user.updateLastOnlineTime(uid, next); }, + function (next) { + user.updateOnlineUsers(uid, next); + }, ], function (err) { next(err); }); @@ -392,7 +411,7 @@ authenticationController.onSuccessfulLogin = function (req, uid, callback) { if (typeof callback === 'function') { callback(err); } else { - return false; + return !!err; } }); }; @@ -427,7 +446,7 @@ authenticationController.localLogin = function (req, username, password, next) { user.isAdminOrGlobalMod(uid, next); }, banned: function (next) { - user.isBanned(uid, next); + user.bans.isBanned(uid, next); }, hasLoginPrivilege: function (next) { privileges.global.can('local:login', uid, next); @@ -464,10 +483,11 @@ authenticationController.logout = function (req, res, next) { if (!req.loggedIn || !req.sessionID) { return res.status(200).send('not-logged-in'); } - + const uid = req.uid; + const sessionID = req.sessionID; async.waterfall([ function (next) { - user.auth.revokeSession(req.sessionID, req.uid, next); + user.auth.revokeSession(sessionID, uid, next); }, function (next) { req.logout(); @@ -478,15 +498,18 @@ authenticationController.logout = function (req, res, next) { }); }, function (next) { - user.setUserField(req.uid, 'lastonline', Date.now() - 300000, next); + user.setUserField(uid, 'lastonline', Date.now() - (meta.config.onlineCutoff * 60000), next); }, function (next) { - plugins.fireHook('static:user.loggedOut', { req: req, res: res, uid: req.uid }, next); + db.sortedSetAdd('users:online', Date.now() - (meta.config.onlineCutoff * 60000), uid, next); + }, + function (next) { + plugins.fireHook('static:user.loggedOut', { req: req, res: res, uid: uid, sessionID: sessionID }, next); }, async.apply(middleware.autoLocale, req, res), function () { // Force session check for all connected socket.io clients with the same session id - sockets.in('sess_' + req.sessionID).emit('checkSession', 0); + sockets.in('sess_' + sessionID).emit('checkSession', 0); if (req.body.noscript === 'true') { res.redirect(nconf.get('relative_path') + '/'); } else { @@ -498,10 +521,12 @@ authenticationController.logout = function (req, res, next) { return res.status(500); } - res.status(200).send({ + payload = { header: payload.header, config: res.locals.config, - }); + }; + plugins.fireHook('filter:user.logout', payload); + res.status(200).send(payload); }); } }, @@ -526,7 +551,7 @@ function getBanInfo(uid, callback) { }); }, function (next) { - next(new Error(banInfo.expiry ? '[[error:user-banned-reason-until, ' + banInfo.expiry_readable + ', ' + banInfo.reason + ']]' : '[[error:user-banned-reason, ' + banInfo.reason + ']]')); + next(new Error(banInfo.banned_until ? '[[error:user-banned-reason-until, ' + banInfo.banned_until_readable + ', ' + banInfo.reason + ']]' : '[[error:user-banned-reason, ' + banInfo.reason + ']]')); }, ], function (err) { if (err) { diff --git a/src/controllers/composer.js b/src/controllers/composer.js index 7bd61a5bb2..880e1b2b78 100644 --- a/src/controllers/composer.js +++ b/src/controllers/composer.js @@ -9,6 +9,12 @@ var topics = require('../topics'); var helpers = require('./helpers'); exports.get = function (req, res, callback) { + res.locals.metaTags = { + ...res.locals.metaTags, + name: 'robots', + content: 'noindex', + }; + async.waterfall([ function (next) { plugins.fireHook('filter:composer.build', { diff --git a/src/controllers/errors.js b/src/controllers/errors.js index 849750e391..032924acd6 100644 --- a/src/controllers/errors.js +++ b/src/controllers/errors.js @@ -39,7 +39,7 @@ exports.handleURIErrors = function handleURIErrors(err, req, res, next) { exports.handleErrors = function handleErrors(err, req, res, next) { // eslint-disable-line no-unused-vars var cases = { EBADCSRFTOKEN: function () { - winston.error(req.path + '\n', err.message); + winston.error(req.path + '\n' + err.message); res.sendStatus(403); }, 'blacklisted-ip': function () { diff --git a/src/controllers/globalmods.js b/src/controllers/globalmods.js index 1cae97a4e2..ed564c9093 100644 --- a/src/controllers/globalmods.js +++ b/src/controllers/globalmods.js @@ -4,6 +4,7 @@ var async = require('async'); var user = require('../user'); var adminBlacklistController = require('./admin/blacklist'); +var usersController = require('./admin/users'); var globalModsController = module.exports; @@ -20,3 +21,18 @@ globalModsController.ipBlacklist = function (req, res, next) { }, ], next); }; + + +globalModsController.registrationQueue = function (req, res, next) { + async.waterfall([ + function (next) { + user.isAdminOrGlobalMod(req.uid, next); + }, + function (isAdminOrGlobalMod, next) { + if (!isAdminOrGlobalMod) { + return next(); + } + usersController.registrationQueue(req, res, next); + }, + ], next); +}; diff --git a/src/controllers/groups.js b/src/controllers/groups.js index 96e6c0bbbb..041ba878df 100644 --- a/src/controllers/groups.js +++ b/src/controllers/groups.js @@ -8,6 +8,7 @@ var groups = require('../groups'); var user = require('../user'); var helpers = require('./helpers'); var pagination = require('../pagination'); +var privileges = require('../privileges'); var groupsController = module.exports; @@ -34,12 +35,15 @@ groupsController.getGroupsFromSet = function (uid, sort, start, stop, callback) async.waterfall([ function (next) { - groups.getGroupsFromSet(set, uid, start, stop, next); + async.parallel({ + groupsData: async.apply(groups.getGroupsFromSet, set, uid, start, stop), + allowGroupCreation: async.apply(privileges.global.can, 'group:create', uid), + }, next); }, - function (groupsData, next) { + function (results, next) { next(null, { - groups: groupsData, - allowGroupCreation: meta.config.allowGroupCreation, + groups: results.groupsData, + allowGroupCreation: results.allowGroupCreation, nextStart: stop + 1, }); }, diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 6068de3091..efdf97e811 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -136,10 +136,10 @@ helpers.notAllowed = function (req, res, error) { }); } } else if (res.locals.isAPI) { - req.session.returnTo = nconf.get('relative_path') + req.url.replace(/^\/api/, ''); + req.session.returnTo = req.url.replace(/^\/api/, ''); res.status(401).json('not-authorized'); } else { - req.session.returnTo = nconf.get('relative_path') + req.url; + req.session.returnTo = req.url; res.redirect(nconf.get('relative_path') + '/login'); } }); diff --git a/src/controllers/index.js b/src/controllers/index.js index ed94cd4713..3e54e6f98d 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -40,6 +40,12 @@ Controllers.errors = require('./errors'); Controllers.composer = require('./composer'); Controllers.reset = function (req, res, next) { + res.locals.metaTags = { + ...res.locals.metaTags, + name: 'robots', + content: 'noindex', + }; + const renderReset = function (code, valid) { res.render('reset_code', { valid: valid, @@ -62,10 +68,10 @@ Controllers.reset = function (req, res, next) { }; if (req.params.code) { - // Save to session and redirect req.session.reset_code = req.params.code; - res.redirect(nconf.get('relative_path') + '/reset'); - } else if (req.session.reset_code) { + } + + if (req.session.reset_code) { // Validate and save to local variable before removing from session user.reset.validate(req.session.reset_code, function (err, valid) { if (err) { @@ -92,7 +98,7 @@ Controllers.login = function (req, res, next) { var registrationType = meta.config.registrationType || 'normal'; var allowLoginWith = (meta.config.allowLoginWith || 'username-email'); - var returnTo = (req.headers['x-return-to'] || '').replace(nconf.get('base_url'), ''); + var returnTo = (req.headers['x-return-to'] || '').replace(nconf.get('base_url') + nconf.get('relative_path'), ''); var errorText; if (req.query.error === 'csrf-invalid') { @@ -214,7 +220,7 @@ Controllers.registerInterstitial = function (req, res, next) { // No interstitials, redirect to home const returnTo = req.session.returnTo || req.session.registration.returnTo; delete req.session.registration; - return helpers.redirect(res, returnTo || nconf.get('relative_path') + '/'); + return helpers.redirect(res, returnTo || '/'); } var renders = data.interstitials.map(function (interstitial) { return async.apply(req.app.render.bind(req.app), interstitial.template, interstitial.data || {}); @@ -252,6 +258,7 @@ Controllers.robots = function (req, res) { res.send('User-agent: *\n' + 'Disallow: ' + nconf.get('relative_path') + '/admin/\n' + 'Disallow: ' + nconf.get('relative_path') + '/reset/\n' + + 'Disallow: ' + nconf.get('relative_path') + '/compose\n' + 'Sitemap: ' + nconf.get('url') + '/sitemap.xml'); } }; diff --git a/src/controllers/posts.js b/src/controllers/posts.js index 5f41d6a9d9..550324c0e0 100644 --- a/src/controllers/posts.js +++ b/src/controllers/posts.js @@ -18,7 +18,7 @@ postsController.redirectToPost = function (req, res, next) { function (next) { async.parallel({ canRead: function (next) { - privileges.posts.can('read', pid, req.uid, next); + privileges.posts.can('topics:read', pid, req.uid, next); }, path: function (next) { posts.generatePostPath(pid, req.uid, next); diff --git a/src/controllers/recent.js b/src/controllers/recent.js index e18c853c68..ed7f8e5ea4 100644 --- a/src/controllers/recent.js +++ b/src/controllers/recent.js @@ -10,6 +10,7 @@ var topics = require('../topics'); var meta = require('../meta'); var helpers = require('./helpers'); var pagination = require('../pagination'); +var privileges = require('../privileges'); var recentController = module.exports; @@ -36,6 +37,7 @@ recentController.getData = function (req, url, sort, callback) { var filter = req.query.filter || ''; var categoryData; var rssToken; + var canPost; if (!helpers.validFilters[filter] || (!term && req.query.term)) { return callback(null, null); @@ -49,17 +51,25 @@ recentController.getData = function (req, url, sort, callback) { user.getSettings(req.uid, next); }, categories: function (next) { - helpers.getCategoriesByStates(req.uid, cid, [categories.watchStates.watching, categories.watchStates.notwatching], next); + const states = [categories.watchStates.watching, categories.watchStates.notwatching]; + if (filter === 'watched') { + states.push(categories.watchStates.ignoring); + } + helpers.getCategoriesByStates(req.uid, cid, states, next); }, rssToken: function (next) { user.auth.getFeedToken(req.uid, next); }, + canPost: function (next) { + canPostTopic(req.uid, next); + }, }, next); }, function (results, next) { rssToken = results.rssToken; settings = results.settings; categoryData = results.categories; + canPost = results.canPost; var start = Math.max(0, (page - 1) * settings.topicsPerPage); stop = start + settings.topicsPerPage - 1; @@ -76,6 +86,7 @@ recentController.getData = function (req, url, sort, callback) { }, next); }, function (data, next) { + data.canPost = canPost; data.categories = categoryData.categories; data.allCategoriesUrl = url + helpers.buildQueryString('', filter, ''); data.selectedCategory = categoryData.selectedCategory; @@ -88,13 +99,9 @@ recentController.getData = function (req, url, sort, callback) { data.title = meta.config.homePageTitle || '[[pages:home]]'; data.filters = helpers.buildFilters(url, filter, req.query); - data.selectedFilter = data.filters.find(function (filter) { - return filter && filter.selected; - }); + data.selectedFilter = data.filters.find(filter => filter && filter.selected); data.terms = helpers.buildTerms(url, term, req.query); - data.selectedTerm = data.terms.find(function (term) { - return term && term.selected; - }); + data.selectedTerm = data.terms.find(term => term && term.selected); var pageCount = Math.max(1, Math.ceil(data.topicCount / settings.topicsPerPage)); data.pagination = pagination.create(page, pageCount, req.query); @@ -108,3 +115,17 @@ recentController.getData = function (req, url, sort, callback) { }, ], callback); }; + +function canPostTopic(uid, callback) { + async.waterfall([ + function (next) { + categories.getAllCidsFromSet('categories:cid', next); + }, + function (cids, next) { + privileges.categories.filterCids('topics:create', cids, uid, next); + }, + function (cids, next) { + next(null, cids.length > 0); + }, + ], callback); +} diff --git a/src/controllers/search.js b/src/controllers/search.js index 443d2801c3..0ee2ec4cc0 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -67,6 +67,7 @@ searchController.search = function (req, res, next) { var searchData = results.search; searchData.pagination = pagination.create(page, searchData.pageCount, req.query); + searchData.multiplePages = searchData.pageCount > 1; searchData.search_query = validator.escape(String(req.query.term || '')); searchData.term = req.query.term; diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 6e2f72785c..f3b31165b8 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -3,11 +3,12 @@ var async = require('async'); var nconf = require('nconf'); +var winston = require('winston'); var user = require('../user'); var meta = require('../meta'); var topics = require('../topics'); -var posts = require('../posts'); +var posts = require('../posts').async; var privileges = require('../privileges'); var plugins = require('../plugins'); var helpers = require('./helpers'); @@ -136,6 +137,10 @@ topicsController.get = function getTopic(req, res, callback) { function (data, next) { buildBreadcrumbs(data.topicData, next); }, + async function (topicData) { + await addTags(topicData, req, res); + return topicData; + }, function (topicData) { topicData.privileges = userPrivileges; topicData.topicStaleDays = meta.config.topicStaleDays; @@ -152,8 +157,6 @@ topicsController.get = function getTopic(req, res, callback) { topicData.rssFeedUrl += '?uid=' + req.uid + '&token=' + rssToken; } - addTags(topicData, req, res); - topicData.postIndex = req.params.post_index; topicData.pagination = pagination.create(currentPage, pageCount, req.query); topicData.pagination.rel.forEach(function (rel) { @@ -172,7 +175,7 @@ topicsController.get = function getTopic(req, res, callback) { if (req.loggedIn) { topics.markAsRead([tid], req.uid, function (err, markedRead) { if (err) { - return callback(err); + return winston.error(err); } if (markedRead) { topics.pushUnreadCount(req.uid); @@ -210,7 +213,7 @@ function buildBreadcrumbs(topicData, callback) { ], callback); } -function addTags(topicData, req, res) { +async function addTags(topicData, req, res) { var postAtIndex = topicData.posts.find(function (postData) { return parseInt(postData.index, 10) === parseInt(Math.max(0, req.params.post_index - 1), 10); }); @@ -260,7 +263,7 @@ function addTags(topicData, req, res) { }, ]; - addOGImageTags(res, topicData, postAtIndex); + await addOGImageTags(res, topicData, postAtIndex); res.locals.linkTags = [ { @@ -285,58 +288,53 @@ function addTags(topicData, req, res) { } } -function addOGImageTags(res, topicData, postAtIndex) { - var ogImageUrl = ''; +async function addOGImageTags(res, topicData, postAtIndex) { + const uploads = postAtIndex ? await posts.uploads.listWithSizes(postAtIndex.pid) : []; + const images = uploads.map((upload) => { + upload.name = nconf.get('url') + nconf.get('upload_url') + '/files/' + upload.name; + return upload; + }); if (topicData.thumb) { - ogImageUrl = topicData.thumb; - } else if (topicData.category.backgroundImage && (!postAtIndex || !postAtIndex.index)) { - ogImageUrl = topicData.category.backgroundImage; - } else if (postAtIndex && postAtIndex.user && postAtIndex.user.picture) { - ogImageUrl = postAtIndex.user.picture; - } else if (meta.config['og:image']) { - ogImageUrl = meta.config['og:image']; - } else if (meta.config['brand:logo']) { - ogImageUrl = meta.config['brand:logo']; - } else { - ogImageUrl = '/logo.png'; + images.push(topicData.thumb); } - - addOGImageTag(res, ogImageUrl); - addOGImageTagsForPosts(res, topicData.posts); -} - -function addOGImageTagsForPosts(res, posts) { - posts.forEach(function (postData) { - var regex = /src\s*=\s*"(.+?)"/g; - var match = regex.exec(postData.content); - while (match !== null) { - var image = match[1]; - - if (image.startsWith(nconf.get('url') + '/plugins')) { - return; - } - - addOGImageTag(res, image); - - match = regex.exec(postData.content); - } - }); + if (topicData.category.backgroundImage && (!postAtIndex || !postAtIndex.index)) { + images.push(topicData.category.backgroundImage); + } + if (postAtIndex && postAtIndex.user && postAtIndex.user.picture) { + images.push(postAtIndex.user.picture); + } + images.forEach(path => addOGImageTag(res, path)); } -function addOGImageTag(res, imageUrl) { - if (typeof imageUrl === 'string' && !imageUrl.startsWith('http')) { - imageUrl = nconf.get('url') + imageUrl.replace(new RegExp('^' + nconf.get('relative_path')), ''); +function addOGImageTag(res, image) { + let imageUrl; + if (typeof image === 'string' && !image.startsWith('http')) { + imageUrl = nconf.get('url') + image.replace(new RegExp('^' + nconf.get('relative_path')), ''); + } else if (typeof image === 'object') { + imageUrl = image.name; + } else { + imageUrl = image; } + res.locals.metaTags.push({ property: 'og:image', content: imageUrl, noEscape: true, - }); - res.locals.metaTags.push({ + }, { property: 'og:image:url', content: imageUrl, noEscape: true, }); + + if (typeof image === 'object' && image.width && image.height) { + res.locals.metaTags.push({ + property: 'og:image:width', + content: String(image.width), + }, { + property: 'og:image:height', + content: String(image.height), + }); + } } topicsController.teaser = function (req, res, next) { @@ -348,7 +346,7 @@ topicsController.teaser = function (req, res, next) { async.waterfall([ function (next) { - privileges.topics.can('read', tid, req.uid, next); + privileges.topics.can('topics:read', tid, req.uid, next); }, function (canRead, next) { if (!canRead) { diff --git a/src/controllers/unread.js b/src/controllers/unread.js index c1f9804437..faafc50b83 100644 --- a/src/controllers/unread.js +++ b/src/controllers/unread.js @@ -36,7 +36,11 @@ unreadController.get = function (req, res, next) { if (plugins.hasListeners('filter:unread.categories')) { plugins.fireHook('filter:unread.categories', { uid: req.uid, cid: cid }, next); } else { - helpers.getCategoriesByStates(req.uid, cid, [categories.watchStates.watching], next); + const states = [categories.watchStates.watching]; + if (filter === 'watched') { + states.push(categories.watchStates.notwatching, categories.watchStates.ignoring); + } + helpers.getCategoriesByStates(req.uid, cid, states, next); } }, settings: function (next) { diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index 4e33bb4602..6b68b5751e 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -58,6 +58,9 @@ function uploadAsImage(req, uploadedFile, callback) { } image.checkDimensions(uploadedFile.path, next); }, + function (next) { + image.stripEXIF(uploadedFile.path, next); + }, function (next) { if (plugins.hasListeners('filter:uploadImage')) { return plugins.fireHook('filter:uploadImage', { diff --git a/src/controllers/user.js b/src/controllers/user.js index 66eaeafa8e..ea3ba03083 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -13,6 +13,7 @@ var meta = require('../meta'); var posts = require('../posts'); var batch = require('../batch'); var events = require('../events'); +var privileges = require('../privileges'); var accountHelpers = require('./accounts/helpers'); var userController = module.exports; @@ -84,27 +85,33 @@ userController.getUserDataByField = function (callerUid, field, fieldValue, call }; userController.getUserDataByUID = function (callerUid, uid, callback) { - if (parseInt(callerUid, 10) <= 0 && meta.config.privateUserInfo) { - return callback(new Error('[[error:no-privileges]]')); - } - if (!parseInt(uid, 10)) { return callback(new Error('[[error:no-user]]')); } + async.waterfall([ + function (next) { + privileges.global.can('view:users', callerUid, next); + }, + function (canView, next) { + if (!canView) { + return next(new Error('[[error:no-privileges]]')); + } + async.parallel({ + userData: async.apply(user.getUserData, uid), + settings: async.apply(user.getSettings, uid), + }, next); + }, + function (results, next) { + if (!results.userData) { + return next(new Error('[[error:no-user]]')); + } - async.parallel({ - userData: async.apply(user.getUserData, uid), - settings: async.apply(user.getSettings, uid), - }, function (err, results) { - if (err || !results.userData) { - return callback(err || new Error('[[error:no-user]]')); - } - - results.userData.email = results.settings.showemail && !meta.config.hideEmail ? results.userData.email : undefined; - results.userData.fullname = results.settings.showfullname && !meta.config.hideFullname ? results.userData.fullname : undefined; + results.userData.email = results.settings.showemail && !meta.config.hideEmail ? results.userData.email : undefined; + results.userData.fullname = results.settings.showfullname && !meta.config.hideFullname ? results.userData.fullname : undefined; - callback(null, results.userData); - }); + next(null, results.userData); + }, + ], callback); }; userController.exportPosts = function (req, res, next) { diff --git a/src/database/mongo.js b/src/database/mongo.js index 21c5a97638..7f5bb21b68 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -226,7 +226,8 @@ mongoModule.info = function (db, callback) { }, next); }, function (results, next) { - var stats = results.stats; + var stats = results.stats || {}; + results.serverStatus = results.serverStatus || {}; var scale = 1024 * 1024 * 1024; results.listCollections = results.listCollections.map(function (collectionInfo) { @@ -241,13 +242,12 @@ mongoModule.info = function (db, callback) { }; }); - stats.mem = results.serverStatus.mem; - stats.mem = results.serverStatus.mem; + stats.mem = results.serverStatus.mem || {}; stats.mem.resident = (stats.mem.resident / 1024).toFixed(3); stats.mem.virtual = (stats.mem.virtual / 1024).toFixed(3); stats.mem.mapped = (stats.mem.mapped / 1024).toFixed(3); stats.collectionData = results.listCollections; - stats.network = results.serverStatus.network; + stats.network = results.serverStatus.network || {}; stats.network.bytesIn = (stats.network.bytesIn / scale).toFixed(3); stats.network.bytesOut = (stats.network.bytesOut / scale).toFixed(3); stats.network.numRequests = utils.addCommas(stats.network.numRequests); diff --git a/src/database/mongo/helpers.js b/src/database/mongo/helpers.js index a02c658a3d..928f7516f2 100644 --- a/src/database/mongo/helpers.js +++ b/src/database/mongo/helpers.js @@ -46,9 +46,5 @@ helpers.deserializeData = function (data) { }; helpers.valueToString = function (value) { - if (value === null || value === undefined) { - return value; - } - - return value.toString(); + return String(value); }; diff --git a/src/database/mongo/sets.js b/src/database/mongo/sets.js index 7d628d9b69..97f8371a35 100644 --- a/src/database/mongo/sets.js +++ b/src/database/mongo/sets.js @@ -55,6 +55,9 @@ module.exports = function (db, module) { } bulk.execute(function (err) { + if (err && err.message.startsWith('E11000 duplicate key error')) { + return process.nextTick(module.setsAdd, keys, value, callback); + } callback(err); }); }; diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index e71bb0568a..4694b03cc4 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -2,6 +2,7 @@ module.exports = function (db, module) { var helpers = module.helpers.mongo; + var utils = require('../../../utils'); module.sortedSetAdd = function (key, score, value, callback) { callback = callback || helpers.noop; @@ -11,7 +12,9 @@ module.exports = function (db, module) { if (Array.isArray(score) && Array.isArray(value)) { return sortedSetAddBulk(key, score, value, callback); } - + if (!utils.isNumber(score)) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); + } value = helpers.valueToString(value); db.collection('objects').updateOne({ _key: key, value: value }, { $set: { score: parseFloat(score) } }, { upsert: true, w: 1 }, function (err) { @@ -29,7 +32,11 @@ module.exports = function (db, module) { if (scores.length !== values.length) { return callback(new Error('[[error:invalid-data]]')); } - + for (let i = 0; i < scores.length; i += 1) { + if (!utils.isNumber(scores[i])) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + scores[i] + ']]')); + } + } values = values.map(helpers.valueToString); var bulk = db.collection('objects').initializeUnorderedBulkOp(); @@ -48,6 +55,9 @@ module.exports = function (db, module) { if (!Array.isArray(keys) || !keys.length) { return callback(); } + if (!utils.isNumber(score)) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); + } value = helpers.valueToString(value); var bulk = db.collection('objects').initializeUnorderedBulkOp(); diff --git a/src/database/postgres/helpers.js b/src/database/postgres/helpers.js index 1b9a4d2cf6..61965ba588 100644 --- a/src/database/postgres/helpers.js +++ b/src/database/postgres/helpers.js @@ -3,11 +3,7 @@ var helpers = {}; helpers.valueToString = function (value) { - if (value === null || value === undefined) { - return value; - } - - return value.toString(); + return String(value); }; helpers.removeDuplicateValues = function (values) { diff --git a/src/database/postgres/sorted/add.js b/src/database/postgres/sorted/add.js index a187091746..7121df4f97 100644 --- a/src/database/postgres/sorted/add.js +++ b/src/database/postgres/sorted/add.js @@ -4,6 +4,7 @@ var async = require('async'); module.exports = function (db, module) { var helpers = module.helpers.postgres; + var utils = require('../../../utils'); module.sortedSetAdd = function (key, score, value, callback) { callback = callback || helpers.noop; @@ -15,7 +16,9 @@ module.exports = function (db, module) { if (Array.isArray(score) && Array.isArray(value)) { return sortedSetAddBulk(key, score, value, callback); } - + if (!utils.isNumber(score)) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); + } value = helpers.valueToString(value); score = parseFloat(score); @@ -46,7 +49,11 @@ VALUES ($1::TEXT, $2::TEXT, $3::NUMERIC) if (scores.length !== values.length) { return callback(new Error('[[error:invalid-data]]')); } - + for (let i = 0; i < scores.length; i += 1) { + if (!utils.isNumber(scores[i])) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + scores[i] + ']]')); + } + } values = values.map(helpers.valueToString); scores = scores.map(function (score) { return parseFloat(score); @@ -81,7 +88,9 @@ SELECT $1::TEXT, v, s if (!Array.isArray(keys) || !keys.length) { return callback(); } - + if (!utils.isNumber(score)) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); + } value = helpers.valueToString(value); score = parseFloat(score); diff --git a/src/database/redis.js b/src/database/redis.js index 2828f84915..58a427d8c8 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -114,6 +114,9 @@ redisModule.connect = function (options, callback) { throw err; } }); + } else { + callbackCalled = true; + return callback(new Error('[[error:no-database-selected]]')); } return cxn; @@ -186,9 +189,11 @@ redisModule.info = function (cxn, callback) { }); const keyInfo = redisData['db' + nconf.get('redis:database')]; - redisData.keys = keyInfo.split(',')[0].replace('keys=', ''); - redisData.expires = keyInfo.split(',')[1].replace('expires=', ''); - redisData.avg_ttl = keyInfo.split(',')[2].replace('avg_ttl=', ''); + if (keyInfo) { + redisData.keys = keyInfo.split(',')[0].replace('keys=', ''); + redisData.expires = keyInfo.split(',')[1].replace('expires=', ''); + redisData.avg_ttl = keyInfo.split(',')[2].replace('avg_ttl=', ''); + } redisData.instantaneous_input = (redisData.instantaneous_input_kbps / 1024).toFixed(3); redisData.instantaneous_output = (redisData.instantaneous_output_kbps / 1024).toFixed(3); diff --git a/src/database/redis/hash.js b/src/database/redis/hash.js index 5be88c025b..7be90aa7f0 100644 --- a/src/database/redis/hash.js +++ b/src/database/redis/hash.js @@ -63,13 +63,13 @@ module.exports = function (redisClient, module) { module.getObjects = function (keys, callback) { var cachedData = {}; - function getFromCache() { - process.nextTick(callback, null, keys.map(key => _.clone(cachedData[key]))); + function getFromCache(next) { + process.nextTick(next, null, keys.map(key => _.clone(cachedData[key]))); } const unCachedKeys = cache.getUnCachedKeys(keys, cachedData); if (!unCachedKeys.length) { - return getFromCache(); + return getFromCache(callback); } async.waterfall([ @@ -80,13 +80,13 @@ module.exports = function (redisClient, module) { redisClient.hgetall(unCachedKeys[0], (err, data) => next(err, [data])); } }, - function (data) { + function (data, next) { unCachedKeys.forEach(function (key, i) { cachedData[key] = data[i] || null; cache.set(key, cachedData[key]); }); - getFromCache(); + getFromCache(next); }, ], callback); }; diff --git a/src/database/redis/sets.js b/src/database/redis/sets.js index 084cc612b3..9cb93effae 100644 --- a/src/database/redis/sets.js +++ b/src/database/redis/sets.js @@ -18,6 +18,9 @@ module.exports = function (redisClient, module) { module.setsAdd = function (keys, value, callback) { callback = callback || function () {}; + if (!Array.isArray(keys) || !keys.length) { + return setImmediate(callback); + } helpers.execKeysValue(redisClient, 'batch', 'sadd', keys, value, function (err) { callback(err); }); diff --git a/src/database/redis/sorted/add.js b/src/database/redis/sorted/add.js index e6f5861704..22b9c3b69f 100644 --- a/src/database/redis/sorted/add.js +++ b/src/database/redis/sorted/add.js @@ -1,6 +1,8 @@ 'use strict'; module.exports = function (redisClient, module) { + const utils = require('../../../utils'); + module.sortedSetAdd = function (key, score, value, callback) { callback = callback || function () {}; if (!key) { @@ -9,7 +11,10 @@ module.exports = function (redisClient, module) { if (Array.isArray(score) && Array.isArray(value)) { return sortedSetAddMulti(key, score, value, callback); } - redisClient.zadd(key, score, value, function (err) { + if (!utils.isNumber(score)) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); + } + redisClient.zadd(key, score, String(value), function (err) { callback(err); }); }; @@ -22,11 +27,15 @@ module.exports = function (redisClient, module) { if (scores.length !== values.length) { return callback(new Error('[[error:invalid-data]]')); } - + for (let i = 0; i < scores.length; i += 1) { + if (!utils.isNumber(scores[i])) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + scores[i] + ']]')); + } + } var args = [key]; for (var i = 0; i < scores.length; i += 1) { - args.push(scores[i], values[i]); + args.push(scores[i], String(values[i])); } redisClient.zadd(args, function (err) { @@ -37,13 +46,16 @@ module.exports = function (redisClient, module) { module.sortedSetsAdd = function (keys, score, value, callback) { callback = callback || function () {}; if (!Array.isArray(keys) || !keys.length) { - return callback(); + return setImmediate(callback); + } + if (!utils.isNumber(score)) { + return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); } var batch = redisClient.batch(); for (var i = 0; i < keys.length; i += 1) { if (keys[i]) { - batch.zadd(keys[i], score, value); + batch.zadd(keys[i], score, String(value)); } } diff --git a/src/emailer.js b/src/emailer.js index 33048b7ed1..b75a672e88 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -26,9 +26,11 @@ Emailer.transports = { sendmail: nodemailer.createTransport({ sendmail: true, newline: 'unix', + pool: true, + rateLimit: meta.config['email:sendmail:rateLimit'], + rateDelta: meta.config['email:sendmail:rateDelta'], }), smtp: undefined, - // gmail: undefined, }; var app; @@ -142,7 +144,7 @@ Emailer.registerApp = function (expressApp) { app = expressApp; var logo = null; - if (meta.configs.hasOwnProperty('brand:emailLogo')) { + if (meta.config.hasOwnProperty('brand:emailLogo')) { logo = (!meta.config['brand:emailLogo'].startsWith('http') ? nconf.get('url') : '') + meta.config['brand:emailLogo']; } @@ -162,9 +164,15 @@ Emailer.registerApp = function (expressApp) { // Update default payload if new logo is uploaded pubsub.on('config:update', function (config) { if (config) { - Emailer._defaultPayload.logo.src = config['brand:emailLogo']; - Emailer._defaultPayload.logo.height = config['brand:emailLogo:height']; - Emailer._defaultPayload.logo.width = config['brand:emailLogo:width']; + if (config['brand:emailLogo']) { + Emailer._defaultPayload.logo.src = config['brand:emailLogo']; + } + if (config['brand:emailLogo:height']) { + Emailer._defaultPayload.logo.height = config['brand:emailLogo:height']; + } + if (config['brand:emailLogo:width']) { + Emailer._defaultPayload.logo.width = config['brand:emailLogo:width']; + } if (smtpSettingsChanged(config)) { Emailer.setupFallbackTransport(config); @@ -195,15 +203,18 @@ Emailer.send = function (template, uid, params, callback) { settings: async.apply(User.getSettings, uid), }, next); }, - function (results, next) { + async function (results) { if (!results.email) { winston.warn('uid : ' + uid + ' has no email, not sending.'); - return next(); + return; } params.uid = uid; - Emailer.sendToEmail(template, results.email, results.settings.userLang, params, next); + params.rtl = await translator.translate('[[language:dir]]', results.settings.userLang) === 'rtl'; + Emailer.sendToEmail(template, results.email, results.settings.userLang, params, function () {}); }, - ], callback); + ], function (err) { + return callback(err); + }); }; Emailer.sendToEmail = function (template, email, language, params, callback) { @@ -282,6 +293,7 @@ Emailer.sendToEmail = function (template, email, language, params, callback) { pid: params.pid, fromUid: params.fromUid, headers: params.headers, + rtl: params.rtl, }; Plugins.fireHook('filter:email.modify', data, next); }, @@ -332,9 +344,13 @@ function buildCustomTemplates(config) { }, next); }, function (result, next) { - var templates = result.templates.filter(function (template) { - return template.isCustom && template.text !== prevConfig['email:custom:' + path]; - }); + // If the new config contains any email override values, re-compile those templates + var toBuild = Object + .keys(config) + .filter(prop => prop.startsWith('email:custom:')) + .map(key => key.split(':')[2]); + + var templates = result.templates.filter(template => toBuild.includes(template.path)); var paths = _.fromPairs(result.paths.map(function (p) { var relative = path.relative(viewsDir, p).replace(/\\/g, '/'); return [relative, p]; diff --git a/src/groups/data.js b/src/groups/data.js index 21fcc7911e..7d85624f34 100644 --- a/src/groups/data.js +++ b/src/groups/data.js @@ -88,6 +88,7 @@ function modifyGroup(group, fields) { escapeGroupData(group); group.userTitleEnabled = ([null, undefined].includes(group.userTitleEnabled)) ? 1 : group.userTitleEnabled; group.labelColor = validator.escape(String(group.labelColor || '#000000')); + group.textColor = validator.escape(String(group.textColor || '#ffffff')); group.icon = validator.escape(String(group.icon || '')); group.createtimeISO = utils.toISOString(group.createtime); group.private = ([null, undefined].includes(group.private)) ? 1 : group.private; diff --git a/src/groups/membership.js b/src/groups/membership.js index 09b8242202..910601a4db 100644 --- a/src/groups/membership.js +++ b/src/groups/membership.js @@ -162,8 +162,8 @@ module.exports = function (Groups) { Groups.isMembers = function (uids, groupName, callback) { var cachedData = {}; - function getFromCache() { - setImmediate(callback, null, uids.map(uid => cachedData[uid + ':' + groupName])); + function getFromCache(next) { + setImmediate(next, null, uids.map(uid => cachedData[uid + ':' + groupName])); } if (!groupName || !uids.length) { return setImmediate(callback, null, uids.map(() => false)); @@ -351,14 +351,14 @@ module.exports = function (Groups) { }; Groups.isInvited = function (uid, groupName, callback) { - if (uid <= 0) { + if (!(parseInt(uid, 10) > 0)) { return setImmediate(callback, null, false); } db.isSetMember('group:' + groupName + ':invited', uid, callback); }; Groups.isPending = function (uid, groupName, callback) { - if (uid <= 0) { + if (!(parseInt(uid, 10) > 0)) { return setImmediate(callback, null, false); } db.isSetMember('group:' + groupName + ':pending', uid, callback); diff --git a/src/groups/ownership.js b/src/groups/ownership.js index 45eb7c3383..527a1b7d0e 100644 --- a/src/groups/ownership.js +++ b/src/groups/ownership.js @@ -8,7 +8,7 @@ module.exports = function (Groups) { Groups.ownership = {}; Groups.ownership.isOwner = function (uid, groupName, callback) { - if (uid <= 0) { + if (!(parseInt(uid, 10) > 0)) { return setImmediate(callback, null, false); } db.isSetMember('group:' + groupName + ':owners', uid, callback); diff --git a/src/groups/posts.js b/src/groups/posts.js index c38ed43c8e..287a0a1683 100644 --- a/src/groups/posts.js +++ b/src/groups/posts.js @@ -55,7 +55,7 @@ module.exports = function (Groups) { db.getSortedSetRevRange('group:' + groupName + ':member:pids', 0, max - 1, next); }, function (pids, next) { - privileges.posts.filter('read', pids, uid, next); + privileges.posts.filter('topics:read', pids, uid, next); }, function (pids, next) { posts.getPostSummaryByPids(pids, uid, { stripTags: false }, next); diff --git a/src/groups/update.js b/src/groups/update.js index 2f1d5dcd65..11cd0b81d6 100644 --- a/src/groups/update.js +++ b/src/groups/update.js @@ -33,6 +33,7 @@ module.exports = function (Groups) { description: values.description || '', icon: values.icon || '', labelColor: values.labelColor || '#000000', + textColor: values.textColor || '#ffffff', }; if (values.hasOwnProperty('userTitle')) { diff --git a/src/image.js b/src/image.js index bc495bf9ef..b1c703ef5b 100644 --- a/src/image.js +++ b/src/image.js @@ -5,6 +5,7 @@ var fs = require('fs'); var path = require('path'); var crypto = require('crypto'); var async = require('async'); +var winston = require('winston'); var file = require('./file'); var plugins = require('./plugins'); @@ -90,6 +91,26 @@ image.size = function (path, callback) { } }; +image.stripEXIF = function (path, callback) { + async.waterfall([ + function (next) { + fs.readFile(path, next); + }, + function (buffer, next) { + const sharp = requireSharp(); + const sharpImage = sharp(buffer, { + failOnError: true, + }); + sharpImage.rotate().toFile(path, next); + }, + ], function (err) { + if (err) { + winston.error(err); + } + callback(); + }); +}; + image.checkDimensions = function (path, callback) { const meta = require('./meta'); image.size(path, function (err, result) { diff --git a/src/install.js b/src/install.js index be0de86dc7..fdb53c0e1e 100644 --- a/src/install.js +++ b/src/install.js @@ -132,7 +132,13 @@ function setupConfig(next) { var allQuestions = questions.main.concat(questions.optional).concat(redisQuestions).concat(mongoQuestions).concat(postgresQuestions); allQuestions.forEach(function (question) { - config[question.name] = install.values[question.name] || question.default || undefined; + if (install.values.hasOwnProperty(question.name)) { + config[question.name] = install.values[question.name]; + } else if (question.hasOwnProperty('default')) { + config[question.name] = question.default; + } else { + config[question.name] = undefined; + } }); setImmediate(next, null, config); } else { @@ -163,7 +169,6 @@ function completeConfigSetup(config, next) { if (nconf.get('package_manager')) { config.package_manager = nconf.get('package_manager'); } - nconf.overrides(config); async.waterfall([ function (next) { @@ -385,9 +390,20 @@ function giveGlobalPrivileges(next) { var privileges = require('./privileges'); var defaultPrivileges = [ 'chat', 'upload:post:image', 'signature', 'search:content', - 'search:users', 'search:tags', 'local:login', + 'search:users', 'search:tags', 'view:users', 'view:tags', 'view:groups', + 'local:login', ]; - privileges.global.give(defaultPrivileges, 'registered-users', next); + async.waterfall([ + function (next) { + privileges.global.give(defaultPrivileges, 'registered-users', next); + }, + function (next) { + privileges.global.give(['view:users', 'view:tags', 'view:groups'], 'guests', next); + }, + function (next) { + privileges.global.give(['view:users', 'view:tags', 'view:groups'], 'spiders', next); + }, + ], next); } function createCategories(next) { diff --git a/src/meta/configs.js b/src/meta/configs.js index 549fd17be2..cd945a7887 100644 --- a/src/meta/configs.js +++ b/src/meta/configs.js @@ -163,6 +163,7 @@ function processConfig(data, callback) { return next(err); } + data['brand:emailLogo'] = nconf.get('url') + path.join(nconf.get('upload_url'), 'system', 'site-logo-x50.png'); data['brand:emailLogo:height'] = size.height; data['brand:emailLogo:width'] = size.width; next(); diff --git a/src/meta/js.js b/src/meta/js.js index b59167718d..dd6ab20e6e 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -17,12 +17,13 @@ JS.scripts = { 'node_modules/promise-polyfill/dist/polyfill.js', 'node_modules/jquery/dist/jquery.js', 'node_modules/socket.io-client/dist/socket.io.js', + 'node_modules/textcomplete/dist/textcomplete.min.js', + 'node_modules/textcomplete.contenteditable/dist/textcomplete.codemirror.min.js', 'public/vendor/jquery/timeago/jquery.timeago.js', 'public/vendor/jquery/js/jquery.form.min.js', 'public/vendor/visibility/visibility.min.js', 'node_modules/bootstrap/dist/js/bootstrap.js', 'public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.min.js', - 'public/vendor/jquery/textcomplete/jquery.textcomplete.js', 'public/vendor/requirejs/require.js', 'public/src/require-config.js', 'public/vendor/bootbox/bootbox.js', diff --git a/src/meta/tags.js b/src/meta/tags.js index fe95bab6cf..adb0870360 100644 --- a/src/meta/tags.js +++ b/src/meta/tags.js @@ -104,7 +104,7 @@ Tags.parse = function (req, data, meta, link, callback) { } plugins.fireHook('filter:meta.getLinkTags', { req: req, data: data, links: defaultLinks }, next); }, - }, function (err, results) { + }, async function (err, results) { if (err) { return callback(err); } @@ -122,24 +122,14 @@ Tags.parse = function (req, data, meta, link, callback) { return tag; }); - addIfNotExists(meta, 'property', 'og:title', Meta.config.title || 'NodeBB'); + addSiteOGImage(meta); + addIfNotExists(meta, 'property', 'og:title', Meta.config.title || 'NodeBB'); var ogUrl = nconf.get('url') + (req.originalUrl !== '/' ? stripRelativePath(req.originalUrl) : ''); addIfNotExists(meta, 'property', 'og:url', ogUrl); - addIfNotExists(meta, 'name', 'description', Meta.config.description); addIfNotExists(meta, 'property', 'og:description', Meta.config.description); - var ogImage = stripRelativePath(Meta.config['og:image'] || Meta.config['brand:logo'] || ''); - if (ogImage && !ogImage.startsWith('http')) { - ogImage = nconf.get('url') + ogImage; - } - addIfNotExists(meta, 'property', 'og:image', ogImage); - if (ogImage) { - addIfNotExists(meta, 'property', 'og:image:width', Meta.config['og:image:width'] || 200); - addIfNotExists(meta, 'property', 'og:image:height', Meta.config['og:image:height'] || 200); - } - link = results.links.links.concat(link || []); callback(null, { @@ -173,3 +163,50 @@ function stripRelativePath(url) { return url; } + +function addSiteOGImage(meta) { + const key = Meta.config['og:image'] ? 'og:image' : 'brand:logo'; + var ogImage = stripRelativePath(Meta.config[key] || ''); + if (ogImage && !ogImage.startsWith('http')) { + ogImage = nconf.get('url') + ogImage; + } + + if (ogImage) { + meta.push({ + property: 'og:image', + content: ogImage, + noEscape: true, + }, { + property: 'og:image:url', + content: ogImage, + noEscape: true, + }); + + if (Meta.config[key + ':width'] && Meta.config[key + ':height']) { + meta.push({ + property: 'og:image:width', + content: String(Meta.config[key + ':width']), + }, { + property: 'og:image:height', + content: String(Meta.config[key + ':height']), + }); + } + } else { + // Push fallback logo + meta.push({ + property: 'og:image', + content: nconf.get('url') + '/assets/logo.png', + noEscape: true, + }, { + property: 'og:image:url', + content: nconf.get('url') + '/assets/logo.png', + noEscape: true, + }, { + property: 'og:image:width', + content: '128', + }, { + property: 'og:image:height', + content: '128', + }); + } +} diff --git a/src/middleware/header.js b/src/middleware/header.js index 65ec79d219..5bdab71f55 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -108,8 +108,8 @@ module.exports = function (middleware) { }, navigation: async.apply(navigation.get, req.uid), tags: async.apply(meta.tags.parse, req, data, res.locals.metaTags, res.locals.linkTags), - banned: async.apply(user.isBanned, req.uid), - banReason: async.apply(user.getBannedReason, req.uid), + banned: async.apply(user.bans.isBanned, req.uid), + banReason: async.apply(user.bans.getReason, req.uid), unreadData: async.apply(topics.getUnreadData, { uid: req.uid }), unreadChatCount: async.apply(messaging.getUnreadCount, req.uid), @@ -196,8 +196,6 @@ module.exports = function (middleware) { templateValues.defaultLang = meta.config.defaultLang || 'en-GB'; templateValues.userLang = res.locals.config.userLang; templateValues.languageDirection = results.languageDirection; - templateValues.privateUserInfo = meta.config.privateUserInfo; - templateValues.privateTagListing = meta.config.privateTagListing; templateValues.template = { name: res.locals.template }; templateValues.template[res.locals.template] = true; diff --git a/src/middleware/index.js b/src/middleware/index.js index 896ddbf76c..316d5a2ea6 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -13,8 +13,8 @@ var plugins = require('../plugins'); var meta = require('../meta'); var user = require('../user'); var groups = require('../groups'); - var analytics = require('../analytics'); +var privileges = require('../privileges'); var controllers = { api: require('./../controllers/api'), @@ -112,11 +112,12 @@ middleware.routeTouchIcon = function routeTouchIcon(req, res) { }; middleware.privateTagListing = function privateTagListing(req, res, next) { - if (!req.loggedIn && meta.config.privateTagListing) { + privileges.global.can('view:tags', req.uid, function (err, canView) { + if (err || canView) { + return next(err); + } controllers.helpers.notAllowed(req, res); - } else { - next(); - } + }); }; middleware.exposeGroupName = function exposeGroupName(req, res, next) { @@ -216,3 +217,20 @@ middleware.trimUploadTimestamps = function trimUploadTimestamps(req, res, next) next(); }; + +middleware.validateAuth = function validateAuth(req, res, next) { + plugins.fireHook('static:auth.validate', { + user: res.locals.user, + strategy: res.locals.strategy, + }, function (err) { + if (err) { + return req.session.regenerate(function () { + req.uid = 0; + req.loggedIn = false; + next(err); + }); + } + + next(); + }); +}; diff --git a/src/middleware/user.js b/src/middleware/user.js index 366e4fdc9d..07e65cec4b 100644 --- a/src/middleware/user.js +++ b/src/middleware/user.js @@ -2,6 +2,7 @@ var async = require('async'); var nconf = require('nconf'); +var winston = require('winston'); var meta = require('../meta'); var user = require('../user'); @@ -87,11 +88,29 @@ module.exports = function (middleware) { } middleware.checkGlobalPrivacySettings = function checkGlobalPrivacySettings(req, res, next) { - if (!req.loggedIn && meta.config.privateUserInfo) { - return middleware.authenticate(req, res, next); + winston.warn('[middleware], checkGlobalPrivacySettings deprecated, use canViewUsers or canViewGroups'); + middleware.canViewUsers(req, res, next); + }; + + middleware.canViewUsers = function canViewUsers(req, res, next) { + if (parseInt(res.locals.uid, 10) === req.uid) { + return next(); } + privileges.global.can('view:users', req.uid, function (err, canView) { + if (err || canView) { + return next(err); + } + controllers.helpers.notAllowed(req, res); + }); + }; - next(); + middleware.canViewGroups = function canViewGroups(req, res, next) { + privileges.global.can('view:groups', req.uid, function (err, canView) { + if (err || canView) { + return next(err); + } + controllers.helpers.notAllowed(req, res); + }); }; middleware.checkAccountPermissions = function checkAccountPermissions(req, res, next) { @@ -213,7 +232,7 @@ module.exports = function (middleware) { } returnTo = returnTo.replace(/^\/api/, ''); - req.session.returnTo = nconf.get('relative_path') + returnTo; + req.session.returnTo = returnTo; req.session.forceLogin = 1; if (res.locals.isAPI) { res.status(401).json({}); diff --git a/src/notifications.js b/src/notifications.js index 2f0f5ab916..b2078d2928 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -507,6 +507,7 @@ Notifications.merge = function (notifications, callback) { 'notifications:user_flagged_post_in', 'notifications:user_flagged_user', 'new_register', + 'post-queue', ]; var isolated; var differentiators; diff --git a/src/pagination.js b/src/pagination.js index 83b2acf55c..8a6d0bed70 100644 --- a/src/pagination.js +++ b/src/pagination.js @@ -10,6 +10,8 @@ pagination.create = function (currentPage, pageCount, queryObj) { return { prev: { page: 1, active: currentPage > 1 }, next: { page: 1, active: currentPage < pageCount }, + first: { page: 1, active: currentPage === 1 }, + last: { page: 1, active: currentPage === pageCount }, rel: [], pages: [], currentPage: 1, @@ -59,6 +61,11 @@ pagination.create = function (currentPage, pageCount, queryObj) { queryObj.page = next; data.next = { page: next, active: currentPage < pageCount, qs: qs.stringify(queryObj) }; + queryObj.page = 1; + data.first = { page: 1, active: currentPage === 1, qs: qs.stringify(queryObj) }; + queryObj.page = pageCount; + data.last = { page: pageCount, active: currentPage === pageCount, qs: qs.stringify(queryObj) }; + if (currentPage < pageCount) { data.rel.push({ rel: 'next', diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js index 905694093f..5c582dbad2 100644 --- a/src/plugins/hooks.js +++ b/src/plugins/hooks.js @@ -99,7 +99,7 @@ module.exports = function (Plugins) { } var hookList = Plugins.loadedHooks[hook]; var hookType = hook.split(':')[0]; - winston.verbose('[plugins/fireHook]', hook); + winston.verbose('[plugins/fireHook] ' + hook); switch (hookType) { case 'filter': fireFilterHook(hook, hookList, params, done); diff --git a/src/posts/index.js b/src/posts/index.js index 2c514ed108..5d40d0aecb 100644 --- a/src/posts/index.js +++ b/src/posts/index.js @@ -74,7 +74,7 @@ Posts.getPostSummariesFromSet = function (set, uid, start, stop, callback) { db.getSortedSetRevRange(set, start, stop, next); }, function (pids, next) { - privileges.posts.filter('read', pids, uid, next); + privileges.posts.filter('topics:read', pids, uid, next); }, function (pids, next) { Posts.getPostSummaryByPids(pids, uid, { stripTags: false }, next); diff --git a/src/posts/queue.js b/src/posts/queue.js index d2203fdc68..1a3a0dadd8 100644 --- a/src/posts/queue.js +++ b/src/posts/queue.js @@ -215,7 +215,7 @@ module.exports = function (Posts) { }, function (data, next) { if (!data) { - return callback(); + return callback(null, null); } try { data.data = JSON.parse(data.data); diff --git a/src/posts/recent.js b/src/posts/recent.js index 22df0c5895..879f537034 100644 --- a/src/posts/recent.js +++ b/src/posts/recent.js @@ -27,7 +27,7 @@ module.exports = function (Posts) { db.getSortedSetRevRangeByScore('posts:pid', start, count, '+inf', min, next); }, function (pids, next) { - privileges.posts.filter('read', pids, uid, next); + privileges.posts.filter('topics:read', pids, uid, next); }, function (pids, next) { Posts.getPostSummaryByPids(pids, uid, { stripTags: true }, next); diff --git a/src/posts/uploads.js b/src/posts/uploads.js index 8af6dd10c9..83aefb45e2 100644 --- a/src/posts/uploads.js +++ b/src/posts/uploads.js @@ -1,17 +1,21 @@ 'use strict'; var async = require('async'); +var nconf = require('nconf'); var crypto = require('crypto'); var fs = require('fs'); var path = require('path'); +var util = require('util'); +var winston = require('winston'); var db = require('../database'); +const image = require('../image'); module.exports = function (Posts) { Posts.uploads = {}; const md5 = filename => crypto.createHash('md5').update(filename).digest('hex'); - const pathPrefix = path.join(__dirname, '../../public/uploads/files'); + const pathPrefix = path.join(nconf.get('upload_path'), 'files'); const searchRegex = /\/assets\/uploads\/files\/([^\s")]+\.?[\w]*)/g; Posts.uploads.sync = function (pid, callback) { @@ -52,6 +56,16 @@ module.exports = function (Posts) { db.getSortedSetRange('post:' + pid + ':uploads', 0, -1, callback); }; + Posts.uploads.listWithSizes = async function (pid) { + const paths = await Posts.async.uploads.list(pid); + const sizes = await db.async.getObjects(paths.map(path => 'upload:' + md5(path))) || []; + + return sizes.map((sizeObj, idx) => ({ + ...sizeObj, + name: paths[idx], + })); + }; + Posts.uploads.isOrphan = function (filePath, callback) { // Returns bool indicating whether a file is still CURRENTLY included in any posts db.sortedSetCard('upload:' + md5(filePath) + ':pids', function (err, length) { @@ -91,6 +105,9 @@ module.exports = function (Posts) { let methods = [async.apply(db.sortedSetAdd.bind(db), 'post:' + pid + ':uploads', scores, filePaths)]; methods = methods.concat(filePaths.map(path => async.apply(db.sortedSetAdd.bind(db), 'upload:' + md5(path) + ':pids', now, pid))); + methods = methods.concat(async function () { + await Posts.uploads.saveSize(filePaths); + }); async.parallel(methods, function (err) { // Strictly return only err callback(err); @@ -112,4 +129,35 @@ module.exports = function (Posts) { callback(err); }); }; + + Posts.uploads.saveSize = async (filePaths) => { + const getSize = util.promisify(image.size); + const sizes = await Promise.all(filePaths.map(async function (fileName) { + try { + return await getSize(path.join(pathPrefix, fileName)); + } catch (e) { + // Error returned by getSize, do not save size in database + return null; + } + })); + + const methods = filePaths.map((filePath, idx) => { + if (!sizes[idx]) { + return null; + } + + winston.verbose('[posts/uploads/' + filePath + '] Saving size'); + return async.apply(db.setObject, 'upload:' + md5(filePath), { + width: sizes[idx].width, + height: sizes[idx].height, + }); + }).filter(Boolean); + async.parallel(methods, function (err) { + if (err) { + winston.error('[posts/uploads] Error while saving post upload sizes: ', err.message); + } else { + winston.verbose('[posts/uploads] Finished saving post upload sizes.'); + } + }); + }; }; diff --git a/src/posts/user.js b/src/posts/user.js index 5af1f8a094..13a4ac9c53 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -53,6 +53,7 @@ module.exports = function (Posts) { name: group.name, slug: group.slug, labelColor: group.labelColor, + textColor: group.textColor, icon: group.icon, userTitle: group.userTitle, }; diff --git a/src/prestart.js b/src/prestart.js index f4b661f0bb..49f6336499 100644 --- a/src/prestart.js +++ b/src/prestart.js @@ -13,40 +13,7 @@ function setupWinston() { return; } - // allow winton.error to log error objects properly - // https://github.com/NodeBB/NodeBB/issues/6848 - const winstonError = winston.error; - winston.error = function (msg, error) { - if (msg instanceof Error) { - winstonError(msg); - } else if (error instanceof Error) { - msg = msg + '\n' + error.stack; - winstonError(msg); - } else { - winstonError.apply(null, arguments); - } - }; - - - // https://github.com/winstonjs/winston/issues/1338 - // error objects are not displayed properly - const enumerateErrorFormat = winston.format((info) => { - if (info.message instanceof Error) { - info.message = Object.assign({ - message: `${info.message.message}\n${info.message.stack}`, - }, info.message); - } - - if (info instanceof Error) { - return Object.assign({ - message: `${info.message}\n${info.stack}`, - }, info); - } - - return info; - }); var formats = []; - formats.push(enumerateErrorFormat()); if (nconf.get('log-colorize') !== 'false') { formats.push(winston.format.colorize()); } @@ -102,6 +69,7 @@ function loadConfig(configFile) { nconf.set('base_templates_path', path.join(nconf.get('themes_path'), 'nodebb-theme-persona/templates')); nconf.set('upload_path', path.resolve(nconf.get('base_dir'), nconf.get('upload_path'))); + nconf.set('upload_url', '/assets/uploads'); if (nconf.get('url')) { nconf.set('url_parsed', url.parse(nconf.get('url'))); diff --git a/src/privileges/categories.js b/src/privileges/categories.js index 9e2d580afc..9eda36d211 100644 --- a/src/privileges/categories.js +++ b/src/privileges/categories.js @@ -34,7 +34,10 @@ module.exports = function (privileges) { }, function (payload, next) { // This is a hack because I can't do {labels.users.length} to echo the count in templates.js - payload.columnCount = payload.labels.users.length + 2; + payload.columnCountUser = payload.labels.users.length + 2; + payload.columnCountUserOther = payload.labels.users.length - privileges.privilegeLabels.length; + payload.columnCountGroup = payload.labels.groups.length + 2; + payload.columnCountGroupOther = payload.labels.groups.length - privileges.privilegeLabels.length; next(null, payload); }, ], callback); diff --git a/src/privileges/global.js b/src/privileges/global.js index 5d0cb88213..275aa73275 100644 --- a/src/privileges/global.js +++ b/src/privileges/global.js @@ -21,7 +21,11 @@ module.exports = function (privileges) { { name: '[[admin/manage/privileges:search-content]]' }, { name: '[[admin/manage/privileges:search-users]]' }, { name: '[[admin/manage/privileges:search-tags]]' }, + { name: '[[admin/manage/privileges:view-users]]' }, + { name: '[[admin/manage/privileges:view-tags]]' }, + { name: '[[admin/manage/privileges:view-groups]]' }, { name: '[[admin/manage/privileges:allow-local-login]]' }, + { name: '[[admin/manage/privileges:allow-group-creation]]' }, ]; privileges.global.userPrivilegeList = [ @@ -33,7 +37,11 @@ module.exports = function (privileges) { 'search:content', 'search:users', 'search:tags', + 'view:users', + 'view:tags', + 'view:groups', 'local:login', + 'group:create', ]; privileges.global.groupPrivilegeList = privileges.global.userPrivilegeList.map(function (privilege) { @@ -92,6 +100,9 @@ module.exports = function (privileges) { 'search:content': privData['search:content'] || isAdminOrMod, 'search:users': privData['search:users'] || isAdminOrMod, 'search:tags': privData['search:tags'] || isAdminOrMod, + 'view:users': privData['view:users'] || isAdminOrMod, + 'view:tags': privData['view:tags'] || isAdminOrMod, + 'view:groups': privData['view:groups'] || isAdminOrMod, }, next); }, ], callback); diff --git a/src/privileges/posts.js b/src/privileges/posts.js index a28a12378b..a8983c3234 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -264,6 +264,14 @@ module.exports = function (privileges) { edit: async.apply(privileges.posts.can, 'posts:edit', pid, uid), }, next); }, + (result, next) => { + Object.assign(result, { + pid: parseInt(pid, 10), + uid: uid, + }); + + plugins.fireHook('filter:privileges.posts.edit', result, next); + }, function (result, next) { next(null, { flag: result.owner && result.edit, message: '[[error:no-privileges]]' }); }, diff --git a/src/routes/accounts.js b/src/routes/accounts.js index e5b6198ed1..f7dbbbd649 100644 --- a/src/routes/accounts.js +++ b/src/routes/accounts.js @@ -4,8 +4,8 @@ var helpers = require('./helpers'); var setupPageRoute = helpers.setupPageRoute; module.exports = function (app, middleware, controllers) { - var middlewares = [middleware.checkGlobalPrivacySettings, middleware.exposeUid]; - var accountMiddlewares = [middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions, middleware.exposeUid]; + var middlewares = [middleware.exposeUid, middleware.canViewUsers]; + var accountMiddlewares = [middleware.exposeUid, middleware.canViewUsers, middleware.checkAccountPermissions]; setupPageRoute(app, '/me/*', middleware, [], middleware.redirectMeToUserslug); setupPageRoute(app, '/uid/:uid*', middleware, [], middleware.redirectUidToUserslug); diff --git a/src/routes/api.js b/src/routes/api.js index 1fc95c6764..76aad99fe8 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -16,10 +16,10 @@ module.exports = function (app, middleware, controllers) { } }, controllers.api.getConfig); - router.get('/me', middleware.checkGlobalPrivacySettings, controllers.user.getCurrentUser); - router.get('/user/uid/:uid', middleware.checkGlobalPrivacySettings, controllers.user.getUserByUID); - router.get('/user/username/:username', middleware.checkGlobalPrivacySettings, controllers.user.getUserByUsername); - router.get('/user/email/:email', middleware.checkGlobalPrivacySettings, controllers.user.getUserByEmail); + router.get('/me', controllers.user.getCurrentUser); + router.get('/user/uid/:uid', middleware.canViewUsers, controllers.user.getUserByUID); + router.get('/user/username/:username', middleware.canViewUsers, controllers.user.getUserByUsername); + router.get('/user/email/:email', middleware.canViewUsers, controllers.user.getUserByEmail); router.get('/user/uid/:userslug/export/posts', middleware.checkAccountPermissions, middleware.exposeUid, controllers.user.exportPosts); router.get('/user/uid/:userslug/export/uploads', middleware.checkAccountPermissions, middleware.exposeUid, controllers.user.exportUploads); @@ -40,8 +40,8 @@ module.exports = function (app, middleware, controllers) { var middlewares = [middleware.maintenanceMode, multipartMiddleware, middleware.validateFiles, middleware.applyCSRF]; router.post('/post/upload', middlewares, uploadsController.uploadPost); router.post('/topic/thumb/upload', middlewares, uploadsController.uploadThumb); - router.post('/user/:userslug/uploadpicture', middlewares.concat([middleware.authenticate, middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions]), controllers.accounts.edit.uploadPicture); + router.post('/user/:userslug/uploadpicture', middlewares.concat([middleware.exposeUid, middleware.authenticate, middleware.canViewUsers, middleware.checkAccountPermissions]), controllers.accounts.edit.uploadPicture); - router.post('/user/:userslug/uploadcover', middlewares.concat([middleware.authenticate, middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions]), controllers.accounts.edit.uploadCoverPicture); + router.post('/user/:userslug/uploadcover', middlewares.concat([middleware.exposeUid, middleware.authenticate, middleware.canViewUsers, middleware.checkAccountPermissions]), controllers.accounts.edit.uploadCoverPicture); router.post('/groups/uploadpicture', middlewares.concat([middleware.authenticate]), controllers.groups.uploadCover); }; diff --git a/src/routes/authentication.js b/src/routes/authentication.js index 81af7fe550..11e8c03432 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -3,10 +3,10 @@ var async = require('async'); var passport = require('passport'); var passportLocal = require('passport-local').Strategy; -var nconf = require('nconf'); var winston = require('winston'); var controllers = require('../controllers'); +var helpers = require('../controllers/helpers'); var plugins = require('../plugins'); var loginStrategies = []; @@ -88,10 +88,36 @@ Auth.reloadRoutes = function (router, callback) { // passport seems to remove `req.session.returnTo` after it redirects req.session.registration.returnTo = req.session.returnTo; next(); - }, passport.authenticate(strategy.name, { - successReturnToOrRedirect: nconf.get('relative_path') + (strategy.successUrl !== undefined ? strategy.successUrl : '/'), - failureRedirect: nconf.get('relative_path') + (strategy.failureUrl !== undefined ? strategy.failureUrl : '/login'), - })); + }, function (req, res, next) { + passport.authenticate(strategy.name, function (err, user) { + if (err) { + delete req.session.registration; + return next(err); + } + + if (!user) { + delete req.session.registration; + return helpers.redirect(res, strategy.failureUrl !== undefined ? strategy.failureUrl : '/login'); + } + + res.locals.user = user; + res.locals.strategy = strategy; + next(); + })(req, res, next); + }, + Auth.middleware.validateAuth, + (req, res, next) => { + async.waterfall([ + async.apply(req.login.bind(req), res.locals.user), + async.apply(controllers.authentication.onSuccessfulLogin, req, req.uid), + ], function (err) { + if (err) { + return next(err); + } + + helpers.redirect(res, strategy.successUrl !== undefined ? strategy.successUrl : '/'); + }); + }); }); router.post('/register', Auth.middleware.applyCSRF, Auth.middleware.applyBlacklist, controllers.authentication.register); diff --git a/src/routes/index.js b/src/routes/index.js index 40abf06e42..b6809d1e54 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -46,6 +46,7 @@ function modRoutes(app, middleware, controllers) { function globalModRoutes(app, middleware, controllers) { setupPageRoute(app, '/ip-blacklist', middleware, [], controllers.globalMods.ipBlacklist); + setupPageRoute(app, '/registration-queue', middleware, [], controllers.globalMods.registrationQueue); } function topicRoutes(app, middleware, controllers) { @@ -76,13 +77,13 @@ function categoryRoutes(app, middleware, controllers) { } function userRoutes(app, middleware, controllers) { - var middlewares = [middleware.checkGlobalPrivacySettings]; + var middlewares = [middleware.canViewUsers]; setupPageRoute(app, '/users', middleware, middlewares, controllers.users.index); } function groupRoutes(app, middleware, controllers) { - var middlewares = [middleware.checkGlobalPrivacySettings]; + var middlewares = [middleware.canViewGroups]; setupPageRoute(app, '/groups', middleware, middlewares, controllers.groups.list); setupPageRoute(app, '/groups/:slug', middleware, middlewares, controllers.groups.details); @@ -94,12 +95,11 @@ module.exports = function (app, middleware, callback) { router.render = function () { app.render.apply(app, arguments); }; - var relativePath = nconf.get('relative_path'); var ensureLoggedIn = require('connect-ensure-login'); - app.all(relativePath + '(/+api|/+api/*?)', middleware.prepareAPI); - app.all(relativePath + '(/+api/admin|/+api/admin/*?)', middleware.isAdmin); - app.all(relativePath + '(/+admin|/+admin/*?)', ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login?local=1'), middleware.applyCSRF, middleware.isAdmin); + router.all('(/+api|/+api/*?)', middleware.prepareAPI); + router.all('(/+api/admin|/+api/admin/*?)', middleware.isAdmin); + router.all('(/+admin|/+admin/*?)', ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login?local=1'), middleware.applyCSRF, middleware.isAdmin); app.use(middleware.stripLeadingSlashes); diff --git a/src/search.js b/src/search.js index 321c8f4619..e004d4cfef 100644 --- a/src/search.js +++ b/src/search.js @@ -90,7 +90,7 @@ function searchInContent(data, callback) { function (mainPids, next) { pids = mainPids.concat(pids).filter(Boolean); - privileges.posts.filter('read', pids, data.uid, next); + privileges.posts.filter('topics:read', pids, data.uid, next); }, function (pids, next) { filterAndSort(pids, data, next); diff --git a/src/sitemap.js b/src/sitemap.js index 663f7da08e..192a1f49fe 100644 --- a/src/sitemap.js +++ b/src/sitemap.js @@ -137,7 +137,7 @@ sitemap.getTopicPage = function (page, callback) { db.getSortedSetRevRange('topics:recent', min, max, next); }, function (tids, next) { - privileges.topics.filterTids('read', tids, 0, next); + privileges.topics.filterTids('topics:read', tids, 0, next); }, function (tids, next) { topics.getTopicsFields(tids, ['tid', 'title', 'slug', 'lastposttime'], next); diff --git a/src/social.js b/src/social.js index 9c4ae6e6b3..ca177ce7ad 100644 --- a/src/social.js +++ b/src/social.js @@ -24,11 +24,6 @@ social.getPostSharing = function (callback) { name: 'Twitter', class: 'fa-twitter', }, - { - id: 'google', - name: 'Google+', - class: 'fa-google-plus', - }, ]; async.waterfall([ diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js index 76a3ca6476..a8c0537e20 100644 --- a/src/socket.io/admin.js +++ b/src/socket.io/admin.js @@ -296,8 +296,9 @@ SocketAdmin.email.test = function (socket, data, callback) { showUnsubscribe: true, }, next); }, - ]); + ], callback); break; + default: emailer.send(data.template, socket.uid, payload, callback); break; diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index 3d9f0346fd..d585318f17 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -130,7 +130,7 @@ function copyPrivilegesToChildrenRecursive(parentCid, category, callback) { } Categories.copySettingsFrom = function (socket, data, callback) { - categories.copySettingsFrom(data.fromCid, data.toCid, true, callback); + categories.copySettingsFrom(data.fromCid, data.toCid, data.copyParent, callback); }; Categories.copyPrivilegesFrom = function (socket, data, callback) { diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index de27e1f07d..02ade56a89 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -1,7 +1,6 @@ 'use strict'; var async = require('async'); -var validator = require('validator'); var winston = require('winston'); var db = require('../../database'); @@ -127,6 +126,25 @@ User.sendPasswordResetEmail = function (socket, uids, callback) { }, callback); }; +User.forcePasswordReset = function (socket, uids, callback) { + if (!Array.isArray(uids)) { + return callback(new Error('[[error:invalid-data]]')); + } + + uids = uids.filter(uid => parseInt(uid, 10)); + + async.each(uids, function (uid, next) { + async.waterfall([ + function (next) { + user.setUserField(uid, 'passwordExpiry', Date.now(), next); + }, + function (next) { + user.auth.revokeAllSessions(uid, next); + }, + ], next); + }, callback); +}; + User.deleteUsers = function (socket, uids, callback) { deleteUsers(socket, uids, function (uid, next) { user.deleteAccount(uid, next); @@ -210,7 +228,7 @@ User.search = function (socket, data, callback) { function (userInfo, next) { searchData.users.forEach(function (user, index) { if (user && userInfo[index]) { - user.email = validator.escape(String(userInfo[index].email || '')); + user.email = userInfo[index].email; user.flags = userInfo[index].flags || 0; user.lastonlineISO = userInfo[index].lastonlineISO; user.joindateISO = userInfo[index].joindateISO; @@ -221,44 +239,6 @@ User.search = function (socket, data, callback) { ], callback); }; -User.deleteInvitation = function (socket, data, callback) { - user.deleteInvitation(data.invitedBy, data.email, callback); -}; - -User.acceptRegistration = function (socket, data, callback) { - async.waterfall([ - function (next) { - user.acceptRegistration(data.username, next); - }, - function (uid, next) { - events.log({ - type: 'registration-approved', - uid: socket.uid, - ip: socket.ip, - targetUid: uid, - }); - next(null, uid); - }, - ], callback); -}; - -User.rejectRegistration = function (socket, data, callback) { - async.waterfall([ - function (next) { - user.rejectRegistration(data.username, next); - }, - function (next) { - events.log({ - type: 'registration-rejected', - uid: socket.uid, - ip: socket.ip, - username: data.username, - }); - next(); - }, - ], callback); -}; - User.restartJobs = function (socket, data, callback) { user.startJobs(callback); }; diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index e4f7a0a985..a92fd4d5f5 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -8,6 +8,7 @@ var user = require('../user'); var utils = require('../utils'); var groupsController = require('../controllers/groups'); var events = require('../events'); +var privileges = require('../privileges'); var SocketGroups = module.exports; @@ -238,14 +239,22 @@ SocketGroups.kick = isOwner(function (socket, data, callback) { SocketGroups.create = function (socket, data, callback) { if (!socket.uid) { return callback(new Error('[[error:no-privileges]]')); - } else if (!meta.config.allowGroupCreation) { - return callback(new Error('[[error:group-creation-disabled]]')); } else if (groups.isPrivilegeGroup(data.name)) { return callback(new Error('[[error:invalid-group-name]]')); } - data.ownerUid = socket.uid; - groups.create(data, callback); + async.waterfall([ + function (next) { + privileges.global.can('group:create', socket.uid, next); + }, + function (canCreate, next) { + if (!canCreate) { + return next(new Error('[[error:no-privileges]]')); + } + data.ownerUid = socket.uid; + groups.create(data, next); + }, + ], callback); }; SocketGroups.delete = isOwner(function (socket, data, callback) { @@ -316,13 +325,9 @@ SocketGroups.cover.update = function (socket, data, callback) { async.waterfall([ function (next) { - groups.ownership.isOwner(socket.uid, data.groupName, next); + canModifyGroup(socket.uid, data.groupName, next); }, - function (isOwner, next) { - if (!isOwner) { - return next(new Error('[[error:no-privileges]]')); - } - + function (next) { groups.updateCover(socket.uid, data, next); }, ], callback); @@ -335,14 +340,27 @@ SocketGroups.cover.remove = function (socket, data, callback) { async.waterfall([ function (next) { - groups.ownership.isOwner(socket.uid, data.groupName, next); + canModifyGroup(socket.uid, data.groupName, next); }, - function (isOwner, next) { - if (!isOwner) { - return next(new Error('[[error:no-privileges]]')); - } - + function (next) { groups.removeCover(data, next); }, ], callback); }; + +function canModifyGroup(uid, groupName, callback) { + async.waterfall([ + function (next) { + async.parallel({ + isOwner: async.apply(groups.ownership.isOwner, uid, groupName), + isAdminOrGlobalMod: async.apply(user.isAdminOrGlobalMod, uid), + }, next); + }, + function (results, next) { + if (!results.isOwner && !results.isAdminOrGlobalMod) { + return next(new Error('[[error:no-privileges]]')); + } + next(); + }, + ], callback); +} diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js index 9a54d87f99..3e8d947aea 100644 --- a/src/socket.io/helpers.js +++ b/src/socket.io/helpers.js @@ -30,7 +30,7 @@ SocketHelpers.notifyNew = function (uid, type, result) { }, function (uids, next) { uids = uids.filter(toUid => parseInt(toUid, 10) !== uid); - privileges.topics.filterUids('read', tid, uids, next); + privileges.topics.filterUids('topics:read', tid, uids, next); }, function (uids, next) { watchStateUids = uids; @@ -100,7 +100,7 @@ SocketHelpers.sendNotificationToPostOwner = function (pid, fromuid, command, not function (_postData, next) { postData = _postData; async.parallel({ - canRead: async.apply(privileges.posts.can, 'read', pid, postData.uid), + canRead: async.apply(privileges.posts.can, 'topics:read', pid, postData.uid), isIgnoring: async.apply(topics.isIgnoring, [postData.tid], postData.uid), }, next); }, diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js index 398bf249f5..e9cd3f00e4 100644 --- a/src/socket.io/meta.js +++ b/src/socket.io/meta.js @@ -62,7 +62,12 @@ function leaveCurrentRoom(socket) { SocketMeta.getServerTime = function (socket, data, callback) { // Returns server time in milliseconds - callback(null, Date.now()); + const now = new Date(); + + callback(null, { + timestamp: now.getTime(), + offset: now.getTimezoneOffset(), + }); }; module.exports = SocketMeta; diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 923ed43280..913d7bd0c5 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -75,7 +75,7 @@ function postReply(socket, data, callback) { SocketPosts.getRawPost = function (socket, pid, callback) { async.waterfall([ function (next) { - privileges.posts.can('read', pid, socket.uid, next); + privileges.posts.can('topics:read', pid, socket.uid, next); }, function (canRead, next) { if (!canRead) { @@ -112,7 +112,7 @@ SocketPosts.getTimestampByIndex = function (socket, data, callback) { if (!pid) { return callback(null, 0); } - privileges.posts.can('read', pid, socket.uid, next); + privileges.posts.can('topics:read', pid, socket.uid, next); }, function (canRead, next) { if (!canRead) { diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index aa8bc07e25..9bf60d00de 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -65,7 +65,7 @@ function postTopic(socket, data, callback) { SocketTopics.postcount = function (socket, tid, callback) { async.waterfall([ function (next) { - privileges.topics.can('read', tid, socket.uid, next); + privileges.topics.can('topics:read', tid, socket.uid, next); }, function (canRead, next) { if (!canRead) { diff --git a/src/socket.io/user.js b/src/socket.io/user.js index db1c49d48f..83274f66df 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -1,7 +1,6 @@ 'use strict'; var async = require('async'); -var winston = require('winston'); var user = require('../user'); var topics = require('../topics'); @@ -22,6 +21,7 @@ require('./user/search')(SocketUser); require('./user/status')(SocketUser); require('./user/picture')(SocketUser); require('./user/ban')(SocketUser); +require('./user/registration')(SocketUser); SocketUser.exists = function (socket, data, callback) { if (!data || !data.username) { @@ -101,17 +101,17 @@ SocketUser.reset.send = function (socket, email, callback) { } user.reset.send(email, function (err) { - if (err) { - switch (err.message) { - case '[[error:invalid-email]]': - winston.warn('[user/reset] Invalid email attempt: ' + email + ' by IP ' + socket.ip + (socket.uid ? ' (uid: ' + socket.uid + ')' : '')); - err = null; - break; - - case '[[error:reset-rate-limited]]': - err = null; - break; - } + events.log({ + type: 'password-reset', + text: err ? err.message : '[[success:success]]', + ip: socket.ip, + uid: socket.uid, + email: email, + }); + + const internalErrors = ['[[error:invalid-email]]', '[[error:reset-rate-limited]]']; + if (err && internalErrors.includes(err.message)) { + err = null; } setTimeout(callback.bind(err), 2500); @@ -219,7 +219,7 @@ function toggleFollow(method, uid, theiruid, callback) { } SocketUser.saveSettings = function (socket, data, callback) { - if (!socket.uid || !data) { + if (!socket.uid || !data || !data.settings) { return callback(new Error('[[error:invalid-data]]')); } @@ -337,7 +337,11 @@ SocketUser.setModerationNote = function (socket, data, callback) { if (!socket.uid || !data || !data.uid || !data.note) { return callback(new Error('[[error:invalid-data]]')); } - + const noteData = { + uid: socket.uid, + note: data.note, + timestamp: Date.now(), + }; async.waterfall([ function (next) { privileges.users.canEdit(socket.uid, data.uid, next); @@ -354,12 +358,10 @@ SocketUser.setModerationNote = function (socket, data, callback) { return next(new Error('[[error:no-privileges]]')); } - var note = { - uid: socket.uid, - note: data.note, - timestamp: Date.now(), - }; - db.sortedSetAdd('uid:' + data.uid + ':moderation:notes', note.timestamp, JSON.stringify(note), next); + db.sortedSetAdd('uid:' + data.uid + ':moderation:notes', noteData.timestamp, noteData.timestamp, next); + }, + function (next) { + db.setObject('uid:' + data.uid + ':moderation:note:' + noteData.timestamp, noteData, next); }, ], callback); }; diff --git a/src/socket.io/user/ban.js b/src/socket.io/user/ban.js index 1084a82625..d84c672442 100644 --- a/src/socket.io/user/ban.js +++ b/src/socket.io/user/ban.js @@ -55,7 +55,7 @@ module.exports = function (SocketUser) { toggleBan(socket.uid, uids, function (uid, next) { async.waterfall([ function (next) { - user.unban(uid, next); + user.bans.unban(uid, next); }, function (next) { events.log({ @@ -124,7 +124,7 @@ module.exports = function (SocketUser) { }); }, function (next) { - user.ban(uid, until, reason, next); + user.bans.ban(uid, until, reason, next); }, function (banData, next) { db.setObjectField('uid:' + uid + ':ban:' + banData.timestamp, 'fromUid', callerUid, next); diff --git a/src/socket.io/user/registration.js b/src/socket.io/user/registration.js new file mode 100644 index 0000000000..aee1382eb2 --- /dev/null +++ b/src/socket.io/user/registration.js @@ -0,0 +1,70 @@ +'use strict'; + +var async = require('async'); +var user = require('../../user'); +var events = require('../../events'); + +module.exports = function (SocketUser) { + SocketUser.acceptRegistration = function (socket, data, callback) { + async.waterfall([ + function (next) { + user.isAdminOrGlobalMod(socket.uid, next); + }, + function (isAdminOrGlobalMod, next) { + if (!isAdminOrGlobalMod) { + return next(new Error('[[error:no-privileges]]')); + } + + user.acceptRegistration(data.username, next); + }, + function (uid, next) { + events.log({ + type: 'registration-approved', + uid: socket.uid, + ip: socket.ip, + targetUid: uid, + }); + next(null, uid); + }, + ], callback); + }; + + SocketUser.rejectRegistration = function (socket, data, callback) { + async.waterfall([ + function (next) { + user.isAdminOrGlobalMod(socket.uid, next); + }, + function (isAdminOrGlobalMod, next) { + if (!isAdminOrGlobalMod) { + return next(new Error('[[error:no-privileges]]')); + } + + user.rejectRegistration(data.username, next); + }, + function (next) { + events.log({ + type: 'registration-rejected', + uid: socket.uid, + ip: socket.ip, + username: data.username, + }); + next(); + }, + ], callback); + }; + + SocketUser.deleteInvitation = function (socket, data, callback) { + async.waterfall([ + function (next) { + user.isAdminOrGlobalMod(socket.uid, next); + }, + function (isAdminOrGlobalMod, next) { + if (!isAdminOrGlobalMod) { + return next(new Error('[[error:no-privileges]]')); + } + + user.deleteInvitation(data.invitedBy, data.email, next); + }, + ], callback); + }; +}; diff --git a/src/start.js b/src/start.js index 53893d44b8..b2b4ceebc9 100644 --- a/src/start.js +++ b/src/start.js @@ -99,7 +99,6 @@ function setupConfigs() { nconf.set('use_port', !!urlObject.port); nconf.set('relative_path', relativePath); nconf.set('port', nconf.get('PORT') || nconf.get('port') || urlObject.port || (nconf.get('PORT_ENV_VAR') ? nconf.get(nconf.get('PORT_ENV_VAR')) : false) || 4567); - nconf.set('upload_url', '/assets/uploads'); } function printStartupInfo() { diff --git a/src/topics/create.js b/src/topics/create.js index ffb2077cb8..60c2ea78e4 100644 --- a/src/topics/create.js +++ b/src/topics/create.js @@ -85,7 +85,7 @@ module.exports = function (Topics) { ], next); }, function (results, next) { - plugins.fireHook('action:topic.save', { topic: _.clone(topicData) }); + plugins.fireHook('action:topic.save', { topic: _.clone(topicData), data: data }); next(null, topicData.tid); }, ], callback); diff --git a/src/topics/follow.js b/src/topics/follow.js index b34b36ca7f..a0e3ac17af 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -225,7 +225,7 @@ module.exports = function (Topics) { followers.splice(index, 1); } - privileges.topics.filterUids('read', postData.topic.tid, followers, next); + privileges.topics.filterUids('topics:read', postData.topic.tid, followers, next); }, function (_followers, next) { followers = _followers; diff --git a/src/topics/index.js b/src/topics/index.js index fb57fcd5d9..5d68e23dcf 100644 --- a/src/topics/index.js +++ b/src/topics/index.js @@ -52,22 +52,29 @@ Topics.getTopicsFromSet = function (set, uid, start, stop, callback) { ], callback); }; -Topics.getTopics = function (tids, uid, callback) { +Topics.getTopics = function (tids, options, callback) { + let uid = options; + if (typeof options === 'object') { + uid = options.uid; + } async.waterfall([ function (next) { - privileges.topics.filterTids('read', tids, uid, next); + privileges.topics.filterTids('topics:read', tids, uid, next); }, function (tids, next) { - Topics.getTopicsByTids(tids, uid, next); + Topics.getTopicsByTids(tids, options, next); }, ], callback); }; -Topics.getTopicsByTids = function (tids, uid, callback) { +Topics.getTopicsByTids = function (tids, options, callback) { if (!Array.isArray(tids) || !tids.length) { return callback(null, []); } - + let uid = options; + if (typeof options === 'object') { + uid = options.uid; + } var uids; var cids; var topics; @@ -107,7 +114,7 @@ Topics.getTopicsByTids = function (tids, uid, callback) { Topics.getUserBookmarks(tids, uid, next); }, teasers: function (next) { - Topics.getTeasers(topics, uid, next); + Topics.getTeasers(topics, options, next); }, tags: function (next) { Topics.getTopicsTagsObjects(tids, next); diff --git a/src/topics/recent.js b/src/topics/recent.js index dd5f7a148d..fee915bd73 100644 --- a/src/topics/recent.js +++ b/src/topics/recent.js @@ -28,16 +28,17 @@ module.exports = function (Topics) { }; /* not an orphan method, used in widget-essentials */ - Topics.getLatestTopics = function (uid, start, stop, term, callback) { + Topics.getLatestTopics = function (options, callback) { + // uid, start, stop, term async.waterfall([ function (next) { - Topics.getLatestTidsFromSet('topics:recent', start, stop, term, next); + Topics.getLatestTidsFromSet('topics:recent', options.start, options.stop, options.term, next); }, function (tids, next) { - Topics.getTopics(tids, uid, next); + Topics.getTopics(tids, options, next); }, function (topics, next) { - next(null, { topics: topics, nextStart: stop + 1 }); + next(null, { topics: topics, nextStart: options.stop + 1 }); }, ], callback); }; diff --git a/src/topics/sorted.js b/src/topics/sorted.js index ae9a255da8..40b7799ab9 100644 --- a/src/topics/sorted.js +++ b/src/topics/sorted.js @@ -148,7 +148,7 @@ module.exports = function (Topics) { } }, function (tids, next) { - privileges.topics.filterTids('read', tids, uid, next); + privileges.topics.filterTids('topics:read', tids, uid, next); }, function (tids, next) { Topics.getTopicsFields(tids, ['uid', 'tid', 'cid'], next); @@ -187,7 +187,7 @@ module.exports = function (Topics) { async.waterfall([ function (next) { tids = tids.slice(params.start, params.stop !== -1 ? params.stop + 1 : undefined); - Topics.getTopicsByTids(tids, params.uid, next); + Topics.getTopicsByTids(tids, params, next); }, function (topicData, next) { Topics.calculateTopicIndices(topicData, params.start); diff --git a/src/topics/suggested.js b/src/topics/suggested.js index e6c32a4327..2378391e04 100644 --- a/src/topics/suggested.js +++ b/src/topics/suggested.js @@ -37,7 +37,7 @@ module.exports = function (Topics) { }, function (categoryTids, next) { tids = _.uniq(tids.concat(categoryTids)).slice(start, stop !== -1 ? stop + 1 : undefined); - privileges.topics.filterTids('read', tids, uid, next); + privileges.topics.filterTids('topics:read', tids, uid, next); }, function (tids, next) { Topics.getTopicsByTids(tids, uid, next); diff --git a/src/topics/teaser.js b/src/topics/teaser.js index b2e2f57758..b66507e95c 100644 --- a/src/topics/teaser.js +++ b/src/topics/teaser.js @@ -14,10 +14,16 @@ var utils = require('../utils'); module.exports = function (Topics) { var stripTeaserTags = utils.stripTags.concat(['img']); - Topics.getTeasers = function (topics, uid, callback) { + Topics.getTeasers = function (topics, options, callback) { if (!Array.isArray(topics) || !topics.length) { return callback(null, []); } + let uid = options; + let teaserPost = meta.config.teaserPost; + if (typeof options === 'object') { + uid = options.uid; + teaserPost = options.teaserPost || meta.config.teaserPost; + } var counts = []; var teaserPids = []; @@ -30,9 +36,9 @@ module.exports = function (Topics) { if (topic.teaserPid === 'null') { delete topic.teaserPid; } - if (meta.config.teaserPost === 'first') { + if (teaserPost === 'first') { teaserPids.push(topic.mainPid); - } else if (meta.config.teaserPost === 'last-post') { + } else if (teaserPost === 'last-post') { teaserPids.push(topic.teaserPid || topic.mainPid); } else { // last-reply and everything else uses teaserPid like `last` that was used before teaserPids.push(topic.teaserPid); diff --git a/src/topics/tools.js b/src/topics/tools.js index 6cf4bbefcc..00062e8fb9 100644 --- a/src/topics/tools.js +++ b/src/topics/tools.js @@ -5,6 +5,7 @@ var _ = require('lodash'); var db = require('../database'); var categories = require('../categories'); +var user = require('../user'); var plugins = require('../plugins'); var privileges = require('../privileges'); @@ -61,15 +62,16 @@ module.exports = function (Topics) { } else { plugins.fireHook('action:topic.restore', { topic: topicData, uid: uid }); } - - var data = { + user.getUserFields(uid, ['username', 'userslug'], next); + }, + function (userData, next) { + next(null, { tid: tid, cid: topicData.cid, isDelete: isDelete, uid: uid, - }; - - next(null, data); + user: userData, + }); }, ], callback); } diff --git a/src/topics/unread.js b/src/topics/unread.js index 9efe5c8363..02df4bd781 100644 --- a/src/topics/unread.js +++ b/src/topics/unread.js @@ -295,7 +295,9 @@ module.exports = function (Topics) { var count = 3; var done = false; var hasUnblockedUnread = params.topicTimestamp > userLastReadTimestamp; - + if (!params.blockedUids.length) { + return setImmediate(callback, null, hasUnblockedUnread); + } async.whilst(function () { return !done; }, function (_next) { diff --git a/src/upgrades/1.10.2/fix_category_topic_zsets.js b/src/upgrades/1.10.2/fix_category_topic_zsets.js index c9d67231ff..b469f5c480 100644 --- a/src/upgrades/1.10.2/fix_category_topic_zsets.js +++ b/src/upgrades/1.10.2/fix_category_topic_zsets.js @@ -24,7 +24,7 @@ module.exports = { if (parseInt(topicData.pinned, 10) === 1) { return setImmediate(next); } - + topicData.postcount = parseInt(topicData.postcount, 10) || 0; db.sortedSetAdd('cid:' + topicData.cid + ':tids:posts', topicData.postcount, tid, next); }, function (next) { diff --git a/src/upgrades/1.12.0/global_view_privileges.js b/src/upgrades/1.12.0/global_view_privileges.js new file mode 100644 index 0000000000..d074d4b148 --- /dev/null +++ b/src/upgrades/1.12.0/global_view_privileges.js @@ -0,0 +1,28 @@ +'use strict'; + +var async = require('async'); +var privileges = require('../../privileges'); + +module.exports = { + name: 'Global view privileges', + timestamp: Date.UTC(2019, 0, 5), + method: function (callback) { + var meta = require('../../meta'); + + var tasks = [ + async.apply(privileges.global.give, ['view:users', 'view:tags', 'view:groups'], 'registered-users'), + ]; + + if (parseInt(meta.config.privateUserInfo, 10) !== 1) { + tasks.push(async.apply(privileges.global.give, ['view:users', 'view:groups'], 'guests')); + tasks.push(async.apply(privileges.global.give, ['view:users', 'view:groups'], 'spiders')); + } + + if (parseInt(meta.config.privateTagListing, 10) !== 1) { + tasks.push(async.apply(privileges.global.give, ['view:tags'], 'guests')); + tasks.push(async.apply(privileges.global.give, ['view:tags'], 'spiders')); + } + + async.series(tasks, callback); + }, +}; diff --git a/src/upgrades/1.12.0/group_create_privilege.js b/src/upgrades/1.12.0/group_create_privilege.js new file mode 100644 index 0000000000..af2d7d2f61 --- /dev/null +++ b/src/upgrades/1.12.0/group_create_privilege.js @@ -0,0 +1,16 @@ +'use strict'; + +var privileges = require('../../privileges'); + +module.exports = { + name: 'Group create global privilege', + timestamp: Date.UTC(2019, 0, 4), + method: function (callback) { + var meta = require('../../meta'); + if (parseInt(meta.config.allowGroupCreation, 10) === 1) { + privileges.global.give(['groups:create'], 'registered-users', callback); + } else { + setImmediate(callback); + } + }, +}; diff --git a/src/upgrades/1.12.1/clear_username_email_history.js b/src/upgrades/1.12.1/clear_username_email_history.js new file mode 100644 index 0000000000..37ff83a179 --- /dev/null +++ b/src/upgrades/1.12.1/clear_username_email_history.js @@ -0,0 +1,45 @@ +'use strict'; + +const async = require('async'); +const db = require('../../database'); +const user = require('../../user'); + +module.exports = { + name: 'Delete username email history for deleted users', + timestamp: Date.UTC(2019, 2, 25), + method: async function (callback) { + const progress = this.progress; + var currentUid = 1; + db.getObjectField('global', 'nextUid', function (err, nextUid) { + if (err) { + return callback(err); + } + progress.total = nextUid; + async.whilst(function () { + return currentUid < nextUid; + }, + function (next) { + progress.incr(); + user.exists(currentUid, function (err, exists) { + if (err) { + return next(err); + } + if (exists) { + currentUid += 1; + return next(); + } + db.deleteAll(['user:' + currentUid + ':usernames', 'user:' + currentUid + ':emails'], function (err) { + if (err) { + return next(err); + } + currentUid += 1; + next(); + }); + }); + }, + function (err) { + callback(err); + }); + }); + }, +}; diff --git a/src/upgrades/1.12.1/moderation_notes_refactor.js b/src/upgrades/1.12.1/moderation_notes_refactor.js new file mode 100644 index 0000000000..914d7f43d6 --- /dev/null +++ b/src/upgrades/1.12.1/moderation_notes_refactor.js @@ -0,0 +1,54 @@ +'use strict'; + +var async = require('async'); +var db = require('../../database'); +var batch = require('../../batch'); + + +module.exports = { + name: 'Update moderation notes to hashes', + timestamp: Date.UTC(2019, 3, 5), + method: function (callback) { + var progress = this.progress; + + batch.processSortedSet('users:joindate', function (ids, next) { + async.each(ids, function (uid, next) { + progress.incr(); + db.getSortedSetRevRange('uid:' + uid + ':moderation:notes', 0, -1, function (err, notes) { + if (err || !notes.length) { + return next(err); + } + + async.eachSeries(notes, function (note, next) { + var noteData; + async.waterfall([ + function (next) { + try { + noteData = JSON.parse(note); + setImmediate(next); + } catch (err) { + next(err); + } + }, + function (next) { + db.sortedSetRemove('uid:' + uid + ':moderation:notes', note, next); + }, + function (next) { + db.setObject('uid:' + uid + ':moderation:note:' + noteData.timestamp, { + uid: noteData.uid, + timestamp: noteData.timestamp, + note: noteData.note, + }, next); + }, + function (next) { + db.sortedSetAdd('uid:' + uid + ':moderation:notes', noteData.timestamp, noteData.timestamp, next); + }, + ], next); + }, next); + }); + }, next); + }, { + progress: this.progress, + }, callback); + }, +}; diff --git a/src/upgrades/1.12.1/post_upload_sizes.js b/src/upgrades/1.12.1/post_upload_sizes.js new file mode 100644 index 0000000000..4c7c5068c2 --- /dev/null +++ b/src/upgrades/1.12.1/post_upload_sizes.js @@ -0,0 +1,24 @@ +'use strict'; + +var async = require('async'); + +const batch = require('../../batch'); +const posts = require('../../posts').async; + +module.exports = { + name: 'Calculate image sizes of all uploaded images', + timestamp: Date.UTC(2019, 2, 16), + method: function (callback) { + const progress = this.progress; + + batch.processSortedSet('posts:pid', function (postData, next) { + async.eachSeries(postData, async function (pid) { + const uploads = await posts.uploads.list(pid); + await posts.uploads.saveSize(uploads); + progress.incr(); + }, next); + }, { + progress: progress, + }, callback); + }, +}; diff --git a/src/upgrades/TEMPLATE b/src/upgrades/TEMPLATE index 54e4e2a2c0..60722ab70c 100644 --- a/src/upgrades/TEMPLATE +++ b/src/upgrades/TEMPLATE @@ -10,7 +10,7 @@ module.exports = { // the underscores are there so you can double click to select the whole thing name: 'User_friendly_upgrade_script_name', // remember, month is zero-indexed (so January is 0, December is 11) - timestamp: Date.UTC(2017, 0, 1), + timestamp: Date.UTC(2019, 0, 1), method: function (callback) { // Do stuff here... }, diff --git a/src/user/approval.js b/src/user/approval.js index f3a9712aa3..f0a5a77b98 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -1,8 +1,6 @@ 'use strict'; var async = require('async'); -var request = require('request'); -var winston = require('winston'); var validator = require('validator'); var db = require('../database'); @@ -182,9 +180,7 @@ module.exports = function (User) { }, function (_data, next) { data = _data; - var keys = data.filter(Boolean).map(function (user) { - return 'registration:queue:name:' + user.value; - }); + var keys = data.filter(Boolean).map(user => 'registration:queue:name:' + user.value); db.getObjects(keys, next); }, function (users, next) { @@ -197,18 +193,21 @@ module.exports = function (User) { async.map(users, function (user, next) { // temporary: see http://www.stopforumspam.com/forum/viewtopic.php?id=6392 + // need to keep this for getIPMatchedUsers user.ip = user.ip.replace('::ffff:', ''); - - async.parallel([ - function (next) { - getIPMatchedUsers(user, next); - }, - function (next) { - getSpamData(user, next); - }, - ], function (err) { + getIPMatchedUsers(user, function (err) { next(err, user); }); + user.customActions = [].concat(user.customActions); + /* + // then spam prevention plugins, using the "filter:user.getRegistrationQueue" hook can be like: + user.customActions.push({ + title: '[[spam-be-gone:report-user]]', + id: 'report-spam-user-' + user.username, + class: 'btn-warning report-spam-user', + icon: 'fa-flag' + }); + */ }, next); }, function (users, next) { @@ -234,34 +233,4 @@ module.exports = function (User) { }, ], callback); } - - function getSpamData(user, callback) { - async.waterfall([ - function (next) { - request({ - method: 'get', - url: 'http://api.stopforumspam.org/api' + - '?ip=' + encodeURIComponent(user.ip) + - '&email=' + encodeURIComponent(user.email) + - '&username=' + encodeURIComponent(user.username) + - '&f=json', - json: true, - }, next); - }, - function (response, body, next) { - if (response.statusCode === 200 && body) { - user.spamData = body; - user.usernameSpam = body.username ? (body.username.frequency > 0 || body.username.appears > 0) : true; - user.emailSpam = body.email ? (body.email.frequency > 0 || body.email.appears > 0) : true; - user.ipSpam = body.ip ? (body.ip.frequency > 0 || body.ip.appears > 0) : true; - } - next(); - }, - ], function (err) { - if (err) { - winston.error(err); - } - callback(); - }); - } }; diff --git a/src/user/bans.js b/src/user/bans.js index b82e64312b..5832dfea59 100644 --- a/src/user/bans.js +++ b/src/user/bans.js @@ -1,11 +1,13 @@ 'use strict'; -var async = require('async'); - -var db = require('../database'); +const util = require('util'); +const async = require('async'); +const db = require('../database'); module.exports = function (User) { - User.ban = function (uid, until, reason, callback) { + User.bans = {}; + + User.bans.ban = function (uid, until, reason, callback) { // "until" (optional) is unix timestamp in milliseconds // "reason" (optional) is a string if (!callback && typeof until === 'function') { @@ -43,8 +45,6 @@ module.exports = function (User) { if (until > now) { tasks.push(async.apply(db.sortedSetAdd, 'users:banned:expire', until, uid)); tasks.push(async.apply(User.setUserField, uid, 'banned:expire', until)); - } else { - until = 0; } async.series(tasks, function (err) { @@ -52,7 +52,7 @@ module.exports = function (User) { }); }; - User.unban = function (uid, callback) { + User.bans.unban = function (uid, callback) { async.waterfall([ function (next) { User.setUserFields(uid, { banned: 0, 'banned:expire': 0 }, next); @@ -63,36 +63,50 @@ module.exports = function (User) { ], callback); }; - User.isBanned = function (uid, callback) { + User.bans.getBannedAndExpired = function (uid, callback) { if (parseInt(uid, 10) <= 0) { return setImmediate(callback, null, false); } - async.waterfall([ - async.apply(User.getUserFields, uid, ['banned', 'banned:expire']), - function (userData, next) { - var banned = userData && userData.banned; - if (!banned) { - return next(null, banned); - } + User.getUserFields(uid, ['banned', 'banned:expire'], function (err, userData) { + if (err) { + return callback(err); + } + callback(null, User.bans.calcExpiredFromUserData(userData)); + }); + }; - // If they are banned, see if the ban has expired - var stillBanned = !userData['banned:expire'] || Date.now() < userData['banned:expire']; + User.bans.calcExpiredFromUserData = function (userData) { + return { + banned: !!userData.banned, + 'banned:expire': userData['banned:expire'], + banExpired: userData['banned:expire'] <= Date.now() && userData['banned:expire'] !== 0, + }; + }; - if (stillBanned) { - return next(null, true); - } - async.parallel([ - async.apply(db.sortedSetRemove.bind(db), 'users:banned:expire', uid), - async.apply(db.sortedSetRemove.bind(db), 'users:banned', uid), - async.apply(User.setUserFields, uid, { banned: 0, 'banned:expire': 0 }), - ], function (err) { - next(err, false); + User.bans.unbanIfExpired = function (uid, callback) { + User.bans.getBannedAndExpired(uid, function (err, result) { + if (err) { + return callback(err); + } + if (result.banned && result.banExpired) { + return User.bans.unban(uid, function (err) { + callback(err, { banned: false, banExpired: true, 'banned:expire': 0 }); }); - }, - ], callback); + } + callback(null, result); + }); + }; + + User.bans.isBanned = function (uid, callback) { + if (parseInt(uid, 10) <= 0) { + return setImmediate(callback, null, false); + } + User.bans.unbanIfExpired(uid, function (err, result) { + callback(err, result.banned); + }); }; - User.getBannedReason = function (uid, callback) { + User.bans.getReason = function (uid, callback) { if (parseInt(uid, 10) <= 0) { return setImmediate(callback, null, ''); } @@ -111,4 +125,14 @@ module.exports = function (User) { }, ], callback); }; + + // TODO Remove in v1.13.0 + const deprecatedMessage = (oldPath, newPath) => `function ${oldPath} is deprecated, please use ${newPath} instead`; + User.ban = util.deprecate(User.bans.ban, deprecatedMessage('User.ban', 'User.bans.ban')); + User.unban = util.deprecate(User.bans.unban, deprecatedMessage('User.unban', 'User.bans.unban')); + User.getBannedAndExpired = util.deprecate(User.bans.getBannedAndExpired, deprecatedMessage('User.getBannedAndExpired', 'User.bans.getBannedAndExpired')); + User.calcBanExpiredFromUserData = util.deprecate(User.bans.calcExpiredFromUserData, deprecatedMessage('User.calcBanExpiredFromUserData', 'User.bans.calcExpiredFromUserData')); + User.unbanIfBanExpired = util.deprecate(User.bans.unbanIfExpired, deprecatedMessage('User.unbanIfBanExpired', 'User.bans.unbanIfExpired')); + User.isBanned = util.deprecate(User.bans.isBanned, deprecatedMessage('User.isBanned', 'User.bans.isBanned')); + User.getBannedReason = util.deprecate(User.bans.getReason, deprecatedMessage('User.getBannedReason', 'User.bans.getReason')); }; diff --git a/src/user/create.js b/src/user/create.js index 9ab23a33dc..26395e2e4e 100644 --- a/src/user/create.js +++ b/src/user/create.js @@ -1,7 +1,6 @@ 'use strict'; var async = require('async'); -var validator = require('validator'); var zxcvbn = require('zxcvbn'); var db = require('../database'); var utils = require('../utils'); @@ -15,7 +14,7 @@ module.exports = function (User) { data.username = data.username.trim(); data.userslug = utils.slugify(data.username); if (data.email !== undefined) { - data.email = validator.escape(String(data.email).trim()); + data.email = String(data.email).trim(); } var timestamp = data.timestamp || Date.now(); var userData; diff --git a/src/user/data.js b/src/user/data.js index 22fb8e8df7..3ad1db6433 100644 --- a/src/user/data.js +++ b/src/user/data.js @@ -74,6 +74,10 @@ module.exports = function (User) { addField('lastonline'); } + if (fields.includes('banned') && !fields.includes('banned:expire')) { + addField('banned:expire'); + } + var uniqueUids = _.uniq(uids).filter(uid => uid > 0); async.waterfall([ @@ -148,9 +152,9 @@ module.exports = function (User) { } function modifyUserData(users, requestedFields, fieldsToRemove, callback) { - users.forEach(function (user) { + async.map(users, function (user, next) { if (!user) { - return; + return next(null, user); } db.parseIntFields(user, intFields, requestedFields); @@ -159,6 +163,10 @@ module.exports = function (User) { user.username = validator.escape(user.username ? user.username.toString() : ''); } + if (user.hasOwnProperty('email')) { + user.email = validator.escape(user.email ? user.email.toString() : ''); + } + if (!parseInt(user.uid, 10)) { user.uid = 0; user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former_user]]' : '[[global:guest]]'; @@ -207,13 +215,28 @@ module.exports = function (User) { user.lastonlineISO = utils.toISOString(user.lastonline) || user.joindateISO; } - if (user.hasOwnProperty('banned:expire')) { - user.banned_until = user['banned:expire']; - user.banned_until_readable = user.banned_until ? new Date(user.banned_until).toString() : 'Not Banned'; + if (user.hasOwnProperty('banned') || user.hasOwnProperty('banned:expire')) { + var result = User.bans.calcExpiredFromUserData(user); + var unban = result.banned && result.banExpired; + user.banned_until = unban ? 0 : user['banned:expire']; + user.banned_until_readable = user.banned_until && !unban ? utils.toISOString(user.banned_until) : 'Not Banned'; + if (unban) { + return User.bans.unban(user.uid, function (err) { + if (err) { + return next(err); + } + user.banned = false; + next(null, user); + }); + } } + next(null, user); + }, function (err, users) { + if (err) { + return callback(err); + } + plugins.fireHook('filter:users.get', users, callback); }); - - plugins.fireHook('filter:users.get', users, callback); } function parseGroupTitle(user) { diff --git a/src/user/delete.js b/src/user/delete.js index 3c29e23ecb..27ae2b8bb4 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -156,15 +156,21 @@ module.exports = function (User) { 'uid:' + uid + ':followed_tids', 'uid:' + uid + ':ignored_tids', 'user:' + uid + ':settings', + 'user:' + uid + ':usernames', + 'user:' + uid + ':emails', 'uid:' + uid + ':topics', 'uid:' + uid + ':posts', 'uid:' + uid + ':chats', 'uid:' + uid + ':chats:unread', 'uid:' + uid + ':chat:rooms', 'uid:' + uid + ':chat:rooms:unread', 'uid:' + uid + ':upvote', 'uid:' + uid + ':downvote', 'uid:' + uid + ':flag:pids', 'uid:' + uid + ':sessions', 'uid:' + uid + ':sessionUUID:sessionId', + 'invitation:uid:' + uid, ]; db.deleteAll(keys, next); }, + function (next) { + db.setRemove('invitation:uids', uid, next); + }, function (next) { deleteUserIps(uid, next); }, diff --git a/src/user/digest.js b/src/user/digest.js index f5940e911f..9b01126891 100644 --- a/src/user/digest.js +++ b/src/user/digest.js @@ -77,6 +77,13 @@ Digest.getSubscribers = function (interval, callback) { next(err, subs); }); }, + function (subscribers, next) { + async.filter(subscribers, function (uid, next) { + user.bans.isBanned(uid, function (err, banned) { + next(err, !banned); + }); + }, next); + }, function (subscribers, next) { plugins.fireHook('filter:digest.subscribers', { interval: interval, @@ -156,24 +163,33 @@ Digest.send = function (data, callback) { }); function getTermTopics(term, uid, start, stop, callback) { + const options = { + uid: uid, + start: start, + stop: stop, + term: term, + sort: 'posts', + teaserPost: 'last-post', + }; + async.waterfall([ function (next) { - topics.getSortedTopics({ - uid: uid, - start: start, - stop: stop, - term: term, - sort: 'posts', - }, next); + topics.getSortedTopics(options, next); }, function (data, next) { if (!data.topics.length) { - topics.getLatestTopics(uid, start, stop, term, next); + topics.getLatestTopics(options, next); } else { next(null, data); } }, - function (data, next) { + (data, next) => { + data.topics.forEach(function (topicObj) { + if (topicObj && topicObj.teaser && topicObj.teaser.content && topicObj.teaser.content.length > 255) { + topicObj.teaser.content = topicObj.teaser.content.slice(0, 255) + '...'; + } + }); + next(null, data.topics); }, ], callback); diff --git a/src/user/index.js b/src/user/index.js index 40fda6ab91..596871065f 100644 --- a/src/user/index.js +++ b/src/user/index.js @@ -294,7 +294,7 @@ User.getModeratorUids = function (callback) { categories.getModeratorUids(cids, next); }, function (uids, next) { - next(null, _.union(uids)); + next(null, _.union(...uids)); }, ], callback); }; @@ -328,7 +328,9 @@ User.addInterstitials = function (callback) { if (!meta.config.gdpr_enabled) { return setImmediate(callback, null, data); } - + if (!data.userData) { + return setImmediate(callback, new Error('[[error:invalid-data]]')); + } const add = function () { data.interstitials.push({ template: 'partials/gdpr_consent', @@ -369,6 +371,10 @@ User.addInterstitials = function (callback) { // Forum Terms of Use function (data, callback) { + if (!data.userData) { + return setImmediate(callback, new Error('[[error:invalid-data]]')); + } + const add = function () { data.interstitials.push({ template: 'partials/acceptTos', diff --git a/src/user/info.js b/src/user/info.js index aabdac3534..5315abdb68 100644 --- a/src/user/info.js +++ b/src/user/info.js @@ -24,13 +24,16 @@ module.exports = function (User) { db.getObject(record[0], next); }, function (banInfo, next) { - var expiry = banInfo.expire; + const expire = parseInt(banInfo.expire, 10); + const expire_readable = utils.toISOString(expire); next(null, { uid: uid, timestamp: banInfo.timestamp, - expiry: parseInt(expiry, 10), - expiry_readable: new Date(parseInt(expiry, 10)).toString(), + banned_until: expire, + expiry: expire, /* backward compatible alias */ + banned_until_readable: expire_readable, + expiry_readable: expire_readable, /* backward compatible alias */ reason: validator.escape(String(banInfo.reason || '')), }); }, @@ -158,18 +161,19 @@ module.exports = function (User) { function (next) { db.getSortedSetRevRange('uid:' + uid + ':moderation:notes', start, stop, next); }, + function (noteIds, next) { + const keys = noteIds.map(id => 'uid:' + uid + ':moderation:note:' + id); + db.getObjects(keys, next); + }, function (notes, next) { var uids = []; noteData = notes.map(function (note) { - try { - var data = JSON.parse(note); - uids.push(data.uid); - data.timestampISO = utils.toISOString(data.timestamp); - data.note = validator.escape(String(data.note)); - return data; - } catch (err) { - return next(err); + if (note) { + uids.push(note.uid); + note.timestampISO = utils.toISOString(note.timestamp); + note.note = validator.escape(String(note.note)); } + return note; }); User.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture'], next); diff --git a/src/user/notifications.js b/src/user/notifications.js index 185c084324..244cee7ba0 100644 --- a/src/user/notifications.js +++ b/src/user/notifications.js @@ -16,20 +16,25 @@ UserNotifications.get = function (uid, callback) { if (parseInt(uid, 10) <= 0) { return setImmediate(callback, null, { read: [], unread: [] }); } + + let unread; async.waterfall([ function (next) { - getNotifications(uid, 0, 9, next); + getNotificationsFromSet('uid:' + uid + ':notifications:unread', uid, 0, 29, next); }, - function (notifications, next) { - notifications.read = notifications.read.filter(Boolean); - notifications.unread = notifications.unread.filter(Boolean); - - var maxNotifs = 15; - if (notifications.read.length + notifications.unread.length > maxNotifs) { - notifications.read.length = maxNotifs - notifications.unread.length; + function (_unread, next) { + unread = _unread.filter(Boolean); + if (unread.length < 30) { + getNotificationsFromSet('uid:' + uid + ':notifications:read', uid, 0, 29 - unread.length, next); + } else { + next(null, []); } - - next(null, notifications); + }, + function (read, next) { + next(null, { + read: read.filter(Boolean), + unread: unread, + }); }, ], callback); }; @@ -102,18 +107,7 @@ function deleteUserNids(nids, uid, callback) { ], nids, callback); } -function getNotifications(uid, start, stop, callback) { - async.parallel({ - unread: function (next) { - getNotificationsFromSet('uid:' + uid + ':notifications:unread', false, uid, start, stop, next); - }, - read: function (next) { - getNotificationsFromSet('uid:' + uid + ':notifications:read', true, uid, start, stop, next); - }, - }, callback); -} - -function getNotificationsFromSet(set, read, uid, start, stop, callback) { +function getNotificationsFromSet(set, uid, start, stop, callback) { async.waterfall([ function (next) { db.getSortedSetRevRange(set, start, stop, next); diff --git a/src/user/online.js b/src/user/online.js index 6cb19cd22f..5e788d4c75 100644 --- a/src/user/online.js +++ b/src/user/online.js @@ -5,6 +5,7 @@ var async = require('async'); var db = require('../database'); var topics = require('../topics'); var plugins = require('../plugins'); +var meta = require('../meta'); module.exports = function (User) { User.updateLastOnlineTime = function (uid, callback) { @@ -52,7 +53,7 @@ module.exports = function (User) { }, function (lastonline, next) { function checkOnline(lastonline) { - return now - lastonline < 300000; + return (now - lastonline) < (meta.config.onlineCutoff * 60000); } var isOnline; diff --git a/src/views/admin/advanced/database.tpl b/src/views/admin/advanced/database.tpl index 086b24e179..3e6a6b541e 100644 --- a/src/views/admin/advanced/database.tpl +++ b/src/views/admin/advanced/database.tpl @@ -1,5 +1,12 @@
+ +
+ {error.friendlyMessage} +
+ {error.errmsg} +
+
[[admin/advanced/database:mongo]]
diff --git a/src/views/admin/development/info.tpl b/src/views/admin/development/info.tpl index d995233f17..08e8472f94 100644 --- a/src/views/admin/development/info.tpl +++ b/src/views/admin/development/info.tpl @@ -15,6 +15,7 @@ [[admin/development/info:nodejs]] [[admin/development/info:online]] [[admin/development/info:git]] + [[admin/development/info:cpu-usage]] [[admin/development/info:memory]] [[admin/development/info:load]] [[admin/development/info:uptime]] @@ -32,6 +33,7 @@ {info.stats.socketCount} {info.git.branch}@{info.git.hash} + {info.process.cpuUsage.user} / {info.process.cpuUsage.system} {info.process.memoryUsage.humanReadable} mb {info.os.load} {info.process.uptime} diff --git a/src/views/admin/extend/plugins.tpl b/src/views/admin/extend/plugins.tpl index cbf44febf8..795c404656 100644 --- a/src/views/admin/extend/plugins.tpl +++ b/src/views/admin/extend/plugins.tpl @@ -20,7 +20,32 @@
-
+
+
+
[[admin/extend/plugins:plugin-search]]
+
+
+
+
+ +
+
[[admin/extend/plugins:reorder-plugins]]
+
+ +
+
+ +
+
[[admin/extend/plugins:dev-interested]]
+
+

+ [[admin/extend/plugins:docs-info]] +

+
+
+
+ +
    @@ -48,32 +73,6 @@
-
-
-
[[admin/extend/plugins:plugin-search]]
-
-
-
-
- -
-
[[admin/extend/plugins:reorder-plugins]]
-
- -
-
- -
-
[[admin/extend/plugins:dev-interested]]
-
-

- [[admin/extend/plugins:docs-info]] -

-
-
-
- -