diff --git a/CHANGELOG.md b/CHANGELOG.md index a66d1f9207..e41c2eec9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,70 @@ +#### v3.7.2 (2024-03-27) + +##### Chores + +* up harmony (0171e73a) +* up harmony (c6915398) +* incrementing version number - v3.7.1 (712365a5) +* update changelog for v3.7.1 (07640389) +* incrementing version number - v3.7.0 (9a6153d7) +* incrementing version number - v3.6.7 (86a17e38) +* incrementing version number - v3.6.6 (6604bf37) +* incrementing version number - v3.6.5 (6c653625) +* incrementing version number - v3.6.4 (83d131b4) +* incrementing version number - v3.6.3 (fc7d2bfd) +* incrementing version number - v3.6.2 (0f577a57) +* incrementing version number - v3.6.1 (f1a69468) +* incrementing version number - v3.6.0 (4cdf85f8) +* incrementing version number - v3.5.3 (ed0e8783) +* incrementing version number - v3.5.2 (52fbb2da) +* incrementing version number - v3.5.1 (4c543488) +* incrementing version number - v3.5.0 (d06fb4f0) +* incrementing version number - v3.4.3 (5c984250) +* incrementing version number - v3.4.2 (3f0dac38) +* incrementing version number - v3.4.1 (01e69574) +* incrementing version number - v3.4.0 (fd9247c5) +* incrementing version number - v3.3.9 (5805e770) +* incrementing version number - v3.3.8 (a5603565) +* incrementing version number - v3.3.7 (b26f1744) +* incrementing version number - v3.3.6 (7fb38792) +* incrementing version number - v3.3.4 (a67f84ea) +* incrementing version number - v3.3.3 (f94d239b) +* incrementing version number - v3.3.2 (ec9dac97) +* incrementing version number - v3.3.1 (151cc68f) +* incrementing version number - v3.3.0 (fc1ad70f) +* incrementing version number - v3.2.3 (b06d3e63) +* incrementing version number - v3.2.2 (758ecfcd) +* incrementing version number - v3.2.1 (20145074) +* incrementing version number - v3.2.0 (9ecac38e) +* incrementing version number - v3.1.7 (0b4e81ab) +* incrementing version number - v3.1.6 (b3a3b130) +* incrementing version number - v3.1.5 (ec19343a) +* incrementing version number - v3.1.4 (2452783c) +* incrementing version number - v3.1.3 (3b4e9d3f) +* incrementing version number - v3.1.2 (40fa3489) +* incrementing version number - v3.1.1 (40250733) +* incrementing version number - v3.1.0 (0cb386bd) +* incrementing version number - v3.0.1 (26f6ea49) +* incrementing version number - v3.0.0 (224e08cd) + +##### New Features + +* add hook to modify sorting options/fields (168419cf) +* add playsinline video attribute (#12419) (5924a6eb) + +##### Bug Fixes + +* #12446, fix groups.ownership.rescind (ed41e416) +* #12415, fix notification escaping for queued posts (4787d013) + +##### Refactors + +* remove log (3b2d8551) + +##### Tests + +* add test for #12446 (bf4e257c) + #### v3.7.1 (2024-03-14) ##### Chores diff --git a/install/package.json b/install/package.json index d6ab418c94..75b011bbb9 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "3.7.1", + "version": "3.7.2", "homepage": "https://www.nodebb.org", "repository": { "type": "git", @@ -30,11 +30,11 @@ "dependencies": { "@adactive/bootstrap-tagsinput": "0.8.2", "@fontsource/inter": "5.0.17", - "@fontsource/poppins": "5.0.12", - "@fortawesome/fontawesome-free": "6.5.1", + "@fontsource/poppins": "5.0.13", + "@fortawesome/fontawesome-free": "6.5.2", "@isaacs/ttlcache": "1.4.1", "@popperjs/core": "2.11.8", - "ace-builds": "1.32.8", + "ace-builds": "1.32.9", "archiver": "7.0.1", "async": "3.2.5", "autoprefixer": "10.4.19", @@ -93,13 +93,13 @@ "mousetrap": "1.6.5", "multiparty": "4.2.3", "nconf": "0.12.1", - "nodebb-plugin-2factor": "7.4.0", + "nodebb-plugin-2factor": "7.5.0", "nodebb-plugin-composer-default": "10.2.33", "nodebb-plugin-dbsearch": "6.2.3", "nodebb-plugin-emoji": "5.1.13", "nodebb-plugin-emoji-android": "4.0.0", "nodebb-plugin-markdown": "13.0.0-pre.3", - "nodebb-plugin-mentions": "4.4.2", + "nodebb-plugin-mentions": "4.4.3", "nodebb-plugin-ntfy": "1.7.4", "nodebb-plugin-spam-be-gone": "2.2.1", "nodebb-rewards-essentials": "1.0.0", @@ -113,8 +113,8 @@ "passport": "0.7.0", "passport-http-bearer": "1.0.1", "passport-local": "1.0.0", - "pg": "8.11.3", - "pg-cursor": "2.10.3", + "pg": "8.11.5", + "pg-cursor": "2.10.5", "postcss": "8.4.38", "postcss-clean": "1.2.0", "progress-webpack-plugin": "1.0.16", @@ -165,7 +165,7 @@ "husky": "8.0.3", "jsdom": "24.0.0", "lint-staged": "15.2.2", - "mocha": "10.3.0", + "mocha": "10.4.0", "mocha-lcov-reporter": "1.3.0", "mockdate": "3.0.5", "nyc": "15.1.0", diff --git a/public/language/ar/admin/advanced/events.json b/public/language/ar/admin/advanced/events.json index 0b785ae80c..9bf019eb74 100644 --- a/public/language/ar/admin/advanced/events.json +++ b/public/language/ar/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "نوع الحدث", "filter-start": "تاريخ البدء", "filter-end": "تاريخ الانتهاء", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "لكل صفحة" } \ No newline at end of file diff --git a/public/language/bg/admin/advanced/events.json b/public/language/bg/admin/advanced/events.json index 9cfaddd583..5bb299567f 100644 --- a/public/language/bg/admin/advanced/events.json +++ b/public/language/bg/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Вид събитие", "filter-start": "Начална дата", "filter-end": "Крайна дата", + "filter-user": "Филтриране по потребител", + "filter-user.placeholder": "Въведете име на потребител, за да филтрирате…", + "filter-group": "Филтриране по група", + "filter-group.placeholder": "Въведете име на група, за да филтрирате…", "filter-per-page": "На страница" } \ No newline at end of file diff --git a/public/language/bn/admin/advanced/events.json b/public/language/bn/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/bn/admin/advanced/events.json +++ b/public/language/bn/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/cs/admin/advanced/events.json b/public/language/cs/admin/advanced/events.json index 2ac368b809..19d44ec316 100644 --- a/public/language/cs/admin/advanced/events.json +++ b/public/language/cs/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Typ události", "filter-start": "Datum začátku", "filter-end": "Datum konce", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Na stránku" } \ No newline at end of file diff --git a/public/language/da/admin/advanced/events.json b/public/language/da/admin/advanced/events.json index ab141028f4..507b5d852c 100644 --- a/public/language/da/admin/advanced/events.json +++ b/public/language/da/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/de/admin/advanced/events.json b/public/language/de/admin/advanced/events.json index 70f60c38dc..bd966b32ca 100644 --- a/public/language/de/admin/advanced/events.json +++ b/public/language/de/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Ereignistyp", "filter-start": "Anfangsdatum", "filter-end": "Enddatum", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Pro Seite" } \ No newline at end of file diff --git a/public/language/el/admin/advanced/events.json b/public/language/el/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/el/admin/advanced/events.json +++ b/public/language/el/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/en-GB/admin/advanced/events.json b/public/language/en-GB/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/en-GB/admin/advanced/events.json +++ b/public/language/en-GB/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/en-US/admin/advanced/events.json b/public/language/en-US/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/en-US/admin/advanced/events.json +++ b/public/language/en-US/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/en-x-pirate/admin/advanced/events.json b/public/language/en-x-pirate/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/en-x-pirate/admin/advanced/events.json +++ b/public/language/en-x-pirate/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/es/admin/advanced/events.json b/public/language/es/admin/advanced/events.json index cd9474c5a5..70f60ef2e2 100644 --- a/public/language/es/admin/advanced/events.json +++ b/public/language/es/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Tipo de evento", "filter-start": "Fecha de inicio", "filter-end": "Fecha fin", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "por página" } \ No newline at end of file diff --git a/public/language/et/admin/advanced/events.json b/public/language/et/admin/advanced/events.json index 912b9e8e4d..83ca085438 100644 --- a/public/language/et/admin/advanced/events.json +++ b/public/language/et/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/fa-IR/admin/advanced/events.json b/public/language/fa-IR/admin/advanced/events.json index 98f7b5c69a..f2488c1306 100644 --- a/public/language/fa-IR/admin/advanced/events.json +++ b/public/language/fa-IR/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/fi/admin/advanced/events.json b/public/language/fi/admin/advanced/events.json index 9699faf2d0..a90b76b12b 100644 --- a/public/language/fi/admin/advanced/events.json +++ b/public/language/fi/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Tapahtuman tyyppi", "filter-start": "Aloituspäivä", "filter-end": "Lopetuspäivä", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Sivulla" } \ No newline at end of file diff --git a/public/language/fr/admin/advanced/events.json b/public/language/fr/admin/advanced/events.json index 65af7c70a8..f7e2f944bb 100644 --- a/public/language/fr/admin/advanced/events.json +++ b/public/language/fr/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Évènements", "filter-start": "Date de début", "filter-end": "Date de fin", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Par page" } \ No newline at end of file diff --git a/public/language/gl/admin/advanced/events.json b/public/language/gl/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/gl/admin/advanced/events.json +++ b/public/language/gl/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/he/admin/advanced/events.json b/public/language/he/admin/advanced/events.json index baac86f2d6..1daa86a765 100644 --- a/public/language/he/admin/advanced/events.json +++ b/public/language/he/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "סוג אירוע", "filter-start": "מתאריך", "filter-end": "עד תאריך", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "פריטים בכל דף" } \ No newline at end of file diff --git a/public/language/hr/admin/advanced/events.json b/public/language/hr/admin/advanced/events.json index a6896562b3..eb61430fe6 100644 --- a/public/language/hr/admin/advanced/events.json +++ b/public/language/hr/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/hu/admin/admin.json b/public/language/hu/admin/admin.json index 8248580557..9fe669de04 100644 --- a/public/language/hu/admin/admin.json +++ b/public/language/hu/admin/admin.json @@ -4,15 +4,15 @@ "acp-title": "%1 | NodeBB Adminisztrációs vezérlőpult", "settings-header-contents": "Tartalmak", - "changes-saved": "Changes Saved", - "changes-saved-message": "Your changes to the NodeBB configuration have been saved.", + "changes-saved": "Változások mentve", + "changes-saved-message": "A NodeBB konfigurációjának módosításai mentésre kerültek.", "changes-not-saved": "A változtatások nincsenek elmentve", "changes-not-saved-message": "NodeBB encountered a problem saving your changes. (%1)", - "save-changes": "Save changes", + "save-changes": "Változások mentése", "min": "Min:", "max": "Max:", - "view": "View", - "edit": "Edit", - "add": "Add", - "select-icon": "Select Icon" + "view": "Megnéz", + "edit": "Szerkeszt", + "add": "Hozzáad", + "select-icon": "Válassz ikont" } \ 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 b903a088c9..cafdbc1ce6 100644 --- a/public/language/hu/admin/advanced/database.json +++ b/public/language/hu/admin/advanced/database.json @@ -17,7 +17,7 @@ "mongo.file-size": "Fájlméret", "mongo.resident-memory": "Rezidens memória", "mongo.virtual-memory": "Virtuális memória", - "mongo.mapped-memory": "Mapped Memory", + "mongo.mapped-memory": "Leképezett memória", "mongo.bytes-in": "Bejövő bájtok", "mongo.bytes-out": "Kimenő bájtok", "mongo.num-requests": "Kérések száma", diff --git a/public/language/hu/admin/advanced/events.json b/public/language/hu/admin/advanced/events.json index ae63ff3573..18223d80d8 100644 --- a/public/language/hu/admin/advanced/events.json +++ b/public/language/hu/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Esemény típus", "filter-start": "Kezdő dátum", "filter-end": "Befejező dátum", + "filter-user": "Szűrés felhasználónként", + "filter-user.placeholder": "Írj be egy felhasználónevet a szűréshez...", + "filter-group": "Szűrés csoportonként", + "filter-group.placeholder": "Írj be egy csoportnevet a szűréshez...", "filter-per-page": "Oldalanként" } \ No newline at end of file diff --git a/public/language/hu/admin/dashboard.json b/public/language/hu/admin/dashboard.json index 2667ac9af7..1016b5b833 100644 --- a/public/language/hu/admin/dashboard.json +++ b/public/language/hu/admin/dashboard.json @@ -95,7 +95,7 @@ "expand-analytics": "Expand analytics", "clear-search-history": "Clear Search History", "clear-search-history-confirm": "Are you sure you want to clear entire search history?", - "search-term": "Term", - "search-count": "Count", - "view-all": "View all" + "search-term": "Feltétel", + "search-count": "Számláló", + "view-all": "Összes mutatása" } diff --git a/public/language/hu/admin/extend/widgets.json b/public/language/hu/admin/extend/widgets.json index 26f852ed3b..090f1b1996 100644 --- a/public/language/hu/admin/extend/widgets.json +++ b/public/language/hu/admin/extend/widgets.json @@ -5,7 +5,7 @@ "none-installed": "Nincs elérhető modul! Aktiváld a widget essentials beépülőt a beépülők oldalon.", "clone-from": "Modul klónozása innen", "containers.available": "Elérhető tárolók", - "containers.explanation": "Drag and drop on top of any widget", + "containers.explanation": "Húzd rá az alábbiakat bármely modulra", "containers.none": "Nincs", "container.well": "Well", "container.jumbotron": "Jumbotron", @@ -30,6 +30,6 @@ "start-date": "Start date", "end-date": "End date", "hide-on-mobile": "Elrejtés mobilon", - "hide-drafts": "Hide drafts", - "show-drafts": "Show drafts" + "hide-drafts": "Piszkozat elrejtése", + "show-drafts": "Piszkozat megjelenítése" } \ No newline at end of file diff --git a/public/language/hu/admin/manage/privileges.json b/public/language/hu/admin/manage/privileges.json index 2d7b67bb95..3ec3b259a3 100644 --- a/public/language/hu/admin/manage/privileges.json +++ b/public/language/hu/admin/manage/privileges.json @@ -8,7 +8,7 @@ "edit-privileges": "Jogosultságok szerkesztése", "select-clear-all": "Mind kiválasztása/törlése", "chat": "Csevegés", - "chat-with-privileged": "Chat with Privileged", + "chat-with-privileged": "Csevegés kivételezéssel", "upload-images": "Képek feltöltése", "upload-files": "Fájlok feltöltése", "signature": "Aláírás", diff --git a/public/language/hu/admin/manage/users.json b/public/language/hu/admin/manage/users.json index 98781e23dd..75bb4aec4a 100644 --- a/public/language/hu/admin/manage/users.json +++ b/public/language/hu/admin/manage/users.json @@ -121,27 +121,27 @@ "alerts.email-sent-to": "Meghívó email elküldve %1 részére", "alerts.x-users-found": "%1 talált felhasználó (%2 másodperc)", "alerts.select-a-single-user-to-change-email": "Select a single user to change email", - "export": "Export", - "export-users-fields-title": "Select CSV Fields", + "export": "Exportálás", + "export-users-fields-title": "Választott CSV mezők", "export-field-email": "Email", - "export-field-username": "Username", + "export-field-username": "Felhasználónév", "export-field-uid": "UID", "export-field-ip": "IP", - "export-field-joindate": "Join date", - "export-field-lastonline": "Last Online", - "export-field-lastposttime": "Last Post Time", - "export-field-reputation": "Reputation", - "export-field-postcount": "Post Count", - "export-field-topiccount": "Topic Count", - "export-field-profileviews": "Profile Views", - "export-field-followercount": "Follower Count", - "export-field-followingcount": "Following Count", - "export-field-fullname": "Full Name", - "export-field-website": "Website", - "export-field-location": "Location", - "export-field-birthday": "Birthday", - "export-field-signature": "Signature", - "export-field-aboutme": "About Me", + "export-field-joindate": "Regisztráció dátuma", + "export-field-lastonline": "Utoljára elérhető", + "export-field-lastposttime": "Utolsó hozzászólás ideje", + "export-field-reputation": "Hírnév", + "export-field-postcount": "Hozzászólások száma", + "export-field-topiccount": "Témák száma", + "export-field-profileviews": "Profil megtekintések", + "export-field-followercount": "Követők száma", + "export-field-followingcount": "Követések száma", + "export-field-fullname": "Teljes név", + "export-field-website": "Weboldal", + "export-field-location": "Lakhely", + "export-field-birthday": "Születésnap", + "export-field-signature": "Aláírás", + "export-field-aboutme": "Rólam", "export-users-started": "Felhasználók exportálása CSV formátumban. Ez eltarthat egy darabig. Értesítést fogsz kapni, ha elkészült.", "export-users-completed": "Felhasználók exportálva CSV formátumban, kattints ide a letöltéshez.", diff --git a/public/language/hu/admin/settings/post.json b/public/language/hu/admin/settings/post.json index 4fc9580d9f..e368a205ec 100644 --- a/public/language/hu/admin/settings/post.json +++ b/public/language/hu/admin/settings/post.json @@ -4,11 +4,11 @@ "sorting.post-default": "Alapértelmezett rendezés", "sorting.oldest-to-newest": "Régebbitől az újabb felé", "sorting.newest-to-oldest": "Újabbtól a régebbi felé", - "sorting.recently-replied": "Recently Replied", - "sorting.recently-created": "Recently Created", + "sorting.recently-replied": "Nemrég megválaszolt", + "sorting.recently-created": "Nemrég létrehozott", "sorting.most-votes": "Legtöbb szavazat", "sorting.most-posts": "Legtöbb hozzászólás", - "sorting.most-views": "Most Views", + "sorting.most-views": "Legtöbb Megtekintés", "sorting.topic-default": "Alapértelmezett témekör rendezés", "length": "Hozzászólás hossza", "post-queue": "Hozzászólás várólista", diff --git a/public/language/hu/admin/settings/reputation.json b/public/language/hu/admin/settings/reputation.json index 90650e75fa..d98443850e 100644 --- a/public/language/hu/admin/settings/reputation.json +++ b/public/language/hu/admin/settings/reputation.json @@ -23,12 +23,12 @@ "flags.limit-per-target": "Bizonyos dolgokat legfeljebb hányszor lehessen megjelölni", "flags.limit-per-target-placeholder": "Alapértelmezett: 0", "flags.limit-per-target-help": "Amikor egy hozzászólás vagy felhasználó több megjelölést kap, akkor minden megjelölés "jelentésnek" számít és hozzáadódik az eredeti megjelöléshez. Adj meg 0-tól eltérő értéket egy maximális jelölési szám beállításához.", - "flags.limit-post-flags-per-day": "Maximum number of times a user can flag posts in a day", - "flags.limit-post-flags-per-day-help": "Set to 0 to disable, (default: 10)", - "flags.limit-user-flags-per-day": "Maximum number of times a user can flag users in a day", - "flags.limit-user-flags-per-day-help": "Set to 0 to disable, (default: 10)", - "flags.auto-flag-on-downvote-threshold": "Number of downvotes to auto flag posts", - "flags.auto-flag-on-downvote-threshold-help": "Set to 0 to disable, (default: 0)", + "flags.limit-post-flags-per-day": "Egy felhasználó egy nap maximum hányszor jelölheti meg a hozzászólásokat", + "flags.limit-post-flags-per-day-help": "Állítsd 0-ra a tiltáshoz, (alapértelmezetten: 10)", + "flags.limit-user-flags-per-day": "Egy felhasználó egy nap maximum hányszor jelölhet meg felhasználókat", + "flags.limit-user-flags-per-day-help": "Állítsd 0-ra a tiltáshoz, (alapértelmezetten: 10)", + "flags.auto-flag-on-downvote-threshold": "Nemtetszések száma a hozzászólás automatikus megjelöléséhez", + "flags.auto-flag-on-downvote-threshold-help": "Állítsd 0-ra a tiltáshoz, (alapértelmezetten: 0)", "flags.auto-resolve-on-ban": "A felhasználó összes megjelölésének feloldása, amikor kitiltásra kerül", "flags.action-on-resolve": "Tegye a következőket, ha egy megjelölés megoldódott", "flags.action-on-reject": "Tegye a következőket, ha egy megjelölés visszautasított", diff --git a/public/language/hu/admin/settings/user.json b/public/language/hu/admin/settings/user.json index 5ebb8b5bee..49934fec5c 100644 --- a/public/language/hu/admin/settings/user.json +++ b/public/language/hu/admin/settings/user.json @@ -79,14 +79,14 @@ "follow-replied-topics": "Minden témakör követése, amire válaszoltál", "default-notification-settings": "Alapértelmezett értesítési beállítások", "categoryWatchState": "Alapértelmezett kategóriafigyelés", - "categoryWatchState.tracking": "Tracking", + "categoryWatchState.tracking": "Követés", "categoryWatchState.notwatching": "Nem megfigyelt", "categoryWatchState.ignoring": "Mellőzés", - "restrictions-new": "New User Restrictions", - "restrictions.rep-threshold": "Reputation threshold before these restrictions are lifted", - "restrictions.seconds-between-new": "Seconds between posts for new users", - "restrictions.seconds-before-new": "Seconds before a new user can make their first post", - "restrictions.seconds-edit-after-new": "Number of seconds a post remains editable for new users (set to 0 to disable)", - "restrictions.milliseconds-between-messages": "Time between chat messages for new users (ms)", - "restrictions.groups-exempt-from-new-user-restrictions": "Select groups that should be exempt from the new user restrictions" + "restrictions-new": "Új felhasználók korlátozása", + "restrictions.rep-threshold": "Szükséges hírnév szint ezen korlátozások feloldásához", + "restrictions.seconds-between-new": "Hozzászólások közötti kötelező szünet új felhasználóknak (másodpercben)", + "restrictions.seconds-before-new": "Szükséges eltelt idő, mielőtt egy új felhasználó hozzászólást írhat (másodpercben)", + "restrictions.seconds-edit-after-new": "Hány másodpercig maradjanak a hozzászólások szerkeszthetőek az új felhasználóknak (0: nincs korlátozás)", + "restrictions.milliseconds-between-messages": "Csevegési üzenetek közötti idő új felhasználóknak ezredmásodpercben", + "restrictions.groups-exempt-from-new-user-restrictions": "Válaszd ki azokat a csoportokat, amelyek mentesülnek az új felhasználói korlátozások alól." } diff --git a/public/language/hu/aria.json b/public/language/hu/aria.json index 6f023dcae0..d42435acad 100644 --- a/public/language/hu/aria.json +++ b/public/language/hu/aria.json @@ -1,8 +1,8 @@ { - "post-sort-option": "Post sort option, %1", - "topic-sort-option": "Topic sort option, %1", - "user-avatar-for": "User avatar for %1", - "user-watched-tags": "User watched tags", - "delete-upload-button": "Delete upload button", - "group-page-link-for": "Group page link for %1" + "post-sort-option": "Hozzászólás rendezés, %1", + "topic-sort-option": "Téma rendezés, %1", + "user-avatar-for": "Felhasználó avatár %1", + "user-watched-tags": "Felhasználó által figyelt címkék", + "delete-upload-button": "Feltöltő gomb törlése", + "group-page-link-for": "Csoport oldal linkje %1" } \ No newline at end of file diff --git a/public/language/hu/category.json b/public/language/hu/category.json index e58125b3f1..9779cff0aa 100644 --- a/public/language/hu/category.json +++ b/public/language/hu/category.json @@ -10,15 +10,15 @@ "watch": "Figyelés", "ignore": "Mellőzés", "watching": "Figyelés", - "tracking": "Tracking", + "tracking": "Követés", "not-watching": "Nem megfigyelt", "ignoring": "Mellőzés", - "watching.description": "Notify me of new topics.
Show topics in unread & recent", - "tracking.description": "Shows topics in unread & recent", + "watching.description": "Értesítsen az új válaszokról.
Témakör megjelenítése olvasatlanként.", + "tracking.description": "Témakörök mutatása a friss és olvasatlanok között", "not-watching.description": "Olvasatlan témakörök elrejtése, csak a friss témák mutatása", - "ignoring.description": "Do not show topics in unread & recent", + "ignoring.description": "Olvasatlan és friss témakörök elrejtése", "watching.message": "Most már figyeled ennek a kategóriának és az alkategóriáinak a frissítéseit", - "tracking.message": "You are now tracking updates from this category and all subcategories", + "tracking.message": "Most már figyeled ennek a kategóriának és az alkategóriáinak a frissítéseit", "notwatching.message": "Nem figyeled ennek a kategóriának és alkategóriáinak frissítéseit", "ignoring.message": "Nem kapsz most már frissítéseket erről a kategóriáról és az alkategóriáiról", "watched-categories": "Figyelt kategóriák", diff --git a/public/language/hu/error.json b/public/language/hu/error.json index a5f2a5190a..124ab066db 100644 --- a/public/language/hu/error.json +++ b/public/language/hu/error.json @@ -32,7 +32,7 @@ "folder-exists": "Mappa létezik", "invalid-pagination-value": "Érvénytelen lapozási érték, legalább %1 kell lennie és legfeljebb %2 -nak/nek", "username-taken": "Foglalt felhasználónév", - "email-taken": "Email address is already taken.", + "email-taken": "Ez az email cím már foglalt.", "email-nochange": "The email entered is the same as the email already on file.", "email-invited": "Ez az email cím már meg lett hívva", "email-not-confirmed": "Posting in some categories or topics is enabled once your email is confirmed, please click here to send a confirmation email.", @@ -91,7 +91,7 @@ "category-not-selected": "A kategória nincs kiválasztva.", "too-many-posts": "Csak %1 másodpercenként hozhatsz létre új bejegyzést - kérlek várj egy kicsit mielőtt új bejegyzést tennél közzé", "too-many-posts-newbie": "Új felhasználóként csak egyszer készíthetsz bejegyzést %1 másodpercen belül, amíg el nem éred a %2 szintet - kérlek várj egy kicsit mielőtt új bejegyzést tennél közzé", - "too-many-posts-newbie-minutes": "As a new user, you can only post once every %1 minute(s) until you have earned %2 reputation - please wait before posting again", + "too-many-posts-newbie-minutes": "Új felhasználóként csak egyszer készíthetsz bejegyzést %1 másodpercen belül, amíg el nem éred a %2 szintet - kérlek várj egy kicsit mielőtt új bejegyzést tennél közzé", "already-posting": "Már írsz egy bejegyzést", "tag-too-short": "Kérlek hosszabb címkét adj meg. A címke legalább %1 karaktert kell, hogy tartalmazzon", "tag-too-long": "Kérlek rövidebb címkét adj meg. A címkék nem lehetnek hosszabbak %1 karakternél", @@ -184,10 +184,10 @@ "user-already-flagged": "Már megjelölted ez a felhasználót", "post-flagged-too-many-times": "Ez a bejegyzés már meg lett jelölve egy másik felhasználó által", "user-flagged-too-many-times": "Ez a felhasználó már meg lett jelölve egy másik felhasználó által", - "too-many-post-flags-per-day": "You can only flag %1 post(s) per day", - "too-many-user-flags-per-day": "You can only flag %1 user(s) per day", + "too-many-post-flags-per-day": "Naponta csak %1 bejegyzést jelölhetsz meg", + "too-many-user-flags-per-day": "Naponta csak %1 felhasználót jelölhetsz meg", "cant-flag-privileged": "Nem jelentheted be felhatalmazott felhasználókat vagy a bejegyzéseik tartalmát (moderátor/globális moderátor/adminok)", - "cant-locate-flag-report": "Cannot locate flag report", + "cant-locate-flag-report": "Bejelentés nem található", "self-vote": "Nem szavazhatsz a saját hozzászólásodra", "too-many-upvotes-today": "Naponta csak %1 alkalommal szavazhat pozitívan", "too-many-upvotes-today-user": "Egy felhasználóra naponta csak %1 alkalommal szavazhat pozitívan", @@ -221,7 +221,7 @@ "already-unblocked": "Ennek a felhasználóknak már fel van oldva a tiltása", "no-connection": "Probléma van az internet kapcsolatoddal", "socket-reconnect-failed": "Nem lehet elérni a szervert. Kattints ide az újra próbáláshoz vagy várj egy kicsit", - "invalid-plugin-id": "Invalid plugin ID", + "invalid-plugin-id": "Érvénytelen plugin ID", "plugin-not-whitelisted": "Ez a bővítmény nem telepíthető – csak olyan bővítmények telepíthetőek amiket a NodeBB Package Manager az ACP-n keresztül tud telepíteni", "plugins-set-in-configuration": "You are not allowed to change plugin state as they are defined at runtime (config.json, environmental variables or terminal arguments), please modify the configuration instead.", "theme-not-set-in-configuration": "When defining active plugins in configuration, changing themes requires adding the new theme to the list of active plugins before updating it in the ACP", diff --git a/public/language/hu/flags.json b/public/language/hu/flags.json index 3b46cc7cc4..2c38151dba 100644 --- a/public/language/hu/flags.json +++ b/public/language/hu/flags.json @@ -1,6 +1,6 @@ { "state": "Állapot", - "report": "Report", + "report": "Jelentés", "reports": "Jelentés", "first-reported": "Először jelentve", "no-flags": "Hurrá! Nincs megjelölés.", @@ -9,8 +9,8 @@ "update": "Frissítés", "updated": "Frissítve", "resolved": "Megoldva", - "report-added": "Added", - "report-rescinded": "Rescinded", + "report-added": "Hozzáadva", + "report-rescinded": "Visszavont", "target-purged": "A tartalom amire a jelölő mutat már meg lett tiszítva vagy nem létezik.", "target-aboutme-empty": "This user has no "About Me" set.", diff --git a/public/language/hu/global.json b/public/language/hu/global.json index d268ac6361..eec736ebc7 100644 --- a/public/language/hu/global.json +++ b/public/language/hu/global.json @@ -24,15 +24,15 @@ "cancel": "Cancel", "close": "Bezárás", "pagination": "Lapozás", - "pagination.previouspage": "Previous Page", - "pagination.nextpage": "Next Page", - "pagination.firstpage": "First Page", - "pagination.lastpage": "Last Page", + "pagination.previouspage": "Előző oldal", + "pagination.nextpage": "Következő oldal", + "pagination.firstpage": "Első oldal", + "pagination.lastpage": "Utolsó oldal", "pagination.out-of": "%1 / %2", "pagination.enter-index": "Ugrás a bejegyzés indexére", - "pagination.go-to-page": "Go to page", - "pagination.page-x": "Page %1", - "header.brand-logo": "Brand Logo", + "pagination.go-to-page": "Tovább az oldalra", + "pagination.page-x": "%1. oldal", + "header.brand-logo": "Logó", "header.admin": "Admin", "header.categories": "Kategóriák", "header.recent": "Legutóbbi", @@ -140,12 +140,12 @@ "edited": "Szerkesztett", "disabled": "Letiltva", "select": "Kiválaszt", - "selected": "Selected", + "selected": "Kiválasztva", "copied": "Copied", "user-search-prompt": "Írj be valamit, hogy felhasználókra keress...", "hidden": "Rejtve", "sort": "Rendezés", "actions": "Actions", - "rss-feed": "RSS Feed", - "skip-to-content": "Skip to content" + "rss-feed": "RSS Hírcsatorna", + "skip-to-content": "Ugrás a tartalomra" } \ No newline at end of file diff --git a/public/language/hu/modules.json b/public/language/hu/modules.json index 966ae38ef4..d59eab74e2 100644 --- a/public/language/hu/modules.json +++ b/public/language/hu/modules.json @@ -68,8 +68,8 @@ "chat.in-room": "Ebben a szobában", "chat.kick": "Kirúgás", "chat.show-ip": "IP cím mutatása", - "chat.copy-text": "Copy Text", - "chat.copy-link": "Copy Link", + "chat.copy-text": "Szöveg másolása", + "chat.copy-link": "Link másolása", "chat.owner": "Szoba tulajdonos", "chat.grant-rescind-ownership": "Grant/Rescind Ownership", "chat.system.user-join": "%1 has joined the room ", diff --git a/public/language/hu/notifications.json b/public/language/hu/notifications.json index 43eeda6b5e..e1398d636e 100644 --- a/public/language/hu/notifications.json +++ b/public/language/hu/notifications.json @@ -13,14 +13,14 @@ "all": "Mind", "topics": "Témakör", "tags": "Tags", - "categories": "Categories", + "categories": "Kategóriák", "replies": "Válasz", "chat": "Chat", "group-chat": "Csoport Csevegők", "public-chat": "Public Chats", "follows": "Követés", "upvote": "Kedvelés", - "awards": "Awards", + "awards": "Jutalmak", "new-flags": "Új megjelölés", "my-flags": "Hozzám társított megjelölés", "bans": "Kitiltás", @@ -56,7 +56,7 @@ "user-posted-topic-with-tag-dual": "%1 has posted a new topic with tags %2 and %3", "user-posted-topic-with-tag-triple": "%1 has posted a new topic with tags %2, %3 and %4", "user-posted-topic-with-tag-multiple": "%1 has posted a new topic with tags %2", - "user-posted-topic-in-category": "%1 has posted a new topic in %2", + "user-posted-topic-in-category": "%1 új témakört hozott létre: %2", "user-started-following-you": "%1 elkezdett követni téged.", "user-started-following-you-dual": "%1 és%2 elkezdett követni téged.", "user-started-following-you-triple": "%1, %2 and %3 started following you.", @@ -83,7 +83,7 @@ "notificationType-upvote": "Mikor valaki kedveli a hozzászólásod", "notificationType-new-topic": "Mikor egy követett felhasználód hozzászól", "notificationType-new-topic-with-tag": "When a topic is posted with a tag you follow", - "notificationType-new-topic-in-category": "When a topic is posted in a category you are watching", + "notificationType-new-topic-in-category": "Amikor egy téma a megfigyelt kategóriában jelenik meg.", "notificationType-new-reply": "Mikor egy általad figyelt témakörre válasz érkezik", "notificationType-post-edit": "Mikor egy a megfigyelt témakörön belül módosítanak egy bejegyzést", "notificationType-follow": "Mikor valaki elkezd követni téged", @@ -97,5 +97,5 @@ "notificationType-post-queue": "Mikor egy új hozzászólás várólistára kerül", "notificationType-new-post-flag": "Mikor egy hozzászólás megjelölésre kerül", "notificationType-new-user-flag": "Mikor egy felhasználó megjelölésre kerül", - "notificationType-new-reward": "When you earn a new reward" + "notificationType-new-reward": "Amikor új jutalomban részesülsz" } \ No newline at end of file diff --git a/public/language/hu/post-queue.json b/public/language/hu/post-queue.json index ae86261b30..90062aaf46 100644 --- a/public/language/hu/post-queue.json +++ b/public/language/hu/post-queue.json @@ -3,10 +3,10 @@ "post-queue": "Hozzászólási várósor", "no-queued-posts": "Nincsenek hozzászólások a bejegyzési sorban.", "no-single-post": "The topic or post you are looking for is no longer in the queue. It has likely been approved or deleted already.", - "enabling-help": "The post queue is currently disabled. To enable this feature, go to Settings → Post → Post Queue and enable Post Queue.", + "enabling-help": "A hozzászólási várólista jelenleg Letiltva. A bekapcsoláshoz menj a Beállítások → Hozzászólások → Hozzászólás várólista-hoz és engedélyezd a Hozzászólás várólistát", "back-to-list": "Vissza a bejegyzési sorhoz", - "public-intro": "If you have any queued posts, they will be shown here.", - "public-description": "This forum is configured to automatically queue posts from new accounts, pending moderator approval.
If you have queued posts awaiting approval, you will be able to see them here.", + "public-intro": "Ha vannak várakozó hozzászólások, azok itt fognak megjelenni.", + "public-description": "Ez a fórum úgy van beállítva, hogy az új felhasználók hozzászólásai várólistára kerülnek, amíg a moderátorok jóváhagyják azokat.
Ha vannak jóváhagyásra váró hozzászólásaid, akkor azokat itt láthatod.", "user": "Felhasználó", "when": "Amikor", "category": "Kategória", diff --git a/public/language/hu/rewards.json b/public/language/hu/rewards.json index f923cf1500..459e5f27b3 100644 --- a/public/language/hu/rewards.json +++ b/public/language/hu/rewards.json @@ -1,10 +1,10 @@ { - "awarded-x-reputation": "You have been awarded %1 reputation", - "awarded-group-membership": "You have been added to the group %1", + "awarded-x-reputation": "%1 hírnevet kaptál", + "awarded-group-membership": "Hozzáadtak a %1 csoporthoz.", - "essentials/user.reputation-conditional-value": "(Reputation %1 %2)", - "essentials/user.postcount-conditional-value": "(Post Count %1 %2)", - "essentials/user.lastonline-conditional-value": "(Last Online %1 %2)", - "essentials/user.joindate-conditional-value": "(Join Date %1 %2)", - "essentials/user.daysregistered-conditional-value": "(Days Registered %1 %2)" + "essentials/user.reputation-conditional-value": "(Hírnév %1 %2)", + "essentials/user.postcount-conditional-value": "(Hozzászólások %1 %2)", + "essentials/user.lastonline-conditional-value": "(Utoljára elérhető %1 %2)", + "essentials/user.joindate-conditional-value": "(Csatlakozott %1 %2)", + "essentials/user.daysregistered-conditional-value": "(%1 %2 Napja regisztrált)" } \ No newline at end of file diff --git a/public/language/hu/search.json b/public/language/hu/search.json index 699107e1f5..7c9147d1be 100644 --- a/public/language/hu/search.json +++ b/public/language/hu/search.json @@ -7,7 +7,7 @@ "in-titles": "Címekben", "in-titles-posts": "Címekben és bejegyzésekben", "in-posts": "Bejegyzésekben", - "in-bookmarks": "In bookmarks", + "in-bookmarks": "Könyvjelzőkben", "in-categories": "Kategóriákban", "in-users": "Felhasználóknál", "in-tags": "Címkékben", diff --git a/public/language/hu/social.json b/public/language/hu/social.json index 2ba690a187..b0beb0b1cf 100644 --- a/public/language/hu/social.json +++ b/public/language/hu/social.json @@ -7,6 +7,6 @@ "sign-up-with-google": "Sign up with Google", "log-in-with-facebook": "Log in with Facebook", "continue-with-facebook": "Continue with Facebook", - "sign-in-with-linkedin": "Sign in with LinkedIn", - "sign-up-with-linkedin": "Sign up with LinkedIn" + "sign-in-with-linkedin": "Belépés LinkedIn-el", + "sign-up-with-linkedin": "Regisztráció LinkedIn-el" } \ No newline at end of file diff --git a/public/language/hu/tags.json b/public/language/hu/tags.json index 519311bf72..95a122d70c 100644 --- a/public/language/hu/tags.json +++ b/public/language/hu/tags.json @@ -3,7 +3,7 @@ "no-tag-topics": "Nem létezik témakör ezzel a címkével.", "no-tags-found": "Nem találhatók címkék", "tags": "Címkék", - "enter-tags-here": "Enter tags, %1 - %2 characters.", + "enter-tags-here": "Adj hozzám címkéket %1 - %2 karakter között.", "enter-tags-here-short": "Címke megadása...", "no-tags": "Még nincsenek címkék.", "select-tags": "Címkék kiválasztása", diff --git a/public/language/hu/themes/harmony.json b/public/language/hu/themes/harmony.json index 4e75b9f716..545972cc95 100644 --- a/public/language/hu/themes/harmony.json +++ b/public/language/hu/themes/harmony.json @@ -3,17 +3,17 @@ "skins": "Skins", "collapse": "Collapse", "expand": "Expand", - "sidebar-toggle": "Sidebar Toggle", + "sidebar-toggle": "Oldalsáv kapcsoló", "login-register-to-search": "Login or register to search.", "settings.title": "Theme settings", "settings.enableQuickReply": "Enable quick reply", - "settings.enableBreadcrumbs": "Enable breadcrumbs", + "settings.enableBreadcrumbs": "Kenyérmorzsa linkek engedélyezése", "settings.centerHeaderElements": "Center header elements", "settings.mobileTopicTeasers": "Show topic teasers on mobile", "settings.stickyToolbar": "Sticky toolbar", "settings.stickyToolbar.help": "The toolbar on topic and category pages will stick to the top of the page", "settings.autohideBottombar": "Auto hide bottom bar", "settings.autohideBottombar.help": "The bottom bar on mobile view will be hidden when the page is scrolled down", - "settings.openSidebars": "Open sidebars", + "settings.openSidebars": "Oldalsáv nyitása", "settings.chatModals": "Enable chat modals" } \ No newline at end of file diff --git a/public/language/hu/topic.json b/public/language/hu/topic.json index 3a9c408503..052985eb72 100644 --- a/public/language/hu/topic.json +++ b/public/language/hu/topic.json @@ -15,7 +15,7 @@ "replies-to-this-post": "%1 válasz", "one-reply-to-this-post": "1 válasz", "last-reply-time": "Utolsó válasz", - "reply-options": "Reply options", + "reply-options": "Válasz opciók", "reply-as-topic": "Válasz témakörként", "guest-login-reply": "Lépj be a válaszoláshoz", "login-to-view": "🔒 Jelentkezz be, hogy megtekinthesd", @@ -35,7 +35,7 @@ "pinned": "Rögzített", "pinned-with-expiry": "Kitűzve eddig: %1", "scheduled": "Időzített", - "deleted": "Deleted", + "deleted": "Törölve", "moved": "Áthelyezett", "moved-from": "Áthelyezés innen %1", "copy-code": "Copy Code", @@ -182,8 +182,8 @@ "sort-by": "Rendezés", "oldest-to-newest": "Régebbiek elől", "newest-to-oldest": "Újabbak elől", - "recently-replied": "Recently Replied", - "recently-created": "Recently Created", + "recently-replied": "Nemrég megválaszolt", + "recently-created": "Nemrég létrehozott", "most-votes": "Legtöbb szavazat", "most-posts": "Legtöbb bejegyzés", "most-views": "Legtöbb Megtekintés", @@ -208,13 +208,13 @@ "last-post": "Utolsó bejegyzés", "go-to-my-next-post": "Ugrás a következő bejegyzésemre", "no-more-next-post": "Neked nincs több bejegyzésed ebben a témakörben", - "open-composer": "Open composer", + "open-composer": "Composer megnyitása", "post-quick-reply": "Gyors válasz", "navigator.index": "Bejegyzés %1 / %2", "navigator.unread": "%1 olvasatlan", - "upvote-post": "Upvote post", - "downvote-post": "Downvote post", - "post-tools": "Post tools", - "unread-posts-link": "Unread posts link", - "thumb-image": "Topic thumbnail image" + "upvote-post": "Bejegyzés kedvelése", + "downvote-post": "Bejegyzés nem kedvelése", + "post-tools": "Bejegyzés eszközök", + "unread-posts-link": "Olvasatlan bejegyzés link", + "thumb-image": "Téma bélyegkép" } \ No newline at end of file diff --git a/public/language/hu/unread.json b/public/language/hu/unread.json index 292d092bd1..a1ed4bd1a8 100644 --- a/public/language/hu/unread.json +++ b/public/language/hu/unread.json @@ -3,7 +3,7 @@ "no-unread-topics": "Nincs olvasatlan témakör.", "load-more": "További betöltése", "mark-as-read": "Megjelölés olvasottként", - "mark-as-unread": "Mark as Unread", + "mark-as-unread": "Megjelölés olvasatlanként", "selected": "Kiválasztva", "all": "Mind", "all-categories": "Minden kategória", diff --git a/public/language/hu/user.json b/public/language/hu/user.json index 909a322c52..8455aef483 100644 --- a/public/language/hu/user.json +++ b/public/language/hu/user.json @@ -1,5 +1,5 @@ { - "user-menu": "User menu", + "user-menu": "Felhasználói menü", "banned": "Kitiltva", "muted": "Némítva", "offline": "Nem elérhető", @@ -142,10 +142,10 @@ "follow-topics-you-create": "Témakör figyelése, amit létrehozol", "grouptitle": "Csoport címe", "group-order-help": "Válassz ki egy csoportot és használd a nyilakat, hogy elrendezd a címeket", - "show-group-title": "Show group title", - "hide-group-title": "Hide group title", - "order-group-up": "Order group up", - "order-group-down": "Order group down", + "show-group-title": "Csoportcím mutatása", + "hide-group-title": "Csoportcím elrejtése", + "order-group-up": "Csoport mozgatása feljebb", + "order-group-down": "Csoport mozgatása lejjebb", "no-group-title": "Nincs csoportcím", "select-skin": "Válassz egy kinézetet", "default": "Default (%1)", diff --git a/public/language/hy/admin/advanced/events.json b/public/language/hy/admin/advanced/events.json index 7c7155341a..1e0e497766 100644 --- a/public/language/hy/admin/advanced/events.json +++ b/public/language/hy/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Իրադարձության տեսակը", "filter-start": "Մեկնարկի ամսաթիվ", "filter-end": "Ավարտի ամսաթիվ", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Մեկ էջի համար" } \ No newline at end of file diff --git a/public/language/id/admin/advanced/events.json b/public/language/id/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/id/admin/advanced/events.json +++ b/public/language/id/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ 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 39b1f2f802..9bf4a8d612 100644 --- a/public/language/it/admin/advanced/events.json +++ b/public/language/it/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Tipo evento", "filter-start": "Data d'inizio", "filter-end": "Data di fine", + "filter-user": "Filtra per utente", + "filter-user.placeholder": "Digita il nome utente da filtrare...", + "filter-group": "Filtra per gruppo", + "filter-group.placeholder": "Digita il nome del gruppo da filtrare...", "filter-per-page": "Per pagina" } \ No newline at end of file diff --git a/public/language/ja/admin/advanced/events.json b/public/language/ja/admin/advanced/events.json index eec8144ea9..cde8111fca 100644 --- a/public/language/ja/admin/advanced/events.json +++ b/public/language/ja/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/ko/admin/advanced/events.json b/public/language/ko/admin/advanced/events.json index a321faae97..d5e9738454 100644 --- a/public/language/ko/admin/advanced/events.json +++ b/public/language/ko/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "이벤트 유형", "filter-start": "시작 날짜", "filter-end": "종료 날짜", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "페이지 당" } \ No newline at end of file diff --git a/public/language/lt/admin/advanced/events.json b/public/language/lt/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/lt/admin/advanced/events.json +++ b/public/language/lt/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/lv/admin/advanced/events.json b/public/language/lv/admin/advanced/events.json index 1e1a1ce393..5569812a85 100644 --- a/public/language/lv/admin/advanced/events.json +++ b/public/language/lv/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/ms/admin/advanced/events.json b/public/language/ms/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/ms/admin/advanced/events.json +++ b/public/language/ms/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/nb/admin/advanced/events.json b/public/language/nb/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/nb/admin/advanced/events.json +++ b/public/language/nb/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/nl/admin/advanced/events.json b/public/language/nl/admin/advanced/events.json index 3c08c8484b..8ef647489e 100644 --- a/public/language/nl/admin/advanced/events.json +++ b/public/language/nl/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start datum", "filter-end": "Eind datum", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per pagina" } \ No newline at end of file diff --git a/public/language/pl/admin/advanced/events.json b/public/language/pl/admin/advanced/events.json index 10f00cd1ba..e8370e863f 100644 --- a/public/language/pl/admin/advanced/events.json +++ b/public/language/pl/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Typ zdarzenia", "filter-start": "Data początkowa", "filter-end": "Data końcowa", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Na stronę" } \ No newline at end of file diff --git a/public/language/pt-BR/admin/advanced/events.json b/public/language/pt-BR/admin/advanced/events.json index 8e8a5c9e10..6e96bda4e9 100644 --- a/public/language/pt-BR/admin/advanced/events.json +++ b/public/language/pt-BR/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Tipo de Evento", "filter-start": "Data de Início", "filter-end": "Data de Fim", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Por Página" } \ No newline at end of file diff --git a/public/language/pt-PT/admin/advanced/events.json b/public/language/pt-PT/admin/advanced/events.json index cf244ff23c..3e76845f53 100644 --- a/public/language/pt-PT/admin/advanced/events.json +++ b/public/language/pt-PT/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Tipo de Evento", "filter-start": "Data de Início", "filter-end": "Data de Fim", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Por Página" } \ No newline at end of file diff --git a/public/language/ro/admin/advanced/events.json b/public/language/ro/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/ro/admin/advanced/events.json +++ b/public/language/ro/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/ru/admin/advanced/events.json b/public/language/ru/admin/advanced/events.json index 76d76ae807..f1d1c69dea 100644 --- a/public/language/ru/admin/advanced/events.json +++ b/public/language/ru/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Тип события", "filter-start": "Дата начала", "filter-end": "Дата окончания", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Записей на страницу" } \ No newline at end of file diff --git a/public/language/rw/admin/advanced/events.json b/public/language/rw/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/rw/admin/advanced/events.json +++ b/public/language/rw/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/sc/admin/advanced/events.json b/public/language/sc/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/sc/admin/advanced/events.json +++ b/public/language/sc/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/sk/admin/advanced/events.json b/public/language/sk/admin/advanced/events.json index dd57fa95a9..526def47bb 100644 --- a/public/language/sk/admin/advanced/events.json +++ b/public/language/sk/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/sl/admin/advanced/events.json b/public/language/sl/admin/advanced/events.json index 896da0bd3a..094091c9a3 100644 --- a/public/language/sl/admin/advanced/events.json +++ b/public/language/sl/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Tip dogodka", "filter-start": "Začetni datum", "filter-end": "Končni datum", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Na stran" } \ No newline at end of file diff --git a/public/language/sq-AL/admin/advanced/events.json b/public/language/sq-AL/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/sq-AL/admin/advanced/events.json +++ b/public/language/sq-AL/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/sr/admin/advanced/events.json b/public/language/sr/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/sr/admin/advanced/events.json +++ b/public/language/sr/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/sv/admin/advanced/events.json b/public/language/sv/admin/advanced/events.json index 9327eef8d3..a249bb9721 100644 --- a/public/language/sv/admin/advanced/events.json +++ b/public/language/sv/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/th/admin/advanced/events.json b/public/language/th/admin/advanced/events.json index 52746558d3..57efa22730 100644 --- a/public/language/th/admin/advanced/events.json +++ b/public/language/th/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/tr/admin/advanced/events.json b/public/language/tr/admin/advanced/events.json index 4cc97c46f4..4b626ccfd7 100644 --- a/public/language/tr/admin/advanced/events.json +++ b/public/language/tr/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Aktivite türü", "filter-start": "Başlangıç zamanı", "filter-end": "Bitiş zamanı", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Sayfa Başına" } \ No newline at end of file diff --git a/public/language/uk/admin/advanced/events.json b/public/language/uk/admin/advanced/events.json index bc7a31a655..b53d8972a5 100644 --- a/public/language/uk/admin/advanced/events.json +++ b/public/language/uk/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Event Type", "filter-start": "Start Date", "filter-end": "End Date", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Per Page" } \ No newline at end of file diff --git a/public/language/vi/admin/advanced/events.json b/public/language/vi/admin/advanced/events.json index 47a1c8e065..8113569d43 100644 --- a/public/language/vi/admin/advanced/events.json +++ b/public/language/vi/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "Loại Sự Kiện", "filter-start": "Ngày Bắt Đầu", "filter-end": "Ngày Kết Thúc", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "Mỗi Trang" } \ 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 7f18de230b..7652d9e4c8 100644 --- a/public/language/zh-CN/admin/advanced/database.json +++ b/public/language/zh-CN/admin/advanced/database.json @@ -17,7 +17,7 @@ "mongo.file-size": "文件大小", "mongo.resident-memory": "驻留内存", "mongo.virtual-memory": "虚拟内存", - "mongo.mapped-memory": "Mapped Memory", + "mongo.mapped-memory": "已映射内存", "mongo.bytes-in": "字节输入", "mongo.bytes-out": "字节输出", "mongo.num-requests": "请求数量", diff --git a/public/language/zh-CN/admin/advanced/events.json b/public/language/zh-CN/admin/advanced/events.json index 76ebdaffc5..b6c3eba1c4 100644 --- a/public/language/zh-CN/admin/advanced/events.json +++ b/public/language/zh-CN/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "事件类型", "filter-start": "开始时间", "filter-end": "结束时间", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "每页" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/dashboard.json b/public/language/zh-CN/admin/dashboard.json index 69b1f33da5..5cea605a5c 100644 --- a/public/language/zh-CN/admin/dashboard.json +++ b/public/language/zh-CN/admin/dashboard.json @@ -96,6 +96,6 @@ "clear-search-history": "清空搜索历史", "clear-search-history-confirm": "您确定您要删除搜索历史吗?", "search-term": "Term", - "search-count": "Count", - "view-all": "View all" + "search-count": "计数", + "view-all": "浏览全部" } diff --git a/public/language/zh-CN/admin/extend/widgets.json b/public/language/zh-CN/admin/extend/widgets.json index deef7aa881..d88d368e44 100644 --- a/public/language/zh-CN/admin/extend/widgets.json +++ b/public/language/zh-CN/admin/extend/widgets.json @@ -5,7 +5,7 @@ "none-installed": "未发现窗口部件!请在插件控制面板中启用必要的窗口部件插件。", "clone-from": "从窗口部件克隆", "containers.available": "可用的容器", - "containers.explanation": "Drag and drop on top of any widget", + "containers.explanation": "拖放任意组件到顶部", "containers.none": "无", "container.well": "Well", "container.jumbotron": "超大屏幕", @@ -30,6 +30,6 @@ "start-date": "开始日期", "end-date": "结束日期", "hide-on-mobile": "在移动端隐藏", - "hide-drafts": "Hide drafts", - "show-drafts": "Show drafts" + "hide-drafts": "隐藏草稿", + "show-drafts": "显示草稿" } \ No newline at end of file diff --git a/public/language/zh-CN/admin/manage/privileges.json b/public/language/zh-CN/admin/manage/privileges.json index fddda3f2a8..7bb5c09667 100644 --- a/public/language/zh-CN/admin/manage/privileges.json +++ b/public/language/zh-CN/admin/manage/privileges.json @@ -8,7 +8,7 @@ "edit-privileges": "编辑权限", "select-clear-all": "选择/清除 全部", "chat": "对话", - "chat-with-privileged": "Chat with Privileged", + "chat-with-privileged": "使用特权聊天", "upload-images": "上传图片", "upload-files": "上传文件", "signature": "签名档", diff --git a/public/language/zh-CN/admin/manage/users.json b/public/language/zh-CN/admin/manage/users.json index 52d056839a..e474cc27d3 100644 --- a/public/language/zh-CN/admin/manage/users.json +++ b/public/language/zh-CN/admin/manage/users.json @@ -122,26 +122,26 @@ "alerts.x-users-found": "找到 %1 位用户(耗时 %2 秒)", "alerts.select-a-single-user-to-change-email": "Select a single user to change email", "export": "Export", - "export-users-fields-title": "Select CSV Fields", - "export-field-email": "Email", - "export-field-username": "Username", - "export-field-uid": "UID", + "export-users-fields-title": "选择CSV文件", + "export-field-email": "邮件", + "export-field-username": "用户名", + "export-field-uid": "用户ID", "export-field-ip": "IP", - "export-field-joindate": "Join date", - "export-field-lastonline": "Last Online", - "export-field-lastposttime": "Last Post Time", - "export-field-reputation": "Reputation", - "export-field-postcount": "Post Count", - "export-field-topiccount": "Topic Count", - "export-field-profileviews": "Profile Views", - "export-field-followercount": "Follower Count", - "export-field-followingcount": "Following Count", - "export-field-fullname": "Full Name", - "export-field-website": "Website", - "export-field-location": "Location", - "export-field-birthday": "Birthday", - "export-field-signature": "Signature", - "export-field-aboutme": "About Me", + "export-field-joindate": "注册日期", + "export-field-lastonline": "最后在线", + "export-field-lastposttime": "最后发帖时间", + "export-field-reputation": "声望", + "export-field-postcount": "发帖数", + "export-field-topiccount": "发帖数", + "export-field-profileviews": "资料浏览", + "export-field-followercount": "粉丝数", + "export-field-followingcount": "关注数", + "export-field-fullname": "全名", + "export-field-website": "网站", + "export-field-location": "位置", + "export-field-birthday": "生日", + "export-field-signature": "签名档", + "export-field-aboutme": "关于我", "export-users-started": "导出用户为 csv,这可能需要一些时间。当导出完成时你会收到通知。", "export-users-completed": "用户列表已被导出为 CSV 文件,点击以下载。", diff --git a/public/language/zh-CN/admin/settings/post.json b/public/language/zh-CN/admin/settings/post.json index b123295c1e..92e8c1b2d8 100644 --- a/public/language/zh-CN/admin/settings/post.json +++ b/public/language/zh-CN/admin/settings/post.json @@ -4,11 +4,11 @@ "sorting.post-default": "默认帖子排序", "sorting.oldest-to-newest": "从旧到新", "sorting.newest-to-oldest": "从新到旧", - "sorting.recently-replied": "Recently Replied", - "sorting.recently-created": "Recently Created", + "sorting.recently-replied": "最近回复", + "sorting.recently-created": "最近创建", "sorting.most-votes": "最多点赞", "sorting.most-posts": "最多回复", - "sorting.most-views": "Most Views", + "sorting.most-views": "最多浏览", "sorting.topic-default": "默认主题排序", "length": "帖子字数", "post-queue": "发帖队列", diff --git a/public/language/zh-CN/admin/settings/reputation.json b/public/language/zh-CN/admin/settings/reputation.json index 0573f1db49..6bbf2f50ce 100644 --- a/public/language/zh-CN/admin/settings/reputation.json +++ b/public/language/zh-CN/admin/settings/reputation.json @@ -23,12 +23,12 @@ "flags.limit-per-target": "可以举报某事物的最大次数", "flags.limit-per-target-placeholder": "默认:0", "flags.limit-per-target-help": "当一个帖子或用户被举报不止一次时,每个额外的举报会被认为是一个“报告”并附加到原来的举报中。设置此选项为非零的数以限制一个帖子或用户能被举报的次数。", - "flags.limit-post-flags-per-day": "Maximum number of times a user can flag posts in a day", - "flags.limit-post-flags-per-day-help": "Set to 0 to disable, (default: 10)", - "flags.limit-user-flags-per-day": "Maximum number of times a user can flag users in a day", - "flags.limit-user-flags-per-day-help": "Set to 0 to disable, (default: 10)", - "flags.auto-flag-on-downvote-threshold": "Number of downvotes to auto flag posts", - "flags.auto-flag-on-downvote-threshold-help": "Set to 0 to disable, (default: 0)", + "flags.limit-post-flags-per-day": "用户每日最多举报帖子次数", + "flags.limit-post-flags-per-day-help": "设置为0表示禁止(默认:10)", + "flags.limit-user-flags-per-day": "用户每日可以举报人数", + "flags.limit-user-flags-per-day-help": "设置为0表示禁止(默认:10)", + "flags.auto-flag-on-downvote-threshold": "被踩多少次数自动转为举报帖子", + "flags.auto-flag-on-downvote-threshold-help": "设置为0表示禁止(默认:10)", "flags.auto-resolve-on-ban": "当用户被封禁时,自动解决全部此用户提交的举报", "flags.action-on-resolve": "当举报被解决时做以下事", "flags.action-on-reject": "当举报被拒绝时做以下事", diff --git a/public/language/zh-CN/admin/settings/user.json b/public/language/zh-CN/admin/settings/user.json index 925f9ff00c..045919aab7 100644 --- a/public/language/zh-CN/admin/settings/user.json +++ b/public/language/zh-CN/admin/settings/user.json @@ -79,14 +79,14 @@ "follow-replied-topics": "关注您回复的主题", "default-notification-settings": "默认通知设置", "categoryWatchState": "默认版块关注状态", - "categoryWatchState.tracking": "Tracking", + "categoryWatchState.tracking": "跟踪", "categoryWatchState.notwatching": "未关注", "categoryWatchState.ignoring": "已忽略", - "restrictions-new": "New User Restrictions", - "restrictions.rep-threshold": "Reputation threshold before these restrictions are lifted", - "restrictions.seconds-between-new": "Seconds between posts for new users", - "restrictions.seconds-before-new": "Seconds before a new user can make their first post", - "restrictions.seconds-edit-after-new": "Number of seconds a post remains editable for new users (set to 0 to disable)", - "restrictions.milliseconds-between-messages": "Time between chat messages for new users (ms)", - "restrictions.groups-exempt-from-new-user-restrictions": "Select groups that should be exempt from the new user restrictions" + "restrictions-new": "新用户限制", + "restrictions.rep-threshold": "取消发帖间隔限制所需的声望值", + "restrictions.seconds-between-new": "新用户发布帖子间隔的秒数", + "restrictions.seconds-before-new": "新用户多少秒后可以发第一帖", + "restrictions.seconds-edit-after-new": "帖子保持可编辑的秒数(设置为 0 表示禁用)", + "restrictions.milliseconds-between-messages": "聊天信息间的毫秒数", + "restrictions.groups-exempt-from-new-user-restrictions": "选择不受新用户限制的分组" } diff --git a/public/language/zh-CN/aria.json b/public/language/zh-CN/aria.json index 6f023dcae0..c69f1844a9 100644 --- a/public/language/zh-CN/aria.json +++ b/public/language/zh-CN/aria.json @@ -1,8 +1,8 @@ { - "post-sort-option": "Post sort option, %1", - "topic-sort-option": "Topic sort option, %1", - "user-avatar-for": "User avatar for %1", - "user-watched-tags": "User watched tags", - "delete-upload-button": "Delete upload button", - "group-page-link-for": "Group page link for %1" + "post-sort-option": "帖子分类选项,1%", + "topic-sort-option": "主题分类选项,%1", + "user-avatar-for": "用户头像%1", + "user-watched-tags": "用户关注标签", + "delete-upload-button": "删除上传按钮", + "group-page-link-for": "群组页面链接%1" } \ No newline at end of file diff --git a/public/language/zh-CN/category.json b/public/language/zh-CN/category.json index 64fd876938..5b8301fcf6 100644 --- a/public/language/zh-CN/category.json +++ b/public/language/zh-CN/category.json @@ -10,15 +10,15 @@ "watch": "关注", "ignore": "忽略", "watching": "已关注", - "tracking": "Tracking", + "tracking": "跟踪", "not-watching": "未关注", "ignoring": "已忽略", - "watching.description": "Notify me of new topics.
Show topics in unread & recent", - "tracking.description": "Shows topics in unread & recent", + "watching.description": "有新主题时通知我。
在未读/最近主题中显示。", + "tracking.description": "显示未读和最近的主题", "not-watching.description": "不显示未读主题,显示最近主题", - "ignoring.description": "Do not show topics in unread & recent", + "ignoring.description": "不在未读和最近主题显示", "watching.message": "您关注了此版块和全部子版块的动态。", - "tracking.message": "You are now tracking updates from this category and all subcategories", + "tracking.message": "您关注了此版块和全部子版块的动态。", "notwatching.message": "您未关注了此版块和全部子版块的动态。", "ignoring.message": "您未关注此版块和全部子版块的动态。", "watched-categories": "已关注的版块", diff --git a/public/language/zh-CN/error.json b/public/language/zh-CN/error.json index b7c794e479..4b4f00050b 100644 --- a/public/language/zh-CN/error.json +++ b/public/language/zh-CN/error.json @@ -32,7 +32,7 @@ "folder-exists": "文件夹已存在", "invalid-pagination-value": "无效的分页数值,必须介于 %1 和 %2 之间", "username-taken": "此用户名已被占用", - "email-taken": "Email address is already taken.", + "email-taken": "邮箱地址已被注册", "email-nochange": "输入的邮件地址和已存档的邮件地址相同。", "email-invited": "已通过电子邮件进行邀请", "email-not-confirmed": "您需要验证您的邮箱后才能在版块或主题中发布帖子,请点击此处以发送验证邮件。", @@ -91,7 +91,7 @@ "category-not-selected": "未选择版块。", "too-many-posts": "发帖需要间隔 %1 秒以上 - 请稍候再发帖", "too-many-posts-newbie": "因为您是新用户,所以限制每隔 %1 秒才能发帖一次,直到您有 %2 点声望为止 —— 请稍候再发帖", - "too-many-posts-newbie-minutes": "As a new user, you can only post once every %1 minute(s) until you have earned %2 reputation - please wait before posting again", + "too-many-posts-newbie-minutes": "因为您是新用户,所以限制每隔 %1 秒才能发帖一次,直到您有 %2 点声望为止 —— 请稍候再发帖", "already-posting": "您已在发布帖子", "tag-too-short": "请输入一个更长的标签。标签应当包含不少于 %1 个字符", "tag-too-long": "请输入一个更短的标签。标签不能超过 %1 个字符", @@ -184,10 +184,10 @@ "user-already-flagged": "您已举报此用户", "post-flagged-too-many-times": "此贴已被其他用户举报", "user-flagged-too-many-times": "此用户已被其他用户举报", - "too-many-post-flags-per-day": "You can only flag %1 post(s) per day", - "too-many-user-flags-per-day": "You can only flag %1 user(s) per day", + "too-many-post-flags-per-day": "你每日可以举报%1 个帖子", + "too-many-user-flags-per-day": "你每日可以举报 %1个用户", "cant-flag-privileged": "您不能举报特权用户(版主/全局版主/管理员)的内容或资料", - "cant-locate-flag-report": "Cannot locate flag report", + "cant-locate-flag-report": "无法确定举报报告", "self-vote": "您不能对您自己的帖子投票", "too-many-upvotes-today": "您每天仅可进行 %1 次顶贴", "too-many-upvotes-today-user": "您每天只能对一个用户顶 %1 次", @@ -221,7 +221,7 @@ "already-unblocked": "此用户已被取消屏蔽", "no-connection": "您的网络连接似乎存在问题", "socket-reconnect-failed": "目前无法连接到服务器。请点击这里重试,或稍后再试", - "invalid-plugin-id": "Invalid plugin ID", + "invalid-plugin-id": "无效插件ID", "plugin-not-whitelisted": "无法安装插件 – 只有被NodeBB包管理器列入白名单的插件才能通过ACP安装。", "plugins-set-in-configuration": "您不能修改插件状态因为它们在运行时中被定义(config.json,环境变量或终端选项),请转而修改配置。", "theme-not-set-in-configuration": "在配置中定义活跃的插件时,需要先将新主题加入活跃插件的列表,才能在管理员控制面板中修改主题", diff --git a/public/language/zh-CN/flags.json b/public/language/zh-CN/flags.json index 63b43be5ac..a0891c0768 100644 --- a/public/language/zh-CN/flags.json +++ b/public/language/zh-CN/flags.json @@ -1,6 +1,6 @@ { "state": "状态", - "report": "Report", + "report": "报告", "reports": "报告", "first-reported": "首次报告", "no-flags": "啊哈!没发现任何的举报。", @@ -9,8 +9,8 @@ "update": "更新", "updated": "已更新", "resolved": "已解决", - "report-added": "Added", - "report-rescinded": "Rescinded", + "report-added": "已添加", + "report-rescinded": "已撤销", "target-purged": "被举报的内容已经被清除,不再可用。", "target-aboutme-empty": "这个用户没有设置 "关于我" 。", diff --git a/public/language/zh-CN/global.json b/public/language/zh-CN/global.json index ab6ccbb36d..6055623934 100644 --- a/public/language/zh-CN/global.json +++ b/public/language/zh-CN/global.json @@ -140,12 +140,12 @@ "edited": "已编辑", "disabled": "禁用", "select": "选择", - "selected": "Selected", + "selected": "已选", "copied": "已复制", "user-search-prompt": "输入以查找用户", "hidden": "隐藏", "sort": "排序", "actions": "操作", - "rss-feed": "RSS Feed", - "skip-to-content": "Skip to content" + "rss-feed": "RSS 订阅", + "skip-to-content": "跳转至内容" } \ No newline at end of file diff --git a/public/language/zh-CN/notifications.json b/public/language/zh-CN/notifications.json index 5356a0be4c..981482c16c 100644 --- a/public/language/zh-CN/notifications.json +++ b/public/language/zh-CN/notifications.json @@ -13,14 +13,14 @@ "all": "所有", "topics": "主题", "tags": "Tags", - "categories": "Categories", + "categories": "版块", "replies": "回复", "chat": "聊天", "group-chat": "群聊", "public-chat": "Public Chats", "follows": "关注", "upvote": "顶", - "awards": "Awards", + "awards": "奖励", "new-flags": "新举报", "my-flags": "指派举报给我", "bans": "封禁", @@ -56,7 +56,7 @@ "user-posted-topic-with-tag-dual": "%1 has posted a new topic with tags %2 and %3", "user-posted-topic-with-tag-triple": "%1 has posted a new topic with tags %2, %3 and %4", "user-posted-topic-with-tag-multiple": "%1 has posted a new topic with tags %2", - "user-posted-topic-in-category": "%1 has posted a new topic in %2", + "user-posted-topic-in-category": "%1 发表了新主题:%2", "user-started-following-you": "%1关注了您。", "user-started-following-you-dual": "%1%2 关注了您。", "user-started-following-you-triple": "%1, %2 and %3 started following you.", @@ -83,7 +83,7 @@ "notificationType-upvote": "当有人顶了我的帖子时", "notificationType-new-topic": "当您关注的人发布了主题时", "notificationType-new-topic-with-tag": "When a topic is posted with a tag you follow", - "notificationType-new-topic-in-category": "When a topic is posted in a category you are watching", + "notificationType-new-topic-in-category": "当你关注的版块有主题发布时", "notificationType-new-reply": "当您正在查看的主题中有新回复时", "notificationType-post-edit": "当您关注的主题有帖子被编辑时", "notificationType-follow": "当有人关注您时", @@ -97,5 +97,5 @@ "notificationType-post-queue": "当有新帖子等待审核时", "notificationType-new-post-flag": "当有新的帖子举报时", "notificationType-new-user-flag": "当有新的用户信息举报时", - "notificationType-new-reward": "When you earn a new reward" + "notificationType-new-reward": "当你获得新奖励时" } \ No newline at end of file diff --git a/public/language/zh-CN/post-queue.json b/public/language/zh-CN/post-queue.json index ad4df11d34..7d318866e8 100644 --- a/public/language/zh-CN/post-queue.json +++ b/public/language/zh-CN/post-queue.json @@ -5,8 +5,8 @@ "no-single-post": "您正在查看的主题或帖子已经不在队列中。它可能已经被批准或删除。", "enabling-help": "The post queue is currently disabled. To enable this feature, go to Settings → Post → Post Queue and enable Post Queue.", "back-to-list": "回到发帖队列", - "public-intro": "If you have any queued posts, they will be shown here.", - "public-description": "This forum is configured to automatically queue posts from new accounts, pending moderator approval.
If you have queued posts awaiting approval, you will be able to see them here.", + "public-intro": "如果你有帖子等待发布,它们会显示在这里", + "public-description": "本论坛设置为新用户帖子进入发布队列,等待版主审核。
如果你有帖子等待发布,它们会显示在这里。", "user": "用户", "when": "当", "category": "版块", diff --git a/public/language/zh-CN/rewards.json b/public/language/zh-CN/rewards.json index f923cf1500..dbc21866b0 100644 --- a/public/language/zh-CN/rewards.json +++ b/public/language/zh-CN/rewards.json @@ -1,10 +1,10 @@ { - "awarded-x-reputation": "You have been awarded %1 reputation", - "awarded-group-membership": "You have been added to the group %1", + "awarded-x-reputation": "你已经获得%1声望", + "awarded-group-membership": "你已加入群组%1", - "essentials/user.reputation-conditional-value": "(Reputation %1 %2)", - "essentials/user.postcount-conditional-value": "(Post Count %1 %2)", - "essentials/user.lastonline-conditional-value": "(Last Online %1 %2)", - "essentials/user.joindate-conditional-value": "(Join Date %1 %2)", - "essentials/user.daysregistered-conditional-value": "(Days Registered %1 %2)" + "essentials/user.reputation-conditional-value": "(声望%1 %2)", + "essentials/user.postcount-conditional-value": "(帖子数%1 %2)", + "essentials/user.lastonline-conditional-value": "(最后在线时间%1 %2)", + "essentials/user.joindate-conditional-value": "(注册日期%1 %2)", + "essentials/user.daysregistered-conditional-value": "(注册天数%1 %2)" } \ No newline at end of file diff --git a/public/language/zh-CN/social.json b/public/language/zh-CN/social.json index ae8a4a5874..ff9388001d 100644 --- a/public/language/zh-CN/social.json +++ b/public/language/zh-CN/social.json @@ -7,6 +7,6 @@ "sign-up-with-google": "通过 Google 注册", "log-in-with-facebook": "通过 Facebook 登录", "continue-with-facebook": "继续使用 Facebook 登录", - "sign-in-with-linkedin": "Sign in with LinkedIn", - "sign-up-with-linkedin": "Sign up with LinkedIn" + "sign-in-with-linkedin": "通过LinkedIn登录", + "sign-up-with-linkedin": "通过LinkedIn注册" } \ No newline at end of file diff --git a/public/language/zh-CN/tags.json b/public/language/zh-CN/tags.json index e892b5bddb..d68b9825fa 100644 --- a/public/language/zh-CN/tags.json +++ b/public/language/zh-CN/tags.json @@ -3,7 +3,7 @@ "no-tag-topics": "此标签还没有主题帖。", "no-tags-found": "没有找到标签", "tags": "标签", - "enter-tags-here": "Enter tags, %1 - %2 characters.", + "enter-tags-here": "输入标签,限制%1 - %2个字符", "enter-tags-here-short": "输入标签...", "no-tags": "尚无标签。", "select-tags": "选择标签", diff --git a/public/language/zh-CN/themes/harmony.json b/public/language/zh-CN/themes/harmony.json index 9a657d723c..62c9c1b4c6 100644 --- a/public/language/zh-CN/themes/harmony.json +++ b/public/language/zh-CN/themes/harmony.json @@ -3,17 +3,17 @@ "skins": "皮肤", "collapse": "折叠", "expand": "展开", - "sidebar-toggle": "Sidebar Toggle", + "sidebar-toggle": "侧栏滚动", "login-register-to-search": "登录或注册以进行搜索。", "settings.title": "主题设置", "settings.enableQuickReply": "启用快速回复", - "settings.enableBreadcrumbs": "Enable breadcrumbs", + "settings.enableBreadcrumbs": "启用面包屑导航", "settings.centerHeaderElements": "标题元素居中", "settings.mobileTopicTeasers": "在移动设备显示话题预告", "settings.stickyToolbar": "附着工具条", "settings.stickyToolbar.help": "主题和类别页面上的工具条将附着在页面顶部", "settings.autohideBottombar": "自动隐藏底栏", "settings.autohideBottombar.help": "当页面向下滚动时,移动设备视图的底栏将被隐藏", - "settings.openSidebars": "Open sidebars", + "settings.openSidebars": "打开侧栏", "settings.chatModals": "启用聊天模式" } \ No newline at end of file diff --git a/public/language/zh-CN/topic.json b/public/language/zh-CN/topic.json index 3ccd7422bc..42a6d6a334 100644 --- a/public/language/zh-CN/topic.json +++ b/public/language/zh-CN/topic.json @@ -15,7 +15,7 @@ "replies-to-this-post": "%1 条回复", "one-reply-to-this-post": "1 条回复", "last-reply-time": "最后回复", - "reply-options": "Reply options", + "reply-options": "回复选项", "reply-as-topic": "在新帖中回复", "guest-login-reply": "登录后回复", "login-to-view": "🔒登录查看", @@ -35,7 +35,7 @@ "pinned": "已固定", "pinned-with-expiry": "置顶直到 %1", "scheduled": "已定时", - "deleted": "Deleted", + "deleted": "删除", "moved": "已移动", "moved-from": "移自%1版", "copy-code": "复制代码", @@ -182,8 +182,8 @@ "sort-by": "排序", "oldest-to-newest": "从旧到新", "newest-to-oldest": "从新到旧", - "recently-replied": "Recently Replied", - "recently-created": "Recently Created", + "recently-replied": "最近回复", + "recently-created": "最近创建", "most-votes": "最多赞同", "most-posts": "回复最多", "most-views": "最多浏览", @@ -208,13 +208,13 @@ "last-post": "最后一个帖子", "go-to-my-next-post": "转到我的下一个帖子", "no-more-next-post": "您在此主题中没有更多的帖子了", - "open-composer": "Open composer", + "open-composer": "打开编辑器", "post-quick-reply": "快速回复", "navigator.index": "发布 %2 的 %1", "navigator.unread": "未读 %1", - "upvote-post": "Upvote post", - "downvote-post": "Downvote post", - "post-tools": "Post tools", - "unread-posts-link": "Unread posts link", - "thumb-image": "Topic thumbnail image" + "upvote-post": "顶贴", + "downvote-post": "踩帖", + "post-tools": "帖子工具", + "unread-posts-link": "未读帖子链接", + "thumb-image": "主题缩略图" } \ No newline at end of file diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index 2606315658..088e7d3668 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -142,10 +142,10 @@ "follow-topics-you-create": "关注您创建的主题", "grouptitle": "用户组称号", "group-order-help": "选择群组然后使用箭头排列称号", - "show-group-title": "Show group title", - "hide-group-title": "Hide group title", - "order-group-up": "Order group up", - "order-group-down": "Order group down", + "show-group-title": "显示群组标题", + "hide-group-title": "隐藏群组标题", + "order-group-up": "用户组上移", + "order-group-down": "用户组下移", "no-group-title": "不展示群组称号", "select-skin": "选择皮肤", "default": "默认(%1)", diff --git a/public/language/zh-TW/admin/advanced/events.json b/public/language/zh-TW/admin/advanced/events.json index c801c04f18..c37ccc84e4 100644 --- a/public/language/zh-TW/admin/advanced/events.json +++ b/public/language/zh-TW/admin/advanced/events.json @@ -9,5 +9,9 @@ "filter-type": "事件類型", "filter-start": "開始時間", "filter-end": "結束時間", + "filter-user": "Filter by User", + "filter-user.placeholder": "Type user name to filter...", + "filter-group": "Filter by Group", + "filter-group.placeholder": "Type group name to filter...", "filter-per-page": "每頁" } \ No newline at end of file diff --git a/public/scss/modules/scrollbar.scss b/public/scss/modules/scrollbar.scss index 47b90c4a4e..d99214ca91 100644 --- a/public/scss/modules/scrollbar.scss +++ b/public/scss/modules/scrollbar.scss @@ -1,7 +1,6 @@ .ghost-scrollbar { &::-webkit-scrollbar { width: 10px; - } &::-webkit-scrollbar-track { diff --git a/public/src/admin/advanced/events.js b/public/src/admin/advanced/events.js index 112c76f985..ecf494bf31 100644 --- a/public/src/admin/advanced/events.js +++ b/public/src/admin/advanced/events.js @@ -1,7 +1,7 @@ 'use strict'; -define('admin/advanced/events', ['bootbox', 'alerts'], function (bootbox, alerts) { +define('admin/advanced/events', ['bootbox', 'alerts', 'autocomplete'], function (bootbox, alerts, autocomplete) { const Events = {}; Events.init = function () { @@ -30,6 +30,21 @@ define('admin/advanced/events', ['bootbox', 'alerts'], function (bootbox, alerts }); }); + $('#user-group-select').on('change', function () { + const val = $(this).val(); + $('#username').toggleClass('hidden', val !== 'username'); + if (val !== 'username') { + $('#username').val(''); + } + $('#group').toggleClass('hidden', val !== 'group'); + if (val !== 'group') { + $('#group').val(''); + } + }); + + autocomplete.user($('#username')); + autocomplete.group($('#group')); + $('#apply').on('click', Events.refresh); }; diff --git a/public/src/modules/accounts/picture.js b/public/src/modules/accounts/picture.js index 50d869b849..d8ab277f24 100644 --- a/public/src/modules/accounts/picture.js +++ b/public/src/modules/accounts/picture.js @@ -94,7 +94,10 @@ define('accounts/picture', [ const iconBgColor = document.querySelector('.modal.picture-switcher input[type="radio"]:checked').value || 'transparent'; changeUserPicture(type, iconBgColor).then(() => { - Picture.updateHeader(type === 'default' ? '' : modal.find('.list-group-item.active img').attr('src'), iconBgColor); + Picture.updateHeader( + type === 'default' ? '' : modal.find('.list-group-item.active img').attr('src'), + iconBgColor + ); ajaxify.refresh(); }).catch(alerts.error); } @@ -139,16 +142,17 @@ define('accounts/picture', [ function handleImageUpload(modal) { function onUploadComplete(urlOnServer) { - urlOnServer = (!urlOnServer.startsWith('http') ? config.relative_path : '') + urlOnServer + '?' + Date.now(); - - Picture.updateHeader(urlOnServer); + urlOnServer = (!urlOnServer.startsWith('http') ? config.relative_path : '') + urlOnServer; + const cacheBustedUrl = urlOnServer + '?' + Date.now(); + Picture.updateHeader(cacheBustedUrl); if (ajaxify.data.picture && ajaxify.data.picture.length) { - $('#user-current-picture, img.avatar').attr('src', urlOnServer); + $(`#user-current-picture, img[data-uid="${ajaxify.data.theirid}"].avatar`).attr('src', cacheBustedUrl); ajaxify.data.uploadedpicture = urlOnServer; + ajaxify.data.picture = urlOnServer; } else { ajaxify.refresh(function () { - $('#user-current-picture, img.avatar').attr('src', urlOnServer); + $(`#user-current-picture, img[data-uid="${ajaxify.data.theirid}"].avatar`).attr('src', cacheBustedUrl); }); } } diff --git a/public/src/modules/api.js b/public/src/modules/api.js index 95d5d35a1e..adae6734bb 100644 --- a/public/src/modules/api.js +++ b/public/src/modules/api.js @@ -22,9 +22,10 @@ async function call(options, callback) { return result; } catch (err) { if (err.message === 'A valid login session was not found. Please log in and try again.') { + const { url } = await fireHook('filter:admin.reauth', { url: 'login' }); return confirm('[[error:api.reauth-required]]', (ok) => { if (ok) { - ajaxify.go('login'); + ajaxify.go(url); } }); } diff --git a/src/api/users.js b/src/api/users.js index d3bb57a3e8..af63903ee3 100644 --- a/src/api/users.js +++ b/src/api/users.js @@ -18,8 +18,7 @@ const plugins = require('../plugins'); const events = require('../events'); const translator = require('../translator'); const sockets = require('../socket.io'); - -// const api = require('.'); +const utils = require('../utils'); const usersAPI = module.exports; @@ -670,6 +669,9 @@ usersAPI.generateExport = async (caller, { uid, type }) => { if (!validTypes.includes(type)) { throw new Error('[[error:invalid-data]]'); } + if (!utils.isNumber(uid) || !(parseInt(uid, 10) > 0)) { + throw new Error('[[error:invalid-uid]]'); + } const count = await db.incrObjectField('locks', `export:${uid}${type}`); if (count > 1) { throw new Error('[[error:already-exporting]]'); diff --git a/src/cli/manage.js b/src/cli/manage.js index f69c786680..82472d115e 100644 --- a/src/cli/manage.js +++ b/src/cli/manage.js @@ -130,7 +130,11 @@ async function listPlugins() { async function listEvents(count = 10) { await db.init(); - const eventData = await events.getEvents('', 0, count - 1); + const eventData = await events.getEvents({ + filter: '', + start: 0, + stop: count - 1, + }); console.log(chalk.bold(`\nDisplaying last ${count} administrative events...`)); eventData.forEach((event) => { console.log(` * ${chalk.green(String(event.timestampISO))} ${chalk.yellow(String(event.type))}${event.text ? ` ${event.text}` : ''} (uid: ${event.uid ? event.uid : 0})`); diff --git a/src/controllers/admin/events.js b/src/controllers/admin/events.js index 3d59892090..bc94437975 100644 --- a/src/controllers/admin/events.js +++ b/src/controllers/admin/events.js @@ -3,6 +3,8 @@ const db = require('../../database'); const events = require('../../events'); const pagination = require('../../pagination'); +const user = require('../../user'); +const groups = require('../../groups'); const eventsController = module.exports; @@ -11,18 +13,35 @@ eventsController.get = async function (req, res) { const itemsPerPage = parseInt(req.query.perPage, 10) || 20; const start = (page - 1) * itemsPerPage; const stop = start + itemsPerPage - 1; + let uids; + if (req.query.username) { + uids = [await user.getUidByUsername(req.query.username)]; + } else if (req.query.group) { + uids = await groups.getMembers(req.query.group, 0, -1); + } // Limit by date let from = req.query.start ? new Date(req.query.start) || undefined : undefined; let to = req.query.end ? new Date(req.query.end) || undefined : new Date(); - from = from && from.setHours(0, 0, 0, 0); // setHours returns a unix timestamp (Number, not Date) - to = to && to.setHours(23, 59, 59, 999); // setHours returns a unix timestamp (Number, not Date) + from = from && from.setUTCHours(0, 0, 0, 0); // setHours returns a unix timestamp (Number, not Date) + to = to && to.setUTCHours(23, 59, 59, 999); // setHours returns a unix timestamp (Number, not Date) const currentFilter = req.query.type || ''; - const [eventCount, eventData, counts] = await Promise.all([ - db.sortedSetCount(`events:time${currentFilter ? `:${currentFilter}` : ''}`, from || '-inf', to), - events.getEvents(currentFilter, start, stop, from || '-inf', to), + events.getEventCount({ + filter: currentFilter, + uids, + from: from || '-inf', + to, + }), + events.getEvents({ + filter: currentFilter, + uids, + start, + stop, + from: from || '-inf', + to, + }), db.sortedSetsCard([''].concat(events.types).map(type => `events:time${type ? `:${type}` : ''}`)), ]); diff --git a/src/events.js b/src/events.js index 2a2c3ce20d..b750876341 100644 --- a/src/events.js +++ b/src/events.js @@ -87,12 +87,15 @@ events.log = async function (data) { const eid = await db.incrObjectField('global', 'nextEid'); data.timestamp = Date.now(); data.eid = eid; - + const setKeys = [ + 'events:time', + `events:time:${data.type}`, + ]; + if (data.hasOwnProperty('uid') && data.uid) { + setKeys.push(`events:time:uid:${data.uid}`); + } await Promise.all([ - db.sortedSetsAdd([ - 'events:time', - `events:time:${data.type}`, - ], data.timestamp, eid), + db.sortedSetsAdd(setKeys, data.timestamp, eid), db.setObject(`event:${eid}`, data), ]); plugins.hooks.fire('action:events.log', { data: data }); @@ -100,19 +103,100 @@ events.log = async function (data) { return { eid }; }; -events.getEvents = async function (filter, start, stop, from, to) { - // from/to optional - if (from === undefined) { - from = '-inf'; +// filter, start, stop, from(optional), to(optional), uids(optional) +events.getEvents = async function (options) { + // backwards compatibility + if (arguments.length > 1) { + // eslint-disable-next-line prefer-rest-params + const args = Array.prototype.slice.call(arguments); + options = { + filter: args[0], + start: args[1], + stop: args[2], + from: args[3], + to: args[4], + }; } - if (to === undefined) { - to = '+inf'; + // from/to optional + const from = options.hasOwnProperty('from') ? options.from : '-inf'; + const to = options.hasOwnProperty('to') ? options.to : '+inf'; + const { filter, start, stop, uids } = options; + let eids = []; + + if (Array.isArray(uids)) { + if (filter === '') { + eids = await db.getSortedSetRevRangeByScore( + uids.map(uid => `events:time:uid:${uid}`), + start, + stop === -1 ? -1 : stop - start + 1, + to, + from + ); + } else { + eids = await Promise.all( + uids.map( + uid => db.getSortedSetRevIntersect({ + sets: [`events:time:uid:${uid}`, `events:time:${filter}`], + start: 0, + stop: -1, + weights: [1, 0], + withScores: true, + }) + ) + ); + + eids = _.flatten(eids) + .filter( + i => (from === '-inf' || i.score >= from) && (to === '+inf' || i.score <= to) + ) + .sort((a, b) => b.score - a.score) + .slice(start, stop + 1) + .map(i => i.value); + } + } else { + eids = await db.getSortedSetRevRangeByScore( + `events:time${filter ? `:${filter}` : ''}`, + start, + stop === -1 ? -1 : stop - start + 1, + to, + from + ); } - const eids = await db.getSortedSetRevRangeByScore(`events:time${filter ? `:${filter}` : ''}`, start, stop === -1 ? -1 : stop - start + 1, to, from); return await events.getEventsByEventIds(eids); }; +events.getEventCount = async (options) => { + const { filter, uids, from, to } = options; + + if (Array.isArray(uids)) { + if (filter === '') { + const counts = await Promise.all( + uids.map(uid => db.sortedSetCount(`events:time:uid:${uid}`, from, to)) + ); + return counts.reduce((prev, cur) => prev + cur, 0); + } + + const eids = await Promise.all( + uids.map( + uid => db.getSortedSetRevIntersect({ + sets: [`events:time:uid:${uid}`, `events:time:${filter}`], + start: 0, + stop: -1, + weights: [1, 0], + withScores: true, + }) + ) + ); + + return _.flatten(eids).filter( + i => (from === '-inf' || i.score >= from) && (to === '+inf' || i.score <= to) + ).length; + } + + return await db.sortedSetCount(`events:time${filter ? `:${filter}` : ''}`, from || '-inf', to); +}; + events.getEventsByEventIds = async (eids) => { let eventsData = await db.getObjects(eids.map(eid => `event:${eid}`)); eventsData = eventsData.filter(Boolean); @@ -165,7 +249,11 @@ async function addUserData(eventsData, field, objectName) { events.deleteEvents = async function (eids) { const keys = eids.map(eid => `event:${eid}`); const eventData = await db.getObjectsFields(keys, ['type']); - const sets = _.uniq(['events:time'].concat(eventData.map(e => `events:time:${e.type}`))); + const sets = _.uniq( + ['events:time'] + .concat(eventData.map(e => `events:time:${e.type}`)) + .concat(eventData.map(e => `events:time:uid:${e.uid}`)) + ); await Promise.all([ db.deleteAll(keys), db.sortedSetRemove(sets, eids), diff --git a/src/groups/ownership.js b/src/groups/ownership.js index ade58e65c9..c7ae09ae2d 100644 --- a/src/groups/ownership.js +++ b/src/groups/ownership.js @@ -28,8 +28,10 @@ module.exports = function (Groups) { Groups.ownership.rescind = async function (toUid, groupName) { // If the owners set only contains one member (and toUid is that member), error out! - const numOwners = await db.setCount(`group:${groupName}:owners`); - const isOwner = await db.isSortedSetMember(`group:${groupName}:owners`); + const [numOwners, isOwner] = await Promise.all([ + db.setCount(`group:${groupName}:owners`), + db.isSetMember(`group:${groupName}:owners`, toUid), + ]); if (numOwners <= 1 && isOwner) { throw new Error('[[error:group-needs-owner]]'); } diff --git a/src/upgrades/3.8.0/events-uid-filter.js b/src/upgrades/3.8.0/events-uid-filter.js new file mode 100644 index 0000000000..f9a2d5b6a2 --- /dev/null +++ b/src/upgrades/3.8.0/events-uid-filter.js @@ -0,0 +1,31 @@ +/* eslint-disable no-await-in-loop */ + +'use strict'; + +const db = require('../../database'); +const batch = require('../../batch'); + +module.exports = { + name: 'Add user filter to acp events', + timestamp: Date.UTC(2024, 3, 1), + method: async function () { + const { progress } = this; + + await batch.processSortedSet(`events:time`, async (eids) => { + const eventData = await db.getObjects(eids.map(eid => `event:${eid}`)); + const bulkAdd = []; + eventData.forEach((event) => { + if (event && event.hasOwnProperty('uid') && event.uid && event.eid) { + bulkAdd.push( + [`events:time:uid:${event.uid}`, event.timestamp || Date.now(), event.eid] + ); + } + }); + await db.sortedSetAddBulk(bulkAdd); + progress.incr(eids.length); + }, { + batch: 500, + progress, + }); + }, +}; diff --git a/src/upgrades/3.8.0/user-upload-folders.js b/src/upgrades/3.8.0/user-upload-folders.js new file mode 100644 index 0000000000..5be9990a06 --- /dev/null +++ b/src/upgrades/3.8.0/user-upload-folders.js @@ -0,0 +1,86 @@ +'use strict'; + + +const fs = require('fs'); +const nconf = require('nconf'); +const path = require('path'); +const { mkdirp } = require('mkdirp'); + +const db = require('../../database'); +const batch = require('../../batch'); + + +module.exports = { + name: 'Create user upload folders', + timestamp: Date.UTC(2024, 2, 28), + method: async function () { + const { progress } = this; + + const folder = path.join(nconf.get('upload_path'), 'profile'); + + const userPicRegex = /^\d+-profile/; + const files = (await fs.promises.readdir(folder, { withFileTypes: true })) + .filter(item => !item.isDirectory() && String(item.name).match(userPicRegex)) + .map(item => item.name); + + progress.total = files.length; + await batch.processArray(files, async (files) => { + progress.incr(files.length); + await Promise.all(files.map(async (file) => { + const uid = file.split('-')[0]; + if (parseInt(uid, 10) > 0) { + await mkdirp(path.join(folder, `uid-${uid}`)); + await fs.promises.rename( + path.join(folder, file), + path.join(folder, `uid-${uid}`, file), + ); + } + })); + }, { + batch: 500, + }); + + await batch.processSortedSet('users:joindate', async (uids) => { + progress.incr(uids.length); + const usersData = await db.getObjects(uids.map(uid => `user:${uid}`)); + const bulkSet = []; + usersData.forEach((userData) => { + const setObj = {}; + if (userData && userData.picture && + userData.picture.includes(`/uploads/profile/${userData.uid}-`) && + !userData.picture.includes(`/uploads/profile/uid-${userData.uid}/${userData.uid}-`)) { + setObj.picture = userData.picture.replace( + `/uploads/profile/${userData.uid}-`, + `/uploads/profile/uid-${userData.uid}/${userData.uid}-` + ); + } + + if (userData && userData.uploadedpicture && + userData.uploadedpicture.includes(`/uploads/profile/${userData.uid}-`) && + !userData.uploadedpicture.includes(`/uploads/profile/uid-${userData.uid}/${userData.uid}-`)) { + setObj.uploadedpicture = userData.uploadedpicture.replace( + `/uploads/profile/${userData.uid}-`, + `/uploads/profile/uid-${userData.uid}/${userData.uid}-` + ); + } + + if (userData && userData['cover:url'] && + userData['cover:url'].includes(`/uploads/profile/${userData.uid}-`) && + !userData['cover:url'].includes(`/uploads/profile/uid-${userData.uid}/${userData.uid}-`)) { + setObj['cover:url'] = userData['cover:url'].replace( + `/uploads/profile/${userData.uid}-`, + `/uploads/profile/uid-${userData.uid}/${userData.uid}-` + ); + } + + if (Object.keys(setObj).length) { + bulkSet.push([`user:${userData.uid}`, setObj]); + } + }); + await db.setObjectBulk(bulkSet); + }, { + batch: 500, + progress: progress, + }); + }, +}; diff --git a/src/user/delete.js b/src/user/delete.js index 681eabeec1..9efd8802ae 100644 --- a/src/user/delete.js +++ b/src/user/delete.js @@ -227,7 +227,7 @@ module.exports = function (User) { } async function deleteImages(uid) { - const folder = path.join(nconf.get('upload_path'), 'profile'); - await rimraf(`${uid}-profile{avatar,cover}*`, { glob: { cwd: folder } }); + const folder = path.join(nconf.get('upload_path'), 'profile', `uid-${uid}`); + await rimraf(folder); } }; diff --git a/src/user/jobs/export-uploads.js b/src/user/jobs/export-uploads.js index a3bc097a49..89c623211e 100644 --- a/src/user/jobs/export-uploads.js +++ b/src/user/jobs/export-uploads.js @@ -74,14 +74,8 @@ process.on('message', async (msg) => { winston.verbose(`[user/export/uploads] Collating uploads for uid ${targetUid}`); await user.collateUploads(targetUid, archive); - const uploadedPicture = await user.getUserField(targetUid, 'uploadedpicture'); - if (uploadedPicture) { - const filePath = uploadedPicture.replace(nconf.get('upload_url'), ''); - archive.file(path.join(nconf.get('upload_path'), filePath), { - name: path.basename(filePath), - }); - } - + const profileUploadPath = path.join(nconf.get('upload_path'), `profile/uid-${targetUid}`); + archive.directory(profileUploadPath, 'profile'); archive.finalize(); } }); diff --git a/src/user/picture.js b/src/user/picture.js index d3d2a22f68..fbff7fd225 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -50,7 +50,7 @@ module.exports = function (User) { const extension = file.typeToExtension(image.mimeFromBase64(data.imageData)); const filename = `${data.uid}-profilecover-${Date.now()}${extension}`; - const uploadData = await image.uploadImage(filename, 'profile', picture); + const uploadData = await image.uploadImage(filename, `profile/uid-${data.uid}`, picture); await deleteCurrentPicture(data.uid, 'cover:url'); await User.setUserField(data.uid, 'cover:url', uploadData.url); @@ -96,7 +96,7 @@ module.exports = function (User) { }); const filename = generateProfileImageFilename(data.uid, extension); - const uploadedImage = await image.uploadImage(filename, 'profile', { + const uploadedImage = await image.uploadImage(filename, `profile/uid-${data.uid}`, { uid: data.uid, path: newPath, name: 'profileAvatar', @@ -140,7 +140,7 @@ module.exports = function (User) { }); const filename = generateProfileImageFilename(data.uid, extension); - const uploadedImage = await image.uploadImage(filename, 'profile', picture); + const uploadedImage = await image.uploadImage(filename, `profile/uid-${data.uid}`, picture); await deleteCurrentPicture(data.uid, 'uploadedpicture'); await User.updateProfile(data.callerUid, { @@ -224,10 +224,10 @@ module.exports = function (User) { async function getPicturePath(uid, field) { const value = await User.getUserField(uid, field); - if (!value || !value.startsWith(`${nconf.get('relative_path')}/assets/uploads/profile/`)) { + if (!value || !value.startsWith(`${nconf.get('relative_path')}/assets/uploads/profile/uid-${uid}`)) { return false; } const filename = value.split('/').pop(); - return path.join(nconf.get('upload_path'), 'profile', filename); + return path.join(nconf.get('upload_path'), `profile/uid-${uid}`, filename); } }; diff --git a/src/views/admin/advanced/events.tpl b/src/views/admin/advanced/events.tpl index 0eafb03749..f20eca0547 100644 --- a/src/views/admin/advanced/events.tpl +++ b/src/views/admin/advanced/events.tpl @@ -50,6 +50,14 @@ +
+ + + +
diff --git a/src/views/partials/chats/user-list.tpl b/src/views/partials/chats/user-list.tpl index c73a915828..482ebd98c9 100644 --- a/src/views/partials/chats/user-list.tpl +++ b/src/views/partials/chats/user-list.tpl @@ -1,4 +1,4 @@ -