diff --git a/.docker/Dockerfile.rhel b/.docker/Dockerfile.rhel index 9369e091a32b..dc9695a75fb8 100644 --- a/.docker/Dockerfile.rhel +++ b/.docker/Dockerfile.rhel @@ -1,6 +1,6 @@ FROM registry.access.redhat.com/rhscl/nodejs-8-rhel7 -ENV RC_VERSION 3.1.2 +ENV RC_VERSION 3.2.0 MAINTAINER buildmaster@rocket.chat diff --git a/.eslintignore b/.eslintignore index dee29d8e38d0..0f70fd1c55c7 100644 --- a/.eslintignore +++ b/.eslintignore @@ -8,7 +8,6 @@ app/katex/client/katex/katex.min.js packages/rocketchat-livechat/assets/rocketchat-livechat.min.js packages/rocketchat-livechat/assets/rocket-livechat.js app/theme/client/vendor/ -app/ui/client/lib/customEventPolyfill.js app/ui/client/lib/Modernizr.js public/mp3-realtime-worker.js public/lame.min.js diff --git a/.github/history.json b/.github/history.json index f93ed35ca2ef..98c0a2c52507 100644 --- a/.github/history.json +++ b/.github/history.json @@ -42493,8 +42493,1039 @@ } ] }, + "3.2.0-rc.0": { + "node_version": "12.16.1", + "npm_version": "6.13.4", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "17333", + "title": "[NEW] [ENTERPRISE] Restrict the permissions configuration for guest users ", + "userLogin": "pierre-lehnen-rc", + "description": "The **Guest** role is blocked for edition on the EE version. This will allow the EE customers to receive licenses with extra seats for Guests for free. The CE version continues to have the Guest role configurable.", + "milestone": "3.2.0", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "17091", + "title": "[NEW] Federation event for when users left rooms", + "userLogin": "alansikora", + "contributors": [ + "alansikora", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "16790", + "title": "[FIX] CSV Importer fails when there are no users to import", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc", + "web-flow" + ] + }, + { + "pr": "17206", + "title": "[FIX] Import slack's multiple direct messages as direct rooms instead of private groups", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.2.0", + "contributors": [ + "pierre-lehnen-rc", + "web-flow" + ] + }, + { + "pr": "17324", + "title": "[FIX] SAML Idp Initiated Logout Error", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.2.0", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "17357", + "title": "[NEW] Better Push and Email Notification logic", + "userLogin": "rodrigok", + "description": "We are still using the same logic to define which notifications every new message will generate, it takes some servers' settings, users's preferences and subscriptions' settings in consideration to determine who will receive each notification type (desktop, audio, email and mobile push), but now it doesn't check the user's status (online, away, offline) for email and mobile push notifications but send those notifications to a new queue with the following rules:\r\n\r\n- When the user is online the notification is scheduled to be sent in 120 seconds\r\n- When the user is away the notification is scheduled to be sent in 120 seconds minus the amount of time he is away\r\n- When the user is offline the notification is scheduled to be sent right away\r\n- When the user reads a channel all the notifications for that user are removed (clear queue)\r\n- When a notification is processed to be sent to a user and there are other scheduled notifications:\r\n - All the scheduled notifications for that user are rescheduled to now\r\n - The current notification goes back to the queue to be processed ordered by creation date", + "milestone": "3.2.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "17372", + "title": "[NEW] Error page when browser is not supported", + "userLogin": "ggazzo", + "milestone": "3.2.0", + "contributors": [ + "ggazzo", + "rodrigok" + ] + }, + { + "pr": "17141", + "title": "[NEW] [ENTERPRISE] Omnichannel queue priorities", + "userLogin": "MarcosSpessatto", + "milestone": "3.2.0", + "contributors": [ + "renatobecker", + "MarcosSpessatto", + "web-flow" + ] + }, + { + "pr": "15488", + "title": "[IMPROVE] Change the SAML metadata order to conform to XSD specification", + "userLogin": "fcrespo82", + "milestone": "3.2.0", + "contributors": [ + "fcrespo82", + "web-flow", + "sampaiodiego" + ] + }, + { + "pr": "9995", + "title": "[IMPROVE] Filter markdown in notifications", + "userLogin": "c0dzilla", + "milestone": "3.2.0", + "contributors": [ + "c0dzilla", + "rodrigok", + "web-flow" + ] + }, + { + "pr": "16056", + "title": "[IMPROVE] User gets UI feedback when message is pinned or unpinned", + "userLogin": "ashwaniYDV", + "milestone": "3.2.0", + "contributors": [ + "ashwaniYDV", + "web-flow", + "ggazzo", + "rodrigok" + ] + }, + { + "pr": "16343", + "title": "Remove set as alias setting", + "userLogin": "sampaiodiego", + "milestone": "3.2.0", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "16858", + "title": "[IMPROVE] Add `file-title` and `file-desc` as new filter tag options on message search", + "userLogin": "subham103", + "milestone": "3.2.0", + "contributors": [ + "subham103", + "rodrigok", + "web-flow" + ] + }, + { + "pr": "17254", + "title": "[NEW] Add ability to set tags in the Omnichannel room closing dialog", + "userLogin": "renatobecker", + "milestone": "3.2.0", + "contributors": [ + "renatobecker", + "web-flow", + "rodrigok" + ] + }, + { + "pr": "17047", + "title": "[FIX] Show active admin and user account menu item", + "userLogin": "hullen", + "milestone": "3.2.0", + "contributors": [ + "hullen", + "web-flow" + ] + }, + { + "pr": "17335", + "title": "[NEW] [ENTERPRISE] Allows to set a group of departments accepted for forwarding chats", + "userLogin": "MarcosSpessatto", + "milestone": "3.2.0", + "contributors": [ + "MarcosSpessatto", + "web-flow", + "renatobecker" + ] + }, + { + "pr": "17331", + "title": "[FIX] Prevent user from getting stuck on login, if there is some bad fname", + "userLogin": "ggazzo", + "milestone": "3.2.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "17238", + "title": "[FIX] Remove properties from users.info response", + "userLogin": "MarcosSpessatto", + "milestone": "3.2.0", + "contributors": [ + "MarcosSpessatto", + "web-flow" + ] + }, + { + "pr": "16286", + "title": "[NEW] Allow to send Agent custom fields through the Omnichannel CRM integration", + "userLogin": "renatobecker", + "milestone": "3.2.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "17356", + "title": "[FIX] Spotify embed and collapsed", + "userLogin": "ffauvel", + "milestone": "3.2.0", + "contributors": [ + "ffauvel", + "web-flow", + "gabriellsh" + ] + }, + { + "pr": "17338", + "title": "Improve: Better Push Notification code", + "userLogin": "rodrigok", + "milestone": "3.2.0", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "17365", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "17290", + "title": "[FIX] Allow Screensharing in BBB Iframe", + "userLogin": "wolbernd", + "contributors": [ + "wolbernd", + "web-flow" + ] + }, + { + "pr": "16762", + "title": "[NEW] Make the header for rooms clickable", + "userLogin": "aKn1ghtOut", + "milestone": "3.2.0", + "contributors": [ + "aKn1ghtOut", + "gabriellsh" + ] + }, + { + "pr": "17355", + "title": "Regression: Import data pagination", + "userLogin": "ggazzo", + "milestone": "3.2.0", + "contributors": [ + "ggazzo", + "tassoevan", + "web-flow" + ] + }, + { + "pr": "17353", + "title": "[NEW] Allow to set a comment when forwarding Omnichannel chats", + "userLogin": "renatobecker", + "milestone": "3.2.0", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "17320", + "title": "[FIX] Web Client memory leak caused by the Emoji rendering", + "userLogin": "ggazzo", + "milestone": "3.1.2", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "17348", + "title": "[FIX] Omnichannel room info panel opening whenever a message is sent", + "userLogin": "renatobecker", + "milestone": "3.1.2", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "17249", + "title": "[FIX] New user added by admin doesn't receive random password email", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.1.2", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "17323", + "title": "Bump https-proxy-agent from 2.2.1 to 2.2.4", + "userLogin": "dependabot[bot]", + "contributors": [ + "dependabot[bot]", + "web-flow" + ] + }, + { + "pr": "16683", + "title": "[NEW] Adds ability for Rocket.Chat Apps to create discussions", + "userLogin": "marceloschmidt", + "milestone": "3.2.0", + "contributors": [ + "marceloschmidt", + "lolimay", + "web-flow", + "d-gubert" + ] + }, + { + "pr": "17347", + "title": "[IMPROVE] Add possibility to sort the Omnichannel current chats list by column", + "userLogin": "MarcosSpessatto", + "milestone": "3.2.0", + "contributors": [ + "MarcosSpessatto" + ] + }, + { + "pr": "17289", + "title": "[IMPROVE] Redesign Administration > Import", + "userLogin": "tassoevan", + "milestone": "3.2.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "17322", + "title": "Mailer Scrollbar", + "userLogin": "gabriellsh", + "contributors": [ + "gabriellsh" + ] + }, + { + "pr": "17191", + "title": "[IMPROVE] Administration -> Mailer Rewrite.", + "userLogin": "gabriellsh", + "milestone": "3.2.0", + "contributors": [ + "gabriellsh", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "17321", + "title": "Regression: Storybook", + "userLogin": "gabriellsh", + "contributors": [ + "gabriellsh" + ] + }, + { + "pr": "15690", + "title": "[NEW] Feature/custom oauth mail field and interpolation for mapped fields", + "userLogin": "benkroeger", + "milestone": "3.2.0", + "contributors": [ + "sampaiodiego", + "benkroeger", + "web-flow" + ] + }, + { + "pr": "17226", + "title": "[FIX] \"Invalid Invite\" message when registration is disabled", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc", + "web-flow" + ] + }, + { + "pr": "16536", + "title": "[FIX] Red color error outline is not removed after password update on profile details", + "userLogin": "ashwaniYDV", + "milestone": "3.2.0", + "contributors": [ + "ashwaniYDV", + "gabriellsh", + "web-flow" + ] + }, + { + "pr": "8799", + "title": "[FIX] Change wording to start DM from info panel", + "userLogin": "bryandesrosiers", + "milestone": "3.2.0", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "17305", + "title": "New hooks for RouterContext", + "userLogin": "tassoevan", + "milestone": "3.2.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "17278", + "title": "[FIX] SAML assertion signature enforcement", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.1.1", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego" + ] + }, + { + "pr": "17302", + "title": "[FIX] LDAP users lose session on refresh", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.1.1", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "17217", + "title": "[NEW] Add MMS support to Voxtelesys", + "userLogin": "john08burke", + "milestone": "3.2.0", + "contributors": [ + "john08burke", + "renatobecker", + "web-flow" + ] + }, + { + "pr": "17198", + "title": "[FIX] Popover component doesn't have scroll", + "userLogin": "Nikhil713", + "milestone": "3.2.0", + "contributors": [ + "Nikhil713", + "gabriellsh", + "web-flow" + ] + }, + { + "pr": "17288", + "title": " [FIX] Omnichannel SMS / WhatsApp integration errors due to missing location data", + "userLogin": "renatobecker", + "milestone": "3.1.1", + "contributors": [ + "renatobecker", + "web-flow" + ] + }, + { + "pr": "17299", + "title": "[FIX] User search on directory not working correctly", + "userLogin": "rodrigok", + "milestone": "3.1.1", + "contributors": [ + "rodrigok" + ] + }, + { + "pr": "16313", + "title": "[FIX] Can not save Unread Tray Icon Alert user preference", + "userLogin": "taiju271", + "milestone": "3.2.0", + "contributors": [ + "taiju271", + "web-flow", + "gabriellsh" + ] + }, + { + "pr": "15997", + "title": "[FIX] Variable rendering problem on Import recent history page", + "userLogin": "ritwizsinha", + "contributors": [ + "ritwizsinha", + "gabriellsh", + "web-flow" + ] + }, + { + "pr": "16215", + "title": "[FIX] Admin panel custom sounds, multiple sound playback fix and added single play/pause button", + "userLogin": "ashwaniYDV", + "contributors": [ + "ashwaniYDV", + "web-flow" + ] + }, + { + "pr": "17282", + "title": "[FIX] Discussions created from inside DMs were not working and some errors accessing recently created rooms", + "userLogin": "rodrigok", + "milestone": "3.1.1", + "contributors": [ + "rodrigok", + "sampaiodiego" + ] + }, + { + "pr": "16742", + "title": "[FIX] Translation for nl", + "userLogin": "CC007", + "contributors": [ + "CC007", + "web-flow" + ] + }, + { + "pr": "16534", + "title": "[FIX] No maxlength(120) defined for custom user status", + "userLogin": "ashwaniYDV", + "contributors": [ + "ashwaniYDV", + "gabriellsh", + "web-flow" + ] + }, + { + "pr": "16606", + "title": "[FIX] Fixed email sort button in directory -> users", + "userLogin": "ashwaniYDV", + "milestone": "3.2.0", + "contributors": [ + "ashwaniYDV", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "16405", + "title": "[FIX] In Create a New Channel, input should be focused on channel name instead of invite users", + "userLogin": "ashwaniYDV", + "contributors": [ + "ashwaniYDV", + "web-flow" + ] + }, + { + "pr": "16236", + "title": "[FIX] Email not verified message", + "userLogin": "gabriellsh", + "milestone": "3.2.0", + "contributors": [ + "gabriellsh", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "17283", + "title": "[FIX] Directory default tab", + "userLogin": "ggazzo", + "milestone": "3.1.1", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "16869", + "title": "[FIX] Update ru.i18n.json", + "userLogin": "1rV1N-git", + "contributors": [ + "1rV1N-git", + "web-flow" + ] + }, + { + "pr": "17286", + "title": "[FIX] Avatar on sidebar when showing real names", + "userLogin": "ggazzo", + "milestone": "3.1.1", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "17287", + "title": "Update Apps-Engine to stable version", + "userLogin": "d-gubert", + "milestone": "3.1.1", + "contributors": [ + "d-gubert" + ] + }, + { + "pr": "17055", + "title": "[NEW][ENTERPRISE] Auto close abandoned Omnichannel rooms", + "userLogin": "MarcosSpessatto", + "milestone": "3.2.0", + "contributors": [ + "MarcosSpessatto", + "web-flow", + "renatobecker" + ] + }, + { + "pr": "17285", + "title": "Static props for Administration route components", + "userLogin": "tassoevan", + "milestone": "3.2.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "16025", + "title": "[NEW] Default favorite channels", + "userLogin": "gabriellsh", + "milestone": "3.2.0", + "contributors": [ + "gabriellsh", + "web-flow", + "ggazzo" + ] + }, + { + "pr": "17280", + "title": "Apply $and helper to message template", + "userLogin": "tassoevan", + "milestone": "3.2.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "17222", + "title": "[NEW] Enable the IDP to choose the best authnContext", + "userLogin": "felipecrp", + "contributors": [ + "felipecrp", + "pierre-lehnen-rc", + "web-flow" + ] + }, + { + "pr": "17130", + "title": "[NEW] Support importing Slack threads", + "userLogin": "lpilz", + "contributors": [ + "lpilz", + "web-flow" + ] + }, + { + "pr": "17107", + "title": "Upgrade file storage packages", + "userLogin": "sampaiodiego", + "milestone": "3.2.0", + "contributors": [ + "sampaiodiego", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "17274", + "title": "LingoHub based on develop", + "userLogin": "engelgabriel", + "contributors": [ + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "17275", + "title": "[FIX] 404 error when clicking an username", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.1.1", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "16771", + "title": "[FIX] Global event click-message-link not fired", + "userLogin": "tassoevan", + "milestone": "3.1.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "16806", + "title": "[NEW] Add Color variable to left sidebar", + "userLogin": "MartinSchoeler", + "contributors": [ + "MartinSchoeler" + ] + }, + { + "pr": "16887", + "title": "[FIX] Search valid for emoji with dual name", + "userLogin": "subham103", + "contributors": [ + "subham103" + ] + }, + { + "pr": "16959", + "title": "[FIX] Threads: Hide Usernames hides Full names.", + "userLogin": "gabriellsh", + "contributors": [ + "gabriellsh", + "web-flow" + ] + }, + { + "pr": "17207", + "title": "[NEW] Buttons to check/uncheck all users and channels on import", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc", + "web-flow" + ] + }, + { + "pr": "17261", + "title": "[IMPROVE] Move CSS imports to `/app` modules", + "userLogin": "tassoevan", + "milestone": "3.2.0", + "contributors": [ + "tassoevan", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "17265", + "title": "[FIX] Unsafe React portals mount/unmount ", + "userLogin": "tassoevan", + "milestone": "3.2.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "17266", + "title": "[CHORE] Move polyfills to client/", + "userLogin": "tassoevan", + "milestone": "3.2.0", + "contributors": [ + "tassoevan" + ] + }, + { + "pr": "17241", + "title": "Merge master into develop & Set version to 3.2.0-develop", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego", + "web-flow", + "1rV1N-git", + "rodrigok", + "d-gubert", + "renatobecker" + ] + }, + { + "pr": "17209", + "title": "[IMPROVE] Administration Pages root rewritten", + "userLogin": "tassoevan", + "contributors": [ + "tassoevan", + "ggazzo", + "web-flow" + ] + }, + { + "pr": "16642", + "title": "[IMPROVE] Increase decoupling between React components and Blaze templates", + "userLogin": "tassoevan", + "milestone": "3.1.0", + "contributors": [ + "tassoevan", + "ggazzo", + "web-flow" + ] + } + ] + }, + "3.2.0-rc.1": { + "node_version": "12.16.1", + "npm_version": "6.13.4", + "mongo_versions": [ + "3.4", + "3.6", + "4.0" + ], + "pull_requests": [ + { + "pr": "17391", + "title": "Regression: Fix mem usage with more than one argument", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "17378", + "title": "[FIX] 2FA not showing codes for Spanish translation", + "userLogin": "RavenSystem", + "milestone": "3.2.0", + "contributors": [ + "RavenSystem", + "web-flow" + ] + } + ] + }, + "3.2.0-rc.2": { + "pull_requests": [ + { + "pr": "17453", + "title": "[FIX] LDAP error when trying to add room with spaces in the name", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.1.2", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "17393", + "title": "Complement Guest role restrictions for Enterprise", + "userLogin": "pierre-lehnen-rc", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego", + "web-flow" + ] + }, + { + "pr": "17430", + "title": "Regression: Add missing cacheKey to mem", + "userLogin": "sampaiodiego", + "milestone": "3.1.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "17428", + "title": "Remove `@typescript-eslint/explicit-function-return-type` rule", + "userLogin": "sampaiodiego", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "17422", + "title": "[FIX] Empty Incoming webhook script field ", + "userLogin": "ggazzo", + "milestone": "3.1.2", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "17417", + "title": "[FIX] LDAP Sync error", + "userLogin": "fastrde", + "milestone": "3.1.2", + "contributors": [ + "fastrde" + ] + }, + { + "pr": "17404", + "title": "[FIX] Bot Agents not being able to get Omnichannel Inquiries", + "userLogin": "renatobecker", + "milestone": "3.1.2", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "17406", + "title": "[FIX] Allowing blocking a user on channels", + "userLogin": "sampaiodiego", + "milestone": "3.1.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "17297", + "title": "Fix moving-to-a-single-codebase link in README", + "userLogin": "Krinkle", + "contributors": [ + "Krinkle", + "web-flow" + ] + } + ] + }, "3.1.2": { "pull_requests": [ + { + "pr": "17454", + "title": "Release 3.1.2", + "userLogin": "sampaiodiego", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego", + "renatobecker", + "ggazzo", + "fastrde" + ] + }, + { + "pr": "17453", + "title": "[FIX] LDAP error when trying to add room with spaces in the name", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.1.2", + "contributors": [ + "pierre-lehnen-rc" + ] + }, + { + "pr": "17430", + "title": "Regression: Add missing cacheKey to mem", + "userLogin": "sampaiodiego", + "milestone": "3.1.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "17422", + "title": "[FIX] Empty Incoming webhook script field ", + "userLogin": "ggazzo", + "milestone": "3.1.2", + "contributors": [ + "ggazzo" + ] + }, + { + "pr": "17417", + "title": "[FIX] LDAP Sync error", + "userLogin": "fastrde", + "milestone": "3.1.2", + "contributors": [ + "fastrde" + ] + }, + { + "pr": "17404", + "title": "[FIX] Bot Agents not being able to get Omnichannel Inquiries", + "userLogin": "renatobecker", + "milestone": "3.1.2", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "17406", + "title": "[FIX] Allowing blocking a user on channels", + "userLogin": "sampaiodiego", + "milestone": "3.1.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "17391", + "title": "Regression: Fix mem usage with more than one argument", + "userLogin": "sampaiodiego", + "milestone": "3.1.2", + "contributors": [ + "sampaiodiego" + ] + }, + { + "pr": "17320", + "title": "[FIX] Web Client memory leak caused by the Emoji rendering", + "userLogin": "ggazzo", + "milestone": "3.1.2", + "contributors": [ + "ggazzo", + "web-flow" + ] + }, + { + "pr": "17348", + "title": "[FIX] Omnichannel room info panel opening whenever a message is sent", + "userLogin": "renatobecker", + "milestone": "3.1.2", + "contributors": [ + "renatobecker" + ] + }, + { + "pr": "17249", + "title": "[FIX] New user added by admin doesn't receive random password email", + "userLogin": "pierre-lehnen-rc", + "milestone": "3.1.2", + "contributors": [ + "pierre-lehnen-rc" + ] + } + ] + }, + "3.2.0": { + "pull_requests": [ + { + "pr": "17454", + "title": "Release 3.1.2", + "userLogin": "sampaiodiego", + "contributors": [ + "pierre-lehnen-rc", + "sampaiodiego", + "renatobecker", + "ggazzo", + "fastrde" + ] + }, { "pr": "17453", "title": "[FIX] LDAP error when trying to add room with spaces in the name", diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 6d0c06c5f360..2d74d00f0e17 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -250,6 +250,14 @@ jobs: steps: - uses: actions/checkout@v1 + - name: Free disk space + run: | + sudo swapoff -a + sudo rm -f /swapfile + sudo apt clean + docker rmi $(docker image ls -aq) + df -h + - name: Cache node modules id: cache-nodemodules uses: actions/cache@v1 diff --git a/.meteor/packages b/.meteor/packages index e1895f9bc43e..84ee48c2bc9e 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -52,8 +52,8 @@ konecty:user-presence deepwell:bootstrap-datepicker2 dispatch:run-as-user -jalik:ufs -jalik:ufs-gridfs +jalik:ufs@1.0.2 +jalik:ufs-gridfs@1.0.2 jparker:gravatar kadira:blaze-layout kadira:flow-router @@ -66,9 +66,7 @@ nooitaf:colors ostrio:cookies pauli:accounts-linkedin raix:handlebar-helpers -rocketchat:push raix:ui-dropped-event -todda00:friendly-slugs rocketchat:tap-i18n underscore@1.0.10 @@ -76,7 +74,7 @@ juliancwirko:postcss littledata:synced-cron edgee:slingshot -jalik:ufs-local@0.2.5 +jalik:ufs-local@1.0.2 accounts-base@1.5.0 accounts-oauth@1.1.16 autoupdate@1.6.0 @@ -88,7 +86,6 @@ matb33:collection-hooks meteorhacks:inject-initial oauth@1.2.8 oauth2@1.2.1 -raix:eventemitter routepolicy@1.1.0 sha@1.0.9 templating diff --git a/.meteor/versions b/.meteor/versions index ee1d117926a6..02e97dbc384a 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -55,9 +55,9 @@ htmljs@1.0.11 http@1.4.2 id-map@1.1.0 inter-process-messaging@0.1.0 -jalik:ufs@0.7.5 -jalik:ufs-gridfs@0.2.1 -jalik:ufs-local@0.2.9 +jalik:ufs@1.0.2 +jalik:ufs-gridfs@1.0.2 +jalik:ufs-local@1.0.2 jparker:crypto-core@0.1.0 jparker:crypto-md5@0.1.1 jparker:gravatar@0.5.1 @@ -77,7 +77,7 @@ littledata:synced-cron@1.5.1 livedata@1.0.18 localstorage@1.2.0 logging@1.1.20 -matb33:collection-hooks@0.9.1 +matb33:collection-hooks@1.0.1 mdg:validation-error@0.5.1 meteor@1.9.3 meteor-base@1.4.0 @@ -114,7 +114,6 @@ pauli:accounts-linkedin@5.0.0 pauli:linkedin-oauth@5.0.0 promise@0.11.2 raix:eventemitter@0.1.3 -raix:eventstate@0.0.4 raix:handlebar-helpers@0.2.5 raix:ui-dropped-event@0.0.7 random@1.1.0 @@ -127,7 +126,6 @@ rocketchat:i18n@0.0.1 rocketchat:livechat@0.0.1 rocketchat:mongo-config@0.0.1 rocketchat:oauth2-server@2.1.0 -rocketchat:push@3.3.1 rocketchat:streamer@1.1.0 rocketchat:tap-i18n@1.9.1 rocketchat:version@1.0.0 @@ -147,7 +145,6 @@ templating-compiler@1.3.3 templating-runtime@1.3.2 templating-tools@1.1.2 tmeasday:check-npm-versions@0.3.2 -todda00:friendly-slugs@0.6.0 tracker@1.2.0 twitter-oauth@1.2.0 typescript@3.7.5 diff --git a/.storybook/.babelrc b/.storybook/.babelrc index 826e22a858c5..97ab12b7f950 100644 --- a/.storybook/.babelrc +++ b/.storybook/.babelrc @@ -13,6 +13,7 @@ "@babel/preset-flow" ], "plugins": [ - "@babel/plugin-proposal-class-properties" + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-optional-chaining" ] } diff --git a/.storybook/config.js b/.storybook/config.js index 420f7df4a6dc..c7fb95b21240 100644 --- a/.storybook/config.js +++ b/.storybook/config.js @@ -1,16 +1,12 @@ import { withKnobs } from '@storybook/addon-knobs'; -import { MINIMAL_VIEWPORTS, INITIAL_VIEWPORTS } from '@storybook/addon-viewport/dist/defaults'; +import { MINIMAL_VIEWPORTS } from '@storybook/addon-viewport/dist/defaults'; import { addDecorator, addParameters, configure } from '@storybook/react'; import { rocketChatDecorator } from './mocks/decorators'; addParameters({ viewport: { - viewports: { - ...MINIMAL_VIEWPORTS, - ...INITIAL_VIEWPORTS, - }, - defaultViewport: 'responsive', + viewports: MINIMAL_VIEWPORTS, }, }); diff --git a/.storybook/mocks/decorators.js b/.storybook/mocks/decorators.js index 8bf073a3b108..34a326f11077 100644 --- a/.storybook/mocks/decorators.js +++ b/.storybook/mocks/decorators.js @@ -7,7 +7,7 @@ export const rocketChatDecorator = (fn) => { if (linkElement.id !== 'theme-styles') { require('../../app/theme/client/main.css'); require('../../app/theme/client/vendor/fontello/css/fontello.css'); - require('../../client/rocketchat.font.css'); + require('../../app/theme/client/rocketchat.font.css'); linkElement.setAttribute('id', 'theme-styles'); linkElement.setAttribute('rel', 'stylesheet'); linkElement.setAttribute('href', 'https://open.rocket.chat/theme.css'); diff --git a/.storybook/mocks/meteor.js b/.storybook/mocks/meteor.js index e4a5761e50d2..d85c752a2b2b 100644 --- a/.storybook/mocks/meteor.js +++ b/.storybook/mocks/meteor.js @@ -64,6 +64,9 @@ export const check = () => {}; export const FlowRouter = { route: () => {}, + group: () => ({ + route: () => {}, + }), }; export const BlazeLayout = {}; diff --git a/HISTORY.md b/HISTORY.md index 9197d657fe1f..bc0b76f43333 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,6 +1,240 @@ +# 3.2.0 +`2020-04-27 · 19 🎉 · 10 🚀 · 34 🐛 · 19 🔍 · 34 👩‍💻👨‍💻` + +### 🎉 New features + + +- **ENTERPRISE:** Restrict the permissions configuration for guest users ([#17333](https://github.com/RocketChat/Rocket.Chat/pull/17333)) + + The **Guest** role is blocked for edition on the EE version. This will allow the EE customers to receive licenses with extra seats for Guests for free. The CE version continues to have the Guest role configurable. + +- **ENTERPRISE:** Omnichannel queue priorities ([#17141](https://github.com/RocketChat/Rocket.Chat/pull/17141)) + +- **ENTERPRISE:** Allows to set a group of departments accepted for forwarding chats ([#17335](https://github.com/RocketChat/Rocket.Chat/pull/17335)) + +- **ENTERPRISE:** Auto close abandoned Omnichannel rooms ([#17055](https://github.com/RocketChat/Rocket.Chat/pull/17055)) + +- Federation event for when users left rooms ([#17091](https://github.com/RocketChat/Rocket.Chat/pull/17091)) + +- Better Push and Email Notification logic ([#17357](https://github.com/RocketChat/Rocket.Chat/pull/17357)) + + We are still using the same logic to define which notifications every new message will generate, it takes some servers' settings, users's preferences and subscriptions' settings in consideration to determine who will receive each notification type (desktop, audio, email and mobile push), but now it doesn't check the user's status (online, away, offline) for email and mobile push notifications but send those notifications to a new queue with the following rules: + + - When the user is online the notification is scheduled to be sent in 120 seconds + - When the user is away the notification is scheduled to be sent in 120 seconds minus the amount of time he is away + - When the user is offline the notification is scheduled to be sent right away + - When the user reads a channel all the notifications for that user are removed (clear queue) + - When a notification is processed to be sent to a user and there are other scheduled notifications: + - All the scheduled notifications for that user are rescheduled to now + - The current notification goes back to the queue to be processed ordered by creation date + +- Error page when browser is not supported ([#17372](https://github.com/RocketChat/Rocket.Chat/pull/17372)) + +- Add ability to set tags in the Omnichannel room closing dialog ([#17254](https://github.com/RocketChat/Rocket.Chat/pull/17254)) + +- Allow to send Agent custom fields through the Omnichannel CRM integration ([#16286](https://github.com/RocketChat/Rocket.Chat/pull/16286)) + +- Make the header for rooms clickable ([#16762](https://github.com/RocketChat/Rocket.Chat/pull/16762) by [@aKn1ghtOut](https://github.com/aKn1ghtOut)) + +- Allow to set a comment when forwarding Omnichannel chats ([#17353](https://github.com/RocketChat/Rocket.Chat/pull/17353)) + +- Adds ability for Rocket.Chat Apps to create discussions ([#16683](https://github.com/RocketChat/Rocket.Chat/pull/16683)) + +- Feature/custom oauth mail field and interpolation for mapped fields ([#15690](https://github.com/RocketChat/Rocket.Chat/pull/15690) by [@benkroeger](https://github.com/benkroeger)) + +- Add MMS support to Voxtelesys ([#17217](https://github.com/RocketChat/Rocket.Chat/pull/17217) by [@john08burke](https://github.com/john08burke)) + +- Default favorite channels ([#16025](https://github.com/RocketChat/Rocket.Chat/pull/16025)) + +- Enable the IDP to choose the best authnContext ([#17222](https://github.com/RocketChat/Rocket.Chat/pull/17222) by [@felipecrp](https://github.com/felipecrp)) + +- Support importing Slack threads ([#17130](https://github.com/RocketChat/Rocket.Chat/pull/17130) by [@lpilz](https://github.com/lpilz)) + +- Add Color variable to left sidebar ([#16806](https://github.com/RocketChat/Rocket.Chat/pull/16806)) + +- Buttons to check/uncheck all users and channels on import ([#17207](https://github.com/RocketChat/Rocket.Chat/pull/17207)) + +### 🚀 Improvements + + +- Change the SAML metadata order to conform to XSD specification ([#15488](https://github.com/RocketChat/Rocket.Chat/pull/15488) by [@fcrespo82](https://github.com/fcrespo82)) + +- Filter markdown in notifications ([#9995](https://github.com/RocketChat/Rocket.Chat/pull/9995) by [@c0dzilla](https://github.com/c0dzilla)) + +- User gets UI feedback when message is pinned or unpinned ([#16056](https://github.com/RocketChat/Rocket.Chat/pull/16056) by [@ashwaniYDV](https://github.com/ashwaniYDV)) + +- Add `file-title` and `file-desc` as new filter tag options on message search ([#16858](https://github.com/RocketChat/Rocket.Chat/pull/16858) by [@subham103](https://github.com/subham103)) + +- Add possibility to sort the Omnichannel current chats list by column ([#17347](https://github.com/RocketChat/Rocket.Chat/pull/17347)) + +- Redesign Administration > Import ([#17289](https://github.com/RocketChat/Rocket.Chat/pull/17289)) + +- Administration -> Mailer Rewrite. ([#17191](https://github.com/RocketChat/Rocket.Chat/pull/17191)) + +- Move CSS imports to `/app` modules ([#17261](https://github.com/RocketChat/Rocket.Chat/pull/17261)) + +- Administration Pages root rewritten ([#17209](https://github.com/RocketChat/Rocket.Chat/pull/17209)) + +- Increase decoupling between React components and Blaze templates ([#16642](https://github.com/RocketChat/Rocket.Chat/pull/16642)) + +### 🐛 Bug fixes + + +- CSV Importer fails when there are no users to import ([#16790](https://github.com/RocketChat/Rocket.Chat/pull/16790)) + +- Import slack's multiple direct messages as direct rooms instead of private groups ([#17206](https://github.com/RocketChat/Rocket.Chat/pull/17206)) + +- SAML Idp Initiated Logout Error ([#17324](https://github.com/RocketChat/Rocket.Chat/pull/17324)) + +- Show active admin and user account menu item ([#17047](https://github.com/RocketChat/Rocket.Chat/pull/17047) by [@hullen](https://github.com/hullen)) + +- Prevent user from getting stuck on login, if there is some bad fname ([#17331](https://github.com/RocketChat/Rocket.Chat/pull/17331)) + +- Remove properties from users.info response ([#17238](https://github.com/RocketChat/Rocket.Chat/pull/17238)) + +- Spotify embed and collapsed ([#17356](https://github.com/RocketChat/Rocket.Chat/pull/17356) by [@ffauvel](https://github.com/ffauvel)) + +- Allow Screensharing in BBB Iframe ([#17290](https://github.com/RocketChat/Rocket.Chat/pull/17290) by [@wolbernd](https://github.com/wolbernd)) + +- "Invalid Invite" message when registration is disabled ([#17226](https://github.com/RocketChat/Rocket.Chat/pull/17226)) + +- Red color error outline is not removed after password update on profile details ([#16536](https://github.com/RocketChat/Rocket.Chat/pull/16536) by [@ashwaniYDV](https://github.com/ashwaniYDV)) + +- Change wording to start DM from info panel ([#8799](https://github.com/RocketChat/Rocket.Chat/pull/8799)) + +- SAML assertion signature enforcement ([#17278](https://github.com/RocketChat/Rocket.Chat/pull/17278)) + +- LDAP users lose session on refresh ([#17302](https://github.com/RocketChat/Rocket.Chat/pull/17302)) + +- Popover component doesn't have scroll ([#17198](https://github.com/RocketChat/Rocket.Chat/pull/17198) by [@Nikhil713](https://github.com/Nikhil713)) + +- Omnichannel SMS / WhatsApp integration errors due to missing location data ([#17288](https://github.com/RocketChat/Rocket.Chat/pull/17288)) + +- User search on directory not working correctly ([#17299](https://github.com/RocketChat/Rocket.Chat/pull/17299)) + +- Can not save Unread Tray Icon Alert user preference ([#16313](https://github.com/RocketChat/Rocket.Chat/pull/16313) by [@taiju271](https://github.com/taiju271)) + +- Variable rendering problem on Import recent history page ([#15997](https://github.com/RocketChat/Rocket.Chat/pull/15997) by [@ritwizsinha](https://github.com/ritwizsinha)) + +- Admin panel custom sounds, multiple sound playback fix and added single play/pause button ([#16215](https://github.com/RocketChat/Rocket.Chat/pull/16215) by [@ashwaniYDV](https://github.com/ashwaniYDV)) + +- Discussions created from inside DMs were not working and some errors accessing recently created rooms ([#17282](https://github.com/RocketChat/Rocket.Chat/pull/17282)) + +- Translation for nl ([#16742](https://github.com/RocketChat/Rocket.Chat/pull/16742) by [@CC007](https://github.com/CC007)) + +- No maxlength(120) defined for custom user status ([#16534](https://github.com/RocketChat/Rocket.Chat/pull/16534) by [@ashwaniYDV](https://github.com/ashwaniYDV)) + +- Fixed email sort button in directory -> users ([#16606](https://github.com/RocketChat/Rocket.Chat/pull/16606) by [@ashwaniYDV](https://github.com/ashwaniYDV)) + +- In Create a New Channel, input should be focused on channel name instead of invite users ([#16405](https://github.com/RocketChat/Rocket.Chat/pull/16405) by [@ashwaniYDV](https://github.com/ashwaniYDV)) + +- Email not verified message ([#16236](https://github.com/RocketChat/Rocket.Chat/pull/16236)) + +- Directory default tab ([#17283](https://github.com/RocketChat/Rocket.Chat/pull/17283)) + +- Update ru.i18n.json ([#16869](https://github.com/RocketChat/Rocket.Chat/pull/16869) by [@1rV1N-git](https://github.com/1rV1N-git)) + +- Avatar on sidebar when showing real names ([#17286](https://github.com/RocketChat/Rocket.Chat/pull/17286)) + +- 404 error when clicking an username ([#17275](https://github.com/RocketChat/Rocket.Chat/pull/17275)) + +- Global event click-message-link not fired ([#16771](https://github.com/RocketChat/Rocket.Chat/pull/16771)) + +- Search valid for emoji with dual name ([#16887](https://github.com/RocketChat/Rocket.Chat/pull/16887) by [@subham103](https://github.com/subham103)) + +- Threads: Hide Usernames hides Full names. ([#16959](https://github.com/RocketChat/Rocket.Chat/pull/16959)) + +- Unsafe React portals mount/unmount ([#17265](https://github.com/RocketChat/Rocket.Chat/pull/17265)) + +- 2FA not showing codes for Spanish translation ([#17378](https://github.com/RocketChat/Rocket.Chat/pull/17378) by [@RavenSystem](https://github.com/RavenSystem)) + +
+🔍 Minor changes + + +- Release 3.1.2 ([#17454](https://github.com/RocketChat/Rocket.Chat/pull/17454) by [@fastrde](https://github.com/fastrde)) + +- Remove set as alias setting ([#16343](https://github.com/RocketChat/Rocket.Chat/pull/16343)) + +- Improve: Better Push Notification code ([#17338](https://github.com/RocketChat/Rocket.Chat/pull/17338)) + +- LingoHub based on develop ([#17365](https://github.com/RocketChat/Rocket.Chat/pull/17365)) + +- Regression: Import data pagination ([#17355](https://github.com/RocketChat/Rocket.Chat/pull/17355)) + +- Bump https-proxy-agent from 2.2.1 to 2.2.4 ([#17323](https://github.com/RocketChat/Rocket.Chat/pull/17323) by [@dependabot[bot]](https://github.com/dependabot[bot])) + +- Mailer Scrollbar ([#17322](https://github.com/RocketChat/Rocket.Chat/pull/17322)) + +- Regression: Storybook ([#17321](https://github.com/RocketChat/Rocket.Chat/pull/17321)) + +- New hooks for RouterContext ([#17305](https://github.com/RocketChat/Rocket.Chat/pull/17305)) + +- Update Apps-Engine to stable version ([#17287](https://github.com/RocketChat/Rocket.Chat/pull/17287)) + +- Static props for Administration route components ([#17285](https://github.com/RocketChat/Rocket.Chat/pull/17285)) + +- Apply $and helper to message template ([#17280](https://github.com/RocketChat/Rocket.Chat/pull/17280)) + +- Upgrade file storage packages ([#17107](https://github.com/RocketChat/Rocket.Chat/pull/17107)) + +- LingoHub based on develop ([#17274](https://github.com/RocketChat/Rocket.Chat/pull/17274)) + +- [CHORE] Move polyfills to client/ ([#17266](https://github.com/RocketChat/Rocket.Chat/pull/17266)) + +- Merge master into develop & Set version to 3.2.0-develop ([#17241](https://github.com/RocketChat/Rocket.Chat/pull/17241) by [@1rV1N-git](https://github.com/1rV1N-git)) + +- Complement Guest role restrictions for Enterprise ([#17393](https://github.com/RocketChat/Rocket.Chat/pull/17393)) + +- Remove `@typescript-eslint/explicit-function-return-type` rule ([#17428](https://github.com/RocketChat/Rocket.Chat/pull/17428)) + +- Fix moving-to-a-single-codebase link in README ([#17297](https://github.com/RocketChat/Rocket.Chat/pull/17297) by [@Krinkle](https://github.com/Krinkle)) + +
+ +### 👩‍💻👨‍💻 Contributors 😍 + +- [@1rV1N-git](https://github.com/1rV1N-git) +- [@CC007](https://github.com/CC007) +- [@Krinkle](https://github.com/Krinkle) +- [@Nikhil713](https://github.com/Nikhil713) +- [@RavenSystem](https://github.com/RavenSystem) +- [@aKn1ghtOut](https://github.com/aKn1ghtOut) +- [@ashwaniYDV](https://github.com/ashwaniYDV) +- [@benkroeger](https://github.com/benkroeger) +- [@c0dzilla](https://github.com/c0dzilla) +- [@dependabot[bot]](https://github.com/dependabot[bot]) +- [@fastrde](https://github.com/fastrde) +- [@fcrespo82](https://github.com/fcrespo82) +- [@felipecrp](https://github.com/felipecrp) +- [@ffauvel](https://github.com/ffauvel) +- [@hullen](https://github.com/hullen) +- [@john08burke](https://github.com/john08burke) +- [@lpilz](https://github.com/lpilz) +- [@ritwizsinha](https://github.com/ritwizsinha) +- [@subham103](https://github.com/subham103) +- [@taiju271](https://github.com/taiju271) +- [@wolbernd](https://github.com/wolbernd) + +### 👩‍💻👨‍💻 Core Team 🤓 + +- [@MarcosSpessatto](https://github.com/MarcosSpessatto) +- [@MartinSchoeler](https://github.com/MartinSchoeler) +- [@alansikora](https://github.com/alansikora) +- [@d-gubert](https://github.com/d-gubert) +- [@gabriellsh](https://github.com/gabriellsh) +- [@ggazzo](https://github.com/ggazzo) +- [@lolimay](https://github.com/lolimay) +- [@marceloschmidt](https://github.com/marceloschmidt) +- [@pierre-lehnen-rc](https://github.com/pierre-lehnen-rc) +- [@renatobecker](https://github.com/renatobecker) +- [@rodrigok](https://github.com/rodrigok) +- [@sampaiodiego](https://github.com/sampaiodiego) +- [@tassoevan](https://github.com/tassoevan) + # 3.1.2 -`2020-04-27 · 8 🐛 · 2 🔍 · 5 👩‍💻👨‍💻` +`2020-04-27 · 8 🐛 · 3 🔍 · 5 👩‍💻👨‍💻` ### 🐛 Bug fixes @@ -25,6 +259,8 @@ 🔍 Minor changes +- Release 3.1.2 ([#17454](https://github.com/RocketChat/Rocket.Chat/pull/17454) by [@fastrde](https://github.com/fastrde)) + - Regression: Add missing cacheKey to mem ([#17430](https://github.com/RocketChat/Rocket.Chat/pull/17430)) - Regression: Fix mem usage with more than one argument ([#17391](https://github.com/RocketChat/Rocket.Chat/pull/17391)) diff --git a/README.md b/README.md index 86ad92ff9efa..582baf0ec5c8 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ [![Code Climate](https://codeclimate.com/github/RocketChat/Rocket.Chat/badges/gpa.svg)](https://codeclimate.com/github/RocketChat/Rocket.Chat) [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/RocketChat/Rocket.Chat/raw/master/LICENSE) -* [**NEW!** Rocket.Chat Moving to a Single Codebase](#moving-to-one-codebase) +* [**NEW!** Rocket.Chat Moving to a Single Codebase](#moving-to-a-single-codebase) * [Community](#community) * [Mobile Apps](#mobile-apps) * [Desktop Apps](#desktop-apps) diff --git a/app/action-links/client/index.js b/app/action-links/client/index.js index f49166a5c811..34c929c096f9 100644 --- a/app/action-links/client/index.js +++ b/app/action-links/client/index.js @@ -1,6 +1,7 @@ import { actionLinks } from '../both/lib/actionLinks'; import './lib/actionLinks'; import './init'; +import './stylesheets/actionLinks.css'; export { actionLinks, diff --git a/app/api/server/lib/rooms.js b/app/api/server/lib/rooms.js index 52c67f0dcdc6..94eb63685f39 100644 --- a/app/api/server/lib/rooms.js +++ b/app/api/server/lib/rooms.js @@ -18,6 +18,7 @@ export async function findAdminRooms({ uid, filter, types = [], pagination: { of unmuted: 1, ro: 1, default: 1, + favorite: 1, featured: 1, topic: 1, msgs: 1, diff --git a/app/api/server/v1/channels.js b/app/api/server/v1/channels.js index 682ff697e9ab..76af348d9a6c 100644 --- a/app/api/server/v1/channels.js +++ b/app/api/server/v1/channels.js @@ -758,7 +758,7 @@ API.v1.addRoute('channels.setDefault', { authRequired: true }, { } Meteor.runAsUser(this.userId, () => { - Meteor.call('saveRoomSettings', findResult._id, 'default', this.bodyParams.default.toString()); + Meteor.call('saveRoomSettings', findResult._id, 'default', ['true', '1'].includes(this.bodyParams.default.toString().toLowerCase())); }); return API.v1.success({ diff --git a/app/api/server/v1/push.js b/app/api/server/v1/push.js index 6c1c9959011a..9e3c8d59b325 100644 --- a/app/api/server/v1/push.js +++ b/app/api/server/v1/push.js @@ -1,7 +1,7 @@ import { Meteor } from 'meteor/meteor'; import { Random } from 'meteor/random'; -import { Push } from 'meteor/rocketchat:push'; +import { appTokensCollection } from '../../../push/server'; import { API } from '../api'; API.v1.addRoute('push.token', { authRequired: true }, { @@ -47,7 +47,7 @@ API.v1.addRoute('push.token', { authRequired: true }, { throw new Meteor.Error('error-token-param-not-valid', 'The required "token" body param is missing or invalid.'); } - const affectedRecords = Push.appCollection.remove({ + const affectedRecords = appTokensCollection.remove({ $or: [{ 'token.apn': token, }, { diff --git a/app/api/server/v1/users.js b/app/api/server/v1/users.js index 4b861eb11407..0598d8a430a2 100644 --- a/app/api/server/v1/users.js +++ b/app/api/server/v1/users.js @@ -16,7 +16,7 @@ import { setUserAvatar, saveCustomFields, } from '../../../lib'; -import { getFullUserData, getFullUserDataById } from '../../../lib/server/functions/getFullUserData'; +import { getFullUserDataByIdOrUsername } from '../../../lib/server/functions/getFullUserData'; import { API } from '../api'; import { setStatusText } from '../../../lib/server'; import { findUsersToAutocomplete } from '../lib/users'; @@ -180,20 +180,12 @@ API.v1.addRoute('users.info', { authRequired: true }, { get() { const { username, userId } = this.requestParams(); const { fields } = this.parseJsonQuery(); - const params = { - userId: this.userId, - filter: username, - limit: 1, - }; - const result = userId - ? getFullUserDataById({ userId: this.userId, filterId: userId }) - : getFullUserData(params); + const user = getFullUserDataByIdOrUsername({ userId: this.userId, filterId: userId, filterUsername: username }); - if (!result || result.count() !== 1) { + if (!user) { return API.v1.failure('User not found.'); } - const [user] = result.fetch(); const myself = user._id === this.userId; if (fields.userRooms === 1 && (myself || hasPermission(this.userId, 'view-other-user-channels'))) { user.rooms = Subscriptions.findByUserId(user._id, { diff --git a/app/apps/client/admin/helpers.js b/app/apps/client/admin/helpers.js index ca04c715fbc5..f78b4c661599 100644 --- a/app/apps/client/admin/helpers.js +++ b/app/apps/client/admin/helpers.js @@ -47,7 +47,7 @@ const promptCloudLogin = () => { html: false, }, (confirmed) => { if (confirmed) { - FlowRouter.go('cloud-config'); + FlowRouter.go('cloud'); } }); }; diff --git a/app/apps/client/admin/marketplace.js b/app/apps/client/admin/marketplace.js index 0907080453d2..495bda2a90ac 100644 --- a/app/apps/client/admin/marketplace.js +++ b/app/apps/client/admin/marketplace.js @@ -254,7 +254,7 @@ Template.marketplace.helpers({ Template.marketplace.events({ 'click .js-cloud-login'() { - FlowRouter.go('cloud-config'); + FlowRouter.go('cloud'); }, 'submit .js-search-form'(event) { event.stopPropagation(); diff --git a/app/apps/client/orchestrator.js b/app/apps/client/orchestrator.js index 2252c886ce9d..54c614044fe0 100644 --- a/app/apps/client/orchestrator.js +++ b/app/apps/client/orchestrator.js @@ -4,7 +4,7 @@ import toastr from 'toastr'; import { AppWebsocketReceiver } from './communication'; import { APIClient } from '../../utils'; -import { AdminBox } from '../../ui-utils'; +import { registerAdminSidebarItem } from '../../ui-admin/client'; import { CachedCollectionManager } from '../../ui-cached-collection'; import { hasAtLeastOnePermission } from '../../authorization'; import { handleI18nResources } from './i18n'; @@ -51,14 +51,14 @@ class AppClientOrchestrator { getAppClientManager = () => this._manager; registerAdminMenuItems = () => { - AdminBox.addOption({ + registerAdminSidebarItem({ icon: 'cube', href: 'apps', i18nLabel: 'Apps', permissionGranted: () => hasAtLeastOnePermission(['manage-apps']), }); - AdminBox.addOption({ + registerAdminSidebarItem({ icon: 'cube', href: 'marketplace', i18nLabel: 'Marketplace', diff --git a/app/apps/client/routes.js b/app/apps/client/routes.js index 914137e5f72f..66005d26b875 100644 --- a/app/apps/client/routes.js +++ b/app/apps/client/routes.js @@ -1,9 +1,10 @@ import { FlowRouter } from 'meteor/kadira:flow-router'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; +import { registerAdminRoute } from '../../ui-admin/client'; import { Apps } from './orchestrator'; -FlowRouter.route('/admin/apps/what-is-it', { +registerAdminRoute('/apps/what-is-it', { name: 'apps-what-is-it', action: async () => { // TODO: render loading indicator @@ -26,32 +27,32 @@ const createAppsRouteAction = (centerTemplate) => async () => { } }; -FlowRouter.route('/admin/apps', { +registerAdminRoute('/apps', { name: 'apps', action: createAppsRouteAction('apps'), }); -FlowRouter.route('/admin/apps/install', { +registerAdminRoute('/apps/install', { name: 'app-install', action: createAppsRouteAction('appInstall'), }); -FlowRouter.route('/admin/apps/:appId', { +registerAdminRoute('/apps/:appId', { name: 'app-manage', action: createAppsRouteAction('appManage'), }); -FlowRouter.route('/admin/apps/:appId/logs', { +registerAdminRoute('/apps/:appId/logs', { name: 'app-logs', action: createAppsRouteAction('appLogs'), }); -FlowRouter.route('/admin/marketplace', { +registerAdminRoute('/marketplace', { name: 'marketplace', action: createAppsRouteAction('marketplace'), }); -FlowRouter.route('/admin/marketplace/:appId', { +registerAdminRoute('/marketplace/:appId', { name: 'marketplace-app', action: createAppsRouteAction('appManage'), }); diff --git a/app/apps/server/bridges/rooms.js b/app/apps/server/bridges/rooms.js index d8bc4e76d4ac..a91d8b2105ad 100644 --- a/app/apps/server/bridges/rooms.js +++ b/app/apps/server/bridges/rooms.js @@ -1,8 +1,8 @@ -import { Meteor } from 'meteor/meteor'; import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; +import { Meteor } from 'meteor/meteor'; -import { Rooms, Subscriptions, Users } from '../../../models/server'; import { addUserToRoom } from '../../../lib/server/functions/addUserToRoom'; +import { Rooms, Subscriptions, Users } from '../../../models/server'; export class AppRoomBridge { constructor(orch) { @@ -120,4 +120,35 @@ export class AppRoomBridge { addUserToRoom(rm._id, member); } } + + async createDiscussion(room, parentMessage = null, reply = '', members = [], appId) { + this.orch.debugLog(`The App ${ appId } is creating a new discussion.`, room); + + const rcRoom = this.orch.getConverters().get('rooms').convertAppRoom(room); + + let rcMessage; + if (parentMessage) { + rcMessage = this.orch.getConverters().get('messages').convertAppMessage(parentMessage); + } + + if (!rcRoom.prid || !Rooms.findOneById(rcRoom.prid)) { + throw new Error('There must be a parent room to create a discussion.'); + } + + const discussion = { + prid: rcRoom.prid, + t_name: rcRoom.fname, + pmid: rcMessage ? rcMessage._id : undefined, + reply: reply && reply.trim() !== '' ? reply : undefined, + users: members.length > 0 ? members : [], + }; + + let rid; + Meteor.runAsUser(room.creator.id, () => { + const info = Meteor.call('createDiscussion', discussion); + rid = info.rid; + }); + + return rid; + } } diff --git a/app/apps/server/converters/rooms.js b/app/apps/server/converters/rooms.js index a511f471d256..8c8aedbe1448 100644 --- a/app/apps/server/converters/rooms.js +++ b/app/apps/server/converters/rooms.js @@ -91,6 +91,7 @@ export class AppRoomsConverter { closedAt: room.closedAt, lm: room.lastModifiedAt, customFields: room.customFields, + prid: typeof room.parentRoom === 'undefined' ? undefined : room.parentRoom.id, }; return Object.assign(newRoom, room._unmappedProperties_); @@ -195,7 +196,17 @@ export class AppRoomsConverter { return this.orch.getConverters().get('users').convertById(responseBy._id); }, + parentRoom: (room) => { + const { prid } = room; + if (!prid) { + return undefined; + } + + delete room.prid; + + return this.orch.getConverters().get('rooms').convertById(prid); + }, }; return transformMappedData(room, map); diff --git a/app/authorization/client/hasPermission.js b/app/authorization/client/hasPermission.js index 994c363428d9..a48549979c7a 100644 --- a/app/authorization/client/hasPermission.js +++ b/app/authorization/client/hasPermission.js @@ -3,11 +3,19 @@ import { Template } from 'meteor/templating'; import { ChatPermissions } from './lib/ChatPermissions'; import * as Models from '../../models'; +import { AuthorizationUtils } from '../lib/AuthorizationUtils'; function atLeastOne(permissions = [], scope, userId) { userId = userId || Meteor.userId(); + const user = Models.Users.findOneById(userId, { fields: { roles: 1 } }); return permissions.some((permissionId) => { + if (user && user.roles) { + if (AuthorizationUtils.isPermissionRestrictedForRoleList(permissionId, user.roles)) { + return false; + } + } + const permission = ChatPermissions.findOne(permissionId, { fields: { roles: 1 } }); const roles = (permission && permission.roles) || []; @@ -23,8 +31,15 @@ function atLeastOne(permissions = [], scope, userId) { function all(permissions = [], scope, userId) { userId = userId || Meteor.userId(); + const user = Models.Users.findOneById(userId, { fields: { roles: 1 } }); return permissions.every((permissionId) => { + if (user && user.roles) { + if (AuthorizationUtils.isPermissionRestrictedForRoleList(permissionId, user.roles)) { + return false; + } + } + const permission = ChatPermissions.findOne(permissionId, { fields: { roles: 1 } }); const roles = (permission && permission.roles) || []; diff --git a/app/authorization/client/index.js b/app/authorization/client/index.js index 7ff5353f1f79..ca382bacc82b 100644 --- a/app/authorization/client/index.js +++ b/app/authorization/client/index.js @@ -1,9 +1,11 @@ import { hasAllPermission, hasAtLeastOnePermission, hasPermission, userHasAllPermission } from './hasPermission'; import { hasRole } from './hasRole'; +import { AuthorizationUtils } from '../lib/AuthorizationUtils'; import './usersNameChanged'; import './requiresPermission.html'; import './route'; import './startup'; +import './stylesheets/permissions.css'; export { hasAllPermission, @@ -11,4 +13,5 @@ export { hasRole, hasPermission, userHasAllPermission, + AuthorizationUtils, }; diff --git a/app/authorization/client/route.js b/app/authorization/client/route.js index 2415242d6eb9..95ccd464cc48 100644 --- a/app/authorization/client/route.js +++ b/app/authorization/client/route.js @@ -1,9 +1,9 @@ -import { FlowRouter } from 'meteor/kadira:flow-router'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; +import { registerAdminRoute } from '../../ui-admin/client'; import { t } from '../../utils/client'; -FlowRouter.route('/admin/permissions', { +registerAdminRoute('/permissions', { name: 'admin-permissions', async action(/* params*/) { await import('./views'); @@ -14,7 +14,7 @@ FlowRouter.route('/admin/permissions', { }, }); -FlowRouter.route('/admin/permissions/:name?/edit', { +registerAdminRoute('/permissions/:name?/edit', { name: 'admin-permissions-edit', async action(/* params*/) { await import('./views'); @@ -26,7 +26,7 @@ FlowRouter.route('/admin/permissions/:name?/edit', { }, }); -FlowRouter.route('/admin/permissions/new', { +registerAdminRoute('/permissions/new', { name: 'admin-permissions-new', async action(/* params*/) { await import('./views'); diff --git a/app/authorization/client/startup.js b/app/authorization/client/startup.js index 2edf696d2856..9e437c26c050 100644 --- a/app/authorization/client/startup.js +++ b/app/authorization/client/startup.js @@ -2,8 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { Tracker } from 'meteor/tracker'; import { hasAtLeastOnePermission } from './hasPermission'; +import { registerAdminSidebarItem } from '../../ui-admin/client'; import { CachedCollectionManager } from '../../ui-cached-collection'; -import { AdminBox } from '../../ui-utils/client/lib/AdminBox'; import { APIClient } from '../../utils/client'; import { Roles } from '../../models/client'; import { rolesStreamer } from './lib/streamer'; @@ -14,7 +14,7 @@ Meteor.startup(() => { roles.forEach((role) => Roles.insert(role)); }); - AdminBox.addOption({ + registerAdminSidebarItem({ href: 'admin-permissions', i18nLabel: 'Permissions', icon: 'lock', diff --git a/app/authorization/client/views/permissions.html b/app/authorization/client/views/permissions.html index 7f8d9c57e030..d332e471849d 100644 --- a/app/authorization/client/views/permissions.html +++ b/app/authorization/client/views/permissions.html @@ -27,7 +27,9 @@ {{permissionName permission}}
[ID: {{permission._id}}] {{#each role in allRoles}} - + {{#if isRolePermissionEnabled role permission}} + + {{/if}} {{else}} diff --git a/app/authorization/client/views/permissions.js b/app/authorization/client/views/permissions.js index 1ad319988a8e..291eaac4bcd5 100644 --- a/app/authorization/client/views/permissions.js +++ b/app/authorization/client/views/permissions.js @@ -1,16 +1,16 @@ +import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; import s from 'underscore.string'; -import { Meteor } from 'meteor/meteor'; import { ReactiveDict } from 'meteor/reactive-dict'; import { Tracker } from 'meteor/tracker'; import { Template } from 'meteor/templating'; -import { Roles } from '../../../models'; +import { Roles } from '../../../models/client'; import { ChatPermissions } from '../lib/ChatPermissions'; import { hasAllPermission } from '../hasPermission'; import { t } from '../../../utils/client'; import { SideNav } from '../../../ui-utils/client/lib/SideNav'; -import { CONSTANTS } from '../../lib'; +import { CONSTANTS, AuthorizationUtils } from '../../lib'; import { hasAtLeastOnePermission } from '..'; @@ -179,6 +179,10 @@ Template.permissionsTable.helpers({ permissionDescription(permission) { return t(`${ permission._id }_description`); }, + + isRolePermissionEnabled(role, permission) { + return !AuthorizationUtils.isPermissionRestrictedForRole(permission._id, role._id); + }, }); Template.permissionsTable.events({ diff --git a/app/authorization/lib/AuthorizationUtils.ts b/app/authorization/lib/AuthorizationUtils.ts new file mode 100644 index 000000000000..daa19828305c --- /dev/null +++ b/app/authorization/lib/AuthorizationUtils.ts @@ -0,0 +1,56 @@ +import { Meteor } from 'meteor/meteor'; + +const restrictedRolePermissions = new Map(); + +export const AuthorizationUtils = class { + static addRolePermissionWhiteList(roleId: string, list: [string]): void { + if (!roleId) { + throw new Meteor.Error('invalid-param'); + } + + if (!list) { + throw new Meteor.Error('invalid-param'); + } + + if (!restrictedRolePermissions.has(roleId)) { + restrictedRolePermissions.set(roleId, new Set()); + } + + const rules = restrictedRolePermissions.get(roleId); + + for (const permissionId of list) { + rules.add(permissionId); + } + } + + static isPermissionRestrictedForRole(permissionId: string, roleId: string): boolean { + if (!roleId || !permissionId) { + throw new Meteor.Error('invalid-param'); + } + + if (!restrictedRolePermissions.has(roleId)) { + return false; + } + + const rules = restrictedRolePermissions.get(roleId); + if (!rules || !rules.size) { + return false; + } + + return !rules.has(permissionId); + } + + static isPermissionRestrictedForRoleList(permissionId: string, roleList: [string]): boolean { + if (!roleList || !permissionId) { + throw new Meteor.Error('invalid-param'); + } + + for (const roleId of roleList) { + if (this.isPermissionRestrictedForRole(permissionId, roleId)) { + return true; + } + } + + return false; + } +}; diff --git a/app/authorization/lib.js b/app/authorization/lib/index.js similarity index 76% rename from app/authorization/lib.js rename to app/authorization/lib/index.js index e36c89a3a1c7..fd4f5f0cb288 100644 --- a/app/authorization/lib.js +++ b/app/authorization/lib/index.js @@ -6,3 +6,5 @@ export const getSettingPermissionId = function(settingId) { export const CONSTANTS = { SETTINGS_LEVEL: 'settings', }; + +export { AuthorizationUtils } from './AuthorizationUtils'; diff --git a/app/authorization/server/functions/hasPermission.js b/app/authorization/server/functions/hasPermission.js index 6f5382496a22..0512c6a07e23 100644 --- a/app/authorization/server/functions/hasPermission.js +++ b/app/authorization/server/functions/hasPermission.js @@ -1,8 +1,13 @@ import mem from 'mem'; import { Permissions, Users, Subscriptions } from '../../../models/server/raw'; +import { AuthorizationUtils } from '../../lib/AuthorizationUtils'; const rolesHasPermission = mem(async (permission, roles) => { + if (AuthorizationUtils.isPermissionRestrictedForRoleList(permission, roles)) { + return false; + } + const result = await Permissions.findOne({ _id: permission, roles: { $in: roles } }, { projection: { _id: 1 } }); return !!result; }, { diff --git a/app/authorization/server/index.js b/app/authorization/server/index.js index 80394b15fcfc..0ebc74f0ce77 100644 --- a/app/authorization/server/index.js +++ b/app/authorization/server/index.js @@ -14,6 +14,7 @@ import { } from './functions/hasPermission'; import { hasRole } from './functions/hasRole'; import { removeUserFromRoles } from './functions/removeUserFromRoles'; +import { AuthorizationUtils } from '../lib/AuthorizationUtils'; import './methods/addPermissionToRole'; import './methods/addUserToRole'; import './methods/deleteRole'; @@ -36,4 +37,5 @@ export { hasAllPermission, hasAtLeastOnePermission, hasPermission, + AuthorizationUtils, }; diff --git a/app/authorization/server/methods/addPermissionToRole.js b/app/authorization/server/methods/addPermissionToRole.js index 6879fe4009bc..5ca74ed3dbc9 100644 --- a/app/authorization/server/methods/addPermissionToRole.js +++ b/app/authorization/server/methods/addPermissionToRole.js @@ -2,10 +2,17 @@ import { Meteor } from 'meteor/meteor'; import { Permissions } from '../../../models/server'; import { hasPermission } from '../functions/hasPermission'; -import { CONSTANTS } from '../../lib'; +import { CONSTANTS, AuthorizationUtils } from '../../lib'; Meteor.methods({ 'authorization:addPermissionToRole'(permissionId, role) { + if (AuthorizationUtils.isPermissionRestrictedForRole(permissionId, role)) { + throw new Meteor.Error('error-action-not-allowed', 'Permission is restricted', { + method: 'authorization:addPermissionToRole', + action: 'Adding_permission', + }); + } + const uid = Meteor.userId(); const permission = Permissions.findOneById(permissionId); diff --git a/app/authorization/server/startup.js b/app/authorization/server/startup.js index 6781accad030..16b2f8906580 100644 --- a/app/authorization/server/startup.js +++ b/app/authorization/server/startup.js @@ -70,14 +70,14 @@ Meteor.startup(function() { { _id: 'unarchive-room', roles: ['admin'] }, { _id: 'view-c-room', roles: ['admin', 'user', 'bot', 'app', 'anonymous'] }, { _id: 'user-generate-access-token', roles: ['admin'] }, - { _id: 'view-d-room', roles: ['admin', 'user', 'bot', 'app'] }, + { _id: 'view-d-room', roles: ['admin', 'user', 'bot', 'app', 'guest'] }, { _id: 'view-full-other-user-info', roles: ['admin'] }, { _id: 'view-history', roles: ['admin', 'user', 'anonymous'] }, { _id: 'view-joined-room', roles: ['guest', 'bot', 'app', 'anonymous'] }, { _id: 'view-join-code', roles: ['admin'] }, { _id: 'view-logs', roles: ['admin'] }, { _id: 'view-other-user-channels', roles: ['admin'] }, - { _id: 'view-p-room', roles: ['admin', 'user', 'anonymous'] }, + { _id: 'view-p-room', roles: ['admin', 'user', 'anonymous', 'guest'] }, { _id: 'view-privileged-setting', roles: ['admin'] }, { _id: 'view-room-administration', roles: ['admin'] }, { _id: 'view-statistics', roles: ['admin'] }, diff --git a/app/autotranslate/client/index.js b/app/autotranslate/client/index.js index c1deaf68e645..f34d47269d43 100644 --- a/app/autotranslate/client/index.js +++ b/app/autotranslate/client/index.js @@ -2,5 +2,6 @@ import './lib/actionButton'; import './lib/tabBar'; import './views/autoTranslateFlexTab.html'; import './views/autoTranslateFlexTab'; +import './stylesheets/autotranslate.css'; export { AutoTranslate } from './lib/autotranslate'; diff --git a/app/channel-settings/client/index.js b/app/channel-settings/client/index.js index 9f76f0a85cc7..42e3477bba2d 100644 --- a/app/channel-settings/client/index.js +++ b/app/channel-settings/client/index.js @@ -4,5 +4,6 @@ import './startup/trackSettingsChange'; import './views/channelSettings.html'; import './views/channelSettings'; import './views/Multiselect'; +import './stylesheets/channel-settings.css'; export { ChannelSettings } from './lib/ChannelSettings'; diff --git a/app/channel-settings/client/views/Multiselect.html b/app/channel-settings/client/views/Multiselect.html deleted file mode 100644 index 15e2b1884545..000000000000 --- a/app/channel-settings/client/views/Multiselect.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/app/channel-settings/client/views/Multiselect.js b/app/channel-settings/client/views/Multiselect.js index 160901096f14..a63fa1981cd2 100644 --- a/app/channel-settings/client/views/Multiselect.js +++ b/app/channel-settings/client/views/Multiselect.js @@ -1,23 +1,12 @@ -import './Multiselect.html'; -import { Template } from 'meteor/templating'; - -import { MultiSelectSettingInput } from '../../../../client/components/admin/settings/inputs/MultiSelectSettingInput'; - - -Template.Multiselect.onRendered(async function() { - const { MeteorProvider } = await import('../../../../client/providers/MeteorProvider'); - const React = await import('react'); - const ReactDOM = await import('react-dom'); - this.container = this.firstNode; - this.autorun(() => { - ReactDOM.render(React.createElement(MeteorProvider, { - children: React.createElement(MultiSelectSettingInput, Template.currentData()), - }), this.container); - }); -}); - - -Template.Multiselect.onDestroyed(async function() { - const ReactDOM = await import('react-dom'); - this.container && ReactDOM.unmountComponentAtNode(this.container); -}); +import { HTML } from 'meteor/htmljs'; + +import { createTemplateForComponent } from '../../../../client/reactAdapters'; + +createTemplateForComponent( + 'Multiselect', + () => import('../../../ui-admin/client/components/settings/inputs/MultiSelectSettingInput'), + { + // eslint-disable-next-line new-cap + renderContainerView: () => HTML.DIV({ class: 'rc-multiselect', style: 'display: flex;' }), + }, +); diff --git a/app/channel-settings/server/methods/saveRoomSettings.js b/app/channel-settings/server/methods/saveRoomSettings.js index adef8f1ed12c..49dae9c9ab66 100644 --- a/app/channel-settings/server/methods/saveRoomSettings.js +++ b/app/channel-settings/server/methods/saveRoomSettings.js @@ -17,7 +17,7 @@ import { saveRoomTokenpass } from '../functions/saveRoomTokens'; import { saveStreamingOptions } from '../functions/saveStreamingOptions'; import { RoomSettingsEnum, roomTypes } from '../../../utils'; -const fields = ['featured', 'roomName', 'roomTopic', 'roomAnnouncement', 'roomCustomFields', 'roomDescription', 'roomType', 'readOnly', 'reactWhenReadOnly', 'systemMessages', 'default', 'joinCode', 'tokenpass', 'streamingOptions', 'retentionEnabled', 'retentionMaxAge', 'retentionExcludePinned', 'retentionFilesOnly', 'retentionOverrideGlobal', 'encrypted']; +const fields = ['featured', 'roomName', 'roomTopic', 'roomAnnouncement', 'roomCustomFields', 'roomDescription', 'roomType', 'readOnly', 'reactWhenReadOnly', 'systemMessages', 'default', 'joinCode', 'tokenpass', 'streamingOptions', 'retentionEnabled', 'retentionMaxAge', 'retentionExcludePinned', 'retentionFilesOnly', 'retentionOverrideGlobal', 'encrypted', 'favorite']; Meteor.methods({ saveRoomSettings(rid, settings, value) { const userId = Meteor.userId(); @@ -221,6 +221,9 @@ Meteor.methods({ case 'encrypted': Rooms.saveEncryptedById(rid, value); break; + case 'favorite': + Rooms.saveFavoriteById(rid, value.favorite, value.defaultValue); + break; } }); diff --git a/app/chatpal-search/client/index.js b/app/chatpal-search/client/index.js index 6c169229e05a..8418c93acde9 100644 --- a/app/chatpal-search/client/index.js +++ b/app/chatpal-search/client/index.js @@ -5,3 +5,4 @@ import './template/admin'; import './template/result'; import './template/suggestion'; import './route'; +import './style.css'; diff --git a/app/chatpal-search/client/route.js b/app/chatpal-search/client/route.js index cb0281953064..86c6ad276c49 100644 --- a/app/chatpal-search/client/route.js +++ b/app/chatpal-search/client/route.js @@ -1,9 +1,9 @@ -import { FlowRouter } from 'meteor/kadira:flow-router'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; +import { registerAdminRoute } from '../../ui-admin/client'; import { t } from '../../utils'; -FlowRouter.route('/admin/chatpal', { +registerAdminRoute('/chatpal', { name: 'chatpal-admin', action() { return BlazeLayout.render('main', { diff --git a/app/cloud/client/index.js b/app/cloud/client/index.js index 0165b0a25011..0c8025d22dbd 100644 --- a/app/cloud/client/index.js +++ b/app/cloud/client/index.js @@ -3,20 +3,19 @@ import './admin/cloud'; import './admin/cloudRegisterManually'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; -import { FlowRouter } from 'meteor/kadira:flow-router'; -import { AdminBox } from '../../ui-utils'; +import { registerAdminRoute, registerAdminSidebarItem } from '../../ui-admin/client'; import { hasAtLeastOnePermission } from '../../authorization'; -FlowRouter.route('/admin/cloud', { - name: 'cloud-config', +registerAdminRoute('/cloud', { + name: 'cloud', async action() { await import('./admin'); BlazeLayout.render('main', { center: 'cloud', old: true }); }, }); -FlowRouter.route('/admin/cloud/oauth-callback', { +registerAdminRoute('/cloud/oauth-callback', { name: 'cloud-oauth-callback', async action() { await import('./admin'); @@ -24,9 +23,9 @@ FlowRouter.route('/admin/cloud/oauth-callback', { }, }); -AdminBox.addOption({ +registerAdminSidebarItem({ icon: 'cloud-plus', - href: 'admin/cloud', + href: 'cloud', i18nLabel: 'Connectivity_Services', permissionGranted() { return hasAtLeastOnePermission(['manage-cloud']); diff --git a/app/colors/client/client.js b/app/colors/client/client.js index 5f76a7c453aa..2f867b30963e 100644 --- a/app/colors/client/client.js +++ b/app/colors/client/client.js @@ -2,6 +2,7 @@ import s from 'underscore.string'; import { settings } from '../../settings'; import { callbacks } from '../../callbacks'; +import './style.css'; // // HexColorPreview is a named function that will process Colors diff --git a/app/custom-oauth/server/custom_oauth_server.js b/app/custom-oauth/server/custom_oauth_server.js index 3f60a185b905..c37e43b62047 100644 --- a/app/custom-oauth/server/custom_oauth_server.js +++ b/app/custom-oauth/server/custom_oauth_server.js @@ -6,6 +6,7 @@ import { HTTP } from 'meteor/http'; import { ServiceConfiguration } from 'meteor/service-configuration'; import _ from 'underscore'; +import { normalizers, fromTemplate, renameInvalidProperties } from './transform_helpers'; import { mapRolesFromSSO, updateRolesFromSSO } from './oauth_helpers'; import { Logger } from '../../logger'; import { Users } from '../../models'; @@ -17,107 +18,6 @@ const logger = new Logger('CustomOAuth'); const Services = {}; const BeforeUpdateOrCreateUserFromExternalService = []; -const normalizers = { - // Set 'id' to '_id' for any sources that provide it - _id(identity) { - if (identity._id && !identity.id) { - identity.id = identity._id; - } - }, - - // Fix for Reddit - redit(identity) { - if (identity.result) { - return identity.result; - } - }, - - // Fix WordPress-like identities having 'ID' instead of 'id' - wordpress(identity) { - if (identity.ID && !identity.id) { - identity.id = identity.ID; - } - }, - - // Fix Auth0-like identities having 'user_id' instead of 'id' - user_id(identity) { - if (identity.user_id && !identity.id) { - identity.id = identity.user_id; - } - }, - - characterid(identity) { - if (identity.CharacterID && !identity.id) { - identity.id = identity.CharacterID; - } - }, - - // Fix Dataporten having 'user.userid' instead of 'id' - dataporten(identity) { - if (identity.user && identity.user.userid && !identity.id) { - if (identity.user.userid_sec && identity.user.userid_sec[0]) { - identity.id = identity.user.userid_sec[0]; - } else { - identity.id = identity.user.userid; - } - identity.email = identity.user.email; - } - }, - - // Fix for Xenforo [BD]API plugin for 'user.user_id; instead of 'id' - xenforo(identity) { - if (identity.user && identity.user.user_id && !identity.id) { - identity.id = identity.user.user_id; - identity.email = identity.user.user_email; - } - }, - - // Fix general 'phid' instead of 'id' from phabricator - phabricator(identity) { - if (identity.phid && !identity.id) { - identity.id = identity.phid; - } - }, - - // Fix Keycloak-like identities having 'sub' instead of 'id' - kaycloak(identity) { - if (identity.sub && !identity.id) { - identity.id = identity.sub; - } - }, - - // Fix OpenShift identities where id is in 'metadata' object - openshift(identity) { - if (!identity.id && identity.metadata && identity.metadata.uid) { - identity.id = identity.metadata.uid; - identity.name = identity.fullName; - } - }, - - // Fix general 'userid' instead of 'id' from provider - userid(identity) { - if (identity.userid && !identity.id) { - identity.id = identity.userid; - } - }, - - // Fix Nextcloud provider - nextcloud(identity) { - if (!identity.id && identity.ocs && identity.ocs.data && identity.ocs.data.id) { - identity.id = identity.ocs.data.id; - identity.name = identity.ocs.data.displayname; - identity.email = identity.ocs.data.email; - } - }, - - // Fix when authenticating from a meteor app with 'emails' field - meteor(identity) { - if (!identity.email && (identity.emails && Array.isArray(identity.emails) && identity.emails.length >= 1)) { - identity.email = identity.emails[0].address ? identity.emails[0].address : undefined; - } - }, -}; - export class CustomOAuth { constructor(name, options) { logger.debug('Init CustomOAuth', name, options); @@ -174,6 +74,7 @@ export class CustomOAuth { this.tokenSentVia = options.tokenSentVia; this.identityTokenSentVia = options.identityTokenSentVia; this.usernameField = (options.usernameField || '').trim(); + this.emailField = (options.emailField || '').trim(); this.nameField = (options.nameField || '').trim(); this.avatarField = (options.avatarField || '').trim(); this.mergeUsers = options.mergeUsers; @@ -334,6 +235,10 @@ export class CustomOAuth { identity.username = this.getUsername(identity); } + if (this.emailField) { + identity.email = this.getEmail(identity); + } + if (this.avatarField) { identity.avatarUrl = this.getAvatarUrl(identity); } @@ -344,7 +249,7 @@ export class CustomOAuth { identity.name = this.getName(identity); } - return identity; + return renameInvalidProperties(identity); } retrieveCredential(credentialToken, credentialSecret) { @@ -352,42 +257,56 @@ export class CustomOAuth { } getUsername(data) { - let username = ''; + try { + const value = fromTemplate(this.usernameField, data); + + if (!value) { + throw new Meteor.Error('field_not_found', `Username field "${ this.usernameField }" not found in data`, data); + } + return value; + } catch (error) { + throw new Error('CustomOAuth: Failed to extract username', error.message); + } + } - username = this.usernameField.split('.').reduce(function(prev, curr) { - return prev ? prev[curr] : undefined; - }, data); + getEmail(data) { + try { + const value = fromTemplate(this.emailField, data); - if (!username) { - throw new Meteor.Error('field_not_found', `Username field "${ this.usernameField }" not found in data`, data); + if (!value) { + throw new Meteor.Error('field_not_found', `Email field "${ this.emailField }" not found in data`, data); + } + return value; + } catch (error) { + throw new Error('CustomOAuth: Failed to extract email', error.message); } - return username; } getCustomName(data) { - let customName = ''; + try { + const value = fromTemplate(this.nameField, data); - customName = this.nameField.split('.').reduce(function(prev, curr) { - return prev ? prev[curr] : undefined; - }, data); + if (!value) { + return this.getName(data); + } - if (!customName) { - return this.getName(data); + return value; + } catch (error) { + throw new Error('CustomOAuth: Failed to extract custom name', error.message); } - - return customName; } getAvatarUrl(data) { - const avatarUrl = this.avatarField.split('.').reduce(function(prev, curr) { - return prev ? prev[curr] : undefined; - }, data); + try { + const value = fromTemplate(this.avatarField, data); - if (!avatarUrl) { - logger.debug(`Avatar field "${ this.avatarField }" not found in data`, data); + if (!value) { + logger.debug(`Avatar field "${ this.avatarField }" not found in data`, data); + } + return value; + } catch (error) { + throw new Error('CustomOAuth: Failed to extract avatar url', error.message); } - - return avatarUrl; } getName(identity) { @@ -438,11 +357,15 @@ export class CustomOAuth { } if (this.usernameField) { - user.username = this.getUsername(user.services[this.name]); + user.username = user.services[this.name].username; + } + + if (this.emailField) { + user.email = user.services[this.name].email; } if (this.nameField) { - user.name = this.getCustomName(user.services[this.name]); + user.name = user.services[this.name].name; } if (this.mergeRoles) { diff --git a/app/custom-oauth/server/transform_helpers.js b/app/custom-oauth/server/transform_helpers.js new file mode 100644 index 000000000000..ef9847ae0279 --- /dev/null +++ b/app/custom-oauth/server/transform_helpers.js @@ -0,0 +1,157 @@ +import _ from 'underscore'; + +export const normalizers = { + // Set 'id' to '_id' for any sources that provide it + _id(identity) { + if (identity._id && !identity.id) { + identity.id = identity._id; + } + }, + + // Fix for Reddit + redit(identity) { + if (identity.result) { + return identity.result; + } + }, + + // Fix WordPress-like identities having 'ID' instead of 'id' + wordpress(identity) { + if (identity.ID && !identity.id) { + identity.id = identity.ID; + } + }, + + // Fix Auth0-like identities having 'user_id' instead of 'id' + user_id(identity) { + if (identity.user_id && !identity.id) { + identity.id = identity.user_id; + } + }, + + characterid(identity) { + if (identity.CharacterID && !identity.id) { + identity.id = identity.CharacterID; + } + }, + + // Fix Dataporten having 'user.userid' instead of 'id' + dataporten(identity) { + if (identity.user && identity.user.userid && !identity.id) { + if (identity.user.userid_sec && identity.user.userid_sec[0]) { + identity.id = identity.user.userid_sec[0]; + } else { + identity.id = identity.user.userid; + } + identity.email = identity.user.email; + } + }, + + // Fix for Xenforo [BD]API plugin for 'user.user_id; instead of 'id' + xenforo(identity) { + if (identity.user && identity.user.user_id && !identity.id) { + identity.id = identity.user.user_id; + identity.email = identity.user.user_email; + } + }, + + // Fix general 'phid' instead of 'id' from phabricator + phabricator(identity) { + if (identity.phid && !identity.id) { + identity.id = identity.phid; + } + }, + + // Fix Keycloak-like identities having 'sub' instead of 'id' + kaycloak(identity) { + if (identity.sub && !identity.id) { + identity.id = identity.sub; + } + }, + + // Fix OpenShift identities where id is in 'metadata' object + openshift(identity) { + if (!identity.id && identity.metadata && identity.metadata.uid) { + identity.id = identity.metadata.uid; + identity.name = identity.fullName; + } + }, + + // Fix general 'userid' instead of 'id' from provider + userid(identity) { + if (identity.userid && !identity.id) { + identity.id = identity.userid; + } + }, + + // Fix Nextcloud provider + nextcloud(identity) { + if (!identity.id && identity.ocs && identity.ocs.data && identity.ocs.data.id) { + identity.id = identity.ocs.data.id; + identity.name = identity.ocs.data.displayname; + identity.email = identity.ocs.data.email; + } + }, + + // Fix when authenticating from a meteor app with 'emails' field + meteor(identity) { + if (!identity.email && (identity.emails && Array.isArray(identity.emails) && identity.emails.length >= 1)) { + identity.email = identity.emails[0].address ? identity.emails[0].address : undefined; + } + }, +}; + +const IDENTITY_PROPNAME_FILTER = /(\.)/g; +export const renameInvalidProperties = (input) => { + if (Array.isArray(input)) { + return input.map(renameInvalidProperties); + } + if (!_.isObject(input)) { + return input; + } + + return Object.entries(input).reduce((result, [name, value]) => ({ + ...result, + [name.replace(IDENTITY_PROPNAME_FILTER, '_')]: renameInvalidProperties(value), + }), {}); +}; + +export const getNestedValue = (propertyPath, source) => + propertyPath.split('.').reduce((prev, curr) => (prev ? prev[curr] : undefined), source); + +// /^(.+)@/::email +const REGEXP_FROM_FORMULA = /^\/((?!\/::).*)\/::(.+)/; +export const getRegexpMatch = (formula, data) => { + const regexAndPath = REGEXP_FROM_FORMULA.exec(formula); + if (!regexAndPath) { + return getNestedValue(formula, data); + } + if (regexAndPath.length !== 3) { + throw new Error(`expected array of length 3, got ${ regexAndPath.length }`); + } + + const [, regexString, path] = regexAndPath; + const nestedValue = getNestedValue(path, data); + const regex = new RegExp(regexString); + const matches = regex.exec(nestedValue); + + // regexp does not match nested value + if (!matches) { + return undefined; + } + + // we only support regular expressions with a single capture group + const [, value] = matches; + + // this could mean we return `undefined` (e.g. when capture group is empty) + return value; +}; + +const templateStringRegex = /{{((?:(?!}}).)+)}}/g; +export const fromTemplate = (template, data) => { + if (!templateStringRegex.test(template)) { + return getNestedValue(template, data); + } + + return template.replace(templateStringRegex, (fullMatch, match) => getRegexpMatch(match, data)); +}; diff --git a/app/custom-oauth/server/transform_helpers.tests.js b/app/custom-oauth/server/transform_helpers.tests.js new file mode 100644 index 000000000000..ec1475780e68 --- /dev/null +++ b/app/custom-oauth/server/transform_helpers.tests.js @@ -0,0 +1,122 @@ +/* eslint-env mocha */ + +import { expect } from 'chai'; + +import { + normalizers, + fromTemplate, + renameInvalidProperties, + getNestedValue, + getRegexpMatch, +} from './transform_helpers'; + + +const data = { + id: '123456', + 'invalid.property': true, + name: 'foo', + email: 'foo@bar.com', + nested: { + value: 'baz', + 'another.invalid.prop': true, + }, + list: [{ + 'invalid.property': 'in-array', + }], +}; + +describe('fromTemplate', () => { + const normalizedData = Object.values(normalizers).reduce((normalizedData, normalizer) => { + const result = { ...normalizedData }; + normalizer({ ...result }); + + return result; + }, data); + + it('returns match from regexp on top-level properties', () => { + const template = '{{/^foo@bar\.(.+)/::email}}'; + const expected = 'com'; + const result = fromTemplate(template, normalizedData); + expect(result).to.equal(expected); + }); + + it('returns match from regexp on nested properties', () => { + const template = '{{/^ba(.+)/::nested.value}}'; + const expected = 'z'; + const result = fromTemplate(template, normalizedData); + expect(result).to.equal(expected); + }); + + it('returns value from nested prop with plain syntax', () => { + const template = 'nested.value'; + const expected = normalizedData.nested.value; + const result = fromTemplate(template, normalizedData); + expect(result).to.equal(expected); + }); + + it('returns value from nested prop with template syntax', () => { + const template = '{{nested.value}}'; + const expected = normalizedData.nested.value; + const result = fromTemplate(template, normalizedData); + expect(result).to.equal(expected); + }); + + it('returns composed value from nested prop with template syntax', () => { + const template = '{{name}}.{{nested.value}}'; + const expected = `${ normalizedData.name }.${ normalizedData.nested.value }`; + const result = fromTemplate(template, normalizedData); + + expect(result).to.equal(expected); + }); + + it('returns composed string from multiple template chunks with static parts', () => { + const template = 'composed-{{name}}-at-{{nested.value}}-dot-{{/^foo@bar\.(.+)/::email}}-from-template'; + const expected = 'composed-foo-at-baz-dot-com-from-template'; + const result = fromTemplate(template, normalizedData); + expect(result).to.equal(expected); + }); +}); + +describe('getRegexpMatch', () => { + it('returns nested value when formula is not in the regex::field form', () => { + const formula = 'nested.value'; + expect(getRegexpMatch(formula, data)).to.equal(data.nested.value); + }); + + it("returns undefined when regex doesn't match", () => { + const formula = '/^foo@baz(.+)/::email'; + expect(getRegexpMatch(formula, data)).to.be.undefined; + }); + + it("throws when regex isn't valid", () => { + const formula = '/+/::email'; + expect(() => getRegexpMatch(formula, data)).to.throw(); + }); +}); + +describe('renameInvalidProperties', () => { + it('replaces . chars in field names with _', () => { + const result = renameInvalidProperties(data); + + expect(result['invalid.property']).to.be.undefined; + expect(result.invalid_property).to.equal(data['invalid.property']); + + expect(result.nested['invalid.property']).to.be.undefined; + expect(result.nested.invalid_property).to.equal(data.nested['invalid.property']); + + result.list.forEach((item, idx) => { + expect(item['invalid.property']).to.be.undefined; + expect(item.invalid_property).to.equal(data.list[idx]['invalid.property']); + }); + }); +}); + +describe('getNestedValue', () => { + it("returns undefined when nested value doesn't exist", () => { + expect(getNestedValue('nested.does.not.exist', data)).to.be.undefined; + }); + + it('returns nested object property', () => { + expect(getNestedValue('nested.value', data)).to.equal(data.nested.value); + }); +}); diff --git a/app/custom-sounds/client/admin/adminSounds.html b/app/custom-sounds/client/admin/adminSounds.html index b4ca2015025a..c9a20bd9c4fd 100644 --- a/app/custom-sounds/client/admin/adminSounds.html +++ b/app/custom-sounds/client/admin/adminSounds.html @@ -45,8 +45,11 @@
- {{>icon _id=_id icon="play" block="icon-play-circled"}} - {{>icon _id=_id icon="pause" block="icon-pause-circled"}} + {{#if isPlaying _id}} + {{>icon _id=_id icon="pause" block="icon-pause-circled"}} + {{else}} + {{>icon _id=_id icon="play" block="icon-play-circled"}} + {{/if}} {{>icon _id=_id icon="ban" block="icon-reset-circled"}}
diff --git a/app/custom-sounds/client/admin/adminSounds.js b/app/custom-sounds/client/admin/adminSounds.js index e142bc85d60d..9de092e3c143 100644 --- a/app/custom-sounds/client/admin/adminSounds.js +++ b/app/custom-sounds/client/admin/adminSounds.js @@ -16,6 +16,9 @@ Template.adminSounds.helpers({ const instance = Template.instance(); return instance.filter && instance.filter.get(); }, + isPlaying(_id) { + return Template.instance().isPlayingId.get() === _id; + }, customsounds() { return Template.instance().sounds.get(); }, @@ -62,6 +65,7 @@ Template.adminSounds.onCreated(function() { this.query = new ReactiveVar({}); this.isLoading = new ReactiveVar(false); this.filter = new ReactiveVar(''); + this.isPlayingId = new ReactiveVar(''); this.tabBar = new RocketChatTabBar(); this.tabBar.showGroup(FlowRouter.current().route.name); @@ -138,18 +142,28 @@ Template.adminSounds.events({ t.filter.set(e.currentTarget.value); t.offset.set(0); }, - 'click .icon-play-circled'(e) { + 'click .icon-play-circled'(e, t) { e.preventDefault(); e.stopPropagation(); CustomSounds.play(this._id); + const audio = document.getElementById(t.isPlayingId.get()); + if (audio) { + audio.pause(); + } + document.getElementById(this._id).onended = () => { + t.isPlayingId.set(''); + this.onended = null; + }; + t.isPlayingId.set(this._id); }, - 'click .icon-pause-circled'(e) { + 'click .icon-pause-circled'(e, t) { e.preventDefault(); e.stopPropagation(); const audio = document.getElementById(this._id); if (audio && !audio.paused) { audio.pause(); } + t.isPlayingId.set(''); }, 'click .icon-reset-circled'(e) { e.preventDefault(); diff --git a/app/custom-sounds/client/admin/route.js b/app/custom-sounds/client/admin/route.js index 0150bef09169..0f181fda5787 100644 --- a/app/custom-sounds/client/admin/route.js +++ b/app/custom-sounds/client/admin/route.js @@ -1,7 +1,8 @@ -import { FlowRouter } from 'meteor/kadira:flow-router'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; -FlowRouter.route('/admin/custom-sounds', { +import { registerAdminRoute } from '../../../ui-admin/client'; + +registerAdminRoute('/custom-sounds', { name: 'custom-sounds', async action(/* params*/) { await import('./views'); diff --git a/app/custom-sounds/client/admin/startup.js b/app/custom-sounds/client/admin/startup.js index 5d469ce5d457..2647b17ea42d 100644 --- a/app/custom-sounds/client/admin/startup.js +++ b/app/custom-sounds/client/admin/startup.js @@ -1,7 +1,7 @@ -import { AdminBox } from '../../../ui-utils'; import { hasAtLeastOnePermission } from '../../../authorization'; +import { registerAdminSidebarItem } from '../../../ui-admin/client'; -AdminBox.addOption({ +registerAdminSidebarItem({ href: 'custom-sounds', i18nLabel: 'Custom_Sounds', icon: 'volume', diff --git a/app/custom-sounds/client/index.js b/app/custom-sounds/client/index.js index 918e3247240c..eb17166ef2b8 100644 --- a/app/custom-sounds/client/index.js +++ b/app/custom-sounds/client/index.js @@ -2,5 +2,6 @@ import './notifications/deleteCustomSound'; import './notifications/updateCustomSound'; import './admin/route'; import './admin/startup'; +import '../assets/stylesheets/customSoundsAdmin.css'; export { CustomSounds } from './lib/CustomSounds'; diff --git a/app/dolphin/client/index.js b/app/dolphin/client/index.js index e44dbe195eff..96b9b5213228 100644 --- a/app/dolphin/client/index.js +++ b/app/dolphin/client/index.js @@ -1 +1,2 @@ import '../lib/common'; +import './login-button.css'; diff --git a/app/drupal/client/index.js b/app/drupal/client/index.js index e44dbe195eff..96b9b5213228 100644 --- a/app/drupal/client/index.js +++ b/app/drupal/client/index.js @@ -1 +1,2 @@ import '../lib/common'; +import './login-button.css'; diff --git a/app/e2e/client/index.js b/app/e2e/client/index.js index f4e81a3237eb..0564e11fa6b6 100644 --- a/app/e2e/client/index.js +++ b/app/e2e/client/index.js @@ -1 +1,3 @@ +import './stylesheets/e2e.css'; + export * from './rocketchat.e2e'; diff --git a/app/e2e/client/stylesheets/e2e.less b/app/e2e/client/stylesheets/e2e.css similarity index 100% rename from app/e2e/client/stylesheets/e2e.less rename to app/e2e/client/stylesheets/e2e.css diff --git a/app/emoji-custom/client/admin/route.js b/app/emoji-custom/client/admin/route.js index 169ff2bb637a..575e47831756 100644 --- a/app/emoji-custom/client/admin/route.js +++ b/app/emoji-custom/client/admin/route.js @@ -1,7 +1,8 @@ -import { FlowRouter } from 'meteor/kadira:flow-router'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; -FlowRouter.route('/admin/emoji-custom', { +import { registerAdminRoute } from '../../../ui-admin/client'; + +registerAdminRoute('/emoji-custom', { name: 'emoji-custom', async action(/* params*/) { await import('./views'); diff --git a/app/emoji-custom/client/admin/startup.js b/app/emoji-custom/client/admin/startup.js index 2845727615d4..851786b584f8 100644 --- a/app/emoji-custom/client/admin/startup.js +++ b/app/emoji-custom/client/admin/startup.js @@ -1,7 +1,7 @@ -import { AdminBox } from '../../../ui-utils'; import { hasPermission } from '../../../authorization'; +import { registerAdminSidebarItem } from '../../../ui-admin/client'; -AdminBox.addOption({ +registerAdminSidebarItem({ href: 'emoji-custom', i18nLabel: 'Custom_Emoji', icon: 'emoji', diff --git a/app/emoji-custom/client/index.js b/app/emoji-custom/client/index.js index 8b6f4fc9c0fc..1c143c92bd4c 100644 --- a/app/emoji-custom/client/index.js +++ b/app/emoji-custom/client/index.js @@ -3,3 +3,4 @@ import './notifications/deleteEmojiCustom'; import './notifications/updateEmojiCustom'; import './admin/startup'; import './admin/route'; +import '../assets/stylesheets/emojiCustomAdmin.css'; diff --git a/app/emoji-emojione/client/index.js b/app/emoji-emojione/client/index.js index 8e716d1f414f..3bf47e3c8c5a 100644 --- a/app/emoji-emojione/client/index.js +++ b/app/emoji-emojione/client/index.js @@ -1 +1,2 @@ import '../lib/rocketchat'; +import './emojione-sprites.css'; diff --git a/app/emoji/client/emojiPicker.js b/app/emoji/client/emojiPicker.js index 705ccb412410..7894ab736efc 100644 --- a/app/emoji/client/emojiPicker.js +++ b/app/emoji/client/emojiPicker.js @@ -58,9 +58,10 @@ function getEmojisBySearchTerm(searchTerm) { if (searchRegExp.test(current)) { const emojiObject = emoji.list[current]; - const { emojiPackage } = emojiObject; + const { emojiPackage, shortnames } = emojiObject; let tone = ''; current = current.replace(/:/g, ''); + const alias = shortnames[0] !== undefined ? shortnames[0].replace(/:/g, '') : shortnames[0]; if (actualTone > 0 && emoji.packages[emojiPackage].toneList.hasOwnProperty(emoji)) { tone = `_tone${ actualTone }`; @@ -71,7 +72,8 @@ function getEmojisBySearchTerm(searchTerm) { for (const key in emoji.packages[emojiPackage].emojisByCategory) { if (emoji.packages[emojiPackage].emojisByCategory.hasOwnProperty(key)) { const contents = emoji.packages[emojiPackage].emojisByCategory[key]; - if (contents.indexOf(current) !== -1) { + const searchValArray = alias !== undefined ? alias.replace(/:/g, '').split('_') : alias; + if (contents.indexOf(current) !== -1 || (searchValArray !== undefined && searchValArray.includes(searchTerm))) { emojiFound = true; break; } diff --git a/app/federation/client/admin/dashboard.js b/app/federation/client/admin/dashboard.js index e53325264d23..3d68975bd35b 100644 --- a/app/federation/client/admin/dashboard.js +++ b/app/federation/client/admin/dashboard.js @@ -3,10 +3,9 @@ import { Tracker } from 'meteor/tracker'; import { Template } from 'meteor/templating'; import { ReactiveVar } from 'meteor/reactive-var'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; -import { FlowRouter } from 'meteor/kadira:flow-router'; -import { AdminBox } from '../../../ui-utils'; import { hasRole } from '../../../authorization'; +import { registerAdminRoute, registerAdminSidebarItem } from '../../../ui-admin/client'; import './dashboard.html'; import './dashboard.css'; @@ -69,16 +68,16 @@ Template.dashboard.onRendered(() => { // Route setup -FlowRouter.route('/admin/federation-dashboard', { +registerAdminRoute('/federation-dashboard', { name: 'federation-dashboard', action() { BlazeLayout.render('main', { center: 'dashboard', old: true }); }, }); -AdminBox.addOption({ +registerAdminSidebarItem({ icon: 'discover', - href: 'admin/federation-dashboard', + href: 'federation-dashboard', i18nLabel: 'Federation Dashboard', permissionGranted() { return hasRole(Meteor.userId(), 'admin'); diff --git a/app/federation/server/endpoints/dispatch.js b/app/federation/server/endpoints/dispatch.js index 77a405784316..43fd8641aa7b 100644 --- a/app/federation/server/endpoints/dispatch.js +++ b/app/federation/server/endpoints/dispatch.js @@ -155,6 +155,29 @@ const eventHandlers = { return eventResult; }, + // + // ROOM_USER_LEFT + // + async [eventTypes.ROOM_USER_LEFT](event) { + const eventResult = await FederationRoomEvents.addEvent(event.context, event); + + // If the event was successfully added, handle the event locally + if (eventResult.success) { + const { data: { roomId, user, domainsAfterRemoval } } = event; + + // Remove the user's subscription + Subscriptions.removeByRoomIdAndUserId(roomId, user._id); + + // Refresh the servers list + FederationServers.refreshServers(); + + // Update the room's federation property + Rooms.update({ _id: roomId }, { $set: { 'federation.domains': domainsAfterRemoval } }); + } + + return eventResult; + }, + // // ROOM_MESSAGE // @@ -422,13 +445,19 @@ API.v1.addRoute('federation.events.dispatch', { authRequired: false }, { } // If there was an error handling the event, take action - if (!eventResult.success) { - logger.server.debug(`federation.events.dispatch => Event has missing parents -> event=${ JSON.stringify(event, null, 2) }`); + if (!eventResult || !eventResult.success) { + try { + logger.server.debug(`federation.events.dispatch => Event has missing parents -> event=${ JSON.stringify(event, null, 2) }`); - requestEventsFromLatest(event.origin, getFederationDomain(), contextDefinitions.defineType(event), event.context, eventResult.latestEventIds); + requestEventsFromLatest(event.origin, getFederationDomain(), contextDefinitions.defineType(event), event.context, eventResult.latestEventIds); - // And stop handling the events - break; + // And stop handling the events + break; + } catch (err) { + logger.server.error(() => `dispatch => event=${ JSON.stringify(event, null, 2) } eventResult=${ JSON.stringify(eventResult, null, 2) } error=${ err.toString() } ${ err.stack }`); + + throw err; + } } /* eslint-enable no-await-in-loop */ diff --git a/app/federation/server/hooks/afterLeaveRoom.js b/app/federation/server/hooks/afterLeaveRoom.js new file mode 100644 index 000000000000..5690a561a8a9 --- /dev/null +++ b/app/federation/server/hooks/afterLeaveRoom.js @@ -0,0 +1,53 @@ +import { FederationRoomEvents } from '../../../models/server'; +import { getFederatedRoomData, hasExternalDomain, isLocalUser } from '../functions/helpers'; +import { logger } from '../lib/logger'; +import { normalizers } from '../normalizers'; +import { getFederationDomain } from '../lib/getFederationDomain'; +import { dispatchEvent } from '../handler'; + +async function afterLeaveRoom(user, room) { + const localDomain = getFederationDomain(); + + // If there are not federated users on this room, ignore it + if (!hasExternalDomain(room) && isLocalUser(user, localDomain)) { + return user; + } + + logger.client.debug(() => `afterLeaveRoom => user=${ JSON.stringify(user, null, 2) } room=${ JSON.stringify(room, null, 2) }`); + + const { users } = getFederatedRoomData(room); + + try { + // Get the domains after leave + const domainsAfterLeave = users.map((u) => u.federation.origin); + + // + // Normalize the room's federation status + // + const usersBeforeLeave = users; + usersBeforeLeave.push(user); + + // Get the users domains + const domainsBeforeLeft = usersBeforeLeave.map((u) => u.federation.origin); + + // + // Create the user left event + // + const normalizedSourceUser = normalizers.normalizeUser(user); + + const userLeftEvent = await FederationRoomEvents.createUserLeftEvent(localDomain, room._id, normalizedSourceUser, domainsAfterLeave); + + // Dispatch the events + dispatchEvent(domainsBeforeLeft, userLeftEvent); + } catch (err) { + logger.client.error('afterLeaveRoom => Could not make user leave:', err); + } + + return user; +} + +export const definition = { + hook: 'afterLeaveRoom', + callback: (roomOwner, room) => Promise.await(afterLeaveRoom(roomOwner, room)), + id: 'federation-after-leave-room', +}; diff --git a/app/federation/server/hooks/afterRemoveFromRoom.js b/app/federation/server/hooks/afterRemoveFromRoom.js index ad876ae36577..bcc5fb2baaad 100644 --- a/app/federation/server/hooks/afterRemoveFromRoom.js +++ b/app/federation/server/hooks/afterRemoveFromRoom.js @@ -42,7 +42,7 @@ async function afterRemoveFromRoom(involvedUsers, room) { // Dispatch the events dispatchEvent(domainsBeforeRemoval, removeUserEvent); } catch (err) { - logger.client.error('afterRemoveFromRoom => Could not add user:', err); + logger.client.error('afterRemoveFromRoom => Could not remove user:', err); } return involvedUsers; diff --git a/app/federation/server/startup/registerCallbacks.js b/app/federation/server/startup/registerCallbacks.js index 677b4daddcc2..6702140d038c 100644 --- a/app/federation/server/startup/registerCallbacks.js +++ b/app/federation/server/startup/registerCallbacks.js @@ -3,6 +3,7 @@ import { definition as afterAddedToRoomDef } from '../hooks/afterAddedToRoom'; import { definition as afterCreateDirectRoomDef } from '../hooks/afterCreateDirectRoom'; import { definition as afterCreateRoomDef } from '../hooks/afterCreateRoom'; import { definition as afterDeleteMessageDef } from '../hooks/afterDeleteMessage'; +import { definition as afterLeaveRoomDef } from '../hooks/afterLeaveRoom'; import { definition as afterMuteUserDef } from '../hooks/afterMuteUser'; import { definition as afterRemoveFromRoomDef } from '../hooks/afterRemoveFromRoom'; import { definition as afterSaveMessageDef } from '../hooks/afterSaveMessage'; @@ -15,6 +16,7 @@ registerCallback(afterAddedToRoomDef); registerCallback(afterCreateDirectRoomDef); registerCallback(afterCreateRoomDef); registerCallback(afterDeleteMessageDef); +registerCallback(afterLeaveRoomDef); registerCallback(afterMuteUserDef); registerCallback(beforeDeleteRoomDef); registerCallback(afterSaveMessageDef); diff --git a/app/github-enterprise/client/index.js b/app/github-enterprise/client/index.js index e44dbe195eff..c43a3da658b4 100644 --- a/app/github-enterprise/client/index.js +++ b/app/github-enterprise/client/index.js @@ -1 +1,2 @@ import '../lib/common'; +import './github-enterprise-login-button.css'; diff --git a/app/gitlab/client/index.js b/app/gitlab/client/index.js index e44dbe195eff..4af492503474 100644 --- a/app/gitlab/client/index.js +++ b/app/gitlab/client/index.js @@ -1 +1,2 @@ import '../lib/common'; +import './gitlab-login-button.css'; diff --git a/app/importer-csv/server/importer.js b/app/importer-csv/server/importer.js index bac5254a8773..4e113e5c5726 100644 --- a/app/importer-csv/server/importer.js +++ b/app/importer-csv/server/importer.js @@ -86,9 +86,7 @@ export class CsvImporter extends Base { const parsedUsers = this.csvParser(entry.getData().toString()); tempUsers = parsedUsers.map((u) => ({ id: Random.id(), username: u[0].trim(), email: u[1].trim(), name: u[2].trim() })); - this.collection.insert({ import: this.importRecord._id, importer: this.name, type: 'users', users: tempUsers }); super.updateRecord({ 'count.users': tempUsers.length }); - super.addCountToTotal(tempUsers.length); return increaseCount(); } @@ -141,7 +139,8 @@ export class CsvImporter extends Base { increaseCount(); }); - super.addCountToTotal(messagesCount); + this.collection.insert({ import: this.importRecord._id, importer: this.name, type: 'users', users: tempUsers }); + super.addCountToTotal(messagesCount + tempUsers.length); ImporterWebsocket.progressUpdated({ rate: 100 }); if (hasDirectMessages) { diff --git a/app/importer-slack/server/importer.js b/app/importer-slack/server/importer.js index 8cbfb213f575..5b0823423ef4 100644 --- a/app/importer-slack/server/importer.js +++ b/app/importer-slack/server/importer.js @@ -13,8 +13,9 @@ import { } from '../../importer/server'; import { getUserAvatarURL } from '../../utils/lib/getUserAvatarURL'; import { Users, Rooms, Messages } from '../../models'; -import { insertMessage } from '../../lib'; +import { insertMessage, createDirectRoom } from '../../lib'; import { getValidRoomName } from '../../utils'; +import { settings } from '../../settings/lib/settings'; export class SlackImporter extends Base { constructor(info, importRecord) { @@ -399,11 +400,14 @@ export class SlackImporter extends Base { msg: file.url_private_download || '', _importFile: this.convertSlackFileToPendingFile(file), }; + if (message.thread_ts && (message.thread_ts !== message.ts)) { + msgObj.tmid = `slack-${ slackChannel.id }-${ message.thread_ts.replace(/\./g, '-') }`; + } insertMessage(fileUser, msgObj, room, this._anyExistingSlackMessage); }); } - if (message.subtype) { + if (message.subtype && (message.subtype !== 'thread_broadcast')) { this.processMessageSubType(message, room, msgDataDefaults, missedTypes); } else { const user = this.getRocketUserFromUserId(message.user); @@ -419,6 +423,29 @@ export class SlackImporter extends Base { }, }; + if (message.thread_ts) { + if (message.thread_ts === message.ts) { + if (message.reply_users) { + msgObj.replies = []; + message.reply_users.forEach(function(item) { + msgObj.replies.push(item); + }); + } else if (message.replies) { + msgObj.replies = []; + message.replies.forEach(function(item) { + msgObj.replies.push(item.user); + }); + } else { + this.logger.warn(`Failed to import the parent comment, message: ${ msgDataDefaults._id }. Missing replies/reply_users field`); + } + + msgObj.tcount = message.reply_count; + msgObj.tlm = new Date(parseInt(message.latest_reply.split('.')[0]) * 1000); + } else { + msgObj.tmid = `slack-${ slackChannel.id }-${ message.thread_ts.replace(/\./g, '-') }`; + } + } + if (message.edited) { msgObj.editedAt = new Date(parseInt(message.edited.ts.split('.')[0]) * 1000); const editedBy = this.getRocketUserFromUserId(message.edited.user); @@ -526,13 +553,17 @@ export class SlackImporter extends Base { return existingRoom; } - _getChannelUserList(channel) { + _getChannelUserList(channel, returnObject = false, includeCreator = false) { return channel.members.reduce((ret, member) => { - if (member !== channel.creator) { + if (includeCreator || member !== channel.creator) { const user = this.getRocketUserFromUserId(member); // Don't add bots to the room's member list; Since they are all replaced with rocket.cat, it could cause duplicated subscriptions if (user && user.username && user._id !== 'rocket.cat') { - ret.push(user.username); + if (returnObject) { + ret.push(user); + } else { + ret.push(user.username); + } } } return ret; @@ -599,7 +630,50 @@ export class SlackImporter extends Base { } _importMpims(startedByUserId, channelNames) { - this._importPrivateGroupList(startedByUserId, this.mpims, channelNames); + if (!this.mpims || !this.mpims.channels) { + return; + } + + const maxUsers = settings.get('DirectMesssage_maxUsers') || 1; + + this.mpims.channels.forEach((channel) => { + if (!channel.do_import) { + this.addCountCompleted(1); + return; + } + + channelNames.push(channel.name); + + Meteor.runAsUser(startedByUserId, () => { + const users = this._getChannelUserList(channel, true, true); + const existingRoom = Rooms.findOneDirectRoomContainingAllUserIDs(users, { fields: { _id: 1 } }); + + if (existingRoom) { + channel.rocketId = existingRoom._id; + Rooms.update({ _id: channel.rocketId }, { $addToSet: { importIds: channel.id } }); + } else { + const userId = this.getImportedRocketUserIdFromSlackUserId(channel.creator) || startedByUserId; + Meteor.runAsUser(userId, () => { + // If there are too many users for a direct room, then create a private group instead + if (users.length > maxUsers) { + const usernames = users.map((user) => user.username); + const group = Meteor.call('createPrivateGroup', channel.name, usernames); + channel.rocketId = group.rid; + return; + } + + const newRoom = createDirectRoom(users); + channel.rocketId = newRoom._id; + }); + + this._updateImportedChannelTopicAndDescription(channel); + } + + this.addCountCompleted(1); + }); + }); + + this.collection.update({ _id: this.mpims._id }, { $set: { channels: this.mpims.channels } }); } _importDMs(startedByUserId, channelNames) { @@ -616,33 +690,26 @@ export class SlackImporter extends Base { } Meteor.runAsUser(startedByUserId, () => { - const userId1 = this.getImportedRocketUserIdFromSlackUserId(channel.members[0]); - const userId2 = this.getImportedRocketUserIdFromSlackUserId(channel.members[1]); + const user1 = this.getRocketUserFromUserId(channel.members[0]); + const user2 = this.getRocketUserFromUserId(channel.members[1]); - const rid = [userId1, userId2].sort().join(''); - const existingRoom = Rooms.findOneById(rid); + const existingRoom = Rooms.findOneDirectRoomContainingAllUserIDs([user1, user2], { fields: { _id: 1 } }); if (existingRoom) { channel.rocketId = existingRoom._id; Rooms.update({ _id: channel.rocketId }, { $addToSet: { importIds: channel.id } }); } else { - if (!userId1) { + if (!user1) { this.logger.error(`DM creation: User not found for id ${ channel.members[0] } and channel id ${ channel.id }`); return; } - if (!userId2) { + if (!user2) { this.logger.error(`DM creation: User not found for id ${ channel.members[1] } and channel id ${ channel.id }`); return; } - const user = this._getBasicUserData(userId2); - - if (!user) { - return; - } - - const roomInfo = Meteor.runAsUser(userId1, () => Meteor.call('createDirectMessage', user.username)); + const roomInfo = Meteor.runAsUser(user1._id, () => Meteor.call('createDirectMessage', user2.username)); channel.rocketId = roomInfo.rid; Rooms.update({ _id: channel.rocketId }, { $addToSet: { importIds: channel.id } }); } @@ -765,6 +832,7 @@ export class SlackImporter extends Base { try { this._importUsers(startedByUserId); + super.updateProgress(ProgressStep.IMPORTING_CHANNELS); this._importChannels(startedByUserId, channelNames); this._importGroups(startedByUserId, channelNames); this._importMpims(startedByUserId, channelNames); diff --git a/app/importer/client/admin/adminImport.html b/app/importer/client/admin/adminImport.html deleted file mode 100644 index 87fc49ab06d6..000000000000 --- a/app/importer/client/admin/adminImport.html +++ /dev/null @@ -1,55 +0,0 @@ - diff --git a/app/importer/client/admin/adminImport.js b/app/importer/client/admin/adminImport.js deleted file mode 100644 index ddbf8fc0f8d6..000000000000 --- a/app/importer/client/admin/adminImport.js +++ /dev/null @@ -1,136 +0,0 @@ -import { Tracker } from 'meteor/tracker'; -import { FlowRouter } from 'meteor/kadira:flow-router'; -import { Template } from 'meteor/templating'; -import { ReactiveVar } from 'meteor/reactive-var'; -import toastr from 'toastr'; - -import { t, APIClient } from '../../../utils'; -import { SideNav } from '../../../ui-utils/client'; -import { ImportWaitingStates, ImportFileReadyStates, ImportPreparingStartedStates, ImportingStartedStates, ProgressStep } from '../../lib/ImporterProgressStep'; - -import './adminImport.html'; -import './importOperationSummary.js'; - -Template.adminImport.helpers({ - isPreparing() { - return Template.instance().preparing.get(); - }, - history() { - return Template.instance().history.get(); - }, - - operation() { - return Template.instance().operation.get(); - }, - - isNotCurrentOperation() { - const operation = Template.instance().operation.get(); - if (!operation) { - return true; - } - - return operation._id !== this._id || !operation.valid; - }, - - canShowCurrentOperation() { - const operation = Template.instance().operation.get(); - return operation && operation.valid; - }, - - canContinueOperation() { - const operation = Template.instance().operation.get(); - if (!operation || !operation.valid) { - return false; - } - - const possibleStatus = [ProgressStep.USER_SELECTION].concat(ImportWaitingStates).concat(ImportFileReadyStates).concat(ImportPreparingStartedStates); - return possibleStatus.includes(operation.status); - }, - - canCheckOperationProgress() { - const operation = Template.instance().operation.get(); - if (!operation || !operation.valid) { - return false; - } - - return ImportingStartedStates.includes(operation.status); - }, - - anySuccessfulSlackImports() { - const history = Template.instance().history.get(); - if (!history) { - return false; - } - - for (const op of history) { - if (op.importerKey === 'slack' && op.status === ProgressStep.DONE) { - return true; - } - } - - return false; - }, -}); - -Template.adminImport.events({ - 'click .new-import-btn'() { - FlowRouter.go('/admin/import/new'); - }, - 'click .download-slack-files-btn'(event, template) { - template.preparing.set(true); - APIClient.post('v1/downloadPendingFiles').then((data) => { - template.preparing.set(false); - if (data.count) { - toastr.success(t('File_Downloads_Started')); - FlowRouter.go('/admin/import/progress'); - } else { - toastr.success(t('No_files_left_to_download')); - } - }).catch((error) => { - template.preparing.set(false); - if (error) { - console.error(error); - toastr.error(t('Failed_To_Download_Files')); - } - }); - }, - 'click .prepare-btn'() { - FlowRouter.go('/admin/import/prepare'); - }, - 'click .progress-btn'() { - FlowRouter.go('/admin/import/progress'); - }, -}); - -Template.adminImport.onCreated(function() { - const instance = this; - this.preparing = new ReactiveVar(true); - this.history = new ReactiveVar([]); - this.operation = new ReactiveVar(false); - - APIClient.get('v1/getCurrentImportOperation').then((data) => { - instance.operation.set(data.operation); - - APIClient.get('v1/getLatestImportOperations').then((data) => { - instance.history.set(data); - instance.preparing.set(false); - }).catch((error) => { - if (error) { - toastr.error(t('Failed_To_Load_Import_History')); - instance.preparing.set(false); - } - }); - }).catch((error) => { - if (error) { - toastr.error(t('Failed_To_Load_Import_Operation')); - instance.preparing.set(false); - } - }); -}); - -Template.adminImport.onRendered(() => { - Tracker.afterFlush(() => { - SideNav.setFlex('adminFlex'); - SideNav.openFlex(); - }); -}); diff --git a/app/importer/client/admin/adminImportNew.html b/app/importer/client/admin/adminImportNew.html deleted file mode 100644 index 17e9230b5cb2..000000000000 --- a/app/importer/client/admin/adminImportNew.html +++ /dev/null @@ -1,83 +0,0 @@ - diff --git a/app/importer/client/admin/adminImportNew.js b/app/importer/client/admin/adminImportNew.js deleted file mode 100644 index 2d643312dc1c..000000000000 --- a/app/importer/client/admin/adminImportNew.js +++ /dev/null @@ -1,158 +0,0 @@ -import { Tracker } from 'meteor/tracker'; -import { FlowRouter } from 'meteor/kadira:flow-router'; -import { Template } from 'meteor/templating'; -import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; -import { ReactiveVar } from 'meteor/reactive-var'; -import toastr from 'toastr'; - -import { t, APIClient } from '../../../utils'; -import { SideNav } from '../../../ui-utils/client'; -import { settings } from '../../../settings'; -import { showImporterException } from '../functions/showImporterException'; - -import { Importers } from '..'; - -import './adminImportNew.html'; - -Template.adminImportNew.helpers({ - isPreparing() { - return Template.instance().preparing.get(); - }, - importers() { - return Importers.getAll(); - }, - pageTitle() { - const importerKey = Template.instance().importType.get(); - if (!importerKey) { - return t('Import_New_File'); - } - - const importer = Importers.get(importerKey); - if (!importer) { - return t('Import_New_File'); - } - - return TAPi18n.__('Importer_From_Description', { from: t(importer.name) }); - }, - importType() { - return Template.instance().importType.get(); - }, - fileType() { - return Template.instance().fileType.get(); - }, - isImporterSelected() { - return Template.instance().importType.get(); - }, - isFileTypeSelected() { - return Template.instance().fileType.get(); - }, - isUpload() { - return Template.instance().fileType.get() === 'upload'; - }, - isPublicURL() { - return Template.instance().fileType.get() === 'url'; - }, - isServerFile() { - return Template.instance().fileType.get() === 'path'; - }, - fileSizeLimitMessage() { - const maxFileSize = settings.get('FileUpload_MaxFileSize'); - let message; - - if (maxFileSize > 0) { - const sizeInKb = maxFileSize / 1024; - const sizeInMb = sizeInKb / 1024; - - let fileSizeMessage; - if (sizeInMb > 0) { - fileSizeMessage = TAPi18n.__('FileSize_MB', { fileSize: sizeInMb.toFixed(2) }); - } else if (sizeInKb > 0) { - fileSizeMessage = TAPi18n.__('FileSize_KB', { fileSize: sizeInKb.toFixed(2) }); - } else { - fileSizeMessage = TAPi18n.__('FileSize_Bytes', { fileSize: maxFileSize.toFixed(0) }); - } - - message = TAPi18n.__('Importer_Upload_FileSize_Message', { maxFileSize: fileSizeMessage }); - } else { - message = TAPi18n.__('Importer_Upload_Unlimited_FileSize'); - } - - return message; - }, -}); - -Template.adminImportNew.events({ - 'change .file-type'(event, template) { - template.fileType.set($('select[name=file-type]').val()); - }, - 'change .import-type'(event, template) { - template.importType.set($('select[name=import-type]').val()); - }, - - 'change .import-file-input'(event, template) { - const importType = template.importType.get(); - - const e = event.originalEvent || event; - let { files } = e.target; - if (!files || (files.length === 0)) { - files = (e.dataTransfer != null ? e.dataTransfer.files : undefined) || []; - } - - Array.from(files).forEach((file) => { - template.preparing.set(true); - - const reader = new FileReader(); - - reader.readAsDataURL(file); - reader.onloadend = () => { - APIClient.post('v1/uploadImportFile', { - binaryContent: reader.result.split(';base64,')[1], - contentType: file.type, - fileName: file.name, - importerKey: importType, - }).then(() => { - toastr.success(t('File_uploaded_successfully')); - FlowRouter.go('/admin/import/prepare'); - }).catch((error) => { - if (error) { - showImporterException(error); - template.preparing.set(false); - } - }); - }; - }); - }, - - 'click .import-btn'(event, template) { - const importType = template.importType.get(); - const fileUrl = $('.import-file-url').val(); - - template.preparing.set(true); - - APIClient.post('v1/downloadPublicImportFile', { - fileUrl, - importerKey: importType, - }).then(() => { - toastr.success(t('Import_requested_successfully')); - FlowRouter.go('/admin/import/prepare'); - }).catch((error) => { - if (error) { - showImporterException(error); - template.preparing.set(false); - } - }); - }, -}); - -Template.adminImportNew.onCreated(function() { - this.preparing = new ReactiveVar(false); - this.importType = new ReactiveVar(''); - this.fileType = new ReactiveVar('upload'); -}); - -Template.adminImportNew.onRendered(() => { - Tracker.afterFlush(() => { - SideNav.setFlex('adminFlex'); - SideNav.openFlex(); - }); -}); diff --git a/app/importer/client/admin/adminImportPrepare.html b/app/importer/client/admin/adminImportPrepare.html deleted file mode 100644 index 54f4fc2369f4..000000000000 --- a/app/importer/client/admin/adminImportPrepare.html +++ /dev/null @@ -1,71 +0,0 @@ - diff --git a/app/importer/client/admin/adminImportPrepare.js b/app/importer/client/admin/adminImportPrepare.js deleted file mode 100644 index f37dc66a4b80..000000000000 --- a/app/importer/client/admin/adminImportPrepare.js +++ /dev/null @@ -1,203 +0,0 @@ -import { Tracker } from 'meteor/tracker'; -import { FlowRouter } from 'meteor/kadira:flow-router'; -import { Template } from 'meteor/templating'; -import { ReactiveVar } from 'meteor/reactive-var'; -import toastr from 'toastr'; - -import { t, APIClient } from '../../../utils'; -import { SideNav } from '../../../ui-utils/client'; -import { ProgressStep, ImportWaitingStates, ImportFileReadyStates, ImportPreparingStartedStates, ImportingStartedStates, ImportingErrorStates } from '../../lib/ImporterProgressStep'; -import { showImporterException } from '../functions/showImporterException'; - -import { ImporterWebsocketReceiver } from '..'; - -import './adminImportPrepare.html'; - -Template.adminImportPrepare.helpers({ - isPreparing() { - return Template.instance().preparing.get(); - }, - hasProgressRate() { - return Template.instance().progressRate.get() !== false; - }, - progressRate() { - const rate = Template.instance().progressRate.get(); - if (rate) { - return `${ rate }%`; - } - - return ''; - }, - pageTitle() { - return t('Importing_Data'); - }, - users() { - return Template.instance().users.get(); - }, - channels() { - return Template.instance().channels.get(); - }, - message_count() { - return Template.instance().message_count.get(); - }, -}); - -Template.adminImportPrepare.events({ - 'click .button.start'(event, template) { - const btn = this; - $(btn).prop('disabled', true); - for (const user of Array.from(template.users.get())) { - user.do_import = $(`[name='${ user.user_id }']`).is(':checked'); - } - - for (const channel of Array.from(template.channels.get())) { - channel.do_import = $(`[name='${ channel.channel_id }']`).is(':checked'); - } - - APIClient.post('v1/startImport', { input: { users: template.users.get(), channels: template.channels.get() } }).then(() => { - template.users.set([]); - template.channels.set([]); - return FlowRouter.go('/admin/import/progress'); - }).catch((error) => { - if (error) { - showImporterException(error, 'Failed_To_Start_Import'); - return FlowRouter.go('/admin/import'); - } - }); - }, - - 'click .button.uncheck-deleted-users'(event, template) { - Array.from(template.users.get()).filter((user) => user.is_deleted).map((user) => { - const box = $(`[name=${ user.user_id }]`); - return box && box.length && box[0].checked && box.click(); - }); - }, - - 'click .button.uncheck-archived-channels'(event, template) { - Array.from(template.channels.get()).filter((channel) => channel.is_archived).map((channel) => { - const box = $(`[name=${ channel.channel_id }]`); - return box && box.length && box[0].checked && box.click(); - }); - }, - -}); - -function getImportFileData(template) { - APIClient.get('v1/getImportFileData').then((data) => { - if (!data) { - console.warn('The importer is not set up correctly, as it did not return any data.'); - toastr.error(t('Importer_not_setup')); - return FlowRouter.go('/admin/import'); - } - - if (data.waiting) { - setTimeout(() => { - getImportFileData(template); - }, 1000); - return; - } - - if (data.step) { - console.warn('Invalid file, contains `data.step`.', data); - toastr.error(t('Failed_To_Load_Import_Data')); - return FlowRouter.go('/admin/import'); - } - - template.users.set(data.users); - template.channels.set(data.channels); - template.message_count.set(data.message_count); - template.preparing.set(false); - template.progressRate.set(false); - }).catch((error) => { - if (error) { - showImporterException(error, 'Failed_To_Load_Import_Data'); - return FlowRouter.go('/admin/import'); - } - }); -} - -function loadOperation(template) { - APIClient.get('v1/getCurrentImportOperation').then((data) => { - const { operation } = data; - - if (!operation.valid) { - return FlowRouter.go('/admin/import/new'); - } - - // If the import has already started, move to the progress screen - if (ImportingStartedStates.includes(operation.status)) { - return FlowRouter.go('/admin/import/progress'); - } - - // The getImportFileData method can handle it if the state is: - // 1) ready to select the users, - // 2) preparing - // 3) ready to be prepared - - if (operation.status === ProgressStep.USER_SELECTION || ImportPreparingStartedStates.includes(operation.status) || ImportFileReadyStates.includes(operation.status)) { - if (!template.callbackRegistered) { - ImporterWebsocketReceiver.registerCallback(template.progressUpdated); - template.callbackRegistered = true; - } - - getImportFileData(template); - return template.preparing.set(true); - } - - // We're still waiting for a file... This shouldn't take long - if (ImportWaitingStates.includes(operation.status)) { - setTimeout(() => { - loadOperation(template); - }, 1000); - - return template.preparing.set(true); - } - - if (ImportingErrorStates.includes(operation.status)) { - toastr.error(t('Import_Operation_Failed')); - return FlowRouter.go('/admin/import'); - } - - if (operation.status === ProgressStep.DONE) { - return FlowRouter.go('/admin/import'); - } - - toastr.error(t('Unknown_Import_State')); - return FlowRouter.go('/admin/import'); - }).catch((error) => { - if (error) { - toastr.error(t('Failed_To_Load_Import_Data')); - return FlowRouter.go('/admin/import'); - } - }); -} - -Template.adminImportPrepare.onCreated(function() { - this.preparing = new ReactiveVar(true); - this.progressRate = new ReactiveVar(false); - this.callbackRegistered = false; - this.users = new ReactiveVar([]); - this.channels = new ReactiveVar([]); - this.message_count = new ReactiveVar(0); - - this.progressUpdated = (progress) => { - if ('rate' in progress) { - const { rate } = progress; - this.progressRate.set(rate); - } - }; - - loadOperation(this); -}); - -Template.adminImportPrepare.onRendered(() => { - Tracker.afterFlush(() => { - SideNav.setFlex('adminFlex'); - SideNav.openFlex(); - }); -}); - -Template.adminImportPrepare.onDestroyed(function() { - this.callbackRegistered = false; - ImporterWebsocketReceiver.unregisterCallback(this.progressUpdated); -}); diff --git a/app/importer/client/admin/adminImportProgress.html b/app/importer/client/admin/adminImportProgress.html deleted file mode 100644 index 05337b38b150..000000000000 --- a/app/importer/client/admin/adminImportProgress.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/app/importer/client/admin/adminImportProgress.js b/app/importer/client/admin/adminImportProgress.js deleted file mode 100644 index cf59ab3c79cc..000000000000 --- a/app/importer/client/admin/adminImportProgress.js +++ /dev/null @@ -1,137 +0,0 @@ -import { ReactiveVar } from 'meteor/reactive-var'; -import { FlowRouter } from 'meteor/kadira:flow-router'; -import { Template } from 'meteor/templating'; -import toastr from 'toastr'; - -import { t, handleError, APIClient } from '../../../utils'; -import { ProgressStep, ImportingStartedStates } from '../../lib/ImporterProgressStep'; - -import { ImporterWebsocketReceiver } from '..'; - -import './adminImportProgress.html'; - -Template.adminImportProgress.helpers({ - step() { - return Template.instance().step.get(); - }, - completed() { - return Template.instance().completed.get(); - }, - total() { - return Template.instance().total.get(); - }, - progressRate() { - try { - const instance = Template.instance(); - const completed = instance.completed.get(); - const total = instance.total.get(); - - const rate = Math.floor(completed * 10000 / total) / 100; - - if (isNaN(rate)) { - return ''; - } - - return `${ rate }%`; - } catch { - return ''; - } - }, -}); - -Template.adminImportProgress.onCreated(function() { - const template = this; - this.operation = new ReactiveVar(false); - this.step = new ReactiveVar(t('Loading...')); - this.completed = new ReactiveVar(0); - this.total = new ReactiveVar(0); - - let importerKey = false; - - function _updateProgress(progress) { - switch (progress.step) { - case ProgressStep.DONE: - toastr.success(t(progress.step[0].toUpperCase() + progress.step.slice(1))); - return FlowRouter.go('/admin/import'); - case ProgressStep.ERROR: - case ProgressStep.CANCELLED: - toastr.error(t(progress.step[0].toUpperCase() + progress.step.slice(1))); - return FlowRouter.go('/admin/import'); - default: - template.step.set(t(progress.step[0].toUpperCase() + progress.step.slice(1))); - if (progress.count.completed) { - template.completed.set(progress.count.completed); - } - if (progress.count.total) { - template.total.set(progress.count.total); - } - break; - } - } - - this.progressUpdated = function _progressUpdated(progress) { - if (progress.key.toLowerCase() !== importerKey) { - return; - } - - _updateProgress(progress); - }; - - APIClient.get('v1/getCurrentImportOperation').then((data) => { - const { operation } = data; - - if (!operation.valid) { - return FlowRouter.go('/admin/import'); - } - - // If the import has not started, move to the prepare screen - if (!ImportingStartedStates.includes(operation.status)) { - return FlowRouter.go('/admin/import/prepare'); - } - - importerKey = operation.importerKey; - template.operation.set(operation); - if (operation.count) { - if (operation.count.total) { - template.total.set(operation.count.total); - } - if (operation.count.completed) { - template.completed.set(operation.count.completed); - } - } - - APIClient.get('v1/getImportProgress').then((progress) => { - if (!progress) { - toastr.warning(t('Importer_not_in_progress')); - return FlowRouter.go('/admin/import/prepare'); - } - - const whereTo = _updateProgress(progress); - - if (!whereTo) { - ImporterWebsocketReceiver.registerCallback(template.progressUpdated); - } - }).catch((error) => { - console.warn('Error on getting the import progress:', error); - - if (error) { - handleError(error); - } else { - toastr.error(t('Failed_To_Load_Import_Data')); - } - - return FlowRouter.go('/admin/import'); - }); - }).catch((error) => { - if (error) { - handleError(error); - } else { - toastr.error(t('Failed_To_Load_Import_Data')); - } - return FlowRouter.go('/admin/import'); - }); -}); - -Template.adminImportProgress.onDestroyed(function() { - ImporterWebsocketReceiver.unregisterCallback(this.progressUpdated); -}); diff --git a/app/importer/client/admin/importOperationSummary.html b/app/importer/client/admin/importOperationSummary.html index 2378a4ebddc8..c033a4ffe3b9 100644 --- a/app/importer/client/admin/importOperationSummary.html +++ b/app/importer/client/admin/importOperationSummary.html @@ -1,6 +1,6 @@ diff --git a/app/statistics/server/lib/statistics.js b/app/statistics/server/lib/statistics.js index b2907cd0ad81..a588ccda862d 100644 --- a/app/statistics/server/lib/statistics.js +++ b/app/statistics/server/lib/statistics.js @@ -1,7 +1,6 @@ import os from 'os'; import _ from 'underscore'; -import { Push } from 'meteor/rocketchat:push'; import { Meteor } from 'meteor/meteor'; import { InstanceStatus } from 'meteor/konecty:multiple-instances-status'; @@ -22,6 +21,7 @@ import { Info, getMongoInfo } from '../../../utils/server'; import { Migrations } from '../../../migrations/server'; import { Apps } from '../../../apps/server'; import { getStatistics as federationGetStatistics } from '../../../federation/server/functions/dashboard'; +import { NotificationQueue } from '../../../models/server/raw'; const wizardFields = [ 'Organization_Type', @@ -62,6 +62,7 @@ export const statistics = { // User statistics statistics.totalUsers = Users.find().count(); statistics.activeUsers = Users.getActiveLocalUserCount(); + statistics.activeGuests = Users.getActiveLocalGuestCount(); statistics.nonActiveUsers = Users.find({ active: false }).count(); statistics.appUsers = Users.find({ type: 'app' }).count(); statistics.onlineUsers = Meteor.users.find({ statusConnection: 'online' }).count(); @@ -166,7 +167,7 @@ export const statistics = { totalWithScriptEnabled: integrations.filter((integration) => integration.scriptEnabled === true).length, }; - statistics.pushQueue = Push.notifications.find().count(); + statistics.pushQueue = Promise.await(NotificationQueue.col.estimatedDocumentCount()); return statistics; }, diff --git a/app/theme/client/imports/components/header.css b/app/theme/client/imports/components/header.css index 21648b21ae4b..d5b0a05cf493 100644 --- a/app/theme/client/imports/components/header.css +++ b/app/theme/client/imports/components/header.css @@ -75,6 +75,8 @@ padding: 0 0.5rem; + cursor: pointer; + align-items: center; &-action { diff --git a/app/theme/client/imports/components/popover.css b/app/theme/client/imports/components/popover.css index 15c2b539286d..551c02e9dd40 100644 --- a/app/theme/client/imports/components/popover.css +++ b/app/theme/client/imports/components/popover.css @@ -34,8 +34,14 @@ display: flex; + overflow: auto; + flex-direction: column; + height: auto; + + max-height: 70%; + padding: var(--popover-padding); animation: dropdown-show 0.1s cubic-bezier(0.45, 0.05, 0.55, 0.95); diff --git a/app/theme/client/imports/components/sidebar/sidebar-item.css b/app/theme/client/imports/components/sidebar/sidebar-item.css index b74a84800690..125ed7283f45 100644 --- a/app/theme/client/imports/components/sidebar/sidebar-item.css +++ b/app/theme/client/imports/components/sidebar/sidebar-item.css @@ -5,6 +5,10 @@ background-color: var(--sidebar-background-light-hover); } + &--active { + background-color: var(--sidebar-background-light-active); + } + &__picture { color: inherit; } diff --git a/app/theme/client/imports/general/base_old.css b/app/theme/client/imports/general/base_old.css index 33c75af298e5..dc786964fff5 100644 --- a/app/theme/client/imports/general/base_old.css +++ b/app/theme/client/imports/general/base_old.css @@ -4848,7 +4848,7 @@ rc-old select, display: block; } -.rc-old .hide-usernames .message .user.user-card-message { +.rc-old .hide-usernames .message .user.user-card-message .message-alias { display: none; } diff --git a/app/theme/client/imports/general/variables.css b/app/theme/client/imports/general/variables.css index c5aaaeecf7ef..2cfb61fd812f 100644 --- a/app/theme/client/imports/general/variables.css +++ b/app/theme/client/imports/general/variables.css @@ -51,6 +51,7 @@ --rc-color-alert-message-warning: #d52d24; --rc-color-alert-message-warning-background: #fff3f3; --rc-color-primary: var(--color-dark); + --rc-color-primary-background: var(--color-dark); --rc-color-primary-darkest: var(--color-darkest); --rc-color-primary-dark: var(--color-dark-medium); --rc-color-primary-light: var(--color-gray); @@ -176,10 +177,11 @@ */ --sidebar-width: 280px; --sidebar-small-width: 90%; - --sidebar-background: var(--rc-color-primary); + --sidebar-background: var(--rc-color-primary-background); --sidebar-background-hover: var(--rc-color-primary-dark); --sidebar-background-light: var(--rc-color-primary-lightest); --sidebar-background-light-hover: var(--rc-color-primary-light); + --sidebar-background-light-active: var(--rc-color-primary-light-medium); --sidebar-default-padding: 24px; --sidebar-small-default-padding: 16px; --sidebar-extra-small-default-padding: 12px; diff --git a/app/theme/client/index.js b/app/theme/client/index.js new file mode 100644 index 000000000000..2dc7ee1fe082 --- /dev/null +++ b/app/theme/client/index.js @@ -0,0 +1,4 @@ +import './main.css'; +import './vendor/photoswipe.css'; +import './vendor/fontello/css/fontello.css'; +import './rocketchat.font.css'; diff --git a/client/rocketchat.font.css b/app/theme/client/rocketchat.font.css similarity index 100% rename from client/rocketchat.font.css rename to app/theme/client/rocketchat.font.css diff --git a/app/threads/client/flextab/thread.html b/app/threads/client/flextab/thread.html index c5378fb86082..3677d402c8c3 100644 --- a/app/threads/client/flextab/thread.html +++ b/app/threads/client/flextab/thread.html @@ -11,7 +11,7 @@

{{> icon block="contextual-bar__header-close-icon" icon="plus"}} -
+
{{_ dragAndDropLabel}}
    diff --git a/app/threads/client/flextab/thread.js b/app/threads/client/flextab/thread.js index cf089f3dea8d..5bdd2aba8b5c 100644 --- a/app/threads/client/flextab/thread.js +++ b/app/threads/client/flextab/thread.js @@ -1,4 +1,5 @@ import _ from 'underscore'; +import { Meteor } from 'meteor/meteor'; import { Mongo } from 'meteor/mongo'; import { Template } from 'meteor/templating'; import { ReactiveDict } from 'meteor/reactive-dict'; @@ -12,6 +13,7 @@ import { Messages } from '../../../models'; import { fileUpload } from '../../../ui/client/lib/fileUpload'; import { dropzoneEvents, dropzoneHelpers } from '../../../ui/client/views/app/room'; import './thread.html'; +import { getUserPreference } from '../../../utils'; const sort = { ts: 1 }; @@ -76,6 +78,9 @@ Template.thread.helpers({ onKeyDown: (...args) => instance.chatMessages && instance.chatMessages.keydown.apply(instance.chatMessages, args), }; }, + hideUsername() { + return getUserPreference(Meteor.userId(), 'hideUsernames') ? 'hide-usernames' : undefined; + }, }); diff --git a/app/tokenpass/client/index.js b/app/tokenpass/client/index.js index 86b6ea83c954..ebf16d3e0375 100644 --- a/app/tokenpass/client/index.js +++ b/app/tokenpass/client/index.js @@ -5,3 +5,6 @@ import './tokenChannelsList.html'; import './tokenChannelsList'; import './tokenpassChannelSettings.html'; import './tokenpassChannelSettings'; +import './login-button.css'; +import './channelSettings.css'; +import './styles.css'; diff --git a/app/ui-account/client/accountFlex.js b/app/ui-account/client/accountFlex.js index 56187884ed67..fe118a1c0d2a 100644 --- a/app/ui-account/client/accountFlex.js +++ b/app/ui-account/client/accountFlex.js @@ -1,4 +1,5 @@ import { Template } from 'meteor/templating'; +import { FlowRouter } from 'meteor/kadira:flow-router'; import { settings } from '../../settings'; import { hasAllPermission } from '../../authorization'; @@ -32,12 +33,14 @@ Template.accountFlex.helpers({ return settings.get('Webdav_Integration_Enabled'); }, menuItem(name, icon, section, group) { + const routeParam = FlowRouter.getParam('group'); return { name: t(name), icon, pathSection: section, pathGroup: group, darken: true, + active: group === routeParam, }; }, embeddedVersion() { diff --git a/app/ui-account/client/accountPreferences.html b/app/ui-account/client/accountPreferences.html index 7263b4a1ca1c..ade63fece090 100644 --- a/app/ui-account/client/accountPreferences.html +++ b/app/ui-account/client/accountPreferences.html @@ -102,7 +102,7 @@

    {{_ "Notifications"}}

    {{/if}}
-
+
diff --git a/app/ui-account/client/accountProfile.js b/app/ui-account/client/accountProfile.js index 035358f2bd7d..eb14c6543fb6 100644 --- a/app/ui-account/client/accountProfile.js +++ b/app/ui-account/client/accountProfile.js @@ -449,6 +449,8 @@ Template.accountProfile.events({ toastr.remove(); toastr.warning(t('Please_wait_while_your_profile_is_being_saved')); instance.save(SHA256(typedPassword), () => send.removeClass('loading')); + instance.password.set(); + instance.confirmationPassword.set(); } else { modal.showInputError(t('You_need_to_type_in_your_password_in_order_to_do_this')); return false; diff --git a/app/ui-admin/client/adminFlex.html b/app/ui-admin/client/adminFlex.html index 140889c1fab2..35ef735fee26 100644 --- a/app/ui-admin/client/adminFlex.html +++ b/app/ui-admin/client/adminFlex.html @@ -8,7 +8,7 @@

{{_ "Administration"}}

    - {{> sidebarItem menuItem "Info" "info-circled" "admin" "info" }} + {{> sidebarItem menuItem "Info" "info-circled" "admin-info" "" }} {{#if hasPermission 'run-import'}} {{> sidebarItem menuItem "Import" "import" "admin-import" "" }} diff --git a/app/ui-admin/client/adminFlex.js b/app/ui-admin/client/adminFlex.js index ce744b2c63ad..dc9dfb51039f 100644 --- a/app/ui-admin/client/adminFlex.js +++ b/app/ui-admin/client/adminFlex.js @@ -3,12 +3,14 @@ import s from 'underscore.string'; import { ReactiveVar } from 'meteor/reactive-var'; import { Template } from 'meteor/templating'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; +import { FlowRouter } from 'meteor/kadira:flow-router'; import { settings } from '../../settings'; -import { menu, SideNav, AdminBox, Layout } from '../../ui-utils/client'; +import { menu, SideNav, Layout } from '../../ui-utils/client'; import { t } from '../../utils'; import { PrivateSettingsCachedCollection } from './SettingsCachedCollection'; import { hasAtLeastOnePermission } from '../../authorization/client'; +import { getSidebarItems } from './sidebarItems'; Template.adminFlex.onCreated(function() { this.isEmbedded = Layout.isEmbedded(); @@ -65,9 +67,12 @@ Template.adminFlex.helpers({ }, label, adminBoxOptions() { - return AdminBox.getOptions(); + return getSidebarItems(); }, menuItem(name, icon, section, group) { + const routeParam = FlowRouter.getParam('group'); + const routeName = FlowRouter.getRouteName(); + return { name: t(name), icon, @@ -75,6 +80,7 @@ Template.adminFlex.helpers({ pathGroup: group, darken: true, isLightSidebar: true, + active: (routeParam && routeParam === group) || (routeName !== 'admin' && routeName === section), }; }, embeddedVersion() { diff --git a/app/ui-admin/client/components/AdministrationRouter.js b/app/ui-admin/client/components/AdministrationRouter.js new file mode 100644 index 000000000000..5efe3aff39a8 --- /dev/null +++ b/app/ui-admin/client/components/AdministrationRouter.js @@ -0,0 +1,16 @@ +import React, { lazy, useMemo, Suspense } from 'react'; + +import { useAdminSideNav } from '../hooks/useAdminSideNav'; +import PageSkeleton from './PageSkeleton'; + +function AdministrationRouter({ lazyRouteComponent, ...props }) { + useAdminSideNav(); + + const LazyRouteComponent = useMemo(() => lazy(lazyRouteComponent), [lazyRouteComponent]); + + return }> + + ; +} + +export default AdministrationRouter; diff --git a/app/ui-admin/client/components/NotAuthorizedPage.js b/app/ui-admin/client/components/NotAuthorizedPage.js new file mode 100644 index 000000000000..e7606e0fbdff --- /dev/null +++ b/app/ui-admin/client/components/NotAuthorizedPage.js @@ -0,0 +1,17 @@ +import { Box } from '@rocket.chat/fuselage'; +import React from 'react'; + +import { useTranslation } from '../../../../client/contexts/TranslationContext'; +import { Page } from '../../../../client/components/basic/Page'; + +function NotAuthorizedPage() { + const t = useTranslation(); + + return + + {t('You_are_not_authorized_to_view_this_page')} + + ; +} + +export default NotAuthorizedPage; diff --git a/client/components/admin/settings/NotAuthorizedPage.stories.js b/app/ui-admin/client/components/NotAuthorizedPage.stories.js similarity index 57% rename from client/components/admin/settings/NotAuthorizedPage.stories.js rename to app/ui-admin/client/components/NotAuthorizedPage.stories.js index df29af858e14..02cc7071cdd3 100644 --- a/client/components/admin/settings/NotAuthorizedPage.stories.js +++ b/app/ui-admin/client/components/NotAuthorizedPage.stories.js @@ -1,9 +1,9 @@ import React from 'react'; -import { NotAuthorizedPage } from './NotAuthorizedPage'; +import NotAuthorizedPage from './NotAuthorizedPage'; export default { - title: 'admin/settings/NotAuthorizedPage', + title: 'admin/NotAuthorizedPage', component: NotAuthorizedPage, }; diff --git a/app/ui-admin/client/components/PageSkeleton.js b/app/ui-admin/client/components/PageSkeleton.js new file mode 100644 index 000000000000..8960697eecce --- /dev/null +++ b/app/ui-admin/client/components/PageSkeleton.js @@ -0,0 +1,30 @@ +import { Box, Button, ButtonGroup, Skeleton } from '@rocket.chat/fuselage'; +import React from 'react'; + +import { Page } from '../../../../client/components/basic/Page'; + +function PageSkeleton() { + return + }> + + + + + + ; +} diff --git a/app/ui-admin/client/components/mailer/Mailer.stories.js b/app/ui-admin/client/components/mailer/Mailer.stories.js new file mode 100644 index 000000000000..b86f8ca5d595 --- /dev/null +++ b/app/ui-admin/client/components/mailer/Mailer.stories.js @@ -0,0 +1,11 @@ +import React from 'react'; + +import { Mailer } from './Mailer'; + +export default { + title: 'admin/pages/mailer', + component: Mailer, +}; + +export const _default = () => + ; diff --git a/app/ui-admin/client/components/mailer/MailerRoute.js b/app/ui-admin/client/components/mailer/MailerRoute.js new file mode 100644 index 000000000000..a1ebfdf8f4cf --- /dev/null +++ b/app/ui-admin/client/components/mailer/MailerRoute.js @@ -0,0 +1,41 @@ +import React from 'react'; +import toastr from 'toastr'; + +import { usePermission } from '../../../../../client/contexts/AuthorizationContext'; +import { useMethod } from '../../../../../client/contexts/ServerContext'; +import { useTranslation } from '../../../../../client/contexts/TranslationContext'; +import { Mailer } from './Mailer'; +import NotAuthorizedPage from '../NotAuthorizedPage'; + + +const useSendMail = () => { + const meteorSendMail = useMethod('Mailer.sendMail'); + const t = useTranslation(); + return ({ fromEmail, subject, emailBody, dryRun, query }) => { + if (query.error) { + toastr.error(t('Query_is_not_valid_JSON')); + return; + } + if (fromEmail.error || fromEmail.length < 1) { + toastr.error(t('error-invalid-from-address')); + return; + } + if (emailBody.indexOf('[unsubscribe]') === -1) { + toastr.error(t('error-missing-unsubscribe-link')); + return; + } + meteorSendMail(fromEmail.value, subject, emailBody, dryRun, query.value); + toastr.success(t('The_emails_are_being_sent')); + }; +}; + +export default function MailerRoute(props) { + const canAccessMailer = usePermission('access-mailer'); + const sendMail = useSendMail(); + + if (!canAccessMailer) { + return ; + } + + return ; +} diff --git a/client/components/admin/settings/GroupPage.js b/app/ui-admin/client/components/settings/GroupPage.js similarity index 79% rename from client/components/admin/settings/GroupPage.js rename to app/ui-admin/client/components/settings/GroupPage.js index 75ff9f5213da..27ed3906079a 100644 --- a/client/components/admin/settings/GroupPage.js +++ b/app/ui-admin/client/components/settings/GroupPage.js @@ -1,9 +1,9 @@ -import { Accordion, Box, Button, ButtonGroup, Paragraph, Skeleton } from '@rocket.chat/fuselage'; +import { Accordion, Box, Button, ButtonGroup, Skeleton } from '@rocket.chat/fuselage'; import React, { useMemo } from 'react'; -import { useTranslation } from '../../../contexts/TranslationContext'; +import { useTranslation } from '../../../../../client/contexts/TranslationContext'; import { Section } from './Section'; -import { Page } from '../../basic/Page'; +import { Page } from '../../../../../client/components/basic/Page'; export function GroupPage({ children, headerButtons, save, cancel, _id, i18nLabel, i18nDescription, changed }) { const t = useTranslation(); @@ -48,7 +48,7 @@ export function GroupPage({ children, headerButtons, save, cancel, _id, i18nLabe ({ margin: '0 auto', width: '100%', maxWidth: '590px' }), [])}> - {t.has(i18nDescription) && {t(i18nDescription)}} + {t.has(i18nDescription) && {t(i18nDescription)}} {children} @@ -74,7 +74,11 @@ export function GroupPageSkeleton() { ({ margin: '0 auto', width: '100%', maxWidth: '590px' }), [])}> - + + + + + diff --git a/client/components/admin/settings/GroupPage.stories.js b/app/ui-admin/client/components/settings/GroupPage.stories.js similarity index 100% rename from client/components/admin/settings/GroupPage.stories.js rename to app/ui-admin/client/components/settings/GroupPage.stories.js diff --git a/client/components/admin/settings/GroupSelector.js b/app/ui-admin/client/components/settings/GroupSelector.js similarity index 100% rename from client/components/admin/settings/GroupSelector.js rename to app/ui-admin/client/components/settings/GroupSelector.js diff --git a/client/components/admin/settings/GroupSelector.stories.js b/app/ui-admin/client/components/settings/GroupSelector.stories.js similarity index 100% rename from client/components/admin/settings/GroupSelector.stories.js rename to app/ui-admin/client/components/settings/GroupSelector.stories.js diff --git a/client/components/admin/settings/ResetSettingButton.js b/app/ui-admin/client/components/settings/ResetSettingButton.js similarity index 79% rename from client/components/admin/settings/ResetSettingButton.js rename to app/ui-admin/client/components/settings/ResetSettingButton.js index 58f96cffa887..f968defb601a 100644 --- a/client/components/admin/settings/ResetSettingButton.js +++ b/app/ui-admin/client/components/settings/ResetSettingButton.js @@ -1,7 +1,7 @@ import { Button, Icon } from '@rocket.chat/fuselage'; import React from 'react'; -import { useTranslation } from '../../../contexts/TranslationContext'; +import { useTranslation } from '../../../../../client/contexts/TranslationContext'; export function ResetSettingButton(props) { const t = useTranslation(); diff --git a/client/components/admin/settings/ResetSettingButton.stories.js b/app/ui-admin/client/components/settings/ResetSettingButton.stories.js similarity index 100% rename from client/components/admin/settings/ResetSettingButton.stories.js rename to app/ui-admin/client/components/settings/ResetSettingButton.stories.js diff --git a/client/components/admin/settings/Section.js b/app/ui-admin/client/components/settings/Section.js similarity index 76% rename from client/components/admin/settings/Section.js rename to app/ui-admin/client/components/settings/Section.js index 68a8ef5cc88a..d658359f518a 100644 --- a/client/components/admin/settings/Section.js +++ b/app/ui-admin/client/components/settings/Section.js @@ -1,7 +1,7 @@ -import { Accordion, Box, Button, FieldGroup, Paragraph, Skeleton } from '@rocket.chat/fuselage'; +import { Accordion, Box, Button, FieldGroup, Skeleton } from '@rocket.chat/fuselage'; import React from 'react'; -import { useTranslation } from '../../../contexts/TranslationContext'; +import { useTranslation } from '../../../../../client/contexts/TranslationContext'; import { Setting } from './Setting'; import { useSection, useSectionChangedState } from './SettingsState'; @@ -20,9 +20,7 @@ export function Section({ children, groupId, hasReset = true, help, sectionName, noncollapsible={solo || !section.name} title={section.name && t(section.name)} > - {help && - {help} - } + {help && {help}} {section.settings.map((settingId) => )} @@ -41,13 +39,10 @@ export function Section({ children, groupId, hasReset = true, help, sectionName, } export function SectionSkeleton() { - return } - > - + return }> + - + {Array.from({ length: 10 }).map((_, i) => )} diff --git a/client/components/admin/settings/Section.stories.js b/app/ui-admin/client/components/settings/Section.stories.js similarity index 100% rename from client/components/admin/settings/Section.stories.js rename to app/ui-admin/client/components/settings/Section.stories.js diff --git a/client/components/admin/settings/Setting.js b/app/ui-admin/client/components/settings/Setting.js similarity index 94% rename from client/components/admin/settings/Setting.js rename to app/ui-admin/client/components/settings/Setting.js index cbbc3b66a0fb..223ae37437c4 100644 --- a/client/components/admin/settings/Setting.js +++ b/app/ui-admin/client/components/settings/Setting.js @@ -1,9 +1,9 @@ import { Callout, Field, Flex, InputBox, Margins, Skeleton } from '@rocket.chat/fuselage'; import React, { memo, useEffect, useMemo, useState, useCallback } from 'react'; -import { MarkdownText } from '../../basic/MarkdownText'; -import { RawText } from '../../basic/RawText'; -import { useTranslation } from '../../../contexts/TranslationContext'; +import { MarkdownText } from '../../../../../client/components/basic/MarkdownText'; +import { RawText } from '../../../../../client/components/basic/RawText'; +import { useTranslation } from '../../../../../client/contexts/TranslationContext'; import { GenericSettingInput } from './inputs/GenericSettingInput'; import { BooleanSettingInput } from './inputs/BooleanSettingInput'; import { StringSettingInput } from './inputs/StringSettingInput'; diff --git a/client/components/admin/settings/Setting.stories.js b/app/ui-admin/client/components/settings/Setting.stories.js similarity index 100% rename from client/components/admin/settings/Setting.stories.js rename to app/ui-admin/client/components/settings/Setting.stories.js diff --git a/client/components/admin/settings/SettingsRoute.js b/app/ui-admin/client/components/settings/SettingsRoute.js similarity index 54% rename from client/components/admin/settings/SettingsRoute.js rename to app/ui-admin/client/components/settings/SettingsRoute.js index d53e3a1792ca..4d10c0b0cb05 100644 --- a/client/components/admin/settings/SettingsRoute.js +++ b/app/ui-admin/client/components/settings/SettingsRoute.js @@ -1,22 +1,20 @@ import React from 'react'; -import { useAtLeastOnePermission } from '../../../contexts/AuthorizationContext'; -import { useAdminSideNav } from '../../../hooks/useAdminSideNav'; +import { useAtLeastOnePermission } from '../../../../../client/contexts/AuthorizationContext'; +import { useRouteParameter } from '../../../../../client/contexts/RouterContext'; import { GroupSelector } from './GroupSelector'; -import { NotAuthorizedPage } from './NotAuthorizedPage'; +import NotAuthorizedPage from '../NotAuthorizedPage'; import { SettingsState } from './SettingsState'; -export function SettingsRoute({ - group: groupId, -}) { - useAdminSideNav(); - +export function SettingsRoute() { const hasPermission = useAtLeastOnePermission([ 'view-privileged-setting', 'edit-privileged-setting', 'manage-selected-settings', ]); + const groupId = useRouteParameter('group'); + if (!hasPermission) { return ; } @@ -25,3 +23,5 @@ export function SettingsRoute({ ; } + +export default SettingsRoute; diff --git a/client/components/admin/settings/SettingsState.js b/app/ui-admin/client/components/settings/SettingsState.js similarity index 95% rename from client/components/admin/settings/SettingsState.js rename to app/ui-admin/client/components/settings/SettingsState.js index 32ff629092b9..acf8c60a5a5f 100644 --- a/client/components/admin/settings/SettingsState.js +++ b/app/ui-admin/client/components/settings/SettingsState.js @@ -3,13 +3,13 @@ import { Mongo } from 'meteor/mongo'; import { Tracker } from 'meteor/tracker'; import React, { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from 'react'; -import { PrivateSettingsCachedCollection } from '../../../../app/ui-admin/client/SettingsCachedCollection'; -import { useBatchSettingsDispatch } from '../../../contexts/SettingsContext'; -import { useToastMessageDispatch } from '../../../contexts/ToastMessagesContext'; -import { useEventCallback } from '../../../hooks/useEventCallback'; -import { useReactiveValue } from '../../../hooks/useReactiveValue'; -import { useTranslation, useLoadLanguage } from '../../../contexts/TranslationContext'; -import { useUser } from '../../../contexts/UserContext'; +import { PrivateSettingsCachedCollection } from '../../SettingsCachedCollection'; +import { useBatchSettingsDispatch } from '../../../../../client/contexts/SettingsContext'; +import { useToastMessageDispatch } from '../../../../../client/contexts/ToastMessagesContext'; +import { useEventCallback } from '../../../../../client/hooks/useEventCallback'; +import { useReactiveValue } from '../../../../../client/hooks/useReactiveValue'; +import { useTranslation, useLoadLanguage } from '../../../../../client/contexts/TranslationContext'; +import { useUser } from '../../../../../client/contexts/UserContext'; const SettingsContext = createContext({}); diff --git a/client/components/admin/settings/groups/AssetsGroupPage.js b/app/ui-admin/client/components/settings/groups/AssetsGroupPage.js similarity index 79% rename from client/components/admin/settings/groups/AssetsGroupPage.js rename to app/ui-admin/client/components/settings/groups/AssetsGroupPage.js index 7405b9301b05..b0379dc4d62b 100644 --- a/client/components/admin/settings/groups/AssetsGroupPage.js +++ b/app/ui-admin/client/components/settings/groups/AssetsGroupPage.js @@ -1,9 +1,9 @@ import { Button } from '@rocket.chat/fuselage'; import React from 'react'; -import { useMethod } from '../../../../contexts/ServerContext'; -import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext'; -import { useTranslation } from '../../../../contexts/TranslationContext'; +import { useMethod } from '../../../../../../client/contexts/ServerContext'; +import { useToastMessageDispatch } from '../../../../../../client/contexts/ToastMessagesContext'; +import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; import { GroupPage } from '../GroupPage'; import { Section } from '../Section'; diff --git a/client/components/admin/settings/groups/GenericGroupPage.js b/app/ui-admin/client/components/settings/groups/GenericGroupPage.js similarity index 100% rename from client/components/admin/settings/groups/GenericGroupPage.js rename to app/ui-admin/client/components/settings/groups/GenericGroupPage.js diff --git a/client/components/admin/settings/groups/OAuthGroupPage.js b/app/ui-admin/client/components/settings/groups/OAuthGroupPage.js similarity index 88% rename from client/components/admin/settings/groups/OAuthGroupPage.js rename to app/ui-admin/client/components/settings/groups/OAuthGroupPage.js index d64e9a296f25..f0b21b533130 100644 --- a/client/components/admin/settings/groups/OAuthGroupPage.js +++ b/app/ui-admin/client/components/settings/groups/OAuthGroupPage.js @@ -2,11 +2,11 @@ import { Button } from '@rocket.chat/fuselage'; import React from 'react'; import s from 'underscore.string'; -import { RawText } from '../../../basic/RawText'; -import { useAbsoluteUrl, useMethod } from '../../../../contexts/ServerContext'; -import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext'; -import { useTranslation } from '../../../../contexts/TranslationContext'; -import { useModal } from '../../../../hooks/useModal'; +import { RawText } from '../../../../../../client/components/basic/RawText'; +import { useAbsoluteUrl, useMethod } from '../../../../../../client/contexts/ServerContext'; +import { useToastMessageDispatch } from '../../../../../../client/contexts/ToastMessagesContext'; +import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; +import { useModal } from '../../../../../../client/hooks/useModal'; import { GroupPage } from '../GroupPage'; import { Section } from '../Section'; diff --git a/client/components/admin/settings/inputs/ActionSettingInput.js b/app/ui-admin/client/components/settings/inputs/ActionSettingInput.js similarity index 77% rename from client/components/admin/settings/inputs/ActionSettingInput.js rename to app/ui-admin/client/components/settings/inputs/ActionSettingInput.js index 6e35e6397bab..3d55c9429f26 100644 --- a/client/components/admin/settings/inputs/ActionSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/ActionSettingInput.js @@ -1,9 +1,9 @@ import { Button, Field } from '@rocket.chat/fuselage'; import React from 'react'; -import { useMethod } from '../../../../contexts/ServerContext'; -import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext'; -import { useTranslation } from '../../../../contexts/TranslationContext'; +import { useMethod } from '../../../../../../client/contexts/ServerContext'; +import { useToastMessageDispatch } from '../../../../../../client/contexts/ToastMessagesContext'; +import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; export function ActionSettingInput({ _id, diff --git a/client/components/admin/settings/inputs/ActionSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/ActionSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/ActionSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/ActionSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/AssetSettingInput.css b/app/ui-admin/client/components/settings/inputs/AssetSettingInput.css similarity index 100% rename from client/components/admin/settings/inputs/AssetSettingInput.css rename to app/ui-admin/client/components/settings/inputs/AssetSettingInput.css diff --git a/client/components/admin/settings/inputs/AssetSettingInput.js b/app/ui-admin/client/components/settings/inputs/AssetSettingInput.js similarity index 89% rename from client/components/admin/settings/inputs/AssetSettingInput.js rename to app/ui-admin/client/components/settings/inputs/AssetSettingInput.js index 24ca1d146d19..6986f903f21e 100644 --- a/client/components/admin/settings/inputs/AssetSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/AssetSettingInput.js @@ -2,9 +2,9 @@ import { Button, Field, Icon } from '@rocket.chat/fuselage'; import { Random } from 'meteor/random'; import React from 'react'; -import { useMethod } from '../../../../contexts/ServerContext'; -import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext'; -import { useTranslation } from '../../../../contexts/TranslationContext'; +import { useMethod } from '../../../../../../client/contexts/ServerContext'; +import { useToastMessageDispatch } from '../../../../../../client/contexts/ToastMessagesContext'; +import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; import './AssetSettingInput.css'; export function AssetSettingInput({ diff --git a/client/components/admin/settings/inputs/AssetSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/AssetSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/AssetSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/AssetSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/BooleanSettingInput.js b/app/ui-admin/client/components/settings/inputs/BooleanSettingInput.js similarity index 100% rename from client/components/admin/settings/inputs/BooleanSettingInput.js rename to app/ui-admin/client/components/settings/inputs/BooleanSettingInput.js diff --git a/client/components/admin/settings/inputs/BooleanSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/BooleanSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/BooleanSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/BooleanSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/CodeSettingInput.js b/app/ui-admin/client/components/settings/inputs/CodeSettingInput.js similarity index 95% rename from client/components/admin/settings/inputs/CodeSettingInput.js rename to app/ui-admin/client/components/settings/inputs/CodeSettingInput.js index 2685ac71a2e4..dbfb863f6c49 100644 --- a/client/components/admin/settings/inputs/CodeSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/CodeSettingInput.js @@ -2,7 +2,7 @@ import { Box, Button, Field, Flex } from '@rocket.chat/fuselage'; import { useToggle } from '@rocket.chat/fuselage-hooks'; import React, { useEffect, useRef, useState } from 'react'; -import { useTranslation } from '../../../../contexts/TranslationContext'; +import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; import { ResetSettingButton } from '../ResetSettingButton'; function CodeMirror({ @@ -31,7 +31,7 @@ function CodeMirror({ const setupCodeMirror = async () => { const CodeMirror = await import('codemirror/lib/codemirror.js'); - await import('../../../../../app/ui/client/lib/codeMirror/codeMirror'); + await import('../../../../../ui/client/lib/codeMirror/codeMirror'); await import('codemirror/lib/codemirror.css'); const { current: textarea } = ref; diff --git a/client/components/admin/settings/inputs/CodeSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/CodeSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/CodeSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/CodeSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/ColorSettingInput.js b/app/ui-admin/client/components/settings/inputs/ColorSettingInput.js similarity index 96% rename from client/components/admin/settings/inputs/ColorSettingInput.js rename to app/ui-admin/client/components/settings/inputs/ColorSettingInput.js index 410d20ada91a..4fcc3740cabf 100644 --- a/client/components/admin/settings/inputs/ColorSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/ColorSettingInput.js @@ -9,7 +9,7 @@ import { } from '@rocket.chat/fuselage'; import React, { useCallback } from 'react'; -import { useTranslation } from '../../../../contexts/TranslationContext'; +import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; import { ResetSettingButton } from '../ResetSettingButton'; export function ColorSettingInput({ diff --git a/client/components/admin/settings/inputs/ColorSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/ColorSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/ColorSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/ColorSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/FontSettingInput.js b/app/ui-admin/client/components/settings/inputs/FontSettingInput.js similarity index 100% rename from client/components/admin/settings/inputs/FontSettingInput.js rename to app/ui-admin/client/components/settings/inputs/FontSettingInput.js diff --git a/client/components/admin/settings/inputs/FontSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/FontSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/FontSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/FontSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/GenericSettingInput.js b/app/ui-admin/client/components/settings/inputs/GenericSettingInput.js similarity index 100% rename from client/components/admin/settings/inputs/GenericSettingInput.js rename to app/ui-admin/client/components/settings/inputs/GenericSettingInput.js diff --git a/client/components/admin/settings/inputs/GenericSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/GenericSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/GenericSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/GenericSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/IntSettingInput.js b/app/ui-admin/client/components/settings/inputs/IntSettingInput.js similarity index 100% rename from client/components/admin/settings/inputs/IntSettingInput.js rename to app/ui-admin/client/components/settings/inputs/IntSettingInput.js diff --git a/client/components/admin/settings/inputs/IntSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/IntSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/IntSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/IntSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/LanguageSettingInput.js b/app/ui-admin/client/components/settings/inputs/LanguageSettingInput.js similarity index 92% rename from client/components/admin/settings/inputs/LanguageSettingInput.js rename to app/ui-admin/client/components/settings/inputs/LanguageSettingInput.js index 59d84711f7ff..d80d459f7da7 100644 --- a/client/components/admin/settings/inputs/LanguageSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/LanguageSettingInput.js @@ -1,7 +1,7 @@ import { Box, Field, Flex, Select } from '@rocket.chat/fuselage'; import React from 'react'; -import { useLanguages } from '../../../../contexts/TranslationContext'; +import { useLanguages } from '../../../../../../client/contexts/TranslationContext'; import { ResetSettingButton } from '../ResetSettingButton'; export function LanguageSettingInput({ diff --git a/client/components/admin/settings/inputs/LanguageSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/LanguageSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/LanguageSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/LanguageSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/MultiSelectSettingInput.js b/app/ui-admin/client/components/settings/inputs/MultiSelectSettingInput.js similarity index 91% rename from client/components/admin/settings/inputs/MultiSelectSettingInput.js rename to app/ui-admin/client/components/settings/inputs/MultiSelectSettingInput.js index 538b4a74c4c2..e3228d3cbbac 100644 --- a/client/components/admin/settings/inputs/MultiSelectSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/MultiSelectSettingInput.js @@ -1,7 +1,7 @@ import { Field, Flex, Box, MultiSelectFiltered, MultiSelect } from '@rocket.chat/fuselage'; import React from 'react'; -import { useTranslation } from '../../../../contexts/TranslationContext'; +import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; import { ResetSettingButton } from '../ResetSettingButton'; export function MultiSelectSettingInput({ @@ -56,3 +56,5 @@ export function MultiSelectSettingInput({ ); } + +export default MultiSelectSettingInput; diff --git a/client/components/admin/settings/inputs/MultiSelectSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/MultiSelectSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/MultiSelectSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/MultiSelectSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/PasswordSettingInput.js b/app/ui-admin/client/components/settings/inputs/PasswordSettingInput.js similarity index 100% rename from client/components/admin/settings/inputs/PasswordSettingInput.js rename to app/ui-admin/client/components/settings/inputs/PasswordSettingInput.js diff --git a/client/components/admin/settings/inputs/PasswordSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/PasswordSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/PasswordSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/PasswordSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/RelativeUrlSettingInput.js b/app/ui-admin/client/components/settings/inputs/RelativeUrlSettingInput.js similarity index 92% rename from client/components/admin/settings/inputs/RelativeUrlSettingInput.js rename to app/ui-admin/client/components/settings/inputs/RelativeUrlSettingInput.js index 173c55cb8a22..e0d761bd94aa 100644 --- a/client/components/admin/settings/inputs/RelativeUrlSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/RelativeUrlSettingInput.js @@ -1,7 +1,7 @@ import { Box, Field, Flex, UrlInput } from '@rocket.chat/fuselage'; import React from 'react'; -import { useAbsoluteUrl } from '../../../../contexts/ServerContext'; +import { useAbsoluteUrl } from '../../../../../../client/contexts/ServerContext'; import { ResetSettingButton } from '../ResetSettingButton'; export function RelativeUrlSettingInput({ diff --git a/client/components/admin/settings/inputs/RelativeUrlSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/RelativeUrlSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/RelativeUrlSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/RelativeUrlSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/RoomPickSettingInput.js b/app/ui-admin/client/components/settings/inputs/RoomPickSettingInput.js similarity index 100% rename from client/components/admin/settings/inputs/RoomPickSettingInput.js rename to app/ui-admin/client/components/settings/inputs/RoomPickSettingInput.js diff --git a/client/components/admin/settings/inputs/SelectSettingInput.js b/app/ui-admin/client/components/settings/inputs/SelectSettingInput.js similarity index 93% rename from client/components/admin/settings/inputs/SelectSettingInput.js rename to app/ui-admin/client/components/settings/inputs/SelectSettingInput.js index 7fa5f3b5395c..061eacc9ab44 100644 --- a/client/components/admin/settings/inputs/SelectSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/SelectSettingInput.js @@ -6,7 +6,7 @@ import { } from '@rocket.chat/fuselage'; import React from 'react'; -import { useTranslation } from '../../../../contexts/TranslationContext'; +import { useTranslation } from '../../../../../../client/contexts/TranslationContext'; import { ResetSettingButton } from '../ResetSettingButton'; export function SelectSettingInput({ diff --git a/client/components/admin/settings/inputs/SelectSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/SelectSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/SelectSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/SelectSettingInput.stories.js diff --git a/client/components/admin/settings/inputs/StringSettingInput.js b/app/ui-admin/client/components/settings/inputs/StringSettingInput.js similarity index 83% rename from client/components/admin/settings/inputs/StringSettingInput.js rename to app/ui-admin/client/components/settings/inputs/StringSettingInput.js index 8c3ec25306df..e20a3c8d482d 100644 --- a/client/components/admin/settings/inputs/StringSettingInput.js +++ b/app/ui-admin/client/components/settings/inputs/StringSettingInput.js @@ -1,4 +1,4 @@ -import { Box, Field, Flex, TextAreaInput, TextInput, Icon, Callout, Margins } from '@rocket.chat/fuselage'; +import { Box, Field, Flex, TextAreaInput, TextInput, Callout, Margins } from '@rocket.chat/fuselage'; import React from 'react'; import { ResetSettingButton } from '../ResetSettingButton'; @@ -24,8 +24,6 @@ export function StringSettingInput({ hasResetButton, onChangeValue, onResetButtonClick, - addon, - ...props }) { const handleChange = (event) => { onChangeValue(event.currentTarget.value); @@ -50,8 +48,6 @@ export function StringSettingInput({ readOnly={readonly} autoComplete={autocomplete === false ? 'off' : undefined} onChange={handleChange} - { ...addon && { addon: }} - { ...props } /> : }} - { ...props } /> } ; diff --git a/client/components/admin/settings/inputs/StringSettingInput.stories.js b/app/ui-admin/client/components/settings/inputs/StringSettingInput.stories.js similarity index 100% rename from client/components/admin/settings/inputs/StringSettingInput.stories.js rename to app/ui-admin/client/components/settings/inputs/StringSettingInput.stories.js diff --git a/client/hooks/useAdminSideNav.js b/app/ui-admin/client/hooks/useAdminSideNav.js similarity index 71% rename from client/hooks/useAdminSideNav.js rename to app/ui-admin/client/hooks/useAdminSideNav.js index a38299f0b8cf..25d3f293dc74 100644 --- a/client/hooks/useAdminSideNav.js +++ b/app/ui-admin/client/hooks/useAdminSideNav.js @@ -1,6 +1,6 @@ import { useEffect } from 'react'; -import { SideNav } from '../../app/ui-utils/client/lib/SideNav'; +import { SideNav } from '../../../ui-utils/client/lib/SideNav'; export const useAdminSideNav = () => { useEffect(() => { diff --git a/app/ui-admin/client/index.js b/app/ui-admin/client/index.js index 93eca42775ae..891abf1781d1 100644 --- a/app/ui-admin/client/index.js +++ b/app/ui-admin/client/index.js @@ -1,3 +1,5 @@ import './adminFlex.html'; import './adminFlex'; -import './routes'; + +export { registerAdminRoute } from './routes'; +export { registerAdminSidebarItem } from './sidebarItems'; diff --git a/app/ui-admin/client/rooms/adminRooms.js b/app/ui-admin/client/rooms/adminRooms.js index 407048b92a5d..9bf642ab72e6 100644 --- a/app/ui-admin/client/rooms/adminRooms.js +++ b/app/ui-admin/client/rooms/adminRooms.js @@ -120,7 +120,7 @@ Template.adminRooms.onCreated(function() { ChannelSettings.addOption({ group: ['admin-room'], - id: 'make-default', + id: 'make-featured', template: 'channelSettingsFeatured', data() { return { diff --git a/app/ui-admin/client/rooms/channelSettingsDefault.html b/app/ui-admin/client/rooms/channelSettingsDefault.html index d26a033f2b26..8360662079be 100644 --- a/app/ui-admin/client/rooms/channelSettingsDefault.html +++ b/app/ui-admin/client/rooms/channelSettingsDefault.html @@ -6,6 +6,9 @@ {{#if editing 'default'}} + {{#if roomDefault}} + + {{/if}} {{else}} diff --git a/app/ui-admin/client/rooms/channelSettingsDefault.js b/app/ui-admin/client/rooms/channelSettingsDefault.js index e7c3cb4db00e..2b57af949ebb 100644 --- a/app/ui-admin/client/rooms/channelSettingsDefault.js +++ b/app/ui-admin/client/rooms/channelSettingsDefault.js @@ -15,22 +15,34 @@ Template.channelSettingsDefault.helpers({ return Template.instance().editing.get() === field; }, roomDefault() { - const room = Template.instance().room.get(); - - if (room) { - return room.default; - } + return Template.instance().isDefault.get(); + }, + isFavorite() { + return Template.instance().isFavorite.get(); }, defaultDescription() { - const room = Template.instance().room.get(); - if (room && room.default) { - return t('True'); + const { room, isDefault, isFavorite } = { room: Template.instance().room.get(), isDefault: Template.instance().isDefault.get(), isFavorite: Template.instance().isFavorite.get() }; + let description = t('False'); + + if (room && isDefault) { + description = t('True'); + + if (isFavorite) { + description += `, ${ t('Set_as_favorite') }`; + } + return description; } - return t('False'); + return description; }, }); Template.channelSettingsDefault.events({ + 'change input[name=default]'(e, t) { + t.isDefault.set(e.currentTarget.value === 'true'); + }, + 'change input[name=favorite]'(e, t) { + t.isFavorite.set(e.currentTarget.checked); + }, 'click [data-edit]'(e, t) { e.preventDefault(); t.editing.set($(e.currentTarget).data('edit')); @@ -45,7 +57,7 @@ Template.channelSettingsDefault.events({ 'click .save'(e, t) { e.preventDefault(); - Meteor.call('saveRoomSettings', Template.instance().room.get()._id, 'default', $('input[name=default]:checked').val(), (err/* , result*/) => { + Meteor.call('saveRoomSettings', t.room.get()._id, { default: t.isDefault.get(), favorite: { defaultValue: t.isDefault.get(), favorite: t.isFavorite.get() } }, (err/* , result*/) => { if (err) { return handleError(err); } @@ -58,11 +70,15 @@ Template.channelSettingsDefault.events({ Template.channelSettingsDefault.onCreated(function() { this.editing = new ReactiveVar(); + this.isDefault = new ReactiveVar(); + this.isFavorite = new ReactiveVar(); this.room = new ReactiveVar(); this.onSuccess = Template.currentData().onSuccess; this.autorun(() => { const { room } = Template.currentData(); + this.isDefault.set(room && room.default); + this.isFavorite.set(room && room.favorite && room.default); this.room.set(room); }); }); diff --git a/app/ui-admin/client/routes.js b/app/ui-admin/client/routes.js index cf87a26258f5..b30d9cb3a400 100644 --- a/app/ui-admin/client/routes.js +++ b/app/ui-admin/client/routes.js @@ -1,19 +1,67 @@ import { FlowRouter } from 'meteor/kadira:flow-router'; import { BlazeLayout } from 'meteor/kadira:blaze-layout'; +import { Meteor } from 'meteor/meteor'; -FlowRouter.route('/admin/users', { +import { renderRouteComponent } from '../../../client/reactAdapters'; + +const routeGroup = FlowRouter.group({ + name: 'admin', + prefix: '/admin', +}); + +export const registerAdminRoute = (path, { lazyRouteComponent, props, action, ...options } = {}) => { + routeGroup.route(path, { + ...options, + action: (params, queryParams) => { + if (action) { + action(params, queryParams); + return; + } + + renderRouteComponent(() => import('./components/AdministrationRouter'), { + template: 'main', + region: 'center', + propsFn: () => ({ lazyRouteComponent, ...options, params, queryParams, ...props }), + }); + }, + }); +}; + +registerAdminRoute('/', { + triggersEnter: [(context, redirect) => { + redirect('admin-info'); + }], +}); + +registerAdminRoute('/info', { + name: 'admin-info', + lazyRouteComponent: () => import('./components/info/InformationRoute'), +}); + +registerAdminRoute('/mailer', { + name: 'admin-mailer', + lazyRouteComponent: () => import('./components/mailer/MailerRoute'), +}); + +registerAdminRoute('/users', { name: 'admin-users', - async action() { + action: async () => { await import('./users/views'); BlazeLayout.render('main', { center: 'adminUsers' }); }, }); - -FlowRouter.route('/admin/rooms', { +registerAdminRoute('/rooms', { name: 'admin-rooms', - async action() { + action: async () => { await import('./rooms/views'); BlazeLayout.render('main', { center: 'adminRooms' }); }, }); + +Meteor.startup(() => { + registerAdminRoute('/:group+', { + name: 'admin', + lazyRouteComponent: () => import('./components/settings/SettingsRoute'), + }); +}); diff --git a/app/ui-admin/client/sidebarItems.js b/app/ui-admin/client/sidebarItems.js new file mode 100644 index 000000000000..f060c00e21d3 --- /dev/null +++ b/app/ui-admin/client/sidebarItems.js @@ -0,0 +1,10 @@ +import { ReactiveVar } from 'meteor/reactive-var'; +import { Tracker } from 'meteor/tracker'; + +const items = new ReactiveVar([]); + +export const registerAdminSidebarItem = (itemOptions) => { + Tracker.nonreactive(() => items.set([...items.get(), itemOptions])); +}; + +export const getSidebarItems = () => items.get().filter((option) => !option.permissionGranted || option.permissionGranted()); diff --git a/app/ui-cached-collection/client/models/CachedCollection.js b/app/ui-cached-collection/client/models/CachedCollection.js index 59929c54ce0f..8450ee6b879d 100644 --- a/app/ui-cached-collection/client/models/CachedCollection.js +++ b/app/ui-cached-collection/client/models/CachedCollection.js @@ -129,7 +129,7 @@ export class CachedCollection extends EventEmitter { userRelated = true, listenChangesForLoggedUsersOnly = false, useSync = true, - version = 9, + version = 10, maxCacheTime = 60 * 60 * 24 * 30, onSyncData = (/* action, record */) => {}, }) { diff --git a/app/ui-clean-history/client/index.js b/app/ui-clean-history/client/index.js index a28b913f41ad..678ec8d39902 100644 --- a/app/ui-clean-history/client/index.js +++ b/app/ui-clean-history/client/index.js @@ -1,3 +1,4 @@ import './lib/startup'; import './views/cleanHistory.html'; import './views/cleanHistory'; +import './views/stylesheets/cleanHistory.css'; diff --git a/app/ui-flextab/client/tabs/userActions.js b/app/ui-flextab/client/tabs/userActions.js index cc0bd80ecc3b..fa2f4bc439bc 100644 --- a/app/ui-flextab/client/tabs/userActions.js +++ b/app/ui-flextab/client/tabs/userActions.js @@ -99,7 +99,7 @@ export const getActions = ({ user, directActions, hideAdminControls }) => { const actions = [ { icon: 'message', - name: t('Conversation'), + name: t('Direct_Message'), action: prevent(getUser, ({ username }) => Meteor.call('createDirectMessage', username, success((result) => result.rid && FlowRouter.go('direct', { rid: result.rid }, FlowRouter.current().queryParams))), ), diff --git a/app/ui-flextab/client/tabs/userEdit.js b/app/ui-flextab/client/tabs/userEdit.js index 6ccae14800f9..ec37c0d816ab 100644 --- a/app/ui-flextab/client/tabs/userEdit.js +++ b/app/ui-flextab/client/tabs/userEdit.js @@ -10,8 +10,9 @@ import { t, handleError } from '../../../utils'; import { Roles } from '../../../models'; import { Notifications } from '../../../notifications'; import { hasAtLeastOnePermission } from '../../../authorization'; -import { settings } from '../../../settings'; -import { callbacks } from '../../../callbacks'; +import { settings } from '../../../settings/client'; +import { callbacks } from '../../../callbacks/client'; +import { modal } from '../../../ui-utils/client'; Template.userEdit.helpers({ @@ -290,6 +291,22 @@ Template.userEdit.onCreated(function() { Meteor.call('insertOrUpdateUser', userData, (error) => { if (error) { + if (error.error === 'error-max-guests-number-reached') { + const message = TAPi18n.__('You_reached_the_maximum_number_of_guest_users_allowed_by_your_license.'); + const url = 'https://go.rocket.chat/i/guest-limit-exceeded'; + const email = 'sales@rocket.chat'; + const linkText = TAPi18n.__('Click_here_for_more_details_or_contact_sales_for_a_new_license', { url, email }); + + modal.open({ + type: 'error', + title: TAPi18n.__('Maximum_number_of_guests_reached'), + text: `${ message } ${ linkText }`, + html: true, + }); + + return true; + } + return handleError(error); } toastr.success(userData._id ? t('User_updated_successfully') : t('User_added_successfully')); diff --git a/app/ui-login/client/login/form.html b/app/ui-login/client/login/form.html index 565a3403ef2a..3a20bd66344f 100644 --- a/app/ui-login/client/login/form.html +++ b/app/ui-login/client/login/form.html @@ -109,7 +109,7 @@

    {{{_ "Registration_Succeeded"}}}

    + placeholder="{{_ "Email"}}" autofocus value="{{#if state 'email-verification'}}{{typedEmail}}{{/if}}">
    diff --git a/app/ui-login/client/login/form.js b/app/ui-login/client/login/form.js index a0c5bfa3ef41..7440f56dd894 100644 --- a/app/ui-login/client/login/form.js +++ b/app/ui-login/client/login/form.js @@ -72,6 +72,9 @@ Template.loginForm.helpers({ manuallyApproveNewUsers() { return settings.get('Accounts_ManuallyApproveNewUsers'); }, + typedEmail() { + return s.trim(Template.instance().typedEmail); + }, }); Template.loginForm.events({ @@ -137,16 +140,18 @@ Template.loginForm.events({ return Meteor[loginMethod](s.trim(formData.emailOrUsername), formData.pass, function(error) { instance.loading.set(false); if (error != null) { - if (error.error === 'no-valid-email') { - instance.state.set('email-verification'); - } else if (error.error === 'error-user-is-not-activated') { + if (error.error === 'error-user-is-not-activated') { + return toastr.error(t('Wait_activation_warning')); + } if (error.error === 'error-invalid-email') { + instance.typedEmail = formData.emailOrUsername; + return instance.state.set('email-verification'); + } if (error.error === 'error-user-is-not-activated') { toastr.error(t('Wait_activation_warning')); } else if (error.error === 'error-app-user-is-not-allowed-to-login') { toastr.error(t('App_user_not_allowed_to_login')); } else { - toastr.error(t('User_not_found_or_incorrect_password')); + return toastr.error(t('User_not_found_or_incorrect_password')); } - return; } Session.set('forceLogin', false); }); @@ -187,6 +192,14 @@ Template.loginForm.onCreated(function() { } else { this.state = new ReactiveVar('login'); } + + Tracker.autorun(() => { + const registrationForm = settings.get('Accounts_RegistrationForm'); + if (registrationForm === 'Disabled' && this.state.get() === 'register') { + this.state.set('login'); + } + }); + this.validSecretURL = new ReactiveVar(false); const validateCustomFields = function(formObj, validationObj) { const customFields = instance.customFields.get(); @@ -234,7 +247,7 @@ Template.loginForm.onCreated(function() { validationObj.emailOrUsername = t('Invalid_email'); } } - if (state !== 'forgot-password') { + if (state !== 'forgot-password' && state !== 'email-verification') { if (!formObj.pass) { validationObj.pass = t('Invalid_pass'); } diff --git a/app/ui-master/client/main.js b/app/ui-master/client/main.js index 0a2831c3fe8d..0a7e0753ecc8 100644 --- a/app/ui-master/client/main.js +++ b/app/ui-master/client/main.js @@ -107,19 +107,18 @@ Template.body.onRendered(function() { inputMessage.focus(); }); - $(document.body).on('click', function(e) { - if (e.target.tagName === 'A') { - const link = e.currentTarget; - if (link.origin === s.rtrim(Meteor.absoluteUrl(), '/') && /msg=([a-zA-Z0-9]+)/.test(link.search)) { - e.preventDefault(); - e.stopPropagation(); - if (Layout.isEmbedded()) { - return fireGlobalEvent('click-message-link', { - link: link.pathname + link.search, - }); - } - return FlowRouter.go(link.pathname + link.search, null, FlowRouter.current().queryParams); - } + const handleMessageLinkClick = (event) => { + const link = event.currentTarget; + if (link.origin === s.rtrim(Meteor.absoluteUrl(), '/') && /msg=([a-zA-Z0-9]+)/.test(link.search)) { + fireGlobalEvent('click-message-link', { link: link.pathname + link.search }); + } + }; + + this.autorun(() => { + if (Layout.isEmbedded()) { + $(document.body).on('click', 'a', handleMessageLinkClick); + } else { + $(document.body).off('click', 'a', handleMessageLinkClick); } }); diff --git a/app/ui-message/client/blocks/Blocks.html b/app/ui-message/client/blocks/Blocks.html deleted file mode 100644 index 0d3495e14c53..000000000000 --- a/app/ui-message/client/blocks/Blocks.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/app/ui-message/client/blocks/Blocks.js b/app/ui-message/client/blocks/Blocks.js deleted file mode 100644 index 9adf2cc61833..000000000000 --- a/app/ui-message/client/blocks/Blocks.js +++ /dev/null @@ -1,48 +0,0 @@ -import { UIKitIncomingInteractionContainerType } from '@rocket.chat/apps-engine/definition/uikit/UIKitIncomingInteractionContainer'; -import { ReactiveVar } from 'meteor/reactive-var'; -import { Template } from 'meteor/templating'; - -import * as ActionManager from '../ActionManager'; -import './Blocks.html'; -import { messageBlockWithContext } from './MessageBlock'; - - -Template.Blocks.onRendered(async function() { - const React = await import('react'); - const ReactDOM = await import('react-dom'); - const state = new ReactiveVar(); - this.autorun(() => { - state.set(Template.currentData()); - }); - - ReactDOM.render( - React.createElement(messageBlockWithContext({ - action: (options) => { - const { actionId, value, blockId, mid = this.data.mid } = options; - ActionManager.triggerBlockAction({ - blockId, - actionId, - value, - mid, - rid: this.data.rid, - appId: this.data.blocks[0].appId, - container: { - type: UIKitIncomingInteractionContainerType.MESSAGE, - id: mid, - }, - }); - }, - // state: alert, - appId: this.data.appId, - rid: this.data.rid, - }), { data: () => state.get() }), - this.firstNode, - ); - const event = new Event('rendered'); - this.firstNode.dispatchEvent(event); -}); - -Template.Blocks.onDestroyed(async function() { - const ReactDOM = await import('react-dom'); - this.firstNode && ReactDOM.unmountComponentAtNode(this.firstNode); -}); diff --git a/app/ui-message/client/blocks/ButtonElement.html b/app/ui-message/client/blocks/ButtonElement.html deleted file mode 100644 index 5711982a2e6e..000000000000 --- a/app/ui-message/client/blocks/ButtonElement.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/app/ui-message/client/blocks/MessageBlock.js b/app/ui-message/client/blocks/MessageBlock.js index 7830bafbb09e..3bd9a8739ff3 100644 --- a/app/ui-message/client/blocks/MessageBlock.js +++ b/app/ui-message/client/blocks/MessageBlock.js @@ -1,17 +1,11 @@ -import React, { useRef, useEffect, useCallback, useMemo } from 'react'; -import { UiKitMessage as uiKitMessage, kitContext, UiKitModal as uiKitModal, messageParser, modalParser, UiKitComponent } from '@rocket.chat/fuselage-ui-kit'; -import { uiKitText } from '@rocket.chat/ui-kit'; -import { Modal, AnimatedVisibility, ButtonGroup, Button, Box } from '@rocket.chat/fuselage'; -import { useUniqueId } from '@rocket.chat/fuselage-hooks'; +import { UIKitIncomingInteractionContainerType } from '@rocket.chat/apps-engine/definition/uikit/UIKitIncomingInteractionContainer'; +import { UiKitMessage, UiKitComponent, kitContext, messageParser } from '@rocket.chat/fuselage-ui-kit'; +import React, { useRef, useEffect } from 'react'; import { renderMessageBody } from '../../../ui-utils/client'; -import { getURL } from '../../../utils/lib/getURL'; -import { useReactiveValue } from '../../../../client/hooks/useReactiveValue'; - -const focusableElementsString = 'a[href]:not([tabindex="-1"]), area[href]:not([tabindex="-1"]), input:not([disabled]):not([tabindex="-1"]), select:not([disabled]):not([tabindex="-1"]), textarea:not([disabled]):not([tabindex="-1"]), button:not([disabled]):not([tabindex="-1"]), iframe, object, embed, [tabindex]:not([tabindex="-1"]), [contenteditable]'; - -const focusableElementsStringInvalid = 'a[href]:not([tabindex="-1"]):invalid, area[href]:not([tabindex="-1"]):invalid, input:not([disabled]):not([tabindex="-1"]):invalid, select:not([disabled]):not([tabindex="-1"]):invalid, textarea:not([disabled]):not([tabindex="-1"]):invalid, button:not([disabled]):not([tabindex="-1"]):invalid, iframe:invalid, object:invalid, embed:invalid, [tabindex]:not([tabindex="-1"]):invalid, [contenteditable]:invalid'; +import * as ActionManager from '../ActionManager'; +// TODO: move this to fuselage-ui-kit itself messageParser.text = ({ text, type } = {}) => { if (type !== 'mrkdwn') { return text; @@ -20,165 +14,37 @@ messageParser.text = ({ text, type } = {}) => { return ; }; -modalParser.text = messageParser.text; - -const contextDefault = { - action: console.log, - state: (data) => { - console.log('state', data); - }, -}; -export const messageBlockWithContext = (context) => (props) => { - const data = useReactiveValue(props.data); - return ( - - {uiKitMessage(data.blocks)} - - ); -}; - -const textParser = uiKitText(new class { - plain_text({ text }) { - return text; - } - - text({ text }) { - return text; - } -}()); +export function MessageBlock({ mid: _mid, rid, blocks, appId }) { + const context = { + action: ({ actionId, value, blockId, mid = _mid }) => { + ActionManager.triggerBlockAction({ + blockId, + actionId, + value, + mid, + rid, + appId: blocks[0].appId, + container: { + type: UIKitIncomingInteractionContainerType.MESSAGE, + id: mid, + }, + }); + }, + appId, + rid, + }; -// https://www.w3.org/TR/wai-aria-practices/examples/dialog-modal/dialog.html - -export const modalBlockWithContext = ({ - onSubmit, - onClose, - onCancel, - ...context -}) => (props) => { - const id = `modal_id_${ useUniqueId() }`; - - const { view, ...data } = useReactiveValue(props.data); - const values = useReactiveValue(props.values); const ref = useRef(); - - // Auto focus - useEffect(() => { - if (!ref.current) { - return; - } - - if (data.errors && Object.keys(data.errors).length) { - const element = ref.current.querySelector(focusableElementsStringInvalid); - element && element.focus(); - } else { - const element = ref.current.querySelector(focusableElementsString); - element && element.focus(); - } - }, [ref.current, data.errors]); - // save focus to restore after close - const previousFocus = useMemo(() => document.activeElement, []); - // restore the focus after the component unmount - useEffect(() => () => previousFocus && previousFocus.focus(), []); - // Handle Tab, Shift + Tab, Enter and Escape - const handleKeyDown = useCallback((event) => { - if (event.keyCode === 13) { // ENTER - return onSubmit(event); - } - - if (event.keyCode === 27) { // ESC - event.stopPropagation(); - event.preventDefault(); - onClose(); - return false; - } - - if (event.keyCode === 9) { // TAB - const elements = Array.from(ref.current.querySelectorAll(focusableElementsString)); - const [first] = elements; - const last = elements.pop(); - - if (!ref.current.contains(document.activeElement)) { - return first.focus(); - } - - if (event.shiftKey) { - if (!first || first === document.activeElement) { - last.focus(); - event.stopPropagation(); - event.preventDefault(); - } - return; - } - - if (!last || last === document.activeElement) { - first.focus(); - event.stopPropagation(); - event.preventDefault(); - } - } - }, [onSubmit]); - // Clean the events useEffect(() => { - const element = document.querySelector('.rc-modal-wrapper'); - const container = element.querySelector('.rcx-modal__content'); - const close = (e) => { - if (e.target !== element) { - return; - } - e.preventDefault(); - e.stopPropagation(); - onClose(); - return false; - }; - - const ignoreIfnotContains = (e) => { - if (!container.contains(e.target)) { - return; - } - return handleKeyDown(e); - }; - - document.addEventListener('keydown', ignoreIfnotContains); - element.addEventListener('click', close); - return () => { - document.removeEventListener('keydown', ignoreIfnotContains); - element.removeEventListener('click', close); - }; - }, handleKeyDown); + ref.current.dispatchEvent(new Event('rendered')); + }, []); return ( - - - - - - {textParser([view.title])} - - - - - - - - - - { view.close && } - { view.submit && } - - - - + +
    + ); -}; +} -export const MessageBlock = ({ blocks }, context = contextDefault) => ( - - {uiKitMessage(blocks)} - -); +export default MessageBlock; diff --git a/app/ui-message/client/blocks/ModalBlock.html b/app/ui-message/client/blocks/ModalBlock.html deleted file mode 100644 index 15f1f6f715f3..000000000000 --- a/app/ui-message/client/blocks/ModalBlock.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/app/ui-message/client/blocks/ModalBlock.js b/app/ui-message/client/blocks/ModalBlock.js index bb6a1e48deac..cec19b7c74d1 100644 --- a/app/ui-message/client/blocks/ModalBlock.js +++ b/app/ui-message/client/blocks/ModalBlock.js @@ -1,142 +1,349 @@ import { UIKitIncomingInteractionContainerType } from '@rocket.chat/apps-engine/definition/uikit/UIKitIncomingInteractionContainer'; -import { ReactiveDict } from 'meteor/reactive-dict'; -import { ReactiveVar } from 'meteor/reactive-var'; -import { Template } from 'meteor/templating'; +import { Modal, AnimatedVisibility, ButtonGroup, Button, Box } from '@rocket.chat/fuselage'; +import { useMutableCallback, useUniqueId } from '@rocket.chat/fuselage-hooks'; +import { kitContext, UiKitComponent, UiKitModal, modalParser } from '@rocket.chat/fuselage-ui-kit'; +import { uiKitText } from '@rocket.chat/ui-kit'; +import React, { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react'; +import { renderMessageBody } from '../../../ui-utils/client'; +import { getURL } from '../../../utils/lib/getURL'; import * as ActionManager from '../ActionManager'; -import { modalBlockWithContext } from './MessageBlock'; -import './ModalBlock.html'; - -const prevent = (e) => { - if (e) { - (e.nativeEvent || e).stopImmediatePropagation(); - e.stopPropagation(); - e.preventDefault(); +// TODO: move this to fuselage-ui-kit itself +modalParser.text = ({ text, type } = {}) => { + if (type !== 'mrkdwn') { + return text; } -}; -Template.ModalBlock.onRendered(async function() { - const React = await import('react'); - const ReactDOM = await import('react-dom'); - const state = new ReactiveVar(); + return ; +}; - const { viewId, appId } = this.data; +const textParser = uiKitText({ + plain_text: ({ text }) => text, + text: ({ text }) => text, +}); - this.autorun(() => { - state.set(Template.currentData()); - }); +const focusableElementsString = ` + a[href]:not([tabindex="-1"]), + area[href]:not([tabindex="-1"]), + input:not([disabled]):not([tabindex="-1"]), + select:not([disabled]):not([tabindex="-1"]), + textarea:not([disabled]):not([tabindex="-1"]), + button:not([disabled]):not([tabindex="-1"]), + iframe, + object, + embed, + [tabindex]:not([tabindex="-1"]), + [contenteditable]`; - const handleUpdate = ({ type, ...data }) => { - if (type === 'errors') { - return state.set({ ...state.get(), errors: data.errors }); - } - return state.set(data); - }; +const focusableElementsStringInvalid = ` + a[href]:not([tabindex="-1"]):invalid, + area[href]:not([tabindex="-1"]):invalid, + input:not([disabled]):not([tabindex="-1"]):invalid, + select:not([disabled]):not([tabindex="-1"]):invalid, + textarea:not([disabled]):not([tabindex="-1"]):invalid, + button:not([disabled]):not([tabindex="-1"]):invalid, + iframe:invalid, + object:invalid, + embed:invalid, + [tabindex]:not([tabindex="-1"]):invalid, + [contenteditable]:invalid`; - this.cancel = () => { - ActionManager.off(viewId, handleUpdate); - }; +export function ModalBlock({ + view, + errors, + appId, + onSubmit, + onClose, + onCancel, +}) { + const id = `modal_id_${ useUniqueId() }`; + const ref = useRef(); - this.node = this.find('.js-modal-block').parentElement; - ActionManager.on(viewId, handleUpdate); + // Auto focus + useEffect(() => { + if (!ref.current) { + return; + } - const filterInputFields = ({ element, elements = [] }) => { - if (element && element.initialValue) { - return true; + if (errors && Object.keys(errors).length) { + const element = ref.current.querySelector(focusableElementsStringInvalid); + element && element.focus(); + } else { + const element = ref.current.querySelector(focusableElementsString); + element && element.focus(); } - if (elements.length && elements.map((element) => ({ element })).filter(filterInputFields).length) { - return true; + }, [ref.current, errors]); + // save focus to restore after close + const previousFocus = useMemo(() => document.activeElement, []); + // restore the focus after the component unmount + useEffect(() => () => previousFocus && previousFocus.focus(), []); + // Handle Tab, Shift + Tab, Enter and Escape + const handleKeyDown = useCallback((event) => { + if (event.keyCode === 13) { // ENTER + return onSubmit(event); } - }; - const mapElementToState = ({ element, blockId, elements = [] }) => { - if (elements.length) { - return elements.map((element) => ({ element, blockId })).filter(filterInputFields).map(mapElementToState); + if (event.keyCode === 27) { // ESC + event.stopPropagation(); + event.preventDefault(); + onClose(); + return false; } - return [element.actionId, { value: element.initialValue, blockId }]; - }; - this.state = new ReactiveDict(this.data.view.blocks.filter(filterInputFields).map(mapElementToState).reduce((obj, el) => { - if (Array.isArray(el[0])) { - return { ...obj, ...Object.fromEntries(el) }; + if (event.keyCode === 9) { // TAB + const elements = Array.from(ref.current.querySelectorAll(focusableElementsString)); + const [first] = elements; + const last = elements.pop(); + + if (!ref.current.contains(document.activeElement)) { + return first.focus(); + } + + if (event.shiftKey) { + if (!first || first === document.activeElement) { + last.focus(); + event.stopPropagation(); + event.preventDefault(); + } + return; + } + + if (!last || last === document.activeElement) { + first.focus(); + event.stopPropagation(); + event.preventDefault(); + } } - return { ...obj, [el[0]]: el[1] }; - }, {})); + }, [onSubmit]); + // Clean the events + useEffect(() => { + const element = document.querySelector('.rc-modal-wrapper'); + const container = element.querySelector('.rcx-modal__content'); + const close = (e) => { + if (e.target !== element) { + return; + } + e.preventDefault(); + e.stopPropagation(); + onClose(); + return false; + }; + + const ignoreIfnotContains = (e) => { + if (!container.contains(e.target)) { + return; + } + return handleKeyDown(e); + }; + + document.addEventListener('keydown', ignoreIfnotContains); + element.addEventListener('click', close); + return () => { + document.removeEventListener('keydown', ignoreIfnotContains); + element.removeEventListener('click', close); + }; + }, handleKeyDown); + + return ( + + + + + {textParser([view.title])} + + + + + + + + + + {view.close && } + {view.submit && } + + + + + ); +} + +const useActionManagerState = (initialState) => { + const [state, setState] = useState(initialState); + + const { viewId } = state; + + useEffect(() => { + const handleUpdate = ({ type, ...data }) => { + if (type === 'errors') { + const { errors } = data; + setState({ ...state, errors }); + return; + } + + setState(data); + }; + + ActionManager.on(viewId, handleUpdate); + + return () => { + ActionManager.off(viewId, handleUpdate); + }; + }, [viewId]); + + return state; +}; + +const useValues = (view) => { + const reducer = useMutableCallback((values, { actionId, payload }) => ({ + ...values, + [actionId]: payload, + })); + + const initializer = useMutableCallback(() => { + const filterInputFields = ({ element, elements = [] }) => { + if (element && element.initialValue) { + return true; + } + + if (elements.length && elements.map((element) => ({ element })).filter(filterInputFields).length) { + return true; + } + }; + + const mapElementToState = ({ element, blockId, elements = [] }) => { + if (elements.length) { + return elements.map((element) => ({ element, blockId })).filter(filterInputFields).map(mapElementToState); + } + return [element.actionId, { value: element.initialValue, blockId }]; + }; - const groupStateByBlockIdMap = (obj, [key, { blockId, value }]) => { + return view.blocks + .filter(filterInputFields) + .map(mapElementToState) + .reduce((obj, el) => { + if (Array.isArray(el[0])) { + return { ...obj, ...Object.fromEntries(el) }; + } + + const [key, value] = el; + return { ...obj, [key]: value }; + }, {}); + }); + + return useReducer(reducer, null, initializer); +}; + +function ConnectedModalBlock(props) { + const state = useActionManagerState(props); + + const { + appId, + viewId, + mid: _mid, + errors, + view, + } = state; + + const [values, updateValues] = useValues(view); + + const groupStateByBlockId = (obj) => Object.entries(obj).reduce((obj, [key, { blockId, value }]) => { obj[blockId] = obj[blockId] || {}; obj[blockId][key] = value; return obj; + }, {}); + + const prevent = (e) => { + if (e) { + (e.nativeEvent || e).stopImmediatePropagation(); + e.stopPropagation(); + e.preventDefault(); + } }; - const groupStateByBlockId = (obj) => Object.entries(obj).reduce(groupStateByBlockIdMap, {}); - ReactDOM.render( - React.createElement( - modalBlockWithContext({ - onCancel: (e) => { - prevent(e); - return ActionManager.triggerCancel({ - appId, - viewId, - view: { - ...state.get().view, - id: viewId, - state: groupStateByBlockId(this.state.all()), - }, - }); - }, - onClose: (e) => { - prevent(e); - return ActionManager.triggerCancel({ - appId, - viewId, - view: { - ...state.get().view, - id: viewId, - state: groupStateByBlockId(this.state.all()), - }, - isCleared: true, - }); - }, - onSubmit: (e) => { - prevent(e); - ActionManager.triggerSubmitView({ - viewId, - appId, - payload: { - view: { - ...state.get().view, - id: viewId, - state: groupStateByBlockId(this.state.all()), - }, - }, - }); - }, - action: ({ actionId, appId, value, blockId, mid = this.data.mid }) => ActionManager.triggerBlockAction({ - container: { - type: UIKitIncomingInteractionContainerType.VIEW, - id: viewId, - }, - actionId, - appId, - value, + + const context = { + action: ({ actionId, appId, value, blockId, mid = _mid }) => ActionManager.triggerBlockAction({ + container: { + type: UIKitIncomingInteractionContainerType.VIEW, + id: viewId, + }, + actionId, + appId, + value, + blockId, + mid, + }), + state: ({ actionId, value, /* ,appId, */ blockId = 'default' }) => { + updateValues({ + actionId, + payload: { blockId, - mid, - }), - state: ({ actionId, value, /* ,appId, */ blockId = 'default' }) => { - this.state.set(actionId, { - blockId, - value, - }); + value, }, - ...this.data, - }), - { data: () => state.get(), values: () => this.state.all() }, - ), - this.node, - ); -}); -Template.ModalBlock.onDestroyed(async function() { - const ReactDOM = await import('react-dom'); - this.node && ReactDOM.unmountComponentAtNode(this.node); -}); + }); + }, + ...state, + values, + }; + + const handleSubmit = useMutableCallback((e) => { + prevent(e); + ActionManager.triggerSubmitView({ + viewId, + appId, + payload: { + view: { + ...view, + id: viewId, + state: groupStateByBlockId(values), + }, + }, + }); + }); + + const handleCancel = useMutableCallback((e) => { + prevent(e); + return ActionManager.triggerCancel({ + appId, + viewId, + view: { + ...view, + id: viewId, + state: groupStateByBlockId(values), + }, + }); + }); + + const handleClose = useMutableCallback((e) => { + prevent(e); + return ActionManager.triggerCancel({ + appId, + viewId, + view: { + ...view, + id: viewId, + state: groupStateByBlockId(values), + }, + isCleared: true, + }); + }); + + return + + ; +} + +export default ConnectedModalBlock; diff --git a/app/ui-message/client/blocks/TextBlock.html b/app/ui-message/client/blocks/TextBlock.html deleted file mode 100644 index 9ede6447c0b5..000000000000 --- a/app/ui-message/client/blocks/TextBlock.html +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/app/ui-message/client/blocks/TextBlock.js b/app/ui-message/client/blocks/TextBlock.js deleted file mode 100644 index e71c590301ee..000000000000 --- a/app/ui-message/client/blocks/TextBlock.js +++ /dev/null @@ -1,5 +0,0 @@ - - -// import { Template } from 'meteor/templating'; - -import './TextBlock.html'; diff --git a/app/ui-message/client/blocks/index.js b/app/ui-message/client/blocks/index.js index 2b64c4de523c..5e332705c1d4 100644 --- a/app/ui-message/client/blocks/index.js +++ b/app/ui-message/client/blocks/index.js @@ -1,5 +1,4 @@ -import './styles.css'; -import './Blocks.js'; -import './ModalBlock'; -import './TextBlock'; -import './ButtonElement.html'; +import { createTemplateForComponent } from '../../../../client/reactAdapters'; + +createTemplateForComponent('ModalBlock', () => import('./ModalBlock')); +createTemplateForComponent('Blocks', () => import('./MessageBlock')); diff --git a/app/ui-message/client/blocks/styles.css b/app/ui-message/client/blocks/styles.css deleted file mode 100644 index 2f990fc2f045..000000000000 --- a/app/ui-message/client/blocks/styles.css +++ /dev/null @@ -1,18 +0,0 @@ -.block-kit-debug.debug { - padding: 1rem; - - border: 1px solid; -} - -.block-kit-debug legend { - display: none; -} - -.block-kit-debug.debug legend { - display: initial; -} - -.rc-modal--uikit { - width: 680px; - max-width: 100%; -} diff --git a/app/ui-message/client/message.html b/app/ui-message/client/message.html index a69ad4ca7a71..84b56e5dbe76 100644 --- a/app/ui-message/client/message.html +++ b/app/ui-message/client/message.html @@ -121,7 +121,7 @@
    {{/if}} - {{#if and settings.showReplyButton msg.tcount}} + {{#if $and settings.showReplyButton msg.tcount}}
; } + +export default SortList; diff --git a/app/ui-sidenav/client/roomList.js b/app/ui-sidenav/client/roomList.js index f6a062df8d7d..ad77a5654566 100644 --- a/app/ui-sidenav/client/roomList.js +++ b/app/ui-sidenav/client/roomList.js @@ -136,8 +136,8 @@ const getLowerCaseNames = (room, nameDefault = '', fnameDefault = '') => { const name = room.name || nameDefault; const fname = room.fname || fnameDefault || name; return { - lowerCaseName: name.toLowerCase(), - lowerCaseFName: fname.toLowerCase(), + lowerCaseName: String(name).toLowerCase(), + lowerCaseFName: String(fname).toLowerCase(), }; }; diff --git a/app/ui-sidenav/client/sidebarHeader.js b/app/ui-sidenav/client/sidebarHeader.js index 306872c0a456..b748f0367835 100644 --- a/app/ui-sidenav/client/sidebarHeader.js +++ b/app/ui-sidenav/client/sidebarHeader.js @@ -10,7 +10,7 @@ import { settings } from '../../settings'; import { hasAtLeastOnePermission } from '../../authorization'; import { userStatus } from '../../user-status'; import { hasPermission } from '../../authorization/client'; -import { createTemplateForComponent } from '../../../client/createTemplateForComponent'; +import { createTemplateForComponent } from '../../../client/reactAdapters'; const setStatus = (status, statusText) => { @@ -66,15 +66,13 @@ const toolbarButtons = (/* user */) => [{ action: async (e) => { const options = []; const config = { - template: 'SortList', + template: createTemplateForComponent('SortList', () => import('./SortList')), currentTarget: e.currentTarget, data: { options, }, offsetVertical: e.currentTarget.clientHeight + 10, }; - const { SortList } = await import('./SortList'); - await createTemplateForComponent(SortList); popover.open(config); }, }, diff --git a/app/ui-utils/client/index.js b/app/ui-utils/client/index.js index 163a9fa6e0bb..5dbb840cc4f9 100644 --- a/app/ui-utils/client/index.js +++ b/app/ui-utils/client/index.js @@ -1,4 +1,3 @@ -export { AdminBox } from './lib/AdminBox'; export { modal } from './lib/modal'; export { SideNav } from './lib/SideNav'; export { AccountBox } from './lib/AccountBox'; diff --git a/app/ui-utils/client/lib/AdminBox.js b/app/ui-utils/client/lib/AdminBox.js deleted file mode 100644 index f6f1856ffa5a..000000000000 --- a/app/ui-utils/client/lib/AdminBox.js +++ /dev/null @@ -1,25 +0,0 @@ -import { ReactiveVar } from 'meteor/reactive-var'; -import { Tracker } from 'meteor/tracker'; -import _ from 'underscore'; - -export const AdminBox = new class { - constructor() { - this.options = new ReactiveVar([]); - } - - addOption(option) { - return Tracker.nonreactive(() => { - const actual = this.options.get(); - actual.push(option); - return this.options.set(actual); - }); - } - - getOptions() { - return _.filter(this.options.get(), function(option) { - if ((option.permissionGranted == null) || option.permissionGranted()) { - return true; - } - }); - } -}(); diff --git a/app/ui-utils/client/lib/callMethod.js b/app/ui-utils/client/lib/callMethod.js index 390c1ea21bc8..c1b05108ad80 100644 --- a/app/ui-utils/client/lib/callMethod.js +++ b/app/ui-utils/client/lib/callMethod.js @@ -1,6 +1,6 @@ import { Meteor } from 'meteor/meteor'; -import { handleError } from '../../../utils'; +import { handleError } from '../../../utils/client/lib/handleError'; /** * Wraps a Meteor method into a Promise. diff --git a/app/ui-utils/client/lib/openRoom.js b/app/ui-utils/client/lib/openRoom.js index 7528398b0acb..54252661781d 100644 --- a/app/ui-utils/client/lib/openRoom.js +++ b/app/ui-utils/client/lib/openRoom.js @@ -29,6 +29,8 @@ const getDomOfLoading = mem(function getDomOfLoading() { }); function replaceCenterDomBy(dom) { + document.dispatchEvent(new CustomEvent('main-content-destroyed')); + const mainNode = document.querySelector('.main-content'); if (mainNode) { for (const child of Array.from(mainNode.children)) { diff --git a/app/ui-vrecord/client/index.js b/app/ui-vrecord/client/index.js index 3f8eb8b48717..6f90362975e2 100644 --- a/app/ui-vrecord/client/index.js +++ b/app/ui-vrecord/client/index.js @@ -1,6 +1,7 @@ import './vrecord.html'; import './vrecord'; import { VRecDialog } from './VRecDialog'; +import './vrecord.css'; export { VRecDialog, diff --git a/app/ui/client/components/header/headerRoom.js b/app/ui/client/components/header/headerRoom.js index ec921d7e1901..2a843f8e88c6 100644 --- a/app/ui/client/components/header/headerRoom.js +++ b/app/ui/client/components/header/headerRoom.js @@ -178,6 +178,31 @@ Template.headerRoom.events({ }); } }, + 'click .rc-header__content.rc-header__block'(event, instance) { + const { tabBar } = instance.parentTemplate(); + const $flexTab = $('.flex-tab-container .flex-tab'); + + if (tabBar.getState() === 'opened' && (tabBar.getTemplate() === 'channelSettings' || tabBar.getTemplate() === 'membersList')) { + $flexTab.attr('template', ''); + return tabBar.close(); + } + + if (instance.currentChannel.t !== 'd') { + $flexTab.attr('template', 'channelSettings'); + tabBar.setData({ + label: 'Room_Info', + icon: 'info-circled', + }); + tabBar.open(TabBar.getButton('channel-settings')); + } else { + $flexTab.attr('template', 'membersList'); + tabBar.setData({ + label: 'User_Info', + icon: 'info-user', + }); + tabBar.open(TabBar.getButton('user-info')); + } + }, }); const loadUserStatusText = () => { diff --git a/app/ui/client/index.js b/app/ui/client/index.js index 4867309779f8..b7fa4c6840de 100644 --- a/app/ui/client/index.js +++ b/app/ui/client/index.js @@ -1,6 +1,7 @@ +import { createTemplateForComponent } from '../../../client/reactAdapters'; + import './lib/accounts'; import './lib/collections'; -import './lib/customEventPolyfill'; import './lib/iframeCommands'; import './lib/menu'; import './lib/Modernizr'; @@ -43,7 +44,6 @@ import './views/app/invite'; import './views/app/videoCall/videoButtons'; import './views/app/videoCall/videoCall'; import './views/app/photoswipe'; -import './views/app/RoomForeword'; import './components/icon'; import './components/status'; import './components/table.html'; @@ -67,3 +67,5 @@ export { Login, animationSupport, animeBack, Button, preLoadImgs } from './lib/r export { AudioRecorder } from './lib/recorderjs/audioRecorder'; export { VideoRecorder } from './lib/recorderjs/videoRecorder'; export { chatMessages } from './views/app/room'; + +createTemplateForComponent('RoomForeword', () => import('./views/app/RoomForeword')); diff --git a/app/ui/client/lib/customEventPolyfill.js b/app/ui/client/lib/customEventPolyfill.js deleted file mode 100644 index 891bc5e4f706..000000000000 --- a/app/ui/client/lib/customEventPolyfill.js +++ /dev/null @@ -1,12 +0,0 @@ -(function () { - function CustomEvent ( event, params ) { - params = params || { bubbles: false, cancelable: false, detail: undefined }; - var evt = document.createEvent( 'CustomEvent' ); - evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); - return evt; - } - - CustomEvent.prototype = window.Event.prototype; - - window.CustomEvent = CustomEvent; -})(); \ No newline at end of file diff --git a/app/ui/client/views/app/RoomForeword.html b/app/ui/client/views/app/RoomForeword.html deleted file mode 100644 index 72b2b7734c0e..000000000000 --- a/app/ui/client/views/app/RoomForeword.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/app/ui/client/views/app/RoomForeword.js b/app/ui/client/views/app/RoomForeword.js index ef068e3b3219..e9aee84793f1 100644 --- a/app/ui/client/views/app/RoomForeword.js +++ b/app/ui/client/views/app/RoomForeword.js @@ -1,16 +1,17 @@ import React from 'react'; -import { Meteor } from 'meteor/meteor'; import { Avatar, Margins, Flex, Box, Tag } from '@rocket.chat/fuselage'; -import { Template } from 'meteor/templating'; -import './RoomForeword.html'; -import { Rooms, Users } from '../../../../models'; +import { Rooms } from '../../../../models'; import { useTranslation } from '../../../../../client/contexts/TranslationContext'; +import { useReactiveValue } from '../../../../../client/hooks/useReactiveValue'; +import { useUser } from '../../../../../client/contexts/UserContext'; - -const RoomForeword = ({ room, user }) => { +const RoomForeword = ({ _id: rid }) => { const t = useTranslation(); + const user = useUser(); + const room = useReactiveValue(() => Rooms.findOne({ _id: rid })); + if (room.t !== 'd') { return t('Start_of_conversation'); } @@ -39,7 +40,15 @@ const RoomForeword = ({ room, user }) => { - {users.map((username, index) => {username})} + {users.map((username, index) => + {username} + )} @@ -49,25 +58,4 @@ const RoomForeword = ({ room, user }) => { ; }; -Template.RoomForeword.onRendered(async function() { - const { MeteorProvider } = await import('../../../../../client/providers/MeteorProvider'); - const ReactDOM = await import('react-dom'); - this.container = this.firstNode; - this.autorun(() => { - const data = Template.currentData(); - const { _id: rid } = data; - - const user = Users.findOne(Meteor.userId(), { username: 1 }); - - const room = Rooms.findOne({ _id: rid }); - ReactDOM.render(React.createElement(MeteorProvider, { - children: React.createElement(RoomForeword, { ...data, room, user }), - }), this.container); - }); -}); - - -Template.RoomForeword.onDestroyed(async function() { - const ReactDOM = await import('react-dom'); - this.container && ReactDOM.unmountComponentAtNode(this.container); -}); +export default RoomForeword; diff --git a/app/ui/client/views/app/components/Directory/ChannelsTab.js b/app/ui/client/views/app/components/Directory/ChannelsTab.js index b516006eabfb..d8ef60b8f5f7 100644 --- a/app/ui/client/views/app/components/Directory/ChannelsTab.js +++ b/app/ui/client/views/app/components/Directory/ChannelsTab.js @@ -8,6 +8,7 @@ import { useTranslation } from '../../../../../../../client/contexts/Translation import { useRoute } from '../../../../../../../client/contexts/RouterContext'; import { useQuery, useFormatDate } from '../hooks'; import { roomTypes } from '../../../../../../utils/client'; +import { usePermission } from '../../../../../../../client/contexts/AuthorizationContext'; const style = { whiteSpace: 'nowrap', textOverflow: 'ellipsis', overflow: 'hidden' }; @@ -47,15 +48,17 @@ export function ChannelsTab() { mediaQuery && {t('Last_Message')}, ].filter(Boolean), [sort, mediaQuery]); - const go = useRoute('channel'); + const channelRoute = useRoute('channel'); - const data = useEndpointData('GET', 'directory', query) || {}; + const canViewPublicRooms = usePermission('view-c-room'); + + const data = (canViewPublicRooms && useEndpointData('GET', 'directory', query)) || { result: [] }; const onClick = useMemo(() => (name) => (e) => { if (e.type === 'click' || e.key === 'Enter') { - go({ name }); + channelRoute.push({ name }); } - }, []); + }, [channelRoute]); const formatDate = useFormatDate(); const renderRow = useCallback(({ _id, ts, name, fname, description, usersCount, lastMessage, topic, ...room }) => diff --git a/app/ui/client/views/app/components/Directory/UserTab.js b/app/ui/client/views/app/components/Directory/UserTab.js index eda4c92ca7a7..ee095aeacd46 100644 --- a/app/ui/client/views/app/components/Directory/UserTab.js +++ b/app/ui/client/views/app/components/Directory/UserTab.js @@ -42,15 +42,18 @@ export function UserTab({ mediaQuery && {t('Joined_at')}, ].filter(Boolean), [sort, federation, canViewFullOtherUserInfo, mediaQuery]); - const go = useRoute('direct'); + const directRoute = useRoute('direct'); - const data = useEndpointData('GET', 'directory', query) || {}; + const canViewOutsideRoom = usePermission('view-outside-room'); + const canViewDM = usePermission('view-d-room'); + + const data = (canViewOutsideRoom && canViewDM && useEndpointData('GET', 'directory', query)) || { result: [] }; const onClick = useMemo(() => (username) => (e) => { if (e.type === 'click' || e.key === 'Enter') { - go({ rid: username }); + directRoute.push({ rid: username }); } - }, []); + }, [directRoute]); const formatDate = useFormatDate(); diff --git a/app/ui/client/views/app/components/Directory/index.js b/app/ui/client/views/app/components/Directory/index.js index fa19dd1834fd..3b8b2c7c0646 100644 --- a/app/ui/client/views/app/components/Directory/index.js +++ b/app/ui/client/views/app/components/Directory/index.js @@ -19,14 +19,14 @@ export function DirectoryPage() { const tab = useRouteParameter('tab'); - const goToDirectory = useRoute('directory'); - const handleTabClick = useCallback((tab) => () => goToDirectory({ tab }), [tab]); + const directoryRoute = useRoute('directory'); + const handleTabClick = useCallback((tab) => () => directoryRoute.push({ tab }), [tab]); useEffect(() => { if (!tab || (tab === 'external' && !federationEnabled)) { - return goToDirectory.replacingState({ tab: defaultTab }); + return directoryRoute.replace({ tab: defaultTab }); } - }, [tab, federationEnabled, defaultTab]); + }, [directoryRoute, tab, federationEnabled, defaultTab]); return @@ -51,3 +51,5 @@ export function DirectoryPage() { DirectoryPage.displayName = 'DirectoryPage'; + +export default DirectoryPage; diff --git a/app/ui/client/views/app/components/hooks.js b/app/ui/client/views/app/components/hooks.js index 92ef5c55bb54..5c8bb40f29eb 100644 --- a/app/ui/client/views/app/components/hooks.js +++ b/app/ui/client/views/app/components/hooks.js @@ -1,5 +1,6 @@ import { useState, useEffect, useMemo, useCallback } from 'react'; import moment from 'moment'; +import s from 'underscore.string'; import { useUserPreference } from '../../../../../../client/contexts/UserContext'; import { useSetting } from '../../../../../../client/contexts/SettingsContext'; @@ -82,3 +83,24 @@ export function useFormatDate() { const format = useSetting('Message_DateFormat'); return useCallback((time) => moment(time).format(format), [format]); } + +export const useFormatMemorySize = () => useCallback((memorySize) => { + if (typeof memorySize !== 'number') { + return null; + } + + const units = ['bytes', 'kB', 'MB', 'GB']; + + let order; + for (order = 0; order < units.length - 1; ++order) { + const upperLimit = Math.pow(1024, order + 1); + + if (memorySize < upperLimit) { + break; + } + } + + const divider = Math.pow(1024, order); + const decimalDigits = order === 0 ? 0 : 2; + return `${ s.numberFormat(memorySize / divider, decimalDigits) } ${ units[order] }`; +}, []); diff --git a/app/ui/client/views/app/createChannel.js b/app/ui/client/views/app/createChannel.js index 778f2a708d40..9cb96bfc1abc 100644 --- a/app/ui/client/views/app/createChannel.js +++ b/app/ui/client/views/app/createChannel.js @@ -274,7 +274,7 @@ Template.createChannel.events({ Template.createChannel.onRendered(function() { const users = this.selectedUsers; - this.firstNode.querySelector('[name="users"]').focus(); + this.firstNode.querySelector('[name="name"]').focus(); this.ac.element = this.firstNode.querySelector('[name="users"]'); this.ac.$element = $(this.ac.element); this.ac.$element.on('autocompleteselect', function(e, { item }) { diff --git a/app/ui/client/views/app/invite.html b/app/ui/client/views/app/invite.html index 3926f60974e8..0cfb1356b887 100644 --- a/app/ui/client/views/app/invite.html +++ b/app/ui/client/views/app/invite.html @@ -1,6 +1,6 @@ + \ No newline at end of file diff --git a/ee/app/livechat-enterprise/client/views/app/customTemplates/livechatDepartmentCustomFieldsForm.js b/ee/app/livechat-enterprise/client/views/app/customTemplates/livechatDepartmentCustomFieldsForm.js index 71ffdfde7384..a1851d16cea3 100644 --- a/ee/app/livechat-enterprise/client/views/app/customTemplates/livechatDepartmentCustomFieldsForm.js +++ b/ee/app/livechat-enterprise/client/views/app/customTemplates/livechatDepartmentCustomFieldsForm.js @@ -1,23 +1,58 @@ import { ReactiveVar } from 'meteor/reactive-var'; import { Template } from 'meteor/templating'; -import { APIClient } from '../../../../../../../app/utils/client'; +import { APIClient, mountArrayQueryParameters } from '../../../../../../../app/utils/client'; import './livechatDepartmentCustomFieldsForm.html'; Template.livechatDepartmentCustomFieldsForm.helpers({ department() { return Template.instance().department.get(); }, + departmentModifier() { + return (filter, text = '') => { + const f = filter.get(); + return `${ f.length === 0 ? text : text.replace(new RegExp(filter.get(), 'i'), (part) => `${ part }`) }`; + }; + }, + onClickTagDepartment() { + return Template.instance().onClickTagDepartment; + }, + selectedDepartments() { + return Template.instance().selectedDepartments.get(); + }, + selectedDepartmentsIds() { + return Template.instance().selectedDepartments.get().map((dept) => dept._id); + }, + onSelectDepartments() { + return Template.instance().onSelectDepartments; + }, + exceptionsDepartments() { + const department = Template.instance().department.get(); + return [department && department._id, ...Template.instance().selectedDepartments.get().map((dept) => dept._id)]; + }, }); Template.livechatDepartmentCustomFieldsForm.onCreated(function() { + this.selectedDepartments = new ReactiveVar([]); const { id: _id, department: contextDepartment } = this.data; this.department = new ReactiveVar(contextDepartment); + this.onSelectDepartments = ({ item: department }) => { + department.text = department.name; + this.selectedDepartments.set(this.selectedDepartments.get().concat(department)); + }; + + this.onClickTagDepartment = (department) => { + this.selectedDepartments.set(this.selectedDepartments.get().filter((dept) => dept._id !== department._id)); + }; if (!contextDepartment && _id) { this.autorun(async () => { const { department } = await APIClient.v1.get(`livechat/department/${ _id }`); + if (department.departmentsAllowedToForward) { + const { departments } = await APIClient.v1.get(`livechat/department.listByIds?${ mountArrayQueryParameters('ids', department.departmentsAllowedToForward) }&fields=${ JSON.stringify({ fields: { name: 1 } }) }`); + this.selectedDepartments.set(departments.map((dept) => ({ _id: dept._id, text: dept.name }))); + } this.department.set(department); }); } diff --git a/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorEditCustomFieldsForm.html b/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorEditCustomFieldsForm.html new file mode 100644 index 000000000000..2e3f730ff6a3 --- /dev/null +++ b/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorEditCustomFieldsForm.html @@ -0,0 +1,18 @@ + diff --git a/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorEditCustomFieldsForm.js b/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorEditCustomFieldsForm.js new file mode 100644 index 000000000000..a72d2151b6d8 --- /dev/null +++ b/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorEditCustomFieldsForm.js @@ -0,0 +1,29 @@ +import { ReactiveVar } from 'meteor/reactive-var'; +import { Template } from 'meteor/templating'; + +import { APIClient } from '../../../../../../../app/utils/client'; +import './visitorEditCustomFieldsForm.html'; + +Template.visitorEditCustomFieldsForm.helpers({ + availablePriorities() { + return Template.instance().priorities.get(); + }, + priorityId() { + return Template.instance().roomPriority.get(); + }, + showPriorities() { + return Template.instance().priorities.get().length > 0; + }, +}); + +Template.visitorEditCustomFieldsForm.onCreated(async function() { + this.priorities = new ReactiveVar([]); + this.roomPriority = new ReactiveVar(null); + + const { priorityId } = this.data; + if (priorityId) { + this.roomPriority.set(priorityId); + } + const { priorities } = await APIClient.v1.get('livechat/priorities.list'); + this.priorities.set(priorities); +}); diff --git a/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorInfoCustomForm.html b/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorInfoCustomForm.html new file mode 100644 index 000000000000..8db71278cfc7 --- /dev/null +++ b/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorInfoCustomForm.html @@ -0,0 +1,3 @@ + diff --git a/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorInfoCustomForm.js b/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorInfoCustomForm.js new file mode 100644 index 000000000000..7dfa8d12614d --- /dev/null +++ b/ee/app/livechat-enterprise/client/views/app/customTemplates/visitorInfoCustomForm.js @@ -0,0 +1,28 @@ +import { ReactiveVar } from 'meteor/reactive-var'; +import { Template } from 'meteor/templating'; + +import { APIClient } from '../../../../../../../app/utils/client'; +import './visitorInfoCustomForm.html'; + +Template.visitorInfoCustomForm.helpers({ + priority() { + return Template.instance().priority.get(); + }, +}); + +Template.visitorInfoCustomForm.onCreated(function() { + this.priority = new ReactiveVar(null); + + this.autorun(async () => { + // To make this template reactive we expect a ReactiveVar through the data property, + // because the parent form may not be rerender, only the dynamic template data + const { priorityId = null } = this.data.get(); + let priority; + + if (priorityId) { + priority = await APIClient.v1.get(`livechat/priorities.getOne?priorityId=${ priorityId }`); + } + + this.priority.set(priority); + }); +}); diff --git a/ee/app/livechat-enterprise/client/views/app/registerCustomTemplates.js b/ee/app/livechat-enterprise/client/views/app/registerCustomTemplates.js index cc965f4f7008..de436419e742 100644 --- a/ee/app/livechat-enterprise/client/views/app/registerCustomTemplates.js +++ b/ee/app/livechat-enterprise/client/views/app/registerCustomTemplates.js @@ -2,7 +2,11 @@ import { addCustomFormTemplate } from '../../../../../../app/livechat/client/vie import './customTemplates/livechatDepartmentCustomFieldsForm'; import './customTemplates/livechatAgentEditCustomFieldsForm'; import './customTemplates/livechatAgentInfoCustomFieldsForm'; +import './customTemplates/visitorEditCustomFieldsForm'; +import './customTemplates/visitorInfoCustomForm'; addCustomFormTemplate('livechatDepartmentForm', 'livechatDepartmentCustomFieldsForm'); addCustomFormTemplate('livechatAgentEditForm', 'livechatAgentEditCustomFieldsForm'); addCustomFormTemplate('livechatAgentInfoForm', 'livechatAgentInfoCustomFieldsForm'); +addCustomFormTemplate('livechatVisitorEditForm', 'visitorEditCustomFieldsForm'); +addCustomFormTemplate('livechatVisitorInfo', 'visitorInfoCustomForm'); diff --git a/ee/app/livechat-enterprise/client/views/livechatPriorities.html b/ee/app/livechat-enterprise/client/views/livechatPriorities.html new file mode 100644 index 000000000000..03ed219d7177 --- /dev/null +++ b/ee/app/livechat-enterprise/client/views/livechatPriorities.html @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/ee/app/livechat-enterprise/client/views/livechatPriorities.js b/ee/app/livechat-enterprise/client/views/livechatPriorities.js new file mode 100644 index 000000000000..6dcfc9d23a87 --- /dev/null +++ b/ee/app/livechat-enterprise/client/views/livechatPriorities.js @@ -0,0 +1,97 @@ +import { Meteor } from 'meteor/meteor'; +import { ReactiveVar } from 'meteor/reactive-var'; +import { FlowRouter } from 'meteor/kadira:flow-router'; +import { Template } from 'meteor/templating'; + +import { modal } from '../../../../../app/ui-utils'; +import { t, handleError, APIClient } from '../../../../../app/utils'; +import { hasLicense } from '../../../license/client'; +import './livechatPriorities.html'; + +const ITEMS_COUNT = 50; +const licenseEnabled = new ReactiveVar(false); + +hasLicense('livechat-enterprise').then((enabled) => { + licenseEnabled.set(enabled); +}); + +Template.livechatPriorities.helpers({ + priorities() { + return Template.instance().priorities.get(); + }, + onTableScroll() { + const instance = Template.instance(); + return function(currentTarget) { + if (currentTarget.offsetHeight + currentTarget.scrollTop < currentTarget.scrollHeight - 100) { + return; + } + const priorities = instance.priorities.get(); + if (instance.total.get() > priorities.length) { + instance.offset.set(instance.offset.get() + ITEMS_COUNT); + } + }; + }, + hasLicense() { + return licenseEnabled.get(); + }, +}); + +Template.livechatPriorities.events({ + 'click .remove-priority'(e, instance) { + e.preventDefault(); + e.stopPropagation(); + + modal.open({ + title: t('Are_you_sure'), + type: 'warning', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: t('Yes'), + cancelButtonText: t('Cancel'), + closeOnConfirm: false, + html: false, + }, () => { + Meteor.call('livechat:removePriority', this._id, function(error/* , result*/) { + if (error) { + return handleError(error); + } + instance.offset.set(0); + instance.loadPriorities(instance.offset.get()); + modal.open({ + title: t('Removed'), + text: t('Priority_removed'), + type: 'success', + timer: 1000, + showConfirmButton: false, + }); + }); + }); + }, + + 'click .priority-info'(e/* , instance*/) { + e.preventDefault(); + FlowRouter.go('livechat-priority-edit', { _id: this._id }); + }, + +}); + +Template.livechatPriorities.onCreated(function() { + this.priorities = new ReactiveVar([]); + this.offset = new ReactiveVar(0); + this.total = new ReactiveVar(0); + + this.loadPriorities = async (offset) => { + const { priorities, total } = await APIClient.v1.get(`livechat/priorities.list?count=${ ITEMS_COUNT }&offset=${ offset }`); + this.total.set(total); + if (offset === 0) { + this.priorities.set(priorities); + } else { + this.priorities.set(this.priorities.get().concat(priorities)); + } + }; + + this.autorun(async () => { + const offset = this.offset.get(); + this.loadPriorities(offset); + }); +}); diff --git a/ee/app/livechat-enterprise/client/views/livechatPriorityForm.html b/ee/app/livechat-enterprise/client/views/livechatPriorityForm.html new file mode 100644 index 000000000000..a9d783e39c21 --- /dev/null +++ b/ee/app/livechat-enterprise/client/views/livechatPriorityForm.html @@ -0,0 +1,35 @@ + diff --git a/ee/app/livechat-enterprise/client/views/livechatPriorityForm.js b/ee/app/livechat-enterprise/client/views/livechatPriorityForm.js new file mode 100644 index 000000000000..5098082db5a3 --- /dev/null +++ b/ee/app/livechat-enterprise/client/views/livechatPriorityForm.js @@ -0,0 +1,77 @@ +import { Meteor } from 'meteor/meteor'; +import { ReactiveVar } from 'meteor/reactive-var'; +import { FlowRouter } from 'meteor/kadira:flow-router'; +import { Template } from 'meteor/templating'; +import toastr from 'toastr'; + +import { t, handleError, APIClient } from '../../../../../app/utils'; +import { hasLicense } from '../../../license/client'; +import './livechatPriorityForm.html'; + +const licenseEnabled = new ReactiveVar(false); + +hasLicense('livechat-enterprise').then((enabled) => { + licenseEnabled.set(enabled); +}); + +Template.livechatPriorityForm.helpers({ + priority() { + return Template.instance().priority.get(); + }, + hasLicense() { + return licenseEnabled.get(); + }, +}); + +Template.livechatPriorityForm.events({ + 'submit #priority-form'(e, instance) { + e.preventDefault(); + const $btn = instance.$('button.save'); + + const _id = $(e.currentTarget).data('id'); + const name = instance.$('input[name=name]').val(); + + if (name.trim() === '') { + return toastr.error(t('Please_fill_a_name')); + } + + const description = instance.$('textarea[name=description]').val(); + const dueTimeInMinutes = instance.$('input[name=dueTimeInMinutes]').val(); + + const oldBtnValue = $btn.html(); + $btn.html(t('Saving')); + + const priorityData = { + name: name.trim(), + description: description.trim(), + dueTimeInMinutes, + }; + + Meteor.call('livechat:savePriority', _id, priorityData, function(error/* , result*/) { + $btn.html(oldBtnValue); + if (error) { + return handleError(error); + } + + toastr.success(t('Saved')); + FlowRouter.go('livechat-priorities'); + }); + }, + + 'click button.back'(e/* , instance*/) { + e.preventDefault(); + FlowRouter.go('livechat-priorities'); + }, +}); + +Template.livechatPriorityForm.onCreated(function() { + this.priority = new ReactiveVar(null); + + this.autorun(async () => { + const id = FlowRouter.getParam('_id'); + if (id) { + const priority = await APIClient.v1.get(`livechat/priorities.getOne?priorityId=${ id }`); + this.priority.set(priority); + } + }); +}); diff --git a/ee/app/livechat-enterprise/client/views/livechatSideNavItems.js b/ee/app/livechat-enterprise/client/views/livechatSideNavItems.js index 3934b2347566..d6d0f8db374e 100644 --- a/ee/app/livechat-enterprise/client/views/livechatSideNavItems.js +++ b/ee/app/livechat-enterprise/client/views/livechatSideNavItems.js @@ -3,3 +3,4 @@ import { addSidebarItem } from '../../../../../app/livechat/client/views/sideNav addSidebarItem('Monitors', 'livechat-monitors', 'manage-livechat-monitors'); addSidebarItem('Units', 'livechat-units', 'manage-livechat-units'); addSidebarItem('Tags', 'livechat-tags', 'manage-livechat-tags'); +addSidebarItem('Priorities', 'livechat-priorities', 'manage-livechat-priorities'); diff --git a/ee/app/livechat-enterprise/lib/messageTypes.js b/ee/app/livechat-enterprise/lib/messageTypes.js new file mode 100644 index 000000000000..f53624afc66b --- /dev/null +++ b/ee/app/livechat-enterprise/lib/messageTypes.js @@ -0,0 +1,19 @@ +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; + +import { MessageTypes } from '../../../../app/ui-utils'; + +MessageTypes.registerType({ + id: 'livechat_priority_history', + system: true, + message: 'New_chat_priority', + data(message) { + if (!message.priorityData) { + return; + } + const { definedBy: { username }, priority: { name = null } = {} } = message.priorityData; + return { + user: username, + priority: name || TAPi18n.__('Without_priority'), + }; + }, +}); diff --git a/ee/app/livechat-enterprise/server/api/index.js b/ee/app/livechat-enterprise/server/api/index.js index 6f107fc466de..54152c09bb0a 100644 --- a/ee/app/livechat-enterprise/server/api/index.js +++ b/ee/app/livechat-enterprise/server/api/index.js @@ -1,5 +1,7 @@ import './agents'; import './departments'; +import './inquiries'; import './monitors'; +import './priorities'; import './tags'; import './units'; diff --git a/ee/app/livechat-enterprise/server/api/inquiries.js b/ee/app/livechat-enterprise/server/api/inquiries.js new file mode 100644 index 000000000000..53b0ef2891e4 --- /dev/null +++ b/ee/app/livechat-enterprise/server/api/inquiries.js @@ -0,0 +1,17 @@ +import { API } from '../../../../../app/api/server'; +import { setPriorityToInquiry } from './lib/inquiries'; + +API.v1.addRoute('livechat/inquiry.prioritize', { authRequired: true }, { + put() { + const { roomId, priority } = this.bodyParams; + if (!roomId) { + return API.v1.failure('The \'roomId\' param is required'); + } + Promise.await(setPriorityToInquiry({ + userId: this.userId, + roomId, + priority, + })); + return API.v1.success(); + }, +}); diff --git a/ee/app/livechat-enterprise/server/api/lib/inquiries.js b/ee/app/livechat-enterprise/server/api/lib/inquiries.js new file mode 100644 index 000000000000..8a7423c98b47 --- /dev/null +++ b/ee/app/livechat-enterprise/server/api/lib/inquiries.js @@ -0,0 +1,21 @@ +import { hasPermissionAsync } from '../../../../../../app/authorization/server/functions/hasPermission'; +import LivechatPriority from '../../../../models/server/raw/LivechatPriority'; +import { LivechatInquiry, Users } from '../../../../../../app/models/server/raw'; +import { LivechatEnterprise } from '../../lib/LivechatEnterprise'; + +export async function setPriorityToInquiry({ userId, roomId, priority }) { + if (!await hasPermissionAsync(userId, 'manage-livechat-priorities') && !await hasPermissionAsync(userId, 'view-l-room')) { + throw new Error('error-not-authorized'); + } + const inquiry = await LivechatInquiry.findOneByRoomId(roomId, { fields: { queued: 1 } }); + if (!inquiry || inquiry.status !== 'queued') { + throw new Error('error-invalid-inquiry'); + } + + const priorityData = priority && await LivechatPriority.findOneByIdOrName(priority); + if (!priorityData) { + throw new Error('error-invalid-priority'); + } + + LivechatEnterprise.updateRoomPriority(roomId, await Users.findOneById(userId, { fields: { username: 1 } }), priorityData); +} diff --git a/ee/app/livechat-enterprise/server/api/lib/priorities.js b/ee/app/livechat-enterprise/server/api/lib/priorities.js new file mode 100644 index 000000000000..983e2017234d --- /dev/null +++ b/ee/app/livechat-enterprise/server/api/lib/priorities.js @@ -0,0 +1,31 @@ +import { hasPermissionAsync } from '../../../../../../app/authorization/server/functions/hasPermission'; +import LivechatPriority from '../../../../models/server/raw/LivechatPriority'; + +export async function findPriorities({ userId, pagination: { offset, count, sort } }) { + if (!await hasPermissionAsync(userId, 'manage-livechat-priorities') && !await hasPermissionAsync(userId, 'view-l-room')) { + throw new Error('error-not-authorized'); + } + const cursor = LivechatPriority.find({}, { + sort: sort || { name: 1 }, + skip: offset, + limit: count, + }); + + const total = await cursor.count(); + + const priorities = await cursor.toArray(); + + return { + priorities, + count: priorities.length, + offset, + total, + }; +} + +export async function findPriorityById({ userId, priorityId }) { + if (!await hasPermissionAsync(userId, 'manage-livechat-priorities') && !await hasPermissionAsync(userId, 'view-l-room')) { + throw new Error('error-not-authorized'); + } + return LivechatPriority.findOneById(priorityId); +} diff --git a/ee/app/livechat-enterprise/server/api/priorities.js b/ee/app/livechat-enterprise/server/api/priorities.js new file mode 100644 index 000000000000..870ba2b7d22d --- /dev/null +++ b/ee/app/livechat-enterprise/server/api/priorities.js @@ -0,0 +1,29 @@ +import { API } from '../../../../../app/api/server'; +import { findPriorities, findPriorityById } from './lib/priorities'; + +API.v1.addRoute('livechat/priorities.list', { authRequired: true }, { + get() { + const { offset, count } = this.getPaginationItems(); + const { sort } = this.parseJsonQuery(); + + return API.v1.success(Promise.await(findPriorities({ + userId: this.userId, + pagination: { + offset, + count, + sort, + }, + }))); + }, +}); + +API.v1.addRoute('livechat/priorities.getOne', { authRequired: true }, { + get() { + const { priorityId } = this.queryParams; + + return API.v1.success(Promise.await(findPriorityById({ + userId: this.userId, + priorityId, + }))); + }, +}); diff --git a/ee/app/livechat-enterprise/server/hooks/afterForwardChatToDepartment.js b/ee/app/livechat-enterprise/server/hooks/afterForwardChatToDepartment.js index 66fe74c1d72f..ed8b311c8835 100644 --- a/ee/app/livechat-enterprise/server/hooks/afterForwardChatToDepartment.js +++ b/ee/app/livechat-enterprise/server/hooks/afterForwardChatToDepartment.js @@ -1,6 +1,7 @@ import { callbacks } from '../../../../../app/callbacks/server'; import LivechatRooms from '../../../../../app/models/server/models/LivechatRooms'; import LivechatDepartment from '../../../../../app/models/server/models/LivechatDepartment'; +import { setPredictedVisitorAbandonmentTime } from '../lib/Helper'; callbacks.add('livechat.afterForwardChatToDepartment', (options) => { const { rid, newDepartmentId } = options; @@ -9,6 +10,7 @@ callbacks.add('livechat.afterForwardChatToDepartment', (options) => { if (!room) { return; } + setPredictedVisitorAbandonmentTime(room); const department = LivechatDepartment.findOneById(newDepartmentId, { fields: { ancestors: 1 } }); if (!department) { diff --git a/ee/app/livechat-enterprise/server/hooks/afterRemoveDepartment.js b/ee/app/livechat-enterprise/server/hooks/afterRemoveDepartment.js new file mode 100644 index 000000000000..4a101a0787fb --- /dev/null +++ b/ee/app/livechat-enterprise/server/hooks/afterRemoveDepartment.js @@ -0,0 +1,10 @@ +import { callbacks } from '../../../../../app/callbacks'; +import { LivechatDepartment } from '../../../../../app/models/server'; + +callbacks.add('livechat.afterRemoveDepartment', (department) => { + if (!department) { + return department; + } + LivechatDepartment.removeDepartmentFromForwardListById(department._id); + return department; +}, callbacks.priority.HIGH, 'livechat-after-remove-department'); diff --git a/ee/app/livechat-enterprise/server/hooks/beforeForwardRoomToDepartment.js b/ee/app/livechat-enterprise/server/hooks/beforeForwardRoomToDepartment.js new file mode 100644 index 000000000000..b0bf3f95d1f5 --- /dev/null +++ b/ee/app/livechat-enterprise/server/hooks/beforeForwardRoomToDepartment.js @@ -0,0 +1,26 @@ +import { Meteor } from 'meteor/meteor'; + +import { callbacks } from '../../../../../app/callbacks'; +import { LivechatDepartment } from '../../../../../app/models/server'; + +callbacks.add('livechat.beforeForwardRoomToDepartment', (options) => { + const { room, transferData } = options; + if (!room || !transferData) { + return options; + } + const { departmentId } = room; + if (!departmentId) { + return options; + } + const { department: departmentToTransfer } = transferData; + const currentDepartment = LivechatDepartment.findOneById(departmentId); + if (!currentDepartment) { + return options; + } + const { departmentsAllowedToForward } = currentDepartment; + const isAllowedToTransfer = !departmentsAllowedToForward || (Array.isArray(departmentsAllowedToForward) && departmentsAllowedToForward.includes(departmentToTransfer._id)); + if (isAllowedToTransfer) { + return options; + } + throw new Meteor.Error('error-forwarding-department-target-not-allowed', 'The forwarding to the target department is not allowed.'); +}, callbacks.priority.HIGH, 'livechat-before-forward-room-to-department'); diff --git a/ee/app/livechat-enterprise/server/hooks/beforeNewInquiry.js b/ee/app/livechat-enterprise/server/hooks/beforeNewInquiry.js new file mode 100644 index 000000000000..ea26097fed1e --- /dev/null +++ b/ee/app/livechat-enterprise/server/hooks/beforeNewInquiry.js @@ -0,0 +1,24 @@ +import { Meteor } from 'meteor/meteor'; + +import { callbacks } from '../../../../../app/callbacks'; +import LivechatPriority from '../../../models/server/models/LivechatPriority'; + +callbacks.add('livechat.beforeInquiry', (extraData = {}) => { + const { priority: searchTerm, ...props } = extraData; + if (!searchTerm) { + return extraData; + } + + const priority = LivechatPriority.findOneByIdOrName(searchTerm, { fields: { dueTimeInMinutes: 1 } }); + if (!priority) { + throw new Meteor.Error('error-invalid-priority', 'Invalid priority', { function: 'livechat.beforeInquiry' }); + } + + const now = new Date(); + const ts = new Date(now.getTime()); + const { dueTimeInMinutes: estimatedWaitingTimeQueue } = priority; + const queueOrder = 0; + const estimatedServiceTimeAt = new Date(now.setMinutes(now.getMinutes() + estimatedWaitingTimeQueue)); + + return Object.assign({ ...props }, { ts, queueOrder, estimatedWaitingTimeQueue, estimatedServiceTimeAt }); +}, callbacks.priority.MEDIUM, 'livechat-before-new-inquiry'); diff --git a/ee/app/livechat-enterprise/server/hooks/beforeNewRoom.js b/ee/app/livechat-enterprise/server/hooks/beforeNewRoom.js new file mode 100644 index 000000000000..9d4564ad7010 --- /dev/null +++ b/ee/app/livechat-enterprise/server/hooks/beforeNewRoom.js @@ -0,0 +1,23 @@ +import { Meteor } from 'meteor/meteor'; + +import { callbacks } from '../../../../../app/callbacks'; +import LivechatPriority from '../../../models/server/models/LivechatPriority'; + +callbacks.add('livechat.beforeRoom', (roomInfo, extraData) => { + if (!extraData) { + return roomInfo; + } + + const { priority: searchTerm } = extraData; + if (!searchTerm) { + return roomInfo; + } + + const priority = LivechatPriority.findOneByIdOrName(searchTerm); + if (!priority) { + throw new Meteor.Error('error-invalid-priority', 'Invalid priority', { function: 'livechat.beforeRoom' }); + } + + const { _id: priorityId } = priority; + return Object.assign({ ...roomInfo }, { priorityId }); +}, callbacks.priority.MEDIUM, 'livechat-before-new-room'); diff --git a/ee/app/livechat-enterprise/server/hooks/onCheckRoomParamsApi.js b/ee/app/livechat-enterprise/server/hooks/onCheckRoomParamsApi.js new file mode 100644 index 000000000000..949c10cdcdb6 --- /dev/null +++ b/ee/app/livechat-enterprise/server/hooks/onCheckRoomParamsApi.js @@ -0,0 +1,5 @@ +import { Match } from 'meteor/check'; + +import { callbacks } from '../../../../../app/callbacks'; + +callbacks.add('livechat.onCheckRoomApiParams', (params) => Object.assign({ ...params }, { priority: Match.Maybe(String) }), callbacks.priority.MEDIUM, 'livechat-on-check-room-params-api'); diff --git a/ee/app/livechat-enterprise/server/hooks/onLoadForwardDepartmentRestrictions.js b/ee/app/livechat-enterprise/server/hooks/onLoadForwardDepartmentRestrictions.js new file mode 100644 index 000000000000..538ce151b30c --- /dev/null +++ b/ee/app/livechat-enterprise/server/hooks/onLoadForwardDepartmentRestrictions.js @@ -0,0 +1,17 @@ +import { callbacks } from '../../../../../app/callbacks'; +import { LivechatDepartment } from '../../../../../app/models/server'; + +callbacks.add('livechat.onLoadForwardDepartmentRestrictions', (departmentId) => { + if (!departmentId) { + return {}; + } + const department = LivechatDepartment.findOneById(departmentId, { fields: { departmentsAllowedToForward: 1 } }); + if (!department) { + return {}; + } + const { departmentsAllowedToForward } = department; + if (!departmentsAllowedToForward) { + return {}; + } + return { _id: { $in: departmentsAllowedToForward } }; +}, callbacks.priority.MEDIUM, 'livechat-on-load-forward-department-restrictions'); diff --git a/ee/app/livechat-enterprise/server/hooks/onSaveVisitorInfo.js b/ee/app/livechat-enterprise/server/hooks/onSaveVisitorInfo.js new file mode 100644 index 000000000000..7d8e4accfe68 --- /dev/null +++ b/ee/app/livechat-enterprise/server/hooks/onSaveVisitorInfo.js @@ -0,0 +1,20 @@ +import { callbacks } from '../../../../../app/callbacks'; +import { LivechatEnterprise } from '../lib/LivechatEnterprise'; +import LivechatPriority from '../../../models/server/models/LivechatPriority'; + +callbacks.add('livechat.saveInfo', (room, { user, oldRoom }) => { + if (!room || !user) { + return room; + } + + const { priorityId: oldPriorityId = null } = oldRoom; + const { priorityId: newPriorityId = null } = room; + if (oldPriorityId === newPriorityId) { + return room; + } + + const priority = newPriorityId && LivechatPriority.findOneById(newPriorityId); + LivechatEnterprise.updateRoomPriority(room._id, user, priority); + + return room; +}, callbacks.priority.HIGH, 'livechat-on-save-visitor-info'); diff --git a/ee/app/livechat-enterprise/server/hooks/setPredictedVisitorAbandonmentTime.js b/ee/app/livechat-enterprise/server/hooks/setPredictedVisitorAbandonmentTime.js new file mode 100644 index 000000000000..111e73fbccdf --- /dev/null +++ b/ee/app/livechat-enterprise/server/hooks/setPredictedVisitorAbandonmentTime.js @@ -0,0 +1,26 @@ +import { callbacks } from '../../../../../app/callbacks/server'; +import { settings } from '../../../../../app/settings/server'; +import { setPredictedVisitorAbandonmentTime } from '../lib/Helper'; + +callbacks.add('afterSaveMessage', function(message, room) { + if (!settings.get('Livechat_auto_close_abandoned_rooms') || settings.get('Livechat_visitor_inactivity_timeout') <= 0) { + return message; + } + // skips this callback if the message was edited + if (message.editedAt) { + return false; + } + // message valid only if it is a livechat room + if (!(typeof room.t !== 'undefined' && room.t === 'l' && room.v && room.v.token)) { + return false; + } + // if the message has a type means it is a special message (like the closing comment), so skips + if (message.t) { + return false; + } + const sentByAgent = !message.token; + if (sentByAgent) { + setPredictedVisitorAbandonmentTime(room); + } + return message; +}, callbacks.priority.HIGH, 'save-visitor-inactivity'); diff --git a/ee/app/livechat-enterprise/server/index.js b/ee/app/livechat-enterprise/server/index.js index e532db6f935b..63f36630a18c 100644 --- a/ee/app/livechat-enterprise/server/index.js +++ b/ee/app/livechat-enterprise/server/index.js @@ -1,8 +1,13 @@ import { Meteor } from 'meteor/meteor'; +import '../lib/messageTypes'; import './hooks/addDepartmentAncestors'; import './hooks/afterForwardChatToDepartment'; import './hooks/beforeListTags'; +import './hooks/setPredictedVisitorAbandonmentTime'; +import './hooks/beforeForwardRoomToDepartment'; +import './hooks/afterRemoveDepartment'; +import './hooks/onLoadForwardDepartmentRestrictions'; import './methods/addMonitor'; import './methods/getUnitsFromUserRoles'; import './methods/removeMonitor'; @@ -10,17 +15,23 @@ import './methods/removeTag'; import './methods/saveTag'; import './methods/removeUnit'; import './methods/saveUnit'; +import './methods/savePriority'; +import './methods/removePriority'; import LivechatUnit from '../../models/server/models/LivechatUnit'; import LivechatTag from '../../models/server/models/LivechatTag'; import LivechatUnitMonitors from '../../models/server/models/LivechatUnitMonitors'; import './agentStatus'; import './startup'; import './hooks/afterTakeInquiry'; +import './hooks/beforeNewInquiry'; +import './hooks/beforeNewRoom'; import './hooks/beforeRoutingChat'; import './hooks/checkAgentBeforeTakeInquiry'; +import './hooks/onCheckRoomParamsApi'; import './hooks/onLoadConfigApi'; import './hooks/onSetUserStatusLivechat'; import './hooks/onCloseLivechat'; +import './hooks/onSaveVisitorInfo'; import './lib/routing/LoadBalancing'; import { onLicense } from '../../license/server'; diff --git a/ee/app/livechat-enterprise/server/lib/Helper.js b/ee/app/livechat-enterprise/server/lib/Helper.js index e13dc640baed..072e98ac7d7f 100644 --- a/ee/app/livechat-enterprise/server/lib/Helper.js +++ b/ee/app/livechat-enterprise/server/lib/Helper.js @@ -1,8 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; +import moment from 'moment'; import { hasRole } from '../../../../../app/authorization'; -import { LivechatDepartment, Users, LivechatInquiry } from '../../../../../app/models/server'; +import { LivechatDepartment, Users, LivechatInquiry, LivechatRooms, Messages } from '../../../../../app/models/server'; import { Rooms as RoomRaw } from '../../../../../app/models/server/raw'; import { settings } from '../../../../../app/settings'; import { Livechat } from '../../../../../app/livechat/server/lib/Livechat'; @@ -64,7 +65,7 @@ export const normalizeQueueInfo = async ({ position, queueInfo, department }) => queueInfo = await getQueueInfo(department); } - const { message, numberMostRecentChats, statistics: { avgChatDuration } = { } } = queueInfo; + const { message, numberMostRecentChats, statistics: { avgChatDuration } = {} } = queueInfo; const spot = position + 1; const estimatedWaitTimeSeconds = getSpotEstimatedWaitTime(spot, numberMostRecentChats, avgChatDuration); return { spot, message, estimatedWaitTimeSeconds }; @@ -137,3 +138,81 @@ export const allowAgentSkipQueue = (agent) => { return settings.get('Livechat_assign_new_conversation_to_bot') && hasRole(agent.agentId, 'bot'); }; + +export const setPredictedVisitorAbandonmentTime = (room) => { + if (!room.v || !room.v.lastMessageTs || !settings.get('Livechat_auto_close_abandoned_rooms')) { + return; + } + + let secondsToAdd = settings.get('Livechat_visitor_inactivity_timeout'); + + const department = room.departmentId && LivechatDepartment.findOneById(room.departmentId); + if (department && department.visitorInactivityTimeoutInSeconds) { + secondsToAdd = department.visitorInactivityTimeoutInSeconds; + } + + if (secondsToAdd <= 0) { + return; + } + + const willBeAbandonedAt = moment(room.v.lastMessageTs).add(Number(secondsToAdd), 'seconds').toDate(); + LivechatRooms.setPredictedVisitorAbandonment(room._id, willBeAbandonedAt); +}; + +export const updatePredictedVisitorAbandonment = () => { + if (settings.get('Livechat_auto_close_abandoned_rooms')) { + LivechatRooms.findLivechat({ open: true }).forEach((room) => setPredictedVisitorAbandonmentTime(room)); + } else { + LivechatRooms.unsetPredictedVisitorAbandonment(); + } +}; + +export const updateRoomPriorityHistory = (rid, user, priority) => { + const history = { + priorityData: { + definedBy: user, + priority: priority || {}, + }, + }; + + Messages.createPriorityHistoryWithRoomIdMessageAndUser(rid, '', user, history); +}; + +export const updateInquiryQueuePriority = (roomId, priority) => { + const inquiry = LivechatInquiry.findOneByRoomId(roomId, { fields: { rid: 1, ts: 1 } }); + if (!inquiry) { + return; + } + + let { ts: estimatedServiceTimeAt } = inquiry; + let queueOrder = 1; + let estimatedWaitingTimeQueue = 0; + + if (priority) { + const { dueTimeInMinutes } = priority; + queueOrder = 0; + estimatedWaitingTimeQueue = dueTimeInMinutes; + estimatedServiceTimeAt = new Date(estimatedServiceTimeAt.setMinutes(estimatedServiceTimeAt.getMinutes() + dueTimeInMinutes)); + } + + LivechatInquiry.setEstimatedServiceTimeAt(inquiry.rid, { queueOrder, estimatedWaitingTimeQueue, estimatedServiceTimeAt }); +}; + +export const removePriorityFromRooms = (priorityId) => { + LivechatRooms.findOpenByPriorityId(priorityId).forEach((room) => { + updateInquiryQueuePriority(room._id); + }); + + LivechatRooms.unsetPriorityById(priorityId); +}; + +export const updatePriorityInquiries = (priority) => { + if (!priority) { + return; + } + + const { _id: priorityId } = priority; + LivechatRooms.findOpenByPriorityId(priorityId).forEach((room) => { + updateInquiryQueuePriority(room._id, priority); + }); +}; diff --git a/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.js b/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.js index 7a4cb8bfb6b1..37d7e3739571 100644 --- a/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.js +++ b/ee/app/livechat-enterprise/server/lib/LivechatEnterprise.js @@ -4,7 +4,9 @@ import { Match, check } from 'meteor/check'; import { Users } from '../../../../../app/models'; import LivechatUnit from '../../../models/server/models/LivechatUnit'; import LivechatTag from '../../../models/server/models/LivechatTag'; +import LivechatPriority from '../../../models/server/models/LivechatPriority'; import { addUserRoles, removeUserFromRoles } from '../../../../../app/authorization/server'; +import { removePriorityFromRooms, updateInquiryQueuePriority, updatePriorityInquiries, updateRoomPriorityHistory } from './Helper'; export const LivechatEnterprise = { addMonitor(username) { @@ -113,4 +115,49 @@ export const LivechatEnterprise = { return LivechatTag.createOrUpdateTag(_id, tagData, tagDepartments); }, + + savePriority(_id, priorityData) { + check(_id, Match.Maybe(String)); + + check(priorityData, { + name: String, + description: Match.Optional(String), + dueTimeInMinutes: String, + }); + + const oldPriority = _id && LivechatPriority.findOneById(_id, { fields: { dueTimeInMinutes: 1 } }); + const priority = LivechatPriority.createOrUpdatePriority(_id, priorityData); + if (!oldPriority) { + return priority; + } + + const { dueTimeInMinutes: oldDueTimeInMinutes } = oldPriority; + const { dueTimeInMinutes } = priority; + + if (oldDueTimeInMinutes !== dueTimeInMinutes) { + updatePriorityInquiries(priority); + } + + return priority; + }, + + removePriority(_id) { + check(_id, String); + + const priority = LivechatPriority.findOneById(_id, { fields: { _id: 1 } }); + + if (!priority) { + throw new Meteor.Error('error-invalid-priority', 'Invalid priority', { method: 'livechat:removePriority' }); + } + const removed = LivechatPriority.removeById(_id); + if (removed) { + removePriorityFromRooms(_id); + } + return removed; + }, + + updateRoomPriority(roomId, user, priority) { + updateInquiryQueuePriority(roomId, priority); + updateRoomPriorityHistory(roomId, user, priority); + }, }; diff --git a/ee/app/livechat-enterprise/server/lib/VisitorInactivityMonitor.js b/ee/app/livechat-enterprise/server/lib/VisitorInactivityMonitor.js new file mode 100644 index 000000000000..11879836e182 --- /dev/null +++ b/ee/app/livechat-enterprise/server/lib/VisitorInactivityMonitor.js @@ -0,0 +1,87 @@ +import { SyncedCron } from 'meteor/littledata:synced-cron'; +import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; + +import { settings } from '../../../../../app/settings/server'; +import { LivechatRooms, LivechatDepartment, Users } from '../../../../../app/models/server'; +import { Livechat } from '../../../../../app/livechat/server/lib/Livechat'; + +export class VisitorInactivityMonitor { + constructor() { + this._started = false; + this._name = 'Omnichannel Visitor Inactivity Monitor'; + this.messageCache = new Map(); + this.userToPerformAutomaticClosing; + } + + start() { + this._startMonitoring(); + this._initializeMessageCache(); + this.userToPerformAutomaticClosing = Users.findOneById('rocket.cat'); + } + + _startMonitoring() { + if (this.isRunning()) { + return; + } + const everyMinute = '* * * * *'; + SyncedCron.add({ + name: this._name, + schedule: (parser) => parser.cron(everyMinute), + job: () => { + this.handleAbandonedRooms(); + }, + }); + this._started = true; + } + + stop() { + if (!this.isRunning()) { + return; + } + + SyncedCron.remove(this._name); + + this._started = false; + } + + isRunning() { + return this._started; + } + + _initializeMessageCache() { + this.messageCache.clear(); + this.messageCache.set('default', settings.get('Livechat_abandoned_rooms_closed_custom_message') || TAPi18n.__('Closed_automatically')); + } + + _getDepartmentAbandonedCustomMessage(departmentId) { + if (this.messageCache.has('departmentId')) { + return this.messageCache.get('departmentId'); + } + const department = LivechatDepartment.findOneById(departmentId); + if (!department) { + return; + } + this.messageCache.set(department._id, department.abandonedRoomsCloseCustomMessage); + return department.abandonedRoomsCloseCustomMessage; + } + + closeRooms(room) { + let comment = this.messageCache.get('default'); + if (room.departmentId) { + comment = this._getDepartmentAbandonedCustomMessage(room.departmentId) || comment; + } + Livechat.closeRoom({ + comment, + room, + user: this.userToPerformAutomaticClosing, + }); + } + + handleAbandonedRooms() { + if (!settings.get('Livechat_auto_close_abandoned_rooms')) { + return; + } + LivechatRooms.findAbandonedOpenRooms(new Date()).forEach((room) => this.closeRooms(room)); + this._initializeMessageCache(); + } +} diff --git a/ee/app/livechat-enterprise/server/methods/removePriority.js b/ee/app/livechat-enterprise/server/methods/removePriority.js new file mode 100644 index 000000000000..60ccfa6ec49b --- /dev/null +++ b/ee/app/livechat-enterprise/server/methods/removePriority.js @@ -0,0 +1,14 @@ +import { Meteor } from 'meteor/meteor'; + +import { hasPermission } from '../../../../../app/authorization'; +import { LivechatEnterprise } from '../lib/LivechatEnterprise'; + +Meteor.methods({ + 'livechat:removePriority'(id) { + if (!Meteor.userId() || !hasPermission(Meteor.userId(), 'manage-livechat-priorities')) { + throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'livechat:removePriority' }); + } + + return LivechatEnterprise.removePriority(id); + }, +}); diff --git a/ee/app/livechat-enterprise/server/methods/savePriority.js b/ee/app/livechat-enterprise/server/methods/savePriority.js new file mode 100644 index 000000000000..647b7a5c4771 --- /dev/null +++ b/ee/app/livechat-enterprise/server/methods/savePriority.js @@ -0,0 +1,14 @@ +import { Meteor } from 'meteor/meteor'; + +import { hasPermission } from '../../../../../app/authorization'; +import { LivechatEnterprise } from '../lib/LivechatEnterprise'; + +Meteor.methods({ + 'livechat:savePriority'(_id, priorityData) { + if (!Meteor.userId() || !hasPermission(Meteor.userId(), 'manage-livechat-priorities')) { + throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'livechat:savePriority' }); + } + + return LivechatEnterprise.savePriority(_id, priorityData); + }, +}); diff --git a/ee/app/livechat-enterprise/server/permissions.js b/ee/app/livechat-enterprise/server/permissions.js index 79f6b16c7657..c0a0e802842d 100644 --- a/ee/app/livechat-enterprise/server/permissions.js +++ b/ee/app/livechat-enterprise/server/permissions.js @@ -42,4 +42,5 @@ export const createPermissions = () => { Permissions.createOrUpdate('manage-livechat-units', [adminRole, livechatManagerRole]); Permissions.createOrUpdate('manage-livechat-monitors', [adminRole, livechatManagerRole]); Permissions.createOrUpdate('manage-livechat-tags', [adminRole, livechatManagerRole]); + Permissions.createOrUpdate('manage-livechat-priorities', [adminRole, livechatManagerRole]); }; diff --git a/ee/app/livechat-enterprise/server/settings.js b/ee/app/livechat-enterprise/server/settings.js index 4ad2147cb830..8d91cb92f6c2 100644 --- a/ee/app/livechat-enterprise/server/settings.js +++ b/ee/app/livechat-enterprise/server/settings.js @@ -36,5 +36,20 @@ export const createSettings = () => { enableQuery: { _id: 'Livechat_waiting_queue', value: true }, }); + settings.add('Livechat_auto_close_abandoned_rooms', false, { + type: 'boolean', + group: 'Omnichannel', + section: 'Sessions', + i18nLabel: 'Enable_omnichannel_auto_close_abandoned_rooms', + }); + + settings.add('Livechat_abandoned_rooms_closed_custom_message', '', { + type: 'string', + group: 'Omnichannel', + section: 'Sessions', + i18nLabel: 'Livechat_abandoned_rooms_closed_custom_message', + enableQuery: { _id: 'Livechat_auto_close_abandoned_rooms', value: true }, + }); + Settings.addOptionValueById('Livechat_Routing_Method', { key: 'Load_Balancing', i18nLabel: 'Load_Balancing' }); }; diff --git a/ee/app/livechat-enterprise/server/startup.js b/ee/app/livechat-enterprise/server/startup.js index 3016268255ab..91d956ad449c 100644 --- a/ee/app/livechat-enterprise/server/startup.js +++ b/ee/app/livechat-enterprise/server/startup.js @@ -1,11 +1,24 @@ import { Meteor } from 'meteor/meteor'; import { settings } from '../../../../app/settings'; -import { checkWaitingQueue } from './lib/Helper'; +import { checkWaitingQueue, updatePredictedVisitorAbandonment } from './lib/Helper'; +import { VisitorInactivityMonitor } from './lib/VisitorInactivityMonitor'; import './lib/query.helper'; +const visitorActivityMonitor = new VisitorInactivityMonitor(); + Meteor.startup(function() { settings.onload('Livechat_maximum_chats_per_agent', function(/* key, value */) { checkWaitingQueue(); }); + settings.onload('Livechat_auto_close_abandoned_rooms', function(_, value) { + updatePredictedVisitorAbandonment(); + if (!value) { + return visitorActivityMonitor.stop(); + } + visitorActivityMonitor.start(); + }); + settings.onload('Livechat_visitor_inactivity_timeout', function() { + updatePredictedVisitorAbandonment(); + }); }); diff --git a/ee/app/models/server/index.js b/ee/app/models/server/index.js index 4be2f7ddf118..30d5dd386edc 100644 --- a/ee/app/models/server/index.js +++ b/ee/app/models/server/index.js @@ -1,12 +1,16 @@ import CannedResponse from './models/CannedResponse'; +import LivechatPriority from './models/LivechatPriority'; import LivechatTag from './models/LivechatTag'; import LivechatUnit from './models/LivechatUnit'; import LivechatUnitMonitors from './models/LivechatUnitMonitors'; import CannedResponseRaw from './raw/CannedResponse'; +import LivechatPriorityRaw from './raw/LivechatPriority'; import LivechatTagRaw from './raw/LivechatTag'; import LivechatUnitMonitorsRaw from './raw/LivechatUnitMonitors'; import './models/LivechatDepartment'; import './models/LivechatRooms'; +import './models/LivechatInquiry'; +import './models/Messages'; import './raw/LivechatDepartment'; import './raw/LivechatRooms'; @@ -18,4 +22,6 @@ export { CannedResponseRaw, LivechatTagRaw, LivechatUnitMonitorsRaw, + LivechatPriority, + LivechatPriorityRaw, }; diff --git a/ee/app/models/server/models/LivechatDepartment.js b/ee/app/models/server/models/LivechatDepartment.js index d54c0db5d65f..2e4785282d91 100644 --- a/ee/app/models/server/models/LivechatDepartment.js +++ b/ee/app/models/server/models/LivechatDepartment.js @@ -32,6 +32,9 @@ overwriteClassOnLicense('livechat-enterprise', LivechatDepartment, { if (args.length > 2 && !args[1].type) { args[1].type = 'd'; } + if (args[1] && args[1].departmentsAllowedToForward) { + args[1].departmentsAllowedToForward = args[1].departmentsAllowedToForward.split(','); + } return originalFn.apply(this, args); }, @@ -49,4 +52,8 @@ overwriteClassOnLicense('livechat-enterprise', LivechatDepartment, { }, }); +LivechatDepartment.prototype.removeDepartmentFromForwardListById = function(_id) { + return this.update({ departmentsAllowedToForward: _id }, { $pull: { departmentsAllowedToForward: _id } }, { multi: true }); +}; + export default LivechatDepartment; diff --git a/ee/app/models/server/models/LivechatInquiry.js b/ee/app/models/server/models/LivechatInquiry.js new file mode 100644 index 000000000000..0d10ec63e0f4 --- /dev/null +++ b/ee/app/models/server/models/LivechatInquiry.js @@ -0,0 +1,18 @@ +import { LivechatInquiry } from '../../../../../app/models/server/models/LivechatInquiry'; + +LivechatInquiry.prototype.setEstimatedServiceTimeAt = function(rid, data = {}) { + const { queueOrder, estimatedWaitingTimeQueue, estimatedServiceTimeAt } = data; + + return this.update( + { rid }, + { + $set: { + queueOrder, + estimatedServiceTimeAt, + estimatedWaitingTimeQueue, + }, + }, + ); +}; + +export default LivechatInquiry; diff --git a/ee/app/models/server/models/LivechatPriority.js b/ee/app/models/server/models/LivechatPriority.js new file mode 100644 index 000000000000..d789b625976a --- /dev/null +++ b/ee/app/models/server/models/LivechatPriority.js @@ -0,0 +1,58 @@ +import { Base } from '../../../../../app/models'; + +/** + * Livechat Priority model + */ +export class LivechatPriority extends Base { + constructor() { + super('livechat_priority'); + + this.tryEnsureIndex({ name: 1 }, { unique: true }); + this.tryEnsureIndex({ dueTimeInMinutes: 1 }, { unique: true }); + } + + // FIND + findOneById(_id, options) { + const query = { _id }; + + return this.findOne(query, options); + } + + findOneByIdOrName(_idOrName, options) { + const query = { + $or: [{ + _id: _idOrName, + }, { + name: _idOrName, + }], + }; + + return this.findOne(query, options); + } + + createOrUpdatePriority(_id, { name, description, color, dueTimeInMinutes }) { + const record = { + name, + description, + color, + dueTimeInMinutes: parseInt(dueTimeInMinutes), + }; + + if (_id) { + this.update({ _id }, { $set: record }); + } else { + _id = this.insert(record); + } + + return Object.assign(record, { _id }); + } + + // REMOVE + removeById(_id) { + const query = { _id }; + + return this.remove(query); + } +} + +export default new LivechatPriority(); diff --git a/ee/app/models/server/models/LivechatRooms.js b/ee/app/models/server/models/LivechatRooms.js index 8fa684baf4b6..2dc41df46cbd 100644 --- a/ee/app/models/server/models/LivechatRooms.js +++ b/ee/app/models/server/models/LivechatRooms.js @@ -23,4 +23,60 @@ overwriteClassOnLicense('livechat-enterprise', LivechatRooms, { }, }); + +LivechatRooms.prototype.setPredictedVisitorAbandonment = function(roomId, willBeAbandonedAt) { + const query = { + _id: roomId, + }; + const update = { + $set: { + 'omnichannel.predictedVisitorAbandonmentAt': willBeAbandonedAt, + }, + }; + + return this.update(query, update); +}; + +LivechatRooms.prototype.findAbandonedOpenRooms = function(date) { + return this.find({ + 'omnichannel.predictedVisitorAbandonmentAt': { $lte: date }, + waitingResponse: { $exists: false }, + closedAt: { $exists: false }, + open: true, + }); +}; + +LivechatRooms.prototype.unsetPredictedVisitorAbandonment = function() { + return this.update({ + open: true, + t: 'l', + }, { + $unset: { 'omnichannel.predictedVisitorAbandonmentAt': 1 }, + }, { + multi: true, + }); +}; + +LivechatRooms.prototype.unsetPriorityById = function(priorityId) { + return this.update({ + open: true, + t: 'l', + priorityId, + }, { + $unset: { priorityId: 1 }, + }, { + multi: true, + }); +}; + +LivechatRooms.prototype.findOpenByPriorityId = function(priorityId, options) { + const query = { + t: 'l', + open: true, + priorityId, + }; + + return this.find(query, options); +}; + export default LivechatRooms; diff --git a/ee/app/models/server/models/Messages.js b/ee/app/models/server/models/Messages.js new file mode 100644 index 000000000000..7b07385963e2 --- /dev/null +++ b/ee/app/models/server/models/Messages.js @@ -0,0 +1,27 @@ +import { Messages } from '../../../../../app/models/server/models/Messages'; +import { settings } from '../../../../../app/settings/server'; + +Messages.prototype.createPriorityHistoryWithRoomIdMessageAndUser = function(roomId, message, user, extraData) { + const type = 'livechat_priority_history'; + const record = { + t: type, + rid: roomId, + ts: new Date(), + msg: message, + u: { + _id: user._id, + username: user.username, + }, + groupable: false, + }; + + if (settings.get('Message_Read_Receipt_Enabled')) { + record.unread = true; + } + Object.assign(record, extraData); + + record._id = this.insertOrUpsert(record); + return record; +}; + +export default Messages; diff --git a/ee/app/models/server/raw/LivechatPriority.js b/ee/app/models/server/raw/LivechatPriority.js new file mode 100644 index 000000000000..681667158985 --- /dev/null +++ b/ee/app/models/server/raw/LivechatPriority.js @@ -0,0 +1,18 @@ +import { BaseRaw } from '../../../../../app/models/server/raw/BaseRaw'; +import LivechatPriority from '../models/LivechatPriority'; + +export class LivechatPriorityRaw extends BaseRaw { + findOneByIdOrName(_idOrName, options) { + const query = { + $or: [{ + _id: _idOrName, + }, { + name: _idOrName, + }], + }; + + return this.findOne(query, options); + } +} + +export default new LivechatPriorityRaw(LivechatPriority.model.rawCollection()); diff --git a/ee/client/index.js b/ee/client/index.js index 1d7f22417589..d82fb5667c70 100644 --- a/ee/client/index.js +++ b/ee/client/index.js @@ -1,4 +1,5 @@ import '../app/auditing/client/index'; +import '../app/authorization/client/index'; import '../app/canned-responses/client/index'; import '../app/engagement-dashboard/client/index'; import '../app/license/client/index'; diff --git a/ee/i18n/af.i18n.json b/ee/i18n/af.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/af.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/ar.i18n.json b/ee/i18n/ar.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/ar.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/az.i18n.json b/ee/i18n/az.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/az.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/bas-CM.i18n.json b/ee/i18n/bas-CM.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/bas-CM.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/be-BY.i18n.json b/ee/i18n/be-BY.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/be-BY.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/bg.i18n.json b/ee/i18n/bg.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/bg.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/bs.i18n.json b/ee/i18n/bs.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/bs.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/ca.i18n.json b/ee/i18n/ca.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/ca.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/cs.i18n.json b/ee/i18n/cs.i18n.json new file mode 100644 index 000000000000..d28ffdf997c9 --- /dev/null +++ b/ee/i18n/cs.i18n.json @@ -0,0 +1,62 @@ +{ + "error-canned-response-not-found": "Zakonzervovaná odpověď nenalezena", + "error-max-number-simultaneous-chats-reached": "Byl dosažen maximální počet souběžných konverzací na operátora.", + "Add_monitor": "Přidat vedoucího", + "Available_departments": "Dostupná oddělení", + "Canned Responses": "Zakonzervované odpovědi", + "Canned_Response_Removed": "Zakonzervované odpovědi odstraněny", + "Canned_Responses_Enable": "Povolit zakonzervované odpovědi", + "Edit_Tag": "Upravit štítek", + "Edit_Unit": "Upravit skupinu", + "Enterprise_License": "Enterprise licence", + "Enterprise_License_Description": "Pokud je vaše prostředí registrováno a máte od Rocket.Chat licenci není potřeba ji zde ručně doplňovat", + "Failed_to_add_monitor": "Nepodařilo se přidat vedoucího", + "Invalid Canned Response": "Nevalidní zakonzervovaná odpověď", + "Invalid_Department": "Neplatné oddělení", + "LDAP_Default_Role_To_User": "Výchozí role pro uživatele", + "LDAP_Default_Role_To_User_Description": "Výchozí role přidaná uživateli v případě že LDAP role není namapovaná", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "Povolit mapování rolí z LDAP do Rocket.Chat", + "LDAP_Query_To_Get_User_Groups": "LDAP query pro získání uživatelských skupin", + "LDAP_Query_To_Get_User_Groups_Description": "LDAP query pro získání skupin do kterých patří uživatel.", + "LDAP_Roles_To_Rocket_Chat_Roles": "Mapování rolí z LDAP do Rocket.Chat", + "LDAP_Roles_To_Rocket_Chat_Roles_Description": "Mapování rolí v objektovém formátu, kde klíč je LDAP role a hodnota pole Rocket.Chat rolí. Například { 'ldapRole': ['rcRole', 'anotherRCRole'] }", + "LDAP_Validate_Roles_For_Each_Login": "Validovat mapování pro každé přihlášení", + "LDAP_Validate_Roles_For_Each_Login_Description": "Zda má validace probíhat při každém přihlášení (Opatrně, taková akce přepíše uživatelské role při každém přihlášení. V opačném případě je validováno jen při vytvoření uživatele", + "Livechat_Monitors": "Vedoucí", + "Livechat_monitors": "Livechat vedoucí", + "Max_number_of_chats_per_agent": "Max. počet souběžných konverzací", + "Max_number_of_chats_per_agent_description": "Kolik konverzací s uživateli může operátor souběžně odbavovat", + "Me": "Já", + "Message_auditing": "Audit zpráv", + "Message_auditing_log": "Log auditu zpráv", + "Monitor_removed": "Vedoucí odstraněn", + "Monitors": "Vedoucí", + "New_Canned_Response": "Nová zakonzervovaná odpověď", + "New_Tag": "Nový štítek", + "New_Unit": "Nová skupina", + "No_Canned_Responses": "Žádné zakonzervované odpovědi", + "Number_of_most_recent_chats_estimate_wait_time": "Počet nedávných konverzací k výpočtu odhadu času čekání", + "Number_of_most_recent_chats_estimate_wait_time_description": "K výpočtu času ve frontě se použije několik nedávných zpracovaných konverzací.", + "Others": "Ostatní", + "Please_select_visibility": "Prosím vyberte viditelnost", + "Role_Mapping": "Mapování rolí", + "Selected_departments": "Vybraná odddělení", + "Selected_monitors": "Vybraní vedoucí", + "Shortcut": "Zkratka", + "Tag_removed": "Štítek odstraněn", + "The_selected_user_is_not_a_monitor": "Vybraný uživatel není vedoucí", + "There_are_no_available_monitors": "Nejsou dostupní vedoucí", + "There_are_no_departments_added_to_this_tag_yet": "Pod tento štítek zatím nespadají žádná oddělení", + "There_are_no_departments_added_to_this_unit_yet": "V této skupině zatím nejsou žádná oddělení", + "There_are_no_departments_available": "Žádná oddělení nejsou dostupná", + "There_are_no_monitors_added_to_this_unit_yet": "V této skupině zatím nejsou žádní vedoucí", + "This_monitor_was_already_selected": "Vedoucí už byl vybrán", + "Unit_removed": "Skupina odstraněna", + "Use_this_response": "Použít tuto odpověď", + "view-canned-responses": "Zobrazit zakonzervované odpovědi", + "view-livechat-monitor": "Zobrazit Livechat vedoucí", + "view-livechat-unit": "Zobrazit Livechat skupiny", + "Waiting_queue": "Čekací fronta", + "Waiting_queue_message": "Zpráva v čekací frontě", + "Waiting_queue_message_description": "Informace která se návštěvníkům zobrazí pokud čekají ve frontě" +} \ No newline at end of file diff --git a/ee/i18n/cy.i18n.json b/ee/i18n/cy.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/cy.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/da.i18n.json b/ee/i18n/da.i18n.json new file mode 100644 index 000000000000..6feb27469916 --- /dev/null +++ b/ee/i18n/da.i18n.json @@ -0,0 +1,62 @@ +{ + "error-canned-response-not-found": "Der blev ikke fundet et opbevaret svar", + "error-max-number-simultaneous-chats-reached": "Det maksimale tilladte antal af samtidige chats pr agent er nået", + "Add_monitor": "Tilføj monitor", + "Available_departments": "Tilgængelige afdelinger", + "Canned Responses": "Opbevarede svar", + "Canned_Response_Removed": "Opbevaret svar blev fjernet", + "Canned_Responses_Enable": "Aktivér opbevarede svar", + "Edit_Tag": "Redigér mærke", + "Edit_Unit": "Redigér enhed", + "Enterprise_License": "Koncernlicens", + "Enterprise_License_Description": "Hvis dit arbejdsområde er registreret og en licens er tildelt af Rocket.Chat Cloud behøver du ikke manuelt at opdatere licensen her", + "Failed_to_add_monitor": "Fejl ved tilføjelse af monitor", + "Invalid Canned Response": "Ikke gyldigt opbevaret svar", + "Invalid_Department": "Ugyldig afdeling", + "LDAP_Default_Role_To_User": "Standardrolle for bruger", + "LDAP_Default_Role_To_User_Description": "Standard RC-rolle der skal tildeles en bruger, hvis brugeren har en LDAP-rolle der ikke er knyttet til noget", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "Aktivér rolletilknytning fra LDAP til Rocket.Chat", + "LDAP_Query_To_Get_User_Groups": "LDAP-forespørgsel for at hente brugergrupper", + "LDAP_Query_To_Get_User_Groups_Description": "LDAP-forespørgsel for at hente de LDAP-grupper, som brugeren er en del af.", + "LDAP_Roles_To_Rocket_Chat_Roles": "Rolletilknytning fra LDAP til Rocket.Chat.", + "LDAP_Roles_To_Rocket_Chat_Roles_Description": "Rolletilknytning i objektformat hvor objektnøglen skal være LDAP-rollen og objektværdien skal være en array af RC-roller. Eksempel: { 'ldapRole': ['rcRole', 'anotherRCRole'] }", + "LDAP_Validate_Roles_For_Each_Login": "Validér tilknytning for hvert login", + "LDAP_Validate_Roles_For_Each_Login_Description": "Hvis validering skal ske for hvert login (Vær forsigtig med denne indstilling, fordi den vil overskrive brugerrollerne i hvert login. Ellers valideres dette kun på det tidspunkt hvor brugeren oprettes).", + "Livechat_Monitors": "Monitore", + "Livechat_monitors": "Livechat-monitore", + "Max_number_of_chats_per_agent": "Max antal samtidige chats", + "Max_number_of_chats_per_agent_description": "Det maksimale tilladte antal af samtidige chats pr agent er nået", + "Me": "Mig", + "Message_auditing": "Meddelelsesovervågning", + "Message_auditing_log": "Log for meddelelsesovervågning", + "Monitor_removed": "Monitor fjernet", + "Monitors": "Monitore", + "New_Canned_Response": "Nyt opbevaret svar", + "New_Tag": "Nyt mærke", + "New_Unit": "Ny enhed", + "No_Canned_Responses": "Ingen opbevarede svar", + "Number_of_most_recent_chats_estimate_wait_time": "Antal seneste chats til beregning af estimeret ventetid", + "Number_of_most_recent_chats_estimate_wait_time_description": "Dette antal definerer antallet af sidst anvendte værelser, der vil blive brugt til at beregne kø-ventetider.", + "Others": "Andre", + "Please_select_visibility": "Vælg en synlighed", + "Role_Mapping": "Rolletilknytning", + "Selected_departments": "Valgte afdelinger", + "Selected_monitors": "Valgte monitore", + "Shortcut": "Genvejstast", + "Tag_removed": "Mærke fjernet", + "The_selected_user_is_not_a_monitor": "Den valgte bruger er ikke en monitor", + "There_are_no_available_monitors": "Der er ingen tilgængelige monitore", + "There_are_no_departments_added_to_this_tag_yet": "Der er endnu ikke tilføjet nogen afdelinger til dette mærke", + "There_are_no_departments_added_to_this_unit_yet": "Der er endnu ingen afdelinger tilføjet til denne enhed", + "There_are_no_departments_available": "Der er ingen tilgængelige afdelinger", + "There_are_no_monitors_added_to_this_unit_yet": "Der er endnu ikke tilføjet nogle monitore til denne enhed", + "This_monitor_was_already_selected": "Denne monitor var allerede valgt", + "Unit_removed": "Enhed fjernet", + "Use_this_response": "Brug dette svar", + "view-canned-responses": "Se opbevarede svar", + "view-livechat-monitor": "Se livechat-monitore", + "view-livechat-unit": "Se livechat-enheder", + "Waiting_queue": "Ventende kø", + "Waiting_queue_message": "Meddelelse for ventende kø", + "Waiting_queue_message_description": "Meddelelse der vises for de besøgende, når de kommer i kø" +} \ No newline at end of file diff --git a/ee/i18n/de-AT.i18n.json b/ee/i18n/de-AT.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/de-AT.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/de.i18n.json b/ee/i18n/de.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/de.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/el.i18n.json b/ee/i18n/el.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/el.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/en.i18n.json b/ee/i18n/en.i18n.json index 612242b05523..09f587ee2297 100644 --- a/ee/i18n/en.i18n.json +++ b/ee/i18n/en.i18n.json @@ -1,15 +1,24 @@ { "error-canned-response-not-found": "Canned Response Not Found", + "error-forwarding-department-target-not-allowed": "The forwarding to the target department is not allowed.", + "error-guests-cant-have-other-roles": "Guest users can't have any other role.", + "error-invalid-priority": "Invalid priority", + "error-max-guests-number-reached": "You reached the maximum number of guest users allowed by your license. Contact sale@rocket.chat for a new license.", "error-max-number-simultaneous-chats-reached": "The maximum number of simultaneous chats per agent has been reached.", "Add_monitor": "Add monitor", "Available_departments": "Available Departments", "Canned Responses": "Canned Responses", "Canned_Response_Removed": "Canned Response Removed", "Canned_Responses_Enable": "Enable Canned Responses", + "Closed_automatically": "Closed automatically by the system", "Edit_Tag": "Edit Tag", "Edit_Unit": "Edit Unit", + "Edit_Priority": "Edit Priority", + "Enable_omnichannel_auto_close_abandoned_rooms": "Enable automatic closing of rooms abandoned by the visitor", + "Enter_a_custom_message": "Enter a custom message", "Enterprise_License": "Enterprise License", "Enterprise_License_Description": "If your workspace is registered and license is provided by Rocket.Chat Cloud you don't need to manually update the license here.", + "Estimated_due_time": "Estimated due time (time in minutes)", "Failed_to_add_monitor": "Failed to add monitor", "Invalid Canned Response": "Invalid Canned Response", "Invalid_Department": "Invalid Department", @@ -22,6 +31,9 @@ "LDAP_Roles_To_Rocket_Chat_Roles_Description": "Role mapping in object format where the object key must be the LDAP role and the object value must be an array of RC roles. Example: { 'ldapRole': ['rcRole', 'anotherRCRole'] }", "LDAP_Validate_Roles_For_Each_Login": "Validate mapping for each login", "LDAP_Validate_Roles_For_Each_Login_Description": "If the validation should occurs for each login (Be careful with this setting because it will overwrite the user roles in each login, otherwise this will be validated only at the moment of user creation).", + "List_of_departments_for_forward": "List of departments allowed for forwarding (Optional)", + "List_of_departments_for_forward_description": "Allow to set a restricted list of departments that can receive chats from this department", + "Livechat_abandoned_rooms_closed_custom_message": "Custom message when room is automatically closed by visitor inactivity", "Livechat_Monitors": "Monitors", "Livechat_monitors": "Livechat monitors", "Max_number_of_chats_per_agent": "Max. number of simultaneous chats", @@ -32,13 +44,19 @@ "Monitor_removed": "Monitor removed", "Monitors": "Monitors", "New_Canned_Response": "New Canned Response", + "New_chat_priority": "Priority Changed: __user__ changed the priority to __priority__", "New_Tag": "New Tag", "New_Unit": "New Unit", + "New_Priority": "New Priority", "No_Canned_Responses": "No Canned Responses", + "Number_in_seconds": "Number in seconds", "Number_of_most_recent_chats_estimate_wait_time": "Number of recent chats to calculate estimate wait time", "Number_of_most_recent_chats_estimate_wait_time_description": "This number defines the number of last served rooms that will be used to calculate queue wait times.", "Others": "Others", "Please_select_visibility": "Please select a visibility", + "Priorities": "Priorities", + "Priority": "Priority", + "Priority_removed": "Priority removed", "Role_Mapping": "Role mapping", "Selected_departments": "Selected Departments", "Selected_monitors": "Selected Monitors", @@ -58,5 +76,6 @@ "view-livechat-unit": "View Livechat Units", "Waiting_queue": "Waiting queue", "Waiting_queue_message": "Waiting queue message", - "Waiting_queue_message_description": "Message that will be displayed to the visitors when they get in the queue" -} + "Waiting_queue_message_description": "Message that will be displayed to the visitors when they get in the queue", + "Without_priority": "Without priority" +} \ No newline at end of file diff --git a/ee/i18n/eo.i18n.json b/ee/i18n/eo.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/eo.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/es.i18n.json b/ee/i18n/es.i18n.json new file mode 100644 index 000000000000..87425d640ea5 --- /dev/null +++ b/ee/i18n/es.i18n.json @@ -0,0 +1,67 @@ +{ + "error-canned-response-not-found": "Modelo de respuesta no encontrado", + "error-max-number-simultaneous-chats-reached": "Se ha alcanzado el máximo de chats simultáneos por agente.", + "Add_monitor": "Añadir monitor", + "Available_departments": "Departamentos disponibles", + "Canned Responses": "Modelos de respuesta", + "Canned_Response_Removed": "Modelo de respuesta eliminado", + "Canned_Responses_Enable": "Habilitar modelos de respuesta", + "Closed_automatically": "Cerrado automáticamente por el sistema", + "Edit_Tag": "Editar etiqueta", + "Edit_Unit": "Editar unidad", + "Enable_omnichannel_auto_close_abandoned_rooms": "Habilitar cerrar automáticamente las salas abandonados por el visitante", + "Enter_a_custom_message": "Introduzca un mensaje personalizado", + "Enterprise_License": "Licencia de empresa", + "Enterprise_License_Description": "Si tu espacio de trabajo está registrado y dispone de una licencia proporcionada por Rocket.Chat Cloud no es necesario actualizar esta licencia.", + "Failed_to_add_monitor": "Error al añadir monitor", + "Invalid Canned Response": "Modelo de respuesta incorrecto", + "Invalid_Department": "Departamento incorrecto", + "LDAP_Default_Role_To_User": "Rol de usuario por defecto", + "LDAP_Default_Role_To_User_Description": "Rol RC por defecto a aplicar al usuario si el usuario tiene algún rol de LDAP que no está mapeado.", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "Habilitar mapeo de roles de LDAP a Rocket.Chat", + "LDAP_Query_To_Get_User_Groups": "Consulta LDAP para recuperar grupos de usuarios", + "LDAP_Query_To_Get_User_Groups_Description": "Consulta LDAP para recuperar los grupos a los que pertenece el usuario.", + "LDAP_Roles_To_Rocket_Chat_Roles": "Mapeo de roles de LDAP a Rocket.Chat.", + "LDAP_Roles_To_Rocket_Chat_Roles_Description": "Mapeo de rol en formato de objeto donde la clave del objeto debe ser el rol LDAP y el valor debe ser un array de roles RC. Por ejemplo: { 'ldapRole': ['rcRole', 'anotherRCRole'] }", + "LDAP_Validate_Roles_For_Each_Login": "Validar el mapeo en cada login", + "LDAP_Validate_Roles_For_Each_Login_Description": "Si la validación debe realizarse en cada login (Ten cuidado con esta configuración porque se sobrescribirán los roles del usuario en cada login, de otro modo estos serán validados en el momento de la creación del usuario).", + "Livechat_abandoned_rooms_closed_custom_message": "Mensaje personalizado cuando se cierra la sala por inactividad del visitante", + "Livechat_Monitors": "Monitores", + "Livechat_monitors": "Monitores de Livechat", + "Max_number_of_chats_per_agent": "Número máximo de chats simultáneos", + "Max_number_of_chats_per_agent_description": "El número máximo de chats simultáneos que los agentes pueden atender", + "Me": "Yo", + "Message_auditing": "Auditoría de mensajes", + "Message_auditing_log": "Registro de auditoría de mensajes", + "Monitor_removed": "Monitor eliminado", + "Monitors": "Monitores", + "New_Canned_Response": "Nuevo modelo de respuesta", + "New_Tag": "Nueva etiqueta", + "New_Unit": "Nueva unidad", + "No_Canned_Responses": "No existen modelos de respuesta", + "Number_in_seconds": "Valor en segundos", + "Number_of_most_recent_chats_estimate_wait_time": "Número de chats recientes para calcular el tiempo de espera estimado", + "Number_of_most_recent_chats_estimate_wait_time_description": "Este valor define el número de las últimas salas reservadas que serán utilizadas para calcular los tiempos de espera en cola. ", + "Others": "Otros", + "Please_select_visibility": "Por favor, seleccione una visibilidad", + "Role_Mapping": "Mapeo de roles", + "Selected_departments": "Departamentos seleccionados", + "Selected_monitors": "Monitores seleccionados", + "Shortcut": "Atajo", + "Tag_removed": "Etiqueta eliminada", + "The_selected_user_is_not_a_monitor": "El usuario seleccionado no es un monitor", + "There_are_no_available_monitors": "No hay monitores disponibles", + "There_are_no_departments_added_to_this_tag_yet": "Todavía no hay departamentos añadidos a esta etiqueta", + "There_are_no_departments_added_to_this_unit_yet": "Todavía no hay departamentos añadidos a esta unidad", + "There_are_no_departments_available": "No hay departamentos disponibles", + "There_are_no_monitors_added_to_this_unit_yet": "Todavía no hay monitores añadidos a esta unidad", + "This_monitor_was_already_selected": "Este monitor ya fue seleccionado", + "Unit_removed": "Unidad eliminada", + "Use_this_response": "Usar esta respuesta", + "view-canned-responses": "Ver modelos de respuesta", + "view-livechat-monitor": "Ver los monitores de Livechat", + "view-livechat-unit": "Ver las unidades de Livechat", + "Waiting_queue": "Cola de espera", + "Waiting_queue_message": "Mensaje de la cola de espera", + "Waiting_queue_message_description": "Mensaje que se mostrará a los visitantes cuando entren en la cola" +} \ No newline at end of file diff --git a/ee/i18n/et.i18n.json b/ee/i18n/et.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/et.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/eu.i18n.json b/ee/i18n/eu.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/eu.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/fa.i18n.json b/ee/i18n/fa.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/fa.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/fi.i18n.json b/ee/i18n/fi.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/fi.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/fr.i18n.json b/ee/i18n/fr.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/fr.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/he.i18n.json b/ee/i18n/he.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/he.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/hi-IN.i18n.json b/ee/i18n/hi-IN.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/hi-IN.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/hr.i18n.json b/ee/i18n/hr.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/hr.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/hu.i18n.json b/ee/i18n/hu.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/hu.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/id.i18n.json b/ee/i18n/id.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/id.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/it.i18n.json b/ee/i18n/it.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/it.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/ja.i18n.json b/ee/i18n/ja.i18n.json new file mode 100644 index 000000000000..b1a53a11f45c --- /dev/null +++ b/ee/i18n/ja.i18n.json @@ -0,0 +1,62 @@ +{ + "error-canned-response-not-found": "返信定型文が見つかりません", + "error-max-number-simultaneous-chats-reached": "エージェントごとの同時チャットの最大数に達しました。", + "Add_monitor": "モニターを追加", + "Available_departments": "利用可能な部門", + "Canned Responses": "返信定型文", + "Canned_Response_Removed": "削除された定型文", + "Canned_Responses_Enable": "返信定型文を有効にする", + "Edit_Tag": "タグを編集", + "Edit_Unit": "ユニットを編集", + "Enterprise_License": "エンタープライズライセンス", + "Enterprise_License_Description": "ワークスペースが登録されており、ライセンスがRocket.Chat Cloudによって提供されている場合は、ここでライセンスを手動で更新する必要はありません。", + "Failed_to_add_monitor": "モニターを追加できませんでした", + "Invalid Canned Response": "無効な返信定型文", + "Invalid_Department": "部門が無効です", + "LDAP_Default_Role_To_User": "ユーザーへのデフォルトの役割", + "LDAP_Default_Role_To_User_Description": "ユーザーにマッピングされていないLDAPロールがある場合にユーザーに適用されるデフォルトのRCロール。", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "LDAPからRocket.Chatへのロールマッピングを有効にする", + "LDAP_Query_To_Get_User_Groups": "ユーザーグループを取得するためのLDAPクエリ", + "LDAP_Query_To_Get_User_Groups_Description": "ユーザーが属するLDAPグループを取得するためのLDAPクエリ。", + "LDAP_Roles_To_Rocket_Chat_Roles": "LDAPからRocket.Chatへのロールマッピング。", + "LDAP_Roles_To_Rocket_Chat_Roles_Description": "オブジェクトキーがLDAPロールであり、オブジェクト値がRCロールの配列である必要があるオブジェクト形式のロールマッピング。例:{ 'ldapRole': ['rcRole', 'anotherRCRole'] }", + "LDAP_Validate_Roles_For_Each_Login": "各ログインのマッピングを検証する", + "LDAP_Validate_Roles_For_Each_Login_Description": "各ログインで検証を行う必要がある場合(この設定は各ログインでユーザーロールを上書きするため、注意してください。そうでない場合、ユーザーの作成時にのみ検証されます)。", + "Livechat_Monitors": "モニター", + "Livechat_monitors": "Livechatモニター", + "Max_number_of_chats_per_agent": "最大同時チャットの数", + "Max_number_of_chats_per_agent_description": "エージェントが参加できる同時チャットの最大数", + "Me": "私", + "Message_auditing": "メッセージ監査", + "Message_auditing_log": "メッセージ監査ログ", + "Monitor_removed": "モニターを取り外しました", + "Monitors": "モニター", + "New_Canned_Response": "新しい返信定型文", + "New_Tag": "新しいタグ", + "New_Unit": "新しいユニット", + "No_Canned_Responses": "返信定型なし", + "Number_of_most_recent_chats_estimate_wait_time": "推定待ち時間を計算するための最近のチャットの数", + "Number_of_most_recent_chats_estimate_wait_time_description": "この数は、キュー待機時間の計算に使用される最後に提供された部屋の数を定義します。", + "Others": "その他", + "Please_select_visibility": "可視性を選択してください", + "Role_Mapping": "ロールマッピング", + "Selected_departments": "選択された部門", + "Selected_monitors": "選択されたモニター", + "Shortcut": "ショートカット", + "Tag_removed": "タグを削除しました", + "The_selected_user_is_not_a_monitor": "選択したユーザーはモニターではありません", + "There_are_no_available_monitors": "利用可能なモニターはありません", + "There_are_no_departments_added_to_this_tag_yet": "このタグに追加された部門はまだありません", + "There_are_no_departments_added_to_this_unit_yet": "このユニットに追加された部門はまだありません", + "There_are_no_departments_available": "利用可能な部門はありません", + "There_are_no_monitors_added_to_this_unit_yet": "このユニットに追加されたモニターはまだありません", + "This_monitor_was_already_selected": "このモニターは既に選択されています", + "Unit_removed": "ユニットが削除されました", + "Use_this_response": "この応答を使用", + "view-canned-responses": "返信定型文を表示", + "view-livechat-monitor": "Livechatモニターを表示", + "view-livechat-unit": "Livechatユニットを表示", + "Waiting_queue": "待ち行列", + "Waiting_queue_message": "待機キューメッセージ", + "Waiting_queue_message_description": "訪問者がキューに入ったときに表示されるメッセージ" +} \ No newline at end of file diff --git a/ee/i18n/ka-GE.i18n.json b/ee/i18n/ka-GE.i18n.json new file mode 100644 index 000000000000..fc263faa6993 --- /dev/null +++ b/ee/i18n/ka-GE.i18n.json @@ -0,0 +1,49 @@ +{ + "error-canned-response-not-found": "დაკონსერვებული პასუხი ვერ მოიძებნა", + "error-max-number-simultaneous-chats-reached": "ერთ აგენტიზე ერთდროული ჩატების მაქსიმალური რაოდენობა ამოწურულია.", + "Add_monitor": "მონიტორის დამატება", + "Available_departments": "ხელმისაწვდომი დეპარტამენტები", + "Canned Responses": "დაკონსერვებული პასუხები", + "Canned_Response_Removed": "დაკონსერვებული პასუხი ამოღებულია", + "Canned_Responses_Enable": "დაკონსერვებული პასუხების ჩართვა", + "Edit_Tag": "ტეგის რედაქტირება", + "Edit_Unit": "იუნიტის რედაქტირება", + "Enterprise_License": "საწარმოოს ლიცენზია", + "Enterprise_License_Description": "თუ თქვენი სამუშაო ადგილი რეგისტრირებულია და ლიცენზია აქვს Rocket.Chat Cloud– ს, აქ ლიცენზიის ხელით განახლება არ დაგჭირდებათ.", + "Failed_to_add_monitor": "მონიტორის დამატება ვერ მოხერხდა", + "Invalid Canned Response": "არასწორი დაკონსერვებული პასუხი", + "Invalid_Department": "არასწორი დეპარტამენტი", + "LDAP_Default_Role_To_User": "ნაგულისხმევი როლი მომხმარებლისთვის", + "LDAP_Default_Role_To_User_Description": "RC– ის ნაგულისხმევი როლი უნდა იქნას გამოყენებული მომხმარებლისთვის, თუ მომხმარებელს აქვს LDAP– ის გარკვეული როლი, რომელიც არ არის მიბმული.", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "ჩართეთ როლის მიბმა LDAP- დან Rocket.Chat-ში", + "LDAP_Query_To_Get_User_Groups": "LDAP მოთხოვნა, რომ მიიღოთ მომხმარებელთა ჯგუფები", + "LDAP_Query_To_Get_User_Groups_Description": "LDAP მოთხოვნა მიიღოთ LDAP ჯგუფები, რომელთა წევრიც არის მომხმარებელი.", + "LDAP_Roles_To_Rocket_Chat_Roles": "როლის მიბმა LDAP- დან Rocket.Chat- მდე.", + "LDAP_Roles_To_Rocket_Chat_Roles_Description": "როლის მობმა ობიექტის ფორმატში, სადაც ობიექტის გასაღები უნდა იყოს LDAP როლი და ობიექტის მნიშვნელობა უნდა იყოს RC როლების მასივი. მაგალითი: { 'ldapRole': ['rcRole', 'anotherRCRole'] }", + "LDAP_Validate_Roles_For_Each_Login": "მიბმის დადასტურება თითოეული შესვლისთვის", + "LDAP_Validate_Roles_For_Each_Login_Description": "თუ დადასტურება უნდა მოხდეს თითოეული შესვლისთვის (ფრთხილად იყავით ამ პარამეტრთან, რადგან ის გადაწერს მომხმარებლის როლებს ყოველი შესვლისას, წინააღმდეგ შემთხვევაში, ეს შემოწმდება მხოლოდ მომხმარებლის შექმნის მომენტში).", + "Livechat_Monitors": "მონიტორები", + "Livechat_monitors": "Livechat-ის მონიტორები", + "Max_number_of_chats_per_agent": "მაქსიმ. ერთდროული ჩეთები", + "Max_number_of_chats_per_agent_description": "მაქსიმუმი. ერთდროული ჩეთების რაოდენობა, რომელთაც აგენტები შეძლებენ დაესწრონ", + "Me": "მე", + "Message_auditing": "შეტყობინებების აუდიტი", + "Message_auditing_log": "შეტყობინებების აუდიტის ჟურნალი", + "Monitor_removed": "მონიტორი წაიშალა", + "Monitors": "მონიტორები", + "New_Canned_Response": "ახალი დაკონსერვებული პასუხი", + "New_Tag": "ახალი ტეგი", + "New_Unit": "ახალი იუნიტი", + "No_Canned_Responses": "დაკონსერვებული პასუხები არ არის", + "Number_of_most_recent_chats_estimate_wait_time": "ბოლოდროინდელი ჩეტების რაოდენობა, ლოდინის სავარაუდო დროის გამოსათვლელად", + "Number_of_most_recent_chats_estimate_wait_time_description": "ეს ნომერი განსაზღვრავს ბოლო მომსახურებული ოთახების რაოდენობას, რომლებიც გამოყენებული იქნება რიგების ლოდინის დროების გამოსათვლელად.", + "Others": "სხვები", + "Please_select_visibility": "გთხოვთ აირჩიოთ ხილვადობა", + "Role_Mapping": "როლის რუქა", + "Selected_departments": "არჩეული დეპარტამენტები", + "Selected_monitors": "არჩეული მონიტორები", + "Shortcut": "მალსახმობი", + "Tag_removed": "ტეგი ამოღებულია", + "The_selected_user_is_not_a_monitor": "არჩეული მომხმარებელი არ არის მონიტორი", + "There_are_no_available_monitors": "არ არის ხელმისაწვდომი მონიტორები" +} \ No newline at end of file diff --git a/ee/i18n/km.i18n.json b/ee/i18n/km.i18n.json new file mode 100644 index 000000000000..c657863beb44 --- /dev/null +++ b/ee/i18n/km.i18n.json @@ -0,0 +1,35 @@ +{ + "error-canned-response-not-found": "ការឆ្លើយតបដែលបានថតទុកមិនត្រូវបានរកឃើញទេ", + "error-max-number-simultaneous-chats-reached": "ចំនួនអតិបរមានៃការជជែកដំណាលគ្នាក្នុងមួយភ្នាក់ងារត្រូវបានឈានដល់។", + "Add_monitor": "បន្ថែមម៉ូនីទ័រ", + "Available_departments": "ផ្នែកដែលមាន", + "Canned Responses": "ការឆ្លើយតបដែលបានថតទុកមិនត្រូវបានរកឃើញទេ", + "Canned_Response_Removed": "ការឆ្លើយតបដែលបានថតទុកមិនត្រូវបានរកឃើញទេ", + "Canned_Responses_Enable": "បើកការឆ្លើយតបដែលអាចប្រើបាន", + "Edit_Tag": "កែសម្រួលស្លាក", + "Edit_Unit": "កែ​សម្រួល", + "Enterprise_License": "អាជ្ញាប័ណ្ណសហគ្រាស", + "Enterprise_License_Description": "ប្រសិនបើកន្លែងធ្វើការរបស់អ្នកត្រូវបានចុះឈ្មោះហើយអាជ្ញាប័ណ្ណត្រូវបានផ្តល់ដោយ Rocket.Chat Cloud អ្នកមិនចាំបាច់ធ្វើបច្ចុប្បន្នភាពអាជ្ញាប័ណ្ណដោយដៃនៅទីនេះទេ។", + "Failed_to_add_monitor": "បានបរាជ័យក្នុងការបន្ថែមម៉ូនីទ័រ", + "Invalid Canned Response": "ការឆ្លើយតបមិនត្រឹមត្រូវ", + "Invalid_Department": "នាយកដ្ឋានមិនត្រឹមត្រូវ", + "LDAP_Default_Role_To_User": "តួនាទីលំនាំដើមសម្រាប់អ្នកប្រើប្រាស់", + "LDAP_Default_Role_To_User_Description": "តួនាទី RC លំនាំដើមដែលត្រូវអនុវត្តចំពោះអ្នកប្រើប្រាស់ប្រសិនបើអ្នកប្រើប្រាស់មានតួនាទី LDAP មួយចំនួនដែលមិនត្រូវបានគូស។", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "បើកដំណើរការគូសផែនទីពី LDAP ទៅ Rocket.Chat", + "LDAP_Query_To_Get_User_Groups": "សំណួរ LDAP ដើម្បីទទួលបានក្រុមអ្នកប្រើប្រាស់", + "LDAP_Query_To_Get_User_Groups_Description": "សំណួរអិលឌីភីដើម្បីទទួលបានក្រុមអិល។ ឌី។ ភី។ ដែលអ្នកប្រើជាសមាជិក។", + "LDAP_Roles_To_Rocket_Chat_Roles": "ការគូសផែនទីពីតួនាទីពីអិល។ ឌី។ អេ។ ទៅរ៉ក់ឌឺ។", + "LDAP_Roles_To_Rocket_Chat_Roles_Description": "ការគូសផែនទីតួនាទីជាទ្រង់ទ្រាយវត្ថុដែលកូនសោវត្ថុត្រូវតែជាតួនាទីរបស់ LDAP ហើយតម្លៃវត្ថុត្រូវតែជាតួនាទីរបស់ RC ។ ឧទាហរណ៍ៈ { 'ldapRole': ['rcRole', 'anotherRCRole'] }", + "LDAP_Validate_Roles_For_Each_Login": "ធ្វើឱ្យផែនទីមានសុពលភាពសម្រាប់ការចូលនីមួយៗ", + "LDAP_Validate_Roles_For_Each_Login_Description": "ប្រសិនបើសុពលភាពគួរតែកើតឡើងសម្រាប់រាល់ការចូល (សូមប្រយ័ត្នជាមួយការកំណត់នេះព្រោះវានឹងសរសេរជាន់តួនាទីអ្នកប្រើក្នុងការចូលនីមួយៗបើមិនដូច្នេះទេវានឹងមានសុពលភាពតែនៅពេលបង្កើតអ្នកប្រើ) ។", + "Livechat_Monitors": "អ្នកត្រួតពិនិត្យ", + "Livechat_monitors": "ម៉ូនីទ័រ Livechat", + "Max_number_of_chats_per_agent": "អតិបរមា។ ចំនួននៃការជជែកក្នុងពេលដំណាលគ្នា", + "Max_number_of_chats_per_agent_description": "អតិបរមា។ ចំនួននៃការជជែកក្នុងពេលដំណាលគ្នាដែលភ្នាក់ងារអាចចូលរួម", + "Me": "ខ្ញុំ", + "Message_auditing": "សវនកម្មសារ", + "Message_auditing_log": "កំណត់ហេតុសវនកម្មសារ", + "Monitor_removed": "បានលុបម៉ូនីទ័រចេញ", + "Monitors": "អ្នកត្រួតពិនិត្យ", + "New_Canned_Response": "ការឆ្លើយតបថ្មី" +} \ No newline at end of file diff --git a/ee/i18n/ko.i18n.json b/ee/i18n/ko.i18n.json new file mode 100644 index 000000000000..c83117ddf0d3 --- /dev/null +++ b/ee/i18n/ko.i18n.json @@ -0,0 +1,9 @@ +{ + "error-canned-response-not-found": "미리 준비된 답변을 찾을 수 없음", + "Canned Responses": "미리 준비된 답변", + "Canned_Response_Removed": "미리 준비된 답변 제거", + "Edit_Tag": "태그 편집", + "Enterprise_License": "기업 라이센스", + "New_Tag": "새 태그", + "Shortcut": "바로가기" +} \ No newline at end of file diff --git a/ee/i18n/ku.i18n.json b/ee/i18n/ku.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/ku.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/lo.i18n.json b/ee/i18n/lo.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/lo.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/lt.i18n.json b/ee/i18n/lt.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/lt.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/lv.i18n.json b/ee/i18n/lv.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/lv.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/mn.i18n.json b/ee/i18n/mn.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/mn.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/ms-MY.i18n.json b/ee/i18n/ms-MY.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/ms-MY.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/nl.i18n.json b/ee/i18n/nl.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/nl.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/no.i18n.json b/ee/i18n/no.i18n.json new file mode 100644 index 000000000000..cffa2f497451 --- /dev/null +++ b/ee/i18n/no.i18n.json @@ -0,0 +1,35 @@ +{ + "error-max-number-simultaneous-chats-reached": "Det maksimale antallet samtidige chatter per agent er nådd.", + "Available_departments": "Tilgjengelige avdelinger", + "Edit_Tag": "Endre tagg", + "Edit_Unit": "Endre enhet", + "Enterprise_License": "Enterpriselisens", + "Enterprise_License_Description": "Hvis arbeidsområdet ditt er registrert og lisensen er levert av Rocket.Chat Cloud trenger du ikke å oppdatere lisensen manuelt her.", + "Invalid_Department": "Ugyldig avdeling", + "LDAP_Default_Role_To_User": "Standardrolle for bruker", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "Aktivér rolletilknytning gjennom LDAP til Rocket.Chat", + "LDAP_Query_To_Get_User_Groups": "LDAP-spørring for å få brukergrupper", + "LDAP_Query_To_Get_User_Groups_Description": "LDAP-spørring for å få LDAP-gruppene en bruker er med i.", + "LDAP_Roles_To_Rocket_Chat_Roles": "Kobling for roller fra LDAP til Rocket.Chat.", + "Max_number_of_chats_per_agent": "Maks antall samtidige chatter", + "Max_number_of_chats_per_agent_description": "Maks antall samtidige chatter en agent kan delta i", + "Me": "Meg", + "New_Tag": "Ny tagg", + "New_Unit": "Ny enhet", + "Number_of_most_recent_chats_estimate_wait_time": "Antall nylige chatter for å beregne estimert ventetid", + "Number_of_most_recent_chats_estimate_wait_time_description": "Dette tallet definerer antall sist betjente rom som skal brukes til å beregne ventetid for kø.", + "Others": "Andre", + "Please_select_visibility": "Vennligst velg an synlighet", + "Role_Mapping": "Rollekobling", + "Selected_departments": "Valgte avdelinger", + "Shortcut": "Snarvei", + "Tag_removed": "Tagg fjernet", + "There_are_no_departments_added_to_this_tag_yet": "Ingen enheter er lagt til denne taggen enda", + "There_are_no_departments_added_to_this_unit_yet": "Ingen avdelinger er lagt til denne enheten enda", + "There_are_no_departments_available": "Det er ingen tilgjengelige avdelinger", + "Unit_removed": "Enhet fjernet", + "Use_this_response": "Bruk dette svaret", + "Waiting_queue": "Kø", + "Waiting_queue_message": "Melding for kø", + "Waiting_queue_message_description": "Melding som vises til besøkende når de er i kø" +} \ No newline at end of file diff --git a/ee/i18n/pl.i18n.json b/ee/i18n/pl.i18n.json new file mode 100644 index 000000000000..0eae394e3ced --- /dev/null +++ b/ee/i18n/pl.i18n.json @@ -0,0 +1,52 @@ +{ + "Add_monitor": "Dodaj monitor", + "Available_departments": "Dostępne oddziały", + "Closed_automatically": "Automatycznie zamknięte przez system", + "Edit_Tag": "Edycja tagu", + "Edit_Unit": "Edycja jednostki", + "Enable_omnichannel_auto_close_abandoned_rooms": "Włączenie automatycznego zamykania pomieszczeń opuszczonych przez odwiedzającego", + "Enter_a_custom_message": "Wprowadź niestandardowy komunikat", + "Enterprise_License": "Licencja Enterprise", + "Enterprise_License_Description": "Jeśli Twoja przestrzeń robocza jest zarejestrowana i licencja jest dostarczana przez Rocket.Chat Cloud, nie musisz ręcznie aktualizować licencji tutaj.", + "Failed_to_add_monitor": "Nieudane dodanie monitora", + "Invalid_Department": "Błędny oddział", + "LDAP_Default_Role_To_User": "Domyślna rola dla użytkownika", + "LDAP_Default_Role_To_User_Description": "Zostanie użyta domyślna rola RC jeżeli użytkownik ma jakąś rolę LDAP która nie jest zamapowana.", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "Włącz mapowanie ról z LDAP do Rocket.Chat", + "LDAP_Query_To_Get_User_Groups": "Zapytanie LDAP do pobrania grup użytkownika", + "LDAP_Query_To_Get_User_Groups_Description": "Zapytanie LDAP do pobrania grup w których uczestniczy użytkownik", + "LDAP_Roles_To_Rocket_Chat_Roles": "Mapowanie ról z LDAP do Rocket.Chat", + "LDAP_Validate_Roles_For_Each_Login": "Zweryfikuj mapowanie przy każdym logowaniu", + "Livechat_abandoned_rooms_closed_custom_message": "Niestandardowy komunikat, gdy pokój jest automatycznie zamykany przez brak aktywności odwiedzającego", + "Livechat_Monitors": "Monitory", + "Livechat_monitors": "Monitory Livechat", + "Max_number_of_chats_per_agent": "Maksymalna liczba jednoczesnych rozmów", + "Max_number_of_chats_per_agent_description": "Maksymalna liczba jednoczestnych rozmów w których mogą uczestniczyć agenci", + "Me": "Ja", + "Message_auditing": "Audyt wiadomości", + "Message_auditing_log": "Log audytu wiadomości", + "Monitor_removed": "Monitor usunięty", + "Monitors": "Monitory", + "New_Tag": "Nowy znacznik", + "New_Unit": "Nowa jednostka", + "Others": "Inni", + "Please_select_visibility": "Proszę wybrać widoczność", + "Role_Mapping": "Mapowanie ról", + "Selected_departments": "Wybrane oddziały", + "Selected_monitors": "Wybrane monitory", + "Shortcut": "Skrót", + "Tag_removed": "Tag usunięty", + "The_selected_user_is_not_a_monitor": "Wybrany użytkownik nie jest monitorem", + "There_are_no_available_monitors": "Nie ma dostepnych monitorów", + "There_are_no_departments_added_to_this_tag_yet": "Nie ma jeszcze oddziałów przypisanych do tego tagu", + "There_are_no_departments_added_to_this_unit_yet": "Nie ma jeszcze oddziałów przypisanych do dej jednostki", + "There_are_no_departments_available": "Nie ma dostępnych oddziałów", + "There_are_no_monitors_added_to_this_unit_yet": "Nie ma monitorów dodanych do tej jednostki", + "This_monitor_was_already_selected": "Ten monitor został już wybrany", + "Unit_removed": "Jednostka usunięta", + "Use_this_response": "Użyj tej odpowiedzi", + "view-livechat-monitor": "Zobacz monitory Livechat", + "view-livechat-unit": "Zobacz jednostki Livechat", + "Waiting_queue": "Kolejka oczekujących", + "Waiting_queue_message": "Kolejka oczekujących wiadomości" +} \ No newline at end of file diff --git a/ee/i18n/pt-BR.i18n.json b/ee/i18n/pt-BR.i18n.json index 6f1b8d857c7e..74b62af4ea61 100644 --- a/ee/i18n/pt-BR.i18n.json +++ b/ee/i18n/pt-BR.i18n.json @@ -2,10 +2,18 @@ "error-max-number-simultaneous-chats-reached": "O número máximo de bate-papos simultâneos por agente foi atingido.", "Add_monitor": "Adicionar Monitor", "Available_departments": "Departamentos disponíveis", + "Closed_automatically": "Fechado automaticamente pelo sistema", "Edit_Tag": "Editar Tag", "Edit_Unit": "Editar Unidade", + "Edit_Priority": "Editar Prioridade", + "Enable_omnichannel_auto_close_abandoned_rooms": "Habilitar o fechamento automático de salas abandonadas pelo visitante", + "Enter_a_custom_message": "Digite uma mensagem customizada", "Enterprise_License": "Licença Enterprise", "Enterprise_License_Description": "Se você registrou seu workspace e a licença foi fornecida pelo Rocket.Chat Cloud você não precisa atualizar a licença manualmente aqui.", + "error-forwarding-department-target-not-allowed": "O encaminhamento para o departamento selecionado não é permitido.", + "error-invalid-priority": "Prioridade inválida", + "Estimated_due_time": "Tempo estimado(tempo em minutos)", + "Invalid_Department": "Departamento inválido", "LDAP_Default_Role_To_User": "Papel padrão para o usuário", "LDAP_Default_Role_To_User_Description": "Papel padrão par ser aplicado ao usuário, caso ele tenha algum papel do LDAP que não esteja mapeado.", "LDAP_Enable_LDAP_Roles_To_RC_Roles": "Habilitar o mapeamento de papéis do LDAP para o Rocket.Chat", @@ -15,6 +23,9 @@ "LDAP_Roles_To_Rocket_Chat_Roles_Description": "Mapeamento dos papéis que deve ser em formato de objeto onde a chave do objeto precisa ser o nome do papel LDAP e o valor deve ser um array de papéis Rocket.Chat. Exemplo: { 'ldapRole': ['rcRole', 'anotherRCRole'] }", "LDAP_Validate_Roles_For_Each_Login": "Validar o mapeamento em cada login", "LDAP_Validate_Roles_For_Each_Login_Description": " Se a validação deve ser feita a cada login(Tenha cuidado com essa configuração, pois ela vai sobrescrever os papéis de usuário a cada login, caso esteja desabilitado, a validação será feita apenas no momento da criação do usuário).", + "List_of_departments_for_forward": "Lista de departamentos permitidos para o encaminhamento(Opcional).", + "List_of_departments_for_forward_description": "Permite definir uma lista restrita de departamentos que podem receber conversas desse departamento.", + "Livechat_abandoned_rooms_closed_custom_message": "Mensagem customizada para usar quando a sala for automaticamente fechada por abandono do visitante", "Livechat_Monitors": "Monitores", "Livechat_monitors": "Monitores de Livechat", "Max_number_of_chats_per_agent": "Número máximo de atendimentos simultâneos", @@ -23,12 +34,18 @@ "Message_auditing_log": "Log de auditoria", "Monitor_removed": "Monitor removido", "Monitors": "Monitores", + "New_chat_priority": "Prioridade da sala alterada: __user__ alterou a prioridade para __priority__", "New_Tag": "Nova Tag", "New_Unit": "Nova Unidade", + "New_Priority": "Nova Prioridade", + "Number_in_seconds": "Number in seconds", "Number_of_most_recent_chats_estimate_wait_time": "Número de chats recentes para cálculo de tempo na fila", "Number_of_most_recent_chats_estimate_wait_time_description": "Este numero define a quantidade de últimas salas atendidas que serão usadas para calculo de estimativa de tempo de espera da fila.", "Others": "Outros", "Please_select_visibility": "Por favor selecione o tipo de visibilidade", + "Priorities": "Prioridades", + "Priority": "Prioridade", + "Priority_removed": "Prioridade removida", "Role_Mapping": "Mapeamento de papéis", "Selected_departments": "Departamentos selecionados", "Selected_monitors": "Monitores selecionados", @@ -42,9 +59,11 @@ "There_are_no_monitors_added_to_this_unit_yet": "Ainda não há monitores adicionado nesta unidade", "This_monitor_was_already_selected": "Este monitor já foi selecionado", "Unit_removed": "Unidade Removida", + "Use_this_response": "Use esta resposta", "view-livechat-monitor": "Visualizar Monitores de Livechat", "view-livechat-unit": "Visualizar Unidades de Livechat", "Waiting_queue": "Fila de espera", "Waiting_queue_message": "Mensagem de fila de espera", - "Waiting_queue_message_description": "Mensagem que será exibida aos visitantes quando eles entrarem na fila de espera" -} + "Waiting_queue_message_description": "Mensagem que será exibida aos visitantes quando eles entrarem na fila de espera", + "Without_priority": "Sem prioridade" +} \ No newline at end of file diff --git a/ee/i18n/pt.i18n.json b/ee/i18n/pt.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/pt.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/ro.i18n.json b/ee/i18n/ro.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/ro.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/ru.i18n.json b/ee/i18n/ru.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/ru.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/sk-SK.i18n.json b/ee/i18n/sk-SK.i18n.json new file mode 100644 index 000000000000..e688f630793e --- /dev/null +++ b/ee/i18n/sk-SK.i18n.json @@ -0,0 +1,12 @@ +{ + "error-canned-response-not-found": "Zakonzervovaná odpoveď sa nenašla", + "error-max-number-simultaneous-chats-reached": "Bol dosiahnutý maximálny počet súbežných konverzácií na operátora.", + "Add_monitor": "Pridať vedúceho", + "Available_departments": "Dostupné oddelenia", + "Canned Responses": "Zakonzervované odpovede", + "Canned_Response_Removed": "Zakonzervované odpovede odstránené", + "Canned_Responses_Enable": "Povoliť zakonzervované odpovede", + "Edit_Tag": "Upraviť štítok", + "Edit_Unit": "Upraviť skupinu", + "Enterprise_License": "Enterprise licencia" +} \ No newline at end of file diff --git a/ee/i18n/sl-SI.i18n.json b/ee/i18n/sl-SI.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/sl-SI.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/sq.i18n.json b/ee/i18n/sq.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/sq.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/sr.i18n.json b/ee/i18n/sr.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/sr.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/sv.i18n.json b/ee/i18n/sv.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/sv.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/ta-IN.i18n.json b/ee/i18n/ta-IN.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/ta-IN.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/th-TH.i18n.json b/ee/i18n/th-TH.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/th-TH.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/tr.i18n.json b/ee/i18n/tr.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/tr.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/ug.i18n.json b/ee/i18n/ug.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/ug.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/uk.i18n.json b/ee/i18n/uk.i18n.json new file mode 100644 index 000000000000..116fcac6e6d0 --- /dev/null +++ b/ee/i18n/uk.i18n.json @@ -0,0 +1,4 @@ +{ + "error-max-number-simultaneous-chats-reached": "Досягнуто максимальної кількості одночасних чатів на одного представника.", + "New_Tag": "Новий тег" +} \ No newline at end of file diff --git a/ee/i18n/vi-VN.i18n.json b/ee/i18n/vi-VN.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/vi-VN.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/zh-HK.i18n.json b/ee/i18n/zh-HK.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/zh-HK.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/i18n/zh-TW.i18n.json b/ee/i18n/zh-TW.i18n.json new file mode 100644 index 000000000000..735bb240b6d5 --- /dev/null +++ b/ee/i18n/zh-TW.i18n.json @@ -0,0 +1,67 @@ +{ + "error-canned-response-not-found": "找不到罐頭訊息", + "error-max-number-simultaneous-chats-reached": "已達到每個代理的最大同時聊天數。", + "Add_monitor": "新增監控", + "Available_departments": "可用的部門", + "Canned Responses": "罐頭訊息", + "Canned_Response_Removed": "罐頭訊息已刪除", + "Canned_Responses_Enable": "啟用罐頭訊息", + "Closed_automatically": "系統自動關閉", + "Edit_Tag": "編輯標籤", + "Edit_Unit": "編輯單位", + "Enable_omnichannel_auto_close_abandoned_rooms": "啟用自動關閉來處理訪客遺棄的房間", + "Enter_a_custom_message": "輸入自訂訊息", + "Enterprise_License": "企業授權", + "Enterprise_License_Description": "如果您的工作區已註冊,並且授權是由Rocket.Chat Cloud提供的,則無需在此處手動更新授權。", + "Failed_to_add_monitor": "新增監控失敗", + "Invalid Canned Response": "無效的罐頭訊息", + "Invalid_Department": "無效的部門", + "LDAP_Default_Role_To_User": "給使用者的預設角色", + "LDAP_Default_Role_To_User_Description": "如果使用者具有某些未對應的 LDAP 身份,則將套用於使用者的預設 RC 身份。", + "LDAP_Enable_LDAP_Roles_To_RC_Roles": "啟用從 LDAP 到 Rocket.Chat 的對應身份", + "LDAP_Query_To_Get_User_Groups": "LDAP 查詢以取得使用者群組", + "LDAP_Query_To_Get_User_Groups_Description": "LDAP 查詢以取得使用者所屬的 LDAP 群組。", + "LDAP_Roles_To_Rocket_Chat_Roles": "從 LDAP 到 Rocket.Chat 的對應身份。", + "LDAP_Roles_To_Rocket_Chat_Roles_Description": "對象格式的對應身份,其中對象鍵必須是 LDAP 身份,並且對象值必須是 RC 身份群組。例如:{ 'ldapRole': ['rcRole', 'anotherRCRole'] }", + "LDAP_Validate_Roles_For_Each_Login": "驗證每個登入名的對應", + "LDAP_Validate_Roles_For_Each_Login_Description": "如果每次登入都要進行驗證(請謹慎使用此設定,因為它將覆寫每次登入中的使用者身份,否則僅在建立使用者時進行驗證)。", + "Livechat_abandoned_rooms_closed_custom_message": "當訪客不動作時自動關閉房間的自訂訊息", + "Livechat_Monitors": "監控", + "Livechat_monitors": "即時聊天監控", + "Max_number_of_chats_per_agent": "最大同時聊天數", + "Max_number_of_chats_per_agent_description": "最大代理可以參加的同時聊天數", + "Me": "我", + "Message_auditing": "訊息稽核", + "Message_auditing_log": "訊息稽核日誌", + "Monitor_removed": "監控已移除", + "Monitors": "監控", + "New_Canned_Response": "新的罐頭訊息", + "New_Tag": "新的標籤", + "New_Unit": "新的單位", + "No_Canned_Responses": "沒有罐頭訊息", + "Number_in_seconds": "秒數", + "Number_of_most_recent_chats_estimate_wait_time": "最近聊天的次數以計算預估的等待時間", + "Number_of_most_recent_chats_estimate_wait_time_description": "此數字定義將用於計算隊列等待時間的最後服務房間數。", + "Others": "其他", + "Please_select_visibility": "請選擇可視度", + "Role_Mapping": "對應身份", + "Selected_departments": "已選擇的部門", + "Selected_monitors": "已選擇的監控", + "Shortcut": "捷徑", + "Tag_removed": "標籤已刪除", + "The_selected_user_is_not_a_monitor": "已選擇的使用者不是監控者", + "There_are_no_available_monitors": "沒有可用的監控者", + "There_are_no_departments_added_to_this_tag_yet": "尚未將此標籤增加到任何部門", + "There_are_no_departments_added_to_this_unit_yet": "尚未將此部門增加到任何單位", + "There_are_no_departments_available": "沒有可用的部門", + "There_are_no_monitors_added_to_this_unit_yet": "尚未將監控增加到這個單位", + "This_monitor_was_already_selected": "這個監控已選取", + "Unit_removed": "單位已刪除", + "Use_this_response": "使用這個回應", + "view-canned-responses": "查看罐頭訊息", + "view-livechat-monitor": "檢視即時聊天監控", + "view-livechat-unit": "檢視即時聊天單位", + "Waiting_queue": "等待佇列", + "Waiting_queue_message": "等待佇列訊息", + "Waiting_queue_message_description": "訪客進入佇列時將顯示給他們的訊息" +} \ No newline at end of file diff --git a/ee/i18n/zh.i18n.json b/ee/i18n/zh.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/ee/i18n/zh.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/ee/server/index.js b/ee/server/index.js index 00359f17b200..0658aa609a40 100644 --- a/ee/server/index.js +++ b/ee/server/index.js @@ -1,6 +1,7 @@ import '../app/models'; import '../app/api-enterprise/server/index'; import '../app/auditing/server/index'; +import '../app/authorization/server/index'; import '../app/canned-responses/server/index'; import '../app/engagement-dashboard/server/index'; import '../app/ldap-enterprise/server/index'; diff --git a/package-lock.json b/package-lock.json index b8e5000e0022..b7cbefa15a7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "Rocket.Chat", - "version": "3.1.0-develop", + "version": "3.2.0-develop", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -19,6 +19,50 @@ "requires": { "lodash": "^4.17.4", "mongodb": "^2.2.22" + }, + "dependencies": { + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "mongodb": { + "version": "2.2.36", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.36.tgz", + "integrity": "sha512-P2SBLQ8Z0PVx71ngoXwo12+FiSfbNfGOClAao03/bant5DgLNkOPAck5IaJcEk4gKlQhDEURzfR3xuBG1/B+IA==", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.20", + "readable-stream": "2.2.7" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "@accounts/server": { @@ -1164,6 +1208,24 @@ "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" } }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + } + } + }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", @@ -1283,6 +1345,23 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + } + } + }, "@babel/plugin-transform-arrow-functions": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", @@ -2849,9 +2928,9 @@ } }, "@rocket.chat/apps-engine": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.13.0.tgz", - "integrity": "sha512-gU72qk3xhk5UYGmgsp4VLnOOYeAcsc4O8K2rYiLfs1EpBA1tNY+/YtR6Crl5usdU7sRSHUq4Y86pAchepT6aJQ==", + "version": "1.14.0-beta.3119", + "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.14.0-beta.3119.tgz", + "integrity": "sha512-SoQicHOGkQD6wwcnMzc1qETbNoMwQ2ei5j5krzh0/dachCbHG+C1rBO8yYbK2TQwuSjxR0wLM20ZbM57iHaYKw==", "requires": { "adm-zip": "^0.4.9", "cryptiles": "^4.1.3", @@ -6124,6 +6203,15 @@ "@types/node": "*" } }, + "@types/bson": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.2.tgz", + "integrity": "sha512-+uWmsejEHfmSjyyM/LkrP0orfE2m5Mx9Xel4tXNeqi1ldK5XMQcDsFkBmLDtuyKUbxj2jGDo0H240fbCRJZo7Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/caseless": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", @@ -6257,6 +6345,16 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==" }, + "@types/mongodb": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.5.8.tgz", + "integrity": "sha512-2yOociZaXyiJ9CvGp/svjtlMCIPdl82XIRVmx35ehuWA046bipLwwcXfwVyvTYIU98yWYK5p44knCVQ+ZS4Bdw==", + "dev": true, + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, "@types/node": { "version": "9.6.40", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.40.tgz", @@ -6797,16 +6895,8 @@ "integrity": "sha1-WYc/Nej89sc2HBAjkmHXbhU0i7I=" }, "adm-zip": { - "version": "github:RocketChat/adm-zip#34ac787ce7f45c6cea99df049deb17d0c476a3b5", - "from": "github:RocketChat/adm-zip" - }, - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "requires": { - "es6-promisify": "^5.0.0" - } + "version": "0.4.12", + "resolved": "github:RocketChat/adm-zip#34ac787ce7f45c6cea99df049deb17d0c476a3b5" }, "aggregate-error": { "version": "3.0.1", @@ -7051,6 +7141,33 @@ "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", "dev": true }, + "apn": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/apn/-/apn-2.2.0.tgz", + "integrity": "sha512-YIypYzPVJA9wzNBLKZ/mq2l1IZX/2FadPvwmSv4ZeR0VH7xdNITQ6Pucgh0Uw6ZZKC+XwheaJ57DFZAhJ0FvPg==", + "requires": { + "debug": "^3.1.0", + "http2": "https://github.com/node-apn/node-http2/archive/apn-2.1.4.tar.gz", + "jsonwebtoken": "^8.1.0", + "node-forge": "^0.7.1", + "verror": "^1.10.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "app-root-dir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", @@ -12861,6 +12978,11 @@ "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", "dev": true }, + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -16132,15 +16254,6 @@ "ms": "^2.1.1" } }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "requires": { - "agent-base": "5", - "debug": "4" - } - }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -16968,6 +17081,31 @@ "semver": "^5.5.0" }, "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -16976,6 +17114,11 @@ "pseudomap": "^1.0.2", "yallist": "^2.1.2" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -17636,6 +17779,10 @@ "sshpk": "^1.7.0" } }, + "http2": { + "version": "https://github.com/node-apn/node-http2/archive/apn-2.1.4.tar.gz", + "integrity": "sha512-ad4u4I88X9AcUgxCRW3RLnbh7xHWQ1f5HbrXa7gEy2x4Xgq+rq+auGx5I+nUDE2YYuqteGIlbxrwQXkIaYTfnQ==" + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -17643,26 +17790,31 @@ "dev": true }, "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "5", + "debug": "4" }, "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "^2.1.1" } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -20651,6 +20803,12 @@ "readable-stream": "^2.0.1" } }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "mensch": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.3.tgz", @@ -22063,38 +22221,40 @@ "ms": "^2.1.1" } }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=", + "dev": true + }, + "mongodb": { + "version": "2.2.36", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.36.tgz", + "integrity": "sha512-P2SBLQ8Z0PVx71ngoXwo12+FiSfbNfGOClAao03/bant5DgLNkOPAck5IaJcEk4gKlQhDEURzfR3xuBG1/B+IA==", + "dev": true, + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.20", + "readable-stream": "2.2.7" + } + }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true - } - } - }, - "mongodb": { - "version": "2.2.36", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.36.tgz", - "integrity": "sha512-P2SBLQ8Z0PVx71ngoXwo12+FiSfbNfGOClAao03/bant5DgLNkOPAck5IaJcEk4gKlQhDEURzfR3xuBG1/B+IA==", - "requires": { - "es6-promise": "3.2.1", - "mongodb-core": "2.1.20", - "readable-stream": "2.2.7" - }, - "dependencies": { - "es6-promise": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", - "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true }, "readable-stream": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "dev": true, "requires": { "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", @@ -22109,12 +22269,42 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } } } }, + "mongodb": { + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.6.tgz", + "integrity": "sha512-sh3q3GLDLT4QmoDLamxtAECwC3RGjq+oNuK1ENV8+tnipIavss6sMYt77hpygqlMOCt0Sla5cl7H4SKCVBCGEg==", + "requires": { + "bl": "^2.2.0", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "dependencies": { + "bl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", + "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bson": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", + "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==" + } + } + }, "mongodb-core": { "version": "2.1.20", "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.20.tgz", @@ -22403,6 +22593,28 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==" }, + "node-gcm": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/node-gcm/-/node-gcm-0.14.4.tgz", + "integrity": "sha1-mWXbzjcEcuFbGGPovEtTovr/qQM=", + "requires": { + "debug": "^0.8.1", + "lodash": "^3.10.1", + "request": "^2.27.0" + }, + "dependencies": { + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=" + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + } + } + }, "node-libs-browser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", @@ -26825,6 +27037,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", @@ -27593,6 +27814,15 @@ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", "dev": true }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "spawn-sync": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", @@ -29062,6 +29292,38 @@ "https-proxy-agent": "^2.2.1", "node-fetch": "^2.2.0", "uuid": "^3.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "telejson": { @@ -30185,6 +30447,14 @@ "tslib": "^1.9.3" } }, + "use-subscription": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.4.1.tgz", + "integrity": "sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ==", + "requires": { + "object-assign": "^4.1.1" + } + }, "utf7": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/utf7/-/utf7-1.0.2.tgz", diff --git a/package.json b/package.json index 9e1e84d8cd1e..d5eca0bf5930 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Rocket.Chat", "description": "The Ultimate Open Source WebChat Platform", - "version": "3.1.2", + "version": "3.2.0", "author": { "name": "Rocket.Chat", "url": "https://rocket.chat/" @@ -59,6 +59,7 @@ }, "devDependencies": { "@babel/core": "^7.6.2", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", "@babel/preset-env": "^7.6.2", "@babel/preset-react": "^7.0.0", "@octokit/rest": "^16.1.0", @@ -73,6 +74,7 @@ "@storybook/react": "^5.2.8", "@types/bcrypt": "^3.0.0", "@types/meteor": "^1.4.37", + "@types/mongodb": "^3.5.8", "@typescript-eslint/eslint-plugin": "^2.11.0", "@typescript-eslint/parser": "^2.11.0", "acorn": "^6.4.1", @@ -128,7 +130,7 @@ "@nivo/heatmap": "^0.61.0", "@nivo/line": "^0.61.1", "@nivo/pie": "^0.61.1", - "@rocket.chat/apps-engine": "^1.13.0", + "@rocket.chat/apps-engine": "^1.14.0-beta.3119", "@rocket.chat/fuselage": "^0.7.1", "@rocket.chat/fuselage-hooks": "^0.7.1", "@rocket.chat/fuselage-polyfills": "^0.7.1", @@ -137,6 +139,7 @@ "@rocket.chat/ui-kit": "^0.7.1", "@slack/client": "^4.8.0", "adm-zip": "RocketChat/adm-zip", + "apn": "2.2.0", "archiver": "^3.0.0", "arraybuffer-to-string": "^1.0.2", "atlassian-crowd": "^0.5.0", @@ -200,7 +203,9 @@ "mkdirp": "^0.5.1", "moment": "^2.22.2", "moment-timezone": "^0.5.27", + "mongodb": "^3.5.6", "node-dogstatsd": "^0.0.7", + "node-gcm": "0.14.4", "node-rsa": "^1.0.5", "object-path": "^0.11.4", "pdfjs-dist": "^2.0.943", @@ -228,6 +233,7 @@ "underscore": "^1.9.1", "underscore.string": "^3.3.5", "url-polyfill": "^1.1.5", + "use-subscription": "^1.4.1", "uuid": "^3.3.2", "webdav": "^2.10.0", "wolfy87-eventemitter": "^5.2.5", diff --git a/packages/rocketchat-i18n/i18n/af.i18n.json b/packages/rocketchat-i18n/i18n/af.i18n.json index 6407358be541..c1898107a0ea 100644 --- a/packages/rocketchat-i18n/i18n/af.i18n.json +++ b/packages/rocketchat-i18n/i18n/af.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(as hulle van %s is)", "If_this_email_is_registered": "As hierdie e-pos geregistreer is, stuur ons instruksies oor hoe om u wagwoord terug te stel. As jy nie binnekort 'n e-pos ontvang nie, kom asseblief terug en probeer weer.", "If_you_are_sure_type_in_your_password": "As jy seker is, tik jou wagwoord in:", + "Members_List": "Lede Lys", "If_you_are_sure_type_in_your_username": "As jy seker is, tik jou gebruikersnaam in:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "As jy nie een het nie, stuur 'n e-pos aan [omni@rocket.chat] (mailto: omni@rocket.chat) om joune te kry.", "Iframe_Integration": "Iframe Integrasie", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Jy het geen boodskappe gekies nie", "Mail_Messages": "Pos boodskappe", "Mail_Messages_Instructions": "Kies watter boodskappe u per e-pos wil stuur deur op die boodskappe te klik", + "Room_uploaded_file_list": "Lêer lys", "Mail_Messages_Subject": "Hier is 'n geselekteerde gedeelte van%s boodskappe", "Mailer": "Mailer", "Mailer_body_tags": "Jy moet gebruik vir die intekeningskripsie.
Jy mag [name], [fname], [lname] vir die volle naam, voornaam of van die gebruiker gebruik.
Jy mag [e-pos] gebruik vir die gebruiker se e-pos.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Maksimum lengte is%s", "Media": "media", "Medium": "medium", - "Members_List": "Lede Lys", "mention-all": "Noem alles", "mention-all_description": "Toestemming om die @all vermelding te gebruik", "mention-here": "Noem hier", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Kamer type verander suksesvol", "Room_type_of_default_rooms_cant_be_changed": "Hierdie is 'n verstek kamer en die tipe kan nie verander word nie. Raadpleeg asseblief u administrateur.", "Room_unarchived": "Kamer unarchived", - "Room_uploaded_file_list": "Lêer lys", "Room_uploaded_file_list_empty": "Geen lêers beskikbaar nie.", "Rooms": "kamers", "run-import": "Begin invoer", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Trigger Words", "Triggers": "snellers", "True": "True", + "Troubleshoot_Disable_Notifications": "Deaktiveer kennisgewings", "Tuesday": "Dinsdag", "Turn_OFF": "Skakel af", "Turn_ON": "Sit aan", diff --git a/packages/rocketchat-i18n/i18n/ar.i18n.json b/packages/rocketchat-i18n/i18n/ar.i18n.json index 0b53f188f9f8..7eb8a15f4700 100644 --- a/packages/rocketchat-i18n/i18n/ar.i18n.json +++ b/packages/rocketchat-i18n/i18n/ar.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(إذا كانوا من٪ s)", "If_this_email_is_registered": "إذا تم تسجيل هذا البريد الإلكتروني، فسنرسل إرشادات حول كيفية إعادة تعيين كلمة المرور. إذا لم تتلق رسالة إلكترونية بعد قليل، فيرجى العودة وإعادة المحاولة.", "If_you_are_sure_type_in_your_password": "إدا كنت متأكد أدخل كلمة المرور الخاصة بك:", + "Members_List": "قائمة الأعضاء", "If_you_are_sure_type_in_your_username": "إذا كنت متأكدا من نوع في اسم المستخدم الخاص بك:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "إذا لم يكن لديك واحد إرسال بريد إلكتروني إلى [omni@rocket.chat] (مايلتو: omni@rocket.chat) للحصول على لك.", "Iframe_Integration": "دمج Iframe", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "لم تقم بتحديد أي رسالة. هل تريد أن تحدد جميع الرسائل الظاهرة؟", "Mail_Messages": "إرسال الرسائل للبريد الألكتروني", "Mail_Messages_Instructions": "حدد الرسائل المراد إرسالها بالبريد الإلكتروني بالضغط على تلك الرسائل", + "Room_uploaded_file_list": "قائمة الملفات", "Mail_Messages_Subject": "مجموعة مختارة من رسائل %s", "Mailer": "الارسال", "Mailer_body_tags": "يجب عليك استخدام[unsubscribe] للارتباط إلغاء الاشتراك.
يمكنك استخدام [name]، [fname]، [lname] عن الاسم الكامل للمستخدم، الاسم الأول أو اسم العائلة، على التوالي.
يمكنك استخدام [email] للبريد الإلكتروني الخاص بالمستخدم.", @@ -1711,7 +1713,6 @@ "Max_length_is": "الحد الأقصى للطول هو %s", "Media": "وسائل الإعلام", "Medium": "متوسط", - "Members_List": "قائمة الأعضاء", "mention-all": "ذكر الجميع", "mention-all_description": "إذن لاستخدامall أذكر", "mention-here": "أذكر هنا", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "تم تغيير نوع الغرفة بنجاح", "Room_type_of_default_rooms_cant_be_changed": "هذه غرفة افتراضية. لا يُمكن تغيير المكتوب. الرجاء الاتصال بالمدير!", "Room_unarchived": "غرفة نشطة", - "Room_uploaded_file_list": "قائمة الملفات", "Room_uploaded_file_list_empty": "لا يوجد ملفات.", "Rooms": "الغرف", "run-import": "تشغيل الاستيراد", @@ -2558,6 +2558,7 @@ "Trigger_Words": "الكلمات الزناد", "Triggers": "محفزات", "True": "نعم", + "Troubleshoot_Disable_Notifications": "إلغاء تفعيل الإشعارات", "Tuesday": "الثلاثاء", "Turn_OFF": "أطفأ", "Turn_ON": "شغله", diff --git a/packages/rocketchat-i18n/i18n/az.i18n.json b/packages/rocketchat-i18n/i18n/az.i18n.json index a5cf7d771297..dc3e71a6462c 100644 --- a/packages/rocketchat-i18n/i18n/az.i18n.json +++ b/packages/rocketchat-i18n/i18n/az.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(%s olduğundan)", "If_this_email_is_registered": "Bu e-poçt qeydə alındıqda, parolunuzu necə sıfırlayacağına dair təlimatlar göndərəcəyik. Qısa müddətdə bir e-poçt almazsan, geri qayıdın və yenidən cəhd edin.", "If_you_are_sure_type_in_your_password": "Şifrənizdə əminəmsə:", + "Members_List": "İstifadəçi siyahısı", "If_you_are_sure_type_in_your_username": "İstifadəçi adınızdakı tipə əminsəniz:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Əgər biriniz yoxsa [omni@rocket.chat] ünvanına (mailto: omni@rocket.chat) bir e-poçt göndərmək istəyirsinizsə.", "Iframe_Integration": "Iframe inteqrasiyası", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Siz heç bir mesaj seçmədiniz", "Mail_Messages": "Mail Mesajları", "Mail_Messages_Instructions": "Mesajları tıklayaraq e-poçt vasitəsilə göndərmək istədiyiniz mesajı seçin", + "Room_uploaded_file_list": "Fayl siyahısı", "Mail_Messages_Subject": "%s mesajlarının seçilmiş bir hissəsi", "Mailer": "Mailer", "Mailer_body_tags": "Siz abunə bağlantısı bağlantısı üçün [abunəlikdən] istifadə etməlisiniz.
Siz istifadəçinin tam adı, soyadı və soyadı üçün [ad], [fname], [lname] istifadə edə bilərsiniz.
İstifadəçinin e-poçtu üçün [email] istifadə edə bilərsiniz.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Maksimum uzunluq%sdir", "Media": "Media", "Medium": "Orta", - "Members_List": "İstifadəçi siyahısı", "mention-all": "Bütünləri xatırla", "mention-all_description": "İstifadə etmək üçün icazəni qeyd edin", "mention-here": "Burada qeyd edin", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Otaq tipi uğurla dəyişdi", "Room_type_of_default_rooms_cant_be_changed": "Bu standart bir otaqdır və növü dəyişdirilə bilməz, xahiş edirik administratorla məsləhətləşin.", "Room_unarchived": "Otaq arxivləşdirildi", - "Room_uploaded_file_list": "Fayl siyahısı", "Room_uploaded_file_list_empty": "Heç bir fayl yoxdur.", "Rooms": "Otaqlar", "run-import": "İşıqlandırın", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Tetikleyici sözlər", "Triggers": "Tetikler", "True": "Doğru", + "Troubleshoot_Disable_Notifications": "Bildirişləri işdən çıxarın", "Tuesday": "Cümə axşamı", "Turn_OFF": "Söndür", "Turn_ON": "İşə sal", diff --git a/packages/rocketchat-i18n/i18n/be-BY.i18n.json b/packages/rocketchat-i18n/i18n/be-BY.i18n.json index 8a86c9fe4755..5f5ba55007fc 100644 --- a/packages/rocketchat-i18n/i18n/be-BY.i18n.json +++ b/packages/rocketchat-i18n/i18n/be-BY.i18n.json @@ -1311,6 +1311,7 @@ "if_they_are_from": "(Калі яны ад %s)", "If_this_email_is_registered": "Калі гэты ліст зарэгістравана, мы адправім інструкцыі па аднаўленні пароля. Калі вы не атрымаеце па электроннай пошце ў бліжэйшы час, калі ласка, вярніцеся і паспрабуйце ізноў.", "If_you_are_sure_type_in_your_password": "Калі вы ўпэўненыя, увядзіце свой пароль:", + "Members_List": "карыстальнікі", "If_you_are_sure_type_in_your_username": "Калі вы ўпэўненыя, увядзіце ваша імя карыстальніка:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Калі вы не маеце адзін адправіць па электроннай пошце [omni@rocket.chat] (па адрасе: omni@rocket.chat), каб атрымаць ваш.", "Iframe_Integration": "Iframe інтэграцыі", @@ -1683,6 +1684,7 @@ "Mail_Message_No_messages_selected_select_all": "Вы не абралі ні аднаго паведамлення", "Mail_Messages": "паштовыя паведамленні", "Mail_Messages_Instructions": "Выберыце, якія паведамленні вы хочаце адправіць па электроннай пошце, націснуўшы на паведамленні", + "Room_uploaded_file_list": "спіс файлаў", "Mail_Messages_Subject": "Вось абраная частка %s паведамленняў", "Mailer": "рассыланне", "Mailer_body_tags": "Вы павіненвыкарыстоўваць [адпіскі] для адпіскі спасылкі.
вы можаце выкарыстоўваць [імя], [імя_файла], [LNAME] поўнае імя карыстальніка, імя або прозвішча, адпаведна.
Вы можаце выкарыстоўваць [EMAIL] для электроннай пошты карыстальніка.", @@ -1724,7 +1726,6 @@ "Max_length_is": "Максімальная даўжыня складае %s", "Media": "сродкі масавай інфармацыі", "Medium": "серада", - "Members_List": "карыстальнікі", "mention-all": "любое All", "mention-all_description": "Дазвол на выкарыстанне згадкі @all", "mention-here": "любое тут", @@ -2217,7 +2218,6 @@ "Room_type_changed_successfully": "Тып нумара паспяхова зменены", "Room_type_of_default_rooms_cant_be_changed": "Гэта нумар па змаўчанні і тып не можа быць зменены, калі ласка, звярніцеся да адміністратара.", "Room_unarchived": "нумар разархіваваць", - "Room_uploaded_file_list": "спіс файлаў", "Room_uploaded_file_list_empty": "Няма даступных файлаў.", "Rooms": "пакоя", "run-import": "выканаць імпарт", @@ -2573,6 +2573,7 @@ "Trigger_Words": "словы запуску", "Triggers": "трыгеры", "True": "праўда", + "Troubleshoot_Disable_Notifications": "адключыць апавяшчэння", "Tuesday": "аўторак", "Turn_OFF": "Выключыць", "Turn_ON": "Уключыць", diff --git a/packages/rocketchat-i18n/i18n/bg.i18n.json b/packages/rocketchat-i18n/i18n/bg.i18n.json index 61863fa60072..77643dbd88a6 100644 --- a/packages/rocketchat-i18n/i18n/bg.i18n.json +++ b/packages/rocketchat-i18n/i18n/bg.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(ако са от %s)", "If_this_email_is_registered": "Ако този имейл е регистриран, ще изпратим инструкции как да зададете нова парола. Ако скоро не получите имейл, моля, върнете се и опитайте отново.", "If_you_are_sure_type_in_your_password": "Ако сте сигурни, въведете паролата си:", + "Members_List": "Списък с членовете", "If_you_are_sure_type_in_your_username": "Ако сте сигурни, въведете потребителското си име:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Ако нямате такъв, изпратете имейл до [omni@rocket.chat] (mailto: omni@rocket.chat), за да получите вашето.", "Iframe_Integration": "Вътрешна интеграция", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Не сте избрали никакви съобщения", "Mail_Messages": "Съобщения по пощата", "Mail_Messages_Instructions": "Изберете кои съобщения искате да изпратите по имейл, като кликнете върху съобщенията", + "Room_uploaded_file_list": "Списък с файлове", "Mail_Messages_Subject": "Ето избрана част от съобщенията %s", "Mailer": "подател", "Mailer_body_tags": "Вие трябвада използвате [unsubscribe] за връзката за отписване.

Можете да използвате [имейл] за имейла на потребителя.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Максималната дължина е %s", "Media": "средства", "Medium": "среда", - "Members_List": "Списък с членовете", "mention-all": "Споменаване на всичко", "mention-all_description": "Разрешение за използване на @ цялото споменаване", "mention-here": "Споменете тук", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Типът стая се промени успешно", "Room_type_of_default_rooms_cant_be_changed": "Това е стая по подразбиране и типът не може да бъде променен, моля, консултирайте се с администратора си.", "Room_unarchived": "Стаята не е архивирана", - "Room_uploaded_file_list": "Списък с файлове", "Room_uploaded_file_list_empty": "Няма налични файлове.", "Rooms": "Стаий", "run-import": "Стартирайте импортирането", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Думи за задействане", "Triggers": "тригери", "True": "Вярно", + "Troubleshoot_Disable_Notifications": "Деактивиране на известията", "Tuesday": "вторник", "Turn_OFF": "Изключи", "Turn_ON": "Включи", diff --git a/packages/rocketchat-i18n/i18n/bs.i18n.json b/packages/rocketchat-i18n/i18n/bs.i18n.json index 7fe0f078d6c1..7daa731ed5fa 100644 --- a/packages/rocketchat-i18n/i18n/bs.i18n.json +++ b/packages/rocketchat-i18n/i18n/bs.i18n.json @@ -1296,6 +1296,7 @@ "if_they_are_from": "(ako su iz %s)", "If_this_email_is_registered": "Ako je ova e-poruka registrirana, poslat ćemo vam upute o tome kako poništiti zaporku. Ako uskoro ne primite e-poruku, vratite se i pokušajte ponovo.", "If_you_are_sure_type_in_your_password": "Ako ste sigurni upišite svoju lozinku:", + "Members_List": "Lista Članova", "If_you_are_sure_type_in_your_username": "Ako ste sigurni upišite svoje korisničko ime:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Ako nemate nekoga, pošaljite e-poštu na adresu [omni@rocket.chat] (mailto: omni@rocket.chat) kako biste dobili svoj.", "Iframe_Integration": "Integracija iframea", @@ -1668,6 +1669,7 @@ "Mail_Message_No_messages_selected_select_all": "Niste odabrali nikakve poruke.", "Mail_Messages": "Email Poruke", "Mail_Messages_Instructions": "Odaberite koje poruke želite poslati putem e-maila klikom na poruke", + "Room_uploaded_file_list": "Popis datoteka", "Mail_Messages_Subject": "Evo odabrani dio %s poruka", "Mailer": "Mailer", "Mailer_body_tags": "Morate koristiti [unsubscribe] za otkazivanje pretplate.
Možete koristiti [name], [fname], [lname] za korisnikovo ime i prezime, ime i prezime
 Možete koristiti [email] za e-poštu korisnika.", @@ -1709,7 +1711,6 @@ "Max_length_is": "Maksimalna dužina je %s", "Media": "media", "Medium": "Srednji", - "Members_List": "Lista Članova", "mention-all": "Spominjati sve", "mention-all_description": "Dopuštenje za korištenje @all spomen", "mention-here": "Ovdje spomenuti", @@ -2201,7 +2202,6 @@ "Room_type_changed_successfully": "Vrsta sobe je uspješno promijenjena", "Room_type_of_default_rooms_cant_be_changed": "Ovo je zadana soba i vrsta se ne može mijenjati, obratite se svom administratoru.", "Room_unarchived": "Soba je dearhivirana", - "Room_uploaded_file_list": "Popis datoteka", "Room_uploaded_file_list_empty": "Nijedna datoteka nije dostupna", "Rooms": "Sobe", "run-import": "Pokreni uvoz", @@ -2556,6 +2556,7 @@ "Trigger_Words": "Riječi okidača", "Triggers": "Okidači", "True": "Da", + "Troubleshoot_Disable_Notifications": "Onemogućivanje obavijesti", "Tuesday": "Utorak", "Turn_OFF": "Isključiti", "Turn_ON": "Upaliti", diff --git a/packages/rocketchat-i18n/i18n/ca.i18n.json b/packages/rocketchat-i18n/i18n/ca.i18n.json index 7d060a3e35e3..e754098f4026 100644 --- a/packages/rocketchat-i18n/i18n/ca.i18n.json +++ b/packages/rocketchat-i18n/i18n/ca.i18n.json @@ -1448,6 +1448,7 @@ "if_they_are_from": "(si són de %s)", "If_this_email_is_registered": "Si l'adreça de correu-e ja està registrada, t'enviarem instruccions sobre com restablir la contrasenya. Si no reps el missatge en breu, si us plau torna i reintenta-ho.", "If_you_are_sure_type_in_your_password": "Si n'està segur escrigui la contrasenya:", + "Members_List": "Llista de membres", "If_you_are_sure_type_in_your_username": "Si n'està segur escrigui el seu nom d'usuari:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Si no n'hi ha, envieu un correu electrònic a [omni@rocket.chat] (mailto: omni@rocket.chat) per obtenir el vostre.", "Iframe_Integration": "Integració Iframe", @@ -1820,6 +1821,7 @@ "Mail_Message_No_messages_selected_select_all": "No s'ha seleccionat cap missatge", "Mail_Messages": "Envia missatges per correu-e", "Mail_Messages_Instructions": "Seleccioneu els missatges que voleu enviar per correu electrònic fent clic als mateixos", + "Room_uploaded_file_list": "Llista d'arxius pujats", "Mail_Messages_Subject": "Aquí hi ha una part seleccionada de %s missatges", "Mailer": "Missatge correu-e", "Mailer_body_tags": "És necessari utilitzar [unsubscribe] per a l'enllaç d'anul·lació de la subscripció.
És possible utilitzar [name], [fname], [lname] per al nom complet de l'usuari, nom o cognom, respectivament.
També [email] per a l'adreça de correu electrònic de l'usuari.", @@ -1861,7 +1863,6 @@ "Max_length_is": "La llargada màxima és %s", "Media": "Mitjans de comunicació", "Medium": "Mitjà", - "Members_List": "Llista de membres", "mention-all": "Mencionar tots", "mention-all_description": "Permís per utilitzar la menció @all", "mention-here": "Menció aquí", @@ -2353,7 +2354,6 @@ "Room_type_changed_successfully": "El tipus de sala s'ha canviat correctament", "Room_type_of_default_rooms_cant_be_changed": "Aquesta és una sala per defecte i no es pot canviar el tipus, si us plau consulta-ho amb l'administrador.", "Room_unarchived": "La sala s'ha desarxivat", - "Room_uploaded_file_list": "Llista d'arxius pujats", "Room_uploaded_file_list_empty": "No hi ha cap arxiu.", "Rooms": "Sales", "run-import": "Executar importació", @@ -2708,6 +2708,7 @@ "Trigger_Words": "Paraules d'activació", "Triggers": "Activadors (triggers)", "True": "Sí", + "Troubleshoot_Disable_Notifications": "Desactiva notificacions", "Tuesday": "dimarts", "Turn_OFF": "DESACTIVA", "Turn_ON": "ACTIVA", diff --git a/packages/rocketchat-i18n/i18n/cs.i18n.json b/packages/rocketchat-i18n/i18n/cs.i18n.json index 85996b8493db..1f6153096e61 100644 --- a/packages/rocketchat-i18n/i18n/cs.i18n.json +++ b/packages/rocketchat-i18n/i18n/cs.i18n.json @@ -203,16 +203,33 @@ "Accounts_Directory_DefaultView": "Výchozí seznam adresářů", "Accounts_SetDefaultAvatar": "Nastavit výchozí avatar", "Accounts_SetDefaultAvatar_Description": "Pokusí se určit výchozí avatar na základě OAuth účtu nebo gravataru", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "Nastavit email účtů z externích služeb jako ověřený", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "Emaily účtů ze služeb jako LDAP, OAuth, atd. budou automaticky ověřené", "Accounts_ShowFormLogin": "Zobrazit výchozí formulář přihlášení", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "Povolit dvoufázové ověření přes email", + "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Uživatelé s ověřeným emailem kteří si tuto možnost povolí v nastavení, obdrží emailem jednorázový kód pro autorizaci akcí jako přihlášení, změna nastavení a podobně.", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Automaticky zapnout dvoufázové ověření novým uživatelům", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Nový uživatelé mají dvoufázové ověření zapnuté vždy, ale mohou si je vypnout v nastavení", + "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Doba expirace kódu v sekundách", "Accounts_TwoFactorAuthentication_Enabled": "Povolit dvoufázové ověření", + "Accounts_TwoFactorAuthentication_Enabled_Description": "Uživatelé si mohou nastavit dvoufázové ověření přes TOTP aplikace jako jsou Google Authenticator, Authy apod.", "Accounts_TwoFactorAuthentication_MaxDelta": "Maximální Delta", "Accounts_UserAddedEmail_Default": "

Vítá Vás [Site_Name]

Přejděte na [Site_URL] a zkuste to nejlepší open source chat řešení na trhu!

Můžete se přihlásit pomocí e-mailu: [email] a hesla: [password]. Po přihlášení jej možná budete muset změnit.", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "Maximální hodnota Delta určuje, kolik tokenů je v daném okamžiku platných. Tokeny jsou generovány každých 30 sekund a platí (30 * Maximální Delta) sekund.
Příklad: Pokud je maximální Delta nastavena na 10, může být každý token použit až do 300 sekund před nebo po jeho časovém razítku. Tato funkce se může hodit, pokud nejsou hodiny klienta správně synchronizovány se serverem.", + "Accounts_TwoFactorAuthentication_RememberFor": "Zapamatovat dvoufázové ověření po dobu (v sekundách)", + "Accounts_TwoFactorAuthentication_RememberFor_Description": "Kód nebude znova vyžadován dříve než po uplynutí této doby", "Accounts_UseDefaultBlockedDomainsList": "Použít výchozí seznam blokovaných domén", "Accounts_UseDNSDomainCheck": "Použít ověření DNS domény", "Accounts_UserAddedEmailSubject_Default": "Vítejte na [Site_Name]", "Accounts_UserAddedEmail_Description": "Můžete použít:

  • [name], [fname], [lname] pro celé jméno, křestní nebo příjmení.
  • [email] pro email uživatele.
  • [password] pro heslo uživatele.
  • [Site_Name] a [Site_URL] pro jméno a URL aplikace.
", "Activate": "Aktivovat", + "Active_users": "Aktivní uživatelé", + "Daily_Active_Users": "Denně aktivních uživatelů", + "Weekly_Active_Users": "Týdně aktivních uživatelů", + "Monthly_Active_Users": "Měšíčně aktivních uživatelů", + "DAU_value": "DAU __value__", + "WAU_value": "WAU __value__", + "MAU_value": "MAU __value__", "Activity": "Aktivita", "Add": "Přidat", "add-oauth-service": "Přidat Oauth službu", @@ -330,11 +347,12 @@ "API_Personal_Access_Tokens_To_REST_API": "Osobní přístupové tokeny k REST API", "API_Personal_Access_Tokens_Remove_Modal": "Opravdu chcete odstranit tento osobní přístupový token?", "API_Personal_Access_Token_Generated": "Osobní přístupový token byl úspěšně vygenerován", - "API_Personal_Access_Token_Generated_Text_Token_s_UserId_s": "Uložte si pečlivě svůj token, protože jej již nebudete moci zobrazit.
Token: __token__
Vaše uživatelské ID: __userId__", + "API_Personal_Access_Token_Generated_Text_Token_s_UserId_s": "Svůj token si pečlivě uložte, znovu už si je nezobrazíte.
Token: __token__
Vaše uživatelské ID: __userId__", "API_Personal_Access_Tokens_Regenerate_Modal": "Pokud jste token ztratili nebo zapomněli, můžete jej vygenerovat znovu, ale nezapomeňte, že všechny aplikace, které tento token používají, by měly být aktualizovány", "API_Personal_Access_Tokens_Regenerate_It": "Znovu vygenerovat token", "API_Shield_Types": "Typy ikon", "API_Shield_Types_Description": "Čárkou oddělený seznam povolených typů. Na výběr z `online`, `channel` nebo `*` pro všechny.", + "API_Shield_user_require_auth": "Vyžadovat přihlášení pro uživatelské sdílecí ikony", "API_Token": "API Token", "API_Tokenpass_URL": "URL Serveru Tokenpass", "API_Tokenpass_URL_Description": "Například: https://domain.com (bez koncového lomítka)", @@ -374,6 +392,11 @@ "Apps_Framework_Development_Mode": "Povolit režim vývoje", "Apps_Framework_Development_Mode_Description": "Vývojový režim umožňuje instalaci aplikací, které nepocházejí z Rocket.Chat Marketplace.", "Apps_Framework_enabled": "Povolit Aplikace", + "Apps_Game_Center": "Herní centrum", + "Apps_Game_Center_Back": "Zpátky do herního centra", + "Apps_Game_Center_enabled": "Povolit herní centrum", + "Apps_Game_Center_Play_Game_Together": "@here Pojďme si společně zahrát __name__!", + "Apps_Game_Center_Invite_Friends": "Pozvěte své přátele aby se přidali", "Apps_Marketplace_Deactivate_App_Prompt": "Opravdu chcete tuto aplikaci zakázat?", "Apps_Marketplace_Modify_App_Subscription": "Upravit odběr", "Apps_Marketplace_Uninstall_App_Prompt": "Opravdu chcete tuto aplikaci odinstalovat?", @@ -449,6 +472,8 @@ "AutoTranslate_Enabled": "Povolit automatický překlad", "AutoTranslate_Enabled_Description": "Aktivace automatického překladu umožní lidem, kteří mají automatické překlady , aby všechny zprávy byly automaticky přeloženy do vybraného jazyka. Mohou být účtovány poplatky.", "AutoTranslate_Google": "Google", + "AutoTranslate_Microsoft": "Microsoft", + "AutoTranslate_Microsoft_API_Key": "Ocp-Apim-Subscription-Key", "AutoTranslate_ServiceProvider": "Poskytovatel služeb", "Available": "Dostupný", "Available_agents": "Dostupní operátoři", @@ -508,6 +533,8 @@ "Broadcasting_enabled": "Vysílání povoleno", "Broadcasting_media_server_url": "Adresa URL serveru pro vysílání", "Browse_Files": "Procházet soubory", + "Browser_does_not_support_audio_element": "Váš prohlížeč neumí pracovat s audiem.", + "Browser_does_not_support_video_element": "Váš prohlížeč neumí pracovat s videem.", "Bugsnag_api_key": "Bugsnag API klíč", "Build_Environment": "Vytvořit prostředí", "bulk-register-user": "Hromadné vytváření uživatelů", @@ -722,6 +749,8 @@ "Conversation": "Konverzace", "Conversations": "Konverzace", "Conversation_closed": "Konverzace uzavřena: __comment__.", + "Conversation_closing_tags": "Uzavírací štítky konverzací", + "Conversation_closing_tags_description": "Tyto štítky budou automaticky přiřazeny konverzaci při jejím uzavření.", "Conversation_finished": "Konverzace byla ukončena", "Conversation_finished_message": "Konverzace ukončena", "Conversation_finished_text": "Text ukončené konverzace", @@ -992,6 +1021,7 @@ "Create_A_New_Channel": "Vytvořit novou místnost", "Create_new": "Vytvořit nový", "Create_unique_rules_for_this_channel": "Vytvořit zvláštní pravidla pro tuto místnost", + "Created": "Vytvořeno", "Created_at": "Vytvořeno ", "Created_at_s_by_s": "Vytvořeno v %s %s", "Created_at_s_by_s_triggered_by_s": "Vytvořeno ve %s %s vyvoláno %s", @@ -1055,6 +1085,7 @@ "Date_From": "Od", "Date_to": "Komu", "days": "dny", + "Days": "Dny", "DB_Migration": "Migrace databáze", "DB_Migration_Date": "Datum migrace databáze", "DDP_Rate_Limit_IP_Enabled": "Limit podle IP: povoleno", @@ -1112,6 +1143,8 @@ "Desktop_Notifications_Not_Enabled": "Oznámení na ploše jsou povoleny", "Details": "Detaily", "Different_Style_For_User_Mentions": "Odlišný styl pro zmínky", + "Direct_message_creation_description": "Chystáte se vytvořit konverzaci s více uživateli. Pomocí přímých zpráv s nimi můžete konverzovat na jednom místě.", + "Direct_message_you_have_joined": "Jste v nové přímé konverzaci s ", "Direct_message_someone": "Přímá zpráva někomu", "Direct_Messages": "Přímé zprávy", "Direct_Reply": "Přímá odpověď", @@ -1137,6 +1170,7 @@ "Disable_Facebook_integration": "Zakázat Facebook integraci", "Disable_Notifications": "Zakázat notifikace", "Disable_two-factor_authentication": "Zakázat dvoufázové ověření", + "Disable_two-factor_authentication_email": "Zakázat dvougázové ověření přes Email", "Disabled": "Zakázáno", "Disallow_reacting": "Zakázat reakce", "Disallow_reacting_Description": "Zakáže reakce", @@ -1173,6 +1207,7 @@ "Download_My_Data": "Stáhnout moje data (HTML)", "Download_Pending_Files": "Stáhnout čekající soubory", "Download_Snippet": "Stáhnout", + "Do_not_provide_this_code_to_anyone": "Tento kód nikomu neukazujte", "Drop_to_upload_file": "Pusťe soubor do okna pro jeho nahrání", "Dry_run": "Zkouška", "Dry_run_description": "Odešle pouze jeden e-mail, na stejnou adresu jako ve formuláři. K e-mailu musí patřit platný uživatel.", @@ -1188,6 +1223,8 @@ "E2E_Enabled": "E2E povoleno", "E2E_Enable_alert": "Tato funkce je aktuálně ve verzi beta! Nahlaste chyby na github.com/RocketChat/Rocket.Chat/issues a mějte na paměti:
- Šifrované zprávy šifrovaných místností nebudou nalezeny vyhledávacími operacemi.
- Mobilní aplikace nemusí podporovat šifrované zprávy (jsou implementovány).
- Boti nemusí vidět šifrované zprávy, dokud pro ně implementují podporu.
- Nahrávání nebude v této verzi šifrována.", "E2E_Enable_description": "Povolit možnost vytváření šifrovaných skupin a možnost měnit skupiny a přímé zprávy, které mají být šifrovány", + "E2E_Enabled_Default_DirectRooms": "Přímé konverzace ve výchozím stavu šifrovat", + "E2E_Enabled_Default_PrivateRooms": "Privátní místnosti ve výchozím stavu šifrovat", "E2E_Encryption_Password_Change": "Změnit heslo pro šifrování", "E2E_Encryption_Password_Explanation": "Nyní můžete vytvářet šifrované soukromé skupiny a přímé zprávy. Existující soukromé skupiny nebo DM můžete také změnit na šifrované.

Toto je end-to-end šifrování, takže klíč pro šifrování/dešifrování vašich zpráv nebude uložen na serveru. Z tohoto důvodu musíte své heslo uložit na bezpečné místo. Budete vyzváni k jeho zadání na jiných zařízeních, na kterých chcete používat šifrování E2E.", "E2E_password_reveal_text": "Nyní můžete vytvářet šifrované soukromé skupiny a přímé zprávy. Existující soukromé skupiny nebo DM můžete také změnit na šifrované.

Toto je end-to-end šifrování, takže klíč pro kódování / dekódování vašich zpráv nebude uložen na serveru. Z tohoto důvodu musíte toto heslo uložit někde v bezpečí. Budete vyzváni k jeho zadání na jiných zařízeních, na kterých chcete používat šifrování E2E. Více informací zde

Vaše heslo je: %s

Jedná se o automaticky generované heslo. Nové heslo pro šifrovací klíč můžete nastavit kdykoli z jakéhokoli prohlížeče, do kterého jste zadali existující heslo.
Toto heslo je uloženo pouze v tomto prohlížeči dokud heslo neuložíte a nepotvrdíte tuto zprávu.", @@ -1248,12 +1285,14 @@ "Emoji_provided_by_JoyPixels": "Emoji poskytuje JoyPixels", "EmojiCustomFilesystem": "Vlastní filesystem pro emotikony", "Empty_title": "Prázdný název", + "Engagement_Dashboard": "Nástěnka zapojení", "Enable": "Povolit", "Enable_Auto_Away": "Povolit Auto nečinnost", "Enable_Desktop_Notifications": "Aktivovat oznámení na ploše", "Enable_inquiry_fetch_by_stream": "Povolit načítání dat dotazů ze serveru pomocí streamu", "Enable_Svg_Favicon": "Povolit SVG favikonu", "Enable_two-factor_authentication": "Povolit dvoufázové ověření", + "Enable_two-factor_authentication_email": "Povolit dvoufázové ověření přes Email", "Enabled": "Povoleno", "Encrypted": "Šifrováno", "Encrypted_channel_Description": "End-to-end šifrovaný kanál. Hledání nebude fungovat s šifrovanými kanály a oznámení nemusí zobrazovat obsah zpráv.", @@ -1264,6 +1303,7 @@ "End_OTR": "Ukončit konverzaci mimo záznam", "Enter_a_name": "Zadejte jméno", "Enter_a_regex": "Zadejte regulární výraz", + "Enter_a_department_name": "Zaddejte název oddělení", "Enter_a_room_name": "Zadejte název místnosti", "Enter_a_username": "Zadejte uživatelské jméno", "Enter_a_tag": "Zadejte značku", @@ -1292,7 +1332,7 @@ "error-could-not-change-name": "Nelze změnit jméno", "error-could-not-change-username": "Nelze změnit uživatelské jméno", "error-delete-protected-role": "Nelze odstranit chráněné role", - "error-department-not-found": "Oddělení nebylo nalezeno", + "error-department-not-found": "Oddělení nenalezeno", "error-direct-message-file-upload-not-allowed": "Sdílení souborů není v přímé konverzaci povoleno", "error-duplicate-channel-name": "Místnost s názvem ' %s' již existuje", "error-edit-permissions-not-allowed": "Úpravy oprávnění nejsou povoleny", @@ -1300,6 +1340,7 @@ "error-email-send-failed": "Nepodařilo se odeslat email: __message__", "error-field-unavailable": "Pole __field__ je již používáno :(", "error-file-too-large": "Soubor je příliš velký", + "error-forwarding-chat-same-department": "Vybrané oddělení a aktuální místnost jsou stejné", "error-importer-not-defined": "Nástroj pro import špatně nadefinován, chybí třída Importu.", "error-import-file-extract-error": "Nepodařilo se rozbalit importovaný soubor.", "error-import-file-is-empty": "Importovaný soubor se zdá být prázdný.", @@ -1382,7 +1423,9 @@ "error-logged-user-not-in-room": "Nejste v místnosti `%s`", "error-user-registration-disabled": "Registrace je zakázána", "error-user-registration-secret": "Registrace uživatele je povolena pouze přes tajnou URL", + "error-validating-department-chat-closing-tags": "Alespoň jeden štítek musí být u ukončené konverzace přiřazen protože to vyžaduje oddělení.", "error-you-are-last-owner": "Jste poslední vlastníkem místnosti. Před opuštěním místnosti prosím nastavte nového vlastníka.", + "error-starring-message": "Zpráva nejde ohvězdičkovat", "Error_404": "Chyba: 404 nenalezeno", "Error_changing_password": "Chyba změny hesla", "Error_loading_pages": "Chyba načítání stránek", @@ -1408,9 +1451,10 @@ "Exclude_Botnames": "Vyloučit boty", "Exclude_Botnames_Description": "Nepřevádět v potaz zprávy botu, jejichž jména odpovídají výše uvedenému regulárnímu výrazu. Pokud je pole prázdné, budou převedeny zprávy všech botů", "Exclude_pinned": "Vyloučit připoutané zprávy", - "except_pinned": "(kromě těch, které jsou připoutány)", + "except_pinned": "(kromě těch, které jsou připnuty)", "Execute_Synchronization_Now": "Spustit synchronizaci nyní", "Exit_Full_Screen": "Ukončit celou obrazovku", + "Experimental_Feature_Alert": "Tato funkce je experimentální. Myslete prosím na to, že se může změnit, rozbít nebo být v budoucnu odstraněna bez předchozího varování", "Expiration": "Expirace", "Expiration_(Days)": "Expirace (dny)", "Export_My_Data": "Exportovat moje data (JSON)", @@ -1494,7 +1538,7 @@ "FileUpload_GoogleStorage_Secret": "Google Storage Secret", "FileUpload_GoogleStorage_Secret_Description": "Prosím říďte se těmito instrukcemi a výsledek vložte zde.", "FileUpload_MaxFileSize": "Maximální velikost nahrávaného souboru (v bytech)", - "FileUpload_MaxFileSizeDescription": "Nastavte jej na -1 pro odstranění omezení velikosti souboru.", + "FileUpload_MaxFileSizeDescription": "Zadejte -1 pro neomezené velikosti souboru.", "FileUpload_MediaType_NotAccepted": "Typ souboru nelze přijmout", "FileUpload_MediaTypeWhiteList": "Povolené typy souborů", "FileUpload_MediaTypeWhiteListDescription": "Čárkami oddělený seznam typů souborů. Pokud nechcete omezovat typy, ponechte pole prázdné.", @@ -1615,6 +1659,7 @@ "Header": "Hlavička", "Header_and_Footer": "Hlavička a Patička", "Healthcare_and_Pharmaceutical": "Péče o zdraví/farmaceutika", + "Here_is_your_authentication_code": "Zde je váš autentizační kód:", "Help_Center": "Centrum nápovědy", "Helpers": "Nápovědy", "Hex_Color_Preview": "Náhled barvy podle Hex kódu", @@ -1641,7 +1686,7 @@ "Host": "Server", "hours": "hodiny", "Hours": "Hodiny", - "How_friendly_was_the_chat_agent": "Byl operátor příjemný?", + "How_friendly_was_the_chat_agent": "Byl operátor milý?", "How_knowledgeable_was_the_chat_agent": "Věděl operátor jak vám pomoci?", "How_long_to_wait_after_agent_goes_offline": "Jak dlouho čekat když je operátor offline", "How_long_to_wait_to_consider_visitor_abandonment": "Jak dlouho čekat než bude návštěvník považován za odpojeného?", @@ -1655,9 +1700,11 @@ "if_they_are_from": "(pokud jsou z %s)", "If_this_email_is_registered": "Pokud je e-mail v naší databázi, odešleme na něj instrukce pro reset hesla. Pokud vám e-mail nepřijde během chvilky, prosím vraťte se a zkuste to znova.", "If_you_are_sure_type_in_your_password": "Pokud si jste jisti, zadejte své heslo:", + "Members_List": "Seznam členů", "If_you_are_sure_type_in_your_username": "Pokud jste si jisti, zadejte své uživatelské jméno:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Pokud nemáte, získejte svou odesláním zprávy na [omni@rocket.chat](mailto:omni@rocket.chat)", "If_you_didnt_ask_for_reset_ignore_this_email": "Pokud jste nepožádali o obnovení hesla, můžete tento e-mail ignorovat.", + "If_you_didnt_try_to_login_in_your_account_please_ignore_this_email": "Pokud jste se do svého účtu nepokoušeli přihlásit, tento email prosím ignorujte.", "Iframe_Integration": "Iframe Integrace", "Iframe_Integration_receive_enable": "Povolit příjem", "Iframe_Integration_receive_enable_Description": "Povolit původnímu oknu odesílat požadavky na Rocket.Chat", @@ -1856,6 +1903,7 @@ "IssueLinks_Incompatible": "Varování: nepovolujte tuto volbu současně s 'Náhled barvy podle Hex kódu'.", "IssueLinks_LinkTemplate": "Šablona pro odkazy na issue", "IssueLinks_LinkTemplate_Description": "Šablona pro odkazy na issue; %s bude nahrazeno číslem issue.", + "Items_per_page:": "Položek na stránku:", "It_works": "Funguje to", "italic": "Kurzíva", "italics": "kurzíva", @@ -1869,6 +1917,7 @@ "Mobex_sms_gateway_restful_address": "Adresa Mobex SMS REST API", "Mobex_sms_gateway_restful_address_desc": "IP nebo Host vašeho Mobex REST API. Např. `http://192.168.1.1:8080` nebo `https://www.example.com:8080`", "Mobex_sms_gateway_username": "Uživatelské jméno", + "Most_popular_channels_top_5": "Nejoblíbenější místnosti (Top 5)", "Jitsi_Chrome_Extension": "ID Chrome rozšíření", "Jitsi_Enabled_TokenAuth": "Povolit JWT auth", "Jitsi_Application_ID": "ID aplikace (iss)", @@ -1927,6 +1976,7 @@ "Language_Russian": "Ruština", "Language_Spanish": "Španělština", "Language_Version": "Anglická verze", + "Last_active": "Naposledy aktivní", "Last_login": "Poslední přihlášení", "Last_Message_At": "Poslední zpráva v", "Last_seen": "Naposledy viděn/a", @@ -1934,6 +1984,9 @@ "Last_Message": "Poslední zpráva", "Last_Status": "Poslední stav", "Last_Updated": "Naposledy aktualizováno", + "Last_7_days": "Posledních 7 dní", + "Last_30_days": "Posledních 30 dní", + "Last_90_days": "Posledních 90 dní", "Launched_successfully": "Spuštěno v pořádku", "Layout": "Rozložení", "Layout_Home_Body": "Obsah úvodní stránky", @@ -2044,6 +2097,7 @@ "LDAP_Username_Field_Description": "Které pole budou použity jako *Jméno* pro nové uživatele. Ponechte prázdné pro použítí jména z přihlašovací stránky.
Můžete použít šablony a tagy jako například `#{givenName}.#{sn}`.
Výchozí hodnota je `sAMAccountName`.", "Lead_capture_email_regex": "Regulární výraz pro zachycení Leadu na email", "Lead_capture_phone_regex": "Regulární výraz pro zachycení Leadu na telefon", + "leave-c": "Odejít z místností", "leave-p": "Opustit soukromé skupiny", "Leave": "Opustit", "Leave_Group_Warning": "Jste si jisti, že chcete opustit skupinu \"%s\"?", @@ -2108,6 +2162,7 @@ "Local_Domains": "Lokální domény", "Local_Password": "Lokální heslo", "Localization": "Lokalizace", + "Location": "Lokalita", "Log_Exceptions_to_Channel_Description": "Místnost, do které se budou logovat všechny výjimky. Pokud necháte prázdné, výjimky se budou ignorovat", "Log_Exceptions_to_Channel": "Logovat výjimky do místnosti", "Log_File": "Zobrazit soubor a řádek", @@ -2137,6 +2192,7 @@ "Mail_Message_No_messages_selected_select_all": "Nejsou vybrány žádné zprávy. Chcete vybrat všechny viditelné zprávy?", "Mail_Messages": "Odeslat zprávy", "Mail_Messages_Instructions": "Kliknutím na zprávy vyberte ty, které chcete poslat e-mailem.", + "Room_uploaded_file_list": "Seznam souborů", "Mail_Messages_Subject": "Zde je vybraná část %s zpráv", "Mailer": "Odesílač mailů", "Mailer_body_tags": "Je nutné použít [unsubscribe] pro vložení odkazu na odhlášení.
Můžete také použít [name], [fname], [lname] pro uživatelské jméno, křestí jméno a příjmen.
Nebo [email] pro e-mail uživatele.", @@ -2203,7 +2259,6 @@ "Maximum": "Maximum", "Media": "Média", "Medium": "Médium", - "Members_List": "Seznam členů", "mention-all": "Zmínit všechny", "mention-all_description": "Právo použít `@all` zmínku", "mention-here": "Zmínka @here", @@ -2211,6 +2266,7 @@ "Mentions": "Zmínky", "Mentions_default": "Zmínky (výchozí)", "Mentions_only": "Pouze zmínky", + "Merge_Channels": "Spojit místnosti", "Message_AllowBadWordsFilter": "Povolit filtrování sprostých slov", "Message_AllowConvertLongMessagesToAttachment": "Povolit převod dlouhých zpráv na přílohu", "Message_AllowDeleting": "Povolit mazání zpráv", @@ -2252,6 +2308,8 @@ "Message_GlobalSearch": "Globální vyhledávání", "Message_GroupingPeriod": "Seskupovat zprávy v rozmezí (v sekundách)", "Message_GroupingPeriodDescription": "Zprávy budou seskupeny s předchozí zprávou, pokud jsou obě od stejného uživatele a uplynulá doba byla kratší než specifikovaný čas v sekundách.", + "Message_has_been_starred": "Zpráva Ohvězdičkována", + "Message_has_been_unstarred": "Hvězdička odebrána", "Message_HideType_au": "Schovat zprávu o \"přidání uživatele\"", "Message_HideType_mute_unmute": "Schovat zprávu o \"od/ztišení uživatele\"", "Message_HideType_ru": "Schovat zprávu o \"odebrání uživatele\"", @@ -2300,6 +2358,7 @@ "Message": "Zpráva", "messages": "zprávy", "Messages": "Zprávy", + "Messages_sent": "Zpráva odeslána", "Messages_that_are_sent_to_the_Incoming_WebHook_will_be_posted_here": "Zprávy, které jsou odesílány do příchozí WebHook integrace budou zveřejněny zde.", "Meta": "Meta informace", "Meta_custom": "Vlastní meta tagy", @@ -2359,7 +2418,9 @@ "Name_optional": "Jméno (volitelné)", "Name_Placeholder": "Zadejte své jméno...", "Navigation_History": "Navigace Historie (posledních 20 stran)", + "New_users": "Noví uživatelé", "New_Application": "Nová aplikace", + "New_chat_in_queue": "Nová konverzace ve frontě", "New_chat_transfer": "Nové přepojení chatu: __transfer__", "New_Custom_Field": "Nové vlastní pole", "New_Department": "Nové oddělení", @@ -2408,11 +2469,13 @@ "No_discussions_yet": "Zatím žádné diskuse", "No_Threads": "Nebyla nalezena žádná vlákna", "No_user_with_username_%s_was_found": "Nebyl nalezen žádný uživatel s uživatelským jménem \"%s\"!", + "No_data_found": "Data nanalezena", "Nobody_available": "Nikdo není dostupný", "Node_version": "Verze Node", "None": "Nic", "Nonprofit": "Neziskové organizace", "Normal": "Normální", + "Not_enough_data": "Málo dat", "Not_authorized": "Není povoleno", "Not_Available": "Nedostupný", "Not_found_or_not_allowed": "Nenalezeno nebo není povoleno", @@ -2458,6 +2521,8 @@ "Offline_form": "Offline formulář", "Offline_form_unavailable_message": "Zpráva nedostupného offline formuláře", "Offline_Link_Message": "PŘEJÍT NA ZPRÁVU", + "Offline_Message": "Offline zpráva", + "Offline_Message_Use_DeepLink": "Použijte Deep Link URL formát", "Offline_Mention_All_Email": "Předmět emailu zmínky všech", "Offline_Mention_Email": "Předmět emailu zmínky", "Offline_message": "Offline zprávy", @@ -2520,6 +2585,7 @@ "Password_Changed_Email_Subject": "[Site_Name] - heslo změněno", "Password_changed_section": "Heslo změněno", "Password_changed_successfully": "Heslo úspěšně změněno", + "Passwords_do_not_match": "Hesla se neshodují", "Password_Policy": "Zásady hesla", "Past_Chats": "Minulé konverzace", "Paste_here": "Vložte sem ...", @@ -2592,6 +2658,8 @@ "Privacy_Policy": "Zásady ochrany osobních údajů", "Private": "Privátní", "Private_Channel": "Privátní místnost", + "Private_Channels": "Soukromé místnosti", + "Private_Chats": "Soukromé konverzace", "Private_Group": "Soukromá skupina", "Private_Groups": "Soukromé skupiny", "Private_Groups_list": "Seznam Soukromých skupin", @@ -2619,6 +2687,7 @@ "files_pruned": "soubory omezeny", "Public": "Veřejné", "Public_Channel": "Veřejná místnost", + "Public_Channels": "Veřejné místnosti", "Public_Community": "Veřejná komunita", "Public_Relations": "Vztahy s veřejností", "Public_URL": "Veřejná adresa URL", @@ -2733,6 +2802,7 @@ "Request_comment_when_closing_conversation": "Při uzavírání konverzace požádat o komentář", "Request_comment_when_closing_conversation_description": "Pokud je povoleno, agent musí před uzavřením konverzace nastavit komentář.", "Request_tag_before_closing_chat": "Vyžadovat značky před uzavřením konverzace", + "Require": "Vyžádat", "Require_all_tokens": "Vyžadovat všechny tokeny", "Require_any_token": "Vyžadovat jakýkoliv token", "Require_password_change": "Vyžadovat změnu hesla", @@ -2754,10 +2824,10 @@ "RetentionPolicy_RoomWarning_UnpinnedFilesOnly": "Nepřipnuté soubory starší než __time__ jsou zde automaticky pročištěny (zpráv se netýká)", "RetentionPolicy_Description": "Automaticky omezí staré zprávy napříč vaší Rocket.Chat instancí.", "RetentionPolicy_Enabled": "Povoleno", - "RetentionPolicy_AppliesToChannels": "Platí pro kanály", + "RetentionPolicy_AppliesToChannels": "Platí pro místnosti", "RetentionPolicy_AppliesToGroups": "Platí pro soukromé skupiny", "RetentionPolicy_AppliesToDMs": "Platí pro přímé zprávy", - "RetentionPolicy_ExcludePinned": "Vyloučit připoutané zprávy", + "RetentionPolicy_ExcludePinned": "Vyloučit připnuté zprávy", "RetentionPolicy_FilesOnly": "Smazat pouze soubory", "RetentionPolicy_FilesOnly_Description": "Pouze soubory budou smazány, samotné zprávy zůstanou na místě.", "RetentionPolicy_MaxAge": "Maximální stáří zprávy", @@ -2768,7 +2838,7 @@ "RetentionPolicy_Precision": "Přesnost časovače", "RetentionPolicy_Precision_Description": "Jak často by měl časovač pročištění spustit. Nastavením této hodnoty na přesnější hodnotu pracují kanály s rychlejšími retenčními časovači lépe, ale v případě velkých komunit by to mohlo stát další procesní výkon.", "RetentionPolicyRoom_Enabled": "Automaticky pročišťovat staré zprávy", - "RetentionPolicyRoom_ExcludePinned": "Vyloučit připoutané zprávy", + "RetentionPolicyRoom_ExcludePinned": "Vyloučit připnuté zprávy", "RetentionPolicyRoom_FilesOnly": "Pročistit pouze soubory, zprávy ponechat", "RetentionPolicyRoom_MaxAge": "Maximální stáří zprávy ve dnech (výchozí: __max__)", "RetentionPolicyRoom_OverrideGlobal": "Přepsat zásady globální uchovávání", @@ -2809,7 +2879,6 @@ "Room_type_changed_successfully": "Typ místnosti úspěšně změněn", "Room_type_of_default_rooms_cant_be_changed": "Tato místnost je výchozí a proto nelze změnit její typ. Výchozí místnosti může upravovat administrátor.", "Room_unarchived": "Místnost odarchivována", - "Room_uploaded_file_list": "Seznam souborů", "Room_uploaded_file_list_empty": "Žádné soubory k dispozici.", "Rooms": "Místnosti", "Routing": "Směrování", @@ -2854,6 +2923,10 @@ "SAML_Default_User_Role_Description": "Můžete uvést více rolí oddělených čárkami.", "SAML_Role_Attribute_Name": "Název atributu role", "SAML_Role_Attribute_Name_Description": "Pokud je tento atribut nalezen v odpovědi SAML, jeho hodnoty budou použity jako názvy rolí nových uživatelů.", + "SAML_Role_Attribute_Sync": "Synchronizovat uživatelské role", + "SAML_Role_Attribute_Sync_Description": "Synchronizovat SAML uživatelské role při přihlášení (přepíše lokální uživatelské role)", + "SAML_Allowed_Clock_Drift": "Povolit časový nesoulad oproti poskytovali identity", + "SAML_Allowed_Clock_Drift_Description": "Čas poskytovatele identity mohou být napřed oproti systémovému času. Zde lze povolit manuální posun času. Hodnota je udaná počtem milisekund (ms). Tato hodnota je pak připočtena k systémovému času proti kterému se odpověď validuje.", "Saturday": "Sobota", "Save": "Uložit", "save-others-livechat-room-info": "Upravit informace jiné místnosti Omnichannel", @@ -2910,6 +2983,7 @@ "Send_invitation_email_error": "Zadejte platnou e-mailovou adresu.", "Send_invitation_email_info": "E-mailových pozvánek můžete poslat více najednou.", "Send_invitation_email_success": "Úspěšně jste poslali e-mailem pozvánku na následující adresy:", + "Send_me_the_code_again": "Pošlete mi kód znovu", "Send_request_on_agent_message": "Odeslat žádost na zprávy operátora", "Send_request_on_chat_close": "Odeslat požadavek po uzavření chatu", "Send_request_on_lead_capture": "Kam odesílat zachycené leady", @@ -3011,6 +3085,8 @@ "Smarsh_MissingEmail_Email_Description": "Jaký e-mail zobrazit u účtů, kde chybí e-mail chybí. Typicky účty botů", "Smarsh_Timezone": "Smarsh Timezone", "Smileys_and_People": "Smajlíci & Lidé", + "SMS_Default_Omnichannel_Department": "Omnichannel oddělení (výchozí)", + "SMS_Default_Omnichannel_Department_Description": "Pokud je vybráno všechny nové příchozí konverzace z této integrace budou přepojeny do tohoto odddělení", "SMS_Enabled": "SMS Povoleny", "SMTP": "SMTP", "SMTP_Host": "Server SMTP", @@ -3116,7 +3192,7 @@ "Sync_success": "Synchronizace úspěšná", "Sync_Users": "Synchronizace uživatelů", "System_messages": "Systémové zprávy", - "Tag": "Tag", + "Tag": "Štítek", "Take_it": "Převzít", "TargetRoom": "Cílová místnost", "TargetRoom_Description": "Místnost do které budou odeslány zprávy po spuštění dané události. Je povolena pouze jedna místnost, který musí existovat.", @@ -3198,7 +3274,7 @@ "theme-color-unread-notification-color": "Barva Nepřečtených upozornění", "theme-custom-css": "Vlastní CSS", "theme-font-body-font-family": "Font obsahu", - "There_are_no_agents_added_to_this_department_yet": "Neexistují žádní operátoři v tomto oddělení", + "There_are_no_agents_added_to_this_department_yet": "V tomto oddělení nejsou žádní operátoři", "There_are_no_applications": "Zatím nebyly přidány žádné aplikace oAuth.", "There_are_no_applications_installed": "V současné době nejsou nainstalovány žádné aplikace Rocket.Chat.", "There_are_no_integrations": "Neexistují žádná integrace", @@ -3253,6 +3329,8 @@ "Total_messages": "Celkem zpráv", "Total_Threads": "Celkový počet vláken", "Total_visitors": "Celkový počet návštěvníků", + "totp-invalid": "Kód nebo heslo nesouhlasí", + "TOTP Invalid [totp-invalid]": "Kód nebo heslo nesouhlasí", "Tourism": "Turistika", "Transcript_Enabled": "Zeptat se po skončení chatu, zda uživateli odeslat kopii konverzace", "Transcript_message": "Zpráva kterou zobrazit jako dotaz zda odeslat kopii konverzace", @@ -3266,15 +3344,18 @@ "Trigger_Words": "Klíčová slova", "Triggers": "Trigery", "True": "Ano", + "Troubleshoot_Disable_Notifications": "Zakázat notifikace", "Tuesday": "Úterý", "Turn_OFF": "Vypnout", "Turn_ON": "Zapnout", "Two Factor Authentication": "Dvoufázové ověření", "Two-factor_authentication": "Dvoufázové ověření", + "Two-factor_authentication_email": "Dvoufázové ověření pomocí Email", "Two-factor_authentication_disabled": "Dvoufázová ověření zakázáno", "Two-factor_authentication_enabled": "Dvoufázové ověření povoleno", "Two-factor_authentication_is_currently_disabled": "Dvoufázové ověření je momentálně zakázáno", "Two-factor_authentication_native_mobile_app_warning": "UPOZORNĚNÍ: Pokud povolíte dvoufázové ověření, nebudete se moci přihlásit přes nativní mobilní aplikace (Rocket.Chat+) dokud v těchto nebude 2FA implementována.", + "Two-factor_authentication_email_is_currently_disabled": "Dvoufázové ověření pomocí Emailu zakázáno", "Type": "Typ", "Type_your_email": "Zadejte svůj e-mail", "Type_your_job_title": "Zadejte svou pozici", @@ -3401,6 +3482,7 @@ "User_sent_a_message_to_you": "__username__ vám poslal zprávu", "user_sent_an_attachment": "__user__ poslal přílohu", "User_Settings": "Uživatelské nastavení", + "User_started_a_new_conversation": "__username__ zahájil/a konverzaci", "User_unmuted_by": "Uživatel __user_by__ zrušil ztlumení __user_unmuted__.", "User_unmuted_in_room": "Uživatel již není ztlumen", "User_updated_successfully": "Uživatel úspěšně aktualizován", @@ -3438,6 +3520,7 @@ "Username_wants_to_start_otr_Do_you_want_to_accept": "__username__ chce spustit OTR (konverzaci mimo záznam). Chcete ji přijmout?", "Users": "Uživatelé", "Users_added": "Uživatelé byli přidáni", + "Users_by_time_of_day": "Uživatelé k času dne", "Users_in_role": "Uživatelé v roli", "Users must use Two Factor Authentication": "Uživatelé musí používat dvoufaktorové ověření", "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "Pokud nechcete zobrazovat roli, ponechte pole popisu prázdné", @@ -3446,6 +3529,8 @@ "UTF8_Names_Slugify": "Url podoba UTF8 jmen", "UTF8_Names_Validation": "UTF8 validace jmen", "UTF8_Names_Validation_Description": "Regulární výraz validující uživatelská jména a jména místností", + "Value_messages": "__value__ zpráv", + "Value_users": "__value__ uživatelů", "Validate_email_address": "Validovat email", "Verification_email_body": "Úspěšně jste vytvořili účet na [Site_Name]. Kliknutím na tlačítko níže potvrďte svou e-mailovou adresu a dokončete registraci.", "Verification": "Ověření", @@ -3455,6 +3540,7 @@ "Verified": "Ověřený", "Verify": "Ověřit", "Verify_your_email": "Ověřte svůj email", + "Verify_your_email_for_the_code_we_sent": "Zadejte kód z emailu", "Version": "Verze", "Videos": "Videa", "Video Conference": "Video konference", @@ -3547,6 +3633,8 @@ "Welcome": "Vítej %s.", "Welcome_to": "Vítejte na __Site_Name__", "Welcome_to_the": "Vítejte v", + "Where_are_the_messages_being_sent?": "Kam se zprávy odesílají?", + "When_is_the_chat_busier?": "Kdy je nejvíce práce?", "Why_do_you_want_to_report_question_mark": "Proč chcete zprávu nahlásit?", "will_be_able_to": "bude moci", "Worldwide": "Celý svět", diff --git a/packages/rocketchat-i18n/i18n/cy.i18n.json b/packages/rocketchat-i18n/i18n/cy.i18n.json index 649ca83c73b2..e94beee1aaf7 100644 --- a/packages/rocketchat-i18n/i18n/cy.i18n.json +++ b/packages/rocketchat-i18n/i18n/cy.i18n.json @@ -1295,6 +1295,7 @@ "if_they_are_from": "(os ydynt o %s)", "If_this_email_is_registered": "Os yw'r e-bost hwn wedi'i gofrestru, byddwn yn anfon cyfarwyddiadau ar sut i ailosod eich cyfrinair. Os na chewch e-bost yn fuan, dewch yn ôl a cheisiwch eto.", "If_you_are_sure_type_in_your_password": "Os ydych chi'n siŵr deipio eich cyfrinair:", + "Members_List": "Rhestr Aelodau", "If_you_are_sure_type_in_your_username": "Os ydych chi'n siŵr, dechreuwch eich enw defnyddiwr:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Os nad oes gennych un, anfonwch e-bost at [omni@rocket.chat] (mailto: omni@rocket.chat) i gael eich un chi.", "Iframe_Integration": "Integreiddiad Iframe", @@ -1667,6 +1668,7 @@ "Mail_Message_No_messages_selected_select_all": "Nid ydych chi wedi dewis unrhyw negeseuon", "Mail_Messages": "Negeseuon Post", "Mail_Messages_Instructions": "Dewiswch ba negeseuon yr hoffech eu hanfon trwy e-bost trwy glicio ar y negeseuon", + "Room_uploaded_file_list": "Rhestr Ffeiliau", "Mail_Messages_Subject": "Dyma ddetholiad o negeseuon %s", "Mailer": "Mailer", "Mailer_body_tags": "Mae'n rhaid i chi ddefnyddio [dad-danysgrifio] ar gyfer y ddolen dadysgrifio.
Gallwch ddefnyddio [enw], [fname], [lname] ar gyfer enw llawn, enw cyntaf neu enw olaf y defnyddiwr, yn y drefn honno.
Gallwch ddefnyddio [e-bost] ar gyfer e-bost y defnyddiwr.", @@ -1708,7 +1710,6 @@ "Max_length_is": "Hyd mwyaf yw %s", "Media": "Cyfryngau", "Medium": "Canolig", - "Members_List": "Rhestr Aelodau", "mention-all": "Mudiad i gyd", "mention-all_description": "Caniatâd i ddefnyddio'r sôn am @all", "mention-here": "Cyfeiriwch yma", @@ -2200,7 +2201,6 @@ "Room_type_changed_successfully": "Newidiodd math o ystafelloedd yn llwyddiannus", "Room_type_of_default_rooms_cant_be_changed": "Mae hwn yn ystafell ddiofyn ac ni all y math gael ei newid, cysylltwch â'ch gweinyddwr.", "Room_unarchived": "Ystafell annisgwyl", - "Room_uploaded_file_list": "Rhestr Ffeiliau", "Room_uploaded_file_list_empty": "Dim ffeiliau ar gael.", "Rooms": "Ystafelloedd", "run-import": "Mewnforio Rhedeg", @@ -2555,6 +2555,7 @@ "Trigger_Words": "Geiriau Troi", "Triggers": "Twyllwyr", "True": "Gwir", + "Troubleshoot_Disable_Notifications": "Analluogi Hysbysiadau", "Tuesday": "Dydd Mawrth", "Turn_OFF": "Trowch i ODDI", "Turn_ON": "Trowch AR", diff --git a/packages/rocketchat-i18n/i18n/da.i18n.json b/packages/rocketchat-i18n/i18n/da.i18n.json index a853a1ec6bdd..04e7de148363 100644 --- a/packages/rocketchat-i18n/i18n/da.i18n.json +++ b/packages/rocketchat-i18n/i18n/da.i18n.json @@ -9,48 +9,52 @@ "2_Erros_Information_and_Debug": "2 - Fejl, information og fejlfinding", "@username": "@brugernavn", "@username_message": "@brugernavn ", - "__username__is_no_longer__role__defined_by__user_by_": "__username__ er ikke længere __role__ takket være __user_by__", - "__username__was_set__role__by__user_by_": "__username__ blev gjort til __role__ af __user_by__", + "__username__is_no_longer__role__defined_by__user_by_": "__username__ is no longer __role__ by __user_by__", + "__username__was_set__role__by__user_by_": "__username__ was set __role__ by __user_by__", "%_of_conversations": "% af samtaler", - "Accept": "Accepter", + "Accept": "Acceptér", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Accepter indgående livechat-anmodninger, selvom der ikke er online agenter", - "Accept_with_no_online_agents": "Accepter uden online agenter", + "Accept_new_livechats_when_agent_is_idle": "Accepter nye livechat-anmodninger via omnikanal, når agenten er ledig", + "Accept_with_no_online_agents": "Acceptér uden online agenter", "access-mailer": "Åbn mail-skærmen", "access-mailer_description": "Tilladelse til at sende masse-e-mails til alle brugere.", "access-permissions": "Åbn tilladelsesskærmen", "access-permissions_description": "Redigér tilladelser for forskellige roller.", - "Access_not_authorized": "Adgang ikke tilladt", - "Access_Token_URL": "Adgangstoken-url", - "Accessing_permissions": "Adgang til tilladelser", + "access-setting-permissions": "Redigér indstillingsbaserede rettigheder", + "Access_not_authorized": "Adgang ikke godkendt", + "Access_Token_URL": "Adgangstoken-URL", + "Accessing_permissions": "Tilgår tilladelser", "Account_SID": "Konto-SID", "Accounts": "Konti", - "Accounts_Admin_Email_Approval_Needed_Default": "

Brugeren [navn] ([email]) er blevet registreret.

Vær venlig at aktivere eller slette denne bruger under \"Administration -> Brugere\".

", + "Accounts_Admin_Email_Approval_Needed_Default": "

Brugeren [name] ([email]) er blevet registreret.

Vær venlig at aktivere eller slette denne bruger under \"Administration -> Brugere\".

", "Accounts_Admin_Email_Approval_Needed_Subject_Default": "En ny bruger har registreret sig og har brug for godkendelse", "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

Brugeren [navn] ([email]) er blevet registreret.

Årsag: [reason]

Vær venlig at aktivere eller slette denne bruger under \"Administration -> Brugere\".

", "Accounts_AllowAnonymousRead": "Tillad anonym læsning", "Accounts_AllowAnonymousWrite": "Tillad anonym skrivning", - "Accounts_AllowDeleteOwnAccount": "Lad brugere slette deres egen konto", + "Accounts_AllowDeleteOwnAccount": "Tillad brugere at slette deres egen konto", "Accounts_AllowedDomainsList": "Liste over tilladte domæner", "Accounts_AllowedDomainsList_Description": "Kommasepareret liste over tilladte domæner", "Accounts_AllowEmailChange": "Tillad ændring af e-mail", + "Accounts_AllowEmailNotifications": "Tillad e-mail-notifikationer", "Accounts_AllowPasswordChange": "Tillad adgangskodeændring", "Accounts_AllowRealNameChange": "Tillad navneændring", - "Accounts_AllowUserAvatarChange": "Tillad, at brugerne skifter avatar", + "Accounts_AllowUserAvatarChange": "Tillad at brugerne skifter avatar", "Accounts_AllowUsernameChange": "Tillad brugernavneændring", "Accounts_AllowUserProfileChange": "Tillad ændring af brugerprofil", + "Accounts_AllowUserStatusMessageChange": "Tillad brugerdefinerede statusmeddelelse", "Accounts_AvatarBlockUnauthenticatedAccess": "Blokér uautoriseret adgang til avatarer", "Accounts_AvatarCacheTime": "Cache-tid for avatarer", "Accounts_AvatarCacheTime_description": "Antal sekunder, som http-protokollen bliver bedt om at cache avatarbillederne.", "Accounts_AvatarResize": "Ændre størrelsen på avatarer", "Accounts_AvatarSize": "Avatar-størrelse", - "Accounts_AvatarExternalProviderUrl": "Ekstern leverandør-url for avatar", + "Accounts_AvatarExternalProviderUrl": "Ekstern leverandør-URL for avatar", "Accounts_AvatarExternalProviderUrl_Description": "Eksempel: `https://acme.com/api/v1/{username}`", "Accounts_BlockedDomainsList": "Liste over blokerede domæner", "Accounts_BlockedDomainsList_Description": "Kommasepareret liste over blokerede domæner", "Accounts_BlockedUsernameList": "Liste over blokerede brugernavne", "Accounts_BlockedUsernameList_Description": "Kommasepareret liste over blokerede brugernavne (der er ikke forskel på store og små bogstaver)", "Accounts_CustomFields_Description": "Skal være gyldigt JSON, hvor nøgler er feltnavne, der indeholder en ordbog med feltindstillinger. Eksempel:
{\n\"role\": {\n\"type\": \"select\",\n\"defaultValue\": \"student\",\n\"options\": [\"lærer\", \"studerende\"],\n\"required\": true,\n\"modifyRecordField\": {\n\"array\": true,\n\"felt\": \"roller\"\n}\n},\n\"twitter\": {\n\"type\": \"text\",\n\"required\": sandt,\n\"minLength\": 2,\n\"maxLength\": 10\n}\n}", - "Accounts_CustomFieldsToShowInUserInfo": "Brugerdefinerede felter, der skal vises i brugerinfo", + "Accounts_CustomFieldsToShowInUserInfo": "Brugerdefinerede felter der skal vises i brugerinfo", "Accounts_Default_User_Preferences": "Standard-brugerindstillinger", "Accounts_Default_User_Preferences_audioNotifications": "Standardlyd for lydnotifikationer", "Accounts_Default_User_Preferences_desktopNotifications": "Standardbesked for skrivebordsnotifikationer", @@ -69,15 +73,16 @@ "Accounts_EmailVerification_Description": "Sørg for, at du har korrekte SMTP-indstillinger for at bruge denne funktion", "Accounts_Enrollment_Email_Subject_Default": "Velkommen til [Site_Name]", "Accounts_Enrollment_Email": "Tilmeldings-e-mail", - "Accounts_Enrollment_Email_Description": "Du kan bruge følgende pladsholdere:
  • [name], [fname], [lname] for henholdsvis brugerens fulde navn, fornavn og efternavn.
  • [email] for brugerens e-mail.
  • [Site_Name] og [Site_URL] for henholdsvis applikationsnavn og url.
", - "Accounts_ForgetUserSessionOnWindowClose": "Glem brugersessionen, når vinduet lukkes", + "Accounts_Enrollment_Email_Description": "Du kan bruge følgende pladsholdere:
  • [name], [fname], [lname] for henholdsvis brugerens fulde navn, fornavn og efternavn.
  • [email] for brugerens e-mail.
  • [Site_Name] og [Site_URL] for henholdsvis applikationsnavn og URL.
", + "Accounts_ForgetUserSessionOnWindowClose": "Glem brugersession når vinduet lukkes", "Accounts_Iframe_api_method": "API-metode", - "Accounts_Iframe_api_url": "API-url", + "Accounts_Iframe_api_url": "API-URL", "Accounts_iframe_enabled": "Aktiveret", - "Accounts_iframe_url": "Iframe-url", - "Accounts_LoginExpiration": "Login udløber efter så mange dage", + "Accounts_iframe_url": "Iframe-URL", + "Accounts_LoginExpiration": "Login-udløb i dage", "Accounts_ManuallyApproveNewUsers": "Nye brugere skal godkendes manuelt", "Accounts_OAuth_Custom_Authorize_Path": "Autorisationssti", + "Accounts_OAuth_Custom_Avatar_Field": "Avatar felt", "Accounts_OAuth_Custom_Button_Color": "Farve på knap", "Accounts_OAuth_Custom_Button_Label_Color": "Tekstfarve på knap", "Accounts_OAuth_Custom_Button_Label_Text": "Tekst på knap", @@ -87,87 +92,95 @@ "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "Identitets-token sendt via", "Accounts_OAuth_Custom_Login_Style": "Loginstil", "Accounts_OAuth_Custom_Merge_Users": "Sammenflet brugere", + "Accounts_OAuth_Custom_Access_Token_Param": "Parameternavn for adgangs-token", "Accounts_OAuth_Custom_Scope": "Anvendelsesområde", - "Accounts_OAuth_Custom_Secret": "Hemmelighed", + "Accounts_OAuth_Custom_Secret": "Secret", + "Accounts_OAuth_Custom_Show_Button_On_Login_Page": "Vis knap på login-siden", "Accounts_OAuth_Custom_Token_Path": "Tokensti", "Accounts_OAuth_Custom_Token_Sent_Via": "Token sendt via", "Accounts_OAuth_Custom_Username_Field": "Brugernavnefelt", - "Accounts_OAuth_Custom_Roles_Claim": "Roller / Grupper feltnavn", + "Accounts_OAuth_Custom_Name_Field": "Navnefelt", + "Accounts_OAuth_Custom_Roles_Claim": "Feltnavn for Roller/Grupper", + "Accounts_OAuth_Custom_Merge_Roles": "Flet roller fra SSO", "Accounts_OAuth_Drupal": "Drupal-login aktiveret", - "Accounts_OAuth_Drupal_callback_url": "Omdirigerings-uri for Drupals oAuth2", - "Accounts_OAuth_Drupal_id": "Klient-id for Drupals oAuth2", - "Accounts_OAuth_Drupal_secret": "Klienthemmelighed for Drupals oAuth2", + "Accounts_OAuth_Drupal_callback_url": "Omdirigerings-URI for Drupals oAuth2", + "Accounts_OAuth_Drupal_id": "Klient-Id for Drupals oAuth2", + "Accounts_OAuth_Drupal_secret": "Klient-secret for Drupals oAuth2", "Accounts_OAuth_Facebook": "Facebook-login", - "Accounts_OAuth_Facebook_callback_url": "Tilbagekalds-url for Facebook", - "Accounts_OAuth_Facebook_id": "Facebooks app-id", - "Accounts_OAuth_Facebook_secret": "Facebook-hemmelighed", + "Accounts_OAuth_Facebook_callback_url": "Tilbagekalds-URL for Facebook", + "Accounts_OAuth_Facebook_id": "Facebooks app-Id", + "Accounts_OAuth_Facebook_secret": "Facebook-secret", "Accounts_OAuth_Github": "OAuth aktiveret", "Accounts_OAuth_Github_callback_url": "Tilbagekalds-url for Github", "Accounts_OAuth_GitHub_Enterprise": "OAuth aktiveret", - "Accounts_OAuth_GitHub_Enterprise_callback_url": "Tilbagekalds-url for GitHub Enterprise", - "Accounts_OAuth_GitHub_Enterprise_id": "Klient-id", - "Accounts_OAuth_GitHub_Enterprise_secret": "Klienthemmelighed", - "Accounts_OAuth_Github_id": "Klient-id", - "Accounts_OAuth_Github_secret": "Klienthemmelighed", + "Accounts_OAuth_GitHub_Enterprise_callback_url": "Tilbagekalds-URL for GitHub Enterprise", + "Accounts_OAuth_GitHub_Enterprise_id": "Klient-Id", + "Accounts_OAuth_GitHub_Enterprise_secret": "Klient-secret", + "Accounts_OAuth_Github_id": "Klient-Id", + "Accounts_OAuth_Github_secret": "Klient-secret", "Accounts_OAuth_Gitlab": "OAuth aktiveret", - "Accounts_OAuth_Gitlab_callback_url": "Tilbagekalds-url for GitLab", - "Accounts_OAuth_Gitlab_id": "GitLab-id", + "Accounts_OAuth_Gitlab_callback_url": "Tilbagekalds-URLfor GitLab", + "Accounts_OAuth_Gitlab_id": "GitLab-Id", "Accounts_OAuth_Gitlab_identity_path": "Identitetssti", - "Accounts_OAuth_Gitlab_secret": "Klienthemmelighed", + "Accounts_OAuth_Gitlab_merge_users": "Flet brugere", + "Accounts_OAuth_Gitlab_secret": "Klient-secret", "Accounts_OAuth_Google": "Google-login", - "Accounts_OAuth_Google_callback_url": "Tilbagekalds-url for Google", - "Accounts_OAuth_Google_id": "Google-id", - "Accounts_OAuth_Google_secret": "Google-hemmelighed", + "Accounts_OAuth_Google_callback_url": "Tilbagekalds-URL for Google", + "Accounts_OAuth_Google_id": "Google-Id", + "Accounts_OAuth_Google_secret": "Google-secret", "Accounts_OAuth_Linkedin": "LinkedIn-login", - "Accounts_OAuth_Linkedin_callback_url": "Tilbagekalds-url for LinkedIn", - "Accounts_OAuth_Linkedin_id": "LinkedIn-id", - "Accounts_OAuth_Linkedin_secret": "LinkedIn-hemmelighed", + "Accounts_OAuth_Linkedin_callback_url": "Tilbagekalds-URLfor LinkedIn", + "Accounts_OAuth_Linkedin_id": "LinkedIn-Id", + "Accounts_OAuth_Linkedin_secret": "LinkedIn-secret", "Accounts_OAuth_Meteor": "Meteor-login", - "Accounts_OAuth_Meteor_callback_url": "Tilbagekalds-url for Meteor", - "Accounts_OAuth_Meteor_id": "Meteor-id", - "Accounts_OAuth_Meteor_secret": "Meteor-hemmelighed", + "Accounts_OAuth_Meteor_callback_url": "Tilbagekalds-URL for Meteor", + "Accounts_OAuth_Meteor_id": "Meteor-Id", + "Accounts_OAuth_Meteor_secret": "Meteor-secret", "Accounts_OAuth_Nextcloud": "OAuth aktiveret", - "Accounts_OAuth_Nextcloud_secret": "Klienthemmelighed", + "Accounts_OAuth_Nextcloud_callback_url": "Tilbagekalds-URL for Nextcloud", + "Accounts_OAuth_Nextcloud_id": "Nextcloud-Id", + "Accounts_OAuth_Nextcloud_secret": "Klient-secret", + "Accounts_OAuth_Nextcloud_URL": "Server-URL til Nexcloud", "Accounts_OAuth_Proxy_host": "Proxy-vært", "Accounts_OAuth_Proxy_services": "Proxy-tjenester", "Accounts_OAuth_Tokenpass": "Tokenpass-login", - "Accounts_OAuth_Tokenpass_callback_url": "Tilbagekalds-url for Tokenpass", - "Accounts_OAuth_Tokenpass_id": "Tokenpass-id", - "Accounts_OAuth_Tokenpass_secret": "Tokenpass-hemmelighed", + "Accounts_OAuth_Tokenpass_callback_url": "Tilbagekalds-URL for Tokenpass", + "Accounts_OAuth_Tokenpass_id": "Tokenpass-Id", + "Accounts_OAuth_Tokenpass_secret": "Tokenpass-secret", "Accounts_OAuth_Twitter": "Twitter-login", - "Accounts_OAuth_Twitter_callback_url": "Tilbagekalds-url for Twitter", - "Accounts_OAuth_Twitter_id": "Twitter-id", - "Accounts_OAuth_Twitter_secret": "Twitter-hemmelighed", + "Accounts_OAuth_Twitter_callback_url": "Tilbagekalds-URL for Twitter", + "Accounts_OAuth_Twitter_id": "Twitter-Id", + "Accounts_OAuth_Twitter_secret": "Twitter-secret", "Accounts_OAuth_Wordpress": "WordPress-login", "Accounts_OAuth_Wordpress_authorize_path": "Autorisationssti", - "Accounts_OAuth_Wordpress_callback_url": "Tilbagekalds-url for Wordpress", - "Accounts_OAuth_Wordpress_id": "WordPress-id", + "Accounts_OAuth_Wordpress_callback_url": "Tilbagekalds-URL for Wordpress", + "Accounts_OAuth_Wordpress_id": "WordPress-Id", "Accounts_OAuth_Wordpress_identity_path": "Identitetssti", "Accounts_OAuth_Wordpress_identity_token_sent_via": "Identitets-token sendt via", "Accounts_OAuth_Wordpress_scope": "Anvendelsesområde", - "Accounts_OAuth_Wordpress_secret": "WordPress-hemmelighed", + "Accounts_OAuth_Wordpress_secret": "WordPress-secret", "Accounts_OAuth_Wordpress_server_type_custom": "Brugerdefineret", "Accounts_OAuth_Wordpress_server_type_wordpress_com": "Wordpress.com", "Accounts_OAuth_Wordpress_server_type_wp_oauth_server": "WP OAuth-serverplugin", "Accounts_OAuth_Wordpress_token_path": "Tokensti", "Accounts_Password_Policy_AtLeastOneLowercase": "Mindst et lille bogstav", - "Accounts_Password_Policy_AtLeastOneLowercase_Description": "Sørg for, at et kodeord indeholde mindst et lille bogstav.", + "Accounts_Password_Policy_AtLeastOneLowercase_Description": "Kræv at et kodeord indeholder mindst et lille bogstav.", "Accounts_Password_Policy_AtLeastOneNumber": "Mindst et tal", - "Accounts_Password_Policy_AtLeastOneNumber_Description": "Sørg for, at en adgangskode indeholder mindst et numerisk tegn.", - "Accounts_Password_Policy_AtLeastOneSpecialCharacter": "Ved mindst et symbol", - "Accounts_Password_Policy_AtLeastOneSpecialCharacter_Description": "Sørg for, at en adgangskode indeholder mindst ét specialtegn.", + "Accounts_Password_Policy_AtLeastOneNumber_Description": "Kræv at en adgangskode indeholder mindst et numerisk tegn.", + "Accounts_Password_Policy_AtLeastOneSpecialCharacter": "Mindst et symbol", + "Accounts_Password_Policy_AtLeastOneSpecialCharacter_Description": "Kræv at en adgangskode indeholder mindst ét specialtegn.", "Accounts_Password_Policy_AtLeastOneUppercase": "Mindst et stort bogstav", - "Accounts_Password_Policy_AtLeastOneUppercase_Description": "Sørg for, at et kodeord indeholde mindst et lille bogstav.", + "Accounts_Password_Policy_AtLeastOneUppercase_Description": "Kræv at et kodeord indeholder mindst et lille bogstav.", "Accounts_Password_Policy_Enabled": "Aktivér adgangskoderegler", "Accounts_Password_Policy_Enabled_Description": "Når det er aktiveret, skal brugernes adgangskoder overholde reglerne deri. Bemærk: Dette gælder kun for nye adgangskoder, ikke for eksisterende.", "Accounts_Password_Policy_ForbidRepeatingCharacters": "Forbyd gentagne tegn", - "Accounts_Password_Policy_ForbidRepeatingCharacters_Description": "Sikrer, at adgangskoder ikke gentager det samme tegn lige efter hinanden.", + "Accounts_Password_Policy_ForbidRepeatingCharacters_Description": "Sikrer at adgangskoder ikke gentager det samme tegn lige efter hinanden.", "Accounts_Password_Policy_ForbidRepeatingCharactersCount": "Maksimalt antal gentagne tegn", "Accounts_Password_Policy_ForbidRepeatingCharactersCount_Description": "Det antal gange, et tegn kan gentages, før det forbydes.", "Accounts_Password_Policy_MaxLength": "Maksimumlængde", - "Accounts_Password_Policy_MaxLength_Description": "Sikrer, at adgangskoder har højst dette antal tegn. Brug \"-1\" for at deaktivere.", + "Accounts_Password_Policy_MaxLength_Description": "Sikrer at adgangskoder har højst dette antal tegn. Brug \"-1\" for at deaktivere.", "Accounts_Password_Policy_MinLength": "Minimumlængde", - "Accounts_Password_Policy_MinLength_Description": "Sikrer, at adgangskoder har mindst dette antal tegn. Brug \"-1\" for at deaktivere.", + "Accounts_Password_Policy_MinLength_Description": "Sikrer at adgangskoder har mindst dette antal tegn. Brug \"-1\" for at deaktivere.", "Accounts_PasswordReset": "Nulstil kodeord", "Accounts_Registration_AuthenticationServices_Default_Roles": "Standardroller til godkendelsestjenester", "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "Standardroller (kommaseparerede), som brugere får, når de tilmelder sig via godkendelsestjenester", @@ -179,6 +192,9 @@ "Accounts_RegistrationForm_Secret_URL": "Hemmelig url", "Accounts_RegistrationForm_SecretURL": "Hemmelig url for tilmeldingsblanket", "Accounts_RegistrationForm_SecretURL_Description": "Du skal angive en tilfældig streng, som vil blive tilføjet til din registrerings-url. Eksempel: https://open.rocket.chat/register/[secret_hash]", + "Accounts_Registration_InviteUrlType": "Typen af invitations-URL", + "Accounts_Registration_InviteUrlType_Direct": "Direkte", + "Accounts_Registration_InviteUrlType_Proxy": "Proxy", "Accounts_RequireNameForSignUp": "Navn er obligatorisk for tilmelding", "Accounts_RequirePasswordConfirmation": "Kræv kodeordsbekræftelse", "Accounts_SearchFields": "Felter, der skal medtages i søgning", @@ -187,16 +203,33 @@ "Accounts_Directory_DefaultView": "Standardvisning for vejviseren", "Accounts_SetDefaultAvatar": "Vælg standardavatar", "Accounts_SetDefaultAvatar_Description": "Forsøger at finde en standardavatar baseret på OAuth-konto eller Gravatar", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "Sæt e-mail for ekstern konto som verificeret", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "Konti oprettet fra eksterne tjenester, såsom LDAP, OAth osv., får automatisk deres e-mails verificeret", "Accounts_ShowFormLogin": "Vis standardformular for login", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "Aktivér to-faktor-godkendelse via e-mail", + "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Brugere med e-mail verificeret og indstillingen aktiveret på deres profilside, vil modtage en e-mail med en midlertidig kode til at autorisere handlinger såsom login, gemme profil osv.", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Tilmeld nye brugere automatisk til to-faktor via e-mail", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Nye brugere har som standard to-faktor-godkendelse via e-mail aktiveret. De vil være i stand til at deaktivere det på deres profilside.", + "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Udløbstid i sekunder for koden sendt via e-mail", "Accounts_TwoFactorAuthentication_Enabled": "Aktivér tofaktorgodkendelse", + "Accounts_TwoFactorAuthentication_Enabled_Description": "Brugere kan konfigurere deres to-faktor-godkendelse ved hjælp af en hvilken som helst TOTP-app, f.eks. Google Authenticator eller Authy", "Accounts_TwoFactorAuthentication_MaxDelta": "Maksimalt delta", "Accounts_UserAddedEmail_Default": "

Velkommen til [Site_Name]

Gå til [Site_URL] for at prøve den bedste open source-chatløsning, du kan få!

Du kan logge ind med din e-mail: [email] og kodeordet: [password]. Du skal måske ændre det efter dit første login.", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "Det maksimale delta afgør, hvor mange tokens der er gyldige på et givent tidspunkt. Tokens genereres hvert 30. sekund og er gyldige i (30 * maksimalt delta) sekunder.
Eksempel: Med et maksimalt delta på 10 kan hvert tegn bruges op til 300 sekunder før eller efter sit tidsstempel. Dette er nyttigt, når klientens ur ikke er korrekt synkroniseret med serveren.", + "Accounts_TwoFactorAuthentication_RememberFor": "Husk to-faktor i (sekunder)", + "Accounts_TwoFactorAuthentication_RememberFor_Description": "Anmod ikke om to-faktor-godkendelses-kode, hvis den allerede blev leveret før det givne tidspunkt.", "Accounts_UseDefaultBlockedDomainsList": "Brug en standardliste over blokerede domæner", "Accounts_UseDNSDomainCheck": "Brug DNS-domænetjek", "Accounts_UserAddedEmailSubject_Default": "Du er blevet føjet til [Site_Name]", "Accounts_UserAddedEmail_Description": "Du kan bruge følgende pladsholdere:

  • [navn], [fname] eller [lname] for brugerens fulde navn, fornavn eller efternavn.
  • [email] for brugerens e-mail.
  • [password] for brugerens adgangskode.
  • [Site_Name] og [Site_URL] for henholdsvis applikationsnavn og url.
", "Activate": "Aktiver", + "Active_users": "Aktive brugere", + "Daily_Active_Users": "Aktive brugere dagligt", + "Weekly_Active_Users": "Aktive brugere ugentligt", + "Monthly_Active_Users": "Aktive brugere månedsvis", + "DAU_value": "DAU __value__", + "WAU_value": "WAU __value__", + "MAU_value": "MAU __value__", "Activity": "Aktivitet", "Add": "Tilføj", "add-oauth-service": "Tilføj OAuth-tjeneste", @@ -213,6 +246,7 @@ "Add_custom_oauth": "Tilføj brugerdefineret OAuth", "Add_Domain": "Tilføj domæne", "Add_files_from": "Tilføj filer fra", + "add-livechat-department-agents": "Tilføj omni-kanal-agenter til afdelinger", "Add_manager": "Tilføj manager", "Add_Role": "Tilføj rolle", "Add_user": "Tilføj bruger", @@ -253,6 +287,7 @@ "Allow_Invalid_SelfSigned_Certs_Description": "Tillad ugyldige og selvtegnede SSL-certifikater til godkendelse og forhåndsvisning af links.", "Allow_switching_departments": "Tillad besøgende at skifte afdeling", "Allow_Marketing_Emails": "Tillad markedsførings-mails", + "Allow_Online_Agents_Outside_Office_Hours": "Tillad online-agenter uden for kontortid", "Almost_done": "Næsten færdig", "Alphabetical": "Alfabetisk", "Always_open_in_new_window": "Åbn altid i nyt vindue", @@ -393,7 +428,7 @@ "AutoTranslate_APIKey": "API nøgle", "AutoTranslate_Change_Language_Description": "Ændring af automatisk oversættelsessprog oversætter ikke tidligere meddelelser.", "AutoTranslate_Enabled": "Aktivér Auto-Translate", - "AutoTranslate_Enabled_Description": "Aktivering af automatisk oversættelse gør det muligt for folk med automatisk at oversættetilladelse til at få alle meddelelser automatisk oversat til deres valgte sprog. Gebyrer kan være gældende, se Googles dokumentation", + "AutoTranslate_Enabled_Description": "Aktivering af automatisk oversættelse gør det muligt for folk med autooversættelse rettigheder til at få alle meddelelser automatisk oversat til deres valgte sprog. Gebyrer kan blive påført.", "Available": "tilgængelig", "Available_agents": "Tilgængelige agenter", "Avatar": "Avatar", @@ -1373,6 +1408,7 @@ "if_they_are_from": "(hvis de er fra %s)", "If_this_email_is_registered": "Hvis denne email er registreret, sender vi instruktioner om, hvordan du nulstiller din adgangskode. Hvis du ikke modtager en e-mail inden for kort tid, kan du komme tilbage og prøve igen.", "If_you_are_sure_type_in_your_password": "Hvis du er sikker, indtast dit kodeord:", + "Members_List": "Medlemsliste", "If_you_are_sure_type_in_your_username": "Hvis du er sikker, indtast dit brugernavn:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Hvis du ikke har en, send en mail til [omni@rocket.chat] (mailto: omni@rocket.chat) for at få din.", "Iframe_Integration": "Iframe Integration", @@ -1765,6 +1801,7 @@ "Mail_Message_No_messages_selected_select_all": "Du har ikke valgt nogen meddelelser", "Mail_Messages": "Mail Beskeder", "Mail_Messages_Instructions": "Vælg hvilke meddelelser du vil sende via e-mail ved at klikke på meddelelserne", + "Room_uploaded_file_list": "Filliste", "Mail_Messages_Subject": "Her er en udvalgt del af%s meddelelser", "Mailer": "Mailer", "Mailer_body_tags": "Du skal bruge [unsubscribe] til abonnementet.
Du kan muligvis bruge [navn], [fname], [lname] for brugerens fulde navn, fornavn eller efternavn.
Du kan bruge [email] til brugerens e-mail.", @@ -1807,7 +1844,6 @@ "Max_length_is": "Maks længde er%s", "Media": "Medier", "Medium": "Medium", - "Members_List": "Medlemsliste", "mention-all": "Nævne alt", "mention-all_description": "Tilladelse til at bruge @all mention", "mention-here": "Nævne her", @@ -2297,7 +2333,7 @@ "RetentionPolicyRoom_FilesOnly": "Beskær kun filer, hold meddelelser", "RetentionPolicyRoom_MaxAge": "Maksimal meddelelsesalder i dage (standard: __max__)", "RetentionPolicyRoom_OverrideGlobal": "Overstyr global retention politik", - "RetentionPolicyRoom_ReadTheDocs": "Pas på! At klare disse indstillinger uden yderste omhu kan ødelægge al meddelelseshistorik. Læs venligst dokumentationen, før du aktiverer funktionen her.", + "RetentionPolicyRoom_ReadTheDocs": "OBS! justering af disse indstillinger uden den yderste omhu, kan slette al meddelelseshistorik. Læs venligst dokumentationen før du aktiverer funktionen her.", "Retry_Count": "Prøv igen", "Robot_Instructions_File_Content": "Indhold af robots.txt-fil", "Role": "Rolle", @@ -2331,7 +2367,6 @@ "Room_type_changed_successfully": "Værelsestype er ændret", "Room_type_of_default_rooms_cant_be_changed": "Dette er et standardrum, og typen kan ikke ændres. Kontakt venligst din administrator.", "Room_unarchived": "Værelse unarchived", - "Room_uploaded_file_list": "Filliste", "Room_uploaded_file_list_empty": "Ingen tilgængelige filer.", "Rooms": "Værelser", "run-import": "Kør import", @@ -2686,6 +2721,7 @@ "Trigger_Words": "Trigger Words", "Triggers": "triggers", "True": "Sandt", + "Troubleshoot_Disable_Notifications": "Deaktiver notifikationer", "Tuesday": "tirsdag", "Turn_OFF": "Sluk", "Turn_ON": "Tænde for", diff --git a/packages/rocketchat-i18n/i18n/de-AT.i18n.json b/packages/rocketchat-i18n/i18n/de-AT.i18n.json index 1313ad50f1a8..523abbd1db5a 100644 --- a/packages/rocketchat-i18n/i18n/de-AT.i18n.json +++ b/packages/rocketchat-i18n/i18n/de-AT.i18n.json @@ -1302,6 +1302,7 @@ "if_they_are_from": "(wenn sie von %s sind)", "If_this_email_is_registered": "Wenn diese E-Mail registriert ist, senden wir Ihnen Anweisungen zum Zurücksetzen Ihres Passworts. Wenn Sie in Kürze keine E-Mail erhalten, kommen Sie bitte zurück und versuchen Sie es erneut.", "If_you_are_sure_type_in_your_password": "Wenn Sie sich sicher sind, geben Sie ihr Passwort ein.", + "Members_List": "Mitglieder", "If_you_are_sure_type_in_your_username": "Wenn Sie sich sicher sind, geben Sie Ihren Benutzernamen ein:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Wenn Sie keine haben, senden Sie eine E-Mail an [omni@rocket.chat] (mailto: omni@rocket.chat), um Ihre zu erhalten.", "Iframe_Integration": "Iframe-Integration", @@ -1674,6 +1675,7 @@ "Mail_Message_No_messages_selected_select_all": "Sie haben keine Nachrichten ausgewählt.", "Mail_Messages": "Nachrichten per E-Mail senden", "Mail_Messages_Instructions": "Wählen Sie aus, welche Nachrichten Sie per E-Mail senden möchten, indem Sie die Nachrichten anklicken. ", + "Room_uploaded_file_list": "Dateien", "Mail_Messages_Subject": "Hier ist ein ausgewählter Teil aus %s Nachrichten", "Mailer": "Mailer", "Mailer_body_tags": "Sie müssen [unsubscribe] verwenden, um einen Link zum Abmelden aus dem Verteiler zur Verfügung zu stellen.
Sie können [name] für den Vor- und Nachnamen, [fname] für den Vornamen oder [lname] für den Nachnamen des Benutzers verwenden.
Ebenfalls können Sie [email] verwenden, um die E-Mail-Adresse des Benutzers anzugeben.", @@ -1715,7 +1717,6 @@ "Max_length_is": "Maximale Länge ist%s", "Media": "Medien", "Medium": "Mittel", - "Members_List": "Mitglieder", "mention-all": "Erwähnen Sie alle", "mention-all_description": "Erlaubnis, die @all Erwähnung zu verwenden", "mention-here": "Erwähnen Sie hier", @@ -2208,7 +2209,6 @@ "Room_type_changed_successfully": "Der Raumtyp wurde erfolgreich geändert.", "Room_type_of_default_rooms_cant_be_changed": "Dies ist ein Standardraum und der Typ kann nicht geändert werden. Bitte wenden Sie sich an Ihren Administrator.", "Room_unarchived": "Der Raum wurde wiederhergestellt.", - "Room_uploaded_file_list": "Dateien", "Room_uploaded_file_list_empty": "Es wurden noch keine Dateien hochgeladen.", "Rooms": "Räume", "run-import": "Führen Sie den Import aus", @@ -2564,6 +2564,7 @@ "Trigger_Words": "Trigger Words", "Triggers": "Auslöser", "True": "Ja", + "Troubleshoot_Disable_Notifications": "Benachrichtigungen ausschalten", "Tuesday": "Dienstag", "Turn_OFF": "Abschalten", "Turn_ON": "Anmachen", diff --git a/packages/rocketchat-i18n/i18n/de.i18n.json b/packages/rocketchat-i18n/i18n/de.i18n.json index df895432c5e4..8c6eee319cbb 100644 --- a/packages/rocketchat-i18n/i18n/de.i18n.json +++ b/packages/rocketchat-i18n/i18n/de.i18n.json @@ -1637,6 +1637,7 @@ "if_they_are_from": "(wenn sie von %s sind)", "If_this_email_is_registered": "Wenn es sich um eine registrierte E-Mail-Adresse handelt, werden wir an diese eine Anleitung zum Zurücksetzen des Passworts senden. Sollten Sie in Kürzen keine E-Mail erhalten, kommen Sie wieder und versuchen Sie es noch einmal.", "If_you_are_sure_type_in_your_password": "Wenn Sie sich sicher sind, geben Sie Ihr Passwort ein:", + "Members_List": "Mitglieder", "If_you_are_sure_type_in_your_username": "Wenn Sie sich sicher sind, geben Sie Ihren Benutzernamen ein:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Wenn Sie keine haben, senden Sie eine E-Mail an [omni@rocket.chat] (mailto: omni@rocket.chat), um Ihre zu erhalten.", "If_you_didnt_ask_for_reset_ignore_this_email": "Wenn Sie das Zurücksetzen des Kennworts nicht angefordert haben, können Sie diese E-Mail ignorieren.", @@ -2100,6 +2101,7 @@ "Mail_Message_No_messages_selected_select_all": "Sie haben keine Nachrichten ausgewählt. ", "Mail_Messages": "Nachrichten per E-Mail senden", "Mail_Messages_Instructions": "Wählen Sie die per E-Mail zu versendenden Nachrichten aus, indem Sie die Nachrichten anklicken.", + "Room_uploaded_file_list": "Dateien", "Mail_Messages_Subject": "Hier ist ein ausgewählter Teil aus %s Nachrichten", "Mailer": "Mailer", "Mailer_body_tags": "Sie müssen [unsubscribe] verwenden, um einen Link zum Abmelden aus dem Verteiler zur Verfügung zu stellen.
Sie können [name] für den vollständigen Namen, [fname] für den Vornamen oder [lname] für den Nachnamen des Benutzers verwenden.
Ebenfalls können Sie [email] verwenden, um die E-Mail-Adresse des Benutzers anzugeben.", @@ -2166,7 +2168,6 @@ "Maximum": "Maximum", "Media": "Medien", "Medium": "Normal", - "Members_List": "Mitglieder", "mention-all": "Alle erwähnen", "mention-all_description": "Berechtigung, @all zur Erwähnung aller Kanalmitglieder zu verwenden", "mention-here": "Hier erwähnen", @@ -2768,7 +2769,6 @@ "Room_type_changed_successfully": "Der Raumtyp wurde erfolgreich geändert", "Room_type_of_default_rooms_cant_be_changed": "Das ist ein Standardraum, dessen Typ nicht geändert werden kann. Bitte sprechen Sie mit Ihrem Administrator", "Room_unarchived": "Der Raum wurde aus dem Archiv geholt", - "Room_uploaded_file_list": "Dateien", "Room_uploaded_file_list_empty": "Es wurden noch keine Dateien hochgeladen", "Rooms": "Räume", "Routing": "Routing", @@ -3227,6 +3227,7 @@ "Trigger_Words": "Trigger-Wörter", "Triggers": "Trigger", "True": "Ja", + "Troubleshoot_Disable_Notifications": "Benachrichtigungen deaktivieren", "Tuesday": "Dienstag", "Turn_OFF": "Deaktivieren", "Turn_ON": "Aktivieren", diff --git a/packages/rocketchat-i18n/i18n/el.i18n.json b/packages/rocketchat-i18n/i18n/el.i18n.json index 7d915d1c4cb3..05c4e635cfe1 100644 --- a/packages/rocketchat-i18n/i18n/el.i18n.json +++ b/packages/rocketchat-i18n/i18n/el.i18n.json @@ -1304,6 +1304,7 @@ "if_they_are_from": "(αν είναι από %s)", "If_this_email_is_registered": "Αν αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου είναι καταχωρημένο, θα στείλουμε οδηγίες σχετικά με τον τρόπο επαναφοράς του κωδικού πρόσβασής σας. Εάν δεν λάβετε σύντομα ένα μήνυμα ηλεκτρονικού ταχυδρομείου, επιστρέψτε και δοκιμάστε ξανά.", "If_you_are_sure_type_in_your_password": "Εάν είστε βέβαιοι πληκτρολογήστε τον κωδικό σας:", + "Members_List": "Λίστα μελών", "If_you_are_sure_type_in_your_username": "Εάν είστε βέβαιοι πληκτρολογήστε το όνομα χρήστη σας:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Αν δεν έχετε κάποιο, στείλτε ένα μήνυμα ηλεκτρονικού ταχυδρομείου στο [omni@rocket.chat] (mailto: omni@rocket.chat) για να το κάνετε.", "Iframe_Integration": "Ενσωμάτωση iframe", @@ -1676,6 +1677,7 @@ "Mail_Message_No_messages_selected_select_all": "Δεν έχετε επιλέξει κανένα μήνυμα", "Mail_Messages": "μηνύματα ηλεκτρονικού ταχυδρομείου", "Mail_Messages_Instructions": "Επιλέξτε τα μηνύματα που θέλετε να στείλετε μέσω e-mail πατώντας τα μηνύματα", + "Room_uploaded_file_list": "Λίστα αρχείων", "Mail_Messages_Subject": "Εδώ είναι ένα επιλεγμένο τμήμα των μηνυμάτων %s", "Mailer": "Μέιλερ", "Mailer_body_tags": "Θα πρέπει να χρησιμοποιήσετε [unsubscribe] για το διαγραφής σύνδεσμο.
Μπορείτε να χρησιμοποιήσετε το [name], [fname], [lname] για το πλήρες όνομα του χρήστη, το όνομα ή το επώνυμο, αντίστοιχα.
Μπορείτε να χρησιμοποιήσετε το [email] για το ηλεκτρονικό ταχυδρομείο του χρήστη.", @@ -1717,7 +1719,6 @@ "Max_length_is": "Το μέγιστο μήκος είναι%s", "Media": "Μεσο ΜΑΖΙΚΗΣ ΕΝΗΜΕΡΩΣΗΣ", "Medium": "Μεσαίο", - "Members_List": "Λίστα μελών", "mention-all": "Αναφέρετε όλα", "mention-all_description": "Άδεια χρήσης της παραπομπής @all", "mention-here": "Αναφέρετε εδώ", @@ -2209,7 +2210,6 @@ "Room_type_changed_successfully": "Τύπος δωματίου άλλαξε με επιτυχία", "Room_type_of_default_rooms_cant_be_changed": "Πρόκειται για ένα προεπιλεγμένο δωμάτιο και ο τύπος δεν μπορεί να αλλάξει, συμβουλευτείτε τον διαχειριστή σας.", "Room_unarchived": "δωμάτιο αρχειοθετημένα", - "Room_uploaded_file_list": "Λίστα αρχείων", "Room_uploaded_file_list_empty": "Δεν υπάρχουν διαθέσιμα αρχεία.", "Rooms": "Δωμάτια", "run-import": "Εκτέλεση εισαγωγής", @@ -2564,6 +2564,7 @@ "Trigger_Words": "Λέξεις σκανδάλη", "Triggers": "εναύσματα", "True": "Αληθής", + "Troubleshoot_Disable_Notifications": "Απενεργοποίηση Ειδοποιήσεων", "Tuesday": "Τρίτη", "Turn_OFF": "Σβήνω", "Turn_ON": "Ανάβω", diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 22e2b31e14be..24b939428ce0 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -99,6 +99,7 @@ "Accounts_OAuth_Custom_Token_Path": "Token Path", "Accounts_OAuth_Custom_Token_Sent_Via": "Token Sent Via", "Accounts_OAuth_Custom_Username_Field": "Username field", + "Accounts_OAuth_Custom_Email_Field": "Email field", "Accounts_OAuth_Custom_Name_Field": "Name field", "Accounts_OAuth_Custom_Roles_Claim": "Roles/Groups field name", "Accounts_OAuth_Custom_Merge_Roles": "Merge Roles from SSO", @@ -659,6 +660,7 @@ "Chatpal_Welcome": "Enjoy your search!", "Chatpal_Window_Size": "Index Window Size", "Chatpal_Window_Size_Description": "The size of index windows in hours (on bootstrapping)", + "Check_All": "Check All", "Check_Progress": "Check Progress", "Choose_a_room": "Choose a room", "Choose_messages": "Choose messages", @@ -673,6 +675,7 @@ "Clear_filters": "Clear filters", "clear_history": "Clear History", "Click_here": "Click here", + "Click_here_for_more_details_or_contact_sales_for_a_new_license": "Click here for more details or contact __email__ for a new license.", "Click_here_for_more_info": "Click here for more info", "Click_here_to_enter_your_encryption_password": "Click here to enter your encryption password", "Click_here_to_view_and_copy_your_password": "Click here to view and copy your password.", @@ -690,6 +693,7 @@ "close-others-livechat-room": "Close other Omnichannel Room", "Cloud_workspace_connected_without_account": "Your workspace is now connected to the Rocket.Chat Cloud. If you would like, you can login to the Rocket.Chat Cloud and associate your workspace with your Cloud account.", "close-others-livechat-room_description": "Permission to close other Omnichannel rooms", + "Close_room_description" : "You are about to close this chat. Are you sure you want to continue?", "Closed": "Closed", "Closed_At": "Closed at", "Closed_by_visitor": "Closed by visitor", @@ -1149,9 +1153,10 @@ "Desktop_Notifications_Not_Enabled": "Desktop Notifications are Not Enabled", "Details": "Details", "Different_Style_For_User_Mentions": "Different style for user mentions", - "Direct_message_creation_description" : "You are about to create a chat with multiple users. Add the ones you would like to talk, everyone in the same place, using direct messages.", + "Direct_message_creation_description": "You are about to create a chat with multiple users. Add the ones you would like to talk, everyone in the same place, using direct messages.", "Direct_message_you_have_joined": "You have joined a new direct message with", "Direct_message_someone": "Direct message someone", + "Direct_Message": "Direct Message", "Direct_Messages": "Direct Messages", "Direct_Reply": "Direct Reply", "Direct_Reply_Advice": "You can directly reply to this email. Do not modify previous emails in the thread.", @@ -1407,6 +1412,8 @@ "error-password-policy-not-met-oneSpecial": "Password does not meet the server's policy of at least one special character", "error-password-policy-not-met-oneUppercase": "Password does not meet the server's policy of at least one uppercase character", "error-password-policy-not-met-repeatingCharacters": "Password not not meet the server's policy of forbidden repeating characters (you have too many of the same characters next to each other)", + "error-pinning-message": "Message could not be pinned", + "error-unpinning-message": "Message could not be unpinned", "error-push-disabled": "Push is disabled", "error-remove-last-owner": "This is the last owner. Please set a new owner before removing this one.", "error-tags-must-be-assigned-before-closing-chat": "Tag(s) must be assigned before closing the chat", @@ -1712,6 +1719,7 @@ "if_they_are_from": "(if they are from %s)", "If_this_email_is_registered": "If this email is registered, we'll send instructions on how to reset your password. If you do not receive an email shortly, please come back and try again.", "If_you_are_sure_type_in_your_password": "If you are sure type in your password:", + "Members_List": "Members List", "If_you_are_sure_type_in_your_username": "If you are sure type in your username:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "If you don't have one send an email to [omni@rocket.chat](mailto:omni@rocket.chat) to get yours.", "If_you_didnt_ask_for_reset_ignore_this_email": "If you didn't ask for your password reset, you can ignore this email.", @@ -2112,6 +2120,7 @@ "leave-c": "Leave Channels", "leave-p": "Leave Private Groups", "Leave": "Leave", + "Leave_a_comment": "Leave a comment", "Leave_Group_Warning": "Are you sure you want to leave the group \"%s\"?", "Leave_Livechat_Warning": "Are you sure you want to leave the omnichannel with \"%s\"?", "Leave_Private_Warning": "Are you sure you want to leave the discussion with \"%s\"?", @@ -2152,7 +2161,9 @@ "Livechat_title_color": "Livechat Title Background Color", "Livechat_transcript_sent": "Omnichannel transcript sent", "Livechat_transfer_to_agent": "__from__ transferred the chat to __to__", + "Livechat_transfer_to_agent_with_a_comment": "__from__ transferred the chat to __to__ with a comment: __comment__", "Livechat_transfer_to_department": "__from__ transferred the chat to the department __to__", + "Livechat_transfer_to_department_with_a_comment": "__from__ transferred the chat to the department __to__ with a comment: __comment__", "Livechat_transfer_return_to_the_queue": "__from__ returned the chat to the queue", "Livechat_Triggers": "Livechat Triggers", "Livechat_Users": "Omnichannel Users", @@ -2204,6 +2215,7 @@ "Mail_Message_No_messages_selected_select_all": "You haven't selected any messages", "Mail_Messages": "Mail Messages", "Mail_Messages_Instructions": "Choose which messages you want to send via email by clicking the messages", + "Room_uploaded_file_list": "Files List", "Mail_Messages_Subject": "Here's a selected portion of %s messages", "Mailer": "Mailer", "Mailer_body_tags": "You must use [unsubscribe] for the unsubscription link.
You may use [name], [fname], [lname] for the user's full name, first name or last name, respectively.
You may use [email] for the user's email.", @@ -2268,6 +2280,7 @@ "Max_number_incoming_livechats_displayed_description": "(Optional) Max number of items displayed in the incoming Omnichannel queue.", "Max_number_of_uses": "Max number of uses", "Maximum": "Maximum", + "Maximum_number_of_guests_reached": "Maximum number of guests reached", "Media": "Media", "Medium": "Medium", "Members": "Members", @@ -2320,6 +2333,8 @@ "Message_GlobalSearch": "Global Search", "Message_GroupingPeriod": "Grouping Period (in seconds)", "Message_GroupingPeriodDescription": "Messages will be grouped with previous message if both are from the same user and the elapsed time was less than the informed time in seconds.", + "Message_has_been_pinned": "Message has been pinned", + "Message_has_been_unpinned": "Message has been unpinned", "Message_has_been_starred": "Message has been starred", "Message_has_been_unstarred": "Message has been unstarred", "Message_HideType_au": "Hide \"User Added\" messages", @@ -2502,8 +2517,6 @@ "Notification_RequireInteraction_Description": "Works only with Chrome browser versions > 50. Utilizes the parameter requireInteraction to show the desktop notification to indefinite until the user interacts with it.", "Notification_Mobile_Default_For": "Push Mobile Notifications For", "Notifications": "Notifications", - "Notifications_Always_Notify_Mobile": "Always notify mobile", - "Notifications_Always_Notify_Mobile_Description": "Choose to always notify mobile device regardless of presence status.", "Notifications_Duration": "Notifications Duration", "Notifications_Max_Room_Members": "Max Room Members Before Disabling All Message Notifications", "Notifications_Max_Room_Members_Description": "Max number of members in room when notifications for all messages gets disabled. Users can still change per room setting to receive all notifications on an individual basis. (0 to disable)", @@ -2619,6 +2632,7 @@ "Pin_Message": "Pin Message", "Pinned_a_message": "Pinned a message:", "Pinned_Messages": "Pinned Messages", + "pinning-not-allowed": "Pinning is not allowed", "PiwikAdditionalTrackers": "Additional Piwik Sites", "PiwikAdditionalTrackers_Description": "Enter addtitional Piwik website URLs and SiteIDs in the following format, if you wnat to track the same data into different websites: [ { \"trackerURL\" : \"https://my.piwik.domain2/\", \"siteId\" : 42 }, { \"trackerURL\" : \"https://my.piwik.domain3/\", \"siteId\" : 15 } ]", "PiwikAnalytics_cookieDomain": "All Subdomains", @@ -2721,9 +2735,6 @@ "Push_apn_dev_passphrase": "APN Dev Passphrase", "Push_apn_key": "APN Key", "Push_apn_passphrase": "APN Passphrase", - "Push_debug": "Debug", - "Push_send_interval": "Interval to check the queue for new push notifications", - "Push_send_batch_size": "Batch size to be processed every tick", "Push_enable": "Enable", "Push_enable_gateway": "Enable Gateway", "Push_gateway": "Gateway", @@ -2738,6 +2749,7 @@ "Purchase_for_price": "Purchase for $%s", "Query": "Query", "Query_description": "Additional conditions for determining which users to send the email to. Unsubscribed users are automatically removed from the query. It must be a valid JSON. Example: \"{\"createdAt\":{\"$gt\":{\"$date\": \"2015-01-01T00:00:00.000Z\"}}}\"", + "Query_is_not_valid_JSON": "Query is not valid JSON", "Queue": "Queue", "quote": "quote", "Quote": "Quote", @@ -2916,6 +2928,7 @@ "SAML": "SAML", "SAML_Custom_Authn_Context": "Custom Authn Context", "SAML_Custom_Authn_Context_Comparison": "Authn Context Comparison", + "SAML_Custom_Authn_Context_description": "Leave this empty to omit the authn context from the request.", "SAML_Custom_Cert": "Custom Certificate", "SAML_Custom_Debug": "Enable Debug", "SAML_Custom_Entry_point": "Custom Entry Point", @@ -3041,6 +3054,7 @@ "set-readonly": "Set ReadOnly", "set-readonly_description": "Permission to set a channel to read only channel", "Set_as_leader": "Set as leader", + "Set_as_favorite": "Set as favorite", "Set_as_moderator": "Set as moderator", "Set_as_owner": "Set as owner", "Settings": "Settings", @@ -3156,6 +3170,7 @@ "Statistics": "Statistics", "Statistics_reporting": "Send Statistics to Rocket.Chat", "Statistics_reporting_Description": "By sending your statistics, you'll help us identify how many instances of Rocket.Chat are deployed, as well as how good the system is behaving, so we can further improve it. Don't worry, as no user information is sent and all the information we receive is kept confidential.", + "Stats_Active_Guests": "Activated Guests", "Stats_Active_Users": "Activated Users", "Stats_App_Users": "Rocket.Chat App Users", "Stats_Avg_Channel_Users": "Average Channel Users", @@ -3278,6 +3293,7 @@ "theme-color-rc-color-error-light": "Error Light", "theme-color-rc-color-link-active": "Link Active", "theme-color-rc-color-primary": "Primary", + "theme-color-rc-color-primary-background": "Primary Background", "theme-color-rc-color-primary-dark": "Primary Dark", "theme-color-rc-color-primary-darkest": "Primary Darkest", "theme-color-rc-color-primary-light": "Primary Light", @@ -3425,6 +3441,7 @@ "unarchive-room": "Unarchive Room", "unarchive-room_description": "Permission to unarchive channels", "Unblock_User": "Unblock User", + "Uncheck_All": "Uncheck All", "Undefined": "Undefined", "Unfavorite": "Unfavorite", "Unfollow_message": "Unfollow Message", @@ -3437,6 +3454,7 @@ "Unnamed": "Unnamed", "Unpin": "Unpin", "Unpin_Message": "Unpin Message", + "unpinning-not-allowed": "Unpinning is not allowed", "Unread": "Unread", "Unread_Count": "Unread Count", "Unread_Count_DM": "Unread Count for Direct Messages", @@ -3722,6 +3740,7 @@ "You_need_to_type_in_your_username_in_order_to_do_this": "You need to type in your username in order to do this!", "You_need_to_verifiy_your_email_address_to_get_notications": "You need to verify your email address to get notifications", "You_need_to_write_something": "You need to write something!", + "You_reached_the_maximum_number_of_guest_users_allowed_by_your_license": "You reached the maximum number of guest users allowed by your license.", "You_should_inform_one_url_at_least": "You should define at least one URL.", "You_should_name_it_to_easily_manage_your_integrations": "You should name it to easily manage your integrations.", "You_will_not_be_able_to_recover": "You will not be able to recover this message!", @@ -3746,4 +3765,4 @@ "Your_server_link": "Your server link", "Your_temporary_password_is_password": "Your temporary password is [password].", "Your_workspace_is_ready": "Your workspace is ready to use 🎉" -} +} \ No newline at end of file diff --git a/packages/rocketchat-i18n/i18n/eo.i18n.json b/packages/rocketchat-i18n/i18n/eo.i18n.json index 7a0663831181..47fb5b40a3e5 100644 --- a/packages/rocketchat-i18n/i18n/eo.i18n.json +++ b/packages/rocketchat-i18n/i18n/eo.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(se ili estas de %s)", "If_this_email_is_registered": "Se ĉi tiu retpoŝto estas registrita, ni sendos instrukciojn pri kiel restarigi vian pasvorton. Se vi ne ricevos retpoŝton baldaŭ, bonvolu reveni kaj provu denove.", "If_you_are_sure_type_in_your_password": "Se vi certas tajpi vian pasvorton:", + "Members_List": "Membroj Listo", "If_you_are_sure_type_in_your_username": "Se vi certe certos vian uzantnomon:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Se vi ne havas, sendu retmesaĝon al [omni@rocket.chat] (mailto: omni@rocket.chat) por akiri vian.", "Iframe_Integration": "Serame Integriĝo", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Vi ne elektis iujn mesaĝojn", "Mail_Messages": "Poŝtaj Mesaĝoj", "Mail_Messages_Instructions": "Elektu la mesaĝojn, kiujn vi volas sendi per retpoŝto per klakado de la mesaĝoj", + "Room_uploaded_file_list": "Dosieroj Listo", "Mail_Messages_Subject": "Jen elektita parto de%s mesaĝoj", "Mailer": "Mailer", "Mailer_body_tags": "Vi devas uzu [unsubscribe] por la unsubscription link.
Vi povas uzi [nomo], [fname], [lname] por la nomo, plena nomo aŭ familinomo, respektive.
Vi povas uzi [retpoŝton] por la retpoŝto de la uzanto.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Max longo estas%s", "Media": "Amaskomunikiloj", "Medium": "Meza", - "Members_List": "Membroj Listo", "mention-all": "Mencio Ĉiuj", "mention-all_description": "Permeso uzi la @all-mencion", "mention-here": "Mencio Ĉi tie", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Ĉambro-tipo ŝanĝiĝis sukcese", "Room_type_of_default_rooms_cant_be_changed": "Ĉi tiu estas defaŭlta ĉambro kaj la tipo ne povas esti ŝanĝita, bonvolu konsulti kun via administranto.", "Room_unarchived": "Salono senatimigita", - "Room_uploaded_file_list": "Dosieroj Listo", "Room_uploaded_file_list_empty": "Ne disponeblaj dosieroj.", "Rooms": "Salonoj", "run-import": "Kuri Importadon", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Trigger Words", "Triggers": "Triggers", "True": "Vera", + "Troubleshoot_Disable_Notifications": "Malebligi Sciigojn", "Tuesday": "Mardo", "Turn_OFF": "Malŝalti", "Turn_ON": "Ŝalti", diff --git a/packages/rocketchat-i18n/i18n/es.i18n.json b/packages/rocketchat-i18n/i18n/es.i18n.json index 126a75c65397..ffc7136190ed 100644 --- a/packages/rocketchat-i18n/i18n/es.i18n.json +++ b/packages/rocketchat-i18n/i18n/es.i18n.json @@ -20,7 +20,7 @@ "access-mailer_description": "Permiso para enviar correo electrónico masivo a todos los usuarios.", "access-permissions": "Acceso a la Pantalla de Permisos", "access-permissions_description": "Modificar permisos para varios roles.", - "access-setting-permissions": "Modify setting-based permissions", + "access-setting-permissions": "Modificar permisos basados en configuración", "Access_not_authorized": "Acceso no autorizado", "Access_Token_URL": "URL de Token de Acceso", "Accessing_permissions": "Accediendo a los permisos", @@ -99,6 +99,7 @@ "Accounts_OAuth_Custom_Token_Path": "Ruta del Token", "Accounts_OAuth_Custom_Token_Sent_Via": "Token enviado vía", "Accounts_OAuth_Custom_Username_Field": "Campo de Nombre de Usuario", + "Accounts_OAuth_Custom_Email_Field": "Campo de correo electrónico", "Accounts_OAuth_Custom_Name_Field": "Campo de nombre", "Accounts_OAuth_Custom_Roles_Claim": "Nombre del campo roles / grupos", "Accounts_OAuth_Custom_Merge_Roles": "Fusionar roles de SSO", @@ -192,6 +193,9 @@ "Accounts_RegistrationForm_Secret_URL": "URL Secreto", "Accounts_RegistrationForm_SecretURL": "URL Secreto del Fomulario de Registro", "Accounts_RegistrationForm_SecretURL_Description": "Debe proporcionar una cadena de texto aleatorio que se añadirá al URL de registro. Ejemplo: https://open.rocket.chat/register/[secret_hash]", + "Accounts_Registration_InviteUrlType": "Tipo de URL de invitación", + "Accounts_Registration_InviteUrlType_Direct": "Directo", + "Accounts_Registration_InviteUrlType_Proxy": "Proxy", "Accounts_RequireNameForSignUp": "Requerir un Nombre para el Registro", "Accounts_RequirePasswordConfirmation": "Solicitar Confirmación de Contraseña", "Accounts_SearchFields": "Campos a Considerar en la Búsqueda", @@ -200,20 +204,34 @@ "Accounts_Directory_DefaultView": "Listado de directorio predeterminado", "Accounts_SetDefaultAvatar": "Establecer avatar predeterminado", "Accounts_SetDefaultAvatar_Description": "Tratar de determinar el avatar predeterminado basado en la cuenta OAuth o Gravatar", - "Accounts_ShowFormLogin": "Mostrar Inicio de sesión basado en formulario", - "Accounts_TwoFactorAuthentication_Enabled": "Habilitar la autenticación de dos factores", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "Establecer correo electrónico de cuentas externas como verificadas", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "Los correos electrónicos de cuentas creadas desde servicios externos, como LDAP, OAuth, etc., se marcarán como verificados automáticamente. ", + "Accounts_ShowFormLogin": "Mostrar inicio de sesión basado en formulario", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "Habilitar segundo factor de autenticación vía correo electrónico", + "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Los usuarios con correo electrónico verificado y la opción habilitada en su página de perfil recibirán un correo electrónico con un código temporal para autorizar ciertas acciones como iniciar sesión, guardar el perfil, etc.", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Establecer segundo factor de autenticación vía email por defecto para nuevos usuarios ", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Los nuevos usuarios tendrán activado por defecto el segundo factor de autenticación por correo electrónico. Podrán desactivarlo en su página de perfil.", + "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Tiempo de caducidad del código enviado por correo electrónico en segundos", + "Accounts_TwoFactorAuthentication_Enabled": "Habilitar la autenticación de dos factores vía TOTP", + "Accounts_TwoFactorAuthentication_Enabled_Description": "Los usuarios pueden configurar su segundo factor de autenticación usando cualquier aplicación TOTP, como Google Authenticator o Authy", "Accounts_TwoFactorAuthentication_MaxDelta": "Delta máximo", "Accounts_UserAddedEmail_Default": "

Bienvenido a [Site_Name]

Ve a [Site_URL] y prueba la mejor solución de chat de código abierto disponible en la actualidad!

Puede iniciar sesión utilizando su correo electrónico: [email] y contraseña: [password]. Se le puede solicitar que lo cambie al iniciar sesion por primera vez.", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "El máximo delta determina cuántos tokens son válidos en un momento dado. Los tokens se generan cada 30 segundos y son válidos para (30 * Delta máximo) segundos.
Ejemplo: Con un Delta máximo establecido en 10, cada token se puede usar hasta 300 segundos antes o después de su marca de tiempo. Esto es útil cuando el reloj del cliente no está sincronizado correctamente con el servidor.", + "Accounts_TwoFactorAuthentication_RememberFor": "Recordar segundo factor de autenticación durante (segundos)", + "Accounts_TwoFactorAuthentication_RememberFor_Description": "No solicitar código de segundo factor de autenticación si ya se ha proporcionado antes en el tiempo establecido.", "Accounts_UseDefaultBlockedDomainsList": "Usar lista predeterminada de dominios bloqueados", "Accounts_UseDNSDomainCheck": "Utilizar la comprobación de dominio DNS", "Accounts_UserAddedEmailSubject_Default": "Has sido añadido a [Site_Name]", "Accounts_UserAddedEmail_Description": "Es posible utilizar los siguientes marcadores:

  • [name], [fname], [lname] para el nombre completo del usuario, el nombre o el apellido, respectivamente.
  • [email] para el correo electrónico del usuario.
  • [password] para la contraseña del usuario.
  • [Site_Name] y [Site_URL] para el nombre de la aplicación y la URL, respectivamente.
", "Activate": "Activar", + "Active_users": "Usuarios activos", + "Daily_Active_Users": "Usuarios activos diarios", + "Weekly_Active_Users": "Usuarios activos semanales", + "Monthly_Active_Users": "Usuarios activos mensuales", "Activity": "Actividad", "Add": "Agregar", "add-oauth-service": "Agregar Servicio Oauth", - "add-oauth-service_description": "Permiso para agregar un nuevo servicio Oauth", + "add-oauth-service_description": "Permiso para agregar un nuevo servicio OAuth", "add-user": "Añadir Usuario", "add-user-to-any-c-room": "Añadir Usuario a Cualquier Canal Público", "add-user-to-any-c-room_description": "Permiso para agregar un usuario a cualquier canal público", @@ -226,12 +244,13 @@ "Add_custom_oauth": "Agregar oauth personalizado", "Add_Domain": "Agregar Dominio", "Add_files_from": "Añadir archivos desde", - "add-livechat-department-agents": "Agregar agentes de chat en vivo a departamentos", + "add-livechat-department-agents": "Añadir agentes de chat en vivo a departamentos", "Add_manager": "Agregar supervisor", "Add_Role": "Agregar Rol", "Add_user": "Agregar Usuario", "Add_User": "Añadir usuario", - "Add_users": "Agregar usuarios", + "Add_users": "Añadir usuarios", + "Add_Reaction": "Añadir reacción", "Adding_OAuth_Services": "Añadir servicios OAuth", "Adding_permission": "Añadiendo permiso", "Adding_user": "Añadiendo usuario", @@ -246,8 +265,8 @@ "Advocacy": "Abogacía", "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "Después de la autenticación OAuth2, los usuarios serán redirigidos a esta URL", "Agent": "Agente", - "Agent_Info": "Info de agente", - "Agents": "# de Agentes", + "Agent_Info": "Información de agente", + "Agents": "Agentes", "Agent_added": "Agente agregado", "Agent_removed": "Agente eliminado", "Alerts": "Alertas", @@ -257,12 +276,12 @@ "Alias_Set": "Establecer alias", "Aliases": "Alias", "All": "Todo", - "All_added_tokens_will_be_required_by_the_user": "Todos los tokens agregados serán requeridos al usuario", + "All_added_tokens_will_be_required_by_the_user": "Todos los tokens añadidos serán requeridos por el usuario", "All_channels": "Todos los canales", - "All_closed_chats_have_been_removed": "Se han eliminado todos los chats cerrados.", + "All_closed_chats_have_been_removed": "Se han eliminado todos los chats cerrados", "All_logs": "Todos los registros", "All_messages": "Todos los mensajes", - "All_users": "Todos los Usuarios", + "All_users": "Todos los usuarios", "All_users_in_the_channel_can_write_new_messages": "Todos los usuarios del canal pueden escribir nuevos mensajes", "Allow_collect_and_store_HTTP_header_informations": "Permitir recopilar y almacenar información de encabezado HTTP", "Allow_collect_and_store_HTTP_header_informations_description": "Esta configuración determina si Livechat puede almacenar información recopilada de los datos del encabezado HTTP, como la dirección IP, el Agente de usuario, etc.", @@ -274,7 +293,7 @@ "Almost_done": "Casi listo", "Alphabetical": "Alfabético", "Always_open_in_new_window": "Abrir siempre en una nueva ventana", - "Analytics": "Analiticas", + "Analytics": "Analíticas", "Analytics_features_enabled": "Características habilitadas", "Analytics_features_messages_Description": "Monitoriza eventos personalizados relacionados con acciones que un usuario hace en los mensajes.", "Analytics_features_rooms_Description": "Monitoriza eventos personalizados relacionados con acciones en un canal o grupo (crear, salir, eliminar).", @@ -286,20 +305,20 @@ "Animals_and_Nature": "Animales y Naturaleza", "Announcement": "Anuncio", "API": "API", - "API_Add_Personal_Access_Token": "Agregar nuevo token de acceso personal", + "API_Add_Personal_Access_Token": "Añadir nuevo token de acceso personal", "API_Allow_Infinite_Count": "Permitir obtener todo", "API_Allow_Infinite_Count_Description": "¿Debería permitirse que las llamadas a la API REST devuelvan todo en una sola llamada?", - "API_Analytics": "Analiticas", + "API_Analytics": "Analíticas", "api-bypass-rate-limit": "Límite de tasa de derivación para API REST", "API_CORS_Origin": "Origen del CORS", "API_Default_Count": "Contador por defecto", "API_Default_Count_Description": "El valor predeterminado para los resultados de REST API si el consumidor no proporcionó ninguno.", - "API_Drupal_URL": "URL del Servidor Drupal", + "API_Drupal_URL": "URL del servidor Drupal", "API_Drupal_URL_Description": "Ejemplo: https://domain.com (sin incluir la barra diagonal)", "API_Embed": "Incrustar (embed)", "API_Embed_Description": "Ya sea que las previsualizaciones de enlace integrados estén activas o no cuando un usuario publica un enlace a un sitio web.", - "API_Embed_UserAgent": "Agente de usuario de solicitud embebido", - "API_EmbedCacheExpirationDays": "Días de Vencimiento de Caché Embebido", + "API_Embed_UserAgent": "Incrusta agente de usuario en la solicitud", + "API_EmbedCacheExpirationDays": "Incrusta días de vencimiento de caché", "API_EmbedDisabledFor": "Deshabilitar el insertar vinculos para los Usuarios", "API_EmbedDisabledFor_Description": "Lista separada por comas de nombres de usuarios ", "API_EmbedIgnoredHosts": "Incrusta hosts ignorados", @@ -316,25 +335,30 @@ "API_Enable_Rate_Limiter_Limit_Calls_Default_Description": "Número de llamadas predeterminadas para cada punto de la API REST, permitidas dentro del rango de tiempo definido a continuación", "API_Enable_Rate_Limiter_Limit_Time_Default": "Límite de tiempo predeterminado para el limitador de velocidad (en ms)", "API_Enable_Rate_Limiter_Limit_Time_Default_Description": "Número de llamadas predeterminadas para cada punto de la API REST, permitidas dentro del rango de tiempo definido a continuación", + "API_Enable_Personal_Access_Tokens": "Habilitar los tokens de acceso personal a la API REST", + "API_Enable_Personal_Access_Tokens_Description": "Habilitar los tokens de acceso personal para su uso con la API REST", "API_Enable_Shields": "Activar escudos", "API_Enable_Shields_Description": "Activar los escudos disponibles en `/api/v1/shields. svg`", "API_GitHub_Enterprise_URL": "URL del servidor", "API_GitHub_Enterprise_URL_Description": "Ejemplo: http://domain.com (sin incluir la diagonal final)", "API_Gitlab_URL": "URL de GitLab", - "API_Personal_Access_Token_Name": "Nombre de Token de Acceso Personal", + "API_Personal_Access_Token_Name": "Nombre de token de acceso personal", "API_Personal_Access_Tokens_To_REST_API": "Token de acceso personal a API REST", "API_Personal_Access_Tokens_Remove_Modal": "¿Estás seguro que quieres eliminar este token de acceso personal?", - "API_Personal_Access_Token_Generated": "Token de Acceso Personal generado con éxito", + "API_Personal_Access_Token_Generated": "Token de acceso personal generado con éxito", "API_Personal_Access_Token_Generated_Text_Token_s_UserId_s": "Por favor guarda cuidadosamente tu token porque no podrás visualizarlo después.
Token: __token__
Tu ID de usuario: __userId__", "API_Personal_Access_Tokens_Regenerate_Modal": "Si perdiste tu token, puedes volver a generarlo, pero recuerda que las aplicaciones que lo usen tendrán que actualizarlo", "API_Personal_Access_Tokens_Regenerate_It": "Regenerar token", - "API_Shield_Types": "Tipos de Escudo", + "API_Shield_Types": "Tipos de escudo", "API_Shield_Types_Description": "Tipos de escudos para activar como una lista separada por comas, elija entre `online`,` channel` o `*` para todos", + "API_Shield_user_require_auth": "Requerir autenticación para escudos de los usuarios", "API_Token": "API Token", "API_Tokenpass_URL": "URL del servidor de tokens", "API_Tokenpass_URL_Description": "Ejemplo: https://dominio.com (excluir barra final)", "API_Upper_Count_Limit": "Cantidad máxima de registro", "API_Upper_Count_Limit_Description": "¿Cuál es el número máximo de registros que debe devolver la API REST (cuando no es ilimitado)?", + "API_Use_REST_For_DDP_Calls": "Usar REST en lugar de WebSocket para las llamadas de Meteor", + "API_Use_REST_For_DDP_Calls_Alert": "Esta es una característica experimental y temporal. Obliga al cliente web y a la aplicación móvil a usar peticiones REST en lugar de usar WebSockets para las llamadas de Meteor.", "API_User_Limit": "Límite de usuarios para añadir todos los usuarios al canal", "API_Wordpress_URL": "URL de Wordpress", "Apiai_Key": "Clave Api.ai", @@ -349,13 +373,15 @@ "App_status_disabled": "Deshabilitado", "App_status_error_disabled": "Deshabilitado: error no detectado", "App_status_initialized": "Inicializado", + "App_status_invalid_license_disabled": "Desabilitado: Licencia no válida", "App_status_invalid_settings_disabled": "Deshabilitado: Configuración necesaria", "App_status_manually_disabled": "Deshabilitado: Manualmente", "App_status_manually_enabled": "Habilitado", - "App_status_unknown": "Incógnita", + "App_status_unknown": "Desconocido", "App_support_url": "URL de soporte", "App_Url_to_Install_From": "Instalar desde URL", "App_Url_to_Install_From_File": "Instalar desde archivo", + "App_user_not_allowed_to_login": "Los usuarios de la aplicación no pueden acceder directamente.", "Appearance": "Apariencia", "Application_added": "Aplicación añadida", "Application_Name": "Nombre de la aplicación", @@ -365,9 +391,15 @@ "Apps": "Aplicaciones", "Apps_Engine_Version": "Versión de Motor de Aplicaciones", "Apps_Framework_Development_Mode": "Habilitar el modo de desarrollo", - "Apps_Framework_enabled": "Habilitar el Marco de aplicaciones", + "Apps_Framework_Development_Mode_Description": "El modo de desarrollo permite la instalación de aplicaciones que no son del Marketplace de Rocket.Chat.", + "Apps_Framework_enabled": "Habilitar el marco de aplicaciones", + "Apps_Game_Center": "Centro de juegos", + "Apps_Game_Center_Back": "Volver al centro de juegos", + "Apps_Game_Center_enabled": "Habilitar el Centro de Juegos", + "Apps_Game_Center_Play_Game_Together": "@here ¡__name__ juguemos juntos!", + "Apps_Game_Center_Invite_Friends": "Invita a tus amigos a unirse", "Apps_Marketplace_Deactivate_App_Prompt": "¿Realmente quieres deshabilitar esta aplicación?", - "Apps_Marketplace_Modify_App_Subscription": "Modificar Suscripción", + "Apps_Marketplace_Modify_App_Subscription": "Modificar suscripción", "Apps_Marketplace_Uninstall_App_Prompt": "¿Quieres realmente desinstalar esta aplicación?", "Apps_Marketplace_Uninstall_Subscribed_App_Anyway": "Desinstalar de todos modos", "Apps_Marketplace_Uninstall_Subscribed_App_Prompt": "Esta aplicación tiene una suscripción activa y al desinstalarla no se cancelará. Si quisieras hacerlo, por favor, modifica tu suscripción antes de desinstalarla.", @@ -378,22 +410,27 @@ "Apps_Marketplace_pricingPlan_yearly": "__price__ / año", "Apps_Marketplace_pricingPlan_yearly_perUser": "__price__ / año por usuario", "Apps_Settings": "Configuración de la aplicación", + "Apps_User_Already_Exists": "El nombre de usuario \"__username__\" ya está en uso. Renombre o elimine el usuario que lo utiliza para instalar esta aplicación", "Apps_WhatIsIt": "Aplicaciones: ¿Qué son?", "Apps_WhatIsIt_paragraph1": "¡Un nuevo ícono en el área de administración! ¿Qué significa esto y qué son las aplicaciones?", "Apps_WhatIsIt_paragraph2": "En primer lugar, las aplicaciones en este contexto no se refieren a las aplicaciones móviles. De hecho, sería mejor pensar en ellos en términos de complementos o integraciones avanzadas.", "Apps_WhatIsIt_paragraph3": "En segundo lugar, son scripts dinámicos o paquetes que le permitirán personalizar su instancia de Rocket.Chat sin tener que bifurcar la base de código. Pero tenga en cuenta que este es un nuevo conjunto de características y debido a eso puede no ser 100% estable. Además, aún estamos desarrollando el conjunto de características para que no todo se pueda personalizar en este momento. Para obtener más información sobre cómo empezar a desarrollar una aplicación, vaya aquí para leer:", "Apps_WhatIsIt_paragraph4": "Pero dicho esto, si está interesado en habilitar esta función y probarla, haga clic en este botón para habilitar el sistema de aplicaciones.", "Archive": "Archivo", - "archive-room": "Archivar Room", + "archive-room": "Archivar sala", "archive-room_description": "Permiso para archivar un canal", "are_also_typing": "también están escribiendo", "are_typing": "están escribiendo", "Are_you_sure": "Estás seguro?", "Are_you_sure_you_want_to_delete_your_account": "¿Estás seguro de que quieres eliminar tu cuenta?", "Are_you_sure_you_want_to_disable_Facebook_integration": "¿Está seguro que desea desabilitar la integración con Facebook?", + "Are_you_sure_you_want_to_delete_this_record": "¿Estás seguro de que quieres borrar este registro?", + "Assets": "Recursos", "assign-admin-role": "Asignar Rol de Administrador", "assign-admin-role_description": "Permiso para asignar el rol admin a otros usuarios", "Assign_admin": "Asignando administrador", + "Assign_new_conversations_to_bot_agent": "Asignar nuevas conversaciones al agente bot", + "Assign_new_conversations_to_bot_agent_description": "El sistema de enrutamiento intentará encontrar un agente bot antes de dirigir nuevas conversaciones a un agente humano.", "assign-roles": "Asignar roles", "at": "en", "At_least_one_added_token_is_required_by_the_user": "Al menos uno de los tokens agregados es requerido por el usuario", @@ -401,6 +438,7 @@ "Attachment_File_Uploaded": "Archivo subido", "Attribute_handling": "Manejo de atributos", "Audio": "Audio", + "Audios": "Audios", "Audio_message": "Mensaje de audio", "Audio_Notification_Value_Description": "Puede ser cualquier sonido personalizado o por defecto: beep, chelle, ding, droplet, highbell, seasons", "Audio_Notifications_Default_Alert": "Alerta Predeterminada para Notificaciones de Audio", @@ -414,23 +452,26 @@ "auto-translate": "Autotraducir", "auto-translate_description": "Permiso para utilizar la herramienta de traducción automática", "Auto_Load_Images": "Cargar automáticamente las imagenes", + "AutoLinker": "AutoLinker", "AutoLinker_Email": "AutoLinker Correo Electrónico", "AutoLinker_Phone": "AutoLinker Teléfono", "AutoLinker_Phone_Description": "Enlazada automáticamente los números de teléfono. Ej:`(123) 456-7890`", - "AutoLinker_StripPrefix": "AutoLinker sin Prefijo", + "AutoLinker_StripPrefix": "AutoLinker prefijo separador", "AutoLinker_StripPrefix_Description": "Presentación corta. Ej: https://rocket.chat => rocket.chat", "AutoLinker_Urls_Scheme": "AutoLinker Scheme:// URLs", "AutoLinker_Urls_TLD": "AutoLinker URLs TLD", "AutoLinker_Urls_www": "Enlaces Automáticos en URLs 'www'", - "AutoLinker_UrlsRegExp": "Enlaces Automáticos en URL de expresiones regulares", + "AutoLinker_UrlsRegExp": "AutoLinker expresión regular de URL", "Automatic_Translation": "Traducción automática", "Author_Site": "Sitio del autor", "AutoTranslate": " Traducción Automática", + "Auto_Selection": "Selección automática", "Auto_Translate": " Traducción Automática", "AutoTranslate_APIKey": "Clave API", "AutoTranslate_Change_Language_Description": "Cambiar el idioma de la traducción automática no traduce los mensajes anteriores.", "AutoTranslate_Enabled": "Habilitar Traducción Automática", "AutoTranslate_Enabled_Description": "Habilitar la auto traducción, permite a las personas con la licencia de auto-traducción para que todos los mensajes se traduzcan automáticamente a su idioma seleccionado. Se pueden aplicar cargos.", + "AutoTranslate_ServiceProvider": "Proveedor de servicio", "Available": "Disponible", "Available_agents": "Agentes disponibles", "Avatar": "Avatar", @@ -439,6 +480,11 @@ "Avatar_url_invalid_or_error": "El url proporcionado es inválido o no es accesible. Por favor intente otra vez, pero con un url diferente.", "Avg_chat_duration": "Duración promedio del chat", "Avg_first_response_time": "Tiempo promedio de la primera respuesta", + "Avg_of_abandoned_chats": "Promedio de charlas abandonadas", + "Avg_of_available_service_time": "Promedio de tiempo de servicio disponible", + "Avg_of_chat_duration_time": "Promedio del tiempo de duración del chat", + "Avg_of_service_time": "Promedio de tiempo de servicio", + "Avg_of_waiting_time": "Promedio de tiempo de espera", "Avg_response_time": "Tiempo promedio de respuesta", "Avg_reaction_time": "Tiempo promedio de reacción", "away": "ausente", @@ -450,6 +496,7 @@ "Back": "Atrás", "Back_to_applications": "Volver a las aplicaciones", "Back_to_chat": "Volver al chat", + "Back_to_imports": "Volver a importaciones", "Back_to_integration_detail": "Volver al detalle de la integración", "Back_to_integrations": "Volver a integraciones", "Back_to_login": "Volver a iniciar sesión", @@ -460,6 +507,7 @@ "ban-user": "Prohibir Usuario", "ban-user_description": "Permiso para prohibir a un usuario de un canal", "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "Característica beta. Depende de la videoconferencia para habilitarlo.", + "Better": "Mejor", "Best_first_response_time": "Mejor tiempo de primera respuesta", "Block_User": "Bloquear Usuario", "Blockchain": "Blockchain", @@ -467,6 +515,7 @@ "Blockstack_ButtonLabelText": "Texto de etiqueta de botón", "Blockstack_Generate_Username": "Generar nombre de usuario", "Body": "Cuerpo", + "Bio": "Bio", "bold": "negrita", "bot_request": "Solicitud del robot", "BotHelpers_userFields": "Campos de Usuario", @@ -477,12 +526,15 @@ "Broadcast_channel_Description": "Solo los usuarios autorizados pueden escribir mensajes nuevos, pero los otros usuarios podrán responder", "Broadcast_Connected_Instances": "Transmitir instancias conectadas", "Broadcasting_enabled": " ", + "Browse_Files": "Examinar archivos", + "Browser_does_not_support_audio_element": "Su navegador no soporta el elemento de audio.", + "Browser_does_not_support_video_element": "Su navegador no soporta el elemento de vídeo.", "Bugsnag_api_key": "Clave de la API Bugsnag", "Build_Environment": "Entorno de construcción", - "bulk-register-user": "Creación masiva de canales", - "bulk-register-user_description": "Permiso para crear canales a granel", - "Busiest_day": "Dia mas ocupado", - "Busiest_time": "Tiempo mas ocupado", + "bulk-register-user": "Creación masiva de usuarios", + "bulk-register-user_description": "Permiso para creación masiva de usuarios", + "Busiest_day": "Día más ocupado", + "Busiest_time": "Tiempo más ocupado", "busy": "ocupado", "Busy": "Ocupado", "busy_female": "ocupada", @@ -497,27 +549,32 @@ "Cancel_message_input": "Cancelar", "Cannot_invite_users_to_direct_rooms": "No se puede invitar a los usuarios a las salas directas", "Cannot_open_conversation_with_yourself": "No se puede dirigir el mensaje contigo mismo", - "CAS_autoclose": "Cierre Automático de la ventana emergente de Inicio de Sesión", - "CAS_base_url": "URL base del SSO", + "CAS_autoclose": "Cierre automático de la ventana emergente de inicio de sesión", + "CAS_base_url": "URL base de SSO", "CAS_base_url_Description": "La URL base de su servicio de SSO externo, por ejemplo: https: //sso.example.undef/sso/", "CAS_button_color": "Color de fondo para el botón de inicio de sesión", "CAS_button_label_color": "Color del texto del botón de inicio de sesión", "CAS_button_label_text": "Etiqueta del botón de inicio de sesión", "CAS_enabled": "Habilitado", "CAS_Login_Layout": "Diseño de inicio de sesión de CAS", - "CAS_login_url": "URL login del SSO", + "CAS_login_url": "URL de login del SSO", "CAS_login_url_Description": "La URL de inicio de sesión de su servicio de SSO externo, por ejemplo: https: //sso.example.undef/sso/login", - "CAS_popup_height": "Alto de de Ventana Emergente de Inicio de Sesión", - "CAS_popup_width": "Ancho de Ventana Emergente de Inicio de Sesión", - "CAS_Sync_User_Data_Enabled": "Siempre sincronizar los Datos de Usuario", + "CAS_popup_height": "Alto de la ventana emergente de inicio de sesión", + "CAS_popup_width": "Ancho de la ventana emergente de inicio de sesión", + "CAS_Sync_User_Data_Enabled": "Siempre sincronizar los datos de usuario", "CAS_Sync_User_Data_Enabled_Description": "Siempre sincronice los datos de usuario de CAS externos en los atributos disponibles al iniciar sesión. Nota: los atributos siempre se sincronizan al crear la cuenta de todos modos.", "CAS_Sync_User_Data_FieldMap": "Mapa de atributos", "CAS_Sync_User_Data_FieldMap_Description": "Utilice esta entrada JSON para construir atributos internos (clave) a partir de atributos externos (valor). Los nombres de atributos externos adjuntos con '%' se interpolarán en cadenas de valores.
Ejemplo, `{\" email \":\"% email% \",\" nombre \":\"% firstname%,% lastname% \"}`

El mapa de atributos siempre se interpola. En CAS 1.0 solo el atributo `username` está disponible. Los atributos internos disponibles son: nombre de usuario, nombre, correo electrónico, habitaciones; rooms es una lista de habitaciones separadas por comas para unirse a la creación del usuario, por ejemplo: {\"rooms\": \"% team%,% department%\"} se uniría a los usuarios de CAS en la creación de su equipo y canal de departamento.", + "CAS_trust_username": "Confiar en el nombre de usuario de CAS", + "CAS_trust_username_description": "Cuando esté habilitado, Rocket.Chat confiará en que cualquier nombre de usuario de CAS pertenecerá al mismo usuario en Rocket.Chat.
Esto puede ser necesario si un usuario es renombrado en CAS, pero también puede permitir a las personas tomar el control de las cuentas de Rocket.Chat renombrando sus propios usuarios de CAS.", "CAS_version": "Versión CAS", - "CAS_version_Description": "Solo use una versión compatible con CAS admitida por su servicio CAS SSO.", + "CAS_version_Description": "Use sólo una versión compatible con CAS admitida por su servicio CAS SSO.", + "Call": "Llamar", "Categories": "Categorías", "CDN_PREFIX": "Prefijo de CDN", - "Certificates_and_Keys": "Certificados y Llaves", + "CDN_PREFIX_ALL": "Utilizar prefijo CDN para todos los recursos", + "CDN_JSCSS_PREFIX": "Prefijo CDN para JS/CSS", + "Certificates_and_Keys": "Certificados y Claves", "Change_Room_Type": "Cambiar el Tipo de Sala", "Changing_email": "Cambiando correo electrónico", "channel": "canal", @@ -591,6 +648,8 @@ "Chatpal_Welcome": "¡Disfruta tu búsqueda!", "Chatpal_Window_Size": "Tamaño de la ventana de índice", "Chatpal_Window_Size_Description": "El tamaño de las ventanas de índice en horas (en el arranque)", + "Check_All": "Seleccionar todo", + "Check_Progress": "Comprobar progreso", "Choose_a_room": "Elija una sala", "Choose_messages": "Elija mensajes", "Choose_the_alias_that_will_appear_before_the_username_in_messages": "Elige el alias que aparecerá antes del nombre de usuario en los mensajes.", @@ -601,13 +660,15 @@ "clear": "Borrar", "Clear_all_unreads_question": "Borrar todos los mensajes no leídos?", "clear_cache_now": "Borrar caché ahora", - "clear_history": "Borrar Historial", + "Clear_filters": "Limpiar filtros", + "clear_history": "Borrar historial", "Click_here": "Haga clic aquí", "Click_here_for_more_info": "Cliquea aquí para más información", - "Click_here_to_enter_your_encryption_password": "Click aqui para ingresar el ", + "Click_here_to_enter_your_encryption_password": "Haga click aquí para introducir su contraseña de encriptación ", "Click_here_to_view_and_copy_your_password": "Haga clic aquí para ver y copiar su contraseña.", - "Click_the_messages_you_would_like_to_send_by_email": "Haga clic en los mensajes que desea enviar por correo electrónico", + "Click_the_messages_you_would_like_to_send_by_email": "Haga clic en los mensajes que desee enviar por correo electrónico", "Click_to_join": "¡Click para unirse!", + "Click_to_load": "Haga clic para cargar", "Client_ID": "Cliente ID", "Client_Secret": "Cliente Secreto", "Clients_will_refresh_in_a_few_seconds": "Los clientes se refrescaran en unos pocos segundos", @@ -617,18 +678,41 @@ "Cloud_workspace_connected_plus_account": "Su área de trabajo ahora está conectada a Rocket.Chat Cloud y una cuenta está asociada.", "close-livechat-room_description": "Permiso para cerrar el canal LiveChat actual", "close-others-livechat-room": "Cerrar la sala de chat", + "Cloud_workspace_connected_without_account": "Su espacio de trabajo está ahora conectado a Rocket.Chat Cloud. Si lo desea, puede autenticarse en Rocket.Chat Cloud y asociar su espacio de trabajo con su cuenta de Cloud.", "close-others-livechat-room_description": "Permiso para cerrar otros canales de LiveChat", "Closed": "Cerrado", + "Closed_At": "Cerrado en", "Closed_by_visitor": "Cerrado por el visitante", "Closing_chat": "Cerrando chat", + "Cloud_Register_manually": "Registrar manualmente", + "Cloud_click_here": "Después de copiar el texto, ve a la consola Cloud. [Haga clic aquí]()", + "Cloud_register_offline_finish_helper": "Después de completar el proceso de registro en la Cloud Console se le presentará un texto. Por favor, pégalo aquí para terminar el registro.", + "Cloud_register_offline_helper": "Los espacios de trabajo pueden registrarse manualmente si el acceso a la red está restringido. Copia el texto de abajo y ve a nuestra Cloud Console para completar el proceso.", + "Cloud_register_success": "¡Su espacio de trabajo ha sido registrado correctamente!", + "Cloud_register_error": "Ha habido un error al tratar de procesar su solicitud. Por favor, inténtelo de nuevo más tarde.", + "Cloud_connect_support": "Si todavía no has recibido un correo electrónico de registro, por favor asegúrate de que tu correo electrónico esté actualizado. Si todavía tienes problemas, puedes contactar con el soporte en", "Cloud_what_is_it": "¿Que es esto?", + "Cloud_what_is_it_description": "Rocket.Chat Cloud Connect le permite conectar su espacio de trabajo Rocket.Chat con los servicios que ofrecemos en nuestra nube.", + "Cloud_what_is_it_services_like": "Servicios como:", + "Cloud_what_is_it_additional": "Además, podrá gestionar las licencias, la facturación y el soporte desde la consola de Rocket.Chat Cloud.", + "Cloud_workspace_connected": "Su espacio de trabajo está conectado a Rocket.Chat Cloud. Autenticarse aquí en su cuenta de Rocket.Chat Cloud le permitirá interactuar con algunos servicios como el Marketplace.", + "Cloud_workspace_support": "Si tienes problemas con un servicio en la nube, por favor intenta sincronizarlo primero. Si el problema persiste, por favor abra un ticket de soporte en Cloud Console.", + "Cloud_workspace_disconnect": "Si ya no desea utilizar los servicios de la nube puede desconectar su espacio de trabajo de Rocket.Chat Cloud.", "Cloud_login_to_cloud": "Inicia sesión en Rocket.Chat Cloud", "Cloud_logout": "Cierre de sesión de Rocket.Chat Cloud", - "Cloud_update_email": "Actualizar Correo Electrónico", - "Cloud_resend_email": "Reenviar Correo Electrónico", + "Cloud_address_to_send_registration_to": "La dirección a la que enviar el correo electrónico de registro en la nube.", + "Cloud_update_email": "Actualizar correo electrónico", + "Cloud_resend_email": "Reenviar correo electrónico", + "Cloud_manually_input_token": "Introduzca manualmente el token recibido en el correo electrónico de registro en la nube.", "Cloud_registration_required": "Se requiere registro", + "Cloud_registration_required_description": "Parece que durante la configuración no eligió registrar su espacio de trabajo.", "Cloud_registration_requried_link_text": "Haga clic aquí para registrar su espacio de trabajo.", + "Cloud_error_in_authenticating": "Error durante la autentificación", "Cloud_error_code": "Código:", + "Cloud_status_page_description": "Si está teniendo problemas con un servicio en particular de la nube, puede comprobar los problemas conocidos en nuestra página de estado en", + "Cloud_Service_Agree_PrivacyTerms": "Acuerdos y términos de privacidad del servicio en la nube", + "Cloud_troubleshooting": "Solución de problemas", + "Collaborative": "Colaboración", "Collapse_Embedded_Media_By_Default": "Contraer medios incrustados de forma predeterminada", "color": "Color", "Color": "Color", @@ -641,10 +725,12 @@ "Condensed": "Condensado", "Completed": "Completado", "Computer": "Computadora", + "Confirm_new_encryption_password": "Confirmar la nueva contraseña de cifrado", "Confirm_password": "Confirma tu contraseña", "Connect": "Conectar", "Connection_Closed": "Conexión cerrada", "Connection_Reset": "Reajuste de conexion", + "Connectivity_Services": "Servicios de conectividad", "Consulting": "Consultante", "Consumer_Goods": "Bienes de consumo", "Contains_Security_Fixes": "Contiene correcciones de seguridad", @@ -653,15 +739,24 @@ "Continue": "Continuar", "Continuous_sound_notifications_for_new_livechat_room": "Notificaciones continuas de sonido para la nueva sala de chat en vivo", "Conversation": "Conversación", + "Conversations": "Conversaciones", "Conversation_closed": "Conversación cerrada: __comment__.", - "Conversation_finished_message": "Conversación finalizada Mensaje", + "Conversation_closing_tags": "Etiquetas de cierre de la conversación", + "Conversation_closing_tags_description": "Las etiquetas de cierre se asignarán automáticamente a las conversaciones al cierre.", + "Conversation_finished": "Conversación terminada", + "Conversation_finished_message": "Mensaje de conversación terminada", + "Conversation_finished_text": "Texto de conversación finalizada", + "Conversations_per_day": "Conversaciones por día", "conversation_with_s": "la conversación con %s", "Convert_Ascii_Emojis": "Convierte ASCII a Emoji", "Copied": "Copiado", "Copy": "Copia", + "Copy_text": "Copiar texto", "Copy_to_clipboard": "Copiar el Porta-papeles ", "COPY_TO_CLIPBOARD": "COPIAR AL PORTAPAPELES", + "could-not-access-webdav": "No se pudo acceder a WebDAV", "Count": "Contar", + "Counters": "Contadores", "Country": "País", "Country_Afghanistan": "Afganistán", "Country_Albania": "Albania", @@ -908,6 +1003,8 @@ "create-c_description": "Permiso para crear canales públicos", "create-d": "Crear Mensajes Directos", "create-d_description": "Permiso para iniciar mensajes directos", + "create-invite-links": "Crear enlaces de invitación", + "create-invite-links_description": "Permiso para crear enlaces de invitación a los canales", "create-p": "Crear Canales Privados", "create-p_description": "Permiso para crear canales privados", "create-personal-access-tokens": "Crear clave de acceso personal", @@ -916,17 +1013,22 @@ "Create_A_New_Channel": "Crear un nuevo canal", "Create_new": "Crear nuevo", "Create_unique_rules_for_this_channel": "Crea reglas únicas para este canal", + "Created": "Creado", "Created_at": "Creado en", "Created_at_s_by_s": "Creado a las %s por %s", "Created_at_s_by_s_triggered_by_s": "Creado en %s por %s activado por %s", "CRM_Integration": "Integración de CRM", + "CROWD_Allow_Custom_Username": "Permitir nombre de usuario personalizado en Rocket.Chat", "CROWD_Reject_Unauthorized": "Rechazar no autorizado", "Crowd_sync_interval_Description": "El intervalo entre sincronizaciones. Ejemplo `cada 24 horas` o` el primer día de la semana`, más ejemplos en [Cron Text Parser] (http://bunkat.github.io/later/parsers.html#text)", "Current_Chats": "Chats actuales", + "Current_File": "Archivo actual", + "Current_Import_Operation": "Operación de importación actual", "Current_Status": "Estado actual", "Custom": "Personalizado", "Custom CSS": "CSS personalizado", "Custom_agent": "Agente de aduanas", + "Custom_dates": "Fechas personalizadas", "Custom_emoji": "Emoji personalizado", "Custom_Emoji": "Emoji personalizado", "Custom_Emoji_Add": "Agregar nuevos Emoji", @@ -942,7 +1044,11 @@ "Custom_oauth_unique_name": "Nombre único de oauth personalizado", "Custom_Scripts": "Scripts Personalizados", "Custom_Script_Logged_In": "Script personalizado para los usuarios que han iniciado sesión", + "Custom_Script_Logged_In_Description": "Script personalizado que se ejecutará SIEMPRE y a CUALQUIER usuario que esté conectado, por ejemplo (siempre que entres en el chat y estés conectado)", "Custom_Script_Logged_Out": "Script personalizado para los usuarios que han cerrado sesión", + "Custom_Script_Logged_Out_Description": "Script personalizado que se ejecutará SIEMPRE y a CUALQUIER usuario que NO esté conectado. Por ejemplo (cada vez que entre en la página de acceso)", + "Custom_Script_On_Logout": "Script personalizado para el flujo de cierre de sesión", + "Custom_Script_On_Logout_Description": "Script personalizado que se ejecutará UNICAMENTE en el flujo de cierre de sesión", "Custom_Sound_Add": "Agregar Sonido Personalizado", "Custom_Sound_Delete_Warning": "Eliminar un sonido no se puede deshacer.", "Custom_Sound_Error_Invalid_Sound": "Sonido no válido", @@ -953,14 +1059,25 @@ "Custom_Sounds": "Sonidos Personalizados", "Custom_Translations": "Traducciones Personalizadas", "Custom_Translations_Description": "Debe ser un JSON válido donde las claves sean idiomas que contengan un diccionario de clave y traducciones. Ejemplo:
{\n\"en\": {\n\"Canales\": \"Habitaciones\"\n},\n\"pt\": {\n\"Canales\": \"Salas\"\n}\n}", + "Custom_User_Status": "Estado de usuario personalizado", + "Custom_User_Status_Add": "Añadir estado de usuario personalizado", + "Custom_User_Status_Added_Successfully": "Estado de usuario personalizado añadido con éxito", + "Custom_User_Status_Delete_Warning": "La eliminación de un estado de usuario personalizado no puede deshacerse.", "Custom_User_Status_Error_Invalid_User_Status": "Estado de usuario no válido", + "Custom_User_Status_Error_Name_Already_In_Use": "El nombre de usuario personalizado ya está en uso.", + "Custom_User_Status_Has_Been_Deleted": "El estado de usuario personalizado ha sido eliminado", + "Custom_User_Status_Info": "Información sobre el estado de usuario personalizado", + "Custom_User_Status_Updated_Successfully": "Estado de usuario personalizado actualizado con éxito", "Customize": "Personaliza", "CustomSoundsFilesystem": "Sistema de archivos de sonidos personalizados", "Dashboard": "Tablero", + "Data_processing_consent_text": "Texto de consentimiento de procesamiento de datos", + "Data_processing_consent_text_description": "Utilice esta configuración para explicar que puede recopilar, almacenar y procesar la información personal del cliente a lo largo de la conversación.", "Date": "Fecha", "Date_From": "Desde", "Date_to": "hasta", "days": "días", + "Days": "Días", "DB_Migration": "Migración de base de datos", "DB_Migration_Date": "Fecha de migración de base de datos", "DDP_Rate_Limit_IP_Enabled": "Límite por IP: habilitado", @@ -980,8 +1097,10 @@ "DDP_Rate_Limit_Connection_By_Method_Interval_Time": "Límite de Conexión por Método: intervalo de tiempo", "Deactivate": "Desactivar", "Decline": "Decadencia", + "Decode_Key": "Clave de decodificación", "Default": "Por defecto", "Delete": "Eliminar", + "Delete_all_closed_chats": "Eliminar todos los chats cerrados", "delete-c": "Eliminar Canales Públicos", "delete-c_description": "Permiso para eliminar canales públicos", "delete-d": "Eliminar mensajes directos", @@ -1013,14 +1132,22 @@ "Desktop_Notifications_Duration": "Duración de las notificaciones del escritorio", "Desktop_Notifications_Duration_Description": "Segundos para mostrar notificación de escritorio. Esto puede afectar el centro de notificaciones de OS X. Introduzca 0 para utilizar la configuración del navegador por defecto y no afectar Centro de Notificación X OS.", "Desktop_Notifications_Enabled": "Las Notificaciones de Escritorio están Habilitadas", + "Desktop_Notifications_Not_Enabled": "Las notificaciones de escritorio no están habilitadas", + "Details": "Detalles", "Different_Style_For_User_Mentions": "Estilo diferente para las menciones del usuario", + "Direct_message_creation_description": "Estás a punto de crear un chat con múltiples usuarios. Añade a los usuarios con los que te gustaría hablar, todos en el mismo lugar, usando mensajes directos.", + "Direct_message_you_have_joined": "Se ha unido a un nuevo mensaje directo con", "Direct_message_someone": "Mensaje directo a alguien", + "Direct_Message": "Mensaje directo", "Direct_Messages": "Mensajes Directos", "Direct_Reply": "Respuesta directa", + "Direct_Reply_Advice": "Puedes responder directamente a este correo electrónico. No modifique los correos electrónicos anteriores en el hilo.", "Direct_Reply_Debug": "Respuesta directa a la depuración", "Direct_Reply_Debug_Description": "[Cuidado] Habilitar el modo de depuración mostraría su \"Contraseña de texto sin formato\" en la Consola del administrador.", "Direct_Reply_Delete": "Eliminar correos electrónicos interceptados", + "Direct_Reply_Delete_Description": "[¡Atención!] Si se activa esta opción, todos los mensajes no leídos se borran irrevocablemente, incluso los que no son respuestas directas. El buzón de correo electrónico configurado está entonces siempre vacío y no puede ser procesado en \"paralelo\" por humanos.", "Direct_Reply_Enable": "Habilitar respuesta directa", + "Direct_Reply_Enable_Description": "[¡Atención!] Si \"Respuesta Directa\" está habilitado, Rocket.Chat controlará el buzón de correo electrónico configurado. Todos los correos electrónicos no leídos son recuperados, marcados como leídos y procesados. \"Respuesta directa\" sólo debe ser activada si el buzón utilizado está destinado exclusivamente para el acceso de Rocket.Chat y no es leído/procesado \"en paralelo\" por humanos.", "Direct_Reply_Frequency": "Frecuencia de verificación de correo electrónico", "Direct_Reply_Frequency_Description": "(en minutos, por defecto / mínimo 2)", "Direct_Reply_Host": "Host de respuesta directa", @@ -1036,14 +1163,26 @@ "Disable_Facebook_integration": "Deshabilitar la integración de Facebook", "Disable_Notifications": "Deshabilitar notificaciones", "Disable_two-factor_authentication": "Deshabilitar la autenticación en dos pasos", + "Disable_two-factor_authentication_email": "Desactivar la autenticación de doble factor por correo electrónico", "Disabled": "Deshabilitado", "Disallow_reacting": "No permitir la reacción", "Disallow_reacting_Description": "No permite reaccionar", + "Disconnect": "Desconectar", "Display_offline_form": "Mostrar formulario fuera línea", + "Display_setting_permissions": "Permisos de visualización para cambiar la configuración", + "Display_chat_permissions": "Mostrar los permisos de chat", "Display_unread_counter": "Mostrar el número de mensajes no leídos", "Displays_action_text": "Mostrar texto de la acción", + "Discussion_name": "Nombre de la discusión", + "Discussion": "Discusión", "Discussions": "Discusiones", "Discussion_start": "Empezar una discusión", + "Discussion_target_channel_description": "Selecciona un canal que esté relacionado con lo que quieres preguntar", + "Discussion_target_channel_prefix": "Estás creando una discusión en", + "Discussion_target_channel": "Canal o grupo padre", + "Discussion_description": "¡Ayuda a mantener una visión general de lo que está pasando! Al crear una discusión, se crea un subcanal del que seleccionó y ambos se vinculan.", + "Discussion_first_message_title": "Su mensaje", + "Discussion_title": "Crear una nueva discusión", "Dont_ask_me_again": "No me preguntes otra vez!", "Dont_ask_me_again_list": "No me preguntes de nuevo", "Do_not_display_unread_counter": "No mostrar ningún contador de este canal", @@ -1055,21 +1194,43 @@ "Domain_removed": "Dominio Borrado", "Domains": "Dominios", "Domains_allowed_to_embed_the_livechat_widget": "Lista de dominios separados por comas que permite incrustar el widget de chat en vivo. Déjelo en blanco para permitir todos los dominios.", + "Downloading_file_from_external_URL": "Descargando archivo desde URL externa", + "Download_Info": "Información de descarga", "Download_My_Data": "Descargar mis datos", + "Download_Pending_Files": "Descargar archivos pendientes", "Download_Snippet": "Descargar", + "Do_not_provide_this_code_to_anyone": "No comparta este código con nadie.", "Drop_to_upload_file": "Arrastra aqui para subir el archivo", "Dry_run": "Funcionamiento en seco", "Dry_run_description": "Se enviara únicamente un correo electrónico, a la misma dirección establecida en el campo De. El correo electrónico debe pertenecer a un usuario valido.", + "duplicated-account": "Cuenta duplicada", "Duplicate_archived_channel_name": "Ya existe un canal archivado con el nombre ' %s' ", "Duplicate_archived_private_group_name": "Ya existe un grupo privado archivado con el nombre ' %s' ", "Duplicate_channel_name": "Ya existe un canal con el nombre '%s' ", + "Duplicated_Email_address_will_be_ignored": "La dirección de correo electrónico duplicada será ignorada.", + "Duplicate_file_name_found": "Se encontró un nombre de archivo duplicado.", "Duplicate_private_group_name": "Ya existe un Grupo Privado con el nombre '%s' ", "Duration": "Duración", + "E2E Encryption": "Cifrado E2E", + "E2E_Enabled": "E2E activado", + "E2E_Enable_alert": "¡Esta característica está actualmente en beta! Por favor, informa de los errores a github.com/RocketChat/Rocket.Chat/issues y ten en cuenta:
- Los mensajes cifrados de las salas cifradas no serán encontrados por las operaciones de búsqueda.
- Las aplicaciones móviles pueden no soportar los mensajes cifrados (lo están implementando).
- Los bots pueden no ser capaces de ver los mensajes cifrados hasta que implementen el soporte para ello.
- Las subidas no serán cifradas en esta versión.", + "E2E_Enable_description": "Habilitar la opción de crear grupos cifrados y poder cambiar los grupos y dirigir los mensajes a cifrar", + "E2E_Enabled_Default_DirectRooms": "Habilitar la encriptación para las Rooms directas por defecto", + "E2E_Enabled_Default_PrivateRooms": "Habilitar la encriptación para las Rooms privadas por defecto", + "E2E_Encryption_Password_Change": "Cambiar la contraseña de cifrado", + "E2E_Encryption_Password_Explanation": "Ahora puede crear grupos privados codificados y mensajes directos. También puede cambiar los grupos privados o mensajes directos existentes a cifrados.

Esto es cifrado de extremo a extremo, así que la clave para cifrar/descifrar tus mensajes no se guardará en el servidor. Por esa razón necesitas guardar tu contraseña en un lugar seguro. Se te pedirá que la introduzcas en otros dispositivos en los que desees utilizar la encriptación de E2E.", + "E2E_password_reveal_text": "Ahora puede crear grupos privados codificados y mensajes directos. También puedes cambiar los grupos privados o mensajes directos existentes a cifrados.

Esto es cifrado de extremo a extremo, así que la clave para cifrar/descifrar tus mensajes no se guardará en el servidor. Por esa razón necesitas almacenar esta contraseña en un lugar seguro. Se te pedirá que la introduzcas en otros dispositivos en los que desees utilizar cifrado E2E. ¡Aprende más aquí!

Tu contraseña es: %s

Esta es una contraseña autogenerada, puedes configurar una nueva contraseña para tu clave de cifrado en cualquier momento desde cualquier navegador en el que hayas introducido la contraseña existente.
Esta contraseña sólo se almacena en este navegador hasta que guardes la contraseña y desestimes este mensaje.", + "E2E_password_request_text": "Para acceder a sus grupos privados cifrados y a los mensajes directos, introduzca su contraseña de cifrado. Necesitas introducir esta contraseña para cifrar/descifrar tus mensajes en cada cliente que utilices, ya que la clave no se almacena en el servidor.", + "E2E_Reset_Key_Explanation": "Esta opción eliminará su clave E2E actual y le desconectará.
Cuando vuelva a iniciar sesión, Rocket.Chat le generará una nueva clave y restaurará su acceso a cualquier sala cifrada que tenga uno o más miembros en línea.
Debido a la naturaleza del cifrado E2E, Rocket.Chat no podrá restaurar el acceso a ninguna sala cifrada que no tenga ningún miembro en línea.", "Edit": "Editar", + "Edit_Invite": "Editar invitación", + "Edit_Status": "Editar estado", "edit-message": "Editar Mensaje", "edit-message_description": "Permiso para editar un mensaje dentro de una sala", "edit-other-user-active-status": "Editar el estado activo de otro usuario", "edit-other-user-active-status_description": "Permiso para habilitar o deshabilitar otras cuentas", + "edit-other-user-avatar": "Editar el avatar de otro usuario", + "edit-other-user-avatar_description": "Permiso para cambiar el avatar de otro usuario.", "edit-other-user-info": "Editar la información de otro usuario", "edit-other-user-info_description": "Permiso para cambiar el nombre de otro usuario, nombre de usuario o dirección de correo electrónico.", "edit-other-user-password": "Editar la contraseña de otro usuario", @@ -1093,27 +1254,36 @@ "Email_already_exists": "El correo electrónico ya existe", "Email_body": "Cuerpo del Correo electrónico", "Email_Change_Disabled": "Su administrador ha deshabilitado el cambio de correo electrónico", + "Email_Changed_Description": "Puede utilizar los siguientes marcadores de posición:
  • [email] para el correo electrónico del usuario.
  • [Nombre_del_sitio] y [Site_URL] para el nombre de la aplicación y la URL respectivamente.
", + "Email_Changed_Email_Subject": "[Site_Name] - La dirección de correo electrónico ha sido modificada", + "Email_changed_section": "Dirección de correo electrónico modificada", "Email_Footer_Description": "Es posible utilizar los siguientes marcadores:
  • [Site_Name] y [Site_URL] para el nombre de la aplicación y la URL, respectivamente.
", "Email_from": "De", + "Email_Notifications_Change_Disabled": "El administrador de Rocket.Chat ha desactivado las notificaciones de correo electrónico", "Email_Header_Description": "Es posible utilizar los siguientes marcadores:
  • [Site_Name] y [Site_URL] para el nombre de la aplicación y la URL, respectivamente.
", "Email_Notification_Mode": "Notificaciones por correo electrónico fuera de línea", "Email_Notification_Mode_All": "Cada Mención / DM", "Email_Notification_Mode_Disabled": "Deshabilitado", + "Email_notification_show_message": "Mostrar el mensaje en la notificación por correo electrónico", "Email_or_username": "Correo electrónico o nombre de usuario", "Email_Placeholder": "Por favor, introduzca su dirección de correo electrónico...", "Email_Placeholder_any": "Por favor ingrese las direcciones de correo electrónico ...", "Email_subject": "Asunto", + "email_style_label": "Estilo de correo electrónico", + "email_style_description": "Evitar selectores anidados", "Email_verified": "Correo electrónico verificado", + "email_plain_text_only": "Envía correos electrónicos en texto plano", "Emoji": "Emoji", "Emoji_provided_by_JoyPixels": "Emoji proporcionado por JoyPixels", "EmojiCustomFilesystem": "Sistema de Archivos Emoji Personalizado", - "Empty_title": "Titulo Vacío", + "Empty_title": "Titulo vacío", "Enable": "Habilitar", "Enable_Auto_Away": "Habilitar Auto Ausente", "Enable_Desktop_Notifications": "Habilitar Notificaciones de Escritorio", "Enable_Svg_Favicon": "Habilitar favicon SVG", "Enable_two-factor_authentication": "Habilitar la autenticación en 2 pasos", "Enabled": "Habilitado", + "Encrypted": "Cifrado", "Encrypted_message": "Mensaje cifrado", "End_OTR": "Finalizar OTR", "Enter_a_regex": "Introduzca un regex", @@ -1134,6 +1304,7 @@ "error-archived-duplicate-name": "Hay un canal archivado con el nombre '__room_name__'", "error-avatar-invalid-url": "URL de avatar inválida: __url__", "error-avatar-url-handling": "Error durante la manipulación de ajuste de imagen de usuario desde una dirección URL (__url__) para __username__", + "error-cannot-delete-app-user": "No se permite borrar el usuario de la aplicación, desinstale la aplicación correspondiente para eliminarla.", "error-cant-invite-for-direct-room": "No se puede invitar al usuario salas directos", "error-channels-setdefault-is-same": "La configuración predeterminada del canal es la misma a la que se cambiaría.", "error-channels-setdefault-missing-default-param": "El bodyParam 'predeterminado' es obligatorio", @@ -1149,32 +1320,39 @@ "error-email-send-failed": "Error al intentar enviar un correo electrónico: __message__", "error-field-unavailable": "__field__ ya está en uso :(", "error-file-too-large": "El archivo es demasiado grande", + "error-forwarding-chat-same-department": "El departamento seleccionado y el actual departamento de la sala son los mismos", "error-importer-not-defined": "El importador no se definió correctamente, no se encuentra la Clase de Importación.", + "error-import-file-extract-error": "No se pudo extraer el archivo de importación.", + "error-import-file-is-empty": "El archivo importado parece estar vacío.", + "error-import-file-missing": "No se encontró el archivo a importar en la ruta especificada.", "error-input-is-not-a-valid-field": "__input__ no es un __field__ válido", "error-invalid-actionlink": "Enlace de acción inválido", + "error-invalid-account": "Cuenta no válida", "error-invalid-arguments": "Argumentos inválidos", - "error-invalid-asset": "Activo invalido", + "error-invalid-asset": "Recurso no válido", "error-invalid-channel": "Canal no válido.", "error-invalid-channel-start-with-chars": "Canal no válido. Comience con @ o #", "error-invalid-custom-field": "Campo personalizado no válido", - "error-invalid-custom-field-name": "No válido nombre de campo personalizado. Utilice sólo letras, números, guiones y guiones bajos.", - "error-invalid-date": "Fecha inválida.", + "error-invalid-custom-field-name": "Nombre de campo personalizado no válido . Utilice sólo letras, números, guiones y guiones bajos.", + "error-invalid-custom-field-value": "Valor no válido para el campo __field__", + "error-invalid-date": "Fecha no válida.", "error-invalid-description": "Descripción no valida", "error-invalid-domain": "Dominio no válido", "error-invalid-email": "__email__ email no es válido", - "error-invalid-email-address": "Dirección de correo inválida", + "error-invalid-email-address": "Dirección de correo no válida", "error-invalid-file-height": "Altura Invalida de Archivo", "error-invalid-file-type": "Tipo Invalido de Archivo", - "error-invalid-file-width": "Anchura Invalida de Archivo", - "error-invalid-from-address": "Ha ingresado una dirección invalida en el campo De", + "error-invalid-file-width": "Anchura de archivo no válida", + "error-invalid-from-address": "Ha indicado una dirección no válida en el campo De", + "error-invalid-inquiry": "Investigación no válida", "error-invalid-integration": "Integración inválida", "error-invalid-message": "Mensaje inválido", "error-invalid-method": "Método inválido", "error-invalid-name": "Nombre inválido", "error-invalid-password": "Contraseña inválida", - "error-invalid-permission": "Permiso inválido", - "error-invalid-redirectUri": "inválida redirectUri", - "error-invalid-role": "Role inválido", + "error-invalid-permission": "Permiso no válido", + "error-invalid-redirectUri": "redirectUri no válida", + "error-invalid-role": "Rol no válido", "error-invalid-room": "Sala no válida", "error-invalid-room-name": "__room_name__ no es un nombre válido de Sala, utilice sólo letras, números, guiones y guiones bajos", "error-invalid-room-type": "__type__ no es un tipo valido de Sala.", @@ -1193,6 +1371,7 @@ "error-no-tokens-for-this-user": "No hay ningún token para este usuario", "error-not-allowed": "No permitido", "error-not-authorized": "No autorizado", + "error-office-hours-are-closed": "El horario de oficina está cerrado.", "error-password-policy-not-met": "La contraseña no cumple con la política del servidor", "error-password-policy-not-met-maxLength": "La contraseña no cumple con la política del servidor de longitud máxima (contraseña demasiado larga)", "error-password-policy-not-met-minLength": "La contraseña no cumple con la política de longitud mínima del servidor (contraseña demasiado corta)", @@ -1203,26 +1382,38 @@ "error-password-policy-not-met-repeatingCharacters": "La contraseña no cumple con la política del servidor de caracteres repetitivos prohibidos (tiene demasiados caracteres iguales uno al lado del otro)", "error-push-disabled": "Push está desactivado", "error-remove-last-owner": "Este es el último propietario. Por favor, establece un nuevo propietario antes de eliminar este.", + "error-tags-must-be-assigned-before-closing-chat": "La(s) etiqueta(s) debe(n) ser asignada(s) antes de cerrar el chat", "error-role-in-use": "No puede eliminar el rol porque esta en uso", "error-role-name-required": "El nombre de rol es requerido", "error-room-is-not-closed": "La habitación no está cerrada", + "error-selected-agent-room-agent-are-same": "El agente seleccionado y el agente de la sala son los mismos", + "Error_Site_URL": "Site_Url no válida", + "Error_Site_URL_description": "Por favor, actualice el valor de configuración \"Site_Url\" encuentre más información aquí", "error-the-field-is-required": " E campo __field__. es requerido", "error-this-is-not-a-livechat-room": "Esta no es una sala de Livechat", "error-personal-access-tokens-are-current-disabled": "Las claves de acceso personales están actualmente desactivadas", + "error-token-already-exists": "Ya existe un token con este nombre", + "error-token-does-not-exists": "El token no existe", "error-too-many-requests": "Error, demasiadas peticiones. Por favor más despacio. Debe esperar __seconds__ segundos antes de volver a intentarlo.", "error-user-has-no-roles": "El usuario no tiene roles", "error-user-is-not-activated": "El usuario no ha sido activado", + "error-user-is-not-agent": "El usuario no es un agente de Omnichannel", "error-user-limit-exceeded": "La cantidad de usuarios a los que intenta invitar #canal_name supera el límite establecido por el administrador", "error-user-not-in-room": "El usuario no se encuentra en esta sala", "error-logged-user-not-in-room": "No estás en la sala `%s`", "error-user-registration-disabled": "El registro de usuarios está desactivado", "error-user-registration-secret": "El registro de usuario sólo se permite a través de URL Secreta", + "error-validating-department-chat-closing-tags": "Se requiere al menos una etiqueta de cierre cuando el departamento requiere etiqueta(s) en las conversaciones de cierre.", "error-you-are-last-owner": "Usted es el último propietario. Por favor, establezca un nuevo propietario antes de salir de la Sala.", + "error-starring-message": "No se pudo marcar el mensaje como favorito", "Error_404": "Error 404", "Error_changing_password": "Error al cambiar de contraseña", "Error_loading_pages": "Error al cargar páginas", "Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances": "Error: Rocket.Chat requiere oplog tail cuando se ejecuta en varias instancias", "Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances_details": "Asegúrese de que su MongoDB esté en modo ReplicaSet y que la variable de entorno MONGO_OPLOG_URL esté definida correctamente en el servidor de aplicaciones.", + "Error_sending_livechat_transcript": "Error al enviar la transcripción de Omnichannel", + "Error_sending_livechat_offline_message": "Error al enviar el mensaje Omnichannel de fuera de línea", + "Errors_and_Warnings": "Errores y advertencias", "Esc_to": "Esc a", "Event_Trigger": "Activador de evento", "Event_Trigger_Description": "Seleccione qué tipo de evento activará esta integración saliente de WebHook", @@ -1235,39 +1426,81 @@ "every_six_hours": "Una vez cada seis horas", "every_day": "Una vez al día", "Everyone_can_access_this_channel": "Todos pueden acceder a este canal", + "Exact": "Exactamente", "Example_s": "Ejemplo: %s", "Exclude_Botnames": "Excluir Bots", "Exclude_Botnames_Description": "No propagar los mensajes de bots cuyos nombres coincidan con la expresión regular. Se se deja en blanco, todos los mensajes de los bots se propagarán.", "Exclude_pinned": "Excluir mensajes fijados", "except_pinned": "(excepto aquellos que están inmovilizados)", "Execute_Synchronization_Now": "Ejecutar sincronización ahora", + "Exit_Full_Screen": "Salir de pantalla completa", + "Experimental_Feature_Alert": "¡Esta es una característica experimental! Por favor, tenga en cuenta que puede cambiar, fallar o incluso ser eliminada en el futuro sin previo aviso.", + "Expiration": "Expiración", + "Expiration_(Days)": "Expiración (días)", "Export_My_Data": "Exportar mis datos", + "expression": "Expresión", + "Extended": "Ampliado", + "External_Domains": "Dominios externos", + "External_Users": "Usuarios externos", "External_Queue_Service_URL": "URL del servicio de cola externa", "External_Service": "Servicio externo", "Facebook_Page": "Pagina de Facebook", + "Failed": "Error", + "Failed_to_activate_invite_token": "Error al activar el token de invitación", + "Failed_To_Download_Files": "Error al descargar ficheros", + "Failed_to_generate_invite_link": "Error al generar enlace de invitación", + "Failed_To_Load_Import_Data": "Error al cargar importación de datos", + "Failed_To_Load_Import_History": "Error al cargar importación de histórico", + "Failed_To_Load_Import_Operation": "Error al cargar operación de importación", + "Failed_To_Start_Import": "Error al iniciar operación de importación", + "Failed_to_validate_invite_token": "Error al validar token de invitación", "False": "Falso", "Favorite_Rooms": "Habilitar salas favoritas", "Favorite": "Favorito", "Favorites": "Favoritos", "Feature_Depends_on_Livechat_Visitor_navigation_as_a_message_to_be_enabled": "Esta función depende de \"Enviar el historial de navegación de visitantes como un mensaje\" para que se habilite.", "Features_Enabled": "Funcionalidades habilitadas", + "FEDERATION_Discovery_Method": "Método de descubrimiento", "FEDERATION_Domain": "Dominio", + "FEDERATION_Domain_Description": "Añada el dominio al que este servidor debería estar vinculado, por ejemplo: @rocket.chat.", + "FEDERATION_Domain_Alert": "No cambie esto después de activar la función, todavía no podemos gestionar los cambios de dominio.", + "FEDERATION_Enabled": "Intentar integrar la federación de soporte.", + "FEDERATION_Enabled_Alert": "La federación de soporte está en progreso. Su uso en un entorno de producción no se recomienda de momento.", + "FEDERATION_Public_Key": "Clave pública", + "FEDERATION_Public_Key_Description": "Esta es la clave que necesita para compartir con sus compañeros.", + "FEDERATION_Room_Status": "Estado de la federación", "FEDERATION_Status": "Estado", + "FEDERATION_Test_Setup": "Probar configuración", + "FEDERATION_Test_Setup_Error": "No se pudo encontrar el servidor usando esta configuración, por favor, revise la configuración.", + "FEDERATION_Test_Setup_Success": "¡La configuración de federación está funcionando y otros servidores pueden encontrarte!", + "FEDERATION_Unique_Id": "ID único", + "FEDERATION_Unique_Id_Description": "Este es el ID de federación único, usado para identificar a tu compañero en la red.", + "FEDERATION_Error_user_is_federated_on_rooms": "No se puede eliminar a los usuarios federados que pertenecen a las salas", "Field": "Campo", "Field_removed": "Campo eliminado", "Field_required": "Campo requerido", + "File": "Archivo", + "File_Downloads_Started": "Se iniciaron las descargas de archivos", + "Files": "Archivos", "File_exceeds_allowed_size_of_bytes": "El archivo supera el tamaño permitido de __size__ ", "File_name_Placeholder": "Buscar archivos...", - "File_removed_by_automatic_prune": "Archivo eliminado por prune automático", + "File_removed_by_automatic_prune": "Archivo eliminado por purgado automático", "File_not_allowed_direct_messages": "El uso compartido de archivos no está permitido en los mensajes directos.", - "File_removed_by_prune": "Archivo eliminado por ciruela", + "File_removed_by_prune": "Archivo eliminado por purgado", + "File_Path": "Ruta de archivo", + "File_Type": "Tipo de archivo", "File_type_is_not_accepted": "El tipo de archivo no es admitido.", "File_uploaded": "Archivo subido", + "File_uploaded_successfully": "Archivo subido con éxito", + "File_URL": "URL del archivo", "FileUpload": "Subir archivos", "FileUpload_Disabled": "Las cargas de archivos están deshabilitadas.", "FileUpload_Enabled": "Habilitar subir archivos", "FileUpload_Error": "Carga de archivos de error", "FileUpload_Enabled_Direct": "Cargas de archivos habilitadas en mensajes directos", + "FileUpload_Enable_json_web_token_for_files": "Habilitar la protección de Json Web Tokens para archivos subidos", + "FileUpload_Enable_json_web_token_for_files_description": "Añade un JWT a las url de los archivos subidos", + "FileUpload_json_web_token_secret_for_files_description": "File Upload Json Web Token Secret (Se utiliza para poder acceder a los archivos subidos sin autenticación)", "FileUpload_File_Empty": "Archivo Vacio", "FileUpload_FileSystemPath": "Ruta del sistema", "FileUpload_GoogleStorage_AccessId": "ID de acceso de almacenamiento de Google", @@ -1319,8 +1552,10 @@ "Filter": "Filtro", "Financial_Services": "Servicios financieros", "First_Channel_After_Login": "Primer canal después de iniciar sesión", + "First_response_time": "Tiempo de respuesta inicial", "Flags": "Indicadores", "Follow_message": "Seguir mensaje", + "Following": "Siguiendo", "Follow_social_profiles": "Sigue nuestros perfiles sociales, realiza un fork en github y comparte tus pensamientos acerca de la aplicación rocket.chat en nuestro tablero de Trello.", "Fonts": "Fuentes", "Food_and_Drink": "Comer y beber", @@ -1332,28 +1567,37 @@ "force-delete-message_description": "Permiso para eliminar un mensaje que pasa por alto todas las restricciones", "Force_SSL": "Forzar SSL", "Force_SSL_Description": "* Precaución! * _Force SSL_ nunca debe ser usado con proxy inverso. Si usted tiene un proxy inverso, debería hacer la redirección AHÍ. Esta opción existe para los despliegues como Heroku, que no permite la configuración de redirección en el proxy inverso.", + "Force_visitor_to_accept_data_processing_consent": "Obligar al visitante a aceptar el consentimiento para el procesamiento de datos", + "Force_visitor_to_accept_data_processing_consent_description": "Los visitantes no pueden empezar a chatear sin consentimiento.", "Invalid_Export_File": "El archivo subido no es un fichero de exportación válida %s.", - "Forgot_password": "Olvidaste tu contraseña", + "Force_visitor_to_accept_data_processing_consent_enabled_alert": "El acuerdo con el procesamiento de los datos debe basarse en una comprensión transparente de la razón del procesamiento. Por ello, debe rellenar la siguiente configuración que se mostrará a los usuarios con el fin de proporcionar las razones de la recogida y el procesamiento de su información personal.", + "Forgot_password": "¿Olvidó su contraseña?", "Forgot_Password_Description": "Puede usar los siguientes marcadores de posición:
  • [Forgot_Password_Url] para la URL de recuperación de contraseña.
  • [nombre], [fname], [lname] para el nombre completo, el nombre o el apellido del usuario, respectivamente.
  • [email] para el correo electrónico del usuario.
  • [Site_Name] y [Site_URL] para el nombre de la aplicación y la URL, respectivamente.
", "Forgot_Password_Email": "Haga clic en
aquípara restablecer su contraseña.", "Forgot_Password_Email_Subject": "[Site_Name] - Recuperación de contraseña", - "Forgot_password_section": "Se te olvidó tu contraseña", + "Forgot_password_section": "Olvidó su contraseña", "Forward": "Reenviar", "Forward_chat": "Reenviar chat", "Forward_to_department": "Reenviar a departamento", "Forward_to_user": "Reenviar a usuario", + "Free": "Libre", "Frequently_Used": "Usado frecuentemente", "Friday": "Viernes", "From": "De", "From_Email": "De Correo electrónico", "From_email_warning": "Advertencia: El campo De esta sujeto a la configuración en tu servidor de correo.", + "Full_Screen": "Pantalla completa", "Gaming": "Juego de azar", "General": "General", + "Generate_new_key": "Generar una nueva clave", + "Generating_key": "Generando clave", "Get_link": "Obtener enlace", + "Generate_New_Link": "Generar un nuevo enlace", "github_no_public_email": "No tienes ningún correo electrónico como un correo público en tú cuenta de GitHub", "Give_a_unique_name_for_the_custom_oauth": "Establezca un nombre único para el oauth personalizado", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Dar a la aplicación un nombre. Esto será visto por los usuarios.", "Global": "Global", + "Global Policy": "Política global", "Global_purge_override_warning": "Una política de retención global está en su lugar. Si desactivas \"Anular política de retención global\", solo puedes aplicar una política más estricta que la política global.", "Global_Search": "Búsqueda global", "Go_to_your_workspace": "Ve a tu espacio de trabajo", @@ -1378,21 +1622,29 @@ "GoogleVision_Type_SafeSearch": "Detección SafeSearch", "GoogleVision_Type_Similar": "Buscar imágenes similares", "Government": "Gobierno", + "Graphql_Enabled": "GraphQL habilitado", + "Graphql_CORS": "CORS de GraphQL", + "Graphql_Subscription_Port": "Puerto de suscripción de GraphQL", "Group_by_Type": "Agrupar por tipo", "Group_discussions": "Discusiones de grupo", "Group_favorites": "Favoritos del grupo", "Group_mentions_disabled_x_members": "El grupo menciona `@ all` y` @ here` se han inhabilitado para salas con más de __total__ miembros.", "Group_mentions_only": "El grupo solo menciona", + "Grouping": "Agrupación", "Hash": "Hash", "Header": "Encabezado", "Header_and_Footer": "Encabezado y Pie de página", "Healthcare_and_Pharmaceutical": "Salud / Farmacéutica", + "Here_is_your_authentication_code": "Este es su código de autenticación:", "Help_Center": "Centro de ayuda", "Helpers": "Ayudantes", "Hex_Color_Preview": "Hex Color Preview", + "Hi": "Hola", + "Hi_username": "Hola __name__", "Hidden": "Oculto", "Hide": "Ocultar", "Hide_Avatars": "Ocultar avatares", + "Hide_Avatars_Sidebar": "Ocultar avatares en la barra lateral", "Hide_counter": "Ocultar contador", "Hide_flextab": "Ocultar Barra Lateral Derecha con un Click", "Hide_Group_Warning": "¿Seguro que desea ocultar el grupo \"%s\"?", @@ -1413,17 +1665,22 @@ "How_friendly_was_the_chat_agent": "Ha sido amable el agente de chat?", "How_knowledgeable_was_the_chat_agent": "Cuánto sabía el agente de chat?", "How_long_to_wait_after_agent_goes_offline": "Cuánto tiempo esperar después de que el agente se desconecta", + "How_long_to_wait_to_consider_visitor_abandonment": "¿Cuánto tiempo hay que esperar para considerar el abandono de visitantes?", "How_responsive_was_the_chat_agent": "Cómo de rápido ha respondido nuestro agente de chat?", "How_satisfied_were_you_with_this_chat": "Cómo de satisfecho está con esta conversación?", "How_to_handle_open_sessions_when_agent_goes_offline": "Cómo manejar las sesiones abiertas cuando el agente se desconecta", + "I_ll_do_it_later": "Lo haré más tarde", + "I_saved_my_password_close_this_message": "He guardado mi contraseña, cierra este mensaje", "Idle_Time_Limit": "Tiempo límite de inactividad", "Idle_Time_Limit_Description": "Periodo de tiempo hasta que el estado cambie para alejarse. El valor debe estar en segundos.", "if_they_are_from": "(si son de %s)", "If_this_email_is_registered": "Si este correo electrónico está registrado, le enviaremos instrucciones sobre cómo restablecer su contraseña. Si no recibe un correo electrónico en breve, vuelva y vuelva a intentarlo.", "If_you_are_sure_type_in_your_password": "Si está seguro escriba su contraseña:", + "Members_List": "Lista de Miembros", "If_you_are_sure_type_in_your_username": "Si está seguro ingrese su nombre de usuario:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Si no tiene uno, envíe un correo electrónico a [omni@rocket.chat] (mailto: omni@rocket.chat) para obtener el suyo.", "If_you_didnt_ask_for_reset_ignore_this_email": "Si no pediste resetear tu contraseña, puedes ignorar este correo electrónico.", + "If_you_didnt_try_to_login_in_your_account_please_ignore_this_email": "Si no has intentado acceder a tu cuenta, por favor, ignora este correo electrónico.", "Iframe_Integration": "Integración iframe", "Iframe_Integration_receive_enable": "Habilitar Recibir", "Iframe_Integration_receive_enable_Description": "Permitir que la ventana principal envíe comandos a Rocket.Chat.", @@ -1433,14 +1690,22 @@ "Iframe_Integration_send_enable_Description": "Enviar eventos a la ventana principal", "Iframe_Integration_send_target_origin": "Enviar origen de destino", "Iframe_Integration_send_target_origin_Description": "Origen con prefijo de protocolo, cuyos comandos se envían a, p. 'https: // localhost', o * para permitir el envío a cualquier parte.", + "Iframe_Restrict_Access": "Restringir el acceso dentro de cualquier Iframe", + "Iframe_Restrict_Access_Description": "Esta configuración habilita/deshabilita las restricciones para cargar el RC dentro de cualquier iframe", + "Iframe_X_Frame_Options": "Opciones de X-Frame-Options", + "Iframe_X_Frame_Options_Description": "Opciones de X-Frame-Options. [Puede consultar más detalles aquí.] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options#Syntax)", "Ignore": "Ignorar", "Ignored": "Ignorado", + "Images": "Imágenes", "IMAP_intercepter_already_running": "El interceptor IMAP ya está funcionando", "IMAP_intercepter_Not_running": "Interceptor IMAP no se está ejecutando", "Impersonate_next_agent_from_queue": "Suplantar al siguiente agente de la cola", "Impersonate_user": "Suplantar usuario", "Impersonate_user_description": "Cuando está habilitado, las publicaciones de integración como el usuario que desencadenó la integración", "Import": "Importación", + "Import_Type": "Tipo de importación", + "Import_New_File": "Importar un nuevo archivo", + "Import_requested_successfully": "Importación solicitada con éxito", "Importer_Archived": "Archivado", "Importer_CSV_Information": "El importador de CSV requiere un formato específico; lea la documentación sobre cómo estructurar su archivo zip:", "Importer_done": "¡Importación terminada!", @@ -1451,6 +1716,7 @@ "Importer_import_cancelled": "Importación cancelada.", "Importer_import_failed": "Se produjo un error durante la ejecución de la importación.", "Importer_importing_channels": "Importando los canales.", + "Importer_importing_files": "Importando los archivos.", "Importer_importing_messages": "Importando los mensajes.", "Importer_importing_started": "Iniciando la importación.", "Importer_importing_users": "Importando los usuarios.", @@ -1464,14 +1730,42 @@ "Importer_setup_error": "Se produjo un error al configurar el importador.", "Importer_Slack_Users_CSV_Information": "El archivo cargado debe ser el archivo de exportación de usuarios de Slack, que es un archivo CSV. Vea aquí para más información:", "Importer_Source_File": "Selección del archivo de origen", + "importer_status_new": "No iniciado", + "importer_status_uploading": "Subiendo archivo", + "importer_status_downloading_file": "Descargando archivo", + "importer_status_file_loaded": "Archivo cargado", + "importer_status_preparing_started": "Leyendo archivos", + "importer_status_preparing_users": "Leyendo archivo de usuarios", + "importer_status_preparing_channels": "Leyendo archivo de canales", + "importer_status_preparing_messages": "Leyendo archivo de mensajes", + "importer_status_user_selection": "Preparado para seleccionar lo que se va a importar", + "importer_status_importing_started": "Importando datos", + "importer_status_importing_users": "Importando usuarios", + "importer_status_importing_channels": "Importando canales", + "importer_status_importing_files": "Importando archivos", + "importer_status_importing_messages": "Importando mensajes", "importer_status_finishing": "Casi listo", + "importer_status_done": "Completado con éxito", "importer_status_import_failed": "Error", + "importer_status_import_cancelled": "Cancelado", + "Importer_Upload_FileSize_Message": "La configuración de su servidor permite subir archivos de tamaño hasta __maxFileSize__.", + "Importer_Upload_Unlimited_FileSize": "La configuración de su servidor permite la subida de archivos de cualquier tamaño.", + "Importer_ExternalUrl_Description": "También puede utilizar una URL para un archivo de acceso público:", + "Importing_channels": "Importando canales", + "Importing_Data": "Importando datos", + "Importing_messages": "Importando mensajes", + "Importing_users": "Importando usuarios", "Inclusive": "Inclusivo", + "In_progress": "En progreso", "Incoming_Livechats": "LiveChats entrantes", "Incoming_WebHook": "WebHook entrante", + "Include_Offline_Agents": "Incluir agentes fuera de línea", "Industry": "Industria", - "initials_avatar": "Iniciales Avatar", + "Info": "Información", + "initials_avatar": "Avatar de iniciales", "inline_code": "inline_code", + "Install": "Instalar", + "Marketplace_view_marketplace": "Ver Marketplace", "Install_Extension": "Instalar Extensión", "Install_FxOs": "Instalar Rocket.Chat en su Firefox", "Install_FxOs_done": "Genial! Ya puede comenzar a usarRocket.Chat mediante el ícono en su Escritorio. ¡Diviértase usando Rocket.Chat!", @@ -1479,9 +1773,11 @@ "Install_FxOs_follow_instructions": "Por favor confirma la instalación de la aplicación en tu dispositivo (presione \"Instalar\" cuando se le solicite).", "Install_package": "Paquete de instalación", "Installation": "Instalación ", + "Installed": "Instalado", "Installed_at": "Instalación", "Invitation_HTML": "HTML de la Invitación", "Instance_Record": "Registro de instancia", + "Instructions": "Instrucciones", "Instructions_to_your_visitor_fill_the_form_to_send_a_message": "Instrucciones a sus visitantes llenan el formulario para enviar un mensaje", "Invitation_HTML_Default": "

Se le ha invitado a [Site_Name]

Ir a [Site_URL] y probar la mejor solución de chat de código abierto disponibles en la actualidad!

", "Insurance": "Seguro", @@ -1539,6 +1835,7 @@ "Invalid_Import_File_Type": "Tipo de archivo de importación inválido", "Invalid_name": "El nombre no debe estar vacío", "Invalid_notification_setting_s": "Configuración de la notificación inválido: %s", + "Invalid_or_expired_invite_token": "Token de invitación no válido o caducado", "Invalid_pass": "La contraseña no debe estar vacia", "Invalid_reason": "La razón para unirse no debe estar vacía", "Invalid_room_name": "%s no es un nombre de sala válido", @@ -1551,6 +1848,7 @@ "Invitation_Email_Description": "Es posible utilizar los siguientes marcadores:
  • [email] para el correo electrónico del destinatario.
  • [Site_Name] y [Site_URL] para el nombre de la aplicación y la URL, respectivamente.
", "Invitation_Subject": "Asunto de la Invitación", "Invitation_Subject_Default": "Se le ha invitado a [Site_Name]", + "Invite_Link": "Enlace de invitación", "Invite_user_to_join_channel": "Invitar a un usuario a unirse a este canal", "Invite_user_to_join_channel_all_from": "Invitar a todos los usuarios de [#channell] para unirse a este canal", "Invite_user_to_join_channel_all_to": "Invitar a todos los usuarios de este canal a unirse a [#channel]", @@ -1581,13 +1879,24 @@ "IssueLinks_Incompatible": "Advertencia: no habilite esto y la 'Vista previa de color hexadecimal' al mismo tiempo.", "IssueLinks_LinkTemplate": "Plantilla para enlaces de problemas", "IssueLinks_LinkTemplate_Description": "Plantilla para enlaces de problemas; %s será reemplazado por el número de problema.", + "Items_per_page:": "Elementos por página:", "It_works": "Funciona", + "italic": "Cursiva", "italics": "cursiva", + "Mobex_sms_gateway_address": "Dirección Mobex SMS Gateway", "Mobex_sms_gateway_from_number": "Desde", + "Mobex_sms_gateway_from_numbers_list": "Lista de números desde los que enviar SMS", + "Mobex_sms_gateway_from_numbers_list_desc": "Lista de números separados por comas para usar en el envío de mensajes nuevos, por ejemplo 123456789, 123456788, 123456888", "Mobex_sms_gateway_password": "Contraseña", + "Mobex_sms_gateway_restful_address": "Dirección Mobex SMS REST API", "Mobex_sms_gateway_username": "Nombre de usuario", + "Most_popular_channels_top_5": "Canales más populares (Top 5)", "Jitsi_Chrome_Extension": "Id extensión de Chrome", + "Jitsi_Enabled_TokenAuth": "Habilitar autenticación JWT", + "Jitsi_Application_ID": "ID de aplicación (iss)", + "Jitsi_Application_Secret": "Secreto de aplicación", "Jitsi_Enable_Channels": "Habilitar en Canales", + "Jitsi_Limit_Token_To_Room": "Limitar token a Jitsi Room", "Job_Title": "Título Profesional", "join": "Unirse", "join-without-join-code": "Únete sin unirte al código", @@ -1599,6 +1908,7 @@ "Join_the_given_channel": "Unirse al canal dado", "Join_video_call": "Unirse a la video llamada", "Joined": "Unido", + "Joined_at": "Se unió a", "Jump": "Saltar", "Jump_to_first_unread": "Saltar a la primera sin leer", "Jump_to_message": "Ir al mensaje", @@ -1619,6 +1929,7 @@ "Keyboard_Shortcuts_Keys_5": "Comando(o Alt) + Flecha derecha", "Keyboard_Shortcuts_Keys_6": "Comando(o Alt) + Flecha hacia abajo", "Keyboard_Shortcuts_Keys_7": "Shift+ Ingrese", + "Keyboard_Shortcuts_Mark_all_as_read": "Marcar todos los mensajes (en todos los canales) como leídos", "Keyboard_Shortcuts_Move_To_Beginning_Of_Message": "Mover al comienzo del mensaje", "Keyboard_Shortcuts_Move_To_End_Of_Message": "Mover al final del mensaje", "Keyboard_Shortcuts_New_Line_In_Message": "Nueva línea en el mensaje de redacción de mensaje", @@ -1627,12 +1938,28 @@ "Knowledge_Base": "Base de conocimiento", "Label": "Etiqueta", "Language": "Idioma", - "Language_Not_set": "No específico", + "Language_Dutch": "Holandés", + "Language_English": "Inglés", + "Language_French": "Francés", + "Language_German": "Alemán", + "Language_Italian": "Italiano", + "Language_Not_set": "No indicado", + "Language_Polish": "Polaco", + "Language_Portuguese": "Portugués", + "Language_Russian": "Ruso", + "Language_Spanish": "Español", "Language_Version": "Versión en Español", + "Last_active": "Último activo", "Last_login": "Ultimo inicio de sesion", "Last_Message_At": "Último Mensaje Por", "Last_seen": "Ultima vez visto", - "Last_Message": "Ultimo mensaje", + "Last_token_part": "Última parte del token", + "Last_Message": "Último mensaje", + "Last_Status": "Último estado", + "Last_Updated": "Última actualización", + "Last_7_days": "Últimos 7 días", + "Last_30_days": "Últimos 30 días", + "Last_90_days": "Últimos 90 días", "Launched_successfully": "Lanzado exitosamente", "Layout": "Diseño", "Layout_Home_Body": "Cuerpo de pagina de inicio", @@ -1642,6 +1969,7 @@ "Layout_Sidenav_Footer": "Pie de Pagina de la Barra de Navegación Lateral", "Layout_Sidenav_Footer_description": "El tamaño del Pie de Pagina es de 260 x 70px", "Layout_Terms_of_Service": "Términos del Servicio", + "Layout_Legal_Notice": "Aviso legal", "LDAP": "LDAP", "LDAP_Authentication": "Habilitar", "LDAP_Authentication_Password": "Contraseña", @@ -1706,10 +2034,22 @@ "LDAP_Sync_User_Data_Description": "Mantener los datos del usuario en sincronía con el servidor al iniciar sesión (ej: nombre, correo electrónico). ", "LDAP_Sync_User_Data_FieldMap": "Mapa de Campos de Datos de Usuario", "LDAP_Sync_User_Data_FieldMap_Description": "Configurar como los campos de cuenta de usuario ( como el correo electrónico) son llenados desde un registro en LDAP (una vez encontrados).
A modo de ejemplo, `{\"cn\":\"name\", \"mail\":\"email\"}` elegira el nombre legible de una persona desde el atributo cn, y su correo electrónico desde el atributo de correo electrónico.
Campos disponibles `nombre` y `correo electrónico`.", + "LDAP_Sync_User_Data_Groups": "Sincronizar grupos de LDAP", "manage-integrations": "Administrar integraciones", + "LDAP_Sync_User_Data_Groups_AutoChannels": "Sincronizar automáticamente grupos de LDAP a Channels", "manage-integrations_description": "Permiso para administrar las integraciones del servidor", + "LDAP_Sync_User_Data_Groups_AutoChannels_Admin_Description": "Cuando se crean automáticamente canales que no existen durante una sincronización, este usuario se convertirá automáticamente en el administrador del canal.", + "LDAP_Sync_User_Data_Groups_AutoChannels_Description": "Habilita esta función para añadir automáticamente usuarios a un canal basado en su grupo LDAP. Si desea eliminar también los usuarios de un canal, consulte la opción que aparece a continuación sobre la eliminación automática de usuarios.", "manage-own-integrations": "Administre sus propias integraciones", "manage-own-integrations_description": "Permiso para permitir a los usuarios crear y editar su propia integración o webhooks", + "LDAP_Sync_User_Data_Groups_AutoChannelsMap_Default": "// Habilitar la auto-sincronización de los grupos de LDAP a Channels", + "LDAP_Sync_User_Data_Groups_AutoRemove": "Eliminar automaticamente roles de usuario", + "LDAP_Sync_User_Data_Groups_AutoRemove_Description": "**Atención*: ¡Al activar esto se eliminarán automáticamente los usuarios de un rol si no están asignados en LDAP! Esto sólo eliminará automáticamente los roles que estén establecidos en el mapa de grupo de datos de usuario de abajo.", + "LDAP_Sync_User_Data_Groups_Enforce_AutoChannels": "Eliminar automáticamente usuarios de Channels", + "LDAP_Sync_User_Data_Groups_Enforce_AutoChannels_Description": "**Atención*: ¡Al activar esto se eliminarán todos los usuarios de un canal que no tengan el grupo LDAP correspondiente! Habilita esto sólo si sabes lo que estás haciendo.", + "LDAP_Sync_User_Data_Groups_Filter": "Filtro de grupo de usuarios", + "LDAP_Sync_User_Data_Groups_Filter_Description": "Filtro de búsqueda LDAP que se utiliza para comprobar si un usuario está en un grupo.", + "LDAP_Sync_User_Data_GroupsMap_Description": "Mapea los grupos LDAP a los roles de usuario de Rocket.Chat
Como ejemplo, `{\"rocket-admin\":\"admin\", \"tech-support\":\"support\"}` mapeará el grupo LDAP de rocket-admin al rol de \"admin\" de Rocket.", "LDAP_Test_Connection": "Probar Conexión ", "LDAP_Timeout": "Tiempo de espera (ms)", "LDAP_Timeout_Description": "Cuantas millas espera un resultado de búsqueda antes de devolver un error", @@ -1749,16 +2089,22 @@ "Livechat_forward_open_chats_timeout": "Tiempo de espera (en segundos) para reenviar los chats", "Livechat_guest_count": "Contador de invitados", "Livechat_Inquiry_Already_Taken": "Solicitud de chat en vivo ya atendida", + "Livechat_Installation": "Instalación de Livechat", "Livechat_managers": "Supervisores de livechat", + "Livechat_Managers": "Gestores", "Livechat_offline": "sin conexión Livechat", "Livechat_online": "Livechat en línea", + "Livechat_offline_message_sent": "Mensaje sin conexión enviado por Omnichannel ", "Livechat_Queue": "Cola de chat en vivo", "Livechat_registration_form": "Formulario de Registro", + "Livechat_registration_form_message": "Mensaje del formulario de registro", "Livechat_room_count": "COnteo de Sala Livechat", "Livechat_Routing_Method": "Método de enrutamiento del Livechat", "Livechat_Take_Confirm": "Quiere aceptar este cliente?", "Livechat_title": "Titulo del Chat en Vivo", "Livechat_title_color": "Color de Fondo del Titulo del Chat en línea", + "Livechat_transcript_sent": "Se ha enviado una transcripción de Omnichannel", + "Livechat_Triggers": "Disparadores Livechat", "Livechat_Users": "Los usuarios liveChat", "Livestream_close": "Cerrar Livestream", "Livestream_enable_audio_only": "Habilitar solo el modo de audio", @@ -1768,11 +2114,15 @@ "Livestream_switch_to_room": "Cambiar al livestream de la sala actual", "Livestream_url": "URL de origen de Livestream", "Livestream_url_incorrect": "La URL de Livestream es incorrecta", + "Load_Balancing": "Balanceo de carga", "Load_more": "Cargar más", "Loading...": "Cargando...", "Loading_more_from_history": "Cargando mas desde el historial", "Loading_suggestion": "Cargando sugerencias...", + "Local_Domains": "Dominios locales", + "Local_Password": "Contraseña local", "Localization": "Idioma", + "Location": "Ubicación", "Log_Exceptions_to_Channel_Description": "Un canal que recibirá todas las excepciones capturadas. Déjalo vacío para ignorar las excepciones.", "Log_Exceptions_to_Channel": "Registrar excepciones al canal", "Log_File": "Mostrar Archivo y Línea", @@ -1791,6 +2141,10 @@ "Logistics": "Logística", "Logout": "Cerrar sesión", "Logout_Others": "Cerrar Sesión en Todos los Lugares Donde se ha abierto una", + "Longest_chat_duration": "Duración de la charla más larga", + "Longest_reaction_time": "Tiempo de reacción más largo", + "Longest_response_time": "Tiempo de respuesta más largo", + "Logs": "Registros", "mail-messages": "Mensajes de correo", "mail-messages_description": "Permiso para usar la opción de mensajes de correo", "Mail_Message_Invalid_emails": "Ha proporcionado uno o mas correos electronicos invalidos %s", @@ -1798,12 +2152,13 @@ "Mail_Message_No_messages_selected_select_all": "No ha seleccionado ningún mensaje", "Mail_Messages": "Mensajes de correo", "Mail_Messages_Instructions": "Seleccione los mensajes que desea enviar por correo electrónico haciendo clic en los mensajes", + "Room_uploaded_file_list": "Lista de Archivos", "Mail_Messages_Subject": "Aquí hay una parte seleccionada de %s mensajes", "Mailer": "Remitente", "Mailer_body_tags": "Debe utilizar [unsubscribe] para el enlace de anulación de la suscripción.
Es posible utilizar [name], [fname], [lname] para el nombre completo del usuario, nombre o apellido, respectivamente.
Es posible utilizar [email] para el correo electrónico del usuario.", "Mailing": "Envío", "Make_Admin": "Hacer Administrador", - "Make_sure_you_have_a_copy_of_your_codes": "Asegúrese de tener una copia de sus códigos: __códigos__ Si pierde el acceso a su aplicación de autentificación, puede usar uno de estos códigos para iniciar sesión.", + "Make_sure_you_have_a_copy_of_your_codes": "Asegúrese de tener una copia de sus códigos: __codes__ Si pierde el acceso a su aplicación de autentificación, puede usar uno de estos códigos para iniciar sesión.", "manage-apps": "Administrar aplicaciones", "manage-assets": "Administrar activos", "manage-assets_description": "Permiso para administrar los activos del servidor", @@ -1815,6 +2170,7 @@ "manage-sounds_description": "Permiso para administrar los sonidos del servidor", "Manage_Apps": "Administrar aplicaciones", "Manage_the_App": "Administrar la aplicación", + "Managers": "Gestores", "Manager_added": "Supervisor agregado", "Manager_removed": "Supervisor eliminado", "Managing_assets": "La gestión de activos", @@ -1824,6 +2180,7 @@ "MapView_Enabled_Description": "La habilitación de mapview mostrará un botón de compartir ubicación a la izquierda del campo de entrada de chat.", "MapView_GMapsAPIKey": "Clave API Google Static Maps", "MapView_GMapsAPIKey_Description": "Esto se puede obtener de la Google Developers Console de forma gratuita.", + "Mark_all_as_read": "Marcar todos los mensajes (en todos los canales) como leídos", "Mark_as_read": "Marcar Como Leído", "Mark_as_unread": "Marcar Como No Leído", "Markdown_Headers": "Permitir Encabezados Markdown en mensajes", @@ -1839,7 +2196,6 @@ "Max_length_is": "La longitud máxima es%s", "Media": "Medios de comunicación", "Medium": "Medio", - "Members_List": "Lista de Miembros", "mention-all": "Mencione todo", "mention-all_description": "Permiso para usar la @all mencionar", "mention-here": "Mencione aquí", @@ -2020,6 +2376,7 @@ "Not_authorized": "No autorizado", "Not_Available": "No disponible", "Not_found_or_not_allowed": "No Encontrado o No Permitido", + "Not_started": "No iniciado", "Nothing": "Nada", "Nothing_found": "No se encontró nada", "Notification_Desktop_Default_For": "Mostrar notificaciones de escritorio para", @@ -2348,7 +2705,6 @@ "Room_type_changed_successfully": "Tipo de sala cambiado con éxito", "Room_type_of_default_rooms_cant_be_changed": "Esta es una sala predeterminada y no se puede cambiar el tipo. Consulte a su administrador.", "Room_unarchived": "Sala no archivada", - "Room_uploaded_file_list": "Lista de Archivos", "Room_uploaded_file_list_empty": "Ningún archivo disponible.", "Rooms": "Salas", "run-import": "Ejecutar importación", @@ -2715,6 +3071,7 @@ "Trigger_Words": "Las palabras de activación", "Triggers": "disparadores", "True": "Verdadero", + "Troubleshoot_Disable_Notifications": "Deshabilitar notificaciones", "Tuesday": "Martes", "Turn_OFF": "Apagar", "Turn_ON": "Encender", diff --git a/packages/rocketchat-i18n/i18n/eu.i18n.json b/packages/rocketchat-i18n/i18n/eu.i18n.json index 8feaa8df859a..56382d42f1a9 100644 --- a/packages/rocketchat-i18n/i18n/eu.i18n.json +++ b/packages/rocketchat-i18n/i18n/eu.i18n.json @@ -1,12 +1,12 @@ { "403": "Debekatuta", - "500": "Internal Server Error", + "500": "Zerbitzariaren Barne Errorea", "#channel": "#kanala", "0_Errors_Only": "0 - Akatsak Bakarrik", "12_Hour": "12 orduko erlojua", "1_Errors_and_Information": "1 - Akatsak eta Informazioa", "24_Hour": "24 orduko erlojua", - "2_Erros_Information_and_Debug": "1 - Akatsak, Informazioa eta Arazketa (debug)", + "2_Erros_Information_and_Debug": "1 - Akatsak, Informazioa eta Arazketa", "@username": "@erabiltzailea", "@username_message": "@erabiltzailea ", "__username__is_no_longer__role__defined_by__user_by_": "__username__ is no longer __role__ by __user_by__", @@ -34,6 +34,7 @@ "Accounts_Default_User_Preferences_audioNotifications": "Audio jakinarazpen alerta lehenetsia", "Accounts_iframe_enabled": "Gaituta", "Additional_Feedback": "Feedback osagarria", + "Administration": "Ezarpenak", "All_channels": "Kanal guztiak", "App_Details": "Aplikazioaren xehetasunak", "App_Information": "Aplikazioen informazioa", @@ -71,13 +72,14 @@ "Back_to_applications": "Aplikazioetara itzuli", "Back_to_chat": "Txatera itzuli", "ban-user": "Erabiltzailea debekatu", - "Block_User": "Blokeatu erabiltzailea", + "Block_User": "Erabiltzailea blokeatu", "Blockchain": "blockchain", "Cancel": "Ezeztatu", "Cancel_message_input": "Ezeztatu", "CAS_enabled": "Gaituta", "Channels": "Kanalak", "Channels_list": "Kanal publikoen zerrenda", + "Chatpal_Users": "Erabiltzaileak", "create-c": "Kanal Publikoak Sortu", "create-p": "Kanal Pribatuak Sortu", "Direct_Messages": "Mezu Zuzenak", @@ -92,6 +94,7 @@ "Installation": "Instalazioa", "Integrations_Outgoing_Type_FileUploaded": "Fitxategia kargatu da", "New_messages": "Mezu berriak", + "No_channels_yet": "Oraindik ez zara inongo kanalen partaide", "No_discussions_yet": "Ez dago eztabaidarik", "Options": "Aukerak", "Please_fill_name_and_email": "Sartu izena eta posta elektronikoa mesedez", @@ -99,6 +102,7 @@ "Private_Groups_list": "Talde Pribatuen Zerrenda", "RetentionPolicy_Enabled": "Gaituta", "Room_name_changed": "__user_by__(e)k mintzagelaren izena __room_name__ra aldatu du", + "Search_Channels": "Bilatu Kanalak", "Send": "Bidali", "Skip": "Saltatu", "Start_Chat": "Hasi txata", @@ -111,6 +115,7 @@ "User_joined_channel": "Kanalera batu da.", "User_joined_channel_female": "Kanalera batu da.", "User_joined_channel_male": "kanalera batu da.", + "Users": "Erabiltzaileak", "We_are_offline_Sorry_for_the_inconvenience": "Lineaz kanpo gaude. Barkatu eragozpenak.", "Yes": "Bai" } \ No newline at end of file diff --git a/packages/rocketchat-i18n/i18n/fa.i18n.json b/packages/rocketchat-i18n/i18n/fa.i18n.json index 709fcccc497f..6d1e6031c375 100644 --- a/packages/rocketchat-i18n/i18n/fa.i18n.json +++ b/packages/rocketchat-i18n/i18n/fa.i18n.json @@ -505,6 +505,8 @@ "Broadcasting_enabled": "فعال کردن پخش", "Broadcasting_media_server_url": "آدرس اینترنتی سرور رسانه ای", "Browse_Files": "مرور پرونده ها", + "Browser_does_not_support_audio_element": "مرورگر شما از عنصر صدا پشتیبانی نمی کند.", + "Browser_does_not_support_video_element": "مرورگر شما از عنصر ویدیو پشتیبانی نمی کند.", "Bugsnag_api_key": "کلید API Bugsnag", "Build_Environment": "محیط زیست ساختن", "bulk-register-user": "فیدبک ایجاد کانال ها", @@ -633,6 +635,7 @@ "clear": "پاک کردن", "Clear_all_unreads_question": "پاک کردن همه ناخوانده ها؟", "clear_cache_now": "پاک کردن Cache Now", + "Clear_filters": "فیلترها را پاک کنید", "clear_history": "پاک کردن تاریخچه", "Click_here": "اینجا کلیک کنید", "Click_here_for_more_info": "برای اطلاعات بیشتر اینجا کلیک کنید", @@ -1061,6 +1064,7 @@ "Decline": "کاهش می یابد", "Default": "پیش فرض", "Delete": "حذف کردن", + "Delete_all_closed_chats": "تمام گپ های بسته را حذف کنید", "delete-c": "کانالهای عمومی را حذف کنید", "delete-c_description": "مجوز حذف کانالهای عمومی", "delete-d": "حذف پیام های مستقیم", @@ -1118,9 +1122,13 @@ "Disabled": "معلول", "Disallow_reacting": "نادیده گرفتن واکنش", "Disallow_reacting_Description": "واکنش نشان می دهد", + "Disconnect": "قطع شدن", "Display_offline_form": "نمایش فرم آفلاین", + "Display_chat_permissions": "نمایش مجوزهای گپ", "Display_unread_counter": "نمایش تعداد پیامهای خوانده نشده", "Displays_action_text": "نمایش متن عمل", + "Discussion_start": "بحث را شروع کنید", + "Discussion_first_message_title": "پیام شما", "Dont_ask_me_again": "دوباره از من بپرس", "Dont_ask_me_again_list": "از لیست من بپرس", "Do_not_display_unread_counter": "هیچ شمارندهی این کانال را نمایش ندهید", @@ -1132,14 +1140,20 @@ "Domain_removed": "دامنه حذف شد", "Domains": "دامنه ها", "Domains_allowed_to_embed_the_livechat_widget": "لیستی از دامنه های جدا شده با کاما مجاز به جاسازی ویجت livechat. برای خالی کردن تمام دامنه ها، خالی بگذارید", + "Downloading_file_from_external_URL": "بارگیری فایل از آدرس خارجی", + "Download_Info": "اطلاعات بارگیری", "Download_My_Data": "داده های من را دانلود کنید", + "Download_Pending_Files": "فایلهای در انتظار را بارگیری کنید", "Download_Snippet": "دانلود", "Drop_to_upload_file": "برای آپلود رها کنید", "Dry_run": "اجرای آزمایشی", "Dry_run_description": "تنها یک ایمیل به آدرس موجود در فرم ارسال خواهد شد. ایمیل باید متعلق به یک کاربر معتبر باشد.", + "duplicated-account": "حساب تکراری", "Duplicate_archived_channel_name": "یک کانال آرشیو شده با نام `#%s` وجود دارد", "Duplicate_archived_private_group_name": "یک گروه خصوصی آرشیو شده با نام '%s' وجود دارد", "Duplicate_channel_name": "یک کانال با نام '%s' وجود دارد", + "Duplicated_Email_address_will_be_ignored": "آدرس ایمیل کپی شده نادیده گرفته می شود.", + "Duplicate_file_name_found": "نام پرونده تکراری یافت شد.", "Duplicate_private_group_name": "گروهی خصوصی با نام '%s' وجود دارد", "Duration": "مدت زمان", "Edit": "ویرایش", @@ -1493,6 +1507,7 @@ "if_they_are_from": "(اگر از%s هستند)", "If_this_email_is_registered": "اگر این ایمیل ثبت شده باشد، دستورالعمل هایی در مورد نحوه بازنشانی گذرواژه شما ارسال خواهیم کرد. اگر مدت کوتاهی ایمیل دریافت نکنید، لطفا بیایید و دوباره امتحان کنید.", "If_you_are_sure_type_in_your_password": "اگر مطمئن هستید رمز خود را وارد کنید:", + "Members_List": "فهرست کاربران", "If_you_are_sure_type_in_your_username": "اگر مطمئنید نام کاربری خود را وارد کنید:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "اگر شما یک ایمیل برای [omni@rocket.chat] (mailto: omni@rocket.chat) ارسال نکنید تا بتوانید از آن استفاده کنید.", "Iframe_Integration": "یکپارچگی Iframe", @@ -1867,6 +1882,7 @@ "Mail_Message_No_messages_selected_select_all": "هیچ پیامی انتخاب نشده است", "Mail_Messages": "پیام های پست الکترونیکی", "Mail_Messages_Instructions": "روی پیامی که می خواهید با ایمیل بفرستید کلیک کنید", + "Room_uploaded_file_list": "لیست فایل ها", "Mail_Messages_Subject": "اینجا قسمتی از پیام های %s است", "Mailer": "ایمیل کننده", "Mailer_body_tags": "شما باید [unsubscribe] برای لینک لغو عضویت استفاده کنید.
شما ممکن است [name]، [fname] برای نام کامل کاربر، نام اول یا نام خانوادگی، به ترتیب استفاده کنید، [lname].
ممکن است [email] برای ایمیل کاربر استفاده کنید.", @@ -1908,7 +1924,6 @@ "Max_length_is": "حداکثر طول%s است", "Media": "رسانه ها", "Medium": "متوسط", - "Members_List": "فهرست کاربران", "mention-all": "همه را ذکر کنید", "mention-all_description": "اجازه استفاده از امکان ذکر کردن @all", "mention-here": "اینجا بنویس", @@ -2400,7 +2415,6 @@ "Room_type_changed_successfully": "نوع اتاق موفقیت تغییر", "Room_type_of_default_rooms_cant_be_changed": "این یک اتاق پیش فرض است و نوع را نمی توان تغییر داد، لطفا با سرپرست خود مشورت کنید.", "Room_unarchived": "اتاق بایگانی خارج شد", - "Room_uploaded_file_list": "لیست فایل ها", "Room_uploaded_file_list_empty": "بدون فایل های موجود.", "Rooms": "اتاق", "run-import": "اجرای واردات", @@ -2755,6 +2769,7 @@ "Trigger_Words": "کلمات محرک", "Triggers": "محرک های", "True": "بله", + "Troubleshoot_Disable_Notifications": "غیر فعال کردن اعلانات", "Tuesday": "سه شنبه", "Turn_OFF": "خاموش شود", "Turn_ON": "روشن کن", diff --git a/packages/rocketchat-i18n/i18n/fi.i18n.json b/packages/rocketchat-i18n/i18n/fi.i18n.json index b93bda1af0b6..9965bc54021c 100644 --- a/packages/rocketchat-i18n/i18n/fi.i18n.json +++ b/packages/rocketchat-i18n/i18n/fi.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(jos ne ovat %s)", "If_this_email_is_registered": "Jos tämä sähköposti on rekisteröity, lähetämme ohjeet salasanan palauttamiseen. Jos et saa sähköpostia pian, palaa takaisin ja yritä uudelleen.", "If_you_are_sure_type_in_your_password": "Jos olet varma, kirjoita salasanasi:", + "Members_List": "Jäsenlista", "If_you_are_sure_type_in_your_username": "Jos olet varma, kirjoita käyttäjätunnuksesi:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Jos sinulla ei ole sellaista, lähetä sähköpostia osoitteeseen [omni@rocket.chat] (mailto: omni@rocket.chat) saadaksesi omasi.", "Iframe_Integration": "Iframe-integraatio", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Et ole valinnut yhtään viestiä. Haluaisitko valita kaikki näkyvät viestit?", "Mail_Messages": "Lähetä viestit sähköpostitse", "Mail_Messages_Instructions": "Valitse, mitkä viestit haluat lähettää sähköpostitse klikkaamalla viestejä", + "Room_uploaded_file_list": "Tiedostolista", "Mail_Messages_Subject": "Tässä muutama viesti (%s viestiä)", "Mailer": "Postittaja", "Mailer_body_tags": "Sinun tulee käyttää [unsubscribe] postituslistalta poistumislinkkinä.
Voit käyttää [name], [fname], [lname] käyttäjän koko nimen, etunimen tai sukunimen paikalla.
Voit käyttää [email] käyttäjän sähköpostin paikalla.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Suurin pituus on%s", "Media": "tiedotusvälineet", "Medium": "keskikokoinen", - "Members_List": "Jäsenlista", "mention-all": "Mainitse kaikki", "mention-all_description": "Käyttöoikeus käyttää @all-maininta", "mention-here": "Mainita tässä", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Huoneen tyyppi vaihdettu", "Room_type_of_default_rooms_cant_be_changed": "Tämä on oletushäiriö, eikä sitä voi muuttaa, ota yhteyttä järjestelmänvalvojaasi.", "Room_unarchived": "Huone palautettu arkistosta", - "Room_uploaded_file_list": "Tiedostolista", "Room_uploaded_file_list_empty": "Tiedostoja ei ole saatavilla.", "Rooms": "Huoneet", "run-import": "Suorita tuonti", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Trigger sanat", "Triggers": "Laukaisijat", "True": "Tosi", + "Troubleshoot_Disable_Notifications": "Poista ilmoitukset käytöstä", "Tuesday": "tiistai", "Turn_OFF": "Pois käytöstä", "Turn_ON": "Käytössä", diff --git a/packages/rocketchat-i18n/i18n/fr.i18n.json b/packages/rocketchat-i18n/i18n/fr.i18n.json index 5ad69f4449cf..630fe4da3571 100644 --- a/packages/rocketchat-i18n/i18n/fr.i18n.json +++ b/packages/rocketchat-i18n/i18n/fr.i18n.json @@ -1425,6 +1425,7 @@ "if_they_are_from": "(si elles proviennent de %s)", "If_this_email_is_registered": "Si cet e-mail est enregistré, les instructions pour réinitialiser votre mot de passe vous serons envoyées. Si vous ne recevez pas d'email rapidement, merci de revenir et d'essayer à nouveau.", "If_you_are_sure_type_in_your_password": "Si vous êtes sûr(e), entrez votre mot de passe :", + "Members_List": "Liste des membres", "If_you_are_sure_type_in_your_username": "Si vous êtes certain(e), saisissez votre nom d'utilisateur :", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Si vous n'en avez pas, envoyez un courriel à [omni@rocket.chat] (mailto: omni@rocket.chat) pour obtenir le vôtre.", "If_you_didnt_ask_for_reset_ignore_this_email": "Si vous n'avez pas demandé la réinitialisation de votre mot de passe, vous pouvez ignorer cet e-mail.", @@ -1818,6 +1819,7 @@ "Mail_Message_No_messages_selected_select_all": "Vous n'avez sélectionné aucun message. ", "Mail_Messages": "Messages électroniques", "Mail_Messages_Instructions": "Choisissez les messages que vous souhaitez envoyer par e-mail en cliquant dessus", + "Room_uploaded_file_list": "Liste des fichiers", "Mail_Messages_Subject": "Voici une sélection de messages de \"%s\"", "Mailer": "Envoi d'e-mail", "Mailer_body_tags": "Vous devez utiliser [unsubscribe] pour le lien de désinscription.
Vous pouvez utiliser respectivement [name], [fname], [lname] pour le nom complet de l'utilisateur, le prénom et le nom de famille.
Vous pouvez utiliser [email] pour l'adresse e-mail de l'utilisateur.", @@ -1862,7 +1864,6 @@ "Max_length_is": "La longueur maximale est %s", "Media": "Médias", "Medium": "Milieu", - "Members_List": "Liste des membres", "mention-all": "Mention @all", "mention-all_description": "Autorisation d'utiliser la mention @all", "mention-here": "Mention ici", @@ -2408,7 +2409,6 @@ "Room_type_changed_successfully": "Type du salon modifié avec succès", "Room_type_of_default_rooms_cant_be_changed": "C'est un salon par défaut et le type ne peut être modifié, merci de contacter un administrateur.", "Room_unarchived": "Salon désarchivé", - "Room_uploaded_file_list": "Liste des fichiers", "Room_uploaded_file_list_empty": "Aucun fichier disponible.", "Rooms": "Salons", "run-import": "Exécuter l'importation", @@ -2782,6 +2782,7 @@ "Trigger_Words": "Mots déclencheurs", "Triggers": "Déclencheurs", "True": "Oui", + "Troubleshoot_Disable_Notifications": "Désactiver les notifications", "Tuesday": "Mardi", "Turn_OFF": "Éteindre", "Turn_ON": "Allumer", diff --git a/packages/rocketchat-i18n/i18n/he.i18n.json b/packages/rocketchat-i18n/i18n/he.i18n.json index 3b74912f9ea9..a04bf3ef779e 100644 --- a/packages/rocketchat-i18n/i18n/he.i18n.json +++ b/packages/rocketchat-i18n/i18n/he.i18n.json @@ -613,6 +613,7 @@ "How_satisfied_were_you_with_this_chat": "איך הייתם מרוצה הצ'אט הזה?", "if_they_are_from": "(אם הם מ%s)", "If_you_are_sure_type_in_your_password": "אם אתה סוג בטוח ב הסיסמה:", + "Members_List": "רשימת חברים", "If_you_are_sure_type_in_your_username": "אם אתה סוג בטוח שם המשתמש שלך:", "Ignore": "התעלם", "Ignored": "התעלם", @@ -806,6 +807,7 @@ "Mail_Message_No_messages_selected_select_all": "לא בחרת שום הודעות. האם אתה רוצה לבחור את כל ההודעות הגלויות?", "Mail_Messages": "הודעות דואר אלקטרוניות", "Mail_Messages_Instructions": "בחר אילו הודעות אתה רוצה לשלוח בדוא\"ל, על ידי לחיצה על ההודעות", + "Room_uploaded_file_list": "רשימת קבצים", "Mail_Messages_Subject": "הנה חלק נבחר של %s הודעות", "Mailer": "שולח", "Mailer_body_tags": "אתה חייב להשתמש ב-[unsubscribe] עבור לינק ההסרה מרשימת התפוצה.
אתה יכול להשתמש ב-[name], [fname], [lname] בשביל השם המלא של המשתמש, השם הפרטי או שם המשפחה בהתאמה.
אתה יכול להשתמש ב-[email] עבור כתובת המייל של המשתמש.", @@ -823,7 +825,6 @@ "Max_length_is": "אורך מקסימלי הוא %s", "Media": "מדיה", "Medium": "בינוני", - "Members_List": "רשימת חברים", "Mentions": "אזכורים", "Mentions_default": "אזכורים (ברירת מחדל)", "Mentions_only": "אזכורים בלבד", @@ -1105,7 +1106,6 @@ "Room_topic_changed_successfully": "נושא החדר שונה בהצלחה", "Room_type_changed_successfully": "סוג החדר שונה בהצלחה", "Room_unarchived": "חדר מהארכיון", - "Room_uploaded_file_list": "רשימת קבצים", "Room_uploaded_file_list_empty": "אין קבצים זמינים.", "Rooms": "חדרים", "Running_Instances": "הפעלת מופעים", @@ -1300,6 +1300,7 @@ "Trigger_Words": "מילות טריגר", "Triggers": "מפעילים", "True": "נכון", + "Troubleshoot_Disable_Notifications": "השבת נוטיפיקציות", "Type": "סוג", "Type_your_email": "נא להקליד את כתובת הדוא״ל שלך", "Type_your_message": "נא להקליד את ההודעה שלך", diff --git a/packages/rocketchat-i18n/i18n/hr.i18n.json b/packages/rocketchat-i18n/i18n/hr.i18n.json index a6e3f6c0a865..bdc1b25f95f2 100644 --- a/packages/rocketchat-i18n/i18n/hr.i18n.json +++ b/packages/rocketchat-i18n/i18n/hr.i18n.json @@ -1430,6 +1430,7 @@ "if_they_are_from": "(ako su iz %s)", "If_this_email_is_registered": "Ako je ova e-poruka registrirana, poslat ćemo vam upute o tome kako poništiti zaporku. Ako uskoro ne primite e-poruku, vratite se i pokušajte ponovo.", "If_you_are_sure_type_in_your_password": "Ako ste sigurni upišite svoju lozinku:", + "Members_List": "Lista Članova", "If_you_are_sure_type_in_your_username": "Ako ste sigurni upišite svoje korisničko ime:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Ako nemate nekoga, pošaljite e-poštu na adresu [omni@rocket.chat] (mailto: omni@rocket.chat) kako biste dobili svoj.", "Iframe_Integration": "Integracija iframea", @@ -1803,6 +1804,7 @@ "Mail_Message_No_messages_selected_select_all": "Niste odabrali nikakve poruke.", "Mail_Messages": "Email Poruke", "Mail_Messages_Instructions": "Odaberite koje poruke želite poslati putem e-maila klikom na poruke", + "Room_uploaded_file_list": "Popis datoteka", "Mail_Messages_Subject": "Evo odabrani dio %s poruka", "Mailer": "Mailer", "Mailer_body_tags": "Morate koristiti [unsubscribe] za otkazivanje pretplate.
Možete koristiti [name], [fname], [lname] za korisnikovo ime i prezime, ime i prezime
 Možete koristiti [email] za e-poštu korisnika.", @@ -1844,7 +1846,6 @@ "Max_length_is": "Maksimalna dužina je %s", "Media": "media", "Medium": "Srednji", - "Members_List": "Lista Članova", "mention-all": "Spominjati sve", "mention-all_description": "Dopuštenje za korištenje @all spomen", "mention-here": "Ovdje spomenuti", @@ -2336,7 +2337,6 @@ "Room_type_changed_successfully": "Vrsta sobe je uspješno promijenjena", "Room_type_of_default_rooms_cant_be_changed": "Ovo je zadana soba i vrsta se ne može mijenjati, obratite se svom administratoru.", "Room_unarchived": "Soba je dearhivirana", - "Room_uploaded_file_list": "Popis datoteka", "Room_uploaded_file_list_empty": "Nijedna datoteka nije dostupna", "Rooms": "Sobe", "run-import": "Pokreni uvoz", @@ -2691,6 +2691,7 @@ "Trigger_Words": "Riječi okidača", "Triggers": "Okidači", "True": "Da", + "Troubleshoot_Disable_Notifications": "Onemogućivanje obavijesti", "Tuesday": "Utorak", "Turn_OFF": "Isključiti", "Turn_ON": "Upaliti", diff --git a/packages/rocketchat-i18n/i18n/hu.i18n.json b/packages/rocketchat-i18n/i18n/hu.i18n.json index a08d70edcde1..9e878e1958d2 100644 --- a/packages/rocketchat-i18n/i18n/hu.i18n.json +++ b/packages/rocketchat-i18n/i18n/hu.i18n.json @@ -508,6 +508,8 @@ "Broadcasting_enabled": "Üzenetszórás engedélyezve", "Broadcasting_media_server_url": "Üzenetszórási médiakiszolgáló URL", "Browse_Files": "Fájlok tallózása", + "Browser_does_not_support_audio_element": "Az Ön böngészője nem támogatja az „audio” elemet.", + "Browser_does_not_support_video_element": "Az Ön böngészője nem támogatja a „video” elemet.", "Bugsnag_api_key": "Bugsnag API kulcs", "Build_Environment": "Összeállítási környezet", "bulk-register-user": "Felhasználók tömeges létrehozása", @@ -1544,6 +1546,7 @@ "if_they_are_from": "(ha %s-ból származik)", "If_this_email_is_registered": "Ha regisztrálta ezt az e-mailt, utasításokat küldünk a jelszó visszaállításáról. Ha hamarosan nem kap e-mailt, kérjük, térjen vissza és próbálkozzon újra.", "If_you_are_sure_type_in_your_password": "Ha biztos abban, írja be a jelszót:", + "Members_List": "Tagok", "If_you_are_sure_type_in_your_username": "Ha biztos abban, írja be a felhasználónevét:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Ha nincs meg, küldjön egy e-mailt a [omni@rocket.chat] címre (mailto: omni@rocket.chat), hogy megkapja az Önét.", "If_you_didnt_ask_for_reset_ignore_this_email": "Ha nem Ön kezdeményezte a jelszó visszaállítást, hagyja figyelmen kívül ezt az e-mail üzenetet.", @@ -1967,6 +1970,7 @@ "Mail_Message_No_messages_selected_select_all": "Nem választott ki semmilyen üzenetet", "Mail_Messages": "E-mail üzenetek", "Mail_Messages_Instructions": "Válassza ki, melyik üzenetet szeretne küldeni e-mailben rákattint az üzeneteket", + "Room_uploaded_file_list": "Fájlok", "Mail_Messages_Subject": "Itt egy kiválasztott részét %s üzeneteket", "Mailer": "Postázó", "Mailer_body_tags": "Ki kell használni [unsubscribe] a leiratkozás linkre.
Lehet használni [name], [fname], [lname] a felhasználó teljes nevét, keresztnevét vagy vezetéknevét, ill.
Lehet használni [email] A felhasználó e-mail.", @@ -2019,7 +2023,6 @@ "Maximum": "Maximális", "Media": "Média", "Medium": "Közepes", - "Members_List": "Tagok", "mention-all": "Mindent említ", "mention-all_description": "A @all említés engedélyezése", "mention-here": "Megemlítem itt", @@ -2586,7 +2589,6 @@ "Room_type_changed_successfully": "Szoba típusa megváltozott sikeresen", "Room_type_of_default_rooms_cant_be_changed": "Ez az alapértelmezett hely, és a típus nem módosítható, kérjük, forduljon a rendszergazdájához.", "Room_unarchived": "szoba archivált", - "Room_uploaded_file_list": "Fájlok", "Room_uploaded_file_list_empty": "Nincs fájl is elérhető.", "Rooms": "Szobák", "Routing": "Útválasztás", @@ -3030,6 +3032,7 @@ "Trigger_Words": "Eseményindító szavak", "Triggers": "Eseményindítók", "True": "Igaz", + "Troubleshoot_Disable_Notifications": "Értesítések letiltása", "Tuesday": "kedd", "Turn_OFF": "Kikapcsol", "Turn_ON": "Bekapcsol", diff --git a/packages/rocketchat-i18n/i18n/id.i18n.json b/packages/rocketchat-i18n/i18n/id.i18n.json index 748a1e9829e9..17a7980c3516 100644 --- a/packages/rocketchat-i18n/i18n/id.i18n.json +++ b/packages/rocketchat-i18n/i18n/id.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(jika mereka dari %s)", "If_this_email_is_registered": "Jika email ini terdaftar, kami akan mengirimkan instruksi tentang cara mereset kata sandi Anda. Jika Anda tidak segera menerima email, kembalilah dan coba lagi.", "If_you_are_sure_type_in_your_password": "Jika Anda yakin ketik password Anda:", + "Members_List": "Daftar Member", "If_you_are_sure_type_in_your_username": "Jika Anda yakin ketik nama pengguna:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Jika Anda tidak memilikinya, kirimkan email ke [omni@rocket.chat] (mailto: omni@rocket.chat) untuk mendapatkan email Anda.", "Iframe_Integration": "Integrasi iframe", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Anda belum memilih pesan", "Mail_Messages": "Mail Pesan", "Mail_Messages_Instructions": "Memilih pesan yang Anda ingin mengirim via email dengan mengklik pesan", + "Room_uploaded_file_list": "Daftar Berkas", "Mail_Messages_Subject": "Berikut adalah bagian yang terpilih dari pesan%s", "Mailer": "Pengirim", "Mailer_body_tags": "Anda harus menggunakan [unsubscribe] untuk berhenti link berlangganan.
Anda dapat menggunakan [nama], [fname], [lname] untuk nama lengkap pengguna, nama pertama atau nama belakang, masing-masing.
Anda dapat menggunakan [email] untuk email pengguna.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Panjang maks adalah%s", "Media": "Media", "Medium": "Medium", - "Members_List": "Daftar Member", "mention-all": "Sebutkan Semua", "mention-all_description": "Izin untuk menggunakan @all menyebutkan", "mention-here": "Sebutkan disini", @@ -2212,7 +2213,6 @@ "Room_type_changed_successfully": "Jenis kamar berhasil diubah", "Room_type_of_default_rooms_cant_be_changed": "Ini adalah ruang default dan tipe tidak dapat diubah, silakan berkonsultasi dengan administrator Anda.", "Room_unarchived": "kamar diarsipkan", - "Room_uploaded_file_list": "Daftar Berkas", "Room_uploaded_file_list_empty": "Berkas tidak tersedia", "Rooms": "Room", "run-import": "Jalankan Impor", @@ -2567,6 +2567,7 @@ "Trigger_Words": "Kata-kata pemicu", "Triggers": "pemicu", "True": "True", + "Troubleshoot_Disable_Notifications": "Nonaktifkan Pemberitahuan", "Tuesday": "Selasa", "Turn_OFF": "Matikan", "Turn_ON": "Nyalakan", diff --git a/packages/rocketchat-i18n/i18n/it.i18n.json b/packages/rocketchat-i18n/i18n/it.i18n.json index 7c65ec391c64..4582d7591d77 100644 --- a/packages/rocketchat-i18n/i18n/it.i18n.json +++ b/packages/rocketchat-i18n/i18n/it.i18n.json @@ -1321,6 +1321,7 @@ "if_they_are_from": "(se sono da %s)", "If_this_email_is_registered": "Se questa email è registrata, invieremo istruzioni su come reimpostare la propria password. Se non la ricevi in breve tempo, si prega di ritornare e riprovare.", "If_you_are_sure_type_in_your_password": "Se sei sicuro inserisci la password:", + "Members_List": "Elenco dei membri", "If_you_are_sure_type_in_your_username": "Se sei sicuro inserisci il tuo nome utente:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Se non ne hai uno, invia un'email a [omni@rocket.chat] (mailto: omni@rocket.chat) per ottenere il tuo.", "Iframe_Integration": "Integrazione Iframe", @@ -1686,6 +1687,7 @@ "Mail_Message_No_messages_selected_select_all": "Non hai selezionato nessun messaggio.", "Mail_Messages": "Messaggi di posta", "Mail_Messages_Instructions": "Scegli quali messaggi vuoi inviare via email cliccandoci", + "Room_uploaded_file_list": "Elenco dei file", "Mail_Messages_Subject": "Ecco una porzione di %s messaggi", "Mailer": "Mailer", "Mailer_body_tags": "È necessario utilizzare il tag [unsubscribe] per il link di cancellazione.
 È possibile utilizzare [name], [fname], [lname] rispettivamente per il nome completo dell'utente, nome o cognome.
 È possibile utilizzare [email] per l'indirizzo email dell'utente.", @@ -1728,7 +1730,6 @@ "Max_length_is": "Lunghezza massima è %s", "Media": "Media", "Medium": "Media", - "Members_List": "Elenco dei membri", "mention-all": "Menzione tutto", "mention-all_description": "Autorizzazione a usare @all mention", "mention-here": "Menzione qui", @@ -2238,7 +2239,6 @@ "Room_type_changed_successfully": "Tipo di canale cambiato con successo", "Room_type_of_default_rooms_cant_be_changed": "Questo è un canale predefinito e il tipo non può essere cambiato, si prega di consultarsi con un amministratore.", "Room_unarchived": "Canale disarchiviato", - "Room_uploaded_file_list": "Elenco dei file", "Room_uploaded_file_list_empty": "Nessun file disponibile.", "Rooms": "Canali", "run-import": "Esegui importazione", @@ -2598,6 +2598,7 @@ "Trigger_Words": "Parole Trigger", "Triggers": "Trigger", "True": "Vero", + "Troubleshoot_Disable_Notifications": "Disabilita notifiche", "Tuesday": "Martedì", "Turn_OFF": "Spegni", "Turn_ON": "Accendere", diff --git a/packages/rocketchat-i18n/i18n/ja.i18n.json b/packages/rocketchat-i18n/i18n/ja.i18n.json index 2406ef16a5a1..f6c02c9e114b 100644 --- a/packages/rocketchat-i18n/i18n/ja.i18n.json +++ b/packages/rocketchat-i18n/i18n/ja.i18n.json @@ -203,16 +203,33 @@ "Accounts_Directory_DefaultView": "デフォルトのディレクトリリスト", "Accounts_SetDefaultAvatar": "デフォルトのアバターを設定", "Accounts_SetDefaultAvatar_Description": "OAuthアカウントまたはGravatarに基づいてデフォルトアバターを決定しようとする", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "外部アカウントのメールを確認済みに設定します", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "LDAP、OAthなどの外部サービスから作成されたアカウントのメールは自動的に検証されます", "Accounts_ShowFormLogin": "ログインフォームを表示", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "電子メールを介した2ファクタ認証を有効にする", + "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "メールが確認され、プロフィールページでオプションが有効になっているユーザーは、ログイン、プロフィールの保存などの特定のアクションを許可するための一時コードが記載されたメールを受け取ります。", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "電子メールを介した2ファクタ認証の新規ユーザーの自動選択", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "新規ユーザーは、デフォルトで電子メールによる2ファクタ認証が有効になっています。プロフィールページで無効にすることができます。", + "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "電子メールで送信されたコードの有効期限(秒数)", "Accounts_TwoFactorAuthentication_Enabled": "2ファクタ認証を有効にする", + "Accounts_TwoFactorAuthentication_Enabled_Description": "ユーザーは、Google AuthenticatorやAuthyなどの任意のTOTPアプリを使用して2ファクタ認証をセットアップできます", "Accounts_TwoFactorAuthentication_MaxDelta": "最大デルタ", "Accounts_UserAddedEmail_Default": "

ようこそ[Site_Name]

[Site_URL]に移動し、今日利用可能な最高のオープンソースのチャットソリューションを試してみてください!

あなたは、電子メール: [email] とパスワード: [password] を使用してログインすることができます。これは最初のログイン後に変更する必要があります。", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "最大デルタは、任意の時点で有効なトークンの数を決定します。トークンは30秒ごとに生成され、 (30 *最大デルタ) 秒間有効です。
例: 最大デルタを10に設定すると、各トークンはタイムスタンプの前後に最大300秒まで使用できます。これは、クライアントの時計がサーバーと正しく同期していない場合に便利です。", + "Accounts_TwoFactorAuthentication_RememberFor": "2ファクタを記憶する秒数", + "Accounts_TwoFactorAuthentication_RememberFor_Description": "指定された時間内に既に提供されている場合は、2ファクタ認証コードを要求しないでください。", "Accounts_UseDefaultBlockedDomainsList": "既定のブロックドメイン一覧を使用", "Accounts_UseDNSDomainCheck": "DNSドメイン検証を使用", "Accounts_UserAddedEmailSubject_Default": "あなたは[Site_Name]に追加されました", "Accounts_UserAddedEmail_Description": "次のプレースホルダを使用できます。

  • [name]、[fname]、[lname]はそれぞれユーザーのフルネーム、ファーストネーム、ラストネームです。
  • [email]はユーザーの電子メールです。
  • [password]はユーザーのパスワードです。
  • [Site_Name]と[Site_URL]はアプリケーション名とURLです。
", "Activate": "有効化", + "Active_users": "アクティブユーザー", + "Daily_Active_Users": "日別のアクティブユーザー", + "Weekly_Active_Users": "週別のアクティブユーザー", + "Monthly_Active_Users": "月別のアクティブユーザー", + "DAU_value": "DAU __value__", + "WAU_value": "WAU __value__", + "MAU_value": "MAU __value__", "Activity": "アクティビティ順", "Add": "追加", "add-oauth-service": "OAuthサービスを追加する", @@ -235,6 +252,7 @@ "Add_user": "ユーザーを追加", "Add_User": "ユーザーを追加", "Add_users": "ユーザーを追加", + "Add_Reaction": "反応を追加", "Adding_OAuth_Services": "OAuthのサービスを追加します", "Adding_permission": "許可を追加します", "Adding_user": "ユーザーの追加", @@ -334,11 +352,14 @@ "API_Personal_Access_Tokens_Regenerate_It": "トークンを再生成", "API_Shield_Types": "シールドタイプ", "API_Shield_Types_Description": "有効にするシールドの種類をカンマ区切りリストとして、`online`, `channel`, `*` (全て) から選択してください", + "API_Shield_user_require_auth": "ユーザーシールドに認証を要求する", "API_Token": "APIトークン", "API_Tokenpass_URL": "トークンパスサーバーのURL", "API_Tokenpass_URL_Description": "例: https://domain.com (末尾のスラッシュを除く)", "API_Upper_Count_Limit": "最大レコード量", "API_Upper_Count_Limit_Description": "REST APIが返すレコードの最大数は何ですか (無制限でない場合) 。", + "API_Use_REST_For_DDP_Calls": "Meteor呼び出しにWebSocketではなくRESTを使用する", + "API_Use_REST_For_DDP_Calls_Alert": "これは実験的で一時的な機能です。 Meteorメソッド呼び出しにWebSocketを使用する代わりに、WebクライアントとモバイルアプリにRESTリクエストを使用するように強制します。", "API_User_Limit": "Channelに全ユーザーを追加するためのユーザー制限", "API_Wordpress_URL": "WordPress URL", "Apiai_Key": "Api.aiキー", @@ -373,6 +394,11 @@ "Apps_Framework_Development_Mode": "開発モードを有効", "Apps_Framework_Development_Mode_Description": "開発モードでは、Rocket.Chatのマーケットプレイス以外のアプリをインストールできます。", "Apps_Framework_enabled": "Appフレームワークを有効にする", + "Apps_Game_Center": "ゲームセンター", + "Apps_Game_Center_Back": "ゲームセンターに戻る", + "Apps_Game_Center_enabled": "ゲームセンターを有効にする", + "Apps_Game_Center_Play_Game_Together": "@here __name__を一緒に遊ぼう!", + "Apps_Game_Center_Invite_Friends": "友達を招待する", "Apps_Marketplace_Deactivate_App_Prompt": "本当にこのアプリを無効にしますか?", "Apps_Marketplace_Modify_App_Subscription": "購読を変更する", "Apps_Marketplace_Uninstall_App_Prompt": "本当にこのアプリをアンインストールしますか?", @@ -448,6 +474,8 @@ "AutoTranslate_Enabled": "自動翻訳を有効にする", "AutoTranslate_Enabled_Description": "自動翻訳を有効にすると、auto-translate権限を持つユーザーがすべてのメッセージを選択した言語に自動的に翻訳できるようになります。料金がかかる場合があります。", "AutoTranslate_Google": "グーグル", + "AutoTranslate_Microsoft": "マイクロソフト", + "AutoTranslate_Microsoft_API_Key": "Ocp-Apim-Subscription-Key", "AutoTranslate_ServiceProvider": "サービスプロバイダー", "Available": "利用できます", "Available_agents": "割り当てられる担当者", @@ -492,6 +520,8 @@ "Blockstack_ButtonLabelText": "ボタンラベル文字列", "Blockstack_Generate_Username": "ユーザー名を生成する", "Body": "本文", + "Bio": "バイオ", + "Bio_Placeholder": "バイオプレースホルダー", "bold": "太字", "bot_request": "ボットリクエスト", "BotHelpers_userFields": "ユーザーフィールド", @@ -507,6 +537,8 @@ "Broadcasting_enabled": "ブロードキャストを有効にする", "Broadcasting_media_server_url": "ブロードキャストメディアサーバーURL", "Browse_Files": "ファイルをブラウズ", + "Browser_does_not_support_audio_element": "お使いのブラウザはオーディオ要素をサポートしていません。", + "Browser_does_not_support_video_element": "お使いのブラウザはビデオ要素をサポートしていません。", "Bugsnag_api_key": "Bugsnag APIキー", "Build_Environment": "ビルド環境", "bulk-register-user": "ユーザー一括登録", @@ -547,6 +579,7 @@ "CAS_trust_username_description": "有効にすると、Rocket.ChatはCASのユーザー名がRocket.Chatの同じユーザーに属することを信頼します。
独自のCASユーザーの名前を変更してアカウントを作成します。", "CAS_version": "CASバージョン", "CAS_version_Description": "CAS SSOサービスでサポートされているサポートされているCASバージョンのみを使用してください。", + "Call": "コール", "Categories": "カテゴリー", "CDN_PREFIX": "CDN プレフィックス", "CDN_PREFIX_ALL": "すべてのアセットにCDNプレフィックスを使用する", @@ -721,6 +754,8 @@ "Conversation": "会話", "Conversations": "会話", "Conversation_closed": "会話が閉じました: __comment__", + "Conversation_closing_tags": "会話終了タグ", + "Conversation_closing_tags_description": "終了タグは、終了時に会話に自動的に割り当てられます。", "Conversation_finished": "会話終了", "Conversation_finished_message": "会話終了時のメッセージ", "Conversation_finished_text": "会話終了時のメッセージ", @@ -991,6 +1026,7 @@ "Create_A_New_Channel": "新しいチャンネルを作成", "Create_new": "新しく作成", "Create_unique_rules_for_this_channel": "このチャンネルのユニークなルールを作成する", + "Created": "作成した", "Created_at": "作成日時", "Created_at_s_by_s": "作成日時 %s by %s", "Created_at_s_by_s_triggered_by_s": "%sにおいて、%sが作成 (%sがトリガー)", @@ -1054,6 +1090,7 @@ "Date_From": "から", "Date_to": "に", "days": "日", + "Days": "日", "DB_Migration": "データベースマイグレーション", "DB_Migration_Date": "データベースマイグレーション日", "DDP_Rate_Limit_IP_Enabled": "IPによる制限:有効", @@ -1111,6 +1148,8 @@ "Desktop_Notifications_Not_Enabled": "デスクトップ通知が有効ではありません", "Details": "詳細", "Different_Style_For_User_Mentions": "メンションとは異なるスタイル", + "Direct_message_creation_description": "複数のユーザーとのチャットを作成しようとしています。ダイレクトメッセージを使用して、話したい人たちを同じ場所に全員追加します。", + "Direct_message_you_have_joined": "新しいダイレクトメッセージに参加しました", "Direct_message_someone": "ユーザーへダイレクトメッセージする", "Direct_Messages": "ダイレクトメッセージ", "Direct_Reply": "直接返信", @@ -1136,6 +1175,7 @@ "Disable_Facebook_integration": "Facebookとの統合を無効にする", "Disable_Notifications": "通知を無効にする", "Disable_two-factor_authentication": "2ファクタ認証を無効にする", + "Disable_two-factor_authentication_email": "電子メールによる2ファクタ認証を無効にする", "Disabled": "無効", "Disallow_reacting": "反応しない", "Disallow_reacting_Description": "反応しない", @@ -1172,6 +1212,7 @@ "Download_My_Data": "マイデータ (HTML) をダウンロードする", "Download_Pending_Files": "保留中のファイルをダウンロードする", "Download_Snippet": "ダウンロード", + "Do_not_provide_this_code_to_anyone": "このコードを誰にも提供しないでください。", "Drop_to_upload_file": "アップロードするファイルをドロップしてください", "Dry_run": "予行練習", "Dry_run_description": "送信元のアドレスへ1通のメールを送信します。アドレスは、登録されているユーザーのものでなければなりません。", @@ -1187,6 +1228,8 @@ "E2E_Enabled": "E2Eが有効", "E2E_Enable_alert": "この機能は現在ベータ版です! バグは github.com/RocketChat/Rocket.Chat/issues に報告してください。
- 暗号化された部屋の暗号化されたメッセージは検索操作で見つかりません。
- モバイルアプリは暗号化されたメッセージをサポートしていない可能性があります
- ボットは、サポートを実装するまで、暗号化されたメッセージを見ることができません。
- このバージョンでは、アップロードは暗号化されません。", "E2E_Enable_description": "暗号化されたグループを作成しプライベートグループとダイレクトメッセージを暗号化できるオプションを有効にする", + "E2E_Enabled_Default_DirectRooms": "デフォルトでダイレクトメッセージの暗号化を有効にする", + "E2E_Enabled_Default_PrivateRooms": "デフォルトでプライベートルームの暗号化を有効にする", "E2E_Encryption_Password_Change": "暗号化パスワードを変更する", "E2E_Encryption_Password_Explanation": "暗号化されたプライベートグループとダイレクトメッセージを作成できるようになりました。 既存のプライベートグループまたはダイレクトメッセージを暗号化するように変更することもできます。

メッセージのエンコード/デコードの鍵がサーバーに保存されなくなるのでこれが最後の暗号化です。そのため、安全な別の場所にパスワードを保管する必要があります。 E2E暗号化を使用したい他のデバイスにそれを入力する必要があります。", "E2E_password_reveal_text": "暗号化されたプライベートグループとダイレクトメッセージを作成できるようになりました。 既存のプライベートグループまたはダイレクトメッセージを暗号化するように変更することもできます。

メッセージのエンコード/デコードの鍵がサーバーに保存されなくなるのでこれが最後の暗号化です。そのため、安全な別の場所にパスワードを保管する必要があります。 E2E暗号化を使用したい他のデバイスにそれを入力する必要があります。 この詳細をご覧ください!

あなたのパスワードは %s です。

これは自動生成されたパスワードです。既存のパスワードを入力したブラウザからいつでも暗号化キーの新しいパスワードを設定できます。
このパスワードは、パスワードを保存してこのメッセージを閉じるまで、このブラウザにのみ保存されます。", @@ -1247,12 +1290,14 @@ "Emoji_provided_by_JoyPixels": "絵文字提供:JoyPixels", "EmojiCustomFilesystem": "カスタム絵文字ファイルシステム", "Empty_title": "タイトルなし", + "Engagement_Dashboard": "エンゲージメントダッシュボード", "Enable": "有効", "Enable_Auto_Away": "自動離席を有効にする", "Enable_Desktop_Notifications": "デスクトップ通知を有効にする", "Enable_inquiry_fetch_by_stream": "ストリームを使用してサーバーから照会データを取得できるようにします", "Enable_Svg_Favicon": "SVGファビコンを有効にする", "Enable_two-factor_authentication": "2ファクタ認証を有効にする", + "Enable_two-factor_authentication_email": "電子メールを介した2ファクタ認証を有効にする", "Enabled": "有効", "Encrypted": "暗号化", "Encrypted_channel_Description": "暗号化されたチャネルを終了する。検索は暗号化されたチャンネルでは機能せず、通知にはメッセージの内容が表示されないことがあります。", @@ -1263,6 +1308,7 @@ "End_OTR": "オフレコ会話を終了", "Enter_a_name": "名前を入力してください", "Enter_a_regex": "正規表現を入力", + "Enter_a_department_name": "部署名を入力してください", "Enter_a_room_name": "ルーム名を入力します。", "Enter_a_username": "ユーザー名を入力", "Enter_a_tag": "タグを入力してください", @@ -1279,6 +1325,7 @@ "Entertainment": "エンターテインメント", "Error": "エラーが発生しました", "error-action-not-allowed": "__action__は許可されません", + "error-agent-offline": "エージェントはオフラインです", "error-application-not-found": "アプリケーションは見つかりませんでした", "error-archived-duplicate-name": "名前が `__room_name__` のアーカイブされたチャンネルがあります", "error-avatar-invalid-url": "無効なアバターURL: __url__", @@ -1299,6 +1346,7 @@ "error-email-send-failed": "メールを送信しようとしてエラーが発生しました: __message__", "error-field-unavailable": "__field__ は、すでに利用されています :(", "error-file-too-large": "ファイルが大きすぎます", + "error-forwarding-chat-same-department": "選択した部門と現在の部屋の部門は同じです", "error-importer-not-defined": "インポート処理が正しく定義されていません。Import クラスが見つかりません。", "error-import-file-extract-error": "インポートファイルの抽出に失敗しました。", "error-import-file-is-empty": "インポートされたファイルは空のようです。", @@ -1382,7 +1430,9 @@ "error-logged-user-not-in-room": "あなたはルーム `%s`にいません", "error-user-registration-disabled": "ユーザー登録は無効になっています", "error-user-registration-secret": "ユーザー登録は唯一の秘密のURLを経由して許可されています", + "error-validating-department-chat-closing-tags": "会話の終了時に部門がタグを必要とする場合、少なくとも1つの終了タグが必要です。", "error-you-are-last-owner": "あなたが最後の所有者です。ルームを退出する前に、新しい所有者を設定してください。", + "error-starring-message": "メッセージにスターを付けられませんでした", "Error_404": "エラー404", "Error_changing_password": "パスワード変更中に問題が発生しました", "Error_loading_pages": "ページの読み込み中のエラー", @@ -1411,12 +1461,14 @@ "except_pinned": " (ピン留めされているものを除く)", "Execute_Synchronization_Now": "今すぐ同期を実行する", "Exit_Full_Screen": "全画面を終了", + "Experimental_Feature_Alert": "これは実験的な機能です!将来予告なしに変更、破損、または削除される可能性があることに注意してください。", "Expiration": "有効期限", "Expiration_(Days)": "有効期限(日)", "Export_My_Data": "マイデータ (JSON) をエクスポートする", "expression": "式", "Extended": "拡張", "External_Domains": "外部ドメイン", + "External_Users": "外部ユーザー", "External_Queue_Service_URL": "外部キューサービスのURL", "External_Service": "外部サービス", "Facebook_Page": "Facebookのページ", @@ -1572,6 +1624,8 @@ "Full_Screen": "全画面", "Gaming": "賭博", "General": "全般", + "Generate_new_key": "新しいキーを生成する", + "Generating_key": "キーを生成しています", "Get_link": "リンクを取得", "Generate_New_Link": "新しいリンクを生成", "github_no_public_email": "あなたのGitHubアカウントはパブリックメールなメールアドレスを持っていません", @@ -1611,10 +1665,12 @@ "Group_favorites": "お気に入りをグループ化", "Group_mentions_disabled_x_members": "__total__人以上のメンバーがいるルームでは、グループへの`@all`と`@here`は無効になっています。", "Group_mentions_only": "グループメンションのみ", + "Grouping": "グルーピング", "Hash": "ハッシュ", "Header": "ヘッダ", "Header_and_Footer": "ヘッダーとフッター", "Healthcare_and_Pharmaceutical": "ヘルスケア/医薬品", + "Here_is_your_authentication_code": "認証コードは次のとおりです。", "Help_Center": "ヘルプセンター", "Helpers": "ヘルパー", "Hex_Color_Preview": "16進カラープレビュー", @@ -1655,9 +1711,11 @@ "if_they_are_from": " (%sからのものである場合)", "If_this_email_is_registered": "このメールが登録されている場合は、パスワードをリセットする方法が記載されています。まもなくメールが届かない場合は、もう一度やり直してください。", "If_you_are_sure_type_in_your_password": "お間違いなければ、パスワードを入力してください:", + "Members_List": "メンバーリスト", "If_you_are_sure_type_in_your_username": "あなたのユーザー名に必ずタイプである場合: ", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "持っていない場合は、[omni@rocket.chat] (mailto: omni@rocket.chat) にメールを送ってください。", "If_you_didnt_ask_for_reset_ignore_this_email": "パスワードリセットを尋ねていなかった場合は、このメールを無視することができます。", + "If_you_didnt_try_to_login_in_your_account_please_ignore_this_email": "アカウントにログインしようとしなかった場合は、このメールを無視してください。", "Iframe_Integration": "Iframeの統合", "Iframe_Integration_receive_enable": "受信を有効にする", "Iframe_Integration_receive_enable_Description": "親ウィンドウがRocket.Chatにコマンドを送信できるようにする。", @@ -1856,6 +1914,7 @@ "IssueLinks_Incompatible": "警告: これと「16進カラープレビュー」を同時に有効にしないでください。", "IssueLinks_LinkTemplate": "問題リンクのテンプレート", "IssueLinks_LinkTemplate_Description": "問題のリンクのテンプレート。 %sは発行番号に置き換えられます。", + "Items_per_page:": "ページあたりのアイテム:", "It_works": "できます", "italic": "斜体", "italics": "斜体", @@ -1869,6 +1928,7 @@ "Mobex_sms_gateway_restful_address": "Mobex SMS REST APIアドレス", "Mobex_sms_gateway_restful_address_desc": "Mobex REST APIのIPまたはホスト。例えば `http://192.168.1.1:8080` または `https://www.example.com:8080`", "Mobex_sms_gateway_username": "ユーザー名", + "Most_popular_channels_top_5": "最も人気のあるチャンネル(上位5つ)", "Jitsi_Chrome_Extension": "Chromeの拡張機能同上", "Jitsi_Enabled_TokenAuth": "JWT認証を有効にする", "Jitsi_Application_ID": "アプリケーションID(iss)", @@ -1886,6 +1946,7 @@ "Join_the_given_channel": "チャンネルへ参加する", "Join_video_call": "ビデオ通話に参加", "Joined": "参加中", + "Joined_at": "参加しました:", "Jump": "移動", "Jump_to_first_unread": "最初の未読へ移動", "Jump_to_message": "メッセージへ移動", @@ -1927,6 +1988,7 @@ "Language_Russian": "ロシア語", "Language_Spanish": "スペイン語", "Language_Version": "日本語バージョン", + "Last_active": "最後のアクティブ", "Last_login": "最終ログイン", "Last_Message_At": "最後のメッセージ", "Last_seen": "最近見たもの", @@ -1934,6 +1996,9 @@ "Last_Message": "最後のメッセージ", "Last_Status": "最終ステータス", "Last_Updated": "最終更新", + "Last_7_days": "過去7日間", + "Last_30_days": "過去30日間", + "Last_90_days": "過去90日間", "Launched_successfully": "成功した", "Layout": "レイアウト", "Layout_Home_Body": "ホーム画面の本文", @@ -2061,6 +2126,7 @@ "Livechat_agents": "ライブチャット 担当者", "Livechat_Agents": "担当者", "Livechat_AllowedDomainsList": "ライブチャット可能なドメイン", + "Livechat_Appearance": "Livechatの外観", "Livechat_Dashboard": "ライブチャット ダッシュボード", "Livechat_enabled": "ライブチャットを有効にする", "Livechat_Facebook_API_Key": "OmniChannel APIキー", @@ -2070,6 +2136,7 @@ "Livechat_forward_open_chats_timeout": "チャットを転送する (秒) のタイムアウト", "Livechat_guest_count": "ゲストカウンター", "Livechat_Inquiry_Already_Taken": "ライブチャットのお問い合わせはすでに完了しています", + "Livechat_Installation": "Livechatのインストール", "Livechat_managers": "ライブチャット 管理者", "Livechat_Managers": "管理者", "Livechat_offline": "ライブチャットオフライン", @@ -2087,6 +2154,7 @@ "Livechat_transfer_to_agent": "__from__ がチャットを __to__ に転送しました", "Livechat_transfer_to_department": "__from__ はチャットを __to__ 部門に転送しました", "Livechat_transfer_return_to_the_queue": "__from__ はチャットをキューに戻しました", + "Livechat_Triggers": "Livechatトリガー", "Livechat_Users": "ライブチャット 担当者", "LiveStream & Broadcasting": "ライブストリーム & ブロードキャスト", "Livestream_close": "ライブストリームを閉じる", @@ -2106,6 +2174,7 @@ "Local_Domains": "ローカルドメイン", "Local_Password": "ローカルパスワード", "Localization": "ローカライズ", + "Location": "ロケーション", "Log_Exceptions_to_Channel_Description": "キャプチャされたすべての例外を受け取るチャンネル。例外を無視するには、空のままにします。", "Log_Exceptions_to_Channel": "チャンネルへの例外のログ", "Log_File": "ファイルと罫線を表示する", @@ -2135,6 +2204,7 @@ "Mail_Message_No_messages_selected_select_all": "何もメッセージを選択しませんでした", "Mail_Messages": "メッセージをメール", "Mail_Messages_Instructions": "メールで送信したいメッセージをクリックして選択してください", + "Room_uploaded_file_list": "ファイル一覧", "Mail_Messages_Subject": "こちらは %s から選択されたメッセージです", "Mailer": "メーラー", "Mailer_body_tags": "[unsubscribe] を購読解除のリンクとして使わなければなりません
ユーザーのフルネームに [name], [fname], [lname] を使用できます。姓 または 名 にも対応しています。
メールアドレスには、 [email] を使用できます。", @@ -2201,7 +2271,7 @@ "Maximum": "最大", "Media": "メディア", "Medium": "中間", - "Members_List": "メンバーリスト", + "Members": "会員", "mention-all": "全員にメンション", "mention-all_description": "@allのメンションを使用する許可", "mention-here": "ここにメンション", @@ -2251,6 +2321,8 @@ "Message_GlobalSearch": "グローバル検索", "Message_GroupingPeriod": "グループ化する期限 (秒数)", "Message_GroupingPeriodDescription": "指定した秒数の間で、同じユーザーが投稿した以前のメッセージをグループ化します。", + "Message_has_been_starred": "メッセージにスターを付けました", + "Message_has_been_unstarred": "メッセージのスターを外しました", "Message_HideType_au": "「ユーザーが追加されました」メッセージを非表示にする", "Message_HideType_mute_unmute": "「ユーザーミュート/ミュート解除」メッセージを隠す", "Message_HideType_ru": "「ユーザーが削除されました」メッセージを非表示にする", @@ -2299,6 +2371,7 @@ "Message": "メッセージ", "messages": "メッセージ", "Messages": "メッセージ", + "Messages_sent": "送信されたメッセージ", "Messages_that_are_sent_to_the_Incoming_WebHook_will_be_posted_here": "Incoming WebHook へ送信されたメッセージは、こちらへ投稿されます。", "Meta": "メタ情報", "Meta_custom": "カスタムメタタグ", @@ -2358,7 +2431,9 @@ "Name_optional": "名前 (オプション)", "Name_Placeholder": "あなたの名前を入力してください...", "Navigation_History": "ナビゲーションの歴史", + "New_users": "新しいユーザー", "New_Application": "新しいアプリケーション", + "New_chat_in_queue": "キューの新しいチャット", "New_chat_transfer": "新しいチャット転送: __transfer__", "New_Custom_Field": "新しいカスタムフィールド", "New_Department": "新しい部門", @@ -2407,11 +2482,13 @@ "No_discussions_yet": "まだディスカッションはありません", "No_Threads": "スレッドが見つかりません", "No_user_with_username_%s_was_found": "\"%s\" というユーザーは、見つかりませんでした!", + "No_data_found": "データが見つかりませんでした", "Nobody_available": "誰も利用できません", "Node_version": "Node バージョン", "None": "なし", "Nonprofit": "非営利団体", "Normal": "通常", + "Not_enough_data": "データが不十分です", "Not_authorized": "権限がありません", "Not_Available": "利用不可", "Not_found_or_not_allowed": "見つからないか、権限がありません", @@ -2457,6 +2534,8 @@ "Offline_form": "オフラインフォーム", "Offline_form_unavailable_message": "オフラインフォーム不可メッセージ", "Offline_Link_Message": "メッセージに進む", + "Offline_Message": "オフラインメッセージ", + "Offline_Message_Use_DeepLink": "ディープリンクURL形式を使用", "Offline_Mention_All_Email": "電子メールの件名をすべて記入する", "Offline_Mention_Email": "__user__が #__room__ であなたにコメントしています", "Offline_message": "オフラインメッセージ", @@ -2465,6 +2544,11 @@ "Old Colors": "旧式の色", "Old Colors (minor)": "旧式の色(マイナー)", "Older_than": "より古い", + "Omnichannel_External_Frame": "外部フレーム", + "Omnichannel_External_Frame_Enabled": "外部フレームが有効", + "Omnichannel_External_Frame_URL": "外部フレームURL", + "Omnichannel_External_Frame_Encryption_JWK": "暗号化キー(JWK)", + "Omnichannel_External_Frame_Encryption_JWK_Description": "提供された場合、提供されたキーでユーザーのトークンを暗号化し、外部システムはトークンにアクセスするためにデータを復号化する必要があります", "On": "オン", "Online": "オンライン", "online": "オンライン", @@ -2519,6 +2603,7 @@ "Password_Changed_Email_Subject": "[Site_Name] - パスワードが変更されました", "Password_changed_section": "パスワードが変更されました", "Password_changed_successfully": "パスワードが正常に変更されました", + "Passwords_do_not_match": "パスワードが一致していません", "Password_Policy": "パスワードポリシー", "Past_Chats": "過去のチャット", "Paste_here": "ここに貼り付け...", @@ -2591,6 +2676,8 @@ "Privacy_Policy": "プライバシーポリシー", "Private": "プライベート", "Private_Channel": "プライベートグループ", + "Private_Channels": "プライベートグループ", + "Private_Chats": "プライベートチャット", "Private_Group": "プライベートグループ", "Private_Groups": "プライベートグループ", "Private_Groups_list": "プライベートグループ一覧", @@ -2601,6 +2688,10 @@ "Profile_picture": "プロフィールの写真", "Profile_saved_successfully": "プロフィールが正常に保存されました。", "Prometheus": "プロメテウス", + "Prometheus_Reset_Interval": "リセット間隔(ミリ秒)", + "Prometheus_Garbage_Collector": "NodeJS GCを収集する", + "Prometheus_Garbage_Collector_Alert": "非アクティブ化するには再起動が必要です", + "Prometheus_API_User_Agent": "API:ユーザーエージェントの追跡", "Protocol": "プロトコル", "Prune": "整理", "Prune_finished": "整理完了", @@ -2618,6 +2709,7 @@ "files_pruned": "整理されたファイル", "Public": "パブリック", "Public_Channel": "パブリックチャンネル", + "Public_Channels": "公開チャンネル", "Public_Community": "公共のコミュニティ", "Public_Relations": "広報", "Public_URL": "公開URL", @@ -2730,7 +2822,9 @@ "Report_this_message_question_mark": "このメッセージを報告?", "Reporting": "報告", "Request_comment_when_closing_conversation": "会話を閉じるときにコメントを要求する", + "Request_comment_when_closing_conversation_description": "有効にした場合、エージェントは会話を閉じる前にコメントを設定する必要があります。", "Request_tag_before_closing_chat": "会話を閉じる前にタグを要求する", + "Require": "必要", "Require_all_tokens": "すべてのトークンを要求する", "Require_any_token": "任意のトークンを要求する", "Require_password_change": "パスワードの変更を要求", @@ -2807,7 +2901,6 @@ "Room_type_changed_successfully": "ルームの種類は正常に変更されました", "Room_type_of_default_rooms_cant_be_changed": "これはデフォルトルームで、タイプを変更することはできませんので、管理者に相談してください。", "Room_unarchived": "ルームのアーカイブを解除しました", - "Room_uploaded_file_list": "ファイル一覧", "Room_uploaded_file_list_empty": "ファイルがありません。", "Rooms": "ルーム", "Routing": "ルーティング", @@ -2852,6 +2945,10 @@ "SAML_Default_User_Role_Description": "複数の役割をコンマで区切って指定できます。", "SAML_Role_Attribute_Name": "ロール属性名", "SAML_Role_Attribute_Name_Description": "この属性がSAMLレスポンスで見つかった場合、その値は新しいユーザーのロール名として使用されます。", + "SAML_Role_Attribute_Sync": "ユーザーロールの同期", + "SAML_Role_Attribute_Sync_Description": "ログイン時にSAMLユーザーロールを同期します(ローカルユーザーロールを上書きします)。", + "SAML_Allowed_Clock_Drift": "アイデンティティプロバイダーからのクロックドリフトを許可", + "SAML_Allowed_Clock_Drift_Description": "アイデンティティプロバイダーのクロックは、システムクロックよりわずかに進んでいる場合があります。少量のクロックドリフトを許容できます。その値は、ミリ秒(ms)単位で指定する必要があります。指定された値は、応答が検証される現在の時刻に追加されます。", "Saturday": "土曜日", "Save": "保存", "save-others-livechat-room-info": "ライブチャットルーム情報", @@ -2908,6 +3005,7 @@ "Send_invitation_email_error": "正しい書式のメールアドレスが入力されていません。", "Send_invitation_email_info": "一度に複数の招待メールを送信できます。", "Send_invitation_email_success": "以下のアドレスへ招待メールを送信しました:", + "Send_me_the_code_again": "もう一度コードを送ってください", "Send_request_on_agent_message": "エージェントメッセージに対するリクエスト送信", "Send_request_on_chat_close": "チャットの近くにリクエストを送ります", "Send_request_on_lead_capture": "リードキャプチャでリクエストを送信する", @@ -2951,6 +3049,7 @@ "Should_exists_a_user_with_this_username": "ユーザーは登録されていなければなりません。", "Show_Setup_Wizard": "セットアップウィザードを表示する", "UI_Show_top_navbar_embedded_layout": "埋め込みレイアウトで上部ナビゲーションバーを表示する", + "Layout_Show_Home_Button": "「ホームボタン」を表示", "Show_agent_email": "エージェントのメールを表示する", "Show_agent_info": "エージェント情報を表示", "Show_all": "すべて表示", @@ -3010,6 +3109,8 @@ "Smarsh_MissingEmail_Email_Description": "電子メールアドレスが見つからない場合にユーザーアカウントに表示する電子メールは、一般的にボットアカウントで発生します。", "Smarsh_Timezone": "Smarsh タイムゾーン", "Smileys_and_People": "顔文字と人々", + "SMS_Default_Omnichannel_Department": "オムニチャネル部門(デフォルト)", + "SMS_Default_Omnichannel_Department_Description": "設定されている場合、この統合によって開始されたすべての新しい着信チャットは、この部門にルーティングされます。", "SMS_Enabled": "SMS有効", "SMTP": "SMTP", "SMTP_Host": "SMTP ホスト", @@ -3026,6 +3127,7 @@ "Social_Network": "ソーシャルネットワーク", "Sorry_page_you_requested_does_not_exist_or_was_deleted": "申し訳ありませんが、リクエストしたページは存在しないか、削除されました。", "Sort": "ソート", + "Sort_By": "並び替え:", "Sort_by_activity": "アクティビティで並べ替える", "Sound": "サウンド", "Sound_File_mp3": "サウンドファイル (mp3)", @@ -3252,6 +3354,8 @@ "Total_messages": "総メッセージ数", "Total_Threads": "総スレッド数", "Total_visitors": "総訪問者数", + "totp-invalid": "コードまたはパスワードが無効です", + "TOTP Invalid [totp-invalid]": "コードまたはパスワードが無効です", "Tourism": "観光", "Transcript_Enabled": "チャットが終了した後に彼らがトランスクリプトを好きになるかどうかを訪問者に尋ねる", "Transcript_message": "トランスクリプトについて質問するときに表示するメッセージ", @@ -3265,15 +3369,35 @@ "Trigger_Words": "トリガーになる言葉", "Triggers": "トリガー", "True": "はい", + "Troubleshoot": "トラブルシューティング", + "Troubleshoot_Description": "これらの設定は、Rocket.Chat開発チームまたはサポートチームのガイダンスによってのみ有効化されることを意図しています。自分が何をしているかわからない場合は触れないでください。", + "Troubleshoot_Disable_Notifications": "通知を無効にする", + "Troubleshoot_Disable_Notifications_Alert": "この設定は通知システムを完全に無効にします。音、デスクトップ通知、モバイル通知、メールが停止します!", + "Troubleshoot_Disable_Presence_Broadcast": "プレゼンスブロードキャストを無効にする", + "Troubleshoot_Disable_Presence_Broadcast_Alert": "この設定は、すべてのインスタンスがユーザーのステータス変更をクライアントに送信することを防ぎ、すべてのユーザーを最初のロードからのプレゼンスステータスで維持します。", + "Troubleshoot_Disable_Instance_Broadcast": "インスタンスブロードキャストを無効にする", + "Troubleshoot_Disable_Instance_Broadcast_Alert": "この設定により、Rocket.Chatインスタンスが他のインスタンスにイベントを送信できなくなり、同期の問題や誤動作が発生する可能性があります。", + "Troubleshoot_Disable_Sessions_Monitor": "セッションモニターを無効にする", + "Troubleshoot_Disable_Sessions_Monitor_Alert": "この設定により、ユーザーセッションの処理が停止し、統計が正しく機能しなくなります!", + "Troubleshoot_Disable_Livechat_Activity_Monitor": "Livechatアクティビティモニターを無効にする", + "Troubleshoot_Disable_Livechat_Activity_Monitor_Alert": "この設定により、ライブチャット訪問者セッションの処理が停止し、統計が正しく機能しなくなります!", + "Troubleshoot_Disable_Statistics_Generator": "統計ジェネレーターを無効にする", + "Troubleshoot_Disable_Statistics_Generator_Alert": "この設定は、誰かが更新ボタンをクリックするまで情報ページを古くしてすべての統計の処理を停止し、システムの周りに他の欠けている情報を引き起こす可能性があります!", + "Troubleshoot_Disable_Data_Exporter_Processor": "データエクスポータプロセッサを無効にする", + "Troubleshoot_Disable_Data_Exporter_Processor_Alert": "この設定により、ユーザーからのすべてのエクスポート要求の処理が停止するため、ユーザーはデータをダウンロードするためのリンクを受け取りません。", + "Troubleshoot_Disable_Workspace_Sync": "ワークスペース同期を無効にする", + "Troubleshoot_Disable_Workspace_Sync_Alert": "この設定により、このサーバーとRocket.Chatのクラウドとの同期が停止し、マーケットプレイスおよびエンタープライズライセンスで問題が発生する可能性があります。", "Tuesday": "火曜日", "Turn_OFF": "消す", "Turn_ON": "オンにする", "Two Factor Authentication": "2ファクタ認証", "Two-factor_authentication": "2ファクタ認証", + "Two-factor_authentication_email": "電子メールによる2ファクタ認証", "Two-factor_authentication_disabled": "2ファクタ認証は無効です", "Two-factor_authentication_enabled": "2ファクタ認証は有効です", "Two-factor_authentication_is_currently_disabled": "2ファクタ認証は現在無効です", "Two-factor_authentication_native_mobile_app_warning": "警告: これを有効にすると、2FAを実装するまでパスワードを使ってネイティブモバイルアプリ (Rocket.Chat +) にログインすることはできません。", + "Two-factor_authentication_email_is_currently_disabled": "電子メールによる二要素認証は現在無効になっています", "Type": "種類", "Type_your_email": "あなたのメールアドレスを入力してください", "Type_your_job_title": "職種を入力してください", @@ -3400,6 +3524,7 @@ "User_sent_a_message_to_you": "__username__からあなたにメッセージが送信されました ", "user_sent_an_attachment": "__user__が添付ファイルを送信しました", "User_Settings": "ユーザー設定", + "User_started_a_new_conversation": "__username__ さんが新しい会話を開始しました", "User_unmuted_by": "ユーザー __user_unmuted__ は、ミュートを解除されました。 by __user_by__", "User_unmuted_in_room": "ユーザーはルームでミュートを解除されました", "User_updated_successfully": "ユーザーは正常に更新されました", @@ -3437,6 +3562,7 @@ "Username_wants_to_start_otr_Do_you_want_to_accept": "__username__ は、オフレコ会話を開始したいようです。受け入れますか?", "Users": "ユーザー", "Users_added": "ユーザーが追加されました", + "Users_by_time_of_day": "時間帯別のユーザー", "Users_in_role": "ロールを割り当て中のユーザー", "Users must use Two Factor Authentication": "2ファクタ認証を必須にする", "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "ロールを表示したくない場合は、説明フィールドを空白のままにします", @@ -3445,6 +3571,8 @@ "UTF8_Names_Slugify": "UTF8形式名をスラグ化する", "UTF8_Names_Validation": "UTF8形式名の検証パターン", "UTF8_Names_Validation_Description": "特殊文字と空はを許可しないでください。半角記号(マイナス・アンダーバー・ドット)を使えますが、名前の最後には使えません", + "Value_messages": "__value__ メッセージ", + "Value_users": "__value__ ユーザー", "Validate_email_address": "電子メールアドレスの検証", "Verification_email_body": "[Site_Name]にアカウントを作成しました。下のボタンをクリックしてメールアドレスを確認し、登録を完了してください。", "Verification": "検証", @@ -3454,6 +3582,7 @@ "Verified": "検証", "Verify": "確認します", "Verify_your_email": "あなたの電子メールを確認します", + "Verify_your_email_for_the_code_we_sent": "送信したコードのメールを確認します", "Version": "バージョン", "Videos": "ビデオ", "Video Conference": "ビデオ会議", @@ -3546,6 +3675,8 @@ "Welcome": "ようこそ %s.", "Welcome_to": "[Site_Name]へようこそ", "Welcome_to_the": "ようこそ", + "Where_are_the_messages_being_sent?": "メッセージはどこに送信されますか?", + "When_is_the_chat_busier?": "チャットはいつ忙しいですか?", "Why_do_you_want_to_report_question_mark": "なぜあなたは報告したいですか?", "will_be_able_to": "は、以下ができるようになります", "Worldwide": "全世界", diff --git a/packages/rocketchat-i18n/i18n/km.i18n.json b/packages/rocketchat-i18n/i18n/km.i18n.json index 717f08f2c7d1..a24feba8c7b2 100644 --- a/packages/rocketchat-i18n/i18n/km.i18n.json +++ b/packages/rocketchat-i18n/i18n/km.i18n.json @@ -1535,6 +1535,7 @@ "if_they_are_from": "(ប្រសិនបើពួកគេមកពី %s)", "If_this_email_is_registered": "បើអ៊ីមែលនេះត្រូវបានចុះឈ្មោះយើងនឹងផ្ញើការណែនាំអំពីរបៀបកំណត់ពាក្យសម្ងាត់របស់អ្នក។ បើអ្នកមិនទទួលបានអ៊ីមែលក្នុងរយៈពេលខ្លីសូមត្រឡប់មកវិញហើយព្យាយាមម្តងទៀត។", "If_you_are_sure_type_in_your_password": "ប្រសិនបើអ្នកមានប្រភេទប្រាកដថាពាក​​្យសម្ងាត់របស់អ្នក:", + "Members_List": "បញ្ជី​សមាជិក", "If_you_are_sure_type_in_your_username": "ប្រសិនបើអ្នកមានប្រភេទប្រាកដថានៅក្នុងឈ្មោះអ្នកប្រើប្រាស់របស់អ្នក:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "ប្រសិនបើអ្នកមិនមាននរណាម្នាក់ផ្ញើរអ៊ីមែលទៅ [omni@rocket.chat] (mailto: omni@rocket.chat) ដើម្បីទទួលបានរបស់អ្នក។", "If_you_didnt_ask_for_reset_ignore_this_email": "ប្រសិនបើអ្នកមិនបានសួររកការកំណត់ពាក្យសម្ងាត់របស់អ្នកឡើងវិញទេ, អ្នកអាចមិនអើពើនឹងអ៊ីម៉ែលនេះ។", @@ -1939,6 +1940,7 @@ "Mail_Message_No_messages_selected_select_all": "អ្នកមិនបានជ្រើសសារណាមួយឡើយ។", "Mail_Messages": "សារសំបុត្រ", "Mail_Messages_Instructions": "ជ្រើសសារដែលអ្នកចង់ផ្ញើតាមរយៈអ៊ីម៉ែលដោយចុចលើសារ", + "Room_uploaded_file_list": "បញ្ជី​ឯកសារ", "Mail_Messages_Subject": "នៅទីនេះជាមួយផ្នែកដែលបានជ្រើសរបស់ %s ដែលសារ", "Mailer": "ផ្ញើសំបុត្រ", "Mailer_body_tags": "អ្នកត្រូវប្រើប្រាស់ [unsubcribe] សម្រាប់ដកដំណភ្ជាប់ជាវជាប្រចាំ។
អ្នកប្រហែលជាត្រូវប្រើប្រាស់ [name], [fname], [lname] ធ្វើជាឈ្មោះពេញរបស់អ្នកប្រើប្រាស់។
អ្នកប្រហែលជាប្រើ [email] ធ្វើជាអ៊ីមែលរបស់អ្នកប្រើប្រាស់។", @@ -1981,7 +1983,6 @@ "Max_length_is": "ប្រវែងអតិបរមាគឺ%s", "Media": "ប្រព័ន្ធផ្សព្វផ្សាយ", "Medium": "មធ្យម", - "Members_List": "បញ្ជី​សមាជិក", "mention-all": "និយាយទាំងអស់", "mention-all_description": "ការអនុញ្ញាតប្រើប្រាស់ @all mention", "mention-here": "បញ្ជាក់នៅទីនេះ", @@ -2491,7 +2492,6 @@ "Room_type_changed_successfully": "ប្រភេទបន្ទប់ផ្លាស់ប្តូរដោយជោគជ័យ", "Room_type_of_default_rooms_cant_be_changed": "នេះជាបន្ទប់លំនាំដើមហើយមិនអាចប្តូរប្រភេទបានទេសូមពិគ្រោះជាមួយអ្នកគ្រប់គ្រងរបស់អ្នក។", "Room_unarchived": "បន្ទប់ទុក​​ក្នុងប័ណ្ណសារ", - "Room_uploaded_file_list": "បញ្ជី​ឯកសារ", "Room_uploaded_file_list_empty": "ពុំមានឯកសារដែលអាចប្រើបាន។", "Rooms": "បន្ទប់", "Run_only_once_for_each_visitor": "ដំណើរការតែនៅលើអ្នកទស្សនាម្នាក់ៗ", @@ -2869,6 +2869,7 @@ "Trigger_Words": "ពាក្យគន្លឹះ", "Triggers": "ដែលបង្កឱ្យកើត", "True": "ពិត", + "Troubleshoot_Disable_Notifications": "បិទការជូនដំណឹង", "Tuesday": "ថ្ងៃអង្គារ", "Turn_OFF": "បិទ", "Turn_ON": "បើក", diff --git a/packages/rocketchat-i18n/i18n/ko.i18n.json b/packages/rocketchat-i18n/i18n/ko.i18n.json index 2a39e50d0f1d..80fd7cf5e173 100644 --- a/packages/rocketchat-i18n/i18n/ko.i18n.json +++ b/packages/rocketchat-i18n/i18n/ko.i18n.json @@ -1452,6 +1452,7 @@ "if_they_are_from": "(그들이 %s 출신 인 경우)", "If_this_email_is_registered": "이 이메일이 등록되면 비밀번호 재설정 방법에 대한 안내가 전송됩니다. 잠시 이메일을받지 못하면 다시 돌아와 다시 시도하십시오.", "If_you_are_sure_type_in_your_password": "계속 진행하려면 비밀번호를 입력해주세요:", + "Members_List": "참여자 목록", "If_you_are_sure_type_in_your_username": "계속 진행하려면 사용자명을 입력해주세요:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "갖고 계시지 않으시면 [omni@rocket.chat] (mailto : omni@rocket.chat)로 전자 메일을 보내주십시오.", "If_you_didnt_ask_for_reset_ignore_this_email": "비밀번호 재설정을 요청하지 않았다면 이 이메일은 무시해도 됩니다.", @@ -1859,6 +1860,7 @@ "Mail_Message_No_messages_selected_select_all": "메시지를 선택해주세요.", "Mail_Messages": "메시지 메일보내기", "Mail_Messages_Instructions": "메시지를 클릭해 메일로 보내고 싶은 메시지를 선택하세요.", + "Room_uploaded_file_list": "파일 목록", "Mail_Messages_Subject": "%s 대화방에서 선택된 메시지입니다", "Mailer": "메일보내기", "Mailer_body_tags": "구독해지를 위해 [unsubscribe]를 반드시 사용합니다.
[name] - 전체이름(성+이름), [lname] - 성, [fname] - 이름을 사용할 수 있습니다.
사용자의 이메일을 [email]로 사용할 수 있습니다.", @@ -1903,7 +1905,6 @@ "Max_length_is": "최대 길이는 %s입니다.", "Media": "미디어", "Medium": "보통", - "Members_List": "참여자 목록", "mention-all": "모두에게 멘션", "mention-all_description": "@all 멘션 사용 권한", "mention-here": "여기에 멘션", @@ -2446,7 +2447,6 @@ "Room_type_changed_successfully": "대화방 유형을 변경했습니다.", "Room_type_of_default_rooms_cant_be_changed": "이 대화방은 기본 대화방이며 유형을 변경할 수 없습니다. 관리자에게 문의하십시오.", "Room_unarchived": "대화방 보관 해제", - "Room_uploaded_file_list": "파일 목록", "Room_uploaded_file_list_empty": "파일이 없습니다.", "Rooms": "대화방", "Routing": "라우팅", @@ -2846,6 +2846,7 @@ "Trigger_Words": "트리거 단어", "Triggers": "트리거", "True": "설정됨", + "Troubleshoot_Disable_Notifications": "알림 비활성", "Tuesday": "화요일", "Turn_OFF": "끄기", "Turn_ON": "켜기", diff --git a/packages/rocketchat-i18n/i18n/ku.i18n.json b/packages/rocketchat-i18n/i18n/ku.i18n.json index 28f7e9766361..9be1c0e99b77 100644 --- a/packages/rocketchat-i18n/i18n/ku.i18n.json +++ b/packages/rocketchat-i18n/i18n/ku.i18n.json @@ -1297,6 +1297,7 @@ "if_they_are_from": "(eger ew ji %s)", "If_this_email_is_registered": "Heke ev e-nameya qeydkirî ye, em ê li ser şîfreya we çawa şîfreya xwe bistînin. Heke hûn bi nameyek zûtirîn bistînin, kerema xwe dîsa vegerin û dîsa biceribînin.", "If_you_are_sure_type_in_your_password": "Eger tu bi xwe ewle type li şîfreya xwe:", + "Members_List": "لیستی ئەندامان", "If_you_are_sure_type_in_your_username": "Eger tu bi xwe ewle type li navê te in:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Heke ku we tune ku yek e-mail bişîne [omni@rocket.chat] (mailto: omni@rocket.chat) da ku hûn bibînin.", "Iframe_Integration": "Însrame Integration", @@ -1669,6 +1670,7 @@ "Mail_Message_No_messages_selected_select_all": "Tu peyam hatine hilbijartin ne.", "Mail_Messages": "Messages mail", "Mail_Messages_Instructions": "Hilbijartina ku mesajên ku tu dixwazî ​​bişîne via email bi tikandina messages", + "Room_uploaded_file_list": "Lîsteya files", "Mail_Messages_Subject": "Here rêjeyek hilbijartî yên %s mesajên ye", "Mailer": "نامەبەر", "Mailer_body_tags": "Tu divê [unsubscribe] ji bo link unsubscription bi kar tînin.
Dibe ku tu [name], [fname] ji bo navê bikarhêner, nav an paşnav, bi rêzê ve bi kar tînin, [lname].
Dibe ku tu [email] ji bo email bikarhêner bi kar tînin.", @@ -1710,7 +1712,6 @@ "Max_length_is": "Mezinahiya%s e", "Media": "Medya", "Medium": "Medya", - "Members_List": "لیستی ئەندامان", "mention-all": "Mention All", "mention-all_description": "Destûra karûbarê @allê bikar bînin", "mention-here": "Va ye", @@ -2202,7 +2203,6 @@ "Room_type_changed_successfully": "type odeyê de bi serkeftî hate guhertin", "Room_type_of_default_rooms_cant_be_changed": "Ev odeya navek e û cureyê neyê guhertin, ji kerema xwe birêveberê xwe biparêze.", "Room_unarchived": "room unarchived", - "Room_uploaded_file_list": "Lîsteya files", "Room_uploaded_file_list_empty": "No files tune.", "Rooms": "odeyên", "run-import": "Import Import", @@ -2557,6 +2557,7 @@ "Trigger_Words": "Words Trigger", "Triggers": "destpêker", "True": "rast", + "Troubleshoot_Disable_Notifications": "Notification", "Tuesday": "Sêşem", "Turn_OFF": "Temirandin", "Turn_ON": "Vekirin", diff --git a/packages/rocketchat-i18n/i18n/lo.i18n.json b/packages/rocketchat-i18n/i18n/lo.i18n.json index 1343aab1d8f2..b39bf92f9f02 100644 --- a/packages/rocketchat-i18n/i18n/lo.i18n.json +++ b/packages/rocketchat-i18n/i18n/lo.i18n.json @@ -1297,6 +1297,7 @@ "if_they_are_from": "(ຖ້າພວກເຂົາມາຈາກ %s)", "If_this_email_is_registered": "ຖ້າອີເມວນີ້ຖືກລົງທະບຽນ, ພວກເຮົາຈະສົ່ງຄໍາແນະນໍາກ່ຽວກັບວິທີການປັບລະຫັດຜ່ານຂອງທ່ານ. ຖ້າທ່ານບໍ່ໄດ້ຮັບອີເມວໃນໄວໆນີ້, ກະລຸນາກັບຄືນແລະລອງອີກເທື່ອຫນຶ່ງ.", "If_you_are_sure_type_in_your_password": "ຖ້າຫາກວ່າທ່ານແນ່ໃຈວ່າຢູ່ໃນປະເພດລະຫັດຜ່ານຂອງທ່ານ:", + "Members_List": "ບັນຊີສະມາຊິກ", "If_you_are_sure_type_in_your_username": "ຖ້າຫາກວ່າທ່ານແນ່ໃຈວ່າຢູ່ໃນປະເພດຊື່ຜູ້ໃຊ້ຂອງທ່ານ:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "ຖ້າທ່ານບໍ່ມີໃຜສົ່ງອີເມວໄປຫາ [omni@rocket.chat] (mailto: omni@rocket.chat) ເພື່ອໃຫ້ໄດ້ຮັບຂອງທ່ານ.", "Iframe_Integration": "Iframe Integration", @@ -1669,6 +1670,7 @@ "Mail_Message_No_messages_selected_select_all": "ທ່ານຍັງບໍ່ໄດ້ເລືອກຂໍ້ຄວາມ", "Mail_Messages": "ຂໍ້ຄວາມອີເມວ", "Mail_Messages_Instructions": "ເລືອກຂໍ້ຄວາມທີ່ທ່ານຕ້ອງການທີ່ຈະສົ່ງຜ່ານທາງອີເມລໂດຍການຄລິກຂໍ້ຄວາມ", + "Room_uploaded_file_list": "ບັນຊີໄຟລ໌", "Mail_Messages_Subject": "ຕໍ່ໄປນີ້ແມ່ນເປັນສ່ວນການຄັດເລືອກຂອງຂໍ້ %s", "Mailer": "Mailer", "Mailer_body_tags": "ທ່ານຕ້ອງການນໍາໃຊ້ [unsubscribe] ສໍາລັບການເຊື່ອມຕໍ່ unsubscription.
ທ່ານອາດຈະນໍາໃຊ້ [name], [fname], [lname] ສໍາລັບຊື່ເຕັມຂອງຜູ້ໃຊ້ໄດ້, ຊື່ທໍາອິດຫຼືຊື່ສຸດທ້າຍ, ຕາມລໍາດັບ.
ທ່ານອາດຈະນໍາໃຊ້ [email] ສໍາລັບອີເມລຂອງຜູ້ໃຊ້ໄດ້.", @@ -1710,7 +1712,6 @@ "Max_length_is": "ຄວາມຍາວສູງສຸດແມ່ນ%s", "Media": "ສື່ມວນຊົນ", "Medium": "ປານກາງ", - "Members_List": "ບັນຊີສະມາຊິກ", "mention-all": "Mention All", "mention-all_description": "ການອະນຸຍາດໃຫ້ໃຊ້ @all mention", "mention-here": "ກ່າວເຖິງນີ້", @@ -2202,7 +2203,6 @@ "Room_type_changed_successfully": "ປະເພດຫ້ອງການປ່ຽນແປງສົບຜົນສໍາເລັດ", "Room_type_of_default_rooms_cant_be_changed": "ນີ້ແມ່ນຫ້ອງມາດຕະຖານແລະປະເພດບໍ່ສາມາດປ່ຽນແປງໄດ້, ກະລຸນາປຶກສາກັບຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.", "Room_unarchived": "ຫ້ອງຈໍານວນຫຼາຍ", - "Room_uploaded_file_list": "ບັນຊີໄຟລ໌", "Room_uploaded_file_list_empty": "ບໍ່ມີໄຟລ໌ທີ່ມີ.", "Rooms": "ຫ້ອງ", "run-import": "Run Import", @@ -2557,6 +2557,7 @@ "Trigger_Words": "ຜົນກະທົບຕໍ່ຄໍາສັບຕ່າງໆ", "Triggers": "ຜົນກະທົບຕໍ່", "True": "ທີ່ແທ້ຈິງ", + "Troubleshoot_Disable_Notifications": "ປິດການແຈ້ງເຕືອນ", "Tuesday": "ວັນອັງຄານ", "Turn_OFF": "ປິດ", "Turn_ON": "ເປີດ", diff --git a/packages/rocketchat-i18n/i18n/lt.i18n.json b/packages/rocketchat-i18n/i18n/lt.i18n.json index 839846ce80ca..006155af8a1a 100644 --- a/packages/rocketchat-i18n/i18n/lt.i18n.json +++ b/packages/rocketchat-i18n/i18n/lt.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(jei jie yra iš %s)", "If_this_email_is_registered": "Jei šis el. Laiškas yra užregistruotas, atsiųsime instrukcijas, kaip iš naujo nustatyti slaptažodį. Jei netrukus negausite el. Laiško, grįžkite ir bandykite dar kartą.", "If_you_are_sure_type_in_your_password": "Jei esate tikri, įveskite savo slaptažodį:", + "Members_List": "Narių sąrašas", "If_you_are_sure_type_in_your_username": "Jei esate tikri įveskite savo vartotojo vardą:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Jei jūs neturite, nesiųskite el. Laiško adresu [omni@rocket.chat] (mailto: omni@rocket.chat), kad gautumėte savo.", "Iframe_Integration": "Iframe integracija", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Jūs nepasirinkote jokių pranešimų", "Mail_Messages": "Pašto žinutės", "Mail_Messages_Instructions": "Spustelėdami pranešimus pasirinkite, kuriuos pranešimus norite siųsti el. Paštu", + "Room_uploaded_file_list": "Failų sąrašas", "Mail_Messages_Subject": "Štai pasirinkta%s pranešimų dalis", "Mailer": "Maileris", "Mailer_body_tags": "Jūs privalote naudoti [unsubscribe], jei norite atsisakyti prenumeratos nuorodos.
Galite naudoti [name], [fname], [lname] atitinkamai vartotojo vardą, pavardę arba pavardę.
Galite naudoti [el.] Naudotojo el. Paštą.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Maksimalus ilgis yra%s", "Media": "Žiniasklaida", "Medium": "Vidutinis", - "Members_List": "Narių sąrašas", "mention-all": "Paminėti viską", "mention-all_description": "Leidimas naudoti @all paminėti", "mention-here": "Paminėti čia", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Kambario tipas sėkmingai pakeistas", "Room_type_of_default_rooms_cant_be_changed": "Tai numatytasis kambarys ir tipas negali būti keičiamas, prašome kreiptis į savo administratorių.", "Room_unarchived": "Kambarys išarchyvuotas", - "Room_uploaded_file_list": "Failų sąrašas", "Room_uploaded_file_list_empty": "Nėra jokių failų.", "Rooms": "Kambariai", "run-import": "Vykdyti importavimą", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Trigger žodžiai", "Triggers": "Trigeriai", "True": "Tiesa", + "Troubleshoot_Disable_Notifications": "Išjungti pranešimus", "Tuesday": "Antradienis", "Turn_OFF": "Išjunk", "Turn_ON": "Įjungti", diff --git a/packages/rocketchat-i18n/i18n/lv.i18n.json b/packages/rocketchat-i18n/i18n/lv.i18n.json index 08107fde2e48..997896fc93c0 100644 --- a/packages/rocketchat-i18n/i18n/lv.i18n.json +++ b/packages/rocketchat-i18n/i18n/lv.i18n.json @@ -1297,6 +1297,7 @@ "if_they_are_from": "(ja tie ir no %s)", "If_this_email_is_registered": "Ja šis e-pasts ir reģistrēts, mēs nosūtīsim norādījumus par to, kā atiestatīt savu paroli. Ja drīzumā nesaņemsiet e-pasta ziņojumu, lūdzam, atgriezieties un mēģiniet vēlreiz.", "If_you_are_sure_type_in_your_password": "Ja esat pārliecināts, ierakstiet savu paroli:", + "Members_List": "Dalībnieku saraksts", "If_you_are_sure_type_in_your_username": "Ja esat pārliecināts, ievadiet savu lietotājvārdu:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Ja jums nav, nosūtiet e-pastu uz adresi [omni@rocket.chat] (mailto: omni@rocket.chat), lai saņemtu savu.", "Iframe_Integration": "Iframe integrācija", @@ -1669,6 +1670,7 @@ "Mail_Message_No_messages_selected_select_all": "Jūs neesat izvēlējies nevienu ziņojumu", "Mail_Messages": "Pasta ziņojumi", "Mail_Messages_Instructions": "Izvēlieties, kurus ziņojumus vēlaties nosūtīt pa e-pastu, noklikšķinot uz ziņojumiem", + "Room_uploaded_file_list": "Failu saraksts", "Mail_Messages_Subject": "Šeit ir atlasīta %s ziņu daļa", "Mailer": "Nosūtītājs", "Mailer_body_tags": "Jums ir jāizmanto [atcelt abonementu] abonementa atsaukuma saitei.
Jūs varat lietot [vārds], [fname], [lname] attiecīgi lietotāja pilnu vārdu, vārdu vai uzvārdu.
Varat izmantot [e-pastu] lietotāja e-pastam.", @@ -1710,7 +1712,6 @@ "Max_length_is": "Maksimālais garums ir %s", "Media": "Multivide", "Medium": "Vidējs", - "Members_List": "Dalībnieku saraksts", "mention-all": "Pieminēt visus", "mention-all_description": "Atļauja izmantot @Pieminēt visus", "mention-here": "Pieminēt šeit", @@ -2202,7 +2203,6 @@ "Room_type_changed_successfully": "Istabas veids tika veiksmīgi mainīts", "Room_type_of_default_rooms_cant_be_changed": "Šī ir noklusējuma istaba, un veidu nevar mainīt, lūdzu, sazinieties ar savu administratoru.", "Room_unarchived": "Istaba izņemta no arhīva", - "Room_uploaded_file_list": "Failu saraksts", "Room_uploaded_file_list_empty": "Nav pieejami faili.", "Rooms": "Istabas", "run-import": "Palaist importēšanu", @@ -2557,6 +2557,7 @@ "Trigger_Words": "Trigera vārdi", "Triggers": "Trigeri", "True": "Taisnība", + "Troubleshoot_Disable_Notifications": "Atspējot paziņojumus", "Tuesday": "Otrdiena", "Turn_OFF": "Izslēgt", "Turn_ON": "Ieslēgt", diff --git a/packages/rocketchat-i18n/i18n/mn.i18n.json b/packages/rocketchat-i18n/i18n/mn.i18n.json index 61fdce239482..78a3c7b9ec5d 100644 --- a/packages/rocketchat-i18n/i18n/mn.i18n.json +++ b/packages/rocketchat-i18n/i18n/mn.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(хэрэв тэдгээр нь %s бол)", "If_this_email_is_registered": "Хэрэв энэ имэйл бүртгэгдсэн бол бид таны нууц үгийг шинэчлэх талаар зааварчилгааг илгээх болно. Хэрэв та имэйлээ удахгүй хүлээж авахгүй бол эргэж ороод дахин оролдоно уу.", "If_you_are_sure_type_in_your_password": "Хэрэв та нууц үгээ оруулаарай:", + "Members_List": "Гишүүдийн жагсаалт", "If_you_are_sure_type_in_your_username": "Хэрэв та хэрэглэгчийн нэрээ бичиж байгаа гэдэгт итгэлтэй байгаа бол:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Хэрвээ та [omni@rocket.chat] (mailto: omni@rocket.chat) руу имэйл явуулахгүй бол таныхыг авах болно.", "Iframe_Integration": "Iframe Интеграцчилал", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Та ямар ч зурвас сонгоогүй байна", "Mail_Messages": "Захидлын зурвасууд", "Mail_Messages_Instructions": "Зурвасуудыг дарж имэйлээр илгээхийг хүсч буй мэйлийг сонгоно уу", + "Room_uploaded_file_list": "Файлуудын жагсаалт", "Mail_Messages_Subject": "%s зурвасуудын сонгосон хэсэг энд байна", "Mailer": "Захидал", "Mailer_body_tags": "Та ашиглах ёстой [b] захиалгын холбоосын холбоосыг [бүртгэлээс хасах] ашиглах ёстой.
Та [нэр], [fname], [lname] хэрэглэгчийн бүтэн нэр, эхний нэр эсвэл овог нэрийг ашиглана.
Та хэрэглэгчийн имэйлд зориулж [имэйл] ашиглаж болно.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Хамгийн их урт нь %s", "Media": "Хэвлэл мэдээлэл", "Medium": "Дунд", - "Members_List": "Гишүүдийн жагсаалт", "mention-all": "Бүгдийг хэлнэ үү", "mention-all_description": "Имэйлийг ашиглах зөвшөөрөл", "mention-here": "Энд дурдсан", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Өрөөний төрөл амжилттай болсон", "Room_type_of_default_rooms_cant_be_changed": "Энэ бол үндсэн өрөө бөгөөд төрөл өөрчлөгдөх боломжгүй, админтайгаа зөвлөлдөнө үү.", "Room_unarchived": "Өрөөний эзгүй болсон", - "Room_uploaded_file_list": "Файлуудын жагсаалт", "Room_uploaded_file_list_empty": "Файл байхгүй байна.", "Rooms": "Өрөө", "run-import": "Импортыг ажиллуулна уу", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Үг хэлэх", "Triggers": "Тригерүүд", "True": "Үнэн", + "Troubleshoot_Disable_Notifications": "Мэдэгдэл идэвхгүй болгох", "Tuesday": "Мягмар гариг", "Turn_OFF": "Хаах", "Turn_ON": "Асаах", diff --git a/packages/rocketchat-i18n/i18n/ms-MY.i18n.json b/packages/rocketchat-i18n/i18n/ms-MY.i18n.json index 9f00701a7288..d840ea2bad04 100644 --- a/packages/rocketchat-i18n/i18n/ms-MY.i18n.json +++ b/packages/rocketchat-i18n/i18n/ms-MY.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(jika mereka dari %s)", "If_this_email_is_registered": "Jika e-mel ini didaftarkan, kami akan menghantar arahan mengenai cara untuk menetapkan semula kata laluan anda. Jika anda tidak menerima e-mel tidak lama lagi, sila kembali dan cuba lagi.", "If_you_are_sure_type_in_your_password": "Jika anda adalah jenis memastikan kata laluan anda:", + "Members_List": "Senarai Ahli", "If_you_are_sure_type_in_your_username": "Jika anda adalah jenis pasti dalam nama pengguna anda:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Sekiranya anda tidak menghantar email kepada [omni@rocket.chat] (mailto: omni@rocket.chat) untuk mendapatkannya.", "Iframe_Integration": "Integrasi Iframe", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Anda belum memilih sebarang mesej", "Mail_Messages": "Mesej mail", "Mail_Messages_Instructions": "Pilih mesej yang anda ingin menghantar melalui e-mel dengan mengklik mesej", + "Room_uploaded_file_list": "Senarai fail", "Mail_Messages_Subject": "Berikut adalah bahagian terpilih mesej %s", "Mailer": "Mailer", "Mailer_body_tags": "Anda mesti menggunakan [unsubscribe] untuk pautan langganan.
Anda boleh menggunakan [nama], [fname], [lname] bagi nama penuh pengguna, nama pertama atau nama akhir, masing-masing.
Anda boleh menggunakan [email] untuk e-mel pengguna.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Panjang maksimum ialah%s", "Media": "Media", "Medium": "Sederhana", - "Members_List": "Senarai Ahli", "mention-all": "Sebut semua", "mention-all_description": "Kebenaran untuk menggunakan sebutan @all", "mention-here": "Nyatakan di sini", @@ -2212,7 +2213,6 @@ "Room_type_changed_successfully": "Jenis bilik ditukar dengan jayanya", "Room_type_of_default_rooms_cant_be_changed": "Ini adalah bilik lalai dan jenisnya tidak boleh diubah, sila berunding dengan pentadbir anda.", "Room_unarchived": "bilik dinyaharkibkan", - "Room_uploaded_file_list": "Senarai fail", "Room_uploaded_file_list_empty": "Tiada fail yang ada.", "Rooms": "Bilik", "run-import": "Jalankan Import", @@ -2567,6 +2567,7 @@ "Trigger_Words": "Trigger Perkataan", "Triggers": "Pencetus", "True": "Dayakan", + "Troubleshoot_Disable_Notifications": "Lumpuhkan Pemberitahuan", "Tuesday": "Selasa", "Turn_OFF": "Matikan", "Turn_ON": "Hidupkan", diff --git a/packages/rocketchat-i18n/i18n/nl.i18n.json b/packages/rocketchat-i18n/i18n/nl.i18n.json index aca510906f61..e3830a359672 100644 --- a/packages/rocketchat-i18n/i18n/nl.i18n.json +++ b/packages/rocketchat-i18n/i18n/nl.i18n.json @@ -1115,8 +1115,8 @@ "Enter_a_username": "Voer een gebruikersnaam in", "Enter_Alternative": "Alternatieve modus (verzenden met Enter + Ctrl / Alt / Shift / CMD)", "Enter_authentication_code": "Voer verificatiecode in", - "Enter_Behaviour": "Voer sleutelgedrag in", - "Enter_Behaviour_Description": "Dit verandert als de Enter-toets een bericht verzendt of een regeleinde uitvoert", + "Enter_Behaviour": "Enter-toets gedrag", + "Enter_Behaviour_Description": "Dit verandert of de Enter-toets een bericht verstuurd of de cursor naar de volgende regel verplaatst.", "Enter_name_here": "Voer naam hier", "Enter_Normal": "Normale modus (verzenden met Enter)", "Enter_to": "Ga binnen bij", @@ -1410,6 +1410,7 @@ "if_they_are_from": "(als ze uit %s zijn)", "If_this_email_is_registered": "Als deze e-mail is geregistreerd, sturen we instructies over het opnieuw instellen van uw wachtwoord. Als u binnenkort geen e-mail ontvangt, kunt u terugkomen en het opnieuw proberen.", "If_you_are_sure_type_in_your_password": "Als u zeker weet typ uw wachtwoord:", + "Members_List": "Ledenlijst", "If_you_are_sure_type_in_your_username": "Als u zeker weet typ uw gebruikersnaam:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Als je er geen hebt, stuur dan een e-mail naar [omni@rocket.chat] (mailto: omni@rocket.chat) om de jouwe te krijgen.", "Iframe_Integration": "Iframe-integratie", @@ -1799,6 +1800,7 @@ "Mail_Message_No_messages_selected_select_all": "Je hebt geen bericten geslecteerd.", "Mail_Messages": "Mailberichten", "Mail_Messages_Instructions": "Kies welke berichten je wil versturen via e-mail door te klikken op de berichten", + "Room_uploaded_file_list": "Bestandslijst", "Mail_Messages_Subject": "Hier is een geselecteerd deel van %s berichten", "Mailer": "Mailer", "Mailer_body_tags": "Je moet [unsubscribe] gebruiken voor een unsubscribe link.
Je kunt [name], [fname], [lname] gebruiken voor een gebruikers volledige naam, voorname of achtername.
Je kunt [email] gebruiken voor het email adres van de gebruiker.", @@ -1841,7 +1843,6 @@ "Max_length_is": "Max lengte is%s", "Media": "Media", "Medium": "Medium", - "Members_List": "Ledenlijst", "mention-all": "Noem alles", "mention-all_description": "Toestemming om de @all-vermelding te gebruiken", "mention-here": "Hier vermelden", @@ -2043,7 +2044,7 @@ "OAuth_Application": "OAuth Application", "OAuth_Applications": "OAuth Applications", "Objects": "Voorwerpen", - "Off": "Af", + "Off": "Uit", "Off_the_record_conversation": "Off-the-opname Conversation", "Off_the_record_conversation_is_not_available_for_your_browser_or_device": "Off-the-opname gesprek is niet beschikbaar voor uw browser of apparaat.", "Office_Hours": "Kantoortijden", @@ -2063,7 +2064,7 @@ "Old Colors": "Oude kleuren", "Old Colors (minor)": "Oude kleuren (klein)", "Older_than": "Ouder dan", - "On": "Op", + "On": "Aan", "Online": "Online", "online": "online", "Only_authorized_users_can_write_new_messages": "Alleen geautoriseerde gebruikers kunnen nieuwe berichten schrijven", @@ -2122,7 +2123,7 @@ "pin-message": "Pinbericht", "pin-message_description": "Toestemming om een ​​bericht in een kanaal vast te zetten", "Pin_Message": "Zet bericht vast", - "Pinned_a_message": "Speldde een bericht:", + "Pinned_a_message": "Heeft een bericht vastgezet:", "Pinned_Messages": "Vastgezette berichten", "PiwikAdditionalTrackers": "Extra Piwik-sites", "PiwikAdditionalTrackers_Description": "Voer additionele Piwik-website-URL's en SiteID's in de volgende indeling in, als u dezelfde gegevens niet op verschillende websites wilt bijhouden: [{\"trackerURL\": \"https: //my.piwik.domain2/\", \"siteId\": 42}, {\"trackerURL\": \"https: //my.piwik.domain3/\", \"siteId\": 15}]", @@ -2362,7 +2363,6 @@ "Room_type_changed_successfully": "Kamertype met succes gewijzigd", "Room_type_of_default_rooms_cant_be_changed": "Dit is een standaardkamer en het type kan niet worden gewijzigd, raadpleeg uw beheerder.", "Room_unarchived": "Kamer uit meer gearchiveerd", - "Room_uploaded_file_list": "Bestandslijst", "Room_uploaded_file_list_empty": "Geen bestanden beschikbaar.", "Rooms": "Kamers", "Routing": "routing", @@ -2744,6 +2744,7 @@ "Trigger_Words": "Trigger woorden", "Triggers": "Triggers", "True": "True", + "Troubleshoot_Disable_Notifications": "Meldingen uitschakelen", "Tuesday": "Dinsdag", "Turn_OFF": "Uitschakelen", "Turn_ON": "Aanzetten", diff --git a/packages/rocketchat-i18n/i18n/no.i18n.json b/packages/rocketchat-i18n/i18n/no.i18n.json index 819b80c70b5b..47c6a3715949 100644 --- a/packages/rocketchat-i18n/i18n/no.i18n.json +++ b/packages/rocketchat-i18n/i18n/no.i18n.json @@ -3,12 +3,15 @@ "500": "Intern server feil", "#channel": "#kanal", "0_Errors_Only": "0 - Kun Feil", + "12_Hour": "12-timers klokke", "1_Errors_and_Information": "1 - Feil og informasjon", + "24_Hour": "24-timers klokke", "2_Erros_Information_and_Debug": "2 - Feil, Informasjon og Feilsøking", "@username": "@brukernavn", "@username_message": "@brukernavn ", "__username__is_no_longer__role__defined_by__user_by_": "__username__ er ikke lenger __role__ av __user_by__", "__username__was_set__role__by__user_by_": "__username__ ble satt __role__ av __user_by__", + "%_of_conversations": "% av samtaler", "Accept": "Aksepter", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Aksepter innkommende livechat selv om det ikke er noen online", "Accept_with_no_online_agents": "Aksepter uten online agenter", @@ -21,25 +24,29 @@ "Accessing_permissions": "Få tilgang til tillatelser", "Account_SID": "Konto SID", "Accounts": "kontoer", - "Accounts_Admin_Email_Approval_Needed_Default": "

Brukeren [navn] ([email]) er registrert.

Vennligst sjekk \"Administrasjon ->Brukere\" for å aktivere eller slette den.

", + "Accounts_Admin_Email_Approval_Needed_Default": "

Brukeren [name] ([email]) er registrert.

Vennligst sjekk \"Administrasjon ->Brukere\" for å aktivere eller slette den.

", "Accounts_Admin_Email_Approval_Needed_Subject_Default": "En ny bruker registrert og trenger godkjenning", - "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

Brukeren [navn] ([email]) er registrert.

Årsak: [grunn]

Vennligst sjekk \"Administrasjon ->Brukere\" for å aktivere eller slette den.

", + "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

Brukeren [name] ([email]) er registrert.

Årsak: [reason]

Vennligst sjekk \"Administrasjon ->Brukere\" for å aktivere eller slette den.

", "Accounts_AllowAnonymousRead": "Tillat anonym lesing", "Accounts_AllowAnonymousWrite": "Tillat anonym skriving", "Accounts_AllowDeleteOwnAccount": "Tillat brukere å slette egen konto", - "Accounts_AllowedDomainsList": "Tillatt Domener Liste", + "Accounts_AllowedDomainsList": "Liste over aksepterte domener", "Accounts_AllowedDomainsList_Description": "Kommaseparert liste over tillatte domener", "Accounts_AllowEmailChange": "Tillat endring av e-post", + "Accounts_AllowEmailNotifications": "Tillat epostvarsling", "Accounts_AllowPasswordChange": "Tillat passordendring", "Accounts_AllowRealNameChange": "Tillat navneskift", "Accounts_AllowUserAvatarChange": "Tillat brukervennlige endringer", "Accounts_AllowUsernameChange": "Tillat endring av brukernavn", "Accounts_AllowUserProfileChange": "Tillat endring av brukerprofil", + "Accounts_AllowUserStatusMessageChange": "Tillat egendefinert statusmelding", "Accounts_AvatarBlockUnauthenticatedAccess": "Blokker ikke autentisert tilgang til avatarer", "Accounts_AvatarCacheTime": "Avatar cache tid", "Accounts_AvatarCacheTime_description": "Antall sekunder http-protokollen blir fortalt å cache avatabildene.", "Accounts_AvatarResize": "Endre størrelsen på avatarer", "Accounts_AvatarSize": "Avatar størrelse", + "Accounts_AvatarExternalProviderUrl": "URL til ekstern tilbyder for avatar", + "Accounts_AvatarExternalProviderUrl_Description": "Eksempel: `https://acme.com/api/v1/{username}`", "Accounts_BlockedDomainsList": "Liste over blokkerte domener", "Accounts_BlockedDomainsList_Description": "Kommaseparert liste over blokkerte domener", "Accounts_BlockedUsernameList": "Blokkert brukernavnsliste", @@ -73,6 +80,7 @@ "Accounts_LoginExpiration": "Innlogging Utløp i dager", "Accounts_ManuallyApproveNewUsers": "Godkjenn nye brukere manuelt", "Accounts_OAuth_Custom_Authorize_Path": "Godkjenn sti", + "Accounts_OAuth_Custom_Avatar_Field": "Avatarfelt", "Accounts_OAuth_Custom_Button_Color": "Knappfarge", "Accounts_OAuth_Custom_Button_Label_Color": "Knapptekstfarge", "Accounts_OAuth_Custom_Button_Label_Text": "Knapptekst", @@ -82,12 +90,16 @@ "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "Identitets Token Sendt Via", "Accounts_OAuth_Custom_Login_Style": "Logg inn stil", "Accounts_OAuth_Custom_Merge_Users": "Slå sammen brukere", + "Accounts_OAuth_Custom_Access_Token_Param": "Parameternavn for \"access token\"", "Accounts_OAuth_Custom_Scope": "omfang", "Accounts_OAuth_Custom_Secret": "Hemmelig", + "Accounts_OAuth_Custom_Show_Button_On_Login_Page": "Vis knapp på innloggingsside", "Accounts_OAuth_Custom_Token_Path": "Tokenbane", "Accounts_OAuth_Custom_Token_Sent_Via": "Token Sendt Via", "Accounts_OAuth_Custom_Username_Field": "Brukernavn felt", + "Accounts_OAuth_Custom_Name_Field": "Felt for navn", "Accounts_OAuth_Custom_Roles_Claim": "Roller / Grupper feltnavn", + "Accounts_OAuth_Custom_Merge_Roles": "Slå sammen roller fra SSO", "Accounts_OAuth_Drupal": "Drupal Logg inn aktivert", "Accounts_OAuth_Drupal_callback_url": "Drupal oAuth2 Redirect URI", "Accounts_OAuth_Drupal_id": "Drupal oAuth2 Client ID", @@ -108,6 +120,7 @@ "Accounts_OAuth_Gitlab_callback_url": "GitLab tilbakeringingsadresse", "Accounts_OAuth_Gitlab_id": "GitLab ID", "Accounts_OAuth_Gitlab_identity_path": "Identitetsvei", + "Accounts_OAuth_Gitlab_merge_users": "Slå sammen brukere", "Accounts_OAuth_Gitlab_secret": "Klientshemmelighet", "Accounts_OAuth_Google": "Google-innlogging", "Accounts_OAuth_Google_callback_url": "Google tilbakeringingsadresse", @@ -122,7 +135,10 @@ "Accounts_OAuth_Meteor_id": "Meteor ID", "Accounts_OAuth_Meteor_secret": "Meteor Secret", "Accounts_OAuth_Nextcloud": "OAuth aktivert", + "Accounts_OAuth_Nextcloud_callback_url": "Callback-URL for Nextcloud", + "Accounts_OAuth_Nextcloud_id": "Nextcloud Id", "Accounts_OAuth_Nextcloud_secret": "Klientshemmelighet", + "Accounts_OAuth_Nextcloud_URL": "URL til Nextcloud server", "Accounts_OAuth_Proxy_host": "Proxy-vert", "Accounts_OAuth_Proxy_services": "Proxy-tjenester", "Accounts_OAuth_Tokenpass": "Tokenpass Login", @@ -174,21 +190,43 @@ "Accounts_RegistrationForm_Secret_URL": "Hemmelig URL", "Accounts_RegistrationForm_SecretURL": "Registreringsskjema Hemmelig URL", "Accounts_RegistrationForm_SecretURL_Description": "Du må oppgi en tilfeldig streng som vil bli lagt til din registreringsadresse. Eksempel: https://open.rocket.chat/register/[secret_hash]", + "Accounts_Registration_InviteUrlType": "Type invitasjonslenke", + "Accounts_Registration_InviteUrlType_Direct": "Direkte", + "Accounts_Registration_InviteUrlType_Proxy": "Proxy", "Accounts_RequireNameForSignUp": "Krever navn for registrering", "Accounts_RequirePasswordConfirmation": "Kreve passordbekreftelse", "Accounts_SearchFields": "Felt som skal vurderes i søk", + "Accounts_Send_Email_When_Activating": "Send e-post til brukeren når brukeren blir aktivert", + "Accounts_Send_Email_When_Deactivating": "Send e-post til brukeren når brukeren blir deaktivert", "Accounts_SetDefaultAvatar": "Angi Standard Avatar", "Accounts_SetDefaultAvatar_Description": "Trenger å bestemme standard avatar basert på OAuth-konto eller Gravatar", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "Sett epostadresser for eksterne kontoer som bekreftet", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "Kontoer opprettet fra eksterne tjenester, som LDAP, OAuth, osv., vil få epostadressene verifisert automatisk", "Accounts_ShowFormLogin": "Vis skjemabasert pålogging", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "Aktiver tofaktorautentisering via e-post", + "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Brukere med bekreftet epostadresse og alternativet aktivert på profilsiden deres vil motta en e-post med en midlertidig kode for å autorisere visse handlinger som innlogging, lagring av profilen, etc.", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Automatisk aktiver tofaktor via e-post for nye brukere", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Nye brukere vil ha tofaktorautentisering via e-post aktivert som standard. De vil kunne deaktivere det på profilsiden.", + "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Tid i sekunder før koden sendt i e-post utløper", "Accounts_TwoFactorAuthentication_Enabled": "Aktiver to faktorautentiseringer", + "Accounts_TwoFactorAuthentication_Enabled_Description": "Brukere kan konfigurere tofaktorautentisering ved å bruke hvilken som helst TOTP-app, for eksempel Google Authenticator eller Authy", "Accounts_TwoFactorAuthentication_MaxDelta": "Maksimal Delta", "Accounts_UserAddedEmail_Default": "

Velkommen til [Site_Name]

Gå til site_url] og prøve det beste åpen kildekode chat-løsning tilgjengelig i dag!

Du kan logge inn ved hjelp av e-postadressen din: [email] og passord: [passord]. Det kan hende du må endre det etter første innlogging.", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "Maksimum Delta bestemmer hvor mange tokens er gyldige til enhver tid. Tokene genereres hvert 30. sekund, og gjelder for (30 * Maks. Delta) sekunder.
Eksempel: Med et maksimalt Delta-sett på 10, kan hver token brukes opptil 300 sekunder før eller etter tidsstempel. Dette er nyttig når klientens klokke ikke er riktig synkronisert med serveren.", + "Accounts_TwoFactorAuthentication_RememberFor": "Husk tofaktor i (sekunder)", + "Accounts_TwoFactorAuthentication_RememberFor_Description": "Ikke be om ny tofaktorautorisasjonskode hvis en allerede har blitt gitt før på dette tidsintervallet.", "Accounts_UseDefaultBlockedDomainsList": "Bruk standard blokkert domener liste", "Accounts_UseDNSDomainCheck": "Bruk DNS Domain Check", "Accounts_UserAddedEmailSubject_Default": "Du har blitt lagt til i [Site_Name]", "Accounts_UserAddedEmail_Description": "Du kan bruke følgende plassholdere:

  • [navn], [fname], [lname] for brukerens fulle navn, fornavn eller etternavn.
  • [email] for brukerens e-postadresse.
  • [passord] for brukerens passord.
  • [Site_Name] og [Site_URL] for henholdsvis programnavnet og nettadressen.
", "Activate": "Aktiver", + "Active_users": "Aktive brukere", + "Daily_Active_Users": "Daglig aktive brukere", + "Weekly_Active_Users": "Ukentlige aktive brukere", + "Monthly_Active_Users": "Månedlige aktive brukere", + "DAU_value": "DAU __value__", + "WAU_value": "WAU __value__", + "MAU_value": "MAU __value__", "Activity": "Aktivitet", "Add": "Legg til", "add-oauth-service": "Legg til Oauth Service", @@ -210,6 +248,7 @@ "Add_user": "Legg til bruker", "Add_User": "Legg til bruker", "Add_users": "Legg til brukere", + "Add_Reaction": "Legg til reaksjon", "Adding_OAuth_Services": "Legge til OAuth-tjenester", "Adding_permission": "Legger til rettigheter", "Adding_user": "Legger til bruker", @@ -217,12 +256,15 @@ "Additional_Feedback": "Ekstra tilbakemelding", "additional_integrations_Bots": "Hvis du leter etter hvordan du integrerer din egen bot, så se ikke lenger enn vår Hubot-adapter. https://github.com/RocketChat/hubot-rocketchat", "additional_integrations_Zapier": "Ser du etter å integrere annen programvare og applikasjoner med Rocket.Chat, men du har ikke tid til å manuelt gjøre det? Da foreslår vi å bruke Zapier som vi støtter fullt ut. Les mer om det på vår dokumentasjon. https://rocket.chat/docs/administrator-guides/integrations/zapier/using-zaps/", + "Admin_disabled_encryption": "Din administrator har ikke aktivert ende-til-ende kryptering.", "Admin_Info": "Admin Info", "Administration": "Administrasjon", "Adult_images_are_not_allowed": "Voksenbilder er ikke tillatt", "Advocacy": "Beslutningspåvirkning", "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "Etter OAuth2-godkjenning, blir brukerne omdirigert til denne nettadressen", "Agent": "Agent", + "Agent_Info": "Agentinfo", + "Agents": "Agenter", "Agent_added": "Lagt til agent", "Agent_removed": "Fjernet agent", "Alerts": "varsler", @@ -230,17 +272,22 @@ "Alias_Format": "Aliasformat", "Alias_Format_Description": "Importer meldinger fra Slack med et alias; %s er erstattet av brukernavnet til brukeren. Hvis tom, vil ikke noe alias bli brukt.", "Alias_Set": "Alias ​​Set", + "Aliases": "Kallenavn", "All": "Alle", "All_added_tokens_will_be_required_by_the_user": "Alle tilsatte tokens vil bli pålagt av brukeren", "All_channels": "Alle kanaler", + "All_closed_chats_have_been_removed": "Alle lukkede chatter har blitt fjernet", "All_logs": "Aller logger", "All_messages": "Alle meldinger", "All_users": "Alle brukere", "All_users_in_the_channel_can_write_new_messages": "Alle brukere i kanalen kan skrive nye meldinger", + "Allow_collect_and_store_HTTP_header_informations": "Tillat å samle inn og lagre informasjon om HTTP headere.", + "Allow_collect_and_store_HTTP_header_informations_description": "Denne innstillingen bestemmer om Livechat har lov til å lagre informasjon samlet inn fra HTTP-header-data, for eksempel IP-adresse, User-Agent, og så videre.", "Allow_Invalid_SelfSigned_Certs": "Tillat ugyldige selvsignerte sertifikater", "Allow_Invalid_SelfSigned_Certs_Description": "Tillat ugyldig og selvsignert SSL-sertifikat for koblingsvalidering og forhåndsvisninger.", "Allow_switching_departments": "Tillat besøkende å bytte avdelinger", "Allow_Marketing_Emails": "Tillat markedsføring e-post", + "Almost_done": "Nesten ferdig", "Alphabetical": "Alfabetisk", "Always_open_in_new_window": "Alltid åpne i nytt vindu", "Analytics": "Analytics", @@ -255,9 +302,11 @@ "Animals_and_Nature": "Dyr og natur", "Announcement": "Kunngjøring", "API": "API", + "API_Add_Personal_Access_Token": "Legg til ny personlig Access Token", "API_Allow_Infinite_Count": "Tillat å få alt", "API_Allow_Infinite_Count_Description": "Bør samtaler til REST API få lov til å returnere alt i en samtale?", "API_Analytics": "Analytics", + "api-bypass-rate-limit": "Forbigå rate-limit for REST API", "API_CORS_Origin": "CORS Origin", "API_Default_Count": "Standard Count", "API_Default_Count_Description": "Standardtallet for REST API-resultater oppstår hvis forbrukeren ikke oppgav noen.", @@ -276,11 +325,24 @@ "API_Enable_CORS": "Aktiver CORS", "API_Enable_Direct_Message_History_EndPoint": "Aktiver sluttpunkt for direkte meldingshistorikk", "API_Enable_Direct_Message_History_EndPoint_Description": "Dette gjør det mulig for `/ api / v1 / im.history.others` som lar visning av direkte meldinger sendt av andre brukere som den som ringer ikke er en del av.", + "API_Enable_Rate_Limiter": "Aktiver Rate Limit", + "API_Enable_Rate_Limiter_Dev": "Aktiver Rate Limit i utvikling", + "API_Enable_Rate_Limiter_Dev_Description": "Bør begrense antallet kall til endepunktene i utviklingsmiljøet?", + "API_Enable_Rate_Limiter_Limit_Calls_Default": "Standard antall kall til rate-limiter", + "API_Enable_Rate_Limiter_Limit_Calls_Default_Description": "Tillatt antall kall innenfor hvert tidsrom for hvert endepunkt i REST API-et.", + "API_Enable_Rate_Limiter_Limit_Time_Default": "Standard tidsgrense for rate-limiter (i ms)", "API_Enable_Shields": "Aktiver skjold", "API_Enable_Shields_Description": "Aktiver skjold som er tilgjengelige på `/ api / v1 / shield.svg`", "API_GitHub_Enterprise_URL": "Server URL", "API_GitHub_Enterprise_URL_Description": "Eksempel: http://domain.com (unntatt trailing slash)", "API_Gitlab_URL": "GitLab URL", + "API_Personal_Access_Token_Name": "Navn på personlig Access Token", + "API_Personal_Access_Tokens_To_REST_API": "Personlig access token til REST API", + "API_Personal_Access_Tokens_Remove_Modal": "Er du sikker på at du vil fjerne denne access-tokenen?", + "API_Personal_Access_Token_Generated": "Personlig Access Token generert", + "API_Personal_Access_Token_Generated_Text_Token_s_UserId_s": "Pass på å lagre tokenet ditt på et sikkert sted, da du ikke kan hente den ut igjen senere.
Token: __token__
Din bruker-ID: __userId__", + "API_Personal_Access_Tokens_Regenerate_Modal": "Hvis du har mistet eller glemt tokenet ditt kan du regenerere det, men husk at alle applikasjoner som bruker dette tokenet må oppdateres", + "API_Personal_Access_Tokens_Regenerate_It": "Generer ny token", "API_Shield_Types": "Skjoldtyper", "API_Shield_Types_Description": "Typer skjold for å aktivere som en kommaseparert liste, velg fra `online`,` kanal` eller `*` for alle", "API_Token": "API Token", @@ -301,11 +363,14 @@ "App_status_disabled": "Funksjonshemmet", "App_status_error_disabled": "Deaktivert: Uncaught Error", "App_status_initialized": "initialisert", + "App_status_invalid_license_disabled": "Deaktivert: Ugyldig lisens", "App_status_invalid_settings_disabled": "Deaktivert: Konfigurasjon er nødvendig", "App_status_manually_disabled": "Deaktivert: manuelt", "App_status_manually_enabled": "aktivert", "App_status_unknown": "Unknown", "App_support_url": "støtte url", + "App_Url_to_Install_From": "Installer fra URL", + "App_Url_to_Install_From_File": "Installer fra fil", "Appearance": "Utseende", "Application_added": "Søknad lagt til", "Application_Name": "Programnavn", @@ -313,6 +378,8 @@ "Apply": "Søke om", "Apply_and_refresh_all_clients": "Påfør og oppdater alle klienter", "Apps": "Apps", + "Apps_Engine_Version": "Versjon av Apps Engine", + "Apps_Framework_Development_Mode": "Aktiver utviklermodus", "Apps_Framework_enabled": "Aktiver App Framework", "Apps_Settings": "Appens innstillinger", "Apps_WhatIsIt": "Apper: Hva er de?", @@ -927,6 +994,7 @@ "Display_offline_form": "Vis frakoblet skjema", "Display_unread_counter": "Vis antall uleste meldinger", "Displays_action_text": "Viser handlingstekst", + "Discussions": "Diskusjoner", "Dont_ask_me_again": "Ikke spør meg igjen!", "Dont_ask_me_again_list": "Ikke spør meg igjen listen", "Do_not_display_unread_counter": "Ikke vis noen teller på denne kanalen", @@ -1124,6 +1192,7 @@ "except_pinned": "(unntatt de som er festet)", "Execute_Synchronization_Now": "Utfør synkronisering nå", "Export_My_Data": "Eksporter mine data", + "Extended": "Utvidet", "External_Queue_Service_URL": "Ekstern køtjeneste-URL", "External_Service": "Ekstern tjeneste", "Facebook_Page": "Facebook-side", @@ -1259,6 +1328,7 @@ "GoogleVision_Type_Similar": "Søk lignende bilder", "Government": "Regjering", "Group_by_Type": "Gruppe etter type", + "Group_discussions": "Gruppediskusjoner", "Group_favorites": "Gruppe favoritter", "Group_mentions_disabled_x_members": "Gruppe nevner `@ alle` og` @ her` har blitt deaktivert for rom med flere enn __total__ medlemmer.", "Group_mentions_only": "Gruppe nevner bare", @@ -1299,6 +1369,7 @@ "if_they_are_from": "(hvis de er fra %s)", "If_this_email_is_registered": "Hvis denne e-posten er registrert, sender vi instruksjoner om hvordan du tilbakestiller passordet ditt. Hvis du ikke mottar en epost, vennligst kom tilbake og prøv igjen.", "If_you_are_sure_type_in_your_password": "Hvis du er sikker, skriv inn passordet ditt:", + "Members_List": "Medlemsliste", "If_you_are_sure_type_in_your_username": "Hvis du er sikker, skriv inn brukernavnet ditt:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Hvis du ikke har en, send en epost til [omni@rocket.chat] (mailto: omni@rocket.chat) for å få din.", "Iframe_Integration": "Iframe Integrasjon", @@ -1341,6 +1412,7 @@ "Importer_setup_error": "Det oppsto en feil under oppsett av importøren.", "Importer_Slack_Users_CSV_Information": "Filen som lastes opp må være Slack's Users-eksportfil, som er en CSV-fil. Se her for mer informasjon:", "Importer_Source_File": "Kildefilvalg", + "importer_status_finishing": "Nesten ferdig", "importer_status_import_failed": "Feil", "Inclusive": "Inklusive", "Incoming_Livechats": "Innkommende Livechats", @@ -1612,6 +1684,7 @@ "List_of_Channels": "Liste over kanaler", "List_of_Direct_Messages": "Liste over direkte meldinger", "Livechat_agents": "Livechat agenter", + "Livechat_Agents": "Agenter", "Livechat_AllowedDomainsList": "Livechat Tillatte Domener", "Livechat_Dashboard": "Livechat Dashboard", "Livechat_enabled": "Livechat aktivert", @@ -1671,6 +1744,7 @@ "Mail_Message_No_messages_selected_select_all": "Du har ikke valgt noen meldinger", "Mail_Messages": "E-postmeldinger", "Mail_Messages_Instructions": "Velg hvilke meldinger du vil sende via e-post ved å klikke på meldingene", + "Room_uploaded_file_list": "Filer Liste", "Mail_Messages_Subject": "Her er en valgt del av%s meldinger", "Mailer": "Mailer", "Mailer_body_tags": "Du bruke [unsubscribe] for unsubscription linken.
Du kan bruke [navn], [fname], [lname] for brukerens fulle navn, fornavn eller etternavn.
Du kan bruke [e-post] for brukerens e-post.", @@ -1699,6 +1773,7 @@ "MapView_GMapsAPIKey_Description": "Dette kan hentes fra Google Developers Console gratis.", "Mark_as_read": "Merk som lest", "Mark_as_unread": "Merk som ulest", + "Mark_unread": "Merk som ulest", "Markdown_Headers": "Tillat Markdown-overskrifter i meldinger", "Markdown_Marked_Breaks": "Aktiver merkede brudd", "Markdown_Marked_GFM": "Aktiver merket GFM", @@ -1712,7 +1787,6 @@ "Max_length_is": "Maks lengde er%s", "Media": "Media", "Medium": "Medium", - "Members_List": "Medlemsliste", "mention-all": "Nevne alt", "mention-all_description": "Tillatelse til å bruke @all nevne", "mention-here": "Nevn her", @@ -1872,6 +1946,8 @@ "No_snippet_messages": "Ingen utdrag", "No_starred_messages": "Ingen stjernemerkede meldinger", "No_such_command": "Ingen slik kommando: `/ __command__`", + "No_discussions_yet": "Ingen diskusjoner enda", + "No_Threads": "Ingen tråder funnet", "No_user_with_username_%s_was_found": "Ingen bruker med brukernavn \"%s\" ble funnet!", "Nobody_available": "Ingen tilgjengelig", "Node_version": "Node Versjon", @@ -2171,7 +2247,7 @@ "RetentionPolicyRoom_FilesOnly": "Bare beskjyll filer, hold beskjeder", "RetentionPolicyRoom_MaxAge": "Maksimal meldingsalder i dager (standard: __max__)", "RetentionPolicyRoom_OverrideGlobal": "Overstyr global retensjonspolicy", - "RetentionPolicyRoom_ReadTheDocs": "Pass på! Å klare disse innstillingene uten ytterst forsiktighet kan ødelegge all meldingshistorikk. Les dokumentasjonen før du slår på funksjonen her.", + "RetentionPolicyRoom_ReadTheDocs": "Pass på! Å endre disse innstillingene uten ytterst forsiktighet kan ødelegge all meldingshistorikk. Les dokumentasjonen før du slår på funksjonen herher.", "Retry_Count": "Prøv på nytt", "Role": "rolle", "Role_Editing": "Rollredigering", @@ -2204,7 +2280,6 @@ "Room_type_changed_successfully": "Romtype er endret", "Room_type_of_default_rooms_cant_be_changed": "Dette er et standardrom, og typen kan ikke endres, vennligst kontakt med administratoren din.", "Room_unarchived": "Rom unarchived", - "Room_uploaded_file_list": "Filer Liste", "Room_uploaded_file_list_empty": "Ingen filer tilgjengelig.", "Rooms": "Rom", "run-import": "Kjør import", @@ -2523,6 +2598,7 @@ "This_is_a_push_test_messsage": "Dette er en push-testmelding", "This_room_has_been_archived_by__username_": "Dette rommet er arkivert av __username__", "This_room_has_been_unarchived_by__username_": "Dette rommet er blitt arkivert av __username__", + "Threads": "Tråder", "Thursday": "Torsdag", "Time_in_seconds": "Tid i sekunder", "Title": "Tittel", @@ -2547,7 +2623,9 @@ "Tokens_Required_Input_Error": "Ugyldige skrevet tokens.", "Tokens_Required_Input_Placeholder": "Tokens aktiva navn", "Topic": "Emne", + "Total_Discussions": "Totalt antall diskusjoner", "Total_messages": "Totalt antall meldinger", + "Total_Threads": "Totalt antall tråder", "Tourism": "Turisme", "Transcript_Enabled": "Spør besøkende hvis de vil ha en transkripsjon etter at Chat er lukket", "Transcript_message": "Melding til å vise når du spør om transkripsjon", @@ -2559,6 +2637,7 @@ "Trigger_Words": "Trigger Ord", "Triggers": "Triggers", "True": "Ja", + "Troubleshoot_Disable_Notifications": "Deaktiver varslinger", "Tuesday": "tirsdag", "Turn_OFF": "Skru av", "Turn_ON": "Slå på", @@ -2588,6 +2667,7 @@ "unarchive-room": "Unarchive Room", "unarchive-room_description": "Tillatelse til å unarchive kanaler", "Unblock_User": "Fjern blokkering av bruker", + "Unfavorite": "Fjern fra favoritt", "Unignore": "Ikke ignorer", "Uninstall": "Avinstaller", "Unmute_someone_in_room": "Slå på noen på rommet", @@ -2817,7 +2897,7 @@ "You_are_logged_in_as": "Du er innlogget som", "You_are_not_authorized_to_view_this_page": "Du er ikke autorisert til å vise denne siden.", "You_can_change_a_different_avatar_too": "Du kan overstyre avataren som brukes til å legge inn fra denne integrasjonen.", - "You_can_search_using_RegExp_eg": "Du kan søke med RegExp. f.eks", + "You_can_search_using_RegExp_eg": "Du kan søke med RegExp, f.eks. /^tekst$/i", "You_can_use_an_emoji_as_avatar": "Du kan også bruke en emoji som en avatar.", "You_can_use_webhooks_to_easily_integrate_livechat_with_your_CRM": "Du kan bruke webhooks for enkelt å integrere livechat med CRM.", "You_cant_leave_a_livechat_room_Please_use_the_close_button": "Du kan ikke forlate et livechat-rom. Vennligst bruk lukkeknappen.", diff --git a/packages/rocketchat-i18n/i18n/pl.i18n.json b/packages/rocketchat-i18n/i18n/pl.i18n.json index 87376bb1b234..30ef859e76a9 100644 --- a/packages/rocketchat-i18n/i18n/pl.i18n.json +++ b/packages/rocketchat-i18n/i18n/pl.i18n.json @@ -99,6 +99,7 @@ "Accounts_OAuth_Custom_Token_Path": "Ścieżka tokenu", "Accounts_OAuth_Custom_Token_Sent_Via": "Token wysyłany przez", "Accounts_OAuth_Custom_Username_Field": "Nazwa pola użytkownika", + "Accounts_OAuth_Custom_Email_Field": "Pole e-mail", "Accounts_OAuth_Custom_Name_Field": "Pole Nazwa", "Accounts_OAuth_Custom_Roles_Claim": "Nazwa pola Role / Grupy", "Accounts_OAuth_Custom_Merge_Roles": "Przenieś role z SSO", @@ -138,6 +139,7 @@ "Accounts_OAuth_Meteor_secret": "Meteor Sekret", "Accounts_OAuth_Nextcloud": "OAuth Włączone", "Accounts_OAuth_Nextcloud_callback_url": "URL powrotny Nextcloud", + "Accounts_OAuth_Nextcloud_id": "Nextcloud id", "Accounts_OAuth_Nextcloud_secret": "Client Sekret", "Accounts_OAuth_Nextcloud_URL": "URL serwera Nextcloud", "Accounts_OAuth_Proxy_host": "Host proxy", @@ -191,6 +193,7 @@ "Accounts_RegistrationForm_Secret_URL": "Sekretny adres URL", "Accounts_RegistrationForm_SecretURL": "Sekretny adres URL formularza rejestracyjnego", "Accounts_RegistrationForm_SecretURL_Description": "Musisz podać losowy ciąg znaków, który zostanie dodany do adresu URL rejestracji. Przykład: https://open.rocket.chat/register/[secret_hash]", + "Accounts_Registration_InviteUrlType_Direct": "Bezpośrednio", "Accounts_Registration_InviteUrlType_Proxy": "Proxy", "Accounts_RequireNameForSignUp": "Wymagaj podana nazwy podczas rejestracji", "Accounts_RequirePasswordConfirmation": "Wymagaj potwierdzenia hasła", @@ -200,16 +203,30 @@ "Accounts_Directory_DefaultView": "Domyślne listowanie katalogu", "Accounts_SetDefaultAvatar": "Ustaw domyślny Avatar", "Accounts_SetDefaultAvatar_Description": "Próbuje ustalić domyślny awatar na podstawie konta OAuth lub Gravatar", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "Ustaw e-maile zewnętrznych kont jako zweryfikowane", "Accounts_ShowFormLogin": "Pokaż domyślny formularz logowania", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "Włącz uwierzytelnienie dwuskładnikowe przez e-mail", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Nowi użytkownicy mają dwuskładnikowe urzierzytelnianie przez email domyślnie włączone. Mogą je wyłączyć na swojej stronie profilu.", + "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Czas wygaśnięcia kodu wysłanego przez email w sekundach", "Accounts_TwoFactorAuthentication_Enabled": "Włącz uwierzytelnianie dwuetapowe", + "Accounts_TwoFactorAuthentication_Enabled_Description": "Użytkownicy mogą ustawić swoje uwierzytelnianie dwuskładnikowe za pomocą dowolnej aplikacji TOTP, na przykład Google Authenticator albo Authy", "Accounts_TwoFactorAuthentication_MaxDelta": "Maksymalna Delta", "Accounts_UserAddedEmail_Default": "

Witamy w [Site_Name]

Przejdź do [Site_URL] i wypróbuj najlepsze rozwiązanie czatu open source dostępne już dziś!

Możesz zalogować się przy użyciu adresu e-mail: [email] i hasło: [hasło]. Może być konieczne, aby go zmienić po pierwszym logowaniu.", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "Maksymalna Delta określa, ile żetonów jest ważnych w danym momencie. Tokeny są generowane co 30 sekund i są ważne dla (30 * maksymalnej delty) sekund.
Przykład: Przy maksymalnej wartości delta ustawionej na 10, każdy token może być użyty do 300 sekund przed lub po sygnaturze czasowej. Jest to przydatne, gdy zegar klienta nie jest prawidłowo zsynchronizowany z serwerem.", + "Accounts_TwoFactorAuthentication_RememberFor": "Pamiętaj uwierzytelnianie dwuskładnikowe przez (sekundy)", + "Accounts_TwoFactorAuthentication_RememberFor_Description": "Nie wymagaj kodu uwierzytelnienia dwuskładnikowego jeżeli już zostało dostarczone przed podanym czasem", "Accounts_UseDefaultBlockedDomainsList": "Użyj domyślnej listy zablokowanych domen", "Accounts_UseDNSDomainCheck": "Użyj sprawdzania domeny DNS", "Accounts_UserAddedEmailSubject_Default": "Zostałeś dodany do [Site_Name]", "Accounts_UserAddedEmail_Description": "Możesz użyć następujących symboli zastępczych:

  • [name], [fname] [lname] dla odpowiednio pełnej nazwy użytkownika, imienia lub nazwiska.
  • [email] przez e-mail użytkownika.
  • [password] o hasło użytkownika.
  • [Site_Name] i [Site_URL] dla nazwy aplikacji i zawartości odpowiednio.
", "Activate": "Aktywuj", + "Active_users": "Aktywni użytkownicy", + "Daily_Active_Users": "Dziennie aktywni użytkownicy", + "Weekly_Active_Users": "Tygodniowo aktywni użytkownicy", + "Monthly_Active_Users": "Miesięcznie aktywni użytkownicy", + "DAU_value": "DAU __value__", + "WAU_value": "WAU __value__", + "MAU_value": "MAU __value__", "Activity": "Aktywność", "Add": "Dodaj", "add-oauth-service": "Dodaj usługę Oauth", @@ -232,6 +249,7 @@ "Add_user": "Dodaj użytkownika", "Add_User": "Dodaj użytkownika", "Add_users": "Dodaj użytkowników", + "Add_Reaction": "Dodaj reakcję", "Adding_OAuth_Services": "Dodawanie serwisu OAuth", "Adding_permission": "Dodawanie uprawnień", "Adding_user": "Dodawanie użytkownika", @@ -332,11 +350,14 @@ "API_Personal_Access_Tokens_Regenerate_It": "Odnów token", "API_Shield_Types": "Typy osłon", "API_Shield_Types_Description": "Typy ekranów, które można włączyć jako listę rozdzielaną przecinkami, wybierz z \"online\", \"kanał\" lub \"*\" dla wszystkich", + "API_Shield_user_require_auth": "Wymagaj uwierzytelnienia dla tarcz użytkowników", "API_Token": "API Token", "API_Tokenpass_URL": "Adres URL serwera Tokenpass", "API_Tokenpass_URL_Description": "Przykład: https://domena.com (bez ukośnego ukośnika)", "API_Upper_Count_Limit": "Maksymalna ilość rekordów", "API_Upper_Count_Limit_Description": "Jaka jest maksymalna liczba rekordów, które powinien zwrócić interfejs REST API (jeśli nie są nieograniczone)?", + "API_Use_REST_For_DDP_Calls": "Użyj REST zamiast websocketów dla wywołań metod Meteor", + "API_Use_REST_For_DDP_Calls_Alert": "To jest eksperymentalna i tymczasowa cecha. Wymusza dla klienta web i aplikacji mobilnej wykorzystywanie requestów REST zamiast websocketów przy wywołaniach metod Meteor", "API_User_Limit": "Limit użytkownika dotyczący dodawania wszystkich użytkowników do kanału", "API_Wordpress_URL": "WordPress URL", "Apiai_Key": "Klucz Api.ai", @@ -371,6 +392,9 @@ "Apps_Framework_Development_Mode": "Włącz tryb deweloperski", "Apps_Framework_Development_Mode_Description": "Tryb deweloperski pozwala na instalację Aplikacji nie pochodzących z Rocket.Chat Marketplace.", "Apps_Framework_enabled": "Włącz strukturę aplikacji", + "Apps_Game_Center": "Centrum gier", + "Apps_Game_Center_Back": "Wróć do centrum gier", + "Apps_Game_Center_enabled": "Włącz centrum gier", "Apps_Marketplace_Deactivate_App_Prompt": "Czy na pewno chcesz wyłączyć tę aplikację?", "Apps_Marketplace_Modify_App_Subscription": "Zmień subskrypcję", "Apps_Marketplace_Uninstall_App_Prompt": "Czy na pewno chcesz odinstalować tę aplikację?", @@ -420,7 +444,7 @@ "Author_Information": "Informacje o autorze", "Authorization_URL": "URL uwierzytelniania", "Authorize": "Autoryzuj", - "auto-translate": "Auto Translate", + "auto-translate": "Auto-Tłumacz", "auto-translate_description": "Zezwolenie na używanie narzędzia do automatycznego tłumaczenia", "Auto_Load_Images": "Automatyczne ładowanie zdjęć", "AutoLinker": "AutoLinker", @@ -538,7 +562,7 @@ "CAS_Sync_User_Data_Enabled": "Zawsze synchronizuj dane użytkownika", "CAS_Sync_User_Data_Enabled_Description": "Zawsze synchronizuj zewnętrzne dane użytkownika CAS do dostępnych atrybutów podczas logowania. Uwaga: mimo to atrybuty są zawsze synchronizowane po utworzeniu konta.", "CAS_Sync_User_Data_FieldMap": "mapa atrybutów", - "CAS_Sync_User_Data_FieldMap_Description": "Użyj tego wejścia JSON do budowania wewnętrznych atrybutów (klucza) z zewnętrznych atrybutów (wartość). Zewnętrzne nazwy atrybutów ujęte w '%' zostaną interpolowane w łańcuchach wartości.
Przykład: `{\" email \":\"% email% \",\" name \":\"% firstname%,% lastname% \"}`

Mapa atrybutów jest zawsze interpolowana. W CAS 1.0 dostępny jest tylko atrybut `username`. Dostępne atrybuty wewnętrzne to: nazwa użytkownika, nazwa, adres e-mail, pokoje; rooms to rozdzielona przecinkami lista pokoi do przyłączenia się po utworzeniu użytkownika, np .: {\"pokoje\": \"% team%,% department%\"} dołączą do użytkowników CAS przy tworzeniu ich kanału zespołu i działu.", + "CAS_Sync_User_Data_FieldMap_Description": "Użyj tego pola JSON do utworzenia wewnętrznych atrybutów (klucza) z zewnętrznych atrybutów (wartość). Zewnętrzne nazwy atrybutów ujęte w '%' zostaną interpolowane w pola tekstowe.
Przykład: `{\"email\":\"%email%\", \"name\":\"%firstname%, %lastname%\"}`

- mapa atrybutów jest zawsze interpolowana. W CAS 1.0 tylko atrybut `username` jest dostępny. Dostępne atrybuty wewnętrzne to: nazwa użytkownika, nazwa, adres e-mail, pokoje; rooms to rozdzielona przecinkami lista pokoi do przyłączenia się po utworzeniu użytkownika, np .: {\"rooms\": \"%team%,%department%\"} dołączą do użytkowników CAS przy tworzeniu ich kanału zespołu i działu.", "CAS_trust_username": "Zaufaj nazwie użytkownika CAS", "CAS_version": "Wersja CAS", "CAS_version_Description": "Używaj tylko obsługiwanej wersji CAS obsługiwanej przez usługę CAS SSO.", @@ -596,13 +620,13 @@ "Chatpal_go_to_message": "Skok", "Chatpal_go_to_room": "Skok", "Chatpal_go_to_user": "Wyślij bezpośrednią wiadomość", - "Chatpal_HTTP_Headers": "Http Headers", + "Chatpal_HTTP_Headers": "Nagłówki http", "Chatpal_HTTP_Headers_Description": "Lista nagłówków HTTP, jeden nagłówek na linię. Format: nazwa: wartość", "Chatpal_Main_Language": "Główny język", "Chatpal_Main_Language_Description": "Język używany najczęściej w rozmowach", "Chatpal_Messages": "Wiadomości", "Chatpal_Messages_Only": "Wiadomości", - "Chatpal_More": "Jeszcze", + "Chatpal_More": "Więcej", "Chatpal_No_Results": "Brak wyników", "Chatpal_no_search_results": "Brak wyników", "Chatpal_one_search_result": "Znaleziono 1 wynik", @@ -1016,7 +1040,7 @@ "Custom_Sounds": "Niestandardowe dźwięki", "Custom_Translations": "Własne tłumaczenia", "Custom_Translations_Description": "Powinien to być prawidłowy JSON, w którym klucze są językami zawierającymi słownik klucza i tłumaczenia. Przykład:
{\n\"en\": {\n\"Kanały\": \"Pokoje\"\n},\n\"pt\": {\n\"Kanały\": \"Salas\"\n}\n}", - "Custom_User_Status": "Własny statuy użytkowników", + "Custom_User_Status": "Niestandardowe statusy użytkowników", "Custom_User_Status_Add": "Dodaj własny status użytkownika", "Custom_User_Status_Added_Successfully": "Własny status użytkownika pomyślnie dodany", "Custom_User_Status_Delete_Warning": "Usunięcie własnego statusu użytkownika nie może zostać cofnięte.", @@ -1574,6 +1598,7 @@ "if_they_are_from": "(jeśli są z %s)", "If_this_email_is_registered": "Jeśli ten e-mail jest zarejestrowany, wyślemy instrukcje dotyczące resetowania hasła. Jeśli wkrótce nie otrzymasz e-maila, wróć i spróbuj ponownie.", "If_you_are_sure_type_in_your_password": "Jeżeli jesteś pewien, wpisz swoje hasło:", + "Members_List": "Lista użytkowników", "If_you_are_sure_type_in_your_username": "Jeżeli jesteś pewien, wpisz swoją nazwę użytkownika:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Jeśli nie masz, wyślij wiadomość e-mail na adres [omni@rocket.chat] (mailto: omni@rocket.chat), aby otrzymać swoją.", "If_you_didnt_ask_for_reset_ignore_this_email": "Jeśli nie prosiłeś o zresetowanie hasła, możesz zignorować tego e-maila.", @@ -1995,6 +2020,7 @@ "Mail_Message_No_messages_selected_select_all": "Nie wybrałeś żadnych wiadomości.", "Mail_Messages": "Wysyłanie wiadomości przez email", "Mail_Messages_Instructions": "Wybierz wiadomości, które chcesz wysłać za pośrednictwem poczty elektronicznej za pomocą kliknięcia", + "Room_uploaded_file_list": "Lista plików", "Mail_Messages_Subject": "Oto wybrana część wiadomości %s", "Mailer": "Wyślij email użytkownikom", "Mailer_body_tags": "Musisz użyć znacznika [unsubscribe] aby zawrzeć w treści odnośnik do rezygnacji z subskrypcji.
Możesz użyć znaczników [name], [fname], [lname] by wstawić odpowiednio pełną nazwę użytkownika, jego imię, nazwisko.
Możesz użyć znacznika [email] by wstawić adres email użytkownika.", @@ -2047,7 +2073,6 @@ "Maximum": "Maksimum", "Media": "Głoska bezdźwięczna", "Medium": "Średni", - "Members_List": "Lista użytkowników", "mention-all": "Wymień wszystko", "mention-all_description": "Zezwolenie na użycie wzmianki @all", "mention-here": "Wspomnij tutaj", @@ -2099,6 +2124,9 @@ "Message_HideType_ru": "Ukryj wiadomości \"usunięte przez użytkownika\"", "Message_HideType_uj": "Ukryj wiadomości \"Dołącz do użytkownika\"", "Message_HideType_ul": "Ukryj wiadomości \"zostawiaj użytkownika\"", + "Message_HideType_r": "Ukryj wiadomości \"Room Name Changed\"", + "Message_HideType_room_archived": "Ukryj wiadomości \"Room Archived\"", + "Message_HideType_room_unarchived": "Ukryj wiadomości \"Room Unarchived\"", "Message_Id": "ID wiadomości", "Message_Ignored": "Ta wiadomość została zignorowana", "Message_info": "Informacje o wiadomości", @@ -2245,6 +2273,7 @@ "Not_authorized": "Brak autoryzacji", "Not_Available": "Niedostępne", "Not_found_or_not_allowed": "Nie znaleziono lub niedozwolone", + "Not_following": "Nie śledź", "Not_started": "Nie rozpoczęte", "Nothing": "Nic", "Nothing_found": "Nic nie znaleziono", @@ -2341,6 +2370,7 @@ "Parent_channel_doesnt_exist": "Channel nie istnieje.", "Password": "Hasło", "Password_Change_Disabled": "Administrator czatu wyłączył możliwość zmiany haseł", + "Password_Changed_Description": "Możesz użyć następujących symboli zastępczych:
  • [hasło] dla tymczasowego hasła.
  • [nazwa][fname], [lname] dla odpowiednio pełnej nazwy użytkownika, imienia lub nazwiska
  • [email] dla e-maila
  • [Nazwa witryny] i [Site_URL] dla nazwy aplikacji i adresu URL
", "Password_changed_successfully": "Hasło zostało zmienione", "Password_Policy": "Zasady haseł", "Past_Chats": "Wcześniejsze czaty", @@ -2615,7 +2645,6 @@ "Room_type_changed_successfully": "Typ pokoju pomyślnie zmieniony", "Room_type_of_default_rooms_cant_be_changed": "Jest to domyślny pokój, którego typu nie można zmienić. Skontaktuj się z administratorem.", "Room_unarchived": "Pokój przywrócony", - "Room_uploaded_file_list": "Lista plików", "Room_uploaded_file_list_empty": "Brak dostępnych plików", "Rooms": "Pokoje", "Routing": "Routing", @@ -3049,6 +3078,7 @@ "Trigger_Words": "Słowa wyzwalające", "Triggers": "Wyzwalacze", "True": "Tak", + "Troubleshoot_Disable_Notifications": "Wyłącz powiadomienia", "Tuesday": "Wtorek", "Turn_OFF": "Wyłączyć", "Turn_ON": "Włączyć", @@ -3113,6 +3143,7 @@ "Uptime": "Czas pracy", "URL": "URL", "URL_room_prefix": "Prefiks pokoju URL", + "Use_Room_configuration": "Nadpisuje konfigurację serwera i korzysta z konfiguracji pomieszczenia", "Use_account_preference": "Użyj preferencji konta", "Use_Emojis": "Użyj Emoji", "Use_Global_Settings": "Użyj globalnych ustawień", diff --git a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json index f51d1e4c576d..22ed0b99fea2 100644 --- a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -92,12 +92,16 @@ "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "Token de identidade enviado via", "Accounts_OAuth_Custom_Login_Style": "Estilo de Login", "Accounts_OAuth_Custom_Merge_Users": "Mesclar usuários", + "Accounts_OAuth_Custom_Access_Token_Param": "Nome do parâmetro para token de acesso", "Accounts_OAuth_Custom_Scope": "Escopo", "Accounts_OAuth_Custom_Secret": "Secreto", + "Accounts_OAuth_Custom_Show_Button_On_Login_Page": "Mostrar botão na página de autenticação", "Accounts_OAuth_Custom_Token_Path": "Path do Token", "Accounts_OAuth_Custom_Token_Sent_Via": "Token Enviado Por", "Accounts_OAuth_Custom_Username_Field": "Campo Nome de usuário", + "Accounts_OAuth_Custom_Name_Field": "Campo de nome", "Accounts_OAuth_Custom_Roles_Claim": "Nome do campo de funções / grupos", + "Accounts_OAuth_Custom_Merge_Roles": "Mesclar papéis do SSO", "Accounts_OAuth_Drupal": "Login do Drupal habilitado", "Accounts_OAuth_Drupal_callback_url": "Drupal oAuth2 Redirect URI", "Accounts_OAuth_Drupal_id": "Id. do cliente do Drupal oAuth2", @@ -118,6 +122,7 @@ "Accounts_OAuth_Gitlab_callback_url": "URL de Callback do GitLab", "Accounts_OAuth_Gitlab_id": "ID do GitLab", "Accounts_OAuth_Gitlab_identity_path": "Caminho de Identidade", + "Accounts_OAuth_Gitlab_merge_users": "Mesclar usuários", "Accounts_OAuth_Gitlab_secret": "Secret do cliente", "Accounts_OAuth_Google": "Login do Google", "Accounts_OAuth_Google_callback_url": "URL de Callback do Google", @@ -132,7 +137,10 @@ "Accounts_OAuth_Meteor_id": "ID do Meteor", "Accounts_OAuth_Meteor_secret": "Secret do Meteor", "Accounts_OAuth_Nextcloud": "OAuth Habilitado", + "Accounts_OAuth_Nextcloud_callback_url": "URL de retorno de chamada do Nextcloud", + "Accounts_OAuth_Nextcloud_id": "ID do Nextcloud", "Accounts_OAuth_Nextcloud_secret": "Secret do cliente", + "Accounts_OAuth_Nextcloud_URL": "URL do servidor Nextcloud", "Accounts_OAuth_Proxy_host": "Proxy Host", "Accounts_OAuth_Proxy_services": "Serviços Proxy", "Accounts_OAuth_Tokenpass": "Login do Tokenpass", @@ -195,6 +203,8 @@ "Accounts_Directory_DefaultView": "Lista de diretório padrão", "Accounts_SetDefaultAvatar": "Definir Avatar Padrão", "Accounts_SetDefaultAvatar_Description": "Tenta determinar o avatar padrão com base em OAuth Account ou Gravatar", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "Definir o email das contas externas como verificado", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "Contas criadas por serviços externos, tais como LDAP, OAth, etc, terão o email verificado automaticamente", "Accounts_ShowFormLogin": "Mostrar formulário de login padrão", "Accounts_TwoFactorAuthentication_By_Email_Enabled": "Ativar autenticação de dois fatores por Email", "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Usuários com email verificado e com a opção habilitada em seu perfil receberão um email com um código temporário para autorizar certas ações como o login, salvar o perfil, etc.", @@ -250,6 +260,7 @@ "Advocacy": "Apoio dado", "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "Após a autenticação OAuth2, os usuários serão redirecionados para esta URL", "Agent": "Agente", + "Agent_Info": "Informações do Agente", "Agents": "Agentes", "Agent_added": "Agente adicionado", "Agent_removed": "Agente removido", @@ -312,6 +323,7 @@ "API_Enable_CORS": "Ativar CORS", "API_Enable_Direct_Message_History_EndPoint": "Habilitar o histórico do histórico de mensagens diretas", "API_Enable_Direct_Message_History_EndPoint_Description": "Isso permite o `/ api / v1 / im.history.others` que permite a visualização de mensagens diretas enviadas por outros usuários que o chamador não faz parte.", + "API_Enable_Rate_Limiter": "Ativar limitador de taxa", "API_Enable_Rate_Limiter_Dev": "Ativar limitador de taxa em desenvolvimento", "API_Enable_Rate_Limiter_Dev_Description": "Deve limitar a quantidade de chamadas para os endpoints no ambiente de desenvolvimento?", "API_Enable_Rate_Limiter_Limit_Calls_Default": "Número padrão de chamadas para o limitador de taxa", @@ -354,6 +366,7 @@ "App_status_disabled": "Desativado", "App_status_error_disabled": "Desativado: erro não detectado", "App_status_initialized": "Inicializado", + "App_status_invalid_license_disabled": "Desativado: Licença Inválida", "App_status_invalid_settings_disabled": "Desativado: configuração necessária", "App_status_manually_disabled": "Desativado: manualmente", "App_status_manually_enabled": "Habilitado", @@ -361,6 +374,7 @@ "App_support_url": "url de suporte", "App_Url_to_Install_From": "Install from URL", "App_Url_to_Install_From_File": "Instalar a partir de arquivo", + "App_user_not_allowed_to_login": "Os usuários de aplicativo não têm permissão para se autenticar diretamente.", "Appearance": "Aparência", "Application_added": "Aplicação adicionada", "Application_Name": "Nome da Aplicação", @@ -370,10 +384,22 @@ "Apps": "Apps", "Apps_Engine_Version": "Versão da Apps Engine", "Apps_Framework_Development_Mode": "Habilitar modo de desenvolvimento", + "Apps_Framework_Development_Mode_Description": "O modo de desenvolvimento permite a instalação de aplicativos que não são do Marketplace do Rocket.Chat.", "Apps_Framework_enabled": "Ativar o App Framework", "Apps_Game_Center": "Game Center", + "Apps_Game_Center_Back": "Voltar ao Game Center", "Apps_Game_Center_enabled": "Habilitar Game Center", + "Apps_Marketplace_Deactivate_App_Prompt": "Você quer mesmo desativar este aplicativo?", + "Apps_Marketplace_Modify_App_Subscription": "Modificar a Subscrição", + "Apps_Marketplace_Uninstall_App_Prompt": "Você quer mesmo desinstalar este aplicativo?", + "Apps_Marketplace_Uninstall_Subscribed_App_Anyway": "Desinstalar mesmo assim", + "Apps_Marketplace_Login_Required_Title": "Login do Marketplace Obrigatório", + "Apps_Marketplace_pricingPlan_monthly": "preço/mês", + "Apps_Marketplace_pricingPlan_monthly_perUser": "preço/mês por usuário", + "Apps_Marketplace_pricingPlan_yearly": "preço/ano", + "Apps_Marketplace_pricingPlan_yearly_perUser": "preço/ano por usuário", "Apps_Settings": "Configurações da aplicação", + "Apps_User_Already_Exists": "O nome de usuário \"__username__\" já está em uso. Escolha outro nome de usuário ou remova o usuário com este nome para instalar o aplicativo.", "Apps_WhatIsIt": "Apps: o que são eles?", "Apps_WhatIsIt_paragraph1": "Um novo ícone na área de administração! O que significa e quais são as aplicações?", "Apps_WhatIsIt_paragraph2": "Em primeiro lugar, Apps neste contexto não se referem às aplicações para dispositivos móveis. Na verdade, seria melhor pensar nelas em termos de plugins ou integrações avançadas.", @@ -432,8 +458,12 @@ "Auto_Translate": "Traduzir automaticamente", "AutoTranslate_APIKey": "Key API", "AutoTranslate_Change_Language_Description": "Alterar o idioma de auto-tradução não traduz mensagens anteriores.", + "AutoTranslate_DeepL": "DeepL", "AutoTranslate_Enabled": "Habilitar Auto-Translate", "AutoTranslate_Enabled_Description": "Habilitar a auto-tradução implicará em permitir às pessoas com a permissão auto-translate que tenham todas as suas mensagens automaticamente traduzidas para seu idioma. Taxas podem ser cobradas, veja a Documentação do Google", + "AutoTranslate_Google": "Google", + "AutoTranslate_Microsoft": "Microsoft", + "AutoTranslate_ServiceProvider": "Provedor de serviço", "Available": "Disponível", "Available_agents": "Agentes disponíveis", "Avatar": "Avatar", @@ -467,6 +497,7 @@ "ban-user": "Usuário de Ban", "ban-user_description": "Permissão para proibir um usuário de um canal", "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "Funcionalidade Beta! Depende que Vídeo Conferência esteja habilitado", + "Better": "Melhor", "Best_first_response_time": "Melhor primeiro tempo de resposta", "Block_User": "Bloquear usuário", "Blockchain": "Blockchain", @@ -489,6 +520,8 @@ "Broadcasting_enabled": "Broadcasting Habilitado", "Broadcasting_media_server_url": "URL do servidor de mídia Broadcasting", "Browse_Files": "Procurar arquivos", + "Browser_does_not_support_audio_element": "O seu navegador não é compatível com o elemento de áudio", + "Browser_does_not_support_video_element": "O seu navegador não é compatível com o elemento de vídeo", "Bugsnag_api_key": "Chave da API Bugsnag", "Build_Environment": "Construir ambiente", "bulk-register-user": "Bulk Criar canais", @@ -552,6 +585,7 @@ "Channels_list": "Lista de canais públicos", "Chat_button": "Botão do chat", "Chat_closed": "Chat encerrado", + "Chat_closed_by_agent": "Chat encerrado pelo agente", "Chat_closed_successfully": "Chat encerrado com sucesso", "Chat_Now": "Converse agora", "Chat_window": "Janela de chat", @@ -605,6 +639,7 @@ "Chatpal_Welcome": "Aproveite sua busca!", "Chatpal_Window_Size": "Tamanho da janela do índice", "Chatpal_Window_Size_Description": "O tamanho das janelas de índice em horas (no bootstrapping)", + "Check_Progress": "Verifique o progresso", "Choose_a_room": "Escolha uma sala", "Choose_messages": "Escolha mensagens", "Choose_the_alias_that_will_appear_before_the_username_in_messages": "Escolha o alias que aparecerá antes do nome de usuário nas mensagens.", @@ -623,6 +658,7 @@ "Click_here_to_view_and_copy_your_password": "Clique aqui para ver e copiar sua senha.", "Click_the_messages_you_would_like_to_send_by_email": "Clique nas mensagens que você gostaria de enviar por e-mail", "Click_to_join": "Clique para se juntar!", + "Click_to_load": "Clique para carregar", "Client_ID": "ID do Cliente", "Client_Secret": "Segredo do Cliente", "Clients_will_refresh_in_a_few_seconds": "Os clientes irão atualizar em poucos segundos", @@ -634,14 +670,20 @@ "close-others-livechat-room": "Sala de Omnichannel fechada", "Cloud_workspace_connected_without_account": "Seu workspace está agora conectado ao Rocket.Chat Cloud. Se desejar, você pode fazer o login no Rocket.Chat Cloud e associar seu workspace à sua conta do Cloud.", "close-others-livechat-room_description": "Permissão para fechar outras salas de Omnichannel", + "Close_room_description" : "Você está prestes a fechar este bate-papo. Você tem certeza que quer continuar?", "Closed": "Fechado", "Closed_At": "Encerrado em", "Closed_by_visitor": "Encerrado pelo visitante", "Closing_chat": "Encerrando chat", "Cloud": "Nuvem", + "Cloud_Register_manually": "Registre manualmente", + "Cloud_register_success": "A sua área de trabalho foi registrada com sucesso!", + "Cloud_register_error": "Houve um erro ao processar sua solicitação. Por favor tente novamente mais tarde. ", "Cloud_connect": "Rocket.Chat Cloud Connect", + "Cloud_connect_support": "Se você ainda não recebeu um e-mail de registro, verifique se o seu e-mail está atualizado acima. Se você ainda tiver problemas, entre em contato com o suporte em", "Cloud_what_is_it": "O que é isso?", "Cloud_what_is_it_description": "O Rocket.Chat Cloud Connect permite que você conecte seu workspace Rocket.Chat auto-hospedado à nossa nuvem. Fazer isso permite que você gerencie suas licenças, Faturamento e Suporte no Rocket.Chat Cloud.", + "Cloud_what_is_it_services_like": "Serviços como:", "Cloud_login_to_cloud": "Login do o Rocket.Chat Cloud", "Cloud_address_to_send_registration_to": "Endereço para enviar seu e-mail de registro na Cloud.", "Cloud_update_email": "Atualizar email", @@ -1566,6 +1608,7 @@ "if_they_are_from": "(se eles são de %s)", "If_this_email_is_registered": "Se este e-mail estiver cadastrado, enviaremos instruções sobre como redefinir sua senha. Se você não receber um e-mail em breve, volte e tente novamente.", "If_you_are_sure_type_in_your_password": "Se você tem certeza, digite sua senha:", + "Members_List": "Lista de Membros", "If_you_are_sure_type_in_your_username": "Se você tem certeza, digite seu nome de usuário:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Se você não tiver um, envie um e-mail para [omni@rocket.chat] (mailto: omni@rocket.chat) para obter o seu.", "If_you_didnt_ask_for_reset_ignore_this_email": "Se você não solicitou a redefinição de sua senha, ignore este e-mail.", @@ -1899,6 +1942,7 @@ "leave-c": "Deixar canais", "leave-p": "Deixar grupos privados", "Leave": "Sair", + "Leave_a_comment": "Deixe um comentário", "Leave_Group_Warning": "Tem certeza de que quer sair do grupo \"%s\"?", "Leave_Livechat_Warning": "Tem certeza de que deseja deixar o chat com \"%s\"?", "Leave_Private_Warning": "Tem certeza de que quer sair da conversa com \"%s\"?", @@ -1937,7 +1981,9 @@ "Livechat_title_color": "Cor de fundo do título do Livechat", "Livechat_transcript_sent": "Transcrição de Omnichannel enviada", "Livechat_transfer_to_agent": "__from__ transferiu a conversa para __to__", + "Livechat_transfer_to_agent_with_a_comment": "__from__ transferiu a conversa para __to__ com um comentário: __comment__", "Livechat_transfer_to_department": "__from__ transferiu a conversa para o departamento __to__", + "Livechat_transfer_to_department_with_a_comment": "__from__ transferiu a conversa para o departamento __to__ com um comentário: __comment__", "Livechat_transfer_return_to_the_queue": "__from__ retornou a conversa para a fila", "Livechat_Triggers": "Gatilhos de Livechat", "Livechat_Users": "Usuários Omnichannel", @@ -1989,6 +2035,7 @@ "Mail_Message_No_messages_selected_select_all": "Você não selecionou nenhuma mensagem", "Mail_Messages": "Mensagens de E-mail", "Mail_Messages_Instructions": "Escolher as mensagens que deseja enviar via e-mail, clicando nas mensagens", + "Room_uploaded_file_list": "Lista de arquivos", "Mail_Messages_Subject": "Aqui está uma parte selecionada de %s mensagens", "Mailer": "Mailer", "Mailer_body_tags": "Você deve usar [unsubscribe] como link para desinscrever-se.
Você pode usar [name], [fname], [lname] para utilizar o nome completo, primeiro nome ou último nome, respectivamente.
Você pode usar [email] para o email do usuário.", @@ -2619,7 +2666,6 @@ "Room_type_changed_successfully": "Tipo de sala alterado com sucesso", "Room_type_of_default_rooms_cant_be_changed": "Esta é uma sala padrão e o tipo não pode ser alterado, consulte o seu administrador.", "Room_unarchived": "Sala desarquivada", - "Room_uploaded_file_list": "Lista de arquivos", "Room_uploaded_file_list_empty": "Nenhum arquivo disponível", "Rooms": "Salas", "Routing": "Roteamento", @@ -3034,6 +3080,7 @@ "Trigger_Words": "Palavras Gatilho", "Triggers": "Gatilhos", "True": "Sim", + "Troubleshoot_Disable_Notifications": "Desativar as notificações", "Tuesday": "terça", "Turn_OFF": "Desligar", "Turn_ON": "Ligar", @@ -3369,4 +3416,4 @@ "Your_question": "A sua pergunta", "Your_server_link": "O link do seu servidor", "Your_workspace_is_ready": "O seu espaço de trabalho está pronto a usar 🎉" -} +} \ No newline at end of file diff --git a/packages/rocketchat-i18n/i18n/pt.i18n.json b/packages/rocketchat-i18n/i18n/pt.i18n.json index 6cbc7aee7b23..1dd71c48a532 100644 --- a/packages/rocketchat-i18n/i18n/pt.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt.i18n.json @@ -1533,6 +1533,7 @@ "if_they_are_from": "(se eles são de %s)", "If_this_email_is_registered": "Se este e-mail estiver cadastrado, vamos enviar instruções de como pode redefinir a sua senha. Se não receber um e-mail em breve, volte e tente novamente.", "If_you_are_sure_type_in_your_password": "Se tem certeza, digite sua senha:", + "Members_List": "Lista de Membros", "If_you_are_sure_type_in_your_username": "Se tem certeza, digite seu nome de utilizador:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Se não tiver um, envie um e-mail para [omni@rocket.chat] (mailto: omni@rocket.chat) para obter o seu.", "If_you_didnt_ask_for_reset_ignore_this_email": "Se você não solicitou a redefinição de sua senha, ignore este e-mail.", @@ -1943,6 +1944,7 @@ "Mail_Message_No_messages_selected_select_all": "Não selecionou nenhuma mensagem", "Mail_Messages": "Mensagens de E-mail", "Mail_Messages_Instructions": "Escolher as mensagens que deseja enviar via e-mail, clicando nas mensagens", + "Room_uploaded_file_list": "Lista de ficheiros", "Mail_Messages_Subject": "Aqui está uma parte seleccionada de %s mensagens", "Mailer": "Mailer", "Mailer_body_tags": "Deve usar [unsubscribe] como link para cancelar a subscrição.
Pode usar [name], [fname], [lname] para utilizar o nome completo, primeiro nome ou último nome, respectivamente.
Pode usar [email] para o email do utilizador.", @@ -1987,7 +1989,6 @@ "Max_length_is": "O comprimento máximo é %s", "Media": "Média", "Medium": "Médio", - "Members_List": "Lista de Membros", "mention-all": "Mencionar todos", "mention-all_description": "Permissão para usar a menção @todos", "mention-here": "Mencionar aqui", @@ -2534,7 +2535,6 @@ "Room_type_changed_successfully": "Tipo de sala alterado com sucesso", "Room_type_of_default_rooms_cant_be_changed": "Esta é uma sala padrão e o tipo não pode ser alterado, consulte o seu administrador.", "Room_unarchived": "Sala desarquivada", - "Room_uploaded_file_list": "Lista de ficheiros", "Room_uploaded_file_list_empty": "Nenhum ficheiro disponível", "Rooms": "Salas", "Routing": "Roteamento", @@ -2935,6 +2935,7 @@ "Trigger_Words": "Palavras Gatilho", "Triggers": "Gatilhos", "True": "Verdade", + "Troubleshoot_Disable_Notifications": "Desactivar notificações", "Tuesday": "Terça-feira", "Turn_OFF": "Desligar", "Turn_ON": "Ligar", diff --git a/packages/rocketchat-i18n/i18n/ro.i18n.json b/packages/rocketchat-i18n/i18n/ro.i18n.json index 47c64f2b4fa1..302daa372c8b 100644 --- a/packages/rocketchat-i18n/i18n/ro.i18n.json +++ b/packages/rocketchat-i18n/i18n/ro.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(dacă sunt din %s)", "If_this_email_is_registered": "Dacă acest e-mail este înregistrat, vă vom trimite instrucțiuni despre resetarea parolei. Dacă în scurt timp nu primiți un e-mail, reveniți și încercați din nou.", "If_you_are_sure_type_in_your_password": "Dacă sunteți sigur că tipul în parola:", + "Members_List": "Lista de membri", "If_you_are_sure_type_in_your_username": "Dacă sunteți sigur că tipul numele de utilizator:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Dacă nu aveți niciunul, trimiteți un e-mail la [omni@rocket.chat] (mailto: omni@rocket.chat) pentru a obține a ta.", "Iframe_Integration": "Integrarea în cazul ramei", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Nu ați selectat niciun mesaj", "Mail_Messages": "Mesaje Email", "Mail_Messages_Instructions": "Alegeți ce mesaje doriți să trimiteți prin e-mail făcând clic pe ele", + "Room_uploaded_file_list": "Lista de fișiere", "Mail_Messages_Subject": "Iată o parte din %s mesaje", "Mailer": "Mailer", "Mailer_body_tags": "Trebuie să folosiți [unsubscribe] pentru link-ul de unsuscribe.
Puteți utiliza [name], [fname], [lname] pentru numele întreg, prenume respectiv nume.
Puteți folosi [email] pentru e-mailul utilizatorului.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Lungimea maximă este%s", "Media": "Mass-media", "Medium": "Mediu", - "Members_List": "Lista de membri", "mention-all": "Menționați pe toate", "mention-all_description": "Permisiunea de a utiliza mențiunea @all", "mention-here": "Menționați aici", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Tipul de cameră a fost schimbat cu succes", "Room_type_of_default_rooms_cant_be_changed": "Aceasta este o cameră implicită și tipul nu poate fi modificat, consultați administratorul dvs.", "Room_unarchived": "Cameră dezarhivată", - "Room_uploaded_file_list": "Lista de fișiere", "Room_uploaded_file_list_empty": "Niciun fișier disponibil.", "Rooms": "Camere", "run-import": "Rulați importul", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Cuvinte de declanșare", "Triggers": "Declanșatori", "True": "Adevărat", + "Troubleshoot_Disable_Notifications": "Dezactivați notificările", "Tuesday": "Marți", "Turn_OFF": "Opriți", "Turn_ON": "Aprinde", diff --git a/packages/rocketchat-i18n/i18n/ru.i18n.json b/packages/rocketchat-i18n/i18n/ru.i18n.json index 6e373f222c31..d4c4d8779ef6 100644 --- a/packages/rocketchat-i18n/i18n/ru.i18n.json +++ b/packages/rocketchat-i18n/i18n/ru.i18n.json @@ -1628,6 +1628,7 @@ "if_they_are_from": "(если они из %s)", "If_this_email_is_registered": "Если этот адрес электронной почты зарегистрирован, мы отправим на него инструкцию по сбросу пароля. Если вы не получили электронное сообщение, попробуйте снова позже.", "If_you_are_sure_type_in_your_password": "Если вы уверены, введите пароль:", + "Members_List": "Пользователи", "If_you_are_sure_type_in_your_username": "Если вы уверены, введите ваш логин:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Если у вас нет одного, отправьте электронное сообщение на адрес [omni@rocket.chat] (mailto: omni@rocket.chat), чтобы получить свой.", "If_you_didnt_ask_for_reset_ignore_this_email": "Если вы не просили сбросить пароль, вы можете проигнорировать это письмо.", @@ -2085,6 +2086,7 @@ "Mail_Message_No_messages_selected_select_all": "Вы не выбрали ни одного сообщения. ", "Mail_Messages": "Почтовые сообщения", "Mail_Messages_Instructions": "Нажимая на сообщения, выберите, какие из них вы хотите отправить по электронной почте", + "Room_uploaded_file_list": "Список файлов канала", "Mail_Messages_Subject": "Это выделенная часть из %s сообщений", "Mailer": "Отправка почты", "Mailer_body_tags": "Вам необходимо использовать [unsubscribe] как ссылку для отписки.
Вы можете использовать [name], [fname] и [lname] в качестве полного имени пользователя, имени или фамилии.
Вы можете использовать [email] для адреса электронной почты пользователя.", @@ -2151,7 +2153,6 @@ "Maximum": "Максимум", "Media": "СМИ", "Medium": "Обычный", - "Members_List": "Пользователи", "mention-all": "Упоминать всех", "mention-all_description": "Разрешение на использование упоминания @all", "mention-here": "Упоминание Here", @@ -2389,7 +2390,7 @@ "Num_Agents": "# Представители", "Number_of_events": "Количество событий", "Number_of_federated_users": "Количество федеративных пользователей", - "Number_of_federated_servers": "Количество федеративных пользователей", + "Number_of_federated_servers": "Количество федеративных серверов", "Number_of_messages": "Количество сообщений", "OAuth Apps": "Приложения OAuth", "OAuth_Application": "Приложение OAuth", @@ -2755,7 +2756,6 @@ "Room_type_changed_successfully": "Тип комнаты успешно изменён", "Room_type_of_default_rooms_cant_be_changed": "Эта комната является комнатой по умолчанию и её тип не может быть изменён. Пожалуйста, обратитесь к вашему администратору.", "Room_unarchived": "Комната разархивирована", - "Room_uploaded_file_list": "Список файлов канала", "Room_uploaded_file_list_empty": "Нет доступных файлов", "Rooms": "Комнаты", "Routing": "Маршрутизация", @@ -3213,6 +3213,7 @@ "Trigger_Words": "Слова-триггеры", "Triggers": "Триггеры", "True": "Да", + "Troubleshoot_Disable_Notifications": "Отключить уведомления", "Tuesday": "Вторник", "Turn_OFF": "Выключить", "Turn_ON": "Включить", diff --git a/packages/rocketchat-i18n/i18n/sk-SK.i18n.json b/packages/rocketchat-i18n/i18n/sk-SK.i18n.json index 4948c957e347..cb79f7bcb9c5 100644 --- a/packages/rocketchat-i18n/i18n/sk-SK.i18n.json +++ b/packages/rocketchat-i18n/i18n/sk-SK.i18n.json @@ -3,7 +3,9 @@ "500": "Interná chyba servera", "#channel": "#kanál", "0_Errors_Only": "0 - Len chyby", + "12_Hour": "12 hodinový formát času", "1_Errors_and_Information": "1 - Chyby a informácie", + "24_Hour": "24 hodinový formát času", "2_Erros_Information_and_Debug": "2 - Chyby, informácie a ladenie", "@username": "@používateľ", "@username_message": "@používateľ ", @@ -1297,6 +1299,7 @@ "if_they_are_from": "(ak sú z %s)", "If_this_email_is_registered": "Ak je tento e-mail zaregistrovaný, pošleme pokyny na obnovenie hesla. Ak v krátkom čase nedostanete e-mail, vráťte sa a skúste to znova.", "If_you_are_sure_type_in_your_password": "Ak ste si istí, zadajte heslo:", + "Members_List": "Zoznam členov", "If_you_are_sure_type_in_your_username": "Ak ste si istí, napíšte svoje používateľské meno:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Ak nemáte jeden, pošlite e-mail na adresu [omni@rocket.chat] (mailto: omni@rocket.chat), aby ste dostali svoje.", "Iframe_Integration": "Integrácia medzi rámcami", @@ -1669,6 +1672,7 @@ "Mail_Message_No_messages_selected_select_all": "Nevybrali ste žiadne správy", "Mail_Messages": "Poštové správy", "Mail_Messages_Instructions": "Vyberte, ktoré správy chcete odoslať e-mailom kliknutím na správy", + "Room_uploaded_file_list": "Zoznam súborov", "Mail_Messages_Subject": "Tu je vybratá časť správ%s", "Mailer": "Mailer", "Mailer_body_tags": "Je nutné použiť [unsubscribe] pre vloženie odkazu na odhlásenie.
Môžete tiež použiť [name], [fname], [lname] pre používateľské meno, krstné meno a priezvisko.
Môžete použiť [email] pre e-mail používateľa.", @@ -1710,7 +1714,6 @@ "Max_length_is": "Maximálna dĺžka je%s", "Media": "Media", "Medium": "stredná", - "Members_List": "Zoznam členov", "mention-all": "Zmieniť všetko", "mention-all_description": "Povolenie používať @ všetku zmienku", "mention-here": "Zmiente sa tu", @@ -2202,7 +2205,6 @@ "Room_type_changed_successfully": "Typ izby sa úspešne zmenil", "Room_type_of_default_rooms_cant_be_changed": "Toto je predvolená miestnosť a typ sa nedá zmeniť, prosím, kontaktujte správcu.", "Room_unarchived": "Izba nevybavená", - "Room_uploaded_file_list": "Zoznam súborov", "Room_uploaded_file_list_empty": "Nie sú k dispozícii žiadne súbory.", "Rooms": "izby", "run-import": "Spustite Import", @@ -2557,6 +2559,7 @@ "Trigger_Words": "Spúšťacie slová", "Triggers": "Triggers", "True": "pravdivý", + "Troubleshoot_Disable_Notifications": "Vypnutie upozornení", "Tuesday": "utorok", "Turn_OFF": "Vypnúť", "Turn_ON": "Zapnúť", @@ -2618,7 +2621,7 @@ "Use_initials_avatar": "Použite svoje iniciály používateľského mena", "Use_minor_colors": "Použite menšiu farebnú paletu (predvolené hodnoty zdedia hlavné farby)", "Use_service_avatar": "Použite%s avatar", - "Verification_Email": "Kliknutím na tlačidlo tuoverte svoj účet.", + "Verification_Email": "Kliknite sem pre potvrdenie svojho účtu.", "Use_this_username": "Použite toto používateľské meno", "Use_uploaded_avatar": "Použiť odovzdaný avatar", "Use_url_for_avatar": "Použite adresu URL pre avatar", @@ -2700,7 +2703,7 @@ "Username_description": "Používateľské meno sa používa na umožnenie ostatným, aby vás spomenuli v správach.", "Username_doesnt_exist": "Používateľské meno `%s` neexistuje.", "Username_ended_the_OTR_session": "__username__ ukončil reláciu OTR", - "Username_invalid": "%s nie je platné používateľské meno, používajú sa iba písmená, čísla, tečky, pomlčky a podčiarknuté", + "Username_invalid": "%s nie je platné používateľské meno,
použite len písmená, čísla, bodky, pomlčky a podčiarkovníky", "Username_is_already_in_here": "`@%s` je už tu.", "Username_is_not_in_this_room": "Používateľ `#%s` nie je v tejto miestnosti.", "Username_Placeholder": "Zadajte používateľské mená ...", diff --git a/packages/rocketchat-i18n/i18n/sl-SI.i18n.json b/packages/rocketchat-i18n/i18n/sl-SI.i18n.json index f0049beaf45e..56fae77199aa 100644 --- a/packages/rocketchat-i18n/i18n/sl-SI.i18n.json +++ b/packages/rocketchat-i18n/i18n/sl-SI.i18n.json @@ -1297,6 +1297,7 @@ "if_they_are_from": "(če so iz %s)", "If_this_email_is_registered": "Če je ta e-poštni naslov registriran, vam bomo poslali navodila za ponastavitev gesla. Če elektronske pošte ne boste prejeli v kratkem, prosimo, poskusite znova. ", "If_you_are_sure_type_in_your_password": "Če ste prepričani, vtipkajte svoje geslo:", + "Members_List": "Seznam članov", "If_you_are_sure_type_in_your_username": "Če ste prepričani, vtipkajte svoje uporabniško ime:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Če ga nimate, pošljite elektronsko pošto na [omni@rocket.chat](mailto:omni@rocket.chat), da ga prejmete. ", "Iframe_Integration": "Integracija Iframe", @@ -1668,6 +1669,7 @@ "Mail_Message_No_messages_selected_select_all": "Niste izbrali nobenih sporočil", "Mail_Messages": "Poštna sporočila", "Mail_Messages_Instructions": "S klikom na sporočilo izberite, katero sporočilo želite poslati preko e-pošte", + "Room_uploaded_file_list": "Seznam datotek", "Mail_Messages_Subject": "Tukaj je izbran delež %s sporočil", "Mailer": "Pošiljalnik", "Mailer_body_tags": "Če želite dostopati do povezave za odpoved naročnine, morate uporabiti možnost [unsubscribe].
Za uporabnikovo polno ime, ime ali priimek lahko posamezno uporabite možnosti [name], [fname], [lname].
Za uporabnikov e-naslov lahko uporabite možnost [email].", @@ -1709,7 +1711,6 @@ "Max_length_is": "Maksimalna dolžina je %s", "Media": "Mediji", "Medium": "Srednje", - "Members_List": "Seznam članov", "mention-all": "Omeni vse", "mention-all_description": "Dovoljenje za uporabo omembe @all", "mention-here": "Omeni tukaj", @@ -2201,7 +2202,6 @@ "Room_type_changed_successfully": "Tip sobe je bil uspešno spremenjen", "Room_type_of_default_rooms_cant_be_changed": "To je privzeta soba in vrste ni mogoče spremeniti, posvetujte se s svojim skrbnikom.", "Room_unarchived": "Soba je odarhivirana", - "Room_uploaded_file_list": "Seznam datotek", "Room_uploaded_file_list_empty": "Na voljo ni nobene datoteke.", "Rooms": "Sobe", "run-import": "Zaženite uvoz", @@ -2556,6 +2556,7 @@ "Trigger_Words": "Sprožilne besede", "Triggers": "Sprožilci", "True": "Pravilno", + "Troubleshoot_Disable_Notifications": "Onemogoči obvestila", "Tuesday": "Torek", "Turn_OFF": "Izklopi", "Turn_ON": "Vklopi", diff --git a/packages/rocketchat-i18n/i18n/sq.i18n.json b/packages/rocketchat-i18n/i18n/sq.i18n.json index 6738c098de66..304e8177dab8 100644 --- a/packages/rocketchat-i18n/i18n/sq.i18n.json +++ b/packages/rocketchat-i18n/i18n/sq.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(nëse janë nga %s)", "If_this_email_is_registered": "Nëse kjo e-mail është regjistruar, ne do të dërgojmë udhëzime se si të rivendosni fjalëkalimin tuaj. Nëse nuk merrni një email së shpejti, lutemi të ktheheni dhe provoni përsëri.", "If_you_are_sure_type_in_your_password": "Nëse ju jeni të sigurt shkruani fjalëkalimin tuaj:", + "Members_List": "Lista e Anëtarëve", "If_you_are_sure_type_in_your_username": "Nëse ju jeni të sigurt shkruani emrin tuaj:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Nëse ju nuk keni një të dërguar një email tek [omni@rocket.chat] (mailto: omni@rocket.chat) për të marrë tuajat.", "Iframe_Integration": "Iframe Integration", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "Ju nuk keni zgjedhur ndonjë porosi", "Mail_Messages": "Mesazhet Mail", "Mail_Messages_Instructions": "Zgjidhni cilat mesazhe ju dëshironi të dërgoni përmes emailit duke klikuar mesazhet", + "Room_uploaded_file_list": "Lista Files", "Mail_Messages_Subject": "Këtu është një pjesë e zgjedhur e mesazheve %s", "Mailer": "postues", "Mailer_body_tags": "Ju duhet të përdorni [unsubscribe] për lidhjen Çabonimi.
Ju mund të përdorni [name], [fname], [lname] për emrin e plotë të përdoruesit, emrin e parë ose emrin e fundit, respektivisht.
Ju mund të përdorni [email] për email të përdoruesit.", @@ -1711,7 +1713,6 @@ "Max_length_is": "Gjatësia maksimale është %s", "Media": "Media", "Medium": "medium", - "Members_List": "Lista e Anëtarëve", "mention-all": "Përmend të gjitha", "mention-all_description": "Leja për të përdorur të gjitha përmendur", "mention-here": "Kujtoni këtu", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Lloji Room ndryshuar me sukses", "Room_type_of_default_rooms_cant_be_changed": "Kjo është një dhomë e paracaktuar dhe tipi nuk mund të ndryshohet, ju lutemi konsultohuni me administratorin tuaj.", "Room_unarchived": "Room paarkivuar", - "Room_uploaded_file_list": "Lista Files", "Room_uploaded_file_list_empty": "Nuk ka fotografi në dispozicion.", "Rooms": "Dhomat", "run-import": "Run Import", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Fjalët këmbëz", "Triggers": "shkakton", "True": "I vërtetë", + "Troubleshoot_Disable_Notifications": "Çaktivizo njoftimet", "Tuesday": "e martë", "Turn_OFF": "Fillo", "Turn_ON": "Ndez", diff --git a/packages/rocketchat-i18n/i18n/sr.i18n.json b/packages/rocketchat-i18n/i18n/sr.i18n.json index a6b128261f09..36cc8e6d6046 100644 --- a/packages/rocketchat-i18n/i18n/sr.i18n.json +++ b/packages/rocketchat-i18n/i18n/sr.i18n.json @@ -1,14 +1,12 @@ { - "403": "забрањен", - "500": "Интернал Сервер Еррор", + "403": "Забрањен", + "500": "Интерна грешка сервера", "#channel": "#канал", - "0_Errors_Only": "0 - Грешке Само", + "0_Errors_Only": "0 - Само грешке", "1_Errors_and_Information": "1 - Грешке и информације", - "2_Erros_Information_and_Debug": "2 - Еррос, информације и отклањање грешака", + "2_Erros_Information_and_Debug": "2 - Грешке, информације и отклањање грешака", "@username": "@корисничко име", "@username_message": "@ корисничко име ", - "__username__is_no_longer__role__defined_by__user_by_": "__усернаме__ више није __роле__, од __усер_би__", - "__username__was_set__role__by__user_by_": "__усернаме__ је постављен __роле__ од __усер_би__", "Accept": "Прихвати", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Прихватите долазеће захтјеве ливецхат чак и ако нема онлине агената", "Accept_with_no_online_agents": "Прихватите без онлајн агента", @@ -17,32 +15,32 @@ "access-permissions": "Екран дозвола приступа", "access-permissions_description": "Измени дозволе за различите улоге.", "Access_not_authorized": "Приступ није овлашћен", - "Access_Token_URL": "УРЛ адреса токена приступа", - "Accessing_permissions": "pristup дозволе", - "Account_SID": "рачун СИД", - "Accounts": "рачуни", + "Access_Token_URL": "УРЛ адреса приступног токена", + "Accessing_permissions": "Приступне дозволе", + "Account_SID": "SID налога", + "Accounts": "Налози", "Accounts_Admin_Email_Approval_Needed_Default": "

Корисник [име] ([емаил]) је регистрован.

Молимо вас да проверите \"Администратор -_ЛХ_ХТМЛ_ЕНД> Корисници\" да бисте га активирали или избрисали.

", "Accounts_Admin_Email_Approval_Needed_Subject_Default": "Нови корисник је регистрован и потребан је одобрење", "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

Корисник [име] ([емаил]) је регистрован. \">

Разлог: [разлог]

Молимо вас да проверите \"Управа -_ЛХ_ХТМЛ_ЕНД> Корисници\" за активирање или брисање га.

", "Accounts_AllowAnonymousRead": "Дозволи Анонимно читање", "Accounts_AllowAnonymousWrite": "Дозволи Анонимни Врите", - "Accounts_AllowDeleteOwnAccount": "Омогућавају корисницима да избришете свој налог", - "Accounts_AllowedDomainsList": "Дозвољени домени Листа", + "Accounts_AllowDeleteOwnAccount": "Дозволи корисницима да обришу свој налог", + "Accounts_AllowedDomainsList": "Листа дозвољених домена", "Accounts_AllowedDomainsList_Description": "Зарезом одвојена листа дозвољених домена", - "Accounts_AllowEmailChange": "Дозволите Е-маил Цханге", - "Accounts_AllowPasswordChange": "Дозволи Пассворд Цханге", + "Accounts_AllowEmailChange": "Дозволи промену е-поште", + "Accounts_AllowPasswordChange": "Дозволи промену лозинке", "Accounts_AllowRealNameChange": "Дозволи промену имена", - "Accounts_AllowUserAvatarChange": "Дозволите Усер Аватар Цханге", - "Accounts_AllowUsernameChange": "Дозволи име Промена", - "Accounts_AllowUserProfileChange": "Дозволите Усер Профиле Цханге", + "Accounts_AllowUserAvatarChange": "Дозволите промену корисничког аватара", + "Accounts_AllowUsernameChange": "Дозволи промену корисничког имена", + "Accounts_AllowUserProfileChange": "Дозволи промену корисничког профила", "Accounts_AvatarCacheTime": "Аватар цацхе тиме", "Accounts_AvatarCacheTime_description": "Број секунди за који је протоколу за протокол речено да кешира слике слика.", - "Accounts_AvatarResize": "ресизе Аватари", - "Accounts_AvatarSize": "аватар величина", - "Accounts_BlockedDomainsList": "Блокиран доменов", + "Accounts_AvatarResize": "Промени величину аватара", + "Accounts_AvatarSize": "Величина аватара", + "Accounts_BlockedDomainsList": "Листа блокираних домена", "Accounts_BlockedDomainsList_Description": "Зарезом одвојена листа блокираних домена", - "Accounts_BlockedUsernameList": "Блокиран име Списак", - "Accounts_BlockedUsernameList_Description": "Зарезом одвојена листа блокираних корисници (осетљив на величину слова)", + "Accounts_BlockedUsernameList": "Листа блокираних корисничких имена", + "Accounts_BlockedUsernameList_Description": "Зарезом одвојена листа блокираних корисничких имена (небитна величина слова)", "Accounts_CustomFields_Description": "Требало би бити валидан ЈСОН гдје су кључеви имена поља која садрже речник за подешавања поља. Пример:
{\n\"улога\": {\n\"тип\": \"изаберите\",\n\"дефаултВалуе\": \"студент\",\n\"опције\": [\"наставник\", \"студент\"],\n\"обавезно\": тачно,\n\"модифиРецордФиелд\": {\n\"арраи\": труе,\n\"поље\": \"улога\"\n}\n},\n\"твиттер\": {\n\"тип\": \"текст\",\n\"обавезно\": тачно,\n\"минЛенгтх\": 2,\n\"макЛенгтх\": 10\n}\n} ", "Accounts_CustomFieldsToShowInUserInfo": "Прилагођена поља која ће се приказати у корисничким информацијама", "Accounts_Default_User_Preferences": "Подразумеване корисничке поставке", @@ -51,75 +49,53 @@ "Accounts_Default_User_Preferences_mobileNotifications": "Подразумевана обавештења о мобилним нотификацијама", "Accounts_Default_User_Preferences_not_available": "Није успело преузимати корисничке опције, јер их још увек није подесио корисник", "Accounts_DefaultUsernamePrefixSuggestion": "Подразумевано предлошено корисничко име", - "Accounts_denyUnverifiedEmail": "Дени непроверене емаил", + "Accounts_denyUnverifiedEmail": "Одбиј непотврђене адресе е-поште", "Accounts_Email_Activated": "[име]

Ваш налог је активиран.

", "Accounts_Email_Activated_Subject": "Рачун активиран", "Accounts_Email_Approved": "[име]

Ваш налог је одобрен.

", "Accounts_Email_Approved_Subject": "Рачун одобрен", "Accounts_Email_Deactivated": "[име]

Ваш налог је деактивиран.

", - "Accounts_Enrollment_Email_Default": "

Добродошли у [Site_Name]

Иди на [Site_URL] и покушати решење најбољи опен соурце цхат доступан данас!

", + "Accounts_Enrollment_Email_Default": "

Добродошли на[Site_Name]

Иди на [Site_URL] и испробај најбоље решење за ћаскање отвореног кода које је тренутно доступно!

", "Accounts_Email_Deactivated_Subject": "Рачун је деактивиран", - "Accounts_EmailVerification": "Е-маил Верификација", - "Accounts_EmailVerification_Description": "Направи сте сигурни имали исправне поставке СМТП да користе ову функцију", - "Accounts_Enrollment_Email_Subject_Default": "Велцоме то [Site_Name]", - "Accounts_Enrollment_Email": "Упис е-маил", - "Accounts_Enrollment_Email_Description": "Можете користити [name], [fname], [lname] за пуно име корисника, имену или презимену, респективно.
Можете користити [email] е-поште корисника.", + "Accounts_EmailVerification": "Потврда е-поште", + "Accounts_EmailVerification_Description": "Потврдите да имате исправне SMTP параметре да би сте користили ову могућност", + "Accounts_Enrollment_Email_Subject_Default": "Добродошли на [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Заборавите корисничко сесије на прозору Затвори", - "Accounts_Iframe_api_method": "апи Метод", - "Accounts_Iframe_api_url": "АПИ УРЛ", - "Accounts_iframe_enabled": "omogućeno", - "Accounts_iframe_url": "УРЛ адреса iframe", - "Accounts_LoginExpiration": "Пријава истека у данима", - "Accounts_ManuallyApproveNewUsers": "Ручно одобрава нове Корисници", - "Accounts_OAuth_Custom_Authorize_Path": "овластити Патх", - "Accounts_OAuth_Custom_Button_Color": "дугме Боја", - "Accounts_OAuth_Custom_Button_Label_Color": "Дугме Боја текста", + "Accounts_Iframe_api_method": "Api метода", + "Accounts_Iframe_api_url": "API адреса", + "Accounts_iframe_enabled": "Омогућено", + "Accounts_iframe_url": "Iframe адреса", + "Accounts_LoginExpiration": "Истек пријаве у данима", + "Accounts_ManuallyApproveNewUsers": "Ручно одобри нове кориснике", + "Accounts_OAuth_Custom_Authorize_Path": "Путања ауторизације", + "Accounts_OAuth_Custom_Button_Color": "Боја дугмета", + "Accounts_OAuth_Custom_Button_Label_Color": "Боја текста дугмета", "Accounts_OAuth_Custom_Button_Label_Text": "Текст дугмета", - "Accounts_OAuth_Custom_Enable": "омогућити", - "Accounts_OAuth_Custom_id": "ид", - "Accounts_OAuth_Custom_Identity_Path": "идентитет Пут", + "Accounts_OAuth_Custom_Enable": "Омогући", + "Accounts_OAuth_Custom_id": "Id", + "Accounts_OAuth_Custom_Identity_Path": "Путања идентитета", "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "Идентификован жетон Послато преко", - "Accounts_OAuth_Custom_Login_Style": "Пријава Стил", + "Accounts_OAuth_Custom_Login_Style": "Стил пријаве", "Accounts_OAuth_Custom_Merge_Users": "Споји кориснике", "Accounts_OAuth_Custom_Scope": "Обим", - "Accounts_OAuth_Custom_Secret": "тајна", - "Accounts_OAuth_Custom_Token_Path": "токен Пут", - "Accounts_OAuth_Custom_Token_Sent_Via": "Токен послата преко", + "Accounts_OAuth_Custom_Secret": "Тајна", + "Accounts_OAuth_Custom_Token_Path": "Путања токена", + "Accounts_OAuth_Custom_Token_Sent_Via": "Токен послат путем", "Accounts_OAuth_Custom_Username_Field": "Поље корисничког имена", - "Accounts_OAuth_Custom_Roles_Claim": "Име поља улоге / групе", + "Accounts_OAuth_Custom_Roles_Claim": "Име поља улоге/групе", "Accounts_OAuth_Drupal": "Друпал Логин Енаблед", "Accounts_OAuth_Drupal_callback_url": "Друпал оАутх2 Редирецт УРИ", "Accounts_OAuth_Drupal_id": "Друпал оАутх2 Клијент ИД", "Accounts_OAuth_Drupal_secret": "Друпал оАутх2 Цлиент Сецрет", - "Accounts_OAuth_Facebook": "Фацебоок логин", - "Accounts_OAuth_Facebook_callback_url": "Фацебоок УРЛ за повратни позив", - "Accounts_OAuth_Facebook_id": "ИД фацебоок апликација", - "Accounts_OAuth_Facebook_secret": "фацебоок Тајна", "Accounts_OAuth_Github": "ОАутх Омогућено", - "Accounts_OAuth_Github_callback_url": "Гитхуб УРЛ за повратни позив", "Accounts_OAuth_GitHub_Enterprise": "ОАутх Омогућено", - "Accounts_OAuth_GitHub_Enterprise_callback_url": "ГитХуб предузећа УРЛ за повратни позив", - "Accounts_OAuth_GitHub_Enterprise_id": "ИД клијента", - "Accounts_OAuth_GitHub_Enterprise_secret": "klijent Тајна", - "Accounts_OAuth_Github_id": "ИД клијента", - "Accounts_OAuth_Github_secret": "klijent Тајна", + "Accounts_OAuth_GitHub_Enterprise_id": "Ид клијента", + "Accounts_OAuth_GitHub_Enterprise_secret": "Тајна клијента", + "Accounts_OAuth_Github_id": "Ид клијента", + "Accounts_OAuth_Github_secret": "Тајна клијента", "Accounts_OAuth_Gitlab": "ОАутх Омогућено", - "Accounts_OAuth_Gitlab_callback_url": "ГитЛаб УРЛ за повратни позив", - "Accounts_OAuth_Gitlab_id": "ГитЛаб ИД", "Accounts_OAuth_Gitlab_identity_path": "идентитет Пут", - "Accounts_OAuth_Gitlab_secret": "klijent Тајна", - "Accounts_OAuth_Google": "гоогле Пријава", - "Accounts_OAuth_Google_callback_url": "Гоогле УРЛ за повратни позив", - "Accounts_OAuth_Google_id": "гоогле ИД", - "Accounts_OAuth_Google_secret": "гоогле Тајна", - "Accounts_OAuth_Linkedin": "ЛинкедИн Пријава", - "Accounts_OAuth_Linkedin_callback_url": "ЛинкедИн УРЛ за повратни позив", - "Accounts_OAuth_Linkedin_id": "ЛинкедИн ИД", - "Accounts_OAuth_Linkedin_secret": "ЛинкедИн Тајна", - "Accounts_OAuth_Meteor": "метеор Пријава", - "Accounts_OAuth_Meteor_callback_url": "Метеор УРЛ за повратни позив", - "Accounts_OAuth_Meteor_id": "метеор ИД", - "Accounts_OAuth_Meteor_secret": "метеор Тајна", + "Accounts_OAuth_Gitlab_secret": "Тајна клијента", "Accounts_OAuth_Nextcloud": "ОАутх Омогућено", "Accounts_OAuth_Nextcloud_secret": "klijent Тајна", "Accounts_OAuth_Proxy_host": "Проки Хост", @@ -128,18 +104,10 @@ "Accounts_OAuth_Tokenpass_callback_url": "Токенпасс Цаллбацк УРЛ", "Accounts_OAuth_Tokenpass_id": "Токенпасс Ид", "Accounts_OAuth_Tokenpass_secret": "Токенпасс Сецрет", - "Accounts_OAuth_Twitter": "твиттер Пријава", - "Accounts_OAuth_Twitter_callback_url": "Твиттер УРЛ за повратни позив", - "Accounts_OAuth_Twitter_id": "Твиттер Број", - "Accounts_OAuth_Twitter_secret": "твиттер Тајна", - "Accounts_OAuth_Wordpress": "УордПресс Пријава", "Accounts_OAuth_Wordpress_authorize_path": "овластити Патх", - "Accounts_OAuth_Wordpress_callback_url": "Вордпресс УРЛ за повратни позив", - "Accounts_OAuth_Wordpress_id": "ВордПресс ИД", "Accounts_OAuth_Wordpress_identity_path": "идентитет Пут", "Accounts_OAuth_Wordpress_identity_token_sent_via": "Идентификован жетон Послато преко", "Accounts_OAuth_Wordpress_scope": "Обим", - "Accounts_OAuth_Wordpress_secret": "УордПресс Тајна", "Accounts_OAuth_Wordpress_server_type_custom": "Обичај", "Accounts_OAuth_Wordpress_server_type_wordpress_com": "Вордпресс.цом", "Accounts_OAuth_Wordpress_server_type_wp_oauth_server": "ВП ОАутх Сервер Плугин", @@ -165,31 +133,28 @@ "Accounts_PasswordReset": "Ресетовање лозинке", "Accounts_Registration_AuthenticationServices_Default_Roles": "Уобичајене улоге за услуге провјере аутентичности", "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "Подразумевани корисници улога (одвојени са зарезом) ће бити дати када се региструју преко услуга за потврђивање идентитета", - "Accounts_Registration_AuthenticationServices_Enabled": "Пријава са Аутхентицатион Сервицес", + "Accounts_Registration_AuthenticationServices_Enabled": "Регистрација путем сервиса за аутентификацију", "Accounts_RegistrationForm": "Образац за регистрацију", - "Accounts_RegistrationForm_Disabled": "онемогућен", - "Accounts_RegistrationForm_LinkReplacementText": "Образац за регистрацију Линк Замена Текст", - "Accounts_RegistrationForm_Public": "јавни", - "Accounts_RegistrationForm_Secret_URL": "сецрет УРЛ адреса", - "Accounts_RegistrationForm_SecretURL": "Образац за регистрацију Тајна УРЛ адреса", - "Accounts_RegistrationForm_SecretURL_Description": "Морате обезбедити случајни низ који ће бити додат на ваш регистрације УРЛ. Пример: хттпс://демо.роцкет.цхат/регистер/[secret_hash]", - "Accounts_RequireNameForSignUp": "Захтевају Име За Сигнуп", + "Accounts_RegistrationForm_Disabled": "Онемогућен", + "Accounts_RegistrationForm_Public": "Јавни", + "Accounts_RegistrationForm_Secret_URL": "Тајна УРЛ адреса", + "Accounts_RegistrationForm_SecretURL": "Тајна УРЛ адреса обрасца за регистрацију", + "Accounts_RequireNameForSignUp": "Захтева име за регистрацију", "Accounts_RequirePasswordConfirmation": "Захтевај потврду лозинке", "Accounts_SearchFields": "Поља за размишљање у потрази", "Accounts_SetDefaultAvatar": "Подеси подразумевану Аватар", "Accounts_SetDefaultAvatar_Description": "Покушава да одреди подразумевани аватар на основу ОАутх налога или Граватар", - "Accounts_ShowFormLogin": "Схов образац заснован Пријава", + "Accounts_ShowFormLogin": "Прикажи предефинисани образац пријаве", "Accounts_TwoFactorAuthentication_Enabled": "Омогућите Два аутентификацију фактора", "Accounts_TwoFactorAuthentication_MaxDelta": "Максимална Делта", - "Accounts_UserAddedEmail_Default": "

Добродошли у [Site_Name]

Иди на [Site_URL] и покушати решење најбољи опен соурце цхат доступан данас!

Можете да се пријавите користећи свој емаил: [email] и лозинку: [password]. Можда ће бити потребно да га променимо после прве пријаве.", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "Максимална Делта одређује колико токена важи у било ком тренутку. Токенс се генеришу сваких 30 секунди и важе за (30 * Макимум Делта) секунде. <ЛХ_ХТМЛ_ОПЕН_бр / _ЛХ_ХТМЛ_ЕНД> Пример: Ако је максимална вредност Делта подешена на 10, сваки токен може се користити до 300 секунди пре или након временске ознаке. Ово је корисно када сат клијента није исправно синхронизован са сервером.", - "Accounts_UseDefaultBlockedDomainsList": "Употреба Уобичајено блокираних домена Листа", - "Accounts_UseDNSDomainCheck": "Користи ДНС Домаин Цхецк", + "Accounts_UseDefaultBlockedDomainsList": "Користи предефинисану листу блокираних домена", + "Accounts_UseDNSDomainCheck": "Користи DNS проверу домена", "Accounts_UserAddedEmailSubject_Default": "Додати сте у [Site_Name]", "Accounts_UserAddedEmail_Description": "Можете користити следеће симболе:

  • [name], [fname], [lname] за пуно име корисника, имену или презимену, респективно.
  • [email] е-поште корисника.
  • [password] за лозинку корисника.
  • [Site_Name] и [Site_URL] за апликације Име и УРЛ респективно.
", - "Activate": "Активирати", + "Activate": "Активирај", "Activity": "Активност", - "Add": "додати", + "Add": "Додај", "add-oauth-service": "Додајте услугу Оаутх", "add-oauth-service_description": "Дозвола за додавање нове Оаутх услуге", "add-user": "Додати корисника", @@ -200,8 +165,7 @@ "add-user-to-joined-room": "Додај корисника било којем каналу", "add-user-to-joined-room_description": "Дозвола за додавање корисника тренутном каналу", "add-user_description": "Дозвола за додавање нових корисника на сервер преко екрана корисника", - "Add_agent": "Додај агент", - "Add_custom_oauth": "Додај прилагођени ОАутх", + "Add_agent": "Додај агента", "Add_Domain": "Адд Домаин", "Add_files_from": "Додајте датотеке из", "Add_manager": "Додај менаџера", @@ -209,77 +173,65 @@ "Add_user": "Додај корисника", "Add_User": "Додај корисника", "Add_users": "Додај кориснике", - "Adding_OAuth_Services": "Додавање ОАутх Сервицес", - "Adding_permission": "Додавање дозволу", + "Adding_permission": "Додавање дозволе", "Adding_user": "Додавање корисника", - "Additional_emails": "Додатне Е-маил", - "Additional_Feedback": "Додатне Контакт", + "Additional_emails": "Додатне Е-поште", "additional_integrations_Bots": "Ако тражите како интегрирати сопствени бот, онда не тражите даље од нашег Хубот адаптера. <ЛХ_ХТМЛ_ОПЕН_а хреф = 'хттпс: //гитхуб.цом/РоцкетЦхат/хубот-роцкетцхат' таргет = '_ бланк'_ЛХ_ХТМЛ_ЕНД> хттпс://гитхуб.цом/РоцкетЦхат/хубот-роцкетцхат <ЛХ_ХТМЛ_ЦЛОСЕ_а_ЛХ_ХТМЛ_ЕНД>", "additional_integrations_Zapier": "Да ли желите да интегришете и друге програме и апликације са Роцкет.Цхат, али немате времена за ручно? Онда предлажемо употребу Запија које потпуно подржавамо. Прочитајте више о нашој документацији. <ЛХ_ХТМЛ_ОПЕН_а хреф = 'хттпс: //роцкет.цхат/доцс/администратор-гуидес/интегратионс/запиер/усинг-запс/' таргет = '_ бланк'_ЛХ_ХТМЛ_ЕНД> хттпс://роцкет.цхат/доцс/администратор-гуидес/интегратионс / запиер / усинг-запс / <ЛХ_ХТМЛ_ЦЛОСЕ_а_ЛХ_ХТМЛ_ЕНД>", "Admin_Info": "Админ Инфо", - "Administration": "администрација", + "Administration": "Администрација", "Adult_images_are_not_allowed": "Адулт слике нису дозвољене", "Advocacy": "Адвокатура", - "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "Након ОАутх2 аутентификације, корисници ће бити преусмерени на овај УРЛ", "Agent": "Агент", - "Agent_added": "агент додао", - "Agent_removed": "агент уклоњена", + "Agent_added": "Агент додат", + "Agent_removed": "Агент уклоњен", "Alerts": "Упозорења", - "Alias": "псеудоним", + "Alias": "Псеудоним", "Alias_Format": "Алиас Формат", "Alias_Format_Description": "Увезите поруке из Слацк-а са алијасом; % с је замењено корисничким именом корисника. Ако је празно, неће се користити ништа.", "Alias_Set": "Алиас Сет", - "All": "све", + "All": "Све", "All_added_tokens_will_be_required_by_the_user": "Корисник ће тражити све додатне токове", - "All_channels": "сви канали", - "All_logs": "sve историје", - "All_messages": "sve поруке", + "All_channels": "Сви канали", + "All_logs": "Сви записи", + "All_messages": "Све поруке", "All_users": "Сви корисници", "All_users_in_the_channel_can_write_new_messages": "Сви корисници канала могу писати нове поруке", - "Allow_Invalid_SelfSigned_Certs": "Дозволите Погрешна селф-сигнед Цертс", - "Allow_Invalid_SelfSigned_Certs_Description": "Дозволите неважеће и само-потписан ССЛ сертификата за линк валидацију и прегледима.", "Allow_switching_departments": "Дозволите посетиоцу да пребаце одјела", "Allow_Marketing_Emails": "Дозволи маркетинг емаилс", "Alphabetical": "Абецедно", "Always_open_in_new_window": "Увек отворите у новом прозору", "Analytics": "аналитика", - "Analytics_features_enabled": "karakteristike Омогућено", - "Analytics_features_messages_Description": "Треки прилагођене догађаје који се односе на акције корисник нема на порукама.", - "Analytics_features_rooms_Description": "Треки прилагођене догађаје у вези са акцијама на каналу или са групом (створити, остави, брисање).", - "Analytics_features_users_Description": "Треки прилагођене догађаје који се односе на акције које се односе на кориснике (пассворд ресет пута, профил Промена слике, итд).", + "Analytics_features_enabled": "Активиране могућности", "Analytics_Google": "Гугл анализе", "Analytics_Google_id": "ИД праћења", "and": "и", - "And_more": "И још __ленгтх __", - "Animals_and_Nature": "Животиње и Природа", + "And_more": "И још __length__ ", + "Animals_and_Nature": "Животиње и природа", "Announcement": "Најава", - "API": "АПИ за", + "API": "АПИ", "API_Allow_Infinite_Count": "Дозволите да добијете све", "API_Allow_Infinite_Count_Description": "Да ли би требало дозволити да се позивима на РЕСТ АПИ врати све у једном позиву?", - "API_Analytics": "аналитика", + "API_Analytics": "Аналитика", "API_CORS_Origin": "ЦОРС Оригин", "API_Default_Count": "Дефаулт Цоунт", "API_Default_Count_Description": "Подразумевано бројање за РЕСТ АПИ резултате ако потрошач није обезбедио.", "API_Drupal_URL": "УРЛ Друпал сервера", "API_Drupal_URL_Description": "Пример: хттпс://домаин.цом (искључујући траилинг цртицу)", - "API_Embed": "ембед", + "API_Embed": "Убаци преглед линкова", "API_Embed_Description": "Да ли су омогућени прегледи уграђене везе или не када корисник поставља линк на веб локацију.", "API_Embed_UserAgent": "Ставите захтев за корисника", "API_EmbedCacheExpirationDays": "Ембед Цацхе Екпиратион Даис", - "API_EmbedDisabledFor": "Онемогући Додајте за кориснике", - "API_EmbedDisabledFor_Description": "Зарезом одвојена листа корисничких имена", - "API_EmbedIgnoredHosts": "Ембед Занемарени Домаћини", - "API_EmbedIgnoredHosts_Description": "Зарезом одвојена листа хостова или цидр адресе, нпр. лоцалхост 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", - "API_EmbedSafePorts": "сафе портови", + "API_EmbedDisabledFor_Description": "Зарезом одвојена листа корисничких имена којима је онемогућен преглед убачених линкова.", + "API_EmbedSafePorts": "Безбедни портови", "API_EmbedSafePorts_Description": "Зарезом одвојена листа портова дозвољених за преглед.", "API_Enable_CORS": "Омогући ЦОРС", "API_Enable_Direct_Message_History_EndPoint": "Омогући крајњу тачку историје директних порука", "API_Enable_Direct_Message_History_EndPoint_Description": "Ово омогућава `/ апи / в1 / им.хистори.отхерс` који дозвољава преглед директних порука које су послали други корисници да позивалац није дио.", "API_Enable_Shields": "Омогући штитове", "API_Enable_Shields_Description": "Омогућити штитове доступне на `/ апи / в1 / схиелд.свг`", - "API_GitHub_Enterprise_URL": "УРЛ сервер", - "API_GitHub_Enterprise_URL_Description": "Пример: хттп://домаин.цом (без косом цртом)", - "API_Gitlab_URL": "ГитЛаб УРЛ адреса", + "API_GitHub_Enterprise_URL": "УРЛ адреса сервера", + "API_GitHub_Enterprise_URL_Description": "Пример: http://domain.com (без косе црте на крају)", "API_Shield_Types": "Врсте штита", "API_Shield_Types_Description": "Врсте штитова који омогућавају листу одвојених зарезима, изаберите `онлине`,` канал` или `*` за све", "API_Token": "АПИ токен", @@ -287,10 +239,7 @@ "API_Tokenpass_URL_Description": "Пример: хттпс://домаин.цом (искључујући траилинг цртицу)", "API_Upper_Count_Limit": "Максимални рекордни износ", "API_Upper_Count_Limit_Description": "Који је максималан број записа који РЕСТ АПИ треба да врати (када није неограничен)?", - "API_User_Limit": "Корисник лимит за додавање Сви корисници на канал", - "API_Wordpress_URL": "УордПресс УРЛ адреса", - "Apiai_Key": "Апи.аи ključ", - "Apiai_Language": "Апи.аи Језик", + "API_User_Limit": "Ограничење корисника за додавање свих корисника у канал", "App_author_homepage": "аутор хомепаге", "App_Information": "Информације о апликацији", "App_Installation": "Инсталација апликације", @@ -305,12 +254,12 @@ "App_status_manually_enabled": "Омогућено", "App_status_unknown": "Непознат", "App_support_url": "подршка урл", - "Appearance": "изглед", - "Application_added": "aplikacija је додао", - "Application_Name": "primena Име", - "Application_updated": "primena ажуриран", + "Appearance": "Изглед", + "Application_added": "Апликација је додата", + "Application_Name": "Име апликације", + "Application_updated": "Аппликација ажурирана", "Apply": "Применити", - "Apply_and_refresh_all_clients": "Нанесите и освежите све клијенте", + "Apply_and_refresh_all_clients": "Примени и освежи све клијенте", "Apps": "Програми", "Apps_Framework_enabled": "Омогућите Апп Фрамеворк", "Apps_Settings": "Подешавања апликације", @@ -340,23 +289,14 @@ "Audio_Notification_Value_Description": "Може бити сваки прилагођени звук или подразумевани: звучни сигнал, звук, динг, капљица, високи звук, годишња доба", "Audio_Notifications_Default_Alert": "Подразумевана обавештења о аудио обавештењима", "Audio_Notifications_Value": "Подразумевано обавештење о поруци за звук", - "Auth_Token": "аутх токен", - "Author": "аутор", + "Author": "Аутор", "Author_Information": "Информације о аутору", - "Authorization_URL": "овлашћење УРЛ адреса", - "Authorize": "овластити", + "Authorization_URL": "УРЛ адреса за ауторизацију", + "Authorize": "Овласти", "auto-translate": "Ауто превођење", "auto-translate_description": "Дозвола за коришћење алата за аутоматско превођење", - "Auto_Load_Images": "Ауто Лоад слике", - "AutoLinker_Email": "АутоЛинкер Е-маил", - "AutoLinker_Phone": "АутоЛинкер телефона", - "AutoLinker_Phone_Description": "Аутоматски повезује на бројеве телефона. нпр `(123) 456-7890`", - "AutoLinker_StripPrefix": "АутоЛинкер Стрип Префикс", - "AutoLinker_StripPrefix_Description": "Кратак приказ. нпр хттпс://роцкет.цхат => роцкет.цхат", - "AutoLinker_Urls_Scheme": "АутоЛинкер Шема: // адресе", - "AutoLinker_Urls_TLD": "АутоЛинкер ТЛД УРЛ", - "AutoLinker_Urls_www": "АутоЛинкер 'ввв' СЕО", - "AutoLinker_UrlsRegExp": "АутоЛинкер УРЛ-Регулар Екпрессион", + "Auto_Load_Images": "Аутоматско учитавање слика", + "AutoLinker_StripPrefix_Description": "Кратак приказ. нпр https://rocket.chat => rocket.chat", "Automatic_Translation": "Аутоматски превођење", "AutoTranslate": "Ауто-Превод", "Auto_Translate": "Ауто-Превод", @@ -364,12 +304,11 @@ "AutoTranslate_Change_Language_Description": "Промена језика за аутоматско превођење не преводи претходне поруке.", "AutoTranslate_Enabled": "Омогућите аутоматско превођење", "AutoTranslate_Enabled_Description": "Омогућавање аутоматског превођења омогућит ће особама са аутоматско превођење дозволу да се све поруке аутоматски преведу на њихов одабрани језик. Накнаде могу да се примене, погледајте Гоогле документација ", - "Available": "доступан", - "Available_agents": "слободни агенти", - "Avatar": "Промени аватара", + "Available": "Доступан", + "Available_agents": "Доступни агенти", + "Avatar": "Аватар", "Avatar_changed_successfully": "Аватар успешно промењен", - "Avatar_URL": "аватар УРЛ адреса", - "Avatar_url_invalid_or_error": "УРЛ адреса ако је неважећи или није доступна. Покушајте поново, али са различитим УРЛ.", + "Avatar_URL": "УРЛ адреса аватара", "away": "одсутан/на", "Away": "Одсутан/на", "away_female": "далеко", @@ -380,23 +319,23 @@ "Back_to_applications": "Назад на апликације", "Back_to_chat": "Назад у ћаскање", "Back_to_integration_detail": "Назад на детаљ о интеграцији", - "Back_to_integrations": "Назад на интеграција", + "Back_to_integrations": "Назад на интеграције", "Back_to_login": "Повратак на пријаву", "Back_to_Manage_Apps": "Назад на Управљање апликацијама", - "Back_to_permissions": "Назад на дозвола", + "Back_to_permissions": "Назад на дозволе", "Backup_codes": "Бацкуп кодови", "ban-user": "Бан корисник", "ban-user_description": "Дозвола за забрану корисника са канала", "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "Бета карактеристика. Зависи од видео конференције која ће бити омогућена.", "Block_User": "Блокирај корисника", "Blockchain": "Блоцкцхаин", - "Body": "тело", - "bold": "одважан", + "Body": "Тело", + "bold": "подебљан", "bot_request": "Бот захтев", "BotHelpers_userFields": "Корисничка поља", "BotHelpers_userFields_Description": "ЦСВ поља корисника до којих се може приступити помоћу помоћних метода.", "Bots": "Ботс", - "Branch": "грана", + "Branch": "Грана", "Broadcast_channel": "Броадцаст Цханнел", "Broadcast_channel_Description": "Само овлашћени корисници могу написати нове поруке, али други корисници ће моћи да одговоре", "Broadcast_Connected_Instances": "Броадцаст Цоннецтед инстанци", @@ -414,7 +353,7 @@ "cache_cleared": "Цацхе цлеаред", "Cancel": "Откажи", "Cancel_message_input": "Откажи", - "Cannot_invite_users_to_direct_rooms": "Не могу да позову друге кориснике да усмеравају собе", + "Cannot_invite_users_to_direct_rooms": "Није могуће позивање корисника у директне собе", "Cannot_open_conversation_with_yourself": "Не можете директно да успоставите поруку са собом", "CAS_autoclose": "Аутоцлосе Логин Попуп", "CAS_base_url": "База базе података ССО", @@ -442,25 +381,17 @@ "Channel": "канал", "Channel_already_exist": "Канал '#%s \"већ постоји.", "Channel_already_exist_static": "Канал већ постоји.", - "Channel_already_Unarchived": "Канал са именом `#%s` је већ у неархивирано стању", - "Channel_Archived": "Канал са именом `#%s` је успешно архивиран", - "Channel_created": "Креиран је канал `#%s`.", + "Channel_already_Unarchived": "Channel са именом `#%s` је већ у неархивираном стању", + "Channel_Archived": "Channel са именом `#%s` је успешно архивиран", + "Channel_created": "Channel `#%s` је креиран.", "Channel_doesnt_exist": "Канал `#%s` не постоји.", "Channel_name": "Име канала", "Channel_Name_Placeholder": "Молимо унесите име канала ...", "Channel_to_listen_on": "Канал за слушање", - "Channel_Unarchived": "Канал са именом `#%s` је Неархивиране успешно", "Channels": "Канали", "Channels_are_where_your_team_communicate": "Канали су тамо где ваш тим комуницира", - "Channels_list": "Списак јавних канала", - "Chat_button": "цхат дугме", - "Chat_closed": "цхат затворено", - "Chat_closed_successfully": "Цхат успешно завршена", + "Channels_list": "Листа јавних канала", "Chat_Now": "Цхат Сада", - "Chat_window": "цхат прозор", - "Chatops_Enabled": "Омогући Цхатопс", - "Chatops_Title": "Цхатопс панел", - "Chatops_Username": "Цхатопс име", "Chatpal_AdminPage": "Цхатпал Админ Страница", "Chatpal_All_Results": "све", "Chatpal_API_Key": "АПИ кључ", @@ -508,43 +439,41 @@ "Chatpal_Welcome": "Уживајте у тражењу!", "Chatpal_Window_Size": "Индек Виндов Сизе", "Chatpal_Window_Size_Description": "Величина индексних прозора у сатима (на боотстраппинг)", - "Choose_a_room": "Изаберите собу", - "Choose_messages": "Изаберите поруке", - "Choose_the_alias_that_will_appear_before_the_username_in_messages": "Изаберите псеудоним који ће се појавити пред корисничко име у порукама.", - "Choose_the_username_that_this_integration_will_post_as": "Изаберите корисничко име које ће интеграција постављате као.", + "Choose_a_room": "Изабери собу", + "Choose_messages": "Изабери поруке", + "Choose_the_alias_that_will_appear_before_the_username_in_messages": "Изабери псеудоним који ће се приказати пре корисничког имена у порукама.", "clean-channel-history": "Историја чистог канала", "clean-channel-history_description": "Дозвола да Обриши историју из канала", "clear": "Јасно", - "Clear_all_unreads_question": "Обришете све унреадс?", + "Clear_all_unreads_question": "Очисти све непрочитано?", "clear_cache_now": "Цлеар Цацхе Нов", "clear_history": "Очисти историју", - "Click_here": "Кликните овде", + "Click_here": "Кликни овде", "Click_here_for_more_info": "Кликните овде за више информација", "Click_the_messages_you_would_like_to_send_by_email": "Кликните на поруке које желите послати путем е-поште", "Click_to_join": "Кликни да се придружи!", "Client_ID": "ИД клијента", - "Client_Secret": "klijent Тајна", - "Clients_will_refresh_in_a_few_seconds": "Клијенти ће освежити за неколико секунди", + "Client_Secret": "Тајна клијента", + "Clients_will_refresh_in_a_few_seconds": "Клијенти ће се освежити за неколико секунди", "close": "затвори", "Close": "Близу", "close-livechat-room": "Затвори Ливецхат Роом", "close-livechat-room_description": "Дозвола да се затвори тренутни ЛивеЦхат канал", "close-others-livechat-room": "Затвори Ливецхат Роом", "close-others-livechat-room_description": "Дозвола за затварање других ЛивеЦхат канала", - "Closed": "zatvoreno", + "Closed": "Затворено", "Closed_by_visitor": "Затворен од посетилаца", - "Closing_chat": "zatvaranje Цхат", - "Collapse_Embedded_Media_By_Default": "Скупи уграђени медија по дефаулт-у", + "Closing_chat": "Затварање ћаскања", "color": "боја", - "Color": "боја", - "Commands": "komande", + "Color": "Боја", + "Commands": "Команде", "Comment_to_leave_on_closing_session": "Коментар оставити на затвореној сесији", "Common_Access": "Заједнички приступ", "Community": "Заједница", - "Compact": "компактни", + "Compact": "Компактан", "Condensed": "Кондензован", "Computer": "рачунар", - "Confirm_password": "Потврдите вашу лозинку", + "Confirm_password": "Потврдите лозинку", "Connection_Closed": "Веза је затворена", "Connection_Reset": "Ресет везе", "Consulting": "Консалтинг", @@ -554,15 +483,14 @@ "Continue": "наставити", "Continuous_sound_notifications_for_new_livechat_room": "Непрекидна звучна обавештења за нову собу за живот", "Conversation": "Разговор", - "Conversation_closed": "Разговор затворена: __comment__.", "Conversation_finished_message": "Завршена порука конверзације", "conversation_with_s": "разговор са %s", - "Convert_Ascii_Emojis": "Претворити АСЦИИ у емоџи", - "Copied": "копирати", - "Copy": "копија", - "Copy_to_clipboard": "Цопи то цлипбоард", - "COPY_TO_CLIPBOARD": "Цопи То Цлипбоард", - "Count": "рачунати", + "Convert_Ascii_Emojis": "Претворити ASCII у емотиконе", + "Copied": "Ископирано", + "Copy": "Копирај", + "Copy_to_clipboard": "Копирај на бележницу", + "COPY_TO_CLIPBOARD": "КОПИРАЈ НА БЕЛЕЖНИЦУ", + "Count": "Број", "Country": "земља", "Country_Afghanistan": "Авганистан", "Country_Albania": "Албанија", @@ -804,7 +732,7 @@ "Country_Zambia": "Замбија", "Country_Zimbabwe": "Зимбабве", "Cozy": "удобан", - "Create": "створити", + "Create": "Направи", "create-c": "Креирајте јавне канале", "create-c_description": "Дозвола за креирање јавних канала", "create-d": "Креирајте директне поруке", @@ -813,18 +741,18 @@ "create-p_description": "Дозвола за креирање приватних канала", "create-user": "Направи корисника", "create-user_description": "Дозвола за креирање корисника", - "Create_A_New_Channel": "Направите нови канал", - "Create_new": "Створи ново", + "Create_A_New_Channel": "Направи нови канал", + "Create_new": "Направи нови", "Create_unique_rules_for_this_channel": "Креирајте јединствена правила за овај канал", "Created_at": "Направљено", - "Created_at_s_by_s": "Направљена у %s од %s", + "Created_at_s_by_s": "Направљена у %s од %s", "Created_at_s_by_s_triggered_by_s": "Креиран је на %s од стране %s покренут од стране %s", "CRM_Integration": "ЦРМ интеграција", "CROWD_Reject_Unauthorized": "Одбијте неовлашћено", "Crowd_sync_interval_Description": "Интервал између синхронизације. Пример \"сваких 24 сата\" или \"првог дана у недељи\", више примјера у [Црон Тект Парсер] (хттп://бункат.гитхуб.ио/латер/парсерс.хтмл#тект)", - "Current_Chats": "Тренутни Цхатс", + "Current_Chats": "Тренутна ћаскања", "Current_Status": "Тренутни статус", - "Custom": "Обичај", + "Custom": "Произвољно", "Custom CSS": "цустом ЦСС", "Custom_agent": "Царински агент", "Custom_emoji": "Цустом Емоји", @@ -837,12 +765,10 @@ "Custom_Emoji_Has_Been_Deleted": "Кориснички емоји је избрисан.", "Custom_Emoji_Info": "Цустом Емоји Инфо", "Custom_Emoji_Updated_Successfully": "Прилагођени емоји су успешно ажурирани", - "Custom_Fields": "Цустом Фиелдс", - "Custom_oauth_helper": "Када подешавате ОАутх провајдера, мораћете да обавести УРЛ за повратни позив. употреба
 % с 
.", - "Custom_oauth_unique_name": "Цустом ОАутх јединствено име", + "Custom_Fields": "Произвољна поља", "Custom_Scripts": "Прилагођени скрипти", - "Custom_Script_Logged_In": "Цустом Сцрипт за пријављене кориснике", - "Custom_Script_Logged_Out": "Цустом Сцрипт за пријављени од корисника", + "Custom_Script_Logged_In": "Произвољне скрипте за пријављене кориснике", + "Custom_Script_Logged_Out": "Произвољне скрипте за одјављене кориснике", "Custom_Sound_Add": "Додајте прилагођени звук", "Custom_Sound_Delete_Warning": "Брисање звука не може бити поништено.", "Custom_Sound_Error_Invalid_Sound": "Неважећи звук", @@ -855,17 +781,17 @@ "Custom_Translations_Description": "Требало би бити валидан ЈСОН гдје су кључеви језици који садрже кључни рјечник и преводе. Пример:
{\n\"ср\": {\n\"Канали\": \"Собе\"\n},\n\"пт\": {\n\"Канали\": \"Салас\"\n}\n} ", "Customize": "Прилагоди", "CustomSoundsFilesystem": "Цустом Соундс Филесистем", - "Dashboard": "командна табла", - "Date": "датум", + "Dashboard": "Kомандна табла", + "Date": "Датум", "Date_From": "Од", "Date_to": "до", "days": "дани", - "DB_Migration": "database Мигратион", - "DB_Migration_Date": "Датабасе Мигратион Датум", - "Deactivate": "деактивирање", + "DB_Migration": "Премештање базе података", + "DB_Migration_Date": "Датум премештања базе података", + "Deactivate": "Деактивирај", "Decline": "Одбити", - "Default": "Уобичајено", - "Delete": "избрисати", + "Default": "Предефинисано", + "Delete": "Обриши", "delete-c": "Избриши јавне канале", "delete-c_description": "Дозвола за брисање јавних канала", "delete-d": "Брисање директних порука", @@ -877,28 +803,26 @@ "delete-user": "Обриши корисника", "delete-user_description": "Дозвола за брисање корисника", "Delete_message": "Обриши поруку", - "Delete_my_account": "Обриши мој рачун", - "Delete_Room_Warning": "Брисање собу ће избрисати све поруке послате у соби. Ово се не може поништити.", - "Delete_User_Warning": "Брисање корисника ће обрисати све поруке из тог корисника као добро. Ово се не може поништити.", + "Delete_my_account": "Обриши мој налог", + "Delete_Room_Warning": "Брисање собе ће избрисати све поруке послате у соби. Ово се не може поништити.", + "Delete_User_Warning": "Брисање корисника ће такође обрисати све поруке тог корисника. Ово се не може поништити.", "Delete_User_Warning_Delete": "Брисање корисника ће обрисати све поруке из тог корисника као добро. Ово се не може поништити.", "Delete_User_Warning_Keep": "Корисник ће бити избрисан, али ће њихове поруке остати видљиве. Ово се не може поништити.", "Delete_User_Warning_Unlink": "Брисање корисника ће уклонити корисничко име из свих њихових порука. Ово се не може поништити.", - "Deleted": "Делетед!", + "Deleted": "Обрисан!", "Department": "Одељење", - "Department_removed": "Одељење уклоњена", - "Departments": "Катедре", - "Deployment_ID": "распоређивање ИД", - "Description": "опис", - "Desktop": "десктоп", - "Desktop_Notification_Test": "Обавештење тест десктоп", - "Desktop_Notifications": "Десктоп Обавештења", + "Department_removed": "Сектор уклоњен", + "Departments": "Сектори", + "Description": "Опис", + "Desktop": "Радна површина", + "Desktop_Notification_Test": "Тест обавештења на радној површини", + "Desktop_Notifications": "Обавештења на радној површини", "Desktop_Notifications_Default_Alert": "Подразумевана обавештења о радној површини", - "Desktop_Notifications_Disabled": "Десктоп Обавештења су искључени. Промените подешавања бровсера ако треба обавештења омогућене.", - "Desktop_Notifications_Duration": "Обавештења Трајање", - "Desktop_Notifications_Duration_Description": "Секунде да бисте приказали обавештење десктоп. Ово може утицати на ОС Кс Нотифицатион Центер. Унесите 0 за коришћење подразумевана подешавања претраживача и не утиче на ОС Кс Нотифицатион Центер.", - "Desktop_Notifications_Enabled": "Десктоп Обавештења су омогућена", + "Desktop_Notifications_Disabled": "Обавештења на радној површини су искључена. Промените подешавања вашег прегледача ако желите да укључите обавештења.", + "Desktop_Notifications_Duration": "Трајање обавештења на радној површини", + "Desktop_Notifications_Enabled": "Обавештења на радној површини су омогућена", "Different_Style_For_User_Mentions": "Различит стил за помињање корисника", - "Direct_message_someone": "Директна порука неко", + "Direct_message_someone": "Пошаљи директну поруку некоме", "Direct_Messages": "Директне поруке", "Direct_Reply": "Директни одговор", "Direct_Reply_Debug": "Дебуг директни одговор", @@ -923,31 +847,28 @@ "Disabled": "Онемогућено", "Disallow_reacting": "Дисаллов Реацтинг", "Disallow_reacting_Description": "Забрањује реаговање", - "Display_offline_form": "Дисплаи онлине формулар", "Display_unread_counter": "Приказати број непрочитаних порука", "Displays_action_text": "Приказује текст акције", "Dont_ask_me_again": "Не питај ме поново!", "Dont_ask_me_again_list": "Не питајте ме поново", "Do_not_display_unread_counter": "Немојте приказивати било који бројач овог канала", "Do_you_want_to_accept": "Да ли желите да прихватите?", - "Do_you_want_to_change_to_s_question": "Да ли желите да промените на %s?", + "Do_you_want_to_change_to_s_question": "Да ли желите да промените на %s?", "Document_Domain": "Доцумент Домаин", - "Domain": "домен", + "Domain": "Домен", "Domain_added": "домаин аддед", "Domain_removed": "Домаин Ремовед", - "Domains": "domeni", + "Domains": "Домени", "Domains_allowed_to_embed_the_livechat_widget": "Списак домена који су одвојени зарезом дозвољавају уграђивање видгет-а за ливецхат. Оставите празно да бисте омогућили све домене.", "Download_My_Data": "Преузмите моје податке", "Download_Snippet": "Преузимање", - "Drop_to_upload_file": "Пасти на отпремити датотеку", - "Dry_run": "dry Рун", - "Dry_run_description": "Ће послати само један е-маил, на истој адреси као и од. Имејл морају припадати важећег корисника.", - "Duplicate_archived_channel_name": "Архивирана Канал са именом \"%s\" не постоји", - "Duplicate_archived_private_group_name": "Архивирана Приватна Група са именом \"%s\" не постоји", - "Duplicate_channel_name": "Канал са именом \"%s\" не постоји", - "Duplicate_private_group_name": "Приватни Група са именом \"%s\" не постоји", + "Drop_to_upload_file": "Испусти да пошаљеш датотеку", + "Duplicate_archived_channel_name": "Постоји архивиран канал са именом \"%s\"", + "Duplicate_archived_private_group_name": "Постоји архивирана приватна група са именом \"%s\"", + "Duplicate_channel_name": "Постоји канал са именом \"%s\"", + "Duplicate_private_group_name": "Постоји приватна група са именом \"%s\"", "Duration": "Трајање", - "Edit": "едит", + "Edit": "Уреди", "edit-message": "Уредите поруку", "edit-message_description": "Дозвола за уређивање поруке у соби", "edit-other-user-active-status": "Измени други активни статус корисника", @@ -963,118 +884,102 @@ "edit-room-retention-policy": "Правила за задржавање уређаја", "edit-room-retention-policy_description": "Дозвола да уредите политику задржавања собе, да бисте аутоматски избрисали поруке у њему", "Edit_Custom_Field": "Измена прилагођеног поља", - "Edit_Department": "едит Одељење", + "Edit_Department": "Измена сектора", "Edit_previous_message": "`% с` - Измени претходну поруку", "Edit_Trigger": "Едит Триггер", "edited": "измењено", - "Editing_room": "едитинг соба", "Editing_user": "уређивање корисника", "Education": "образовање", - "Email": "емаил", - "Email_address_to_send_offline_messages": "Е-маил адреса за слање оффлине поруке", - "Email_already_exists": "емаил већ постоји", + "Email": "Е-пошта", + "Email_address_to_send_offline_messages": "Адреса е-поште за слање поруке када нисте на мрежи", + "Email_already_exists": "Е-пошта већ постоји", "Email_body": "Е-пошта тело", - "Email_Change_Disabled": "Ваш Роцкет.Цхат Администратор је онемогућио промену е-поште", + "Email_Change_Disabled": "Ваш администратор је онемогућио промену е-поште", "Email_Footer_Description": "Можете користити следеће симболе:
  • [Site_Name] и [Site_URL] за апликације Име и УРЛ респективно.
", - "Email_from": "од", + "Email_from": "Од", "Email_Header_Description": "Можете користити следеће симболе:
  • [Site_Name] и [Site_URL] за апликације Име и УРЛ респективно.
", - "Email_Notification_Mode": "Ван Емаил Обавештења", - "Email_Notification_Mode_All": "Свако помињање / ЗВ", - "Email_Notification_Mode_Disabled": "онемогућен", - "Email_or_username": "Е-адреса или корисничко име", + "Email_Notification_Mode": "Обавештења путем е-поште када нисте на мрежи", + "Email_Notification_Mode_All": "Свако помињање / ДП", + "Email_Notification_Mode_Disabled": "Онемогућен", + "Email_or_username": "Е-пошта или корисничко име", "Email_Placeholder": "Молимо, унесите вашу и-мејл адресу...", "Email_Placeholder_any": "Унесите адресе е-поште ...", - "Email_subject": "тема", - "Email_verified": "Е-адреса потврђена", - "Emoji": "Емоџији", - "Emoji_provided_by_JoyPixels": "Емоји обезбеђени ЈоиПикелс-ом", + "Email_subject": "Наслов", + "Email_verified": "Е-пошта потврђена", + "Emoji": "Емотикони", "EmojiCustomFilesystem": "Цустом Емоји Филесистем", - "Empty_title": "празан наслов", - "Enable": "омогућити", + "Empty_title": "Празан наслов", + "Enable": "Омогући", "Enable_Auto_Away": "Омогућите Ауто Аваи", - "Enable_Desktop_Notifications": "Омогући Обавештења на радној површини", + "Enable_Desktop_Notifications": "Омогући обавештења на радној површини", "Enable_Svg_Favicon": "Омогући СВГ фавикон", "Enable_two-factor_authentication": "Омогућите двоструку аутентификацију", - "Enabled": "omogućeno", - "Encrypted_message": "шифровану поруку", - "End_OTR": "Крај ОТР", - "Enter_a_regex": "Унесите регек", + "Enabled": "Оmogućeno", + "Encrypted_message": "Шифрована порука", "Enter_a_room_name": "Унесите име собе", "Enter_a_username": "Унесите корисничко име", "Enter_Alternative": "Алтернативни режим (послати с Ентер + Цтрл / Алт / Схифт / ЦМД)", "Enter_authentication_code": "Унесите шифру потврде идентитета", "Enter_Behaviour": "Унесите тип понашања", "Enter_Behaviour_Description": "Ово се мења ако тастер за унос пошаље поруку или направи паузу линија", - "Enter_name_here": "Унесите име овде", + "Enter_name_here": "Овде унесите име", "Enter_Normal": "Нормални режим (пошаљи са Ентер)", "Enter_to": "Ентер да", "Enterprise": "Предузеће", "Entertainment": "Забава", - "Error": "грешка", - "error-action-not-allowed": "__ацтион__ није дозвољено", + "Error": "Грешка", "error-application-not-found": "Апликација није пронађена", - "error-archived-duplicate-name": "Ту је архивирана канал под називом '__роом_наме__'", - "error-avatar-invalid-url": "Инвалид Аватар УРЛ: __урл__", - "error-avatar-url-handling": "Грешка при руковању подешавање аватар из УРЛ (__урл__) за __усернаме__", - "error-cant-invite-for-direct-room": "не могу позвати корисника директним соба", + "error-cant-invite-for-direct-room": "Није могуће позивати кориснике у директне собе", "error-channels-setdefault-is-same": "Подразумевана поставка канала је иста као и оно на шта ће се променити.", "error-channels-setdefault-missing-default-param": "Захтева се бодиПарам 'дефаулт'", - "error-could-not-change-email": "није могао да промени емаил", - "error-could-not-change-name": "није могао да промени име", - "error-could-not-change-username": "није могао да промени име", - "error-delete-protected-role": "Не можете брисати заштићену улогу", - "error-department-not-found": "Одељење није пронађен", + "error-could-not-change-email": "Није било могуће променити е-пошту", + "error-could-not-change-name": "Није било могуће променити име", + "error-could-not-change-username": "Није било могуће променити корисничко име", + "error-delete-protected-role": "Није било могуће обрисати заштићену улогу", + "error-department-not-found": "Сектор није пронађен", "error-direct-message-file-upload-not-allowed": "Дељење датотека није дозвољено у директним порукама", - "error-duplicate-channel-name": "Канал са именом \"%s\" не постоји", + "error-duplicate-channel-name": "Постоји канал са именом '__channel_name__'", "error-edit-permissions-not-allowed": "Дозволе за уређивање нису дозвољене", - "error-email-domain-blacklisted": "Емаил домен је на црној листи", + "error-email-domain-blacklisted": "Домен е-поште је на црној листи", "error-email-send-failed": "Грешка у покушају слања е-поште: __мессаге__", "error-field-unavailable": "__field__ је већ у употреби :(", "error-file-too-large": "Датотека је превелика", - "error-importer-not-defined": "Увозник није правилно дефинисана, она недостаје за увоз класу.", - "error-input-is-not-a-valid-field": "__инпут__ није валидан __фиелд__", - "error-invalid-actionlink": "Неважећи радња Линк", - "error-invalid-arguments": "Инвалид аргумент", - "error-invalid-asset": "неважећи средства", - "error-invalid-channel": "Неважећи канал.", - "error-invalid-channel-start-with-chars": "Неважећи канал. Почните са @ # или", - "error-invalid-custom-field": "Неважећи прилагођено поље", + "error-importer-not-defined": "Увозник није правилно дефинисан, недостаје му класа за увоз.", + "error-invalid-arguments": "Неисправни аргументи", + "error-invalid-channel": "Неисправан канал.", + "error-invalid-channel-start-with-chars": "Неисправан канал. Почните са @ или #", + "error-invalid-custom-field": "Неисправно прилагођено поље", "error-invalid-custom-field-name": "Неважећи назив прилагођено поље. Користите само слова, бројеве, цртице и доње црте.", "error-invalid-date": "Обезбеђен је неважећи датум.", - "error-invalid-description": "неважећи опис", - "error-invalid-domain": "инвалид домен", - "error-invalid-email": "Неважећа е __емаил__", + "error-invalid-description": "Неисправан опис", + "error-invalid-domain": "Неисправан домен", + "error-invalid-email": "Неисправна адреса е-поште __email__", "error-invalid-email-address": "Погрешна емаил адреса", - "error-invalid-file-height": "Неважећи висина фајл", - "error-invalid-file-type": "Инвалид филе типе", - "error-invalid-file-width": "Неважећи ширина фајл", - "error-invalid-from-address": "обавестили сте инвалид ОД адресу.", - "error-invalid-integration": "неважећи интеграција", - "error-invalid-message": "Погрешна порука", - "error-invalid-method": "nevažeći начин", - "error-invalid-name": "nevažeći назив", - "error-invalid-password": "Погрешна лозинка", + "error-invalid-file-height": "Неисправна висина", + "error-invalid-file-type": "Неисправан тип датотеке", + "error-invalid-file-width": "Неисправна ширина датотеке", + "error-invalid-integration": "Неисправна интеграција", + "error-invalid-message": "Неисправна порука", + "error-invalid-method": "Неисправан начин", + "error-invalid-name": "Неисправан назив", + "error-invalid-password": "Неисправна лозинка", "error-invalid-permission": "Неважећа дозвола", - "error-invalid-redirectUri": "неважећи редирецтУри", - "error-invalid-role": "неважећи улога", - "error-invalid-room": "неважећи соба", + "error-invalid-role": "Неисправна улога", + "error-invalid-room": "Неисправна соба", "error-invalid-room-name": "% с није исправан назив соба", - "error-invalid-room-type": "__type__ није исправан тип соба.", - "error-invalid-settings": "Неважећи поставке које пружа", - "error-invalid-subscription": "неважећи претплата", - "error-invalid-token": "Неважећи токен", - "error-invalid-triggerWords": "Неважећи триггерВордс", - "error-invalid-urls": "Неважећи УРЛ-ови", - "error-invalid-user": "nevažeći корисник", + "error-invalid-room-type": "__type__ није исправан тип собе.", + "error-invalid-settings": "Унешена су неисправна подешавања", + "error-invalid-subscription": "Неисправна претплата", + "error-invalid-token": "Неисправан токен", + "error-invalid-urls": "Погрешна УРЛ адреса", + "error-invalid-user": "Погрешан корисник", "error-invalid-username": "Погрешно корисничко име", - "error-invalid-webhook-response": "УРЛ адреса вебхоок одговорила са статусом осим 200", - "error-message-deleting-blocked": "Порука брисање је блокиран", - "error-message-editing-blocked": "уређивање порука је блокиран", - "error-message-size-exceeded": "величина поруке већа од Мессаге_МакАлловедСизе", + "error-message-deleting-blocked": "Брисање порука је блокирано", + "error-message-editing-blocked": "Уређивање порука је блокирано", "error-missing-unsubscribe-link": "Морате навести [unsubscribe] линк.", - "error-no-tokens-for-this-user": "Нема токени за овај корисника", + "error-no-tokens-for-this-user": "Нема токена за овог корисника", "error-not-allowed": "Није дозвољено", - "error-not-authorized": "није овлашћен", + "error-not-authorized": "Није овлашћен", "error-password-policy-not-met": "Лозинка не одговара политици сервера", "error-password-policy-not-met-maxLength": "Лозинка не одговара политици сервера максималне дужине (лозинка је предугачка)", "error-password-policy-not-met-minLength": "Лозинка не одговара политици сервера минималне дужине (преусмерена је лозинка)", @@ -1083,14 +988,11 @@ "error-password-policy-not-met-oneSpecial": "Лозинка не испуњава политику сервера од најмање једног специјалног карактера", "error-password-policy-not-met-oneUppercase": "Лозинка не испуњава политику сервера од најмање једног великог слова", "error-password-policy-not-met-repeatingCharacters": "Лозинка не испуњава политику сервера забрањених понављања знакова (имате превише истих знакова поред једне друге)", - "error-push-disabled": "Пусх је онемогућен", - "error-remove-last-owner": "Ово је последњи власник. Молимо подесите новог власника пре него што уклоните овај.", - "error-role-in-use": "Не можете брисати улогу јер је у употреби", - "error-role-name-required": "Име улога је потребно", + "error-remove-last-owner": "Ово је последњи власник. Подесите новог власника пре него што овог уклоните.", + "error-role-in-use": "Не можете обрисати улогу јер је у употреби", + "error-role-name-required": "Име улоге је неопходно", "error-room-is-not-closed": "Соба није затворена", - "error-the-field-is-required": "је обавезно поље __фиелд__.", "error-this-is-not-a-livechat-room": "Ово није соба Ливецхат", - "error-too-many-requests": "Грешка, превише захтева. Молим те успори. Морате да сачекате __сецондс__ секунди пре него што поново покушава.", "error-user-has-no-roles": "Корисник нема улогу", "error-user-is-not-activated": "Корисник није активиран", "error-user-limit-exceeded": "Број корисника које покушавате позвати у #цханнел_наме превазилази лимит који је поставио администратор", @@ -1126,31 +1028,30 @@ "External_Queue_Service_URL": "УРЛ адреса спољне редакције", "External_Service": "Спољни сервис", "Facebook_Page": "Фацебоок страница", - "False": "лажан", - "Favorite_Rooms": "Омогући Фаворите Роомс", + "False": "Лажан", + "Favorite_Rooms": "Омогући омиљене собе", "Favorite": "Фаворит", - "Favorites": "Омиљено", + "Favorites": "Омиљене", "Feature_Depends_on_Livechat_Visitor_navigation_as_a_message_to_be_enabled": "Ова функција зависи од \"Пошаљи историју навигације посетилаца као поруке\" која ће бити омогућена.", - "Features_Enabled": "karakteristike Омогућено", "FEDERATION_Domain": "домен", "FEDERATION_Status": "Стање", - "Field": "поље", - "Field_removed": "поље уклоњена", + "Field": "Поље", + "Field_removed": "Поље уклоњено", "Field_required": "Потребно поље", - "File_exceeds_allowed_size_of_bytes": "Филе прелази дозвољену величину __сизе__ бајтова", + "File_exceeds_allowed_size_of_bytes": "Датотека премашује дозвољену величину од __size__.", "File_name_Placeholder": "Претрага датотека ...", "File_removed_by_automatic_prune": "Датотека је уклоњена аутоматским пруне", "File_not_allowed_direct_messages": "Дељење датотека није дозвољено у директним порукама.", "File_removed_by_prune": "Датотека је уклоњена пруне", "File_type_is_not_accepted": "Тип датотеке није прихваћен.", "File_uploaded": "Датотека је отпремљена", - "FileUpload": "file Уплоад", + "FileUpload": "Отпремање датотека", "FileUpload_Disabled": "Преузимање датотека је онемогућено.", - "FileUpload_Enabled": "Филе уплоадс Омогућено", + "FileUpload_Enabled": "Отпремање датотека је омогућено", "FileUpload_Error": "Грешка при уносу датотеке", "FileUpload_Enabled_Direct": "Датотеке су омогућене у директним порукама", - "FileUpload_File_Empty": "Филе празна", - "FileUpload_FileSystemPath": "sistem Пут", + "FileUpload_File_Empty": "Датотека је празна", + "FileUpload_FileSystemPath": "Системска путања", "FileUpload_GoogleStorage_AccessId": "ИД за Гоогле складишни приступ", "FileUpload_GoogleStorage_AccessId_Description": "Приступ приступа је углавном у формату е-поште, на пример: \"екампле-тест@екампле.иам.гсервицеаццоунт.цом\"", "FileUpload_GoogleStorage_Bucket": "Гоогле Стораге Буцкет Наме", @@ -1183,7 +1084,7 @@ "FileUpload_S3_SignatureVersion": "Верзија потписа", "FileUpload_S3_URLExpiryTimeSpan": "УРЛ-ови Екпиратион Тимеспан", "FileUpload_S3_URLExpiryTimeSpan_Description": "Након којег Амазон С3 генерисани УРЛ-ови више неће бити важећи (у секундама). Ако је постављено на мање од 5 секунди, ово поље ће бити занемарено.", - "FileUpload_Storage_Type": "складиштење Тип", + "FileUpload_Storage_Type": "Тип складиштења", "FileUpload_Webdav_Upload_Folder_Path": "Путања фолдера", "FileUpload_Webdav_Upload_Folder_Path_Description": "Путања фасцикле ВебДАВ на коју треба отпремити датотеке", "FileUpload_Webdav_Server_URL": "ВебДАВ Сервер Аццесс УРЛ", @@ -1201,19 +1102,17 @@ "Financial_Services": "Финансијске услуге", "First_Channel_After_Login": "Први канал након пријаве", "Flags": "Заставе", - "Follow_social_profiles": "Пратите наше друштвене профиле, форкујте нас на Гитхабу и поделите ваша мишљења о нашој rocket.chat апликацији на нашој Трело табли.", "Fonts": "Фонтови", - "Food_and_Drink": "Храна пиће", - "Footer": "фоотер", + "Food_and_Drink": "Храна и пиће", + "Footer": "Подножје", "Footer_Direct_Reply": "Нога Када је директни одговор омогућен", "For_more_details_please_check_our_docs": "За више детаља погледајте наше документе.", - "For_your_security_you_must_enter_your_current_password_to_continue": "За вашу безбедност, морате поново унесите лозинку да бисте наставили", + "For_your_security_you_must_enter_your_current_password_to_continue": "Због безбедност, морате унети тренутну лозинку да бисте наставили", "force-delete-message": "Форце Делете Мессаге", "force-delete-message_description": "Дозвола за брисање поруке заобилазе сва ограничења", - "Force_SSL": "сила ССЛ", - "Force_SSL_Description": "* Опрез! * _Форце ССЛ_ никада не треба да се користи са обрнутим проки. Ако имате обрнути проки, требало би да уради преусмеравање ПОСТОЈИ. Ова опција постоји за распоређивања као Хероку, који не дозвољава конфигурацију преусмеравање на обрнутим проки.", - "Invalid_Export_File": "Фајл уплоадед није исправан %s извоз датотека.", - "Forgot_password": "Заборавили сте лозинку", + "Force_SSL": "Приморај SSL", + "Force_SSL_Description": "* Опрез! * _Force SSL_ никада не треба користити са обрнутим проксијем. Ако имате обрнути прокси, требало би ТАМО одрадити преусмеравање. Ова опција постоји за инсталације као што је Heroku, који не дозвољава конфигурацију преусмеравања на обрнутом проксију.", + "Forgot_password": "Заборавили сте лозинку?", "Forgot_Password_Description": "Можете користити следеће држаче:
  • [Форгот_Пассворд_Урл] за УРЛ за опоравак лозинке.
  • [име], [фнаме], [лнаме] за пуно име, презиме или презиме корисника.
  • [емаил] за е-пошту корисника.
  • [Сите_Наме] и [Сите_УРЛ] за име апликације и УРЛ адресу респективно.
", "Forgot_Password_Email": "Кликните на овдеда бисте ресетовали своју лозинку.", "Forgot_Password_Email_Subject": "[Сите_Наме] - опоравак лозинке", @@ -1222,24 +1121,20 @@ "Forward_chat": "Проследи ћаскање", "Forward_to_department": "Напријед на одељење", "Forward_to_user": "Проследи кориснику", - "Frequently_Used": "често коришћене", + "Frequently_Used": "Често коришћено", "Friday": "Петак", - "From": "од", - "From_Email": "od Емаил", - "From_email_warning": "Упозорење: Поље Од подлеже поставкама маил сервера.", + "From": "Од", + "From_Email": "Од ареса", + "From_email_warning": "Упозорење: Поље Од подлеже поставкама твог севера е-поште.", "Gaming": "Гаминг", - "General": "општи", - "github_no_public_email": "Немате ниједну е-адресу као јавну е-адресу на вашем Гитхаб налогу", - "Give_a_unique_name_for_the_custom_oauth": "Дати јединствено име за прилагођени ОАутх", - "Give_the_application_a_name_This_will_be_seen_by_your_users": "Дајте Апликација име. Ово ће бити виђена од својих корисника.", - "Global": "глобалан", + "General": "Општи", + "Global": "Глобално", "Global_purge_override_warning": "Успостављена је глобална политика задржавања. Ако оставите \"Оверриде глобал полици ретентион\" искључену, можете примијенити само политику која је строжија од глобалне политике.", "Global_Search": "Глобално претраживање", "Go_to_your_workspace": "Идите у свој радни простор", "Google_Vision_usage_limit_exceeded": "Граница употребе Гоогле Висион-а је прекорачена", "GoogleCloudStorage": "Гоогле Цлоуд Стораге", "GoogleNaturalLanguage_ServiceAccount_Description": "ЈСОН датотеку кључа услуге налога. Више информација може се наћи [овде] (хттпс://цлоуд.гоогле.цом/натурал-лангуаге/доцс/цоммон/аутх#сет_уп_а_сервице_аццоунт)", - "GoogleTagManager_id": "Гоогле ИД менаџер ознака", "GoogleVision_Block_Adult_Images": "Блокирај слике одраслих", "GoogleVision_Block_Adult_Images_Description": "Блокирање слика одраслих неће радити када се достигне месечна граница", "GoogleVision_Current_Month_Calls": "Тренутни месечни позиви", @@ -1261,8 +1156,8 @@ "Group_favorites": "Омиљене групе", "Group_mentions_disabled_x_members": "Група помиње \"@ алл\" и \"@ хере\" била онемогућена за собе са више од __тотал__ чланова.", "Group_mentions_only": "Група помиње само", - "Hash": "хасх", - "Header": "хеадер", + "Hash": "Хеш", + "Header": "Заглавље", "Header_and_Footer": "Хедер и футер", "Healthcare_and_Pharmaceutical": "Здравство / Фармацеутски", "Help_Center": "Центар за помоћ", @@ -1272,9 +1167,9 @@ "Hide_Avatars": "Сакриј аватаре", "Hide_counter": "Сакриј бројач", "Hide_flextab": "Сакриј десно бочно дугме са кликом", - "Hide_Group_Warning": "Да ли сте сигурни да желите да сакријете групу \"%s\"?", - "Hide_Livechat_Warning": "Јесте ли сигурни да желите сакрити ливецхат са \"%s\"?", - "Hide_Private_Warning": "Да ли сте сигурни да желите да сакријете разговор са \"%s\"?", + "Hide_Group_Warning": "Да ли заиста желите да сакријете групу \"%s\"?", + "Hide_Livechat_Warning": "Да ли заиста желите да сакријете ћаскање са \"%s\"?", + "Hide_Private_Warning": "Да ли заиста желите да сакријете расправу са \"%s\"?", "Hide_roles": "Сакриј улоге", "Hide_room": "Сакриј собу", "Hide_Room_Warning": "Да ли сте сигурни да желите да сакријете собу \"%s\"?", @@ -1298,6 +1193,7 @@ "if_they_are_from": "(ако су из %s)", "If_this_email_is_registered": "Ако је ова е-пошта регистрована, пошаљитећемо упутства о томе како да ресетујете своју лозинку. Ако ускоро не примите е-пошту, вратите се и покушајте поново.", "If_you_are_sure_type_in_your_password": "Ако сте сигурни унесите лозинку:", + "Members_List": "Списак чланова", "If_you_are_sure_type_in_your_username": "Ако сте сигурни тип ваше корисничко име:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Ако немате један, пошаљите е-пошту на [омни@роцкет.цхат] (маилто: омни@роцкет.цхат) да бисте добили своје.", "Iframe_Integration": "Интеграција Ифраме-а", @@ -1317,26 +1213,22 @@ "Impersonate_user": "Имперсонате Усер", "Impersonate_user_description": "Када је омогућено, интеграцијске постове као корисник који су покренули интеграцију", "Import": "Увоз", - "Importer_Archived": "архивиране", + "Importer_Archived": "Архивиране", "Importer_CSV_Information": "ЦСВ увознику је потребан одређени формат, молимо прочитајте документацију како структурирати своју зип датотеку:", "Importer_done": "Увоз завршен!", - "Importer_finishing": "Завршава увоз.", - "Importer_From_Description": "Увоз __from__ 'с подацима у Роцкет.Цхат.", + "Importer_finishing": "Завршавање увоза.", "Importer_HipChatEnterprise_BetaWarning": "Имајте на уму да је овај увоз и даље посао у току, пријавите грешке које се јављају у ГитХуб-у:", "Importer_HipChatEnterprise_Information": "Датотека која је отпремљена мора бити дешифрована тар.гз, прочитајте документацију за додатне информације:", - "Importer_import_cancelled": "Импорт отказан.", - "Importer_import_failed": "Дошло је до грешке док ради увоз.", - "Importer_importing_channels": "Увоз канала.", - "Importer_importing_messages": "Увоз поруке.", - "Importer_importing_started": "Покретање увоз.", - "Importer_importing_users": "Увоз кориснике.", - "Importer_not_in_progress": "Увозник је тренутно није покренут.", + "Importer_import_cancelled": "Увоз отказан.", + "Importer_import_failed": "Дошло је до грешке приликом увоза.", + "Importer_importing_channels": "Увожење канала.", + "Importer_importing_messages": "Увожење порука.", + "Importer_importing_started": "Покретање увоза.", + "Importer_importing_users": "Увожење корисника.", + "Importer_not_in_progress": "Увозник тренутно није покренут.", "Importer_not_setup": "Увозник није подешен правилно, пошто није вратио никакве податке.", - "Importer_Prepare_Restart_Import": "рестарт Увоз", - "Importer_Prepare_Start_Import": "Старт Увоз", - "Importer_Prepare_Uncheck_Archived_Channels": "Поништите потврду Архивирани Канали", - "Importer_Prepare_Uncheck_Deleted_Users": "Искључи Делетед корисника", - "Importer_progress_error": "Није добио напредак за увоз.", + "Importer_Prepare_Restart_Import": "Почни увоз поново", + "Importer_Prepare_Start_Import": "Почни увожење", "Importer_setup_error": "Дошло је до грешке приликом подешавања увозника.", "Importer_Slack_Users_CSV_Information": "Датотека која је отпремљена мора да буде датотека извоза корисника Слацк-а, која је ЦСВ датотека. Погледајте овде за више информација:", "Importer_Source_File": "Избор извора датотека", @@ -1346,14 +1238,8 @@ "Incoming_WebHook": "Долазни ВебХоок", "Industry": "Индустрија", "initials_avatar": "Инитиалс Аватар", - "inline_code": "инлине_цоде", - "Install_Extension": "Инсталл Ектенсион", - "Install_FxOs": "Инсталирајте Роцкет.Цхат на Фирефок", - "Install_FxOs_done": "Велики! Сада можете да користите Роцкет.Цхат преко иконе на вашем почетном екрану. Забавите се са Роцкет.Цхат!", - "Install_FxOs_error": "Жао ми је, то се не ради како треба! Следећи грешка појавила:", - "Install_FxOs_follow_instructions": "Молимо потврдите инсталацију апликације на уређају (притисните \"Инсталл\" када то буде затражено).", "Install_package": "Инсталирајте пакет", - "Installation": "инсталација", + "Installation": "Инсталација", "Installed_at": "инсталиран у", "Invitation_HTML": "poziv ХТМЛ-", "Instance_Record": "Инстанца Рецорд", @@ -1387,10 +1273,10 @@ "Integration_Retry_Failed_Url_Calls_Description": "Да ли интеграција покуша у разумном временском року, ако позив на УРЛ не успе?", "Integration_Run_When_Message_Is_Edited": "Покрените измене", "Integration_Run_When_Message_Is_Edited_Description": "Да ли се интеграција покреће када се порука уређује? Постављање овог на неисправно ће довести до тога да интеграција покреће само нове поруке.", - "Integration_updated": "Интеграција је ажуриран", + "Integration_updated": "Интеграција је ажурирана", "Integration_Word_Trigger_Placement": "Постављање ријечи било гдје", "Integration_Word_Trigger_Placement_Description": "Да ли би се требала покренути Реч када се постави било гдје у реченици осим почетка?", - "Integrations": "интеграције", + "Integrations": "Интеграције", "Integrations_for_all_channels": "Ентер алл_публиц_цханнелс да слушају на свим јавним каналима, алл_привате_гроупс да слушају на свим приватним групама, и алл_дирецт_мессагес да слушате све директне поруке.", "Integrations_Outgoing_Type_FileUploaded": "Филе Уплоадед", "Integrations_Outgoing_Type_RoomArchived": "Соба архивирана", @@ -1399,37 +1285,34 @@ "Integrations_Outgoing_Type_RoomLeft": "Усер Лефт Роом", "Integrations_Outgoing_Type_SendMessage": "Порука послата", "Integrations_Outgoing_Type_UserCreated": "Усер Цреатед", - "InternalHubot": "Интерна Хубот", "InternalHubot_EnableForChannels": "Омогући за јавне канале", "InternalHubot_EnableForDirectMessages": "Омогућите директне поруке", "InternalHubot_EnableForPrivateGroups": "Омогућите приватне канале", "InternalHubot_PathToLoadCustomScripts": "Фолдер за учитавање скрипте", "InternalHubot_reload": "Поново учитајте скрипте", "InternalHubot_ScriptsToLoad": "Скрипте за учитавање", - "InternalHubot_ScriptsToLoad_Description": "Унесите зарезом одвојена листа сценарија за учитавање од хттпс://гитхуб.цом/гитхуб/хубот-сцриптс/трее/мастер/срц/сцриптс", - "InternalHubot_Username_Description": "Ово мора бити валидна корисничко име бот регистрована на серверу.", - "Invalid_confirm_pass": "Лозинка из поља за потврду се не поклапа са првом лозинком", - "Invalid_email": "Унета е-адреса не неисправна", + "InternalHubot_Username_Description": "Ово мора бити валидно корисничко име бота регистрованог на твом серверу.", + "Invalid_confirm_pass": "Потврдна лозинка се не поклапа са лозинком", + "Invalid_email": "Унета је неисправна адреса е-поште", "Invalid_username": "Уписано корисничко име је неважеће", - "Invalid_Import_File_Type": "Погрешна врста Увоз датотеке.", - "Invalid_name": "Корисничко име не сме бити празно", - "Invalid_notification_setting_s": "Инвалид подешавање обавештење %s", + "Invalid_name": "Име не сме бити празно", + "Invalid_notification_setting_s": "Неисправна поставка обавештења: %s", "Invalid_pass": "Лозинка не сме бити празна", "Invalid_reason": "Разлог за придруживање не сме бити празан", "Invalid_room_name": "%s није исправно име канала", - "Invalid_secret_URL_message": "УРЛ адреса обезбеђен је неважећи.", - "Invalid_setting_s": "Неважећа поставка: %s", + "Invalid_secret_URL_message": "Достављена УРЛ адреса није исправна.", + "Invalid_setting_s": "Неисправна поставка: %s", "Invalid_two_factor_code": "Неважећи код два фактора", "invisible": "невидљив(а)", "Invisible": "Невидљив(а)", "Invitation": "Позив", - "Invitation_Email_Description": "Можете користити следеће симболе:
  • [email] за примаоца е-поште.
  • [Site_Name] и [Site_URL] за апликације Име и УРЛ респективно.
", - "Invitation_Subject": "poziv Предмет", - "Invitation_Subject_Default": "Позвани сте да [Site_Name]", - "Invite_user_to_join_channel": "Позови једног корисника да се прикључе овој канал", + "Invitation_Email_Description": "Можете користити следеће симболе:
  • [email] за примаоца е-поште.
  • [Site_Name] и [Site_URL] за име апликације и УРЛ адресу.
", + "Invitation_Subject": "Наслов позивнице", + "Invitation_Subject_Default": "Позвани сте на [Site_Name]", + "Invite_user_to_join_channel": "Позови једног корисника да се придружи овом каналу", "Invite_user_to_join_channel_all_from": "Позовите све кориснике из [# канала] да бисте се придружили овом каналу", "Invite_user_to_join_channel_all_to": "Позовите све кориснике са овог канала да се придруже [#канал]", - "Invite_Users": "Позови корисника", + "Invite_Users": "Позови кориснике", "IRC_Channel_Join": "Излаз команде ЈОИН.", "IRC_Channel_Leave": "Излаз команде ПАРТ.", "IRC_Channel_Users": "Излаз команде НАМЕС.", @@ -1447,11 +1330,11 @@ "IRC_Private_Message": "Излаз ПРИВМСГ наредбе.", "IRC_Quit": "Излаз након напуштања ИРЦ сесије.", "is_also_typing": "такође куца", - "is_also_typing_female": "је такође куцање", - "is_also_typing_male": "је такође куцање", + "is_also_typing_female": "такође куца", + "is_also_typing_male": "такође куца", "is_typing": "куца", - "is_typing_female": "је куцање", - "is_typing_male": "је куцање", + "is_typing_female": "куца", + "is_typing_male": "куца", "Issue_Links": "Питања везане за праћење", "IssueLinks_Incompatible": "Упозорење: не омогућујте ово и 'Хек Цолоур Превиев' истовремено.", "IssueLinks_LinkTemplate": "Шаблон за проблеме са везама", @@ -1461,13 +1344,12 @@ "Mobex_sms_gateway_from_number": "Од", "Mobex_sms_gateway_password": "Лозинка", "Mobex_sms_gateway_username": "Корисничко име", - "Jitsi_Chrome_Extension": "Хром ИД додатка", "Jitsi_Enable_Channels": "Омогући у каналима", "Job_Title": "Звање", "join": "Придружити", "join-without-join-code": "Придружите се без пријављеног кода", "join-without-join-code_description": "Дозвола да се заобиђе приступни код у каналима са омогућеним приступним кодом", - "Join_audio_call": "Придружите аудио позив", + "Join_audio_call": "Придружи се аудио позиву", "Join_Chat": "Придружите се ћаскању", "Join_default_channels": "Придружите дефаулт канала", "Join_the_Community": "Придружи се заједници", @@ -1500,28 +1382,24 @@ "Keyboard_Shortcuts_Open_Channel_Slash_User_Search": "Отвори канал / претрагу корисника", "Keyboard_Shortcuts_Title": "Пречице на тастатури", "Knowledge_Base": "База знања", - "Label": "Етикета", - "Language": "језик", + "Label": "Ознака", + "Language": "Језик", "Language_Not_set": "Нема специфичности", "Language_Version": "Енглеска верзија", - "Last_login": "Последње пријављивање", - "Last_Message_At": "Последња порука На", + "Last_login": "Последња пријава", + "Last_Message_At": "Последња порука у", "Last_seen": "Последњи пут виђен", "Last_Message": "Последња порука", "Launched_successfully": "Покренут успешно", - "Layout": "распоред", - "Layout_Home_Body": "хоме telo", - "Layout_Home_Title": "хоме Наслов", - "Layout_Login_Terms": "Пријава Правила", + "Layout": "Распоред", + "Layout_Login_Terms": "Услови пријаве", "Layout_Privacy_Policy": "Правила о приватности", - "Layout_Sidenav_Footer": "Сиде Навигација подножје", - "Layout_Sidenav_Footer_description": "Фоотер величина је 260 к 70пк", + "Layout_Sidenav_Footer_description": "Фоотер је величине 260 х 70 пиксела", "Layout_Terms_of_Service": "Услови коришћења", - "LDAP": "ЛДАП", + "LDAP": "LDAP", "LDAP_Authentication": "Омогући", "LDAP_Authentication_Password": "Лозинка", "LDAP_Authentication_UserDN": "Корисник ДН", - "LDAP_Authentication_UserDN_Description": "ЛДАП корисник који обавља корисника лоокупс за проверу идентитета друге кориснике када се пријавите.
Ово је типично рачун сервис специјално направљена за треће стране интеграције. Користите пуно име, као што су `цн = Администратор, ЦН = Усерс, ДЦ = пример, ДЦ = цом`.", "LDAP_Background_Sync": "Синхронизација позадине", "LDAP_Background_Sync_Import_New_Users": "Синхронизација позадине увезује нове кориснике", "LDAP_Background_Sync_Import_New_Users_Description": "Увеће све кориснике (на основу критеријума филтера) који постоје у ЛДАП-у и не постоји у Роцкет.Цхат", @@ -1538,8 +1416,7 @@ "LDAP_Description": "ЛДАП је хијерархијска база података која многе компаније користе да би обезбедили јединствени знак на - објекат за размену једну лозинку између више локација и услуга. За напредне информације о конфигурацији и примере, погледајте наш вики: хттпс://гитхуб.цом/РоцкетЦхат/Роцкет.Цхат/вики/ЛДАП-Аутхентицатион.", "LDAP_Enable": "омогућити", "LDAP_Enable_Description": "Покушај да се користе ЛДАП за потврду идентитета.", - "LDAP_Encryption": "шифровање", - "LDAP_Encryption_Description": "Метод шифровања се користи да обезбеди комуникацију са ЛДАП серверу. Примери укључују `плаин` (но шифровање),` ССЛ / ЛДАПС` (шифрована од почетка), и `СтартТЛС` (упграде на шифровану комуникацију једном повезан).", + "LDAP_Encryption": "Шифровање", "LDAP_Find_User_After_Login": "Пронађи корисника након пријављивања", "LDAP_Find_User_After_Login_Description": "Искључиће претрагу ДН корисника након везивања да би се осигурало да је бинд успјешан и спречити пријављивање помоћу празних лозинки када то дозвољава АД конфигурација.", "LDAP_Group_Filter_Enable": "Омогући филтер ЛДАП групе корисника", @@ -1555,7 +1432,6 @@ "LDAP_Group_Filter_ObjectClass": "Гроуп ОбјецтЦласс", "LDAP_Group_Filter_ObjectClass_Description": "* Објектни разред * који идентификује групе.
нпр. ОпенЛДАП: гроупОфУникуеНамес", "LDAP_Host": "Домаћин", - "LDAP_Host_Description": "ЛДАП домаћина, на пример, `лдап.екампле.цом` или` 10.0.0.30`.", "LDAP_Idle_Timeout": "Идле Тимеоут (мс)", "LDAP_Idle_Timeout_Description": "Колико милисекунди чекају након најновије ЛДАП операције до затварања везе. (Свака операција ће отворити нову везу)", "LDAP_Import_Users_Description": "Процес Труе синц ће бити увезен за све кориснике ЛДАП-а
* Опрез! * Наведите филтер за претраживање да не увезете вишак корисника.", @@ -1564,11 +1440,9 @@ "LDAP_Login_Fallback_Description": "Ако пријава на ЛДАП-у није успешна, покушајте да се пријавите у систему подразумеваног / локалног налога. Помаже када је ЛДАП из неког разлога пао.", "LDAP_Merge_Existing_Users": "Споји постојеће кориснике", "LDAP_Merge_Existing_Users_Description": "* Опрез! * Када увозите корисника из ЛДАП-а и корисник са истим корисничким именом већ постоји, ЛДАП инфо и лозинка ће бити постављени у постојећи корисник.", - "LDAP_Port": "лука", - "LDAP_Port_Description": "Порт за приступ ЛДАП. нпр: `389` или` 636` за ЛДАПС", "LDAP_Reconnect": "Поново повежите", "LDAP_Reconnect_Description": "Покушајте да се аутоматски повежете када је веза прекинута из неког разлога током извршавања операција", - "LDAP_Reject_Unauthorized": "Одбаци Неовлашћено", + "LDAP_Reject_Unauthorized": "Одбиј неовлашћено", "LDAP_Reject_Unauthorized_Description": "Онемогућите ову опцију да бисте омогућили цертификате који се не могу потврдити. Обично само потврђени цертификати ће захтевати да ова опција буде онемогућена за рад", "LDAP_Search_Page_Size": "Тражи величину странице", "LDAP_Search_Page_Size_Description": "Максималан број уноса сваке странице резултата ће се вратити да се обради", @@ -1576,16 +1450,13 @@ "LDAP_Search_Size_Limit_Description": "Максималан број уноса за повратак.
** Пажња ** Овај број би требао бити већи од ** Величина странице за претрагу **", "LDAP_Sync_Now": "Синхронизација позадине сада", "LDAP_Sync_Now_Description": "Хоће ли извршити ** Бацкгроунд Синц ** сада уместо да чека ** Интервал синхронизације ** чак и ако је ** Бацкгроунд Синц ** неисправан.
Ова акција је асинхроно, молимо погледајте дневнике за више информација о процес", - "LDAP_Sync_User_Avatar": "Синц Кориснички Аватар", - "LDAP_Sync_User_Data": "podaci синц", - "LDAP_Sync_User_Data_Description": "Имајте корисничких података у синхронизацију са сервером на логин (нпр: име, емаил).", - "LDAP_Sync_User_Data_FieldMap": "Корисник поља података Карта", - "LDAP_Sync_User_Data_FieldMap_Description": "Конфигуришете како се поља кориснички налог (као поште) насељено од рекордних у ЛДАП (једном фоунд).
Као пример, `{\" ЦН \":\" Име \",\" пошта \":\" е \"}` ће изабрати човеку читљиву име особе из цн атрибута, и њихово емаил од атрибута поште.
Поља која укључују `наме`, и` емаил`.", + "LDAP_Sync_User_Avatar": "Синхронизуј корисничке аватаре", + "LDAP_Sync_User_Data": "Синхронизуј корисничке податке", "manage-integrations": "Управљајте интеграцијама", "manage-integrations_description": "Дозвола за управљање серверским интеграцијама", "manage-own-integrations": "Управљајте сопственим интеграцијама", "manage-own-integrations_description": "Пермитион да дозволи корисницима да креирају и уређују сопствену интеграцију или вебхоокс", - "LDAP_Test_Connection": "тест везе", + "LDAP_Test_Connection": "Тестирај везу", "LDAP_Timeout": "Тимеоут (мс)", "LDAP_Timeout_Description": "Колико милесецондс чека резултат претраге пре повратка грешке", "LDAP_Unique_Identifier_Field": "Јединствени идентификатор Поље", @@ -1629,9 +1500,6 @@ "Livechat_room_count": "ЛивеЦхат соба датотека", "Livechat_Routing_Method": "Ливецхат метод рутирања", "Livechat_Take_Confirm": "Хоћеш ли узети овог клијента?", - "Livechat_title": "ЛивеЦхат Наслов", - "Livechat_title_color": "ЛивеЦхат Наслов Боја позадине", - "Livechat_Users": "ЛивеЦхат корисника", "Livestream_close": "Затвори Ливестреам", "Livestream_enable_audio_only": "Омогућите само аудио режим", "Livestream_not_found": "Ливестреам није доступан", @@ -1640,41 +1508,34 @@ "Livestream_switch_to_room": "Пребаците на текућу струју тренутне собе", "Livestream_url": "Урл урл", "Livestream_url_incorrect": "Урл урл-а није исправан", - "Load_more": "Учитај још", - "Loading...": "Лоадинг ...", - "Loading_more_from_history": "Лоадинг више од историје", - "Loading_suggestion": "Учитавам предлоге...", + "Load_more": "Учитај више", + "Loading...": "Учитавање...", + "Loading_more_from_history": "Учитавање из историје", + "Loading_suggestion": "Учитавање предлога", "Localization": "Локализација", "Log_Exceptions_to_Channel_Description": "Канал који ће примити све заузете изузетке. Оставите празно да игноришете изузетке.", "Log_Exceptions_to_Channel": "Изузеци од канала", - "Log_File": "Схов Филе и Лине", - "Log_Level": "лог Ниво", - "Log_Package": "схов Пакет", + "Log_File": "Прикажи датотеку и ред", + "Log_Level": "Ниво записа", + "Log_Package": "Прикажи пакет", "Log_Trace_Methods_Filter": "Траг метод филтера", "Log_Trace_Methods_Filter_Description": "Текст ће бити евалуиран као РегЕкп (`нови РегЕкп ('текст')`). Држите празно да бисте приказали траг сваког позива.", "Log_Trace_Methods": "Позиви методе трага", "Log_Trace_Subscriptions_Filter": "Траце претплатнички филтер", "Log_Trace_Subscriptions_Filter_Description": "Текст ће бити евалуиран као РегЕкп (`нови РегЕкп ('текст')`). Држите празно да бисте приказали траг сваког позива.", "Log_Trace_Subscriptions": "Тражити претплатнички позив", - "Log_View_Limit": "Лог Виев Лимит", - "Logged_out_of_other_clients_successfully": "Пријављени од других клијената успешно", + "Log_View_Limit": "Ограничење приказа записа", "Login": "Пријава", "Login_with": "Пријави се са %s", "Logistics": "Логистика", "Logout": "Одјави се", - "Logout_Others": "Одјавите Од осталих пријављени Локације", + "Logout_Others": "Одјави ме из других пријављених локација", "mail-messages": "Маил поруке", "mail-messages_description": "Дозвола за кориштење опције поштанских порука", - "Mail_Message_Invalid_emails": "Које сте дали један или више неважећих е-поште: %s", - "Mail_Message_Missing_to": "Морате изабрати једну или више корисника или да обезбеди једну или више адреса е-поште, одвојене зарезима.", "Mail_Message_No_messages_selected_select_all": "Нисте изабрали ниједну поруку.", - "Mail_Messages": "маил поруке", + "Mail_Messages": "Поруке е-поште", "Mail_Messages_Instructions": "Изабрати које поруке желите да пошаљете путем е-маила тако што ћете кликнути поруке", - "Mail_Messages_Subject": "Овде је изабран део %s порука", - "Mailer": "маилер", - "Mailer_body_tags": "Морате користити [unsubscribe] за Унсубсцриптион линк.
Можете користити [name], [fname], [lname] за пуно име корисника, имену или презимену, респективно.
Можете користити [email] е-поште корисника.", - "Mailing": "маилинг", - "Make_Admin": "Маке Админ", + "Room_uploaded_file_list": "files лист", "Make_sure_you_have_a_copy_of_your_codes": "Проверите да ли имате копију својих кодова: __кодови__ Ако изгубите приступ вашој апликацији за аутентификацију, можете да користите један од ових шифара за пријављивање.", "manage-apps": "Управљај апликацијама", "manage-assets": "Управљање имовином", @@ -1711,7 +1572,6 @@ "Max_length_is": "Максимална дужина је %s", "Media": "Медији", "Medium": "Средње", - "Members_List": "Списак чланова", "mention-all": "Ментион Алл", "mention-all_description": "Дозволите да користите @алл напомену", "mention-here": "Ментион Хере", @@ -1725,36 +1585,31 @@ "Message_AllowDeleting_BlockDeleteInMinutes": "Блок порука Брисање Афтер (н) Минутес", "Message_AllowDeleting_BlockDeleteInMinutes_Description": "Унесите 0 да искључите блокирање.", "Message_AllowDirectMessagesToYourself": "Дозволите корисницима директне поруке за себе", - "Message_AllowEditing": "Дозволи порука уређивање", - "Message_AllowEditing_BlockEditInMinutes": "Блок Порука Уређивање Афтер (н) Минутес", + "Message_AllowEditing": "Дозволи уређивање порука", + "Message_AllowEditing_BlockEditInMinutes": "Блокирај уређивање порука након (х) минута", "Message_AllowEditing_BlockEditInMinutesDescription": "Унесите 0 да искључите блокирање.", - "Message_AllowPinning": "Дозволи порука пиннинг", - "Message_AllowPinning_Description": "Допусти поруке се качи на било који од канала.", "Message_AllowSnippeting": "Дозволи Сниппинг порука", - "Message_AllowStarring": "Дозволи Порука Улоге", "Message_AllowUnrecognizedSlashCommand": "Дозволи непознате команде за сласх", - "Message_AlwaysSearchRegExp": "Увек се користи регекп", - "Message_AlwaysSearchRegExp_Description": "Препоручујемо да поставите `Труе` ако ваш језик није подржан на потрази текста МонгоДБ .", "Message_Attachments": "Додаци за поруке", "Message_Attachments_GroupAttach": "Дугмад за додавање групе", "Message_Attachments_GroupAttachDescription": "Ово групише иконе испод проширеног менија. Покреће мање простора на екрану.", "Message_Audio": "Аудио порука", "Message_Audio_bitRate": "Брзина аудио поруке", - "Message_AudioRecorderEnabled": "Аудио рекордер Омогућено", + "Message_AudioRecorderEnabled": "Омогућен аудио снимач", "Message_AudioRecorderEnabled_Description": "Захтева да \"аудио / мп3\" фајлови буду прихваћени тип медија унутар поставки \"Уплоад Филе\".", "Message_BadWordsFilterList": "Додај ружне речи на црну листу", - "Message_BadWordsFilterListDescription": "Додај Листа зарезом одвојена листа лоших речи за филтрирање", + "Message_BadWordsFilterListDescription": "Листа ружних речи одвојених зарезом за филтрирање", "Message_DateFormat": "Формат датума", - "Message_DateFormat_Description": "Погледајте такође: Момент.јс", - "Message_deleting_blocked": "Ова порука не може више обрисан", - "Message_editing": "уређивање поруке", + "Message_DateFormat_Description": "Такође погледај: Moment.js", + "Message_deleting_blocked": "Ова порука више не може бити обрисана", + "Message_editing": "Уређивање поруке", "Message_ErasureType": "Мессаге Ерасуре Типе", "Message_ErasureType_Delete": "Обриши све поруке", "Message_ErasureType_Description": "Одредите шта да радите са порукама корисника који уклањају свој налог.", "Message_ErasureType_Keep": "Задржите поруке и корисничко име", "Message_ErasureType_Unlink": "Уклоните везу између корисника и порука", "Message_GlobalSearch": "Глобална претрага", - "Message_GroupingPeriod": "Груписање Период (у секундама)", + "Message_GroupingPeriod": "Период груписања (у секундама)", "Message_GroupingPeriodDescription": "Поруке ће бити груписане у претходну поруку ако су оба из исте корисника и протекло време је мање од информисано време у секундама.", "Message_HideType_au": "Сакријте \"Корисник додате\" поруке", "Message_HideType_mute_unmute": "Сакријте \"Усер Мутед / Унмутед\" поруке", @@ -1763,10 +1618,8 @@ "Message_HideType_ul": "Сакриј поруке \"Корисник одустајање\"", "Message_Ignored": "Ова порука је игнорисана", "Message_info": "Информације о поруци", - "Message_KeepHistory": "Кееп Мессаге Хистори", - "Message_MaxAll": "Максимална величина канал за све поруке", - "Message_MaxAllowedSize": "Максимална дозвољена порука величина", - "Message_pinning": "Порука пиннинг", + "Message_MaxAll": "Максимална величина канала за СВЕ поруке", + "Message_MaxAllowedSize": "Максимални број дозвољених карактера по поруци", "Message_QuoteChainLimit": "Максималан број ланчаних позива", "Message_Read_Receipt_Enabled": "Прикажите пријем читања", "Message_Read_Receipt_Store_Users": "Детаљни подаци о пријему", @@ -1828,25 +1681,25 @@ "n_messages": "%s порука", "N_new_messages": "%s нових порука", "Name": "Име", - "Name_cant_be_empty": "Име не може бити празна", + "Name_cant_be_empty": "Име не може бити празно", "Name_of_agent": "Име агента", "Name_optional": "Име (опционо)", "Name_Placeholder": "Молимо Вас да унесете своје име...", - "Navigation_History": "Навигација Историја", + "Navigation_History": "Историја навигације", "New_Application": "Нова апликација", - "New_Custom_Field": "Нови прилагођени поља", - "New_Department": "Нови Одељење", + "New_Custom_Field": "Нови прилагођено поље", + "New_Department": "Нови сектор", "New_integration": "Нова интеграција", "New_line_message_compose_input": "`% с` - Нова линија у поруци садржи улаз", - "New_logs": "Нове евиденције", - "New_Message_Notification": "Нова порука Обавештење", + "New_logs": "Нови записи", + "New_Message_Notification": "Обавештење о новој поруци", "New_messages": "Нове поруке", "New_password": "Нова лозинка", "New_Password_Placeholder": "Унесите нову лозинку ...", "Confirm_new_password": "Потврдите нову лозинку", "Confirm_New_Password_Placeholder": "Поново унесите нову лозинку ...", "New_role": "Нова улога", - "New_Room_Notification": "Нови Соба Обавештење", + "New_Room_Notification": "Обавештење о новој соби", "New_Trigger": "Нови Триггер", "New_version_available_(s)": "Нова доступна верзија (% с)", "New_videocall_request": "Нови позив за видео позив", @@ -1854,24 +1707,22 @@ "Newer_than": "Новије од", "Newer_than_may_not_exceed_Older_than": "\"Новије од\" можда не прелази \"Старије од\"", "No_available_agents_to_transfer": "Нема расположивих агената за пренос", - "No_channel_with_name_%s_was_found": "Нема канал са именом \"%s\" је пронађен!", - "No_channels_yet": "Нисте члан било ког канала још.", - "No_direct_messages_yet": "Нисте започели ниједан разговор још.", - "No_Encryption": "но шифровање", - "No_group_with_name_%s_was_found": "Нема приватних група са именом \"%s\" је пронађен!", - "No_groups_yet": "Немате ниједну приватну групу за сада.", + "No_channel_with_name_%s_was_found": "Канал са именом \"%s\" није пронађен!", + "No_channels_yet": "Још увек нисте члан ниједног канала", + "No_direct_messages_yet": "Нема директних порука.", + "No_Encryption": "Без шифровања", + "No_group_with_name_%s_was_found": "Приватна група са именом \"%s\" није пронађена!", + "No_groups_yet": "Још увек немате приватне групе.", "No_integration_found": "Интеграција није пронађена од стране обезбеђеног ИД-а.", - "No_livechats": "Немате ливецхатс.", - "No_mentions_found": "Не помињу фоунд", + "No_mentions_found": "Помињања нису пронађена", "No_messages_yet": "Још нема порука", "No_pages_yet_Try_hitting_Reload_Pages_button": "Још нема страница. Покушајте да притиснете дугме \"Релоад Пагес\".", - "No_pinned_messages": "Но закачене порука", + "No_pinned_messages": "Нема закачених порука", "No_results_found": "Нема резултата", "No_results_found_for": "Није пронађен ниједан резултат за:", "No_snippet_messages": "Нема сниппет", - "No_starred_messages": "Но звездицом порука", "No_such_command": "Нема такве команде: `/__command__`", - "No_user_with_username_%s_was_found": "Не корисник са корисничким именом \"%s\" је пронађен!", + "No_user_with_username_%s_was_found": "Корисник са корисничким именом \"%s\" није пронађен!", "Nobody_available": "Нико није доступан", "Node_version": "чвор верзија", "None": "Ниједан", @@ -1925,10 +1776,10 @@ "Only_authorized_users_can_write_new_messages": "Само овлашћени корисници могу писати нове поруке", "Only_from_users": "Само обележите садржај од ових корисника (оставите празно да обришете садржај сваке)", "Only_On_Desktop": "Десктоп (само шаље са уносом на радну површину)", - "Only_you_can_see_this_message": "Само ви можете видети ову поруку", - "Oops!": "Д", + "Only_you_can_see_this_message": "Само ти можеш видети ову поруку", + "Oops!": "Упс", "Oops_page_not_found": "Упс, страница није пронађена", - "Open": "отворен", + "Open": "Отвори", "Open_channel_user_search": "`% с` - Отворени канал / Тражење корисника", "Open_days_of_the_week": "Отворени дани недеље", "Open_Livechats": "Отвори Ливецхатс", @@ -1940,38 +1791,24 @@ "Options": "Опције", "or": "или", "Or_talk_as_anonymous": "Или причајте као анонимне", - "Order": "ред", + "Order": "Редослед", "Organization_Email": "Организација Емаил", "Organization_Info": "Организација Инфо", "Organization_Name": "Назив организације", "Organization_Type": "Тип организације", "Original": "Оригинал", - "OS_Arch": "ОС Арцх", - "OS_Cpus": "ОС Процесор Точка", - "OS_Freemem": "ОС Слободна меморија", - "OS_Loadavg": "ОС лоад авераге", - "OS_Platform": "ОС платформе", - "OS_Release": "ОС Издање", - "OS_Totalmem": "ОС Укупно меморије", - "OS_Type": "тури", - "OS_Uptime": "ОС Уптиме", "Other": "Друго", "others": "други", - "OTR": "ОТР", - "OTR_is_only_available_when_both_users_are_online": "ОТР је доступна само ако оба корисника су онлине", "Outgoing_WebHook": "Одлазни ВебХоок", "Outgoing_WebHook_Description": "Добијте податке из Роцкет.Цхат у реалном времену.", - "Override_URL_to_which_files_are_uploaded_This_url_also_used_for_downloads_unless_a_CDN_is_given": "Замени УРЛ адреса за датотеке које су уплоадед. Овај УРЛ се користи за преузимање, осим ако ЦДН дат", "Page_title": "Наслов странице", "Page_URL": "УРЛ адреса странице", "Password": "Лозинка", - "Password_Change_Disabled": "Ваш Роцкет.Цхат Администратор је онемогућио промену лозинки", + "Password_Change_Disabled": "Ваш администратор је онемогућио промену лозинки", "Password_changed_successfully": "Лозинка је успешно промењена", "Password_Policy": "Политика лозинке", - "Past_Chats": "Паст Цхатс", - "Payload": "корисна носивост", + "Past_Chats": "Ранија ћаскања", "People": "Људи", - "Permalink": "Линк", "Permissions": "Дозволе", "pin-message": "Пин порука", "pin-message_description": "Дозвола да поставите поруку на каналу", @@ -2203,7 +2040,6 @@ "Room_type_changed_successfully": "врста собе успешно промењен", "Room_type_of_default_rooms_cant_be_changed": "Ово је подразумевана соба и врста се не може променити, молимо вас да се консултујете са својим администратором.", "Room_unarchived": "соба неархивирано", - "Room_uploaded_file_list": "files лист", "Room_uploaded_file_list_empty": "Но фајлови производа.", "Rooms": "Собе", "run-import": "Покрените увоз", @@ -2558,6 +2394,7 @@ "Trigger_Words": "Триггер вордс", "Triggers": "окидачи", "True": "Истина", + "Troubleshoot_Disable_Notifications": "Онемогући обавештења", "Tuesday": "Уторак", "Turn_OFF": "Искључи", "Turn_ON": "Укључити", @@ -2816,7 +2653,6 @@ "You_are_logged_in_as": "Пријављени сте као", "You_are_not_authorized_to_view_this_page": "Нисте ауторизовани да видите ову страницу.", "You_can_change_a_different_avatar_too": "Можете премостити аватар користити за постављање из ове интеграције.", - "You_can_search_using_RegExp_eg": "Можете да претражујете помоћу регекп. на пример /^text$/i", "You_can_use_an_emoji_as_avatar": "Такође можете да користите емотикона као аватар.", "You_can_use_webhooks_to_easily_integrate_livechat_with_your_CRM": "Можете користити вебхоокс да лако интегришу ливеЦхат са ЦРМ.", "You_cant_leave_a_livechat_room_Please_use_the_close_button": "Не можете оставити ЛивеЦхат собу. Молимо вас, користите дугме за затварање.", diff --git a/packages/rocketchat-i18n/i18n/sv.i18n.json b/packages/rocketchat-i18n/i18n/sv.i18n.json index 0e07c8387e04..3781c2dddc49 100644 --- a/packages/rocketchat-i18n/i18n/sv.i18n.json +++ b/packages/rocketchat-i18n/i18n/sv.i18n.json @@ -1369,6 +1369,7 @@ "if_they_are_from": "(om de är från %s)", "If_this_email_is_registered": "Om det här e-postmeddelandet är registrerat skickar vi instruktioner om hur du återställer ditt lösenord. Om du inte får ett mail inom kort, vänligen kom tillbaka och försök igen.", "If_you_are_sure_type_in_your_password": "Skriv in ditt lösenord om du är säker:", + "Members_List": "Medlemslista", "If_you_are_sure_type_in_your_username": "Om du är säker, skriv in ditt användarnamn:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Om du inte har en skicka ett mail till [omni@rocket.chat] (mailto: omni@rocket.chat) för att få din.", "Iframe_Integration": "Iframe Integration", @@ -1742,6 +1743,7 @@ "Mail_Message_No_messages_selected_select_all": "Du har inte valt några meddelanden", "Mail_Messages": "E-posta meddelanden", "Mail_Messages_Instructions": "Välj vilka meddelanden du vill skicka via e-post genom att klicka på dem", + "Room_uploaded_file_list": "Fillista", "Mail_Messages_Subject": "Här är en utvald del av %s meddelanden", "Mailer": "E-postskickare", "Mailer_body_tags": "Du måste använda [unsubscribe] för prenumeration länken.
Du kan använda [name], [fname], [lname] för användarens fullständiga namn, förnamn eller efternamn, respektive.
Du kan använda [email] för användarens e-post.", @@ -1783,7 +1785,6 @@ "Max_length_is": "Max längd är%s", "Media": "Media", "Medium": "Medium", - "Members_List": "Medlemslista", "mention-all": "Nämna alla", "mention-all_description": "Tillstånd att använda @all mention", "mention-here": "Nämna här", @@ -2285,7 +2286,6 @@ "Room_type_changed_successfully": "Rummets typ har ändrats", "Room_type_of_default_rooms_cant_be_changed": "Detta är ett standardrum och typen kan inte ändras. Vänligen kontakta din administratör.", "Room_unarchived": "Rummet har avarkiverats", - "Room_uploaded_file_list": "Fillista", "Room_uploaded_file_list_empty": "Inga filer tillgängliga.", "Rooms": "Rum", "Run_only_once_for_each_visitor": "Kör endast en gång per besökare", @@ -2653,6 +2653,7 @@ "Trigger_Words": "Trigger ord", "Triggers": "Triggers", "True": "Sant", + "Troubleshoot_Disable_Notifications": "Inaktivera notifieringar", "Tuesday": "Tisdag", "Turn_OFF": "Stäng av", "Turn_ON": "Sätta på", diff --git a/packages/rocketchat-i18n/i18n/ta-IN.i18n.json b/packages/rocketchat-i18n/i18n/ta-IN.i18n.json index 1d33eadee0b0..21520234b607 100644 --- a/packages/rocketchat-i18n/i18n/ta-IN.i18n.json +++ b/packages/rocketchat-i18n/i18n/ta-IN.i18n.json @@ -1298,6 +1298,7 @@ "if_they_are_from": "(அவர்கள் %s இலிருந்து இருந்தால்)", "If_this_email_is_registered": "இந்த மின்னஞ்சலைப் பதிவு செய்தால், உங்கள் கடவுச்சொல்லை எவ்வாறு மீட்டமைப்பது என்பதைப் பற்றிய அறிவுரைகளை அனுப்புவோம். விரைவில் மின்னஞ்சலை நீங்கள் பெறாவிட்டால், மீண்டும் திரும்பி, மீண்டும் முயற்சிக்கவும்.", "If_you_are_sure_type_in_your_password": "உங்கள் கடவுச்சொல்லை உறுதி வகை என்றால்:", + "Members_List": "உறுப்பினர்கள் பட்டியல்", "If_you_are_sure_type_in_your_username": "நீங்கள் உங்கள் பயனர் பெயர் உறுதி வகை என்றால்:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "உங்களுக்கு ஒரு மின்னஞ்சல் அனுப்பினால் [omni@rocket.chat] (mailto: omni@rocket.chat) உங்களுடையது.", "Iframe_Integration": "Iframe ஒருங்கிணைப்பு", @@ -1670,6 +1671,7 @@ "Mail_Message_No_messages_selected_select_all": "நீங்கள் எந்த செய்திகளை தேர்ந்தெடுக்கவில்லை. ", "Mail_Messages": "மின்னஞ்சல் செய்திகளை", "Mail_Messages_Instructions": "செய்திகள், கிளிக் செய்து நீங்கள் மின்னஞ்சல் வழியாக அனுப்ப வேண்டும் இது செய்திகளை தேர்வு", + "Room_uploaded_file_list": "கோப்புகள் பட்டியல்", "Mail_Messages_Subject": "இங்கே %s செய்திகள் ஒரு தேர்ந்தெடுத்த பகுதியை தான்", "Mailer": "வரியாகும்", "Mailer_body_tags": "நீங்கள் சந்தா இணைப்பு [unsubscribe] பயன்படுத்த வேண்டும்.
முறையே பயனர் முழு பெயர், முதல் பெயர் அல்லது கடைசி பெயரை நீங்கள் [name], [fname], பயன்படுத்தலாம் [lname].
நீங்கள் பயனர் மின்னஞ்சல் ஐந்து [email] பயன்படுத்தலாம்.", @@ -1711,7 +1713,6 @@ "Max_length_is": "அதிகபட்சம்%s", "Media": "ஊடகம்", "Medium": "நடுத்தர", - "Members_List": "உறுப்பினர்கள் பட்டியல்", "mention-all": "எல்லாவற்றையும் குறிப்பிடுங்கள்", "mention-all_description": "@ எல்லாவற்றையும் பயன்படுத்த அனுமதி", "mention-here": "இங்கே குறிப்பிடவும்", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "அறை வகை வெற்றிகரமாக மாற்றப்பட்டது", "Room_type_of_default_rooms_cant_be_changed": "இது இயல்புநிலை அறை மற்றும் வகை மாற்ற முடியாது, தயவுசெய்து உங்கள் நிர்வாகியுடன் ஆலோசிக்கவும்.", "Room_unarchived": "மீட்டெடுக்கப்பட்டது அறை", - "Room_uploaded_file_list": "கோப்புகள் பட்டியல்", "Room_uploaded_file_list_empty": "எந்த கோப்புகளை கிடைக்கும்.", "Rooms": "மனை", "run-import": "இறக்குமதி இயக்கவும்", @@ -2558,6 +2558,7 @@ "Trigger_Words": "தூண்டுதல் வார்த்தைகள்", "Triggers": "தூண்டுதல்கள்", "True": "உண்மை", + "Troubleshoot_Disable_Notifications": "அறிவிப்புகளை முடக்கு", "Tuesday": "செவ்வாய்க்கிழமை", "Turn_OFF": "அணைக்க", "Turn_ON": "திரும்பவும்", diff --git a/packages/rocketchat-i18n/i18n/th-TH.i18n.json b/packages/rocketchat-i18n/i18n/th-TH.i18n.json index 2a3b01a4d928..57087d762ab6 100644 --- a/packages/rocketchat-i18n/i18n/th-TH.i18n.json +++ b/packages/rocketchat-i18n/i18n/th-TH.i18n.json @@ -1297,6 +1297,7 @@ "if_they_are_from": "(ถ้าพวกเขามาจาก %s)", "If_this_email_is_registered": "หากอีเมลนี้ได้รับการลงทะเบียนเราจะส่งคำแนะนำเกี่ยวกับวิธีรีเซ็ตรหัสผ่านของคุณ หากคุณไม่ได้รับอีเมลในไม่ช้าโปรดกลับมาลองอีกครั้ง", "If_you_are_sure_type_in_your_password": "หากคุณแน่ใจว่าพิมพ์รหัสผ่านของคุณ:", + "Members_List": "รายชื่อสมาชิก", "If_you_are_sure_type_in_your_username": "หากคุณแน่ใจว่าพิมพ์ชื่อผู้ใช้ของคุณ:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "หากคุณไม่มีอีเมลส่งไปที่ [omni@rocket.chat] (mailto: omni@rocket.chat) เพื่อรับของคุณ", "Iframe_Integration": "การรวม Iframe", @@ -1669,6 +1670,7 @@ "Mail_Message_No_messages_selected_select_all": "คุณยังไม่ได้เลือกข้อความใด ๆ", "Mail_Messages": "ข้อความจดหมาย", "Mail_Messages_Instructions": "เลือกข้อความที่คุณต้องการส่งทางอีเมลโดยคลิกที่ข้อความ", + "Room_uploaded_file_list": "รายการไฟล์", "Mail_Messages_Subject": "นี่คือส่วนที่เลือกของ %s messages", "Mailer": "Mailer", "Mailer_body_tags": "คุณ ต้องใช้ [ยกเลิกการบอกรับเป็นสมาชิก] สำหรับลิงก์ยกเลิกการสมัคร
คุณสามารถใช้ [name], [fname], [lname] ตามลำดับเพื่อชื่อเต็มของผู้ใช้ชื่อหรือนามสกุลตามลำดับ
คุณสามารถใช้ [email] สำหรับอีเมลของผู้ใช้", @@ -1710,7 +1712,6 @@ "Max_length_is": "ความยาวสูงสุดคือ%s", "Media": "สื่อ", "Medium": "ขนาดกลาง", - "Members_List": "รายชื่อสมาชิก", "mention-all": "กล่าวถึงทั้งหมด", "mention-all_description": "อนุญาตให้ใช้ @all พูดถึง", "mention-here": "กล่าวถึงที่นี่", @@ -2202,7 +2203,6 @@ "Room_type_changed_successfully": "เปลี่ยนประเภทห้องเรียบร้อยแล้ว", "Room_type_of_default_rooms_cant_be_changed": "นี่คือห้องพักที่เป็นค่าเริ่มต้นและไม่สามารถเปลี่ยนประเภทได้โปรดปรึกษาผู้ดูแลระบบของคุณ", "Room_unarchived": "ห้องเก็บถาวร", - "Room_uploaded_file_list": "รายการไฟล์", "Room_uploaded_file_list_empty": "ไม่มีไฟล์", "Rooms": "ห้องพัก", "run-import": "เรียกใช้การนำเข้า", @@ -2557,6 +2557,7 @@ "Trigger_Words": "เรียกใช้คำ", "Triggers": "ทริกเกอร์", "True": "จริง", + "Troubleshoot_Disable_Notifications": "ปิดการแจ้งเตือน", "Tuesday": "วันอังคาร", "Turn_OFF": "ปิด", "Turn_ON": "เปิด", diff --git a/packages/rocketchat-i18n/i18n/tr.i18n.json b/packages/rocketchat-i18n/i18n/tr.i18n.json index aaafc50cedc7..c837a10a5854 100644 --- a/packages/rocketchat-i18n/i18n/tr.i18n.json +++ b/packages/rocketchat-i18n/i18n/tr.i18n.json @@ -1558,6 +1558,7 @@ "if_they_are_from": "(%s'den geliyorsa)", "If_this_email_is_registered": "Bu e-posta kayıtlıysa, şifrenizi nasıl sıfırlayacağınıza ilişkin talimatlar göndeririz. Kısa süre içinde bir e-posta almıyorsanız, lütfen geri dönün ve tekrar deneyin.", "If_you_are_sure_type_in_your_password": "Eminseniz şifrenizi girin:", + "Members_List": "Üyeler Listesi", "If_you_are_sure_type_in_your_username": "Eminseniz kullanıcı adınız girin:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "E-postanız yoksa sizinkini almak için [omni@rocket.chat] (mailto: omni@rocket.chat) adresine bir e-posta gönderin.", "If_you_didnt_ask_for_reset_ignore_this_email": "Şifrenizi sıfırlamayı istemediyseniz, bu e-postayı yok sayabilirsiniz.", @@ -1976,6 +1977,7 @@ "Mail_Message_No_messages_selected_select_all": "Herhangi bir ileti seçmediniz", "Mail_Messages": "Posta İletileri", "Mail_Messages_Instructions": "E-postayla göndermek istediğiniz iletileri tıklayarak seçin", + "Room_uploaded_file_list": "Dosyalar Listesi", "Mail_Messages_Subject": "İşte %s mesajların seçilen bir kısım var", "Mailer": "Postacı", "Mailer_body_tags": "Abonelikten çıkma bağlantısı için [unsubscribe] kullanmak zorundasınız.
Kullanıcının ad-soyadı, adı veya soyadı için sırasıyla [name], [fname] veya [lname] kullanabilirsiniz.
Kullanıcının e-postası için [email] kullanabilirsiniz.", @@ -2024,7 +2026,6 @@ "Maximum": "Maksimum", "Media": "Medya", "Medium": "Orta", - "Members_List": "Üyeler Listesi", "mention-all": "Tümünden Bahset", "mention-all_description": "@all bahsetmesini kullanma izni", "mention-here": "Burada Bahset", @@ -2594,7 +2595,6 @@ "Room_type_changed_successfully": "Oda türü başarıyla değiştirildi", "Room_type_of_default_rooms_cant_be_changed": "Bu varsayılan oda ve tür değiştirilemez, lütfen yöneticinize danışın.", "Room_unarchived": "Oda arşivden çıkarıldı", - "Room_uploaded_file_list": "Dosyalar Listesi", "Room_uploaded_file_list_empty": "Hiç dosya yok.", "Rooms": "Odalar", "Routing": "Yönlendirme", @@ -3003,6 +3003,7 @@ "Trigger_Words": "Tetikleyici Sözcükler", "Triggers": "Tetikleyiciler", "True": "Doğru", + "Troubleshoot_Disable_Notifications": "Bildirimleri kapat", "Tuesday": "Salı", "Turn_OFF": "Kapat", "Turn_ON": "Aç", diff --git a/packages/rocketchat-i18n/i18n/ug.i18n.json b/packages/rocketchat-i18n/i18n/ug.i18n.json index a05d428db5bb..17a770fa68c6 100644 --- a/packages/rocketchat-i18n/i18n/ug.i18n.json +++ b/packages/rocketchat-i18n/i18n/ug.i18n.json @@ -489,6 +489,7 @@ "How_responsive_was_the_chat_agent": "توردا بار مۇلازىمنىڭ ئىنكاس سۈرئىتى قانداق ؟", "How_satisfied_were_you_with_this_chat": "سىزنىڭچە بۇ قېتىملىق پاراڭلىشىش قانائەتلىك بولدىمۇ ؟", "If_you_are_sure_type_in_your_password": ":ئەگەر سىز جەزملەشتۈرسىڭىز ، سىزنىڭ پارولنى كىرگۈزىڭ", + "Members_List": "ئەزالار تىزىملىكى", "If_you_are_sure_type_in_your_username": "ئەگەر سىز جەزملەشتۈرسىڭىز ، ئەزا ئىسمىنى كىرگۈزىڭ:", "Importer_Archived": "ھۆججەتلەر تۈرگە ئايرىلىپ ساقلاندى", "Importer_done": "كىرگۈزۈش ئاللىبۇرۇن پۈتتى !", @@ -656,6 +657,7 @@ "Mail_Message_No_messages_selected_select_all": "غا موھتاجمۇ ؟全选سىز تېخى ھېچقانداق ئۇچۇرنى تاللىمىدىڭىز .ھەممە ئېنىق ئۇچۇرنى", "Mail_Messages": "ئىلخەت يوللاش", "Mail_Messages_Instructions": "چېكىش ئارقىلىق سىزنىڭ ئىلخەتتە يوللىماقچى بولغان ئۇچۇرىڭىزنى يوللاڭ .", + "Room_uploaded_file_list": "ھۆججەت تىزىملىكى", "Mail_Messages_Subject": "تاللىغان بىر قىسىم ئۇچۇر .%s بۇ بولسا", "Mailer": "يوللىغۇچى", "Mailer_body_tags": "ئايرىم ھالدا ئەزانىڭ تولۇق ئىسمى ، ئىسمى ياكى فامىلىسى قىلىپ ئىشلىتىشكە بولىدۇ . [lname] ،ۋە[fname]،[name]سىز
بۇنى مۇشتەرى قىلىشنى بىكار قىلىشنىڭ ئۇلانمىسى قىلىشىڭىز كېرەك . [unsubscribe] چوقۇم سىز", @@ -669,7 +671,6 @@ "Markdown_Headers": "تېمىسىMarkdown", "Markdown_SupportSchemesForLink": "قوللايدىغان ئۇلانما كېلىشمىىMarkdown", "Markdown_SupportSchemesForLink_Description": "ئىنگلىزچە پەش ئارقىلىق ئايرىپ تۇرىدىغان كېلىشمە تىزىملىكى", - "Members_List": "ئەزالار تىزىملىكى", "Mentions": "تىلغا ئېلىش", "Mentions_default": "تىلغا ئېلىش (بەلگىلەنگەن)", "Message_AllowBadWordsFilter": "ئۇچۇردىكى سەت گەپنى سۈزگۈچتىن ئۆتكۈزمەسلىكنى رۇخسەت قىلىش", @@ -913,7 +914,6 @@ "Room_topic_changed_successfully": "ئۆينىڭ تېمىسى ئۇتۇقلۇق ئۆزگەرتىلدى", "Room_type_changed_successfully": "ئۆينىڭ تىپى ئاللىبۇرۇن ئۇتۇقلۇق ئۆزگەرتىلدى", "Room_unarchived": "ئۆينىڭ تۈرگە ئايرىپ ساقلىنىش ھالىتى ئاللىبۇرۇن بىكار قىلىندى", - "Room_uploaded_file_list": "ھۆججەت تىزىملىكى", "Room_uploaded_file_list_empty": "ھېچقانداق ھۆججەت يوق", "Rooms": "ئۆي", "Running_Instances": "ھازىر يۈرگۈزۈلىۋاتقان مىسال", diff --git a/packages/rocketchat-i18n/i18n/uk.i18n.json b/packages/rocketchat-i18n/i18n/uk.i18n.json index 533d1785a33c..8d26be541749 100644 --- a/packages/rocketchat-i18n/i18n/uk.i18n.json +++ b/packages/rocketchat-i18n/i18n/uk.i18n.json @@ -14,9 +14,9 @@ "%_of_conversations": "% розмов", "Accept": "Погоджуюсь", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Приймати запити із livechat, навіть коли немає підключених співробітників", - "Accept_new_livechats_when_agent_is_idle": "Приймайти нові запити livechat, коли агент не працює", + "Accept_new_livechats_when_agent_is_idle": "Приймати нові запити livechat, коли представник не активний ", "Accept_with_no_online_agents": "Приймати із непідключенними співробітниками", - "access-mailer": "Доступ до електронної пошти", + "access-mailer": "Доступ до екрана поштової скриньки", "access-mailer_description": "Дозволити надсилати електронний лист усім користувачам", "access-permissions": "Дозвіл до налаштувань прав доступу", "access-permissions_description": "Змінити дозволи для різних ролей", @@ -26,9 +26,9 @@ "Accessing_permissions": "Отримання доступу до дозволів", "Account_SID": "SID облікового запису", "Accounts": "Облікові записи", - "Accounts_Admin_Email_Approval_Needed_Default": "

Користувач [назва] ([email])зареєстровано.

Будь ласка, виберіть \"Адміністрація ->Користувачі\", щоб активувати або видалити його.

", + "Accounts_Admin_Email_Approval_Needed_Default": "

Користувача [name] ([email])зареєстровано.

Будь ласка, виберіть \"Адміністрація ->Користувачі\", щоб активувати або видалити його.

", "Accounts_Admin_Email_Approval_Needed_Subject_Default": "Новий користувач зареєстрований і потребує схвалення", - "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

Користувач [назва] ([email])зареєстровано.

Причина: [причина]

Будь ласка, виберіть \"Адміністрація ->Користувачі\", щоб активувати або видалити її.

", + "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

Користувача [name] ([email])зареєстровано.

Причина: [reason]

Будь ласка, виберіть \"Адміністрація ->Користувачі\", щоб активувати або видалити її.

", "Accounts_AllowAnonymousRead": "Дозволити читати анонімним користувачам", "Accounts_AllowAnonymousWrite": "Дозволити записувати анонімним користувачам", "Accounts_AllowDeleteOwnAccount": "Дозволити користувачам видаляти власний обліковий запис", @@ -54,7 +54,7 @@ "Accounts_BlockedUsernameList": "Перелік заблокованих користувачів", "Accounts_BlockedUsernameList_Description": "Перелік заблокованих імен користувачів (без урахування регістру), розділених комами ", "Accounts_CustomFields_Description": "Очікується правильний JSON-об'єкт, в якому ключ - це назва поля, а його зміст - словник із налаштуваннями цього поля. Приклад:
{\n \"role\": {\n  \"type\": \"select\",\n  \"defaultValue\": \"student\",\n  \"options\": [\"teacher\", \"student\"],\n  \"required\": true,\n  \"modifyRecordField\": {\n   \"array\": true,\n   \"field\": \"roles\"\n  }\n },\n \"twitter\": {\n  \"type\": \"text\",\n  \"required\": true,\n  \"minLength\": 2,\n  \"maxLength\": 10\n }\n} ", - "Accounts_CustomFieldsToShowInUserInfo": "Користувацькі поля для відображення в інформаціїї користувача", + "Accounts_CustomFieldsToShowInUserInfo": "Користувацькі поля для відображення в інформації про користувача", "Accounts_Default_User_Preferences": "Налаштування користувача за замовчуванням", "Accounts_Default_User_Preferences_audioNotifications": "Стандартне звукове сповіщення", "Accounts_Default_User_Preferences_desktopNotifications": "Стандартне сповіщення для комп'ютера", @@ -62,8 +62,8 @@ "Accounts_Default_User_Preferences_not_available": "Не вдалося отримати параметри користувача, оскільки користувач ще не налаштований", "Accounts_DefaultUsernamePrefixSuggestion": "Запропонований префікс користувача за умовчанням", "Accounts_denyUnverifiedEmail": "Заборонити неперевірену електронну пошту", - "Accounts_Email_Activated": "[ім'я]

Ваш обліковий запис активовано.

", - "Accounts_Email_Activated_Subject": "Рахунок активовано", + "Accounts_Email_Activated": "[name]

Ваш обліковий запис активовано.

", + "Accounts_Email_Activated_Subject": "Обліковий запис активовано", "Accounts_Email_Approved": "[ім'я]

Ваш обліковий запис було схвалено.

", "Accounts_Email_Approved_Subject": "Обліковий запис схвалено", "Accounts_Email_Deactivated": "[ім'я]

Ваш обліковий запис було вимкнено.

", @@ -73,7 +73,7 @@ "Accounts_EmailVerification_Description": "Переконайтеся, що у вас є правильні налаштування SMTP, щоб використовувати цю функцію", "Accounts_Enrollment_Email_Subject_Default": "Ласкаво просимо до [Site_Name]", "Accounts_Enrollment_Email": "Електронна пошта для реєстрації", - "Accounts_Enrollment_Email_Description": "Ви можете використовувати
  • [name], [fname], [lname] повне ім'я користувача, ім'я або прізвище, відповідно.
  • Ви можете використовувати [email] для електронної пошти користувача.
", + "Accounts_Enrollment_Email_Description": "Ви можете використовувати
  • [name], [fname], [lname] для повного ім’я користувача, ім'я, прізвища, відповідно.
  • Ви можете використовувати [email] для електронної пошти користувача.
", "Accounts_ForgetUserSessionOnWindowClose": "Закрити сесію користувача після закриття вікна", "Accounts_Iframe_api_method": "метод API", "Accounts_Iframe_api_url": "API Url", @@ -88,12 +88,12 @@ "Accounts_OAuth_Custom_Button_Label_Text": "Текст кнопки", "Accounts_OAuth_Custom_Enable": "Включено", "Accounts_OAuth_Custom_id": "Id", - "Accounts_OAuth_Custom_Identity_Path": "ідентичність Шлях", + "Accounts_OAuth_Custom_Identity_Path": "Шлях ідентифікації ", "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "Токен ідентифікації відправлено через", "Accounts_OAuth_Custom_Login_Style": "Стиль входу", "Accounts_OAuth_Custom_Merge_Users": "Об'єднати користувачів", "Accounts_OAuth_Custom_Access_Token_Param": "Назва Параметру для токена доступу", - "Accounts_OAuth_Custom_Scope": "Область застовання", + "Accounts_OAuth_Custom_Scope": "Охоплення", "Accounts_OAuth_Custom_Secret": "Секрет", "Accounts_OAuth_Custom_Show_Button_On_Login_Page": "Показувати кнопку на сторінці входу", "Accounts_OAuth_Custom_Token_Path": "Шлях до токену", @@ -103,20 +103,20 @@ "Accounts_OAuth_Custom_Roles_Claim": "Назви полів ролей/груп", "Accounts_OAuth_Custom_Merge_Roles": "Об'єднати ролі з SSO", "Accounts_OAuth_Drupal": "Дозволити вхід через Drupal", - "Accounts_OAuth_Drupal_callback_url": "Drupal oAuth2 Redire URI", + "Accounts_OAuth_Drupal_callback_url": "URI переадресації oAuth2 Drupal", "Accounts_OAuth_Drupal_id": "Drupal oAuth2 ідентифікатор клієнта", "Accounts_OAuth_Drupal_secret": "Drupal oAuth2 Client Secret", "Accounts_OAuth_Facebook": "Логін Facebook", "Accounts_OAuth_Facebook_callback_url": "URL зворотнього виклику facebook", - "Accounts_OAuth_Facebook_id": "Facebook App Id", + "Accounts_OAuth_Facebook_id": "Facebook App ID", "Accounts_OAuth_Facebook_secret": "Секрет facebook", "Accounts_OAuth_Github": "OAuth Увімкнено", "Accounts_OAuth_Github_callback_url": "URL зворотнього виклику Github ", "Accounts_OAuth_GitHub_Enterprise": "OAuth Увімкнено", "Accounts_OAuth_GitHub_Enterprise_callback_url": "URL-адреса зворотного виклику GitHub Enterprise", - "Accounts_OAuth_GitHub_Enterprise_id": "ідентифікатор клієнта", + "Accounts_OAuth_GitHub_Enterprise_id": "Ідентифікатор клієнта", "Accounts_OAuth_GitHub_Enterprise_secret": "клієнт Секрет", - "Accounts_OAuth_Github_id": "ідентифікатор клієнта", + "Accounts_OAuth_Github_id": "Ідентифікатор клієнта", "Accounts_OAuth_Github_secret": "клієнт Секрет", "Accounts_OAuth_Gitlab": "OAuth Увімкнено", "Accounts_OAuth_Gitlab_callback_url": "зворотня URL-адреса GitLab", @@ -152,7 +152,7 @@ "Accounts_OAuth_Twitter_id": "Twitter Id", "Accounts_OAuth_Twitter_secret": "Twitter Секрет", "Accounts_OAuth_Wordpress": "Логін WordPress", - "Accounts_OAuth_Wordpress_authorize_path": "авторизуватися Шлях", + "Accounts_OAuth_Wordpress_authorize_path": "Шлях авторизації", "Accounts_OAuth_Wordpress_callback_url": "зворотня URL-адреса WordPress", "Accounts_OAuth_Wordpress_id": "WordPress Id", "Accounts_OAuth_Wordpress_identity_path": "ідентичність Шлях", @@ -187,7 +187,7 @@ "Accounts_Registration_AuthenticationServices_Enabled": "Реєстрація з Authentication Services", "Accounts_RegistrationForm": "Форма реєстрацїї", "Accounts_RegistrationForm_Disabled": "Вимкнено", - "Accounts_RegistrationForm_LinkReplacementText": "Форма реєстрації Посилання Заміна тексту", + "Accounts_RegistrationForm_LinkReplacementText": "Текст заміни посилання реєстраційної форми", "Accounts_RegistrationForm_Public": "суспільний", "Accounts_RegistrationForm_Secret_URL": "секретний URL", "Accounts_RegistrationForm_SecretURL": "Форма реєстрації Секретного URL", @@ -203,7 +203,12 @@ "Accounts_Directory_DefaultView": "Каталог за замовчуванням для перегляду", "Accounts_SetDefaultAvatar": "Встановити аватар за замовчуванням", "Accounts_SetDefaultAvatar_Description": "Спробувати визначити аватар із сервісів OAuth або Gravatar", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "Встановити електронну пошту для зовнішніх облікових записів як підтверджену", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "У облікових записах, створених із зовнішніх служб (наприклад, LDAP, OAth тощо), електронні листи перевірятимуться автоматично", "Accounts_ShowFormLogin": "Показати форму входу за замовчуванням", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "Увімкніть двофакторну автентифікацію електронною поштою", + "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Користувачі із підтвердженою електронною поштою та включеною опцією у своєму профілі, отримають електронний лист із тимчасовим кодом для авторизації певних дій, таких як вхід, збереження профілю тощо.", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Автоматично вибирайте нових користувачів для двох факторів за допомогою електронної пошти", "Accounts_TwoFactorAuthentication_Enabled": "Увімкнути двохфакторну автентифікацію ", "Accounts_TwoFactorAuthentication_MaxDelta": "Максимальна дельта", "Accounts_UserAddedEmail_Default": "

Ласкаво просимо до [Site_Name]

Перейти до [Site_URL] і спробувати краще рішення чату з відкритим вихідним кодом на сьогоднішній день!

Ви можете увійти в систему, використовуючи адресу електронної пошти: [email] і пароль: [password]. Можливо, вам буде потрібно змінити його після першого входу в систему.", @@ -212,7 +217,7 @@ "Accounts_UseDNSDomainCheck": "Використовувати DNS перевірку домену", "Accounts_UserAddedEmailSubject_Default": "Ви були додані до [Site_Name]", "Accounts_UserAddedEmail_Description": "Ви можете використовувати наступні наповнювачі:

  • [name], [fname], [lname] повне ім'я користувача, ім'я або прізвище, відповідно.
  • [email] для електронної пошти користувача.
  • [password] для пароля користувача.
  • [Site_Name] і [Site_URL] для імені додатки і URL відповідно.
", - "Activate": "активувати", + "Activate": "Активувати", "Activity": "За останньою активністю", "Add": "додати", "add-oauth-service": "Додати сервіс Oauth", @@ -252,19 +257,19 @@ "Agent_Info": "Інформація про співробітника", "Agents": "Агенти", "Agent_added": "агент додано", - "Agent_removed": "агент видалений", + "Agent_removed": "Представника вилучено", "Alerts": "Сповіщення", "Alias": "Псевдонім", "Alias_Format": "Формат псевдоніму", "Alias_Format_Description": "Імпортувати повідомлення із Slack за псевдонімом; %s буде замінено на ім'я користувача. Якщо не вказано, псевдонім не буде використовуватися.", "Alias_Set": "Налаштування псевдоніму", "Aliases": "Псевдоніми", - "All": "всі", + "All": "Всі", "All_added_tokens_will_be_required_by_the_user": "Всі доданіі токени мають бути обов'язковими для користувача", - "All_channels": "всі канали", + "All_channels": "Всі канали", "All_closed_chats_have_been_removed": "Всі закриті чати були видалені", - "All_logs": "всі журнали", - "All_messages": "всі повідомлення", + "All_logs": "Всі журнали", + "All_messages": "Всі повідомлення", "All_users": "Всі користувачі", "All_users_in_the_channel_can_write_new_messages": "Всі користувачі каналу можуть добавляти повідомлення", "Allow_collect_and_store_HTTP_header_informations": "Дозволено збирати та зберігати інформацію заголовка HTTP", @@ -278,7 +283,7 @@ "Alphabetical": "В алфавітному порядку", "Always_open_in_new_window": "Дозволити відкривати у новому вікні", "Analytics": "аналітика", - "Analytics_features_enabled": "особливості Включено", + "Analytics_features_enabled": "Увімкнені функції", "Analytics_features_messages_Description": "Відстежує власні події, пов’язані з діями, які користувач виконує над повідомленнями.", "Analytics_features_rooms_Description": "Відстежує власні події, пов’язані з діями на каналі чи групі (створювати, залишати, видаляти).", "Analytics_features_users_Description": "Відстежує власні події, пов’язані з діями, пов'язаними з користувачами (час скидання пароля, зміни зображення профілю, тощо).", @@ -374,6 +379,8 @@ "Apps_Framework_Development_Mode": "Увімкнути режим розробки", "Apps_Framework_Development_Mode_Description": "Режим розробки дозволяє встановлювати додатки не з Rocket.Chat's Marketplace.", "Apps_Framework_enabled": "Увімкнено Framework додатку", + "Apps_Game_Center": "Ігровий центр", + "Apps_Game_Center_Back": "Повернутися до ігрового центру", "Apps_Marketplace_Deactivate_App_Prompt": "Ви дійсно хочете вимкнути цей додаток?", "Apps_Marketplace_Modify_App_Subscription": "Змінити підписку", "Apps_Marketplace_Uninstall_App_Prompt": "Ви дійсно хочете видалити цей додаток?", @@ -398,7 +405,7 @@ "are_also_typing": "досі друкужться", "are_typing": "друкує", "Are_you_sure": "Ви впевнені?", - "Are_you_sure_you_want_to_delete_your_account": "Ви впевнені, що хочете видалити свій аккаунт?", + "Are_you_sure_you_want_to_delete_your_account": "Ви впевнені, що хочете видалити свій обліковий запис?", "Are_you_sure_you_want_to_disable_Facebook_integration": "Ви впевнені що бажаєте відключити інтеграцію із Facebook?", "Are_you_sure_you_want_to_delete_this_record": "Ви впевнені, що хочете видалити цей запис?", "Assets": "Активи", @@ -449,6 +456,8 @@ "AutoTranslate_Enabled": "Увімкнути автоматичний переклад", "AutoTranslate_Enabled_Description": "Увімкнення автоматичного перекладу дозволить користувачам з доступом до автоматичного перекладу автоматично перекладати всі повідомлення на вибрану мову. Може братися додаткова плата", "AutoTranslate_Google": "Google", + "AutoTranslate_Microsoft": "Microsoft", + "AutoTranslate_Microsoft_API_Key": "Ocp-Apim-підписка-ключ", "AutoTranslate_ServiceProvider": "Постачальник послуг", "Available": "Доступний", "Available_agents": "Доступні агенти", @@ -483,7 +492,7 @@ "Back_to_room": "Повернутися до кімнати", "Backup_codes": "Коди резервного копіювання", "ban-user": "Заборонити користувача", - "ban-user_description": "Дозволити заборонити користувача з каналу", + "ban-user_description": "Дозвіл на блокування користувачів каналу", "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "Бета-функція. Залежить від включення відеоконференції.", "Better": "Краще", "Best_first_response_time": "Кращий перший час відповіді", @@ -508,6 +517,8 @@ "Broadcasting_enabled": "Трансяцію ввімкнено", "Broadcasting_media_server_url": "URL-адреса транслюючого мультимедійного серверу", "Browse_Files": "Перегляд файлів", + "Browser_does_not_support_audio_element": "Ваш браузер не підтримує звуковий елемент.", + "Browser_does_not_support_video_element": "Ваш веб-переглядач не підтримує відео елемент.", "Bugsnag_api_key": "Ключ Bugsnag API", "Build_Environment": "Побудова середовища", "bulk-register-user": "Масове створення каналів", @@ -543,7 +554,7 @@ "CAS_Sync_User_Data_Enabled": "Завжди синхронізувати дані користувача", "CAS_Sync_User_Data_Enabled_Description": "Завжди вхід у систему завжди синхронізувати зовнішні дані користувача CAS з доступними атрибутами. Примітка. Атрибути завжди синхронізуються після створення облікового запису.", "CAS_Sync_User_Data_FieldMap": "Карта атрибутів", - "CAS_Sync_User_Data_FieldMap_Description": "Використовуйте цей вхід JSON для побудови внутрішніх атрибутів (key) з зовнішніх атрибутів (value). Імена зовнішніх атрибутів, закріплені за допомогою '%', будуть інтерпольовані у рядках значень.
Наприклад, `{\" email \":\"% email% \",\" name \":\"% firstname%,% lastname% \"}`

Карта атрибутів завжди інтерполюється. У CAS 1.0 доступний лише атрибут `username`. Доступні внутрішні атрибути: ім'я користувача, ім'я, електронна адреса, номери; номери - це список, розділений комами, для приєднання до створення після створення користувача, наприклад: {\"rooms\": \"% team%,% department%\"} приєднається до користувачів CAS при створенні до їхньої команди та канал відділу.", + "CAS_Sync_User_Data_FieldMap_Description": "Використовуйте цей вхід JSON для побудови внутрішніх атрибутів (key) з зовнішніх атрибутів (value). Імена зовнішніх атрибутів, закріплені за допомогою '%', будуть інтерпольовані у рядках значень.
Наприклад, {\"email\":\"%email%\", \"name\":\"%firstname%, %lastname%\"}``

Карта атрибутів завжди інтерполюється. У CAS 1.0 доступний лише атрибут `username`. Доступні внутрішні атрибути: ім'я користувача, ім'я, електронна адреса, кімнати; кімнати - це список, розділений комами, для приєднання при створенні користувача, наприклад: {\"rooms\": \"%team%,%department%\"} створені користувачі CAS приєднаються до їхньої команди та каналу відділу.", "CAS_trust_username": "Ім'я користувача Trust CAS", "CAS_trust_username_description": "Якщо ввімкнено, Rocket.Chat буде довіряти тому, що будь-яке ім’я користувача CAS належить тому ж користувачеві на Rocket.Chat.
Це може знадобитися, якщо користувач перейменований на CAS, але може також дозволити людям взяти під контроль Rocket.Chat акаунти шляхом перейменування власних користувачів CAS.", "CAS_version": "Версія CAS", @@ -631,12 +642,13 @@ "Choose_messages": "Вибрати повідомлення", "Choose_the_alias_that_will_appear_before_the_username_in_messages": "Виберіть псевдонім, який буде відображатися перед ім'ям користувача в повідомленнях.", "Choose_the_username_that_this_integration_will_post_as": "Виберіть ім'я користувача, від якого будуть відправлятися повідомлення в цій інтеграції", - "clean-channel-history": "Чиста історія каналу", + "clean-channel-history": "Очистити історію каналу", "clean-channel-history_description": "Дозвіл очищення історії від каналів", "Clean_Usernames": "Очистити імена користувачів", "clear": "Ясно", "Clear_all_unreads_question": "Вилучити всі непрочитані?", "clear_cache_now": "Очистити кеш зараз", + "Clear_filters": "Очистити фільтри", "clear_history": "Чиста історія", "Click_here": "Натисніть тут", "Click_here_for_more_info": "Натисніть тут, щоб отримати додаткову інформацію", @@ -662,9 +674,15 @@ "Closing_chat": "закриття чату", "Cloud": "Хмара", "Cloud_Register_manually": "Реєстрація вручну", + "Cloud_click_here": "Після копіювання тексту перейдіть до хмарної консолі. [Натисніть тут]()", + "Cloud_register_offline_finish_helper": "ПІсля завершення процедури реєстрації у Cloud Console ви маєте побачити текст. Вставте цей текст сюди, щоб закінчити реєстрацію.", + "Cloud_register_offline_helper": "Якщо ваш доступ до мережі обмежено або застосовується фізична ізоляція мережі, робочі простори можна зареєструвати вручну. Скопіюйте текст, що його наведено нижче, та перейдіть до нашої консолі Cloud Console, щоб завершити процес.", + "Cloud_register_success": "Ваша робоча область успішно зареєстрована!", + "Cloud_register_error": "Під час обробки вашого запиту сталася помилка. Будь ласка, спробуйте пізніше.", "Cloud_connect": "З'єднання Rocket.Chat Cloud ", "Cloud_connect_support": "Якщо ви все ще не отримали електронний лист, будь ласка, переконайтеся, що ваша електронна адреса була оновлена вище. Якщо у вас все ще виникають проблеми, ви можете зв’язатися із службою підтримки", "Cloud_console": "Хмарна консоль", + "Cloud_Info": "Інформація про хмару", "Cloud_what_is_it": "Що це?", "Cloud_what_is_it_description": "З'єднання Rocket.Chat Cloud дозволяє підключити свою робочу область Rocket.Chat до послуг, які ми надаємо в нашій хмарі.", "Cloud_what_is_it_services_like": "Такі послуги, як:", @@ -994,6 +1012,7 @@ "Crowd_sync_interval_Description": "Інтервал між синхронізаціями. Приклад \"кожні 24 години\" або \"в перший день тижня\", інші приклади в [Cron Text Parser] (http://bunkat.github.io/later/parsers.html#text)", "Current_Chats": "поточні Чати", "Current_File": "Поточний файл", + "Current_Import_Operation": "Поточна операція імпорту", "Current_Status": "Поточний стан", "Custom": "Користувацький (кастомний)", "Custom CSS": "Користувацький CSS", @@ -1104,6 +1123,7 @@ "Desktop_Notifications_Not_Enabled": "Сповіщення на робочому столі вимкені", "Details": "Деталі", "Different_Style_For_User_Mentions": "Різний стиль для згадування користувачів", + "Direct_message_creation_description": "Ви збираєтеся створити чат із кількома користувачами. Додайте ті, з якими ви хотіли б поговорити, всіма у одному місці, використовуючи прямі повідомлення.", "Direct_message_someone": "Особисте спілкування з кимось", "Direct_Messages": "Особисті повідомлення", "Direct_Reply": "Особиста відповідь", @@ -1129,6 +1149,7 @@ "Disable_Facebook_integration": "Вимкнути інтеграцію в Facebook", "Disable_Notifications": "Вимкнути сповіщення", "Disable_two-factor_authentication": "Вимкнути двофакторну аутентифікацію", + "Disable_two-factor_authentication_email": "Вимкнути двофакторну аутентифікацію", "Disabled": "Вимкнено", "Disallow_reacting": "Заборонити реагування", "Disallow_reacting_Description": "Заборонено реагування", @@ -1161,12 +1182,16 @@ "Domains": "Домени", "Domains_allowed_to_embed_the_livechat_widget": "Список доменів, розділених комами, яким дозволено вставитляти віджети livechat. Залиште порожнім, щоб дозволити всі домени.", "Downloading_file_from_external_URL": "Завантаження із зовнішньої URL-адреси", + "Download_Info": "Інформація про завантаження", "Download_My_Data": "Завантажити мої дані", + "Download_Pending_Files": "Завантажити файли, що очікують", "Download_Snippet": "Завантажити", + "Do_not_provide_this_code_to_anyone": "Не надавати цей код нікому.", "Drop_to_upload_file": "Відкинути завантажений файл", "Dry_run": "Спробувати", "Dry_run_description": "Буде надіслано лише один лист на ту саму адресу, що і в \"Від\". Електронна адреса повинна належати дійсному користувачеві.", "duplicated-account": "Дублювання облікового запису", + "Duplicate_archived_channel_name": "Архівований Channel з ім’ям `#%s` вже існує", "Duplicate_archived_private_group_name": "Архівна приватна група з ім'ям ' %s' існує", "Duplicate_channel_name": "Канал з ім'ям '%s' існує", "Duplicated_Email_address_will_be_ignored": "Дубльовані електронні адреси будуть проігноровані.", @@ -1177,10 +1202,12 @@ "E2E_Enabled": "E2E увімкнено", "E2E_Enable_alert": "Ця функція наразі знаходиться в бета-версії!. Повідомляйте про помилки на github.com/RocketChat/Rocket.Chat/isissue і будьте в курсі:
- Зашифровані повідомлення зашифрованих кімнат не будуть знайдені пошуковими запитами.
- Мобільні програми можуть не підтримувати кодовані повідомлення (вони працюють над цим)
- Боти можуть не бачити зашифровані повідомлення, поки вони не реалізують підтримку
- Завантаження не будуть зашифровані у цій версії.", "E2E_Enable_description": "Увімкнути опцію для створення зашифрованих груп і мати можливість робити групи та особисті повідомлення зашифровании", + "E2E_Enabled_Default_PrivateRooms": "Увімкніть шифрування для приватних Room по замовчуванню", "E2E_Encryption_Password_Change": "Змінити пароль шифрування", "E2E_Encryption_Password_Explanation": "Тепер ви можете створювати зашифровані приватні групи та особистіі повідомлення. Також Ви можете змінити існуючі приватні групи або DM-файли на зашифровані.

З цієї причини Вам потрібно зберігати цей пароль десь у безпеці. Вам потрібно буде ввести його на інших пристроях, на яких ви хочете використовувати шифрування e2e.", "E2E_password_reveal_text": "Тепер ви можете створювати зашифровані приватні групи та прямі повідомлення. Ви також можете змінити існуючі приватні групи або DM-файли на зашифровані.

З цієї причини вам потрібно зберігати цей пароль десь у безпеці. Вам потрібно буде ввести його на інших пристроях, на яких ви хочете використовувати шифрування e2e. Детальніше тут

Ваш пароль: % s

Це автоматичний згенерований пароль, Ви можете встановити новий пароль для шифрування введіть будь-який час у будь-якому веб-переглядачі, який ви ввели існуючий пароль.
Цей пароль зберігається в цьому веб-переглядачі, поки ви не збережете пароль і не відхилите це повідомлення.", "E2E_password_request_text": "Щоб отримати доступ до своїх зашифрованих приватних груп та особистих повідомлень, введіть пароль шифрування.
Вам потрібно ввести цей пароль, щоб кодувати / декодувати Ваші повідомлення для кожного клієнта, який Ви використовуєте, оскільки ключ не зберігається на сервері.", + "E2E_Reset_Key_Explanation": "Ця опція видалить ваш поточний ключ E2E і вийде з системи.
Коли ви знову ввійдете в систему, Rocket.Chat згенерує для вас новий ключ і відновить ваш доступ до усіх зашифрованих кімнати, в яких є хоча б один учасник у стані онлайн.
Rocket.Chat не зможе відновити доступ до кімнат, в яких немає онлайн жодного учасника, бо цього не дозволяє природа шифрування E2E.", "Edit": "Редагувати", "Edit_Invite": "Редагувати запрошення", "Edit_Status": "Редагувати статус", @@ -1213,6 +1240,8 @@ "Email_already_exists": "Email вже існує", "Email_body": "Тіло електронної пошти", "Email_Change_Disabled": "Ваш Rocket.Chat адміністратор відключив можливість зміни електронної пошти", + "Email_Changed_Description": "Доступні такі заповнювачі:
  • [email] для електронної пошти користувача.
  • [Site_Name] та [Site_URL] для імені додатка та URL-адреси відповідно.
", + "Email_Changed_Email_Subject": "[Site_Name] - адресу електронної пошти було змінено", "Email_changed_section": "Адреса електронної пошти змінена", "Email_Footer_Description": "Ви можете використовувати наступні наповнювачі:
  • [Site_Name] і [Site_URL] для імені додатку і URL відповідно.
", "Email_from": "Від", @@ -1229,6 +1258,7 @@ "email_style_label": "Стиль листа", "email_style_description": "Уникайте вкладених селекторів", "Email_verified": "Електронну адресу підтверджено ", + "email_plain_text_only": "ВІдправляти лише текстові електронні листи", "Emoji": "Emoji", "Emoji_provided_by_JoyPixels": "Emoji надані JoyPixels", "EmojiCustomFilesystem": "Спеціальна файлова система Emoji", @@ -1236,8 +1266,10 @@ "Enable": "Увімкнути", "Enable_Auto_Away": "Увімкнути автоматичне відключення", "Enable_Desktop_Notifications": "Увімкнути сповіщення на робочому столі", + "Enable_inquiry_fetch_by_stream": "Увімкнути отримання даних запитів із сервера за допомогою потоку", "Enable_Svg_Favicon": "Увімкнути значок SVG", "Enable_two-factor_authentication": "Увімкнути двофакторну аутентифікацію", + "Enable_two-factor_authentication_email": "Увімкніть двофакторну автентифікацію електронною поштою", "Enabled": "Увімкнено", "Encrypted": "Зашифровано", "Encrypted_channel_Description": "Повністю зашифрований канал. Пошук не працюватиме із зашифрованими каналами, а сповіщення можуть не відображати вміст повідомлень.", @@ -1248,6 +1280,7 @@ "End_OTR": "Кнець ОТР", "Enter_a_name": "Введіть ім’я", "Enter_a_regex": "Введіть регулярний вираз", + "Enter_a_department_name": "Введіть назву відділу", "Enter_a_room_name": "Введіть назву кімнати", "Enter_a_username": "Введіть ім'я користувача", "Enter_a_tag": "Введіть тег", @@ -1268,6 +1301,7 @@ "error-archived-duplicate-name": "Вже є архівний канал з ім'ям '__room_name__'", "error-avatar-invalid-url": "Недійсна URL-адреса аватара: __url__", "error-avatar-url-handling": "Помилка при роботі установки аватара з URL (__url__) для __username__", + "error-cannot-delete-app-user": "Видалення користувача програми заборонено; щоб видалити користувача, видаліть відповідну програму.", "error-cant-invite-for-direct-room": "Не можна запрошувати користувача в особисті повідомленя", "error-channels-setdefault-is-same": "Стандартні налаштування каналу такі самі, як і змінені.", "error-channels-setdefault-missing-default-param": "BodyParam 'default' є обов'язковим", @@ -1296,6 +1330,7 @@ "error-invalid-channel-start-with-chars": "Недійсний канал. Почніть з @ або #", "error-invalid-custom-field": "Невірне користувацьке поле", "error-invalid-custom-field-name": "Неправильне ім'я, призначене користувацьому полю. Використовуйте тільки латинські букви, цифри, дефіс і підкреслення.", + "error-invalid-custom-field-value": "Неприпустиме значення для поля __field__", "error-invalid-date": "Вказана невірна дата ", "error-invalid-description": "Неправильне опис", "error-invalid-domain": "Недійсний домен", @@ -1305,6 +1340,7 @@ "error-invalid-file-type": "Невірний тип файлу", "error-invalid-file-width": "Неприпустима ширина файлу", "error-invalid-from-address": "Ви повідомили невірну адресу ВІД.", + "error-invalid-inquiry": "Недійсний запит", "error-invalid-integration": "Невірна інтеграція", "error-invalid-message": "Невірне повідомлення", "error-invalid-method": "Неприпустимий метод", @@ -1342,6 +1378,7 @@ "error-password-policy-not-met-repeatingCharacters": "Пароль не відповідає політиці сервера символів заборонених повторюваних символів (у вас занадто багато однакових символів поруч один з одним).", "error-push-disabled": "Push сповіщения вимнуті", "error-remove-last-owner": "Це останній власник. Будь ласка, встановіть нового власника, перш ніж видалити цього.", + "error-tags-must-be-assigned-before-closing-chat": "Перед тим, як закрити чат, необхідно призначити тег(и)", "error-role-in-use": "Неможливо видалити роль, тому що вона є у використанні", "error-role-name-required": "Потрібно вказати ім'я ролі ", "error-room-is-not-closed": "Кімната не закрита", @@ -1364,6 +1401,7 @@ "error-user-registration-disabled": "Реєстрація користувачів відключена", "error-user-registration-secret": "Реєстрація користувача допускається тільки за допомогою секретної URL", "error-you-are-last-owner": "Ви останній власник. Будь ласка, встановіть нового власника, перш ніж покинути кімнату.", + "error-starring-message": "Не вдалося позначити повідомлення зіркою", "Error_404": "Помилка: 404", "Error_changing_password": "Пароль змінено", "Error_loading_pages": "Помилка завантаження сторінок", @@ -1393,6 +1431,7 @@ "Execute_Synchronization_Now": "Виконати синхронізацію зараз", "Exit_Full_Screen": "Вихід із повноекранного режиму", "Expiration": "Термін дії", + "Expiration_(Days)": "Термін дії (днів)", "Export_My_Data": "Експорт моїх даних (JSON)", "expression": "Вираз", "Extended": "Розширений", @@ -1401,6 +1440,14 @@ "External_Service": "Зовнішній сервіс", "Facebook_Page": "Сторінка Facebook ", "Failed": "Помилка", + "Failed_to_activate_invite_token": "Не вдалося активувати маркер запрошення", + "Failed_To_Download_Files": "Не вдалося завантажити файли", + "Failed_to_generate_invite_link": "Не вдалося створити посилання із запрошенням", + "Failed_To_Load_Import_Data": "Не вдалося завантажити дані імпорту", + "Failed_To_Load_Import_History": "Не вдалося завантажити історію імпорту", + "Failed_To_Load_Import_Operation": "Не вдалося завантажити операцію імпорту", + "Failed_To_Start_Import": "Не вдалося запустити операцію імпорту", + "Failed_to_validate_invite_token": "Не вдалося перевірити маркер запрошення", "False": "Ні", "Favorite_Rooms": "Увімкнути улюблені кімнати", "Favorite": "Улюблений", @@ -1430,14 +1477,20 @@ "Field": "Поле", "Field_removed": "Поле видалено", "Field_required": "Поле обов'язкове", + "File": "Файл", + "File_Downloads_Started": "Розпочато завантаження файлів", "Files": "Файли", "File_exceeds_allowed_size_of_bytes": "Файл перевищує допустимий розмір __size__ ", "File_name_Placeholder": "Пошук файлів ...", "File_removed_by_automatic_prune": "Файл видалено автообрізчиком", "File_not_allowed_direct_messages": "Обмін файлами заборонено у приватних повідомленнях", "File_removed_by_prune": "Файл видалено за допомогою обрізки", + "File_Path": "Шлях до файлу", + "File_Type": "Тип файлу", "File_type_is_not_accepted": "Тип файлу не приймається.", "File_uploaded": "Файл завантажено", + "File_uploaded_successfully": "Файл успішно передано", + "File_URL": "URL-адреса файлу", "FileUpload": "Завантаження файлів", "FileUpload_Disabled": "Завантаження файлів відключено.", "FileUpload_Enabled": "Завантажених файлів Включено", @@ -1458,7 +1511,7 @@ "FileUpload_GoogleStorage_Proxy_Uploads": "Проксі завантажень", "FileUpload_GoogleStorage_Proxy_Uploads_Description": "Проксі-сервер завантажує файли через ваш сервер замість прямого доступу до URL-адреси ресурсу", "FileUpload_GoogleStorage_Secret": "Секретне сховище Google", - "FileUpload_GoogleStorage_Secret_Description": "Будь ласка, дотримуйтесь цих інструкційі вставте результат тут.", + "FileUpload_GoogleStorage_Secret_Description": "Будь ласка, дотримуйтесь цих інструкційі вставте результат отут.", "FileUpload_MaxFileSize": "Максимальний розмір завантажуваного файлу (в байтах)", "FileUpload_MaxFileSizeDescription": "Установіть його на -1, щоб видалити обмеження розміру файлу.", "FileUpload_MediaType_NotAccepted": "Типи файлів не приймаються", @@ -1539,6 +1592,7 @@ "Gaming": "Ігри", "General": "Загальні", "Get_link": "Отримати посилання", + "Generate_New_Link": "Створити нове посилання", "github_no_public_email": "У Вашому обліковому записі GitHub, відсутній публічний e-mail", "Give_a_unique_name_for_the_custom_oauth": "Дайте унікальне ім'я для призначеного користувача OAuth", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Дайте додатком ім'я. Це буде видно ваших користувачів.", @@ -1571,13 +1625,14 @@ "Graphql_Enabled": "GraphQL увімкнено", "Group_by_Type": "Групувати за типом", "Group_discussions": "Групові обговорення", - "Group_favorites": "Групи фаворитів", + "Group_favorites": "Групувати улюблене", "Group_mentions_disabled_x_members": "Група згадує `@ all 'і` @ here` була відключена для приміщень, де є більше __total__ членів.", - "Group_mentions_only": "Група згадує тільки", + "Group_mentions_only": "Тільки при згадках у групах", "Hash": "Хеш", "Header": "Заголовок", "Header_and_Footer": "Заголовок і нижній колонтитул", "Healthcare_and_Pharmaceutical": "Медицина / Фармацевтика", + "Here_is_your_authentication_code": "Ось ваш код автентифікації:", "Help_Center": "Центр допомоги", "Helpers": "Помічники", "Hex_Color_Preview": "Hex Color Preview", @@ -1589,7 +1644,7 @@ "Hide_Avatars_Sidebar": "Сховати аватари в бічній панелі", "Hide_counter": "Сховати лічильник", "Hide_flextab": "Сховати праву бічну панель за допомогою клацання", - "Hide_Group_Warning": "Ви впевнені, що ви хочете, щоб приховати групу \"%s\"?", + "Hide_Group_Warning": "Ви впевнені, що хочете приховати групу \"%s\"?", "Hide_Livechat_Warning": "Ви впевнені, що хочете сховати livechat за допомогою \"%s\"?", "Hide_Private_Warning": "Ви впевнені, що хочете приховати обговорення з \"%s\"?", "Hide_roles": "Сховати Ролі", @@ -1618,6 +1673,7 @@ "if_they_are_from": "(якщо вони від %s)", "If_this_email_is_registered": "Якщо ця електронна адреса зареєстрована, ми надішлемо інструкції щодо скидання пароля. Якщо ви не отримаєте електронного листа незабаром, будь ласка, поверніться і повторіть спробу.", "If_you_are_sure_type_in_your_password": "Якщо ви впевнені, введіть свій пароль:", + "Members_List": "Список учасників", "If_you_are_sure_type_in_your_username": "Якщо ви впевнені, введіть ваше ім'я користувача:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Якщо вам не потрібно надсилати електронного листа до [omni@rocket.chat] (mailto: omni@rocket.chat), щоб отримати вас.", "If_you_didnt_ask_for_reset_ignore_this_email": "Якщо Ви не просили скинути пароль, можете проігнорувати цей електронний лист.", @@ -1639,11 +1695,12 @@ "Images": "Зображення", "IMAP_intercepter_already_running": "Інтерфейтер IMAP вже працює", "IMAP_intercepter_Not_running": "Інтерфейс IMAP не працює", - "Impersonate_next_agent_from_queue": "Імпонуйте наступного агента з черги", + "Impersonate_next_agent_from_queue": "Використовуйте наступного представника з черги", "Impersonate_user": "Уособлення користувача", "Impersonate_user_description": "Після ввімкнення інтеграція надсилається від користувача, який ініціював інтеграцію", "Import": "Імпортувати", "Import_Type": "Тип імпорту", + "Import_New_File": "Імпорт нового файлу", "Importer_Archived": "Архівні", "Importer_CSV_Information": "Для імпортера CSV потрібен певний формат, будь ласка, прочитайте документацію про те, як структурувати файл zip:", "Importer_done": "Імпорт завершено!", @@ -1654,6 +1711,7 @@ "Importer_import_cancelled": "Імпорт скасований.", "Importer_import_failed": "Сталася помилка під час виконання імпорту.", "Importer_importing_channels": "Імпорт каналів.", + "Importer_importing_files": "Файли імпортуються.", "Importer_importing_messages": "Імпорт повідомлень.", "Importer_importing_started": "Запуск імпорту.", "Importer_importing_users": "Імпорт користувачів.", @@ -1667,18 +1725,29 @@ "Importer_setup_error": "Під час налаштування імпортера сталася помилка.", "Importer_Slack_Users_CSV_Information": "Завантажений файл повинен бути файлом експорту Користувачів Slack, який є файлом CSV. Дивіться тут, щоб отримати додаткову інформацію:", "Importer_Source_File": "Вибір вихідного файлу", + "importer_status_new": "Не розпочато", + "importer_status_uploading": "Передається файл", + "importer_status_downloading_file": "Завантажується файл", + "importer_status_preparing_started": "Читання файлів", + "importer_status_preparing_users": "Читання файлів користувачів", + "importer_status_importing_started": "Імпорт даних", "importer_status_importing_users": "Імпорт користувачів", "importer_status_importing_channels": "Імпорт каналів", + "importer_status_importing_files": "Імпорт файлів", "importer_status_importing_messages": "Імпорт повідомлень", "importer_status_finishing": "Майже зроблено", + "importer_status_done": "Завершено успішно", "importer_status_import_failed": "Помилка", + "importer_status_import_cancelled": "Скасовано", "Importer_Upload_FileSize_Message": "Налаштування вашого сервера дозволяють завантажувати файли розміром до __maxFileSize__.", "Importer_Upload_Unlimited_FileSize": "Налаштування вашого сервера дозволяють завантажувати файли будь-якого розміру.", "Importer_ExternalUrl_Description": "Ви також можете використовувати URL-адресу для загальнодоступного файлу:", "Importing_channels": "Імпорт каналів", + "Importing_Data": "Імпорт даних", "Importing_messages": "Імпорт повідомлень", "Importing_users": "Імпорт користувачів", "Inclusive": "Все включено", + "In_progress": "В процесі", "Incoming_Livechats": "Вхідні Livechats", "Incoming_WebHook": "Вхідний WebHook", "Include_Offline_Agents": "Включіть офлайн-агенти", @@ -1757,6 +1826,7 @@ "Invalid_Import_File_Type": "Невірний тип файлу імпорту.", "Invalid_name": "Ім'я має бути заповненим", "Invalid_notification_setting_s": "Неприпустима настройка сповіщення: %s", + "Invalid_or_expired_invite_token": "Маркер запрошення недійсний або термін його дії закінчився", "Invalid_pass": "Пароль не має бути пустим", "Invalid_reason": "Причина для приєднання не може бути порожньою", "Invalid_room_name": " %s не є дійсним номером імені", @@ -1769,6 +1839,7 @@ "Invitation_Email_Description": "Ви можете використовувати наступні наповнювачі:
  • [email] для електронної пошти одержувача.
  • [Site_Name] і [Site_URL] для імені додатки і URL відповідно.
", "Invitation_Subject": "запрошення Тема", "Invitation_Subject_Default": "Ви були запрошені [Site_Name]", + "Invite_Link": "Посилання із запрошенням", "Invite_user_to_join_channel": "Запросити одного користувача приєднатися до цього каналу", "Invite_user_to_join_channel_all_from": "Запросіть всіх користувачів з [#channel] приєднатися до цього каналу", "Invite_user_to_join_channel_all_to": "Запросити всіх користувачів із цього каналу приєднатися до [#channel]", @@ -1879,7 +1950,7 @@ "LDAP_Authentication": "Увімкнути", "LDAP_Authentication_Password": "Пароль", "LDAP_Authentication_UserDN": "Користувач DN", - "LDAP_Authentication_UserDN_Description": "Користувач LDAP, який виконує операцій пошуку користувачів для аутентифікації інших користувачів, коли вони підписують в.
Як правило, це обліковий запис служби, створена спеціально для сторонніх інтеграції. Використовуйте повне ім'я, наприклад `CN = Administrator, CN = Users, DC = Example, DC = com`.", + "LDAP_Authentication_UserDN_Description": "Користувач LDAP, який виконує операцій пошуку користувачів для аутентифікації інших користувачів при вході у систему
Як правило, це обліковий запис служби, створений спеціально для сторонніх інтеграції. Використовуйте повне ім'я, наприклад `cn=Administrator, cn=Users, dc=Example,dc=com`.", "LDAP_Background_Sync": "Фонова синхронізація", "LDAP_Background_Sync_Import_New_Users": "Фонова синхронізація імпортує нових користувачів", "LDAP_Background_Sync_Import_New_Users_Description": "Буде імпортованих всіх користувачів (на основі ваших критеріїв фільтра), які існують у LDAP і не існує в Rocket.Chat", @@ -1939,8 +2010,11 @@ "LDAP_Sync_User_Data_Description": "Зберігати дані користувача в синхронізації з сервером при вході в систему (наприклад: ім'я, адреса електронної пошти).", "LDAP_Sync_User_Data_FieldMap": "Дані користувача Карта Поле", "LDAP_Sync_User_Data_FieldMap_Description": "Налаштування, як поля облікових записів користувачів (наприклад, електронної пошти) заповнюються із запису в LDAP (колись знайшла).
Як приклад, `{\" сп \":\" ім'я \",\" пошта \":\" електронна пошта \"}` буде вибрати удобочитаем ім'я людини з атрибута CN, і їх електронну пошту від атрибута пошти.
Доступні поля включають `name` і` email`.", + "LDAP_Sync_User_Data_Groups": "Синхронізація груп LDAP", "manage-integrations": "Управління інтеграцією", + "LDAP_Sync_User_Data_Groups_AutoChannels": "Автоматична синхронізація груп LDAP до Channel", "manage-integrations_description": "Дозвіл керувати інтеграцією серверів", + "LDAP_Sync_User_Data_Groups_AutoChannels_Admin": "Адміністратор Channel", "LDAP_Sync_User_Data_Groups_AutoChannels_Admin_Description": "При автоматичному створенні каналів, які не існують під час синхронізації, цей користувач автоматично стає адміністратором каналу.", "manage-own-integrations": "Керування власними інтеграціями", "manage-own-integrations_description": "Permition, щоб дозволити користувачам створювати та редагувати власну інтеграцію або webhooks", @@ -1952,7 +2026,7 @@ "LDAP_Timeout": "Тайм-аут (мс)", "LDAP_Timeout_Description": "Скільки миль-секунд чекає результат пошуку перед тим, як повернути помилку", "LDAP_Unique_Identifier_Field": "Поле унікального ідентифікатора", - "LDAP_Unique_Identifier_Field_Description": "Яке поле буде використовуватися для з'єднання користувача LDAP і користувач Rocket.Chat. Ви можете повідомити кілька значень, розділених комою, щоб спробувати отримати значення з записи LDAP.
Значення за замовчуванням є `ObjectGUID, IBM-entryUUID, ідентифікатор GUID, dominoUNID, nsuniqueId, uidNumber`", + "LDAP_Unique_Identifier_Field_Description": "Яке поле використовувати для з'єднання користувача LDAP і користувача Rocket.Chat. Ви можете вказати декілька значень, розділених комою, щоб спробувати отримати значення зі записів LDAP.
Значення за замовчуванням є `objectGUID,ibm-entryUUID,GUID,dominoUNID,nsuniqueId,uidNumber`", "LDAP_User_Search_Field": "Поле пошуку", "LDAP_User_Search_Field_Description": "Атрибут LDAP, який ідентифікує користувача LDAP, який намагається аутентифікацію. Це поле повинно бути `sAMAccountName` для установки найбільш Active Directory, але це може бить` uid` для інших рішень LDAP, таких як OpenLDAP. Ви можете використовувати `mail` для ідентифікації користувачів по електронній пошті або будь-який інший атрибут ви хочете.
Можна використовувати декілька значень, розділених комами, щоб дозволити користувачам увійти в систему, використовуючи кілька ідентифікаторів, таких як ім'я користувача або адресу електронної пошти.", "LDAP_User_Search_Filter": "фільтр", @@ -1964,8 +2038,9 @@ "Lead_capture_phone_regex": "Провести захоплення телефону регулярним викликом", "leave-c": "Залишити канали", "leave-p": "Залишити приватні групи", + "Leave": "Залишити", "Leave_Group_Warning": "Ви впевнені, що хочете залишити групу \"%s\"?", - "Leave_Livechat_Warning": "Ви впевнені, що хочете залишити livechat за допомогою \"%s\"?", + "Leave_Livechat_Warning": "Ви впевнені, що хочете залишити livechat з \"%s\"?", "Leave_Private_Warning": "Ви впевнені, що хочете залишити обговорення з \"%s\"?", "Leave_room": "Покинути кімнату", "Leave_Room_Warning": "Ви впевнені, що хочете вийти з кімнати \"%s\"?", @@ -1996,6 +2071,9 @@ "Livechat_Take_Confirm": "Ви хочете взяти цей клієнт?", "Livechat_title": "Livechat Назва", "Livechat_title_color": "Livechat Назва Колір фону", + "Livechat_transfer_to_agent": "__from__ переніс чат __to__", + "Livechat_transfer_to_department": "__from__ переніс чат до відділу __to__", + "Livechat_transfer_return_to_the_queue": "__from__ повернув чат до черги", "Livechat_Users": "Livechat Користувачі", "Livestream_close": "Закрити Livestream", "Livestream_enable_audio_only": "Увімкнути лише звуковий режим", @@ -2005,6 +2083,7 @@ "Livestream_switch_to_room": "Переключитися на поточний канал в поточній кімнаті", "Livestream_url": "Джерело джерела посилання Livestream", "Livestream_url_incorrect": "URL-адреса Livestream неправильна", + "Load_Balancing": "Розподіл навантаження", "Load_more": "Показати більше", "Loading...": "Loading ...", "Loading_more_from_history": "Завантаження більше з історії", @@ -2030,6 +2109,10 @@ "Logistics": "Логістика", "Logout": "Вийти", "Logout_Others": "Вихід з інших Записаний в тих місцях,", + "Longest_chat_duration": "Тривалість найдовшого чату", + "Longest_reaction_time": "Найбільший час реакції", + "Longest_response_time": "Найдовший час відповіді", + "Logs": "Журнали", "mail-messages": "Поштові повідомлення", "mail-messages_description": "Дозвіл на використання опцій поштових повідомлень", "Mail_Message_Invalid_emails": "Ви надали один або кілька неприпустимих листів: %s", @@ -2037,6 +2120,7 @@ "Mail_Message_No_messages_selected_select_all": "Ви не обрали жодного повідомлення.", "Mail_Messages": "поштові повідомлення", "Mail_Messages_Instructions": "Виберіть, які повідомлення ви хочете відправити електронною поштою, натиснувши на повідомлення", + "Room_uploaded_file_list": "Список файлів", "Mail_Messages_Subject": "Ось обрана частина повідомлень %s", "Mailer": "розсилка", "Mailer_body_tags": "Ви повинні використовувати [unsubscribe] для відписку посилання.
Ви можете використовувати [name], [fname], [lname] повне ім'я користувача, ім'я або прізвище, відповідно.
Ви можете використовувати [email] для електронної пошти користувача.", @@ -2051,6 +2135,8 @@ "manage-emoji_description": "Дозвіл керувати emojis сервера", "manage-oauth-apps": "Керуйте програмами Oauth", "manage-oauth-apps_description": "Дозвіл керувати додатками сервера Oauth", + "manage-own-outgoing-integrations_description": "Досвіл користувачам створювати та редагувати власну інтеграцію чи webhook’и", + "manage-own-incoming-integrations_description": "Досвіл користувачам створювати та редагувати власну інтеграцію чи webhook’и", "manage-sounds": "Управління звуками", "manage-sounds_description": "Дозволено керувати звуком сервера", "manage-user-status": "Управління статусом користувача", @@ -2081,16 +2167,16 @@ "Markdown_SupportSchemesForLink": "Markdown Схеми підтримки для Link", "Markdown_SupportSchemesForLink_Description": "Розділених комами список дозволених схем", "Max_length_is": "Максимальна довжина %s", + "Max_number_incoming_livechats_displayed": "Максимальна кількість елементів, що відображаються у черзі", "Maximum": "Максимум", "Media": "Медіа", "Medium": "Середній", - "Members_List": "Список учасників", "mention-all": "Згадати все", "mention-all_description": "Дозвіл на використання @all згадки", "mention-here": "Згадаю тут", "mention-here_description": "Дозвіл на використання @here згадати", - "Mentions": "згадки", - "Mentions_default": "Згадки (за замовчуванням)", + "Mentions": "Згадки", + "Mentions_default": "Згадки (типово)", "Mentions_only": "Згадує тільки", "Merge_Channels": "Об'єднати канали", "Message_AllowBadWordsFilter": "Дозволити Повідомлення поганих слів фільтрації", @@ -2107,6 +2193,7 @@ "Message_AllowSnippeting": "Дозволити повідомлення Snippeting", "Message_AllowStarring": "Дозволити повідомлення ролях", "Message_AllowUnrecognizedSlashCommand": "Дозволити нерозпізнані командні слішки", + "Message_Already_Sent": "Це повідомлення вже надіслано та обробляється сервером", "Message_AlwaysSearchRegExp": "Завжди шукати за допомогою RegExp", "Message_AlwaysSearchRegExp_Description": "Ми рекомендуємо встановити `true` якщо ваша мова не підтримується на MongoDB пошуку тексту .", "Message_Attachments": "Додатки до повідомлення", @@ -2118,6 +2205,8 @@ "Message_AudioRecorderEnabled_Description": "Потрібно, щоб файли \"audio / mp3\" були прийнятими типом носіїв в \"Налаштування файлу\".", "Message_BadWordsFilterList": "Додати погані слова в чорний список", "Message_BadWordsFilterListDescription": "Додати список розділених комами список поганих слів, щоб фільтрувати", + "message_counter": "__counter__ повідомлення", + "message_counter_plural": "__counter__ повідомлень", "Message_DateFormat": "Формат дати", "Message_DateFormat_Description": "Дивіться також: Moment.js", "Message_deleting_blocked": "Це повідомлення не може бути видалено більше", @@ -2130,11 +2219,15 @@ "Message_GlobalSearch": "Глобальний пошук", "Message_GroupingPeriod": "Угруповання Період (у секундах)", "Message_GroupingPeriodDescription": "Повідомлення будуть згруповані з попереднім повідомленням, якщо обидва з того ж користувача і минулий час було менше, ніж усвідомленого часу в секундах.", + "Message_has_been_starred": "Повідомлення було позначено зірочкою", + "Message_has_been_unstarred": "З повідомлення було знято позначку-зірочку", "Message_HideType_au": "Сховати повідомлення \"Додано користувачем\"", "Message_HideType_mute_unmute": "Сховати повідомлення \"User Muted / Unmuted\"", "Message_HideType_ru": "Сховати повідомлення \"Видалений користувач\"", "Message_HideType_uj": "Сховати повідомлення \"Користувач приєднатися\"", "Message_HideType_ul": "Сховати повідомлення \"User Leave\"", + "Message_HideType_r": "Приховати повідомлення \"Ім’я Room змінилося\"", + "Message_HideType_ut": "Приховати повідомлення \"Користувач приєднався до розмови\"", "Message_Ignored": "Це повідомлення було проігноровано", "Message_info": "Інформація про повідомлення", "Message_KeepHistory": "Зберігати історію повідомлень", @@ -2205,7 +2298,7 @@ "N_new_messages": "%s нових повідомлень", "Name": "Ім'я", "Name_cant_be_empty": "Ім'я не може бути порожнім", - "Name_of_agent": "ім'я агента", + "Name_of_agent": "Ім'я представника", "Name_optional": "Ім'я (не обов'язково)", "Name_Placeholder": "Будь ласка, введіть своє ім'я ...", "Navigation_History": "Історія навігації", @@ -2251,7 +2344,8 @@ "No_starred_messages": "Немає позначених повідомлень", "No_such_command": "Немає такої команди: `/ __command__`", "No_discussions_yet": "Обговорень поки що немає", - "No_user_with_username_%s_was_found": "Ні один користувач з ім'ям користувача \"%s\" не було знайдено!", + "No_Threads": "Тем не знайдено", + "No_user_with_username_%s_was_found": "Жодного користувача з логіном\"%s\" не знайдено!", "Nobody_available": "Ніхто не доступний", "Node_version": "Версія вузла", "None": "Ні", @@ -2261,6 +2355,7 @@ "Not_Available": "Недоступний", "Not_found_or_not_allowed": "Відсутній, або доступ заборонено", "Not_following": "Не відслідковую", + "Not_started": "Не ", "Nothing": "нічого", "Nothing_found": "Нічого не знайдено ", "Notification_Desktop_Default_For": "Показати робочі сповіщення для", @@ -2304,7 +2399,7 @@ "Online": "Онлайн", "online": "онлайн", "Only_authorized_users_can_write_new_messages": "Тільки авторизовані користувачі можуть писати нові повідомлення", - "Only_from_users": "Тільки скасувати вміст цих користувачів (залиште порожнім, щоб обрізати вміст кожного).", + "Only_from_users": "Видаляти повідомлення від цих користувачів (залиште порожнім, щоб видалити повідомлення від усіх).", "Only_On_Desktop": "Режим настільного ПК (надсилається лише з введенням на робочому столі)", "Only_works_with_chrome_version_greater_50": "Працює тільки з версіями браузера Chrome > 50", "Only_you_can_see_this_message": "Лише ви можете бачити це повідомлення", @@ -2346,6 +2441,7 @@ "Override_URL_to_which_files_are_uploaded_This_url_also_used_for_downloads_unless_a_CDN_is_given": "Override URL, до якого файли завантажуються. Цей URL-адресу також використовується для завантаження, якщо тільки в CDN дається", "Page_title": "Назва сторінки", "Page_URL": "URL-адреса сторінки", + "Parent_channel_doesnt_exist": "Channel не існує.", "Password": "Пароль", "Password_Change_Disabled": "Ваш Rocket.Chat адміністратор відключив зміна паролів", "Password_changed_successfully": "Пароль успішно змінений", @@ -2357,9 +2453,10 @@ "Permissions": "Дозволи", "Personal_Access_Tokens": "Токени особистого доступу", "Phone_number": "Номер телефону", + "Pin": "Закріпити", "pin-message": "Pin повідомлення", "pin-message_description": "Дозвіл на друк повідомлення в каналі", - "Pin_Message": "Pin Message", + "Pin_Message": "Закріпити повідомлення", "Pinned_a_message": "Закріплені повідомлення:", "Pinned_Messages": "закріплені повідомлення", "PiwikAdditionalTrackers": "Додаткові сайти сайту Piwik", @@ -2410,7 +2507,7 @@ "Privacy_Policy": "Політика конфіденційності", "Private": "приватний", "Private_Channel": "Приватний канал", - "Private_Group": "рядовий Група", + "Private_Group": "Приватна група", "Private_Groups": "Приватні Групи", "Private_Groups_list": "Список приватних груп", "Private_Team": "Приватна команда", @@ -2456,7 +2553,7 @@ "Query_description": "Додаткові умови для визначення того, які користувачі можуть надіслати електронною поштою. Непідписаних користувачі автоматично видаляються з запиту. Він повинен бути дійсним в форматі JSON. Приклад: \"{\" createdAt \": {\" $ GT \": {\" дата $ \":\" 2015-01-01T00: 00: 00.000Z \"}}}\"", "Queue": "Черга", "quote": "цитата", - "Quote": "котирування", + "Quote": "Цитувати", "Random": "випадковий", "RDStation_Token": "Токен RD Station", "React_when_read_only": "Дозволити реагування", @@ -2503,11 +2600,11 @@ "Remove": "Вилучити", "remove-user": "Видалити користувача", "remove-user_description": "Дозвіл на видалення користувача з кімнати", - "Remove_Admin": "видалити Адміністратор", + "Remove_Admin": "Видалити адміністратор", "Remove_as_leader": "Видалити як лідера", - "Remove_as_moderator": "Видалити в якості модератора", - "Remove_as_owner": "Видалити в якості власника", - "Remove_custom_oauth": "Видалити користувача OAuth", + "Remove_as_moderator": "Видалити з модераторів", + "Remove_as_owner": "Видалити зі власників", + "Remove_custom_oauth": "Видалити користувацький OAuth", "Remove_from_room": "Видалити з кімнати", "Remove_last_admin": "Видалення останнього адміністратора", "Remove_someone_from_room": "Видалити когось із кімнати", @@ -2515,12 +2612,16 @@ "Removed_User": "Видалений користувач", "Reply": "Відповідь", "reply_counter": "__counter__ відповідь", + "Reply_in_thread": "Відповісти у темі", + "Reply_in_direct_message": "Відповісти в особистому повідомленні", "ReplyTo": "Відповідати на", - "Report_Abuse": "Повідомити про зловживання", - "Report_exclamation_mark": "Звіт!", - "Report_sent": "звіт відправлений", - "Report_this_message_question_mark": "Повідомити про це повідомлення?", + "Report": "Поскаржитись", + "Report_Abuse": "Повідомити про порушення", + "Report_exclamation_mark": "Повідомити!", + "Report_sent": "Звіт відправлено", + "Report_this_message_question_mark": "Поскаржитись на це повідомлення?", "Reporting": "Звітність", + "Request_comment_when_closing_conversation_description": "Якщо ввімкнено, представнику потрібно буде додати коментар до завершення розмови.", "Require_all_tokens": "Вимагати всіх токенів", "Require_any_token": "Вимагати будь-який токен", "Require_password_change": "Вимагати зміни пароля", @@ -2592,7 +2693,6 @@ "Room_type_changed_successfully": "Тип номера успішно змінений", "Room_type_of_default_rooms_cant_be_changed": "Це номер за замовчуванням, і тип не може бути змінений, будь ласка, зверніться до свого адміністратора.", "Room_unarchived": "номер розархівувати", - "Room_uploaded_file_list": "список файлів", "Room_uploaded_file_list_empty": "Немає доступних файлів.", "Rooms": "кімнати", "run-import": "Запустити імпорт", @@ -2782,8 +2882,9 @@ "Sound": "звук", "Sound_File_mp3": "Звуковий файл (mp3)", "SSL": "SSL", - "Star_Message": "зірка повідомлення", - "Starred_Messages": "помічені повідомлення", + "Star": "Вибране", + "Star_Message": "Вибрати повідомлення", + "Starred_Messages": "Повідомлення із зірочкою", "Start": "Почати", "Start_audio_call": "Початок аудіо виклику", "Start_Chat": "Почати Чат", @@ -2801,7 +2902,7 @@ "Statistics_reporting_Description": "Відправляючи свою статистику, ви допоможете нам визначити, скільки примірників Rocket.Chat розгорнуті, а також наскільки добре поводиться система, таким чином, ми можемо додатково поліпшити його. Не турбуйтеся, оскільки ніякої інформації про користувача не передається і вся інформація, ми отримуємо конфіденційна.", "Stats_Active_Users": "активні користувачі", "Stats_Avg_Channel_Users": "Середні каналу користувачів", - "Stats_Avg_Private_Group_Users": "Середні Приватні групи користувачів", + "Stats_Avg_Private_Group_Users": "Середнє число користувачів в приватних групах", "Stats_Away_Users": "Away Користувачі", "Stats_Max_Room_Users": "Кількість кімнат користувачів", "Stats_Non_Active_Users": "неактивні Користувачі", @@ -2864,7 +2965,7 @@ "The_server_will_restart_in_s_seconds": "Сервер буде перезавантажений через %s секунд", "The_setting_s_is_configured_to_s_and_you_are_accessing_from_s": "Параметр %s налаштований на %s , і ви звертаєтеся з %s!", "The_user_will_be_removed_from_s": "Користувач буде видалений з %s", - "The_user_wont_be_able_to_type_in_s": "Користувач не зможе ввести в %s", + "The_user_wont_be_able_to_type_in_s": "Користувач не зможе писати в %s", "Theme": "тема", "theme-color-component-color": "Колір компонента", "theme-color-content-background-color": "Зміст Колір фону", @@ -2922,6 +3023,7 @@ "This_is_a_push_test_messsage": "Це поштовх тест messsage", "This_room_has_been_archived_by__username_": "Цей номер був архівуються __username__", "This_room_has_been_unarchived_by__username_": "Цей номер був Розархівувати по __username__", + "Threads": "Теми", "This_agent_was_already_selected": "Цей співробітник вже обраний", "This_week": "Цього тижня", "Thursday": "четвер", @@ -2955,6 +3057,7 @@ "Total_abandoned_chats": "Всього покинутих чатів", "Total_Discussions": "Всього обговорень", "Total_messages": "всього повідомлень", + "Total_Threads": "Всього тем", "Tourism": "Туризм", "Transcript_Enabled": "Попросіть відвідувачів, чи хотіли б вони стенограму після того, як чат був закритий", "Transcript_message": "Повідомлення для показу при запиті про транскрипт", @@ -2967,6 +3070,7 @@ "Trigger_Words": "слова запуску", "Triggers": "Тригери", "True": "Так", + "Troubleshoot_Disable_Notifications": "Вимкнути сповіщення", "Tuesday": "Вівторок", "Turn_OFF": "Вимкнути", "Turn_ON": "Ввімкнути", @@ -3002,7 +3106,7 @@ "Uninstall": "Видалити", "Unlimited": "Необмежений", "Unmute_someone_in_room": "Unmute хтось в кімнаті", - "Unmute_user": "Unmute користувач", + "Unmute_user": "Дозволити писати користувачу", "Unnamed": "неназваний", "Unpin": "Відкріплено", "Unpin_Message": "Відкріпити закріплене повідомлення", @@ -3040,26 +3144,27 @@ "Use_User_Preferences_or_Global_Settings": "Використовувати параметри користувача або загальні налаштування", "User": "Користувач", "User Search": "Пошук користувачів", + "User Search (Group Validation)": "Пошук користувачів (перевірка групи)", "user-generate-access-token": "Користувач генерує токен доступу", "user-generate-access-token_description": "Дозвіл для користувачів створювати токени доступу", "User__username__is_now_a_leader_of__room_name_": "Користувач __username__ тепер лідер __room_name__", "User__username__is_now_a_moderator_of__room_name_": "Користувач __username__ тепер модератор __room_name__", "User__username__is_now_a_owner_of__room_name_": "Користувач __username__ тепер власник __room_name__", "User__username__removed_from__room_name__leaders": "Користувача __username__ видалено з лідерів __room_name__ ", - "User__username__removed_from__room_name__moderators": "__username__ Користувач вилучений з __room_name__ модераторів", - "User__username__removed_from__room_name__owners": "__username__ Користувач вилучений з __room_name__ власників", + "User__username__removed_from__room_name__moderators": "__username__ Користувач вилучений з модераторів __room_name__ ", + "User__username__removed_from__room_name__owners": "__username__ Користувач вилучений з власників __room_name__ ", "User_added": "Користувача додано", "User_added_by": "Користувач __user_added__ доданий __user_by__.", - "User_added_successfully": "Користувач доданий успішно", + "User_added_successfully": "Користувач успішно доданий", "User_and_group_mentions_only": "Користувач і група згадують лише", "User_default": "Користувач за умовчанням", - "User_doesnt_exist": "Жоден користувач не існує під ім'ям @ `%s`.", + "User_doesnt_exist": "Не існує користувача з ім'ям `@%s`.", "User_e2e_key_was_reset": "Ключ користувача E2E був успішно скинутий.", - "User_has_been_activated": "Користувач активований", - "User_has_been_deactivated": "Користувач деактивовано", + "User_has_been_activated": "Користувач був активований", + "User_has_been_deactivated": "Користувача було деактивовано", "User_has_been_deleted": "Користувач вилучений", "User_has_been_ignored": "Користувача було проігноровано", - "User_has_been_muted_in_s": "Користувач був відключений в %s", + "User_has_been_muted_in_s": "Користувач був приглушений в %s", "User_has_been_removed_from_s": "Користувач був видалений з %s", "User_has_been_unignored": "Користувач більше не ігнорується", "User_Info": "Інформація про користувача", @@ -3073,25 +3178,25 @@ "User_joined_channel_female": "Приєднався до каналу.", "User_joined_channel_male": "Приєднався до каналу.", "User_left": "Пішла канал.", - "User_left_female": "Пішла канал.", - "User_left_male": "Пішла канал.", - "User_logged_out": "Користувач вийшов з системи", + "User_left_female": "Користувач залишив канал", + "User_left_male": "Користувач залишив канал", + "User_logged_out": "Користувач вийшов ", "User_management": "управління користувачами", "User_mentions_only": "Користувач згадує лише", "User_muted": "Користувач гудев", "User_muted_by": "__user_muted__ Користувача приглушені __user_by__.", - "User_not_found": "Користувач не знайдений", - "User_not_found_or_incorrect_password": "Користувач не знайдений або неправильний пароль", + "User_not_found": "Користувача не знайдено", + "User_not_found_or_incorrect_password": "Користувач не знайдений або введено неправильний пароль", "User_or_channel_name": "Користувач або назва каналу", "User_Presence": "Присутність користувача", "User_removed": "Користувач вилучений", - "User_removed_by": "Користувач __user_removed__вилучений __user_by__.", + "User_removed_by": "Користувач __user_removed__ вилучений __user_by__.", "User_sent_a_message_on_channel": "__username__надіслало повідомлення на __channel__", "User_sent_a_message_to_you": "__username__надіслав вам повідомлення", "user_sent_an_attachment": "__user__ надіслав вкладення", "User_Settings": "налаштування користувача", "User_unmuted_by": "__user_unmuted__ Користувача заглушені по __user_by__.", - "User_unmuted_in_room": "Користувач заглушені в кімнаті", + "User_unmuted_in_room": "Користувач перестав бути заглушені в кімнаті", "User_updated_successfully": "Користувач успішно оновлений", "User_uploaded_a_file_on_channel": "__username__завантажив файл на __channel__", "User_uploaded_a_file_to_you": "__username__надіслав вам файл", @@ -3128,6 +3233,7 @@ "Users_added": "Користувачів додано", "Users_in_role": "Користувачі в ролі", "Users must use Two Factor Authentication": "Користувачі повинні використовувати двофакторну автентифікацію", + "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "Залиште поле опису порожнім, якщо ви не хочете показувати роль", "Uses": "Використання", "UTF8_Names_Slugify": "UTF8 Імена Slugify", "UTF8_Names_Validation": "UTF8 Імена Validation", @@ -3217,8 +3323,8 @@ "WebRTC_Enable_Channel": "Включити для загальнодоступних каналів", "WebRTC_Enable_Direct": "Включити для прямих повідомлень", "WebRTC_Enable_Private": "Включити для приватних каналів", - "WebRTC_group_audio_call_from_%s": "Груповий звуковий виклик від %s", - "WebRTC_group_video_call_from_%s": "Груповий відеодзвінок від %s", + "WebRTC_group_audio_call_from_%s": "Груповий аудіо дзвінок від% s", + "WebRTC_group_video_call_from_%s": "Груповий відео дзвінок від %s", "WebRTC_monitor_call_from_%s": "Відстежує виклик від %s", "WebRTC_Servers": "STUN / TURN Сервери", "WebRTC_Servers_Description": "Список STUN і ПОВОРОТНИХ серверів, розділених комою.
Ім'я користувача, пароль і порт дозволені в форматі `ім'я користувача: пароль @ оглушення: хост: port` або` ім'я користувача: пароль @ поворот: господар: port`.", @@ -3227,7 +3333,7 @@ "Welcome": "Вітаємо, %s.", "Welcome_to": "Ласкаво просимо до [Site_Name]", "Welcome_to_the": "Ласкаво просимо в", - "Why_do_you_want_to_report_question_mark": "Чому ви хочете повідомити?", + "Why_do_you_want_to_report_question_mark": "Про що ви хочете сповістити?", "will_be_able_to": "зможуть", "Worldwide": "Світовий", "Would_you_like_to_return_the_inquiry": "Ви хотіли б повернути запит?", @@ -3237,8 +3343,8 @@ "Yes_clear_all": "Так, зрозуміло, все!", "Yes_delete_it": "Так, видалити!", "Yes_hide_it": "Так, це приховати!", - "Yes_leave_it": "Так, залиште його!", - "Yes_mute_user": "Так, відключення звуку користувач!", + "Yes_leave_it": "Так, залишити!", + "Yes_mute_user": "Так, приглушити користувача!", "Yes_prune_them": "Так, обріжте їх!", "Yes_remove_user": "Так, видалити користувача!", "Yes_unarchive_it": "Так, архівувати це!", @@ -3253,7 +3359,7 @@ "You_can_search_using_RegExp_eg": "Ви можете здійснювати пошук, використовуючиРегулярний вираз наприклад, /^text$/i", "You_can_use_an_emoji_as_avatar": "Ви можете також використовувати смайлик в якості аватара.", "You_can_use_webhooks_to_easily_integrate_livechat_with_your_CRM": "Ви можете використовувати webhooks легко інтегрувати з LiveChat CRM.", - "You_cant_leave_a_livechat_room_Please_use_the_close_button": "Ви не можете залишити Livechat кімнату. Будь ласка, використовуйте кнопку закриття.", + "You_cant_leave_a_livechat_room_Please_use_the_close_button": "Ви не можете залишити Livechat кімнату. Будь ласка, використовуйте кнопку закрити.", "You_have_been_muted": "Ви були відключені і не можуть говорити в цій кімнаті", "You_have_n_codes_remaining": "Ви залишили __number__ коди.", "You_have_not_verified_your_email": "Ви не підтвердили свою електронну пошту.", diff --git a/packages/rocketchat-i18n/i18n/vi-VN.i18n.json b/packages/rocketchat-i18n/i18n/vi-VN.i18n.json index 67bbbd8403c4..1bb8b87b8fee 100644 --- a/packages/rocketchat-i18n/i18n/vi-VN.i18n.json +++ b/packages/rocketchat-i18n/i18n/vi-VN.i18n.json @@ -1289,6 +1289,7 @@ "if_they_are_from": "(nếu chúng đến từ %s)", "If_this_email_is_registered": "Nếu email này đã được đăng ký, chúng tôi sẽ gửi hướng dẫn về cách đặt lại mật khẩu của bạn. Nếu bạn không nhận được email sớm, vui lòng quay lại và thử lại.", "If_you_are_sure_type_in_your_password": "Nếu bạn chắc chắn nhập vào mật khẩu của mình:", + "Members_List": "Danh sách thành viên", "If_you_are_sure_type_in_your_username": "Nếu bạn chắc chắn nhập vào tên người dùng của mình:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "Nếu bạn không có hãy gửi email tới [omni@rocket.chat] (mailto: omni@rocket.chat) để lấy.", "Iframe_Integration": "Tích hợp Iframe", @@ -1661,6 +1662,7 @@ "Mail_Message_No_messages_selected_select_all": "Bạn chưa chọn bất kỳ tin nhắn nào", "Mail_Messages": "Mail tin nhắn", "Mail_Messages_Instructions": "Chọn tin nhắn bạn muốn gửi qua email bằng cách nhấp vào các tin nhắn", + "Room_uploaded_file_list": "Danh sách tập tin", "Mail_Messages_Subject": "Đây là một phần được chọn của%s tin nhắn", "Mailer": "Mailer", "Mailer_body_tags": "Bạn phải sử dụng [hủy đăng ký] đối với liên kết bỏ đăng ký.
Bạn có thể sử dụng [name], [fname], [lname] cho tên, họ hoặc họ của người dùng, tương ứng.
Bạn có thể sử dụng [email] cho email của người dùng.", @@ -1702,7 +1704,6 @@ "Max_length_is": "Chiều dài tối đa là%s", "Media": "Truyền thông", "Medium": "Trung bình", - "Members_List": "Danh sách thành viên", "mention-all": "Đề cập Tất cả", "mention-all_description": "Cho phép sử dụng @all đề cập đến", "mention-here": "Đề cập ở đây", @@ -2203,7 +2204,6 @@ "Room_type_changed_successfully": "Đã thay đổi loại phòng thành công", "Room_type_of_default_rooms_cant_be_changed": "Đây là phòng mặc định và loại không thể thay đổi, vui lòng tham khảo ý kiến ​​của quản trị viên.", "Room_unarchived": "Phòng chưa lưu trữ", - "Room_uploaded_file_list": "Danh sách tập tin", "Room_uploaded_file_list_empty": "Không có tệp nào.", "Rooms": "Phòng", "run-import": "Chạy Nhập khẩu", @@ -2558,6 +2558,7 @@ "Trigger_Words": "Những từ kích hoạt", "Triggers": "Gây nên", "True": "Có", + "Troubleshoot_Disable_Notifications": "Vô hiệu hóa thông báo", "Tuesday": "Thứ ba", "Turn_OFF": "Tắt", "Turn_ON": "Bật", diff --git a/packages/rocketchat-i18n/i18n/zh-HK.i18n.json b/packages/rocketchat-i18n/i18n/zh-HK.i18n.json index 13550adaac49..36489d72a17e 100644 --- a/packages/rocketchat-i18n/i18n/zh-HK.i18n.json +++ b/packages/rocketchat-i18n/i18n/zh-HK.i18n.json @@ -1320,6 +1320,7 @@ "if_they_are_from": "(如果他们来自%s)", "If_this_email_is_registered": "如果此电子邮件已注册,我们将发送有关如何重置密码的说明。如果您很短时间内没有收到电子邮件,请返回并重试。", "If_you_are_sure_type_in_your_password": "如果您确定输入您的密码:", + "Members_List": "成员列表", "If_you_are_sure_type_in_your_username": "如果您确定输入您的用户名:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "如果你没有发送邮件到[omni@rocket.chat](mailto:omni@rocket.chat)来获得你的邮件。", "Iframe_Integration": "Iframe集成", @@ -1693,6 +1694,7 @@ "Mail_Message_No_messages_selected_select_all": "你没有选择任何消息", "Mail_Messages": "邮件消息", "Mail_Messages_Instructions": "通过单击邮件选择要通过电子邮件发送的邮件", + "Room_uploaded_file_list": "文件列表", "Mail_Messages_Subject": "这是%s消息的选定部分", "Mailer": "信封", "Mailer_body_tags": "必须对取消订阅链接使用[取消订阅]。
您可以分别为用户的全名,名字或姓氏使用[name],[fname],[lname]。
您可以将[email]用于用户的电子邮件。", @@ -1734,7 +1736,6 @@ "Max_length_is": "最大长度是%s", "Media": "媒体", "Medium": "中", - "Members_List": "成员列表", "mention-all": "提及所有", "mention-all_description": "允许使用@all提到", "mention-here": "在此提及", @@ -2230,7 +2231,6 @@ "Room_type_changed_successfully": "房间类型已成功更改", "Room_type_of_default_rooms_cant_be_changed": "这是一个默认房间,类型不能更改,请咨询您的管理员。", "Room_unarchived": "房间unarchived", - "Room_uploaded_file_list": "文件列表", "Room_uploaded_file_list_empty": "没有可用的文件。", "Rooms": "房间", "run-import": "运行导入", @@ -2589,6 +2589,7 @@ "Trigger_Words": "触发词", "Triggers": "触发器", "True": "是", + "Troubleshoot_Disable_Notifications": "禁用通知", "Tuesday": "星期二", "Turn_OFF": "关掉", "Turn_ON": "打开", diff --git a/packages/rocketchat-i18n/i18n/zh-TW.i18n.json b/packages/rocketchat-i18n/i18n/zh-TW.i18n.json index cdd9f5d457fa..2bd6a4d2b727 100644 --- a/packages/rocketchat-i18n/i18n/zh-TW.i18n.json +++ b/packages/rocketchat-i18n/i18n/zh-TW.i18n.json @@ -99,6 +99,7 @@ "Accounts_OAuth_Custom_Token_Path": "Token 路徑", "Accounts_OAuth_Custom_Token_Sent_Via": "Token發送自", "Accounts_OAuth_Custom_Username_Field": "使用者名稱欄位", + "Accounts_OAuth_Custom_Email_Field": "電子郵件欄位", "Accounts_OAuth_Custom_Name_Field": "名稱欄位", "Accounts_OAuth_Custom_Roles_Claim": "角色/群組欄位名稱", "Accounts_OAuth_Custom_Merge_Roles": "從 SSO 整合身份", @@ -203,16 +204,33 @@ "Accounts_Directory_DefaultView": "預設目錄列表", "Accounts_SetDefaultAvatar": "設定預設大頭貼", "Accounts_SetDefaultAvatar_Description": "嘗試根據OAuth帳戶或Gravatar確定默認頭像", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "將外部帳號的電子郵件設定為已驗證", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "從外部服務(例如LDAP,OAth等)建立的帳號將自動驗證其電子郵件", "Accounts_ShowFormLogin": "顯示表單形式的登入畫面", - "Accounts_TwoFactorAuthentication_Enabled": "啟用2步驟驗證", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "透過電子郵件啟用2步驟驗證", + "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "驗證了電子郵件且在其個人資料頁面中啟用了該選項的使用者將收到一封帶有臨時代碼的電子郵件,以授權某些操作,例如登入,保存個人資料等。", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "透過電子郵件自動為新使用者選擇2步驟", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "預設情況下,新使用者將啟用透過電子郵件的2步驟驗證。他們將能夠在其個人資料頁面中將其停用。", + "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "時間以秒為單位透過電子郵件發送的代碼到期", + "Accounts_TwoFactorAuthentication_Enabled": "透過 TOTP 啟用2步驟驗證", + "Accounts_TwoFactorAuthentication_Enabled_Description": "使用者可以使用任何 TOTP 應用程式(例如Google Authenticator或Authy)設定2步驟驗證", "Accounts_TwoFactorAuthentication_MaxDelta": "最大Delta", "Accounts_UserAddedEmail_Default": "

歡迎來到[Site_Name]

轉到[Site_URL],並嘗試了當今最先進的開源聊天解決方案!

您可以登陸使用您的電子郵件:[email]和密碼:[password]。您可能需要您首次登錄後更改。", "Accounts_TwoFactorAuthentication_MaxDelta_Description": "最大增量確定在任何給定時間有多少令牌有效。令牌每30秒產生一次,並且對於(30 *最大增量)秒有效。
示例:將最大差值設置為10時,每個令牌可以在時間戳之前或之後使用達300秒。當客戶端的時鐘與服務器沒有正確同步時,這很有用。", + "Accounts_TwoFactorAuthentication_RememberFor": "記住2步驟(秒)", + "Accounts_TwoFactorAuthentication_RememberFor_Description": "如果在指定時間內之前已經提供過,請不要索取2步驟授權碼。", "Accounts_UseDefaultBlockedDomainsList": "使用預設的封鎖網域列表", "Accounts_UseDNSDomainCheck": "使用DNS網域查詢", "Accounts_UserAddedEmailSubject_Default": "您已被新增至 [Site_Name]", "Accounts_UserAddedEmail_Description": "您可以使用以下佔位符:

  • [name],[fname],[lname]為用戶的全名,名字或姓氏,分別。
  • [email]為用戶的電子郵件。
  • [password]為用戶的密碼。
  • [Site_Name]和[Site_URL]分別為應用程序的名稱和網址。
", "Activate": "啟用", + "Active_users": "活躍的使用者", + "Daily_Active_Users": "每日活躍的使用者", + "Weekly_Active_Users": "每週活躍的使用者", + "Monthly_Active_Users": "每月活躍的使用者", + "DAU_value": "DAU __value__", + "WAU_value": "WAU __value__", + "MAU_value": "MAU __value__", "Activity": "活動記錄", "Add": "新增", "add-oauth-service": "新增 Oauth 服務", @@ -235,6 +253,7 @@ "Add_user": "新增使用者", "Add_User": "新增使用者", "Add_users": "新增使用者", + "Add_Reaction": "新增反應", "Adding_OAuth_Services": "正在新增 OAuth 服務", "Adding_permission": "正在新增權限", "Adding_user": "正在新增使用者", @@ -335,11 +354,14 @@ "API_Personal_Access_Tokens_Regenerate_It": "重新產生 token", "API_Shield_Types": "保護類型", "API_Shield_Types_Description": "屏蔽類型以逗號分隔列表形式啟用,可以從“在線”,“頻道”或“*”中為所有人選擇", + "API_Shield_user_require_auth": "為了保護使用者所以必須驗證", "API_Token": "API Token", "API_Tokenpass_URL": "Tokenpass 伺服器網址", "API_Tokenpass_URL_Description": "例如:https://domain.com(不包括尾部斜線)", "API_Upper_Count_Limit": "最大記錄數量", "API_Upper_Count_Limit_Description": "REST API應該返回的最大記錄數是多少(何時不是無限的)?", + "API_Use_REST_For_DDP_Calls": "使用 REST 代替 websocket 進行 Meteor 呼叫", + "API_Use_REST_For_DDP_Calls_Alert": "這是一項實驗性和臨時性功能。它強制網頁客戶端和手機應用程式使用 REST 請求,而不是將 Websocket 用於 Meteor 方式呼叫。", "API_User_Limit": "添加所有使用者到Channel的數量上限", "API_Wordpress_URL": "WordPress網址", "Apiai_Key": "Api.ai Key", @@ -374,6 +396,11 @@ "Apps_Framework_Development_Mode": "啟用開發模式", "Apps_Framework_Development_Mode_Description": "開發模式允許安裝從非 Rocket.Chat 商店的應用程式。", "Apps_Framework_enabled": "啟用應用程式框架", + "Apps_Game_Center": "遊戲中心", + "Apps_Game_Center_Back": "退回游戲中心", + "Apps_Game_Center_enabled": "啟用遊戲中心", + "Apps_Game_Center_Play_Game_Together": "@here 讓我們一起玩__name__吧!", + "Apps_Game_Center_Invite_Friends": "邀請您的朋友加入", "Apps_Marketplace_Deactivate_App_Prompt": "是否確定要停用此應用程式?", "Apps_Marketplace_Modify_App_Subscription": "修改訂閱", "Apps_Marketplace_Uninstall_App_Prompt": "是否確定要反安裝此應用程式?", @@ -449,6 +476,8 @@ "AutoTranslate_Enabled": "啟用自動翻譯", "AutoTranslate_Enabled_Description": "啟用自動翻譯功能後,擁有自動翻譯權限的用戶可以將所有訊息自動翻譯為所選語言。可能需要費用。", "AutoTranslate_Google": "Google", + "AutoTranslate_Microsoft": "微軟", + "AutoTranslate_Microsoft_API_Key": "Ocp-Apim-訂閱金鑰", "AutoTranslate_ServiceProvider": "服務提供者", "Available": "線上", "Available_agents": "可用的代理", @@ -493,6 +522,8 @@ "Blockstack_ButtonLabelText": "按鈕標籤文字", "Blockstack_Generate_Username": "產生使用者名稱", "Body": "本文", + "Bio": "Bio", + "Bio_Placeholder": "Bio Placeholder", "bold": "粗體", "bot_request": "Bot 請求", "BotHelpers_userFields": "使用者欄位", @@ -508,6 +539,8 @@ "Broadcasting_enabled": "廣撥已啟用", "Broadcasting_media_server_url": "廣撥多媒體伺服器網址", "Browse_Files": "瀏覽檔案", + "Browser_does_not_support_audio_element": "您的瀏覽器不支援音效元素。", + "Browser_does_not_support_video_element": "您的瀏覽器不支援影片元素。", "Bugsnag_api_key": "Bugsnag API密鑰", "Build_Environment": "構建環境", "bulk-register-user": "批次建立使用者", @@ -548,6 +581,7 @@ "CAS_trust_username_description": "當啟用後,Rocket.Chat 將信任 CAS 中的任何使用者名稱且屬於Rocket.Chat上的相同使用者。
如果在 CAS 上重新命名了使用者,則可能需要這樣做,但也可能允許人們通過重命名自己的 CAS 使用者來控制 Rocket.Chat 帳號。", "CAS_version": "CAS 版本", "CAS_version_Description": "僅使用您的CAS SSO 服務支援的受支援的 CAS 版本。", + "Call": "呼叫", "Categories": "分類", "CDN_PREFIX": "CDN Prefix", "CDN_PREFIX_ALL": "使用 CDN 給所有項目", @@ -626,6 +660,7 @@ "Chatpal_Welcome": "享受您的搜尋!", "Chatpal_Window_Size": "索引視窗大小", "Chatpal_Window_Size_Description": "索引視窗的大小以小時為單位(在引導時)", + "Check_All": "全選", "Check_Progress": "檢查進度", "Choose_a_room": "選擇一個頻道", "Choose_messages": "選擇訊息", @@ -722,6 +757,8 @@ "Conversation": "對話", "Conversations": "對話", "Conversation_closed": "會話已關閉:__comment__。", + "Conversation_closing_tags": "對話結束標籤", + "Conversation_closing_tags_description": "關閉標籤將在關閉時自動分配到對話。", "Conversation_finished": "對話已完成", "Conversation_finished_message": "對話完成的訊息", "Conversation_finished_text": "對話已完成文字", @@ -992,6 +1029,7 @@ "Create_A_New_Channel": "建立一個新Channel", "Create_new": "建立新的", "Create_unique_rules_for_this_channel": "為此頻道建立獨特的規則", + "Created": "已建立", "Created_at": "建立於", "Created_at_s_by_s": "%s%s所建立", "Created_at_s_by_s_triggered_by_s": "由%s觸發,由%s創建於%s", @@ -1055,6 +1093,7 @@ "Date_From": "從", "Date_to": "至", "days": "天", + "Days": "天", "DB_Migration": "資料庫遷移", "DB_Migration_Date": "資料庫遷移日期", "DDP_Rate_Limit_IP_Enabled": "限制 IP: 已啟用", @@ -1112,7 +1151,10 @@ "Desktop_Notifications_Not_Enabled": "桌面通知未啟用", "Details": "詳細", "Different_Style_For_User_Mentions": "使用者提到的不同風格", + "Direct_message_creation_description": "您要與多個使用者建立聊天。使用直接訊息,將您想聊天的人增加到同一位置的每個人。", + "Direct_message_you_have_joined": "您已經加入了一個新的直接訊息", "Direct_message_someone": "私訊其他人", + "Direct_Message": "直接訊息", "Direct_Messages": "私訊", "Direct_Reply": "直接回覆", "Direct_Reply_Advice": "您可以直接回覆這個郵件。不要修改之前的郵件。", @@ -1136,7 +1178,8 @@ "Directory": "目錄", "Disable_Facebook_integration": "停用 Facebook 整合", "Disable_Notifications": "停用通知", - "Disable_two-factor_authentication": "停用2步驟驗證", + "Disable_two-factor_authentication": "透過 TOTP 停用2步驟驗證", + "Disable_two-factor_authentication_email": "透過電子郵件停用2步驟身份驗證", "Disabled": "已停用", "Disallow_reacting": "不允許反應", "Disallow_reacting_Description": "不允許反應", @@ -1173,6 +1216,7 @@ "Download_My_Data": "下載我的資料 (HTML)", "Download_Pending_Files": "下載待處理檔案", "Download_Snippet": "下載", + "Do_not_provide_this_code_to_anyone": "不要將此代碼提供給任何人。", "Drop_to_upload_file": "拖曳以上傳", "Dry_run": "空運行", "Dry_run_description": "將只發送一封電子郵件並從相同的地址。電子郵件必須屬於一個有效的使用者。", @@ -1188,6 +1232,8 @@ "E2E_Enabled": "E2E 已啟用", "E2E_Enable_alert": "這個功能目前還在測試! 請回報臭蟲到 github.com/RocketChat/Rocket.Chat/issues 且要知道:
- 在已加密的房間中加密的訊息是沒辦法搜尋得到的。
- 手機應用程式可能不支援加密訊息 (他們實施中)。
- 機器人可能也無法看到已加密訊息直到他們支援這個。
- 這個版本無法加密檔案。", "E2E_Enable_description": "啟用選項來建立加密群組就可以變更群組和直接訊息加密", + "E2E_Enabled_Default_DirectRooms": "預設情況下為 Direct Rooms 啟用加密", + "E2E_Enabled_Default_PrivateRooms": "預設情況下為私有 Rooms 啟用加密", "E2E_Encryption_Password_Change": "變更加密的密碼", "E2E_Encryption_Password_Explanation": "您可以建立加密私人群組和直接訊息。您可能也可以變更已經存在的私人群組或是直接訊息中來加密。

這是點對點的加密,所以金鑰是用來加密/解密,您的訊息也不會儲存到伺服器上。為了這個原因您必須安全存放您的密碼。您會希望使用 E2E 加密輸入到其他裝置。", "E2E_password_reveal_text": "您現在可以建立加密私人群組和直接訊息。您可能也可以變更已存在的私人群組或直接訊息來加密。

這是點對點的加密,所以金鑰是用來加密/解密,您的訊息也不會儲存到伺服器上。為了這個原因您必須安全存放您的密碼。您會希望使用 E2E 加密輸入到其他裝置。 點擊這裡了解更多!

您的密碼是: %s

這是自動產生的密碼,在任何時間從任何瀏覽器您可以設定新的密碼給您的加密金鑰您可以輸入已存在的密碼。
這個密碼只能存在這個瀏覽器,直到您儲存密碼和關閉這個訊息。", @@ -1248,12 +1294,14 @@ "Emoji_provided_by_JoyPixels": "表情符號提供者為 JoyPixels", "EmojiCustomFilesystem": "自訂表情符號文件系統", "Empty_title": "空白標題", + "Engagement_Dashboard": "約定儀表板", "Enable": "啟用", "Enable_Auto_Away": "啟用自動離開", "Enable_Desktop_Notifications": "啟用桌面通知", "Enable_inquiry_fetch_by_stream": "啟用使用串流從伺服器取得查詢資料", "Enable_Svg_Favicon": "啟用 SVG 圖示", "Enable_two-factor_authentication": "啟用2步驟驗證", + "Enable_two-factor_authentication_email": "透過電子郵件啟用2步驟驗證", "Enabled": "已啟用", "Encrypted": "已加密", "Encrypted_channel_Description": "點對點加密頻道。搜尋無法在加密頻道上工作且通知可能也不會顯示訊息內容。", @@ -1264,6 +1312,7 @@ "End_OTR": "結束OTR", "Enter_a_name": "輸入名稱", "Enter_a_regex": "輸入一個正規表示法", + "Enter_a_department_name": "輸入部門名稱", "Enter_a_room_name": "輸入一個頻道名稱", "Enter_a_username": "輸入一個使用者名稱", "Enter_a_tag": "輸入標籤", @@ -1280,6 +1329,7 @@ "Entertainment": "娛樂", "Error": "錯誤", "error-action-not-allowed": "__action__不允許", + "error-agent-offline": "代理離線", "error-application-not-found": "找不到應用程式", "error-archived-duplicate-name": "已有一個名為「'__room_name__'」的封存中通道", "error-avatar-invalid-url": "無效的大頭貼網址:__url__", @@ -1300,6 +1350,7 @@ "error-email-send-failed": "嘗試發送電子郵件時出錯:__message__", "error-field-unavailable": "__field__已被使用了 :(", "error-file-too-large": "檔案太大", + "error-forwarding-chat-same-department": "所選部門與當前房間部門相同", "error-importer-not-defined": "匯入程式沒有正確定義,它缺少匯入類型。", "error-import-file-extract-error": "無法解開匯入檔。", "error-import-file-is-empty": "匯入檔看起來是空白的。", @@ -1382,7 +1433,9 @@ "error-logged-user-not-in-room": "你不在`%s`房間裡", "error-user-registration-disabled": "使用者註冊已停用", "error-user-registration-secret": "只能透過加密網址進行使用者註冊", + "error-validating-department-chat-closing-tags": "當部門在結束對話時需要標籤時,至少需要一個結束標籤。", "error-you-are-last-owner": "你是最後的擁有者。請離開房間之前設置的新的擁有者。", + "error-starring-message": "訊息可能無法標記", "Error_404": "錯誤:404", "Error_changing_password": "密碼變更失敗", "Error_loading_pages": "加載頁面時出錯", @@ -1411,12 +1464,14 @@ "except_pinned": "(固定的除外)", "Execute_Synchronization_Now": "立即執行同步", "Exit_Full_Screen": "離開全螢幕", + "Experimental_Feature_Alert": "這是一項實驗功能!請注意,將來可能會更改,破壞甚至刪除它,恕不另行通知。", "Expiration": "到期", "Expiration_(Days)": "到期 (日)", "Export_My_Data": "匯出我的數據", "expression": "正規表示法", "Extended": "已擴大", "External_Domains": "外部網域", + "External_Users": "外部使用者", "External_Queue_Service_URL": "外部佇列服務 URL", "External_Service": "外部服務", "Facebook_Page": "Facebook 頁面", @@ -1572,6 +1627,8 @@ "Full_Screen": "全螢幕", "Gaming": "遊戲", "General": "一般", + "Generate_new_key": "產生新的金鑰", + "Generating_key": "產生金鑰中", "Get_link": "取得連結", "Generate_New_Link": "產生新的連接", "github_no_public_email": "您沒有設置任何電子郵件作為公共電子郵件地址,在你的Github帳戶上", @@ -1611,10 +1668,12 @@ "Group_favorites": "最愛群組", "Group_mentions_disabled_x_members": "提及`@ all`和`@ here`的小組已被停用__total__以上成員的房間。", "Group_mentions_only": "團體只提及", + "Grouping": "分組", "Hash": "Hash", "Header": "標頭", "Header_and_Footer": "頁首和頁尾", "Healthcare_and_Pharmaceutical": "醫療保健/醫藥", + "Here_is_your_authentication_code": "這是您的驗證碼:", "Help_Center": "求助中心", "Helpers": "助手", "Hex_Color_Preview": "十六進制顏色預覽", @@ -1655,9 +1714,11 @@ "if_they_are_from": "(如果他們來自%s)", "If_this_email_is_registered": "如果此電子郵件已註冊,我們將發送有關如何重設密碼的說明。如果您很短時間內沒有收到電子郵件,請返回並重試。", "If_you_are_sure_type_in_your_password": "如果您確定請輸入您的密碼:", + "Members_List": "成員列表", "If_you_are_sure_type_in_your_username": "如果您確定,請輸入您的使用者名稱:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "如果你沒有發送郵件到[omni@rocket.chat](mailto:omni@rocket.chat)來獲得你的郵件。", "If_you_didnt_ask_for_reset_ignore_this_email": "如果您沒有要求重設密碼,您可以忽略這個郵件。", + "If_you_didnt_try_to_login_in_your_account_please_ignore_this_email": "如果您未試著登入您的帳號,請忽略此電子郵件。", "Iframe_Integration": "Iframe 整合", "Iframe_Integration_receive_enable": "啟用接收", "Iframe_Integration_receive_enable_Description": "允許上層窗口向Rocket.Chat發送指令。", @@ -1856,6 +1917,7 @@ "IssueLinks_Incompatible": "警告:不要同時啟用此功能和“十六進制顏色預覽”。", "IssueLinks_LinkTemplate": "問題鏈接模板", "IssueLinks_LinkTemplate_Description": "問題鏈接模板; %s將被問題編號替換。", + "Items_per_page:": "每頁項目:", "It_works": "正常", "italic": "斜體", "italics": "斜體", @@ -1869,6 +1931,7 @@ "Mobex_sms_gateway_restful_address": "Mobex 簡訊 REST API 位址", "Mobex_sms_gateway_restful_address_desc": "您的 Mobex REST API 的 IP 或主機位址。例如 `http://192.168.1.1:8080` 或 `https://www.example.com:8080`", "Mobex_sms_gateway_username": "使用者名稱", + "Most_popular_channels_top_5": "最受歡迎的頻道(前5名)", "Jitsi_Chrome_Extension": "Chrome 擴充 ID", "Jitsi_Enabled_TokenAuth": "啟用 JWT 驗證", "Jitsi_Application_ID": "應用程式 ID (iss)", @@ -1886,6 +1949,7 @@ "Join_the_given_channel": "加入現有頻道", "Join_video_call": "加入視訊通話", "Joined": "已加入", + "Joined_at": "已加入到", "Jump": "跳", "Jump_to_first_unread": "跳轉到首個未讀", "Jump_to_message": "跳轉到訊息", @@ -1927,6 +1991,7 @@ "Language_Russian": "俄文", "Language_Spanish": "西班牙文", "Language_Version": "英語版本", + "Last_active": "最後登入", "Last_login": "上次登入", "Last_Message_At": "最後在留言", "Last_seen": "最後上線", @@ -1934,6 +1999,9 @@ "Last_Message": "上次消息", "Last_Status": "讀取狀態", "Last_Updated": "最後已更新", + "Last_7_days": "最近7天", + "Last_30_days": "最近30天", + "Last_90_days": "最近90天", "Launched_successfully": "成功推出", "Layout": "介面", "Layout_Home_Body": "首頁本文", @@ -2109,6 +2177,7 @@ "Local_Domains": "本地網域", "Local_Password": "本機密碼", "Localization": "本土化", + "Location": "位置", "Log_Exceptions_to_Channel_Description": "一個將接收所有捕獲的異常的通道。留空以忽略異常。", "Log_Exceptions_to_Channel": "將通道記錄異常", "Log_File": "顯示檔案和行數", @@ -2138,6 +2207,7 @@ "Mail_Message_No_messages_selected_select_all": "您還沒有選擇任何消息", "Mail_Messages": "郵件訊息", "Mail_Messages_Instructions": "通過點擊訊息選擇您要通過電子郵件發送哪些訊息", + "Room_uploaded_file_list": "檔案清單", "Mail_Messages_Subject": "這裡的 %s 訊息的選定部分", "Mailer": "寄件人", "Mailer_body_tags": "您必須使用[unsubscribe]的退訂連接。
您可以使用[name],[fname],[lname]為使用者的全名,名字或姓氏,分別。
您可以使用[email]為使用者的電子郵件。", @@ -2204,7 +2274,7 @@ "Maximum": "最大", "Media": "媒體", "Medium": "中間", - "Members_List": "成員列表", + "Members": "會員", "mention-all": "提及所有", "mention-all_description": "允許使用@all提到", "mention-here": "在此提及", @@ -2254,6 +2324,8 @@ "Message_GlobalSearch": "全域搜尋", "Message_GroupingPeriod": "分組週期(以秒為單位)", "Message_GroupingPeriodDescription": "如果兩個來自同一使用者並且經過的時間小於以秒為單位的通知時間,則訊息將與先前訊息分組。", + "Message_has_been_starred": "已標記訊息", + "Message_has_been_unstarred": "已取消標記訊息", "Message_HideType_au": "隱藏“使用者已增加”訊息", "Message_HideType_mute_unmute": "隱藏“使用者靜音/取消靜音”訊息", "Message_HideType_ru": "隱藏“使用者已刪除”訊息", @@ -2302,6 +2374,7 @@ "Message": "訊息", "messages": "訊息", "Messages": "訊息", + "Messages_sent": "訊息發送", "Messages_that_are_sent_to_the_Incoming_WebHook_will_be_posted_here": "傳送至連入 WebHook 的訊息會顯示在這裡。", "Meta": "Meta", "Meta_custom": "自定義標記", @@ -2361,7 +2434,9 @@ "Name_optional": "名稱(非必填)", "Name_Placeholder": "請輸入你的名字...", "Navigation_History": "瀏覽歷史記錄", + "New_users": "新的使用者", "New_Application": "新應用程式", + "New_chat_in_queue": "佇列中的新聊天", "New_chat_transfer": "新的聊天轉換: __transfer__", "New_Custom_Field": "新的自定欄位", "New_Department": "新部門", @@ -2410,11 +2485,13 @@ "No_discussions_yet": "沒有討論", "No_Threads": "沒找到討論串", "No_user_with_username_%s_was_found": "沒有此使用者 \"%s\" !", + "No_data_found": "沒有找到資料", "Nobody_available": "沒人可用", "Node_version": "節點版本", "None": "無", "Nonprofit": "非營利", "Normal": "正常", + "Not_enough_data": "資料不足", "Not_authorized": "未經授權", "Not_Available": "不可用", "Not_found_or_not_allowed": "未找到或者不允許", @@ -2460,6 +2537,8 @@ "Offline_form": "離線表單", "Offline_form_unavailable_message": "離線形式不可用訊息", "Offline_Link_Message": "轉到訊息", + "Offline_Message": "離線訊息", + "Offline_Message_Use_DeepLink": "使用深層連接 URL 格式", "Offline_Mention_All_Email": "提及所有電子郵件主旨", "Offline_Mention_Email": "提到的電子郵件主旨", "Offline_message": "離線訊息", @@ -2468,6 +2547,11 @@ "Old Colors": "舊的顏色", "Old Colors (minor)": "舊的顏色 (次要)", "Older_than": "久超過", + "Omnichannel_External_Frame": "外框", + "Omnichannel_External_Frame_Enabled": "啟用外部框架", + "Omnichannel_External_Frame_URL": "外部框架網址", + "Omnichannel_External_Frame_Encryption_JWK": "加密金鑰(JWK)", + "Omnichannel_External_Frame_Encryption_JWK_Description": "如果提供,它將使用提供的金鑰加密使用者的token,並且外部系統將需要解密資料以存取token", "On": "在", "Online": "線上", "online": "在線", @@ -2522,6 +2606,7 @@ "Password_Changed_Email_Subject": "[Site_Name] - 密碼已變更", "Password_changed_section": "密碼已變更", "Password_changed_successfully": "密碼變更成功", + "Passwords_do_not_match": "密碼不一致", "Password_Policy": "密碼原則", "Past_Chats": "之前聊天", "Paste_here": "貼在這裡...", @@ -2594,6 +2679,8 @@ "Privacy_Policy": "隱私政策", "Private": "私人", "Private_Channel": "私人Channel", + "Private_Channels": "私人Channel s", + "Private_Chats": "私人聊天", "Private_Group": "私人群組", "Private_Groups": "私人群組", "Private_Groups_list": "私人群組列表", @@ -2604,6 +2691,10 @@ "Profile_picture": "資料圖片", "Profile_saved_successfully": "資料儲存成功", "Prometheus": "普羅米修斯", + "Prometheus_Reset_Interval": "重設間隔(毫秒)", + "Prometheus_Garbage_Collector": "收集 NodeJS GC", + "Prometheus_Garbage_Collector_Alert": "需要重新啟動才能停用", + "Prometheus_API_User_Agent": "API:追踪使用者代理", "Protocol": "協定", "Prune": "修剪", "Prune_finished": "修剪完了", @@ -2621,6 +2712,7 @@ "files_pruned": "修剪過的檔案", "Public": "公開", "Public_Channel": "公共 Channel", + "Public_Channels": "公開 Channel s", "Public_Community": "公共社區", "Public_Relations": "公共關係", "Public_URL": "公開網址", @@ -2650,6 +2742,7 @@ "Purchase_for_price": "購買 $%s", "Query": "詢問", "Query_description": "確定向哪些使用者發送電子郵件的附加條件。未訂閱的使用者將自動從查詢中刪除。它必須是有效的JSON。例如:“{\"createdAt\":{\"$gt\":{\"$date\": \"2015-01-01T00:00:00.000Z\"}}}”", + "Query_is_not_valid_JSON": "查詢無效的 JSON", "Queue": "佇列", "quote": "引用", "Quote": "引用", @@ -2734,6 +2827,7 @@ "Reporting": "報告", "Request_comment_when_closing_conversation": "當關閉對話時需要評論", "Request_comment_when_closing_conversation_description": "假如啟用,此代理將必須在對話關閉前進行評論。", + "Require": "必須", "Require_all_tokens": "要求所有 tokens", "Require_any_token": "需要任何 token", "Require_password_change": "需要更改密碼", @@ -2810,7 +2904,6 @@ "Room_type_changed_successfully": "Room 類型已成功更改", "Room_type_of_default_rooms_cant_be_changed": "這是一個預設房間,類型不能更改,請聯絡您的管理員。", "Room_unarchived": "Room 已取消封存", - "Room_uploaded_file_list": "檔案清單", "Room_uploaded_file_list_empty": "沒有檔案。", "Rooms": "Room", "Routing": "路由", @@ -2827,6 +2920,7 @@ "SAML": "SAML", "SAML_Custom_Authn_Context": "自定義授權內文", "SAML_Custom_Authn_Context_Comparison": "內容驗證比對", + "SAML_Custom_Authn_Context_description": "將此保留為空可忽略請求中的 authn 內容。", "SAML_Custom_Cert": "自訂憑證", "SAML_Custom_Debug": "啟用除錯", "SAML_Custom_Entry_point": "自訂 Entry Point", @@ -2841,6 +2935,12 @@ "SAML_Custom_Private_Key": "私鑰內容", "SAML_Custom_Provider": "自訂提供者", "SAML_Custom_EMail_Field": "電子郵件欄位名稱", + "SAML_Custom_signature_validation_all": "驗證所有簽名", + "SAML_Custom_signature_validation_assertion": "驗證斷言簽名", + "SAML_Custom_signature_validation_either": "驗證任一簽名", + "SAML_Custom_signature_validation_response": "驗證回應簽名", + "SAML_Custom_signature_validation_type": "簽名驗證類型", + "SAML_Custom_signature_validation_type_description": "假如自訂憑證未提供則這個設定會忽略。", "SAML_Custom_user_data_fieldmap": "使用者資料欄位對應", "SAML_Custom_user_data_fieldmap_description": "設置如何從 SAML 紀錄中 (一旦找到) 補齊使用者帳號欄位 (例如電子郵件)。
例如,`{\"cn\":\"name\", \"mail\":\"email\"}` 將會選擇從 cn 欄位找到個人可讀取名稱,和從電子郵件欄位找到他們的電子郵件。
在 Rocket.Chat 可用的欄位有: `name`, `email` 和 `username`, 其他所有的會另存為 `customFields`。
您也可以使用正規表示法去取得欄位值,像是這個: `{\"NameID\": { \"field\": \"username\", \"regex\": \"(.*)@.+$\"}, \"email\": \"email\"}`", "SAML_Custom_Username_Field": "使用者名稱欄位名稱", @@ -2855,6 +2955,10 @@ "SAML_Default_User_Role_Description": "您可以指定多個角色,並用逗號分隔。", "SAML_Role_Attribute_Name": "角色屬性名稱", "SAML_Role_Attribute_Name_Description": "如果在 SAML 回覆中找到此屬性,則其值用作新使用者的角色名稱。", + "SAML_Role_Attribute_Sync": "同步使用者身份", + "SAML_Role_Attribute_Sync_Description": "登入時同步 SAML 使用者身份(覆蓋本地使用者身份)。", + "SAML_Allowed_Clock_Drift": "允許來自身份提供者的時間差", + "SAML_Allowed_Clock_Drift_Description": "身份提供者的時間可能會比您的系統時間快一些。您可以允許少量的時間差。它的值必須以毫秒為單位。提供的數值將增加到驗證回應的目前時間。", "Saturday": "星期六", "Save": "儲存", "save-others-livechat-room-info": "保存其他即時聊天 Room 資訊", @@ -2911,6 +3015,7 @@ "Send_invitation_email_error": "您尚未提供任何有效的電子郵件地址。", "Send_invitation_email_info": "您可以一次發送多個電子郵件邀請。", "Send_invitation_email_success": "您已成功發送邀请電子郵件到以下地址:", + "Send_me_the_code_again": "再次發送代碼給我", "Send_request_on_agent_message": "發送代理訊息請求", "Send_request_on_chat_close": "傳送聊天關閉請求", "Send_request_on_lead_capture": "發送潛在客戶請求", @@ -2941,6 +3046,7 @@ "set-readonly": "設置唯讀", "set-readonly_description": "將頻道設定為唯讀頻道的權限", "Set_as_leader": "設定為管理者", + "Set_as_favorite": "設為最愛", "Set_as_moderator": "設置為主持人", "Set_as_owner": "設置為擁有者", "Settings": "設定", @@ -2954,6 +3060,7 @@ "Should_exists_a_user_with_this_username": "使用者必須已經存在。", "Show_Setup_Wizard": "顯示安裝精靈", "UI_Show_top_navbar_embedded_layout": "在嵌入式介面中顯示頂部導航欄", + "Layout_Show_Home_Button": "顯示\"首頁按鈕”", "Show_agent_email": "顯示代理郵件", "Show_agent_info": "顯示代理資訊", "Show_all": "顯示所有", @@ -3013,6 +3120,8 @@ "Smarsh_MissingEmail_Email_Description": "電子郵件地址缺失時顯示給使用者帳號的電子郵件通常發生在機器人帳戶中。", "Smarsh_Timezone": "Smarsh 時區", "Smileys_and_People": "表情與人", + "SMS_Default_Omnichannel_Department": "全通道部門(預設)", + "SMS_Default_Omnichannel_Department_Description": "如果設定,則此整合啟動的所有新傳入聊天都將路由到該部門。", "SMS_Enabled": "簡訊功能已開啟", "SMTP": "SMTP", "SMTP_Host": "SMTP 主機", @@ -3029,6 +3138,7 @@ "Social_Network": "社交網路", "Sorry_page_you_requested_does_not_exist_or_was_deleted": "對不起,您請求的網頁不存在或被刪除!", "Sort": "分類", + "Sort_By": "排序方式", "Sort_by_activity": "按活動排序", "Sound": "聲音", "Sound_File_mp3": "聲音檔案(mp3)", @@ -3174,6 +3284,7 @@ "theme-color-rc-color-error-light": "錯誤指示燈", "theme-color-rc-color-link-active": "目前連結", "theme-color-rc-color-primary": "主", + "theme-color-rc-color-primary-background": "主要背景", "theme-color-rc-color-primary-dark": "初級黑暗", "theme-color-rc-color-primary-darkest": "主要最黑暗", "theme-color-rc-color-primary-light": "初級燈", @@ -3255,6 +3366,8 @@ "Total_messages": "總共訊息量", "Total_Threads": "總共討論串", "Total_visitors": "總共訪客", + "totp-invalid": "無效的代碼或密碼", + "TOTP Invalid [totp-invalid]": "無效的代碼或密碼", "Tourism": "旅遊", "Transcript_Enabled": "詢問訪問者是否會在聊天結束後收到副本", "Transcript_message": "詢問筆錄時要顯示的訊息", @@ -3268,15 +3381,35 @@ "Trigger_Words": "觸發詞", "Triggers": "觸發器", "True": "是", + "Troubleshoot": "疑難排解", + "Troubleshoot_Description": "這些設定只能在 Rocket.Chat 開發或支援團隊的指導下啟用。如果您不知道自己在做什麼,請勿觸摸它們!", + "Troubleshoot_Disable_Notifications": "停用通知", + "Troubleshoot_Disable_Notifications_Alert": "這個設定將完全停用通知系統。聲音,桌面通知,手機通知和電子郵件將停止!", + "Troubleshoot_Disable_Presence_Broadcast": "停用狀態廣播", + "Troubleshoot_Disable_Presence_Broadcast_Alert": "這個設定可防止所有實務將使用者的狀態更改發送到其客戶端,從而使所有使用者保持首次載入的狀態!", + "Troubleshoot_Disable_Instance_Broadcast": "停用實務廣播", + "Troubleshoot_Disable_Instance_Broadcast_Alert": "這個設定可防止 Rocket.Chat 實務將事件發送到其他實務,這可能會導致同步問題和行為異常!", + "Troubleshoot_Disable_Sessions_Monitor": "停用 Sessions 監視器", + "Troubleshoot_Disable_Sessions_Monitor_Alert": "這個設定將停止處理使用者 sessions,將會導致統計資料無法正常工作!", + "Troubleshoot_Disable_Livechat_Activity_Monitor": "停用即時聊天活動監視器", + "Troubleshoot_Disable_Livechat_Activity_Monitor_Alert": "這個設定將停止處理即時聊天訪客 sessions,將會導致統計資料無法正常工作!", + "Troubleshoot_Disable_Statistics_Generator": "停用統計資料產生器", + "Troubleshoot_Disable_Statistics_Generator_Alert": "這個設定將停止處理所有統計資料,將會使資料頁面過時,直到有人點擊“重整”按鈕,並可能導致系統周圍缺少其他資料!", + "Troubleshoot_Disable_Data_Exporter_Processor": "停用資料匯出處理器", + "Troubleshoot_Disable_Data_Exporter_Processor_Alert": "這個設定將停止處理使用者的所有匯出要求,因此他們將不會收到下載資料的連接!", + "Troubleshoot_Disable_Workspace_Sync": "停用工作區同步", + "Troubleshoot_Disable_Workspace_Sync_Alert": "這個設定將停止該伺服器與 Rocket.Chat 的雲端同步,並可能導致商店和企業授權出現問題!", "Tuesday": "星期二", "Turn_OFF": "關掉", "Turn_ON": "打開", "Two Factor Authentication": "2步驟驗證", - "Two-factor_authentication": "2步驟驗證", + "Two-factor_authentication": "透過 TOTP 2步驟驗證", + "Two-factor_authentication_email": "通過電子郵件進行2步驟驗證", "Two-factor_authentication_disabled": "2步驟驗證被停用", "Two-factor_authentication_enabled": "啟用2步驟驗證", - "Two-factor_authentication_is_currently_disabled": "2步驟驗證目前被停用", + "Two-factor_authentication_is_currently_disabled": "透過 TOTP 2步驟驗證目前被停用", "Two-factor_authentication_native_mobile_app_warning": "警告:啟用此功能後,您將無法使用密碼登錄本機移動應用程式(Rocket.Chat +),直到他們實施2步驟驗證。", + "Two-factor_authentication_email_is_currently_disabled": "目前已停用透過電子郵件進行的2步驟驗證", "Type": "類型", "Type_your_email": "輸入您的電子郵件", "Type_your_job_title": "輸入你的職位", @@ -3299,6 +3432,7 @@ "unarchive-room": "Room 取消封存", "unarchive-room_description": "取消封存頻道的權限", "Unblock_User": "取消封鎖使用者", + "Uncheck_All": "取消選擇", "Undefined": "未定義", "Unfavorite": "取消我的最愛", "Unfollow_message": "取消追蹤訊息", @@ -3345,7 +3479,7 @@ "Use_initials_avatar": "使用您使用者名稱的字母開頭作為縮寫", "Use_minor_colors": "使用次要調色板(預設繼承主要顏色)", "Use_service_avatar": "使用 %s 大頭貼", - "Verification_Email": "點擊此處驗證您的帳戶。", + "Verification_Email": "點擊此處驗證您的電子郵件。", "Use_this_username": "使用此使用者名稱", "Use_uploaded_avatar": "使用已上傳大頭貼照", "Use_url_for_avatar": "使用網址上傳", @@ -3403,6 +3537,7 @@ "User_sent_a_message_to_you": "__username__ 傳送給您一個訊息", "user_sent_an_attachment": "__user__ 寄送了一個附件", "User_Settings": "使用者設定", + "User_started_a_new_conversation": "__username__開始了新的對話", "User_unmuted_by": "使用者通過__user_unmuted__取消靜音__user_by__。", "User_unmuted_in_room": "使用者在房間內靜音", "User_updated_successfully": "使用者更新成功", @@ -3440,6 +3575,7 @@ "Username_wants_to_start_otr_Do_you_want_to_accept": "__username__想要啟動不公開。你想接受嗎?", "Users": "使用者", "Users_added": "使用者已增加", + "Users_by_time_of_day": "按時間排序使用者", "Users_in_role": "使用者在角色", "Users must use Two Factor Authentication": "使用者必須使用2步驟驗證", "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "如果不想顯示角色,請將描述欄位保持空白", @@ -3448,15 +3584,18 @@ "UTF8_Names_Slugify": "UTF8 名稱 Slugify", "UTF8_Names_Validation": "UTF8 名稱驗證", "UTF8_Names_Validation_Description": "不要讓特殊字符和空格。您可以使用 - _和。但不是在名稱的末尾", + "Value_messages": "__value__條訊息", + "Value_users": "__value__個使用者", "Validate_email_address": "驗證電子郵件地址", - "Verification_email_body": "您已成功建立帳號在 [Site_Name]. 請點擊以下的按鈕來確認您的郵件地址並完成註冊。", + "Verification_email_body": "請點擊以下的按鈕來確認您的郵件地址。", "Verification": "驗證", "Verification_Description": "您可以使用以下佔位符:
  • [Verification_Url]獲取驗證網址。
  • [姓名],[fname],[lname]分別代表使用者的全名,名字或姓氏。使用者的電子郵件為
  • [email]。分別為應用程式名稱和網址分別為
  • [Site_Name]和[Site_URL]。
", "Verification_email_sent": "驗證郵件已發送", - "Verification_Email_Subject": "[Site_Name] - 驗證您的帳號", + "Verification_Email_Subject": "[Site_Name] - 驗證電子郵件", "Verified": "已驗證", "Verify": "驗證", "Verify_your_email": "驗證您的電子郵件", + "Verify_your_email_for_the_code_we_sent": "檢查您的電子郵件以取得我們發送的代碼", "Version": "版本", "Videos": "影片", "Video Conference": "多人視訊", @@ -3549,6 +3688,8 @@ "Welcome": "歡迎 %s", "Welcome_to": "歡迎來到 __Site_Name__", "Welcome_to_the": "歡迎來到", + "Where_are_the_messages_being_sent?": "訊息要發送到哪裡?", + "When_is_the_chat_busier?": "什麼時候忙於聊天?", "Why_do_you_want_to_report_question_mark": "你為什麼要回報?", "will_be_able_to": "將能", "Worldwide": "全世界", diff --git a/packages/rocketchat-i18n/i18n/zh.i18n.json b/packages/rocketchat-i18n/i18n/zh.i18n.json index 273c4640ecdd..5451e8d09fa6 100644 --- a/packages/rocketchat-i18n/i18n/zh.i18n.json +++ b/packages/rocketchat-i18n/i18n/zh.i18n.json @@ -1637,6 +1637,7 @@ "if_they_are_from": "(如果他们来自 %s)", "If_this_email_is_registered": "如果此电子邮件已注册,我们将发送有关如何重置密码的说明。如果您很短时间内没有收到电子邮件,请返回并重试。", "If_you_are_sure_type_in_your_password": "如果您确定,请输入您的密码:", + "Members_List": "成员列表", "If_you_are_sure_type_in_your_username": "如果您确定,请输入您的用户名:", "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "如果您未持有, 发送邮件到[omni@rocket.chat](mailto:omni@rocket.chat)获取。", "If_you_didnt_ask_for_reset_ignore_this_email": "如果您没有要求重置密码,则可以忽略此电子邮件。", @@ -2099,6 +2100,7 @@ "Mail_Message_No_messages_selected_select_all": "您还没有选中任何消息。", "Mail_Messages": "发送邮件", "Mail_Messages_Instructions": "通过点击消息来选择您希望通过电子邮件发送的消息", + "Room_uploaded_file_list": "文件列表", "Mail_Messages_Subject": "这是从 %s 中选择的一部分消息", "Mailer": "发件人", "Mailer_body_tags": "你必须使用 [unsubscribe] 作为取消订阅的链接。
你可以使用 [name]、[fname] 和 [lname] 分别作为用户全名、名称或姓氏。
你可以使用 [email] 作为用户的电子邮箱地址。", @@ -2165,7 +2167,6 @@ "Maximum": "最大限度", "Media": "媒体", "Medium": "中", - "Members_List": "成员列表", "mention-all": "提及所有", "mention-all_description": "使用 @all 提及的权限", "mention-here": "在此提及", @@ -2756,7 +2757,6 @@ "Room_type_changed_successfully": "聊天室类型已成功修改", "Room_type_of_default_rooms_cant_be_changed": "这是一个默认聊天室,类型不能更改,请咨询您的管理员。", "Room_unarchived": "聊天室归档状态已取消", - "Room_uploaded_file_list": "文件列表", "Room_uploaded_file_list_empty": "没有任何文件。", "Rooms": "聊天室", "Routing": "路由", @@ -3210,6 +3210,7 @@ "Trigger_Words": "触发关键词", "Triggers": "触发器", "True": "是", + "Troubleshoot_Disable_Notifications": "禁用通知", "Tuesday": "星期二", "Turn_OFF": "关掉", "Turn_ON": "打开", @@ -3550,4 +3551,4 @@ "Your_server_link": "您的服务器链接", "Your_temporary_password_is_password": "您的暂时密码为 [password]。", "Your_workspace_is_ready": "您的工作区已准备好使用🎉" -} +} \ No newline at end of file diff --git a/private/client/imports/general/variables.css b/private/client/imports/general/variables.css index c5aaaeecf7ef..92c5124c4d22 100644 --- a/private/client/imports/general/variables.css +++ b/private/client/imports/general/variables.css @@ -51,6 +51,7 @@ --rc-color-alert-message-warning: #d52d24; --rc-color-alert-message-warning-background: #fff3f3; --rc-color-primary: var(--color-dark); + --rc-color-primary-background: var(--color-dark); --rc-color-primary-darkest: var(--color-darkest); --rc-color-primary-dark: var(--color-dark-medium); --rc-color-primary-light: var(--color-gray); @@ -180,6 +181,7 @@ --sidebar-background-hover: var(--rc-color-primary-dark); --sidebar-background-light: var(--rc-color-primary-lightest); --sidebar-background-light-hover: var(--rc-color-primary-light); + --sidebar-background-light-active: var(--rc-color-primary-light-medium); --sidebar-default-padding: 24px; --sidebar-small-default-padding: 16px; --sidebar-extra-small-default-padding: 12px; diff --git a/server/lib/pushConfig.js b/server/lib/pushConfig.js index 5bdce4ec40cc..eb59ff138681 100644 --- a/server/lib/pushConfig.js +++ b/server/lib/pushConfig.js @@ -1,19 +1,13 @@ import { Meteor } from 'meteor/meteor'; -import { HTTP } from 'meteor/http'; import { TAPi18n } from 'meteor/rocketchat:tap-i18n'; -import { Push } from 'meteor/rocketchat:push'; -import { SystemLogger } from '../../app/logger'; import { getWorkspaceAccessToken } from '../../app/cloud/server'; import { hasRole } from '../../app/authorization'; import { settings } from '../../app/settings'; +import { appTokensCollection, Push } from '../../app/push/server'; Meteor.methods({ - // log() { - // return console.log(...arguments); - // }, - push_test() { const user = Meteor.user(); @@ -29,7 +23,7 @@ Meteor.methods({ }); } - if (Push.enabled !== true) { + if (settings.get('Push_enable') !== true) { throw new Meteor.Error('error-push-disabled', 'Push is disabled', { method: 'push_test', }); @@ -51,7 +45,7 @@ Meteor.methods({ }], }; - const tokens = Push.appCollection.find(query).count(); + const tokens = appTokensCollection.find(query).count(); if (tokens === 0) { throw new Meteor.Error('error-no-tokens-for-this-user', 'There are no tokens for this user', { @@ -67,9 +61,7 @@ Meteor.methods({ text: `@${ user.username }:\n${ TAPi18n.__('This_is_a_push_test_messsage') }`, }, sound: 'default', - query: { - userId: user._id, - }, + userId: user._id, }); return { @@ -79,66 +71,8 @@ Meteor.methods({ }, }); -function sendPush(gateway, service, token, options, tries = 0) { - options.uniqueId = settings.get('uniqueID'); - - const data = { - data: { - token, - options, - }, - headers: {}, - }; - - const workspaceAccesstoken = getWorkspaceAccessToken(); - if (token) { - data.headers.Authorization = `Bearer ${ workspaceAccesstoken }`; - } - - return HTTP.post(`${ gateway }/push/${ service }/send`, data, function(error, response) { - if (response && response.statusCode === 406) { - console.log('removing push token', token); - Push.appCollection.remove({ - $or: [{ - 'token.apn': token, - }, { - 'token.gcm': token, - }], - }); - return; - } - - if (!error) { - return; - } - - SystemLogger.error(`Error sending push to gateway (${ tries } try) ->`, error); - - if (tries <= 6) { - const milli = Math.pow(10, tries + 2); - - SystemLogger.log('Trying sending push to gateway again in', milli, 'milliseconds'); - - return Meteor.setTimeout(function() { - return sendPush(gateway, service, token, options, tries + 1); - }, milli); - } - }); -} - function configurePush() { - if (settings.get('Push_debug')) { - Push.debug = true; - console.log('Push: configuring...'); - } - if (settings.get('Push_enable') === true) { - Push.allow({ - send(userId/* , notification*/) { - return hasRole(userId, 'admin'); - }, - }); - let apn; let gcm; @@ -150,20 +84,20 @@ function configurePush() { apn = { passphrase: settings.get('Push_apn_passphrase'), - keyData: settings.get('Push_apn_key'), - certData: settings.get('Push_apn_cert'), + key: settings.get('Push_apn_key'), + cert: settings.get('Push_apn_cert'), }; if (settings.get('Push_production') !== true) { apn = { passphrase: settings.get('Push_apn_dev_passphrase'), - keyData: settings.get('Push_apn_dev_key'), - certData: settings.get('Push_apn_dev_cert'), + key: settings.get('Push_apn_dev_key'), + cert: settings.get('Push_apn_dev_cert'), gateway: 'gateway.sandbox.push.apple.com', }; } - if (!apn.keyData || apn.keyData.trim() === '' || !apn.certData || apn.certData.trim() === '') { + if (!apn.key || apn.key.trim() === '' || !apn.cert || apn.cert.trim() === '') { apn = undefined; } @@ -172,65 +106,16 @@ function configurePush() { } } - Push.Configure({ + Push.configure({ apn, gcm, production: settings.get('Push_production'), - sendInterval: settings.get('Push_send_interval'), - sendBatchSize: settings.get('Push_send_batch_size'), + gateways: settings.get('Push_enable_gateway') === true ? settings.get('Push_gateway').split('\n') : undefined, + uniqueId: settings.get('uniqueID'), + getAuthorization() { + return `Bearer ${ getWorkspaceAccessToken() }`; + }, }); - - if (settings.get('Push_enable_gateway') === true) { - Push.serverSend = function(options = { badge: 0 }) { - const gateways = settings.get('Push_gateway').split('\n'); - - for (const gateway of gateways) { - if (options.from !== String(options.from)) { - throw new Error('Push.send: option "from" not a string'); - } - if (options.title !== String(options.title)) { - throw new Error('Push.send: option "title" not a string'); - } - if (options.text !== String(options.text)) { - throw new Error('Push.send: option "text" not a string'); - } - if (settings.get('Push_debug')) { - console.log(`Push: send message "${ options.title }" via query`, options.query); - } - - const query = { - $and: [options.query, { - $or: [{ - 'token.apn': { - $exists: true, - }, - }, { - 'token.gcm': { - $exists: true, - }, - }], - }], - }; - - Push.appCollection.find(query).forEach((app) => { - if (settings.get('Push_debug')) { - console.log('Push: send to token', app.token); - } - - if (app.token.apn) { - options.topic = app.appName; - return sendPush(gateway, 'apn', app.token.apn, options); - } - - if (app.token.gcm) { - return sendPush(gateway, 'gcm', app.token.gcm, options); - } - }); - } - }; - } - - Push.enabled = true; } } diff --git a/server/methods/browseChannels.js b/server/methods/browseChannels.js index 762b4662fe5e..ba720a62cbba 100644 --- a/server/methods/browseChannels.js +++ b/server/methods/browseChannels.js @@ -31,6 +31,7 @@ const sortUsers = function(field, direction) { case 'email': return { 'emails.address': direction === 'asc' ? 1 : -1, + username: direction === 'asc' ? 1 : -1, }; default: return { diff --git a/server/methods/createDirectMessage.js b/server/methods/createDirectMessage.js index 8ecf775c2722..f5a0a080eb51 100644 --- a/server/methods/createDirectMessage.js +++ b/server/methods/createDirectMessage.js @@ -3,7 +3,7 @@ import { check } from 'meteor/check'; import { settings } from '../../app/settings'; import { hasPermission } from '../../app/authorization'; -import { Users } from '../../app/models'; +import { Users, Rooms } from '../../app/models'; import { RateLimiter } from '../../app/lib'; import { addUser } from '../../app/federation/server/functions/addUser'; import { createRoom } from '../../app/lib/server'; @@ -32,13 +32,6 @@ Meteor.methods({ }); } - if (!hasPermission(Meteor.userId(), 'create-d')) { - throw new Meteor.Error('error-not-allowed', 'Not allowed', { - method: 'createDirectMessage', - }); - } - - const users = usernames.filter((username) => username !== me.username).map((username) => { let to = Users.findOneByUsernameIgnoringCase(username); @@ -55,6 +48,27 @@ Meteor.methods({ return to; }); + if (!hasPermission(Meteor.userId(), 'create-d')) { + // If the user can't create DMs but can access already existing ones + if (hasPermission(Meteor.userId(), 'view-d-room')) { + // Check if the direct room already exists, then return it + + const uids = [me, ...users].map(({ _id }) => _id).sort(); + const room = Rooms.findOneDirectRoomContainingAllUserIDs(uids, { fields: { _id: 1 } }); + if (room) { + return { + t: 'd', + rid: room._id, + ...room, + }; + } + } + + throw new Meteor.Error('error-not-allowed', 'Not allowed', { + method: 'createDirectMessage', + }); + } + const { _id: rid, inserted, ...room } = createRoom('d', null, null, [me, ...users], null, { }, { creator: me._id }); return { diff --git a/server/methods/messageSearch.js b/server/methods/messageSearch.js index f58674c598ef..e0fb9f394541 100644 --- a/server/methods/messageSearch.js +++ b/server/methods/messageSearch.js @@ -117,6 +117,16 @@ Meteor.methods({ return ''; } + function filterTitle(_, tag) { + query['attachments.title'] = new RegExp(s.escapeRegExp(tag), 'i'); + return ''; + } + + function filterDescription(_, tag) { + query['attachments.description'] = new RegExp(s.escapeRegExp(tag), 'i'); + return ''; + } + function sortByTimestamp(_, direction) { if (direction.startsWith('asc')) { options.sort.ts = 1; @@ -171,6 +181,10 @@ Meteor.methods({ text = text.replace(/has:location|has:map/g, filterLocation); // Filter image tags text = text.replace(/label:(\w+)/g, filterLabel); + // Filter on description of messages. + text = text.replace(/file-desc:(\w+)/g, filterDescription); + // Filter on title of messages. + text = text.replace(/file-title:(\w+)/g, filterTitle); // Filtering before/after/on a date // matches dd-MM-yyyy, dd/MM/yyyy, dd-MM-yyyy, prefixed by before:, after: and on: respectively. // Example: before:15/09/2016 after: 10-08-2016 diff --git a/server/methods/readMessages.js b/server/methods/readMessages.js index b33c61cd544d..08b394f8c51d 100644 --- a/server/methods/readMessages.js +++ b/server/methods/readMessages.js @@ -1,8 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; -import { callbacks } from '../../app/callbacks'; -import { Subscriptions } from '../../app/models'; +import { callbacks } from '../../app/callbacks/server'; +import { Subscriptions } from '../../app/models/server'; +import { NotificationQueue } from '../../app/models/server/raw'; Meteor.methods({ readMessages(rid) { @@ -29,6 +30,8 @@ Meteor.methods({ Subscriptions.setAsReadByRoomIdAndUserId(rid, userId); + NotificationQueue.clearQueueByUserId(userId); + Meteor.defer(() => { callbacks.run('afterReadMessages', rid, { userId, lastSeen: userSubscription.ls }); }); diff --git a/server/publications/room/index.js b/server/publications/room/index.js index 98fd2ea29caf..3009ea0869c4 100644 --- a/server/publications/room/index.js +++ b/server/publications/room/index.js @@ -52,6 +52,7 @@ export const fields = { e2eKeyId: 1, departmentId: 1, servedBy: 1, + priorityId: 1, // fields used by DMs usernames: 1, diff --git a/server/publications/settings/index.js b/server/publications/settings/index.js index 005123a8b253..81651a50bcbd 100644 --- a/server/publications/settings/index.js +++ b/server/publications/settings/index.js @@ -3,7 +3,7 @@ import { Meteor } from 'meteor/meteor'; import { Settings } from '../../../app/models/server'; import { Notifications } from '../../../app/notifications/server'; import { hasPermission, hasAtLeastOnePermission } from '../../../app/authorization/server'; -import { getSettingPermissionId } from '../../../app/authorization/lib.js'; +import { getSettingPermissionId } from '../../../app/authorization/lib'; Meteor.methods({ 'public-settings/get'(updatedAt) { diff --git a/server/routes/avatar/middlewares/browserVersion.js b/server/routes/avatar/middlewares/browserVersion.js new file mode 100644 index 000000000000..b430a97a94f9 --- /dev/null +++ b/server/routes/avatar/middlewares/browserVersion.js @@ -0,0 +1,129 @@ +import { WebApp } from 'meteor/webapp'; +import parser from 'ua-parser-js'; + +import { getURL } from '../../../../app/utils/lib/getURL'; + +return WebApp.connectHandlers.use(function(req, res, next) { + if (req.cookies.browser_version_check === 'bypass') { + return next(); + } + + const result = parser(req.headers['user-agent']); + if (req.cookies.browser_version_check !== 'force' && (!result || result.browser.name !== 'IE' || parseInt(result.browser.version) >= 11)) { + return next(); + } + + res.setHeader('content-type', 'text/html; charset=utf-8'); + + res.write(` + + +
+
+
Browser not supported
+ Check the documentation + Proceed anyway +
+
+ `); + + return res.end(); +}); diff --git a/server/routes/avatar/middlewares/index.js b/server/routes/avatar/middlewares/index.js index b85d9efc13c4..9b55e2e53e74 100644 --- a/server/routes/avatar/middlewares/index.js +++ b/server/routes/avatar/middlewares/index.js @@ -2,4 +2,6 @@ import { WebApp } from 'meteor/webapp'; import { protectAvatars } from './auth'; +import './browserVersion'; + WebApp.connectHandlers.use('/avatar/', protectAvatars); diff --git a/server/startup/migrations/index.js b/server/startup/migrations/index.js index 1085c8ea77df..e6de5e3f475e 100644 --- a/server/startup/migrations/index.js +++ b/server/startup/migrations/index.js @@ -178,8 +178,11 @@ import './v177'; import './v178'; import './v179'; import './v180'; -import './v181'; import './v182'; import './v183'; import './v184'; +import './v185'; +import './v186'; +import './v187'; +import './v188'; import './xrun'; diff --git a/server/startup/migrations/v153.js b/server/startup/migrations/v153.js index baccdf18bff0..c33ff55e6dc9 100644 --- a/server/startup/migrations/v153.js +++ b/server/startup/migrations/v153.js @@ -24,8 +24,8 @@ Migrations.add({ const inquiry = LivechatInquiry.findOneByRoomId(room._id); if (!inquiry) { try { - const { _id, fname, v } = room; - createLivechatInquiry(_id, fname, v, { msg: '' }, 'taken'); + const { _id: rid, fname: name, v: guest } = room; + createLivechatInquiry({ rid, name, guest, message: { msg: '' }, initialStatus: 'taken' }); } catch (error) { console.error(error); } diff --git a/server/startup/migrations/v181.js b/server/startup/migrations/v181.js deleted file mode 100644 index bdcf8fbfd08c..000000000000 --- a/server/startup/migrations/v181.js +++ /dev/null @@ -1,18 +0,0 @@ -import { Push } from 'meteor/rocketchat:push'; - -import { Migrations } from '../../../app/migrations/server'; -import { Settings } from '../../../app/models/server'; - -Migrations.add({ - version: 181, - async up() { - Settings.update({ _id: 'Push_send_interval', value: 5000 }, { $set: { value: 2000 } }); - Settings.update({ _id: 'Push_send_batch_size', value: 10 }, { $set: { value: 100 } }); - - const date = new Date(); - date.setHours(date.getHours() - 2); // 2 hours ago; - - // Remove all records older than 2h - Push.notifications.rawCollection().removeMany({ createdAt: { $lt: date } }); - }, -}); diff --git a/server/startup/migrations/v185.js b/server/startup/migrations/v185.js new file mode 100644 index 000000000000..c6a20c9aa398 --- /dev/null +++ b/server/startup/migrations/v185.js @@ -0,0 +1,21 @@ +import { + Migrations, +} from '../../../app/migrations/server'; +import { + Settings, +} from '../../../app/models/server'; + +Migrations.add({ + version: 185, + up() { + const setting = Settings.findOne({ _id: 'Message_SetNameToAliasEnabled' }); + if (setting.value) { + Settings.update({ _id: 'UI_Use_Real_Name' }, { + $set: { + value: true, + }, + }); + } + Settings.remove({ _id: 'Message_SetNameToAliasEnabled' }); + }, +}); diff --git a/server/startup/migrations/v186.js b/server/startup/migrations/v186.js new file mode 100644 index 000000000000..cef318718e8d --- /dev/null +++ b/server/startup/migrations/v186.js @@ -0,0 +1,19 @@ +import { Migrations } from '../../../app/migrations/server'; +import { LivechatInquiry } from '../../../app/models/server/raw'; + +Migrations.add({ + version: 186, + up() { + LivechatInquiry.find({}, { fields: { _id: 1, ts: 1 } }).forEach((inquiry) => { + const { _id, ts } = inquiry; + + LivechatInquiry.update({ _id }, { + $set: { + queueOrder: 1, + estimatedWaitingTimeQueue: 0, + estimatedServiceTimeAt: ts, + }, + }); + }); + }, +}); diff --git a/server/startup/migrations/v187.js b/server/startup/migrations/v187.js new file mode 100644 index 000000000000..6b430b8f7629 --- /dev/null +++ b/server/startup/migrations/v187.js @@ -0,0 +1,66 @@ +import { Mongo } from 'meteor/mongo'; + +import { Migrations } from '../../../app/migrations/server'; +import { Settings } from '../../../app/models/server'; +import { NotificationQueue } from '../../../app/models/server/raw'; + +function convertNotification(notification) { + try { + const { userId } = JSON.parse(notification.query); + const username = notification.payload.sender?.username; + const roomName = notification.title !== username ? notification.title : ''; + + const message = roomName === '' ? notification.text : notification.text.replace(`${ username }: `, ''); + + return { + _id: notification._id, + uid: userId, + rid: notification.payload.rid, + mid: notification.payload.messageId, + ts: notification.createdAt, + items: [{ + type: 'push', + data: { + payload: notification.payload, + roomName, + username, + message, + badge: notification.badge, + category: notification.apn?.category, + }, + }], + }; + } catch (e) { + // + } +} + +async function migrateNotifications() { + const notificationsCollection = new Mongo.Collection('_raix_push_notifications'); + + const date = new Date(); + date.setHours(date.getHours() - 2); // 2 hours ago; + + const cursor = notificationsCollection.rawCollection().find({ + createdAt: { $gte: date }, + }); + for await (const notification of cursor) { + const newNotification = convertNotification(notification); + if (newNotification) { + await NotificationQueue.insertOne(newNotification); + } + } + return notificationsCollection.rawCollection().drop(); +} + +Migrations.add({ + version: 187, + up() { + Settings.remove({ _id: 'Push_send_interval' }); + Settings.remove({ _id: 'Push_send_batch_size' }); + Settings.remove({ _id: 'Push_debug' }); + Settings.remove({ _id: 'Notifications_Always_Notify_Mobile' }); + + Promise.await(migrateNotifications()); + }, +}); diff --git a/server/startup/migrations/v188.js b/server/startup/migrations/v188.js new file mode 100644 index 000000000000..87288022e5ad --- /dev/null +++ b/server/startup/migrations/v188.js @@ -0,0 +1,16 @@ +import { Migrations } from '../../../app/migrations/server'; +import { Permissions } from '../../../app/models/server'; + +const newRolePermissions = [ + 'view-d-room', + 'view-p-room', +]; + +const roleName = 'guest'; + +Migrations.add({ + version: 188, + up() { + Permissions.update({ _id: { $in: newRolePermissions } }, { $addToSet: { roles: roleName } }, { multi: true }); + }, +}); diff --git a/tests/end-to-end/api/01-users.js b/tests/end-to-end/api/01-users.js index 56de4a6a2db6..982e8b966540 100644 --- a/tests/end-to-end/api/01-users.js +++ b/tests/end-to-end/api/01-users.js @@ -196,7 +196,10 @@ describe('[Users]', function() { }); describe('[/users.info]', () => { - after(() => updatePermission('view-other-user-channels', ['admin'])); + after(() => { + updatePermission('view-other-user-channels', ['admin']); + updatePermission('view-full-other-user-info', ['admin']); + }); it('should return an error when the user does not exist', (done) => { request.get(api('users.info')) @@ -212,7 +215,6 @@ describe('[Users]', function() { }) .end(done); }); - it('should query information about a user by userId', (done) => { request.get(api('users.info')) .set(credentials) @@ -293,6 +295,45 @@ describe('[Users]', function() { .end(done); }); }); + it('should NOT return some services fields when request to another user\'s info even if the user has the necessary permission', (done) => { + updatePermission('view-full-other-user-info', ['admin']).then(() => { + request.get(api('users.info')) + .set(credentials) + .query({ + userId: targetUser._id, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.not.have.nested.property('user.services.emailCode'); + expect(res.body).to.not.have.nested.property('user.services.cloud'); + expect(res.body).to.not.have.nested.property('user.services.email2fa'); + expect(res.body).to.not.have.nested.property('user.services.totp'); + expect(res.body).to.not.have.nested.property('user.services.password'); + expect(res.body).to.not.have.nested.property('user.services.email'); + expect(res.body).to.not.have.nested.property('user.services.resume'); + }) + .end(done); + }); + }); + it('should return all services fields when request for myself data even without privileged permission', (done) => { + updatePermission('view-full-other-user-info', []).then(() => { + request.get(api('users.info')) + .set(credentials) + .query({ + userId: credentials['X-User-Id'], + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.nested.property('user.services.password'); + expect(res.body).to.have.nested.property('user.services.resume'); + }) + .end(done); + }); + }); }); describe('[/users.getPresence]', () => { it('should query a user\'s presence by userId', (done) => { diff --git a/tsconfig.json b/tsconfig.json index 84d64aaa3aaa..3ac6fd928b03 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,7 +29,7 @@ }, "moduleResolution": "node", "resolveJsonModule": true, - "types": ["node", "mocha"], + "types": ["node"], "esModuleInterop": true, "preserveSymlinks": true,