From 7ac473df7a16588254281bae6c1fa3a1ba97b598 Mon Sep 17 00:00:00 2001 From: Hugo Costa Date: Wed, 28 Feb 2024 15:14:52 -0300 Subject: [PATCH 01/23] fix(eslint-config): react config file export (#31845) Co-authored-by: Tasso Evangelista <2263066+tassoevan@users.noreply.github.com> --- .changeset/silly-socks-divide.md | 5 + apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 2 +- ee/apps/account-service/package.json | 2 +- ee/apps/authorization-service/package.json | 2 +- ee/apps/ddp-streamer/package.json | 2 +- ee/apps/omnichannel-transcript/package.json | 2 +- ee/apps/presence-service/package.json | 2 +- ee/apps/queue-worker/package.json | 2 +- ee/apps/stream-hub-service/package.json | 2 +- ee/packages/api-client/package.json | 2 +- ee/packages/ddp-client/package.json | 2 +- ee/packages/license/package.json | 2 +- ee/packages/omnichannel-services/package.json | 2 +- ee/packages/pdf-worker/package.json | 2 +- ee/packages/presence/package.json | 2 +- ee/packages/ui-theming/package.json | 2 +- packages/account-utils/package.json | 2 +- packages/agenda/package.json | 2 +- packages/base64/package.json | 2 +- packages/cas-validate/package.json | 2 +- packages/core-services/package.json | 2 +- packages/core-typings/package.json | 2 +- packages/cron/package.json | 2 +- packages/eslint-config/package.json | 2 +- packages/favicon/package.json | 2 +- packages/fuselage-ui-kit/package.json | 2 +- packages/gazzodown/package.json | 2 +- packages/i18n/package.json | 2 +- packages/instance-status/package.json | 2 +- packages/jwt/package.json | 2 +- packages/livechat/package.json | 2 +- packages/log-format/package.json | 2 +- packages/logger/package.json | 2 +- packages/message-parser/package.json | 2 +- packages/mock-providers/package.json | 2 +- packages/model-typings/package.json | 2 +- packages/models/package.json | 2 +- packages/node-poplib/package.json | 2 +- packages/password-policies/package.json | 2 +- packages/peggy-loader/package.json | 2 +- packages/random/package.json | 2 +- packages/release-action/package.json | 2 +- packages/release-changelog/package.json | 2 +- packages/rest-typings/package.json | 2 +- .../server-cloud-communication/package.json | 2 +- packages/server-fetch/package.json | 2 +- packages/sha256/package.json | 2 +- packages/tools/package.json | 2 +- packages/ui-avatar/package.json | 2 +- packages/ui-client/package.json | 2 +- packages/ui-composer/package.json | 2 +- packages/ui-contexts/package.json | 2 +- packages/ui-kit/package.json | 2 +- packages/ui-video-conf/package.json | 2 +- packages/uikit-playground/package.json | 2 +- packages/web-ui-registration/package.json | 2 +- yarn.lock | 146 ++++++++---------- 58 files changed, 124 insertions(+), 139 deletions(-) create mode 100644 .changeset/silly-socks-divide.md diff --git a/.changeset/silly-socks-divide.md b/.changeset/silly-socks-divide.md new file mode 100644 index 0000000000000..aeaa5619a8b23 --- /dev/null +++ b/.changeset/silly-socks-divide.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/eslint-config": patch +--- + +Fixed react eslint config diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 00a425ac60efc..576e354d68cb1 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -62,7 +62,7 @@ "pino-pretty": "^7.6.1", "pm2": "^5.2.0", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "volta": { "extends": "../../../package.json" diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 0d9d0ecd3b704..13a749652ce6a 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -210,7 +210,7 @@ "supports-color": "~7.2.0", "template-file": "^6.0.1", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "dependencies": { "@babel/runtime": "~7.22.15", diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index fc8009c40ea9d..f02242b0661ec 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -44,7 +44,7 @@ "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "main": "./dist/ee/apps/account-service/src/service.js", "files": [ diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index 5a72761f597b2..18caff67ffbc2 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -41,7 +41,7 @@ "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "main": "./dist/ee/apps/authorization-service/src/service.js", "files": [ diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index 65340aa2887eb..327683a838699 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -57,7 +57,7 @@ "eslint": "~8.45.0", "pino-pretty": "^7.6.1", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "main": "./dist/service.js", "files": [ diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index f04bc3af8b508..3e7a6b1f44e94 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -48,7 +48,7 @@ "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "main": "./dist/ee/apps/omnichannel-transcript/src/service.js", "files": [ diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index 955fe30be8c1a..e682630ee5944 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -41,7 +41,7 @@ "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "main": "./dist/ee/apps/presence-service/src/service.js", "files": [ diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index 1d6c7b938abe1..80d7b604f9642 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -45,7 +45,7 @@ "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "main": "./dist/ee/apps/queue-worker/src/service.js", "files": [ diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index d51768be9d7bc..ba0cefb140ddf 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -43,7 +43,7 @@ "@types/polka": "^0.5.6", "eslint": "~8.45.0", "ts-node": "^10.9.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "main": "./dist/ee/apps/stream-hub-service/src/service.js", "files": [ diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index edbb3fa686cbe..93a60df954d50 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -11,7 +11,7 @@ "jest": "~29.6.4", "jest-fetch-mock": "^3.0.3", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index 8ae25f9b443be..c4b632b4bd7fe 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -12,7 +12,7 @@ "jest-environment-jsdom": "~29.6.4", "jest-websocket-mock": "^2.4.0", "ts-jest": "^29.1.2", - "typescript": "^5.3.2", + "typescript": "~5.3.3", "ws": "^8.13.0" }, "peerDependencies": { diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json index 3f65c903816e7..f5f9f9dbe8ec4 100644 --- a/ee/packages/license/package.json +++ b/ee/packages/license/package.json @@ -13,7 +13,7 @@ "jest-environment-jsdom": "~29.6.4", "jest-websocket-mock": "^2.4.0", "ts-jest": "~29.1.1", - "typescript": "^5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index 340a008293dee..253f44999d977 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -8,7 +8,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "dependencies": { "@rocket.chat/core-services": "workspace:^", diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index 8c51bd06fe201..df82a24cbf862 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -16,7 +16,7 @@ "jest-environment-jsdom": "~29.6.4", "react-dom": "^18.2.0", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index 321906d4f76a5..1ed3007fff895 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -13,7 +13,7 @@ "babel-jest": "^29.0.3", "eslint": "~8.45.0", "jest": "~29.6.4", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint src", diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json index 63732ae16db52..a8945368b45ac 100644 --- a/ee/packages/ui-theming/package.json +++ b/ee/packages/ui-theming/package.json @@ -29,7 +29,7 @@ "react": "~17.0.2", "react-docgen-typescript-plugin": "~1.0.5", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/account-utils/package.json b/packages/account-utils/package.json index 4530fa86c3ba1..d6c8161f264c0 100644 --- a/packages/account-utils/package.json +++ b/packages/account-utils/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/agenda/package.json b/packages/agenda/package.json index 8880aa126da8d..7351f373c8613 100644 --- a/packages/agenda/package.json +++ b/packages/agenda/package.json @@ -17,7 +17,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/base64/package.json b/packages/base64/package.json index 99f9effe2ab0e..a7fd818270f15 100644 --- a/packages/base64/package.json +++ b/packages/base64/package.json @@ -21,7 +21,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "volta": { "extends": "../../package.json" diff --git a/packages/cas-validate/package.json b/packages/cas-validate/package.json index 79cd4a03d6446..8459c72ab4ea4 100644 --- a/packages/cas-validate/package.json +++ b/packages/cas-validate/package.json @@ -8,7 +8,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 868775a355f3b..4bcbd2d7d1962 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -15,7 +15,7 @@ "jest": "~29.6.4", "mongodb": "^4.17.2", "prettier": "~2.8.8", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 930fbc77717b7..5889cbfa1dcd7 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -8,7 +8,7 @@ "eslint": "~8.45.0", "mongodb": "^4.17.2", "prettier": "~2.8.8", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/cron/package.json b/packages/cron/package.json index 9d9b2fb936f46..eed5bc3cab356 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index ebfde8c5612be..252986724eaee 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -32,6 +32,6 @@ "/node", "/style", "/variables", - "/react" + "react.js" ] } diff --git a/packages/favicon/package.json b/packages/favicon/package.json index 0166a5e6263dc..b61eaee02a688 100644 --- a/packages/favicon/package.json +++ b/packages/favicon/package.json @@ -4,7 +4,7 @@ "private": true, "devDependencies": { "eslint": "~8.45.0", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 69a1f1525eddf..f4a8fb062e815 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -97,7 +97,7 @@ "rimraf": "^3.0.2", "storybook-dark-mode": "~3.0.1", "tslib": "^2.5.3", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "dependencies": { "@rocket.chat/gazzodown": "workspace:^", diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index da2d978b46c51..73b164905f931 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -46,7 +46,7 @@ "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "~17.0.2", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 8e41a6593ff8f..0b65daefcaad9 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -10,7 +10,7 @@ "jest": "~29.6.4", "ts-jest": "~29.1.1", "tsup": "^6.7.0", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "build": "node ./src/index.mjs", diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index 362818b7e8093..59136688e3130 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "mongodb": "^4.17.2", "prettier": "~2.8.8", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/jwt/package.json b/packages/jwt/package.json index 7731e66ab13ae..d93ec0dc4228d 100644 --- a/packages/jwt/package.json +++ b/packages/jwt/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "^29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/livechat/package.json b/packages/livechat/package.json index c5ce385f03455..c5bbb001cd1d1 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -82,7 +82,7 @@ "stylelint-order": "^5.0.0", "svg-loader": "^0.0.2", "terser-webpack-plugin": "~4.2.3", - "typescript": "~5.3.2", + "typescript": "~5.3.3", "url-loader": "^4.1.1", "webpack": "^5.89.0", "webpack-bundle-analyzer": "^4.9.1", diff --git a/packages/log-format/package.json b/packages/log-format/package.json index 43b2ee55738b3..33eeacd1272fa 100644 --- a/packages/log-format/package.json +++ b/packages/log-format/package.json @@ -9,7 +9,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/logger/package.json b/packages/logger/package.json index fca694e53d57c..efbe5aa6e12f1 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/message-parser/package.json b/packages/message-parser/package.json index 5a4ff3ba8ba2f..4dea09d7fca40 100644 --- a/packages/message-parser/package.json +++ b/packages/message-parser/package.json @@ -68,7 +68,7 @@ "ts-jest": "~29.1.0", "ts-loader": "~9.4.2", "typedoc": "~0.24.1", - "typescript": "~5.0.4", + "typescript": "~5.3.3", "webpack": "~5.78.0", "webpack-cli": "~5.0.1" }, diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json index 93bbd7a01968e..88571e402435f 100644 --- a/packages/mock-providers/package.json +++ b/packages/mock-providers/package.json @@ -16,7 +16,7 @@ "jest": "~29.6.4", "react": "~17.0.2", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "peerDependencies": { "@tanstack/react-query": "*", diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index 2ab3abd2d1d1a..6bc0059d5bb46 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -9,7 +9,7 @@ "jest": "~29.6.4", "mongodb": "^4.17.2", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/models/package.json b/packages/models/package.json index 336ad812ced70..c1e168b2e4179 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "dependencies": { "@rocket.chat/model-typings": "workspace:^" diff --git a/packages/node-poplib/package.json b/packages/node-poplib/package.json index 1db06d479638c..9e9a112945e6d 100644 --- a/packages/node-poplib/package.json +++ b/packages/node-poplib/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "test": "jest" diff --git a/packages/password-policies/package.json b/packages/password-policies/package.json index 2040c217805f4..920554bad2032 100644 --- a/packages/password-policies/package.json +++ b/packages/password-policies/package.json @@ -9,7 +9,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/peggy-loader/package.json b/packages/peggy-loader/package.json index eaa775d7c9959..2b1983bfa62a9 100644 --- a/packages/peggy-loader/package.json +++ b/packages/peggy-loader/package.json @@ -51,7 +51,7 @@ "prettier": "~2.8.7", "rimraf": "^3.0.2", "ts-jest": "~29.1.0", - "typescript": "~5.0.4", + "typescript": "~5.3.3", "webpack": "~5.78.0" } } diff --git a/packages/random/package.json b/packages/random/package.json index 08624a05424a9..343ce2344ab18 100644 --- a/packages/random/package.json +++ b/packages/random/package.json @@ -23,7 +23,7 @@ "jest": "~29.6.4", "jest-environment-jsdom": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "volta": { "extends": "../../package.json" diff --git a/packages/release-action/package.json b/packages/release-action/package.json index c5aac2e9fb64f..77ae0587e79a8 100644 --- a/packages/release-action/package.json +++ b/packages/release-action/package.json @@ -11,7 +11,7 @@ "packageManager": "yarn@3.5.1", "devDependencies": { "@types/node": "^16.18.60", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "dependencies": { "@actions/core": "^1.10.1", diff --git a/packages/release-changelog/package.json b/packages/release-changelog/package.json index e3c1db973736f..9e48d015b3218 100644 --- a/packages/release-changelog/package.json +++ b/packages/release-changelog/package.json @@ -12,7 +12,7 @@ "@rocket.chat/eslint-config": "workspace:^", "@types/node": "^14.18.63", "eslint": "~8.45.0", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "dependencies": { "dataloader": "^1.4.0", diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 34a2a79086a07..853b72e64c557 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -10,7 +10,7 @@ "jest-environment-jsdom": "~29.6.4", "mongodb": "^4.17.2", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/server-cloud-communication/package.json b/packages/server-cloud-communication/package.json index ce3bb5050865c..878a0565306b6 100644 --- a/packages/server-cloud-communication/package.json +++ b/packages/server-cloud-communication/package.json @@ -8,7 +8,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "volta": { "extends": "../../package.json" diff --git a/packages/server-fetch/package.json b/packages/server-fetch/package.json index b0fb30ecb6fdc..e1527e9287038 100644 --- a/packages/server-fetch/package.json +++ b/packages/server-fetch/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/sha256/package.json b/packages/sha256/package.json index ce0d51c41f7e7..1b2f1fa6b5230 100644 --- a/packages/sha256/package.json +++ b/packages/sha256/package.json @@ -21,7 +21,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "volta": { "extends": "../../package.json" diff --git a/packages/tools/package.json b/packages/tools/package.json index f8bba3185d8a2..e6bbae9b5be6e 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index e968d4567d9ca..f64c5a2383aea 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -15,7 +15,7 @@ "eslint-plugin-storybook": "~0.6.15", "eslint-plugin-testing-library": "~5.11.1", "react": "^17.0.2", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 64b39555e3a2a..360e7ef8c02e2 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -40,7 +40,7 @@ "react-dom": "^17.0.2", "react-hook-form": "~7.45.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index f3ac9ea3d5551..468c45b1c39c5 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -24,7 +24,7 @@ "jest": "~29.6.4", "react-docgen-typescript-plugin": "~1.0.5", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "peerDependencies": { "@react-aria/toolbar": "*", diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 223de3de48def..88cf949119739 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -18,7 +18,7 @@ "mongodb": "^4.17.2", "react": "~17.0.2", "ts-jest": "~29.1.1", - "typescript": "~5.3.2", + "typescript": "~5.3.3", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index b2ee9668680dd..23cd40877dfe5 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -50,7 +50,7 @@ "ts-loader": "~9.4.2", "ts-node": "~10.9.1", "ts-patch": "~3.0.2", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "dependencies": { "typia": "~5.3.3" diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index 156d5594fabe1..5fa7370d0d215 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -28,7 +28,7 @@ "jest": "~29.6.4", "react-docgen-typescript-plugin": "~1.0.5", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "peerDependencies": { "@rocket.chat/css-in-js": "*", diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index 6028c769f1891..f9aa9987a6585 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -50,7 +50,7 @@ "eslint": "~8.45.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.4", - "typescript": "~5.3.2", + "typescript": "~5.3.3", "vite": "^4.3.9" }, "volta": { diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index 3024d92e689f3..eb286933d3bbd 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -46,7 +46,7 @@ "react-i18next": "~13.2.2", "storybook-dark-mode": "~3.0.1", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "peerDependencies": { "@rocket.chat/layout": "*", diff --git a/yarn.lock b/yarn.lock index 8b88334934942..c0ec55ab90f51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8273,7 +8273,7 @@ __metadata: pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.3.2 + typescript: ~5.3.3 uuid: ^9.0.1 languageName: unknown linkType: soft @@ -8286,7 +8286,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8305,7 +8305,7 @@ __metadata: moment-timezone: ~0.5.43 mongodb: ^4.17.2 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8327,7 +8327,7 @@ __metadata: split-on-first: ^3.0.0 strict-uri-encode: ^2.0.0 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8377,7 +8377,7 @@ __metadata: pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8393,7 +8393,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8406,7 +8406,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8435,7 +8435,7 @@ __metadata: jest: ~29.6.4 mongodb: ^4.17.2 prettier: ~2.8.8 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8451,7 +8451,7 @@ __metadata: eslint: ~8.45.0 mongodb: ^4.17.2 prettier: ~2.8.8 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8468,7 +8468,7 @@ __metadata: jest: ~29.6.4 mongodb: ^4.17.2 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8509,7 +8509,7 @@ __metadata: jest-environment-jsdom: ~29.6.4 jest-websocket-mock: ^2.4.0 ts-jest: ^29.1.2 - typescript: ^5.3.2 + typescript: ~5.3.3 ws: ^8.13.0 peerDependencies: "@rocket.chat/emitter": "*" @@ -8557,7 +8557,7 @@ __metadata: polka: ^0.5.2 sharp: ^0.32.6 ts-node: ^10.9.1 - typescript: ~5.3.2 + typescript: ~5.3.3 underscore: ^1.13.6 uuid: ^7.0.3 ws: ^8.8.1 @@ -8596,7 +8596,7 @@ __metadata: resolution: "@rocket.chat/favicon@workspace:packages/favicon" dependencies: eslint: ~8.45.0 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8752,7 +8752,7 @@ __metadata: rimraf: ^3.0.2 storybook-dark-mode: ~3.0.1 tslib: ^2.5.3 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@rocket.chat/apps-engine": "*" "@rocket.chat/eslint-config": 0.6.1 @@ -8845,7 +8845,7 @@ __metadata: react-dom: ~17.0.2 react-error-boundary: ^3.1.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": "*" @@ -8871,7 +8871,7 @@ __metadata: jest: ~29.6.4 ts-jest: ~29.1.1 tsup: ^6.7.0 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8891,7 +8891,7 @@ __metadata: eslint: ~8.45.0 mongodb: ^4.17.2 prettier: ~2.8.8 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8904,7 +8904,7 @@ __metadata: jest: ~29.6.4 jose: ^4.14.4 ts-jest: ^29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8938,7 +8938,7 @@ __metadata: jest-environment-jsdom: ~29.6.4 jest-websocket-mock: ^2.4.0 ts-jest: ~29.1.1 - typescript: ^5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9022,7 +9022,7 @@ __metadata: stylelint-order: ^5.0.0 svg-loader: ^0.0.2 terser-webpack-plugin: ~4.2.3 - typescript: ~5.3.2 + typescript: ~5.3.3 url-loader: ^4.1.1 webpack: ^5.89.0 webpack-bundle-analyzer: ^4.9.1 @@ -9047,7 +9047,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9061,7 +9061,7 @@ __metadata: jest: ~29.6.4 pino: ^8.15.0 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9110,7 +9110,7 @@ __metadata: ts-jest: ~29.1.0 ts-loader: ~9.4.2 typedoc: ~0.24.1 - typescript: ~5.0.4 + typescript: ~5.3.3 webpack: ~5.78.0 webpack-cli: ~5.0.1 languageName: unknown @@ -9481,7 +9481,7 @@ __metadata: turndown: ^7.1.2 twilio: ^3.76.1 twit: ^2.2.11 - typescript: ~5.3.2 + typescript: ~5.3.3 typia: ^5.3.3 ua-parser-js: ^1.0.37 underscore: ^1.13.6 @@ -9514,7 +9514,7 @@ __metadata: react: ~17.0.2 react-i18next: ~13.2.2 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@tanstack/react-query": "*" react: "*" @@ -9532,7 +9532,7 @@ __metadata: jest: ~29.6.4 mongodb: ^4.17.2 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9545,7 +9545,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9587,7 +9587,7 @@ __metadata: mongodb: ^4.17.2 pino: ^8.15.0 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9626,7 +9626,7 @@ __metadata: pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9661,7 +9661,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9691,7 +9691,7 @@ __metadata: react: ^18.2.0 react-dom: ^18.2.0 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9708,7 +9708,7 @@ __metadata: prettier: ~2.8.7 rimraf: ^3.0.2 ts-jest: ~29.1.0 - typescript: ~5.0.4 + typescript: ~5.3.3 webpack: ~5.78.0 peerDependencies: peggy: "*" @@ -9724,7 +9724,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9756,7 +9756,7 @@ __metadata: pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9778,7 +9778,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 mongodb: ^4.17.2 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9823,7 +9823,7 @@ __metadata: pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9840,7 +9840,7 @@ __metadata: jest: ~29.6.4 jest-environment-jsdom: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9859,7 +9859,7 @@ __metadata: remark-parse: 9.0.0 remark-stringify: 9.0.1 semver: ^7.5.2 - typescript: ~5.3.2 + typescript: ~5.3.3 unified: 9.2.2 languageName: unknown linkType: soft @@ -9874,7 +9874,7 @@ __metadata: dataloader: ^1.4.0 eslint: ~8.45.0 node-fetch: ^2 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9895,7 +9895,7 @@ __metadata: jest-environment-jsdom: ~29.6.4 mongodb: ^4.17.2 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9921,7 +9921,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9938,7 +9938,7 @@ __metadata: node-fetch: 2.3.0 proxy-from-env: ^1.1.0 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9954,7 +9954,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9988,7 +9988,7 @@ __metadata: pino: ^8.15.0 polka: ^0.5.2 ts-node: ^10.9.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -10028,7 +10028,7 @@ __metadata: jest: ~29.6.4 moment-timezone: ^0.5.43 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft @@ -10048,7 +10048,7 @@ __metadata: eslint-plugin-storybook: ~0.6.15 eslint-plugin-testing-library: ~5.11.1 react: ^17.0.2 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@rocket.chat/fuselage": "*" "@rocket.chat/ui-contexts": "*" @@ -10097,7 +10097,7 @@ __metadata: react-dom: ^17.0.2 react-hook-form: ~7.45.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@react-aria/toolbar": "*" "@rocket.chat/css-in-js": "*" @@ -10134,7 +10134,7 @@ __metadata: jest: ~29.6.4 react-docgen-typescript-plugin: ~1.0.5 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@react-aria/toolbar": "*" "@rocket.chat/fuselage": "*" @@ -10164,7 +10164,7 @@ __metadata: mongodb: ^4.17.2 react: ~17.0.2 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 use-sync-external-store: ^1.2.0 peerDependencies: "@rocket.chat/core-typings": "workspace:^" @@ -10198,7 +10198,7 @@ __metadata: ts-loader: ~9.4.2 ts-node: ~10.9.1 ts-patch: ~3.0.2 - typescript: ~5.3.2 + typescript: ~5.3.3 typia: ~5.3.3 languageName: unknown linkType: soft @@ -10233,7 +10233,7 @@ __metadata: react: ~17.0.2 react-docgen-typescript-plugin: ~1.0.5 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@rocket.chat/css-in-js": "*" "@rocket.chat/fuselage": "*" @@ -10273,7 +10273,7 @@ __metadata: jest: ~29.6.4 react-docgen-typescript-plugin: ~1.0.5 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@rocket.chat/css-in-js": "*" "@rocket.chat/fuselage": "*" @@ -10328,7 +10328,7 @@ __metadata: react-split-pane: ^0.1.92 react-virtuoso: ^4.3.10 reactflow: ^11.7.2 - typescript: ~5.3.2 + typescript: ~5.3.3 use-subscription: ^1.8.0 vite: ^4.3.9 languageName: unknown @@ -10367,7 +10367,7 @@ __metadata: react-i18next: ~13.2.2 storybook-dark-mode: ~3.0.1 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 peerDependencies: "@rocket.chat/layout": "*" "@rocket.chat/tools": 0.2.1 @@ -36221,7 +36221,7 @@ __metadata: sodium-native: ^3.3.0 sodium-plus: ^0.9.0 ts-node: ^10.9.1 - typescript: ~5.3.2 + typescript: ~5.3.3 uuid: ^8.3.2 ws: ^8.8.1 languageName: unknown @@ -40007,43 +40007,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.3.2, typescript@npm:~5.3.2": - version: 5.3.2 - resolution: "typescript@npm:5.3.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: d92534dda639eb825db013203404c1fabca8ac630564283c9e7dc9e64fd9c9346c2de95ecebdf3e6e8c1c32941bca1cfe0da37877611feb9daf8feeaea58d230 - languageName: node - linkType: hard - -"typescript@npm:~5.0.4": - version: 5.0.4 - resolution: "typescript@npm:5.0.4" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172 - languageName: node - linkType: hard - -"typescript@patch:typescript@^5.3.2#~builtin, typescript@patch:typescript@~5.3.2#~builtin": - version: 5.3.2 - resolution: "typescript@patch:typescript@npm%3A5.3.2#~builtin::version=5.3.2&hash=85af82" +"typescript@npm:~5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: c034461079fbfde3cb584ddee52afccb15b6e32a0ce186d0b2719968786f7ca73e1b07f71fac4163088790b16811c6ccf79680de190664ef66ff0ba9c1fe4a23 + checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2 languageName: node linkType: hard -"typescript@patch:typescript@~5.0.4#~builtin": - version: 5.0.4 - resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin::version=5.0.4&hash=85af82" +"typescript@patch:typescript@~5.3.3#~builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=85af82" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: bb309d320c59a26565fb3793dba550576ab861018ff3fd1b7fccabbe46ae4a35546bc45f342c0a0b6f265c801ccdf64ffd68f548f117ceb7f0eac4b805cd52a9 + checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610 languageName: node linkType: hard From 6fe9387b258783120563d179d79d5deca968fac2 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Wed, 28 Feb 2024 16:44:29 -0300 Subject: [PATCH 02/23] chore: Sidebar toolbar keyboard navigation (#31846) --- apps/meteor/client/sidebar/header/Header.tsx | 7 ++--- .../client/sidebar/header/HeaderUnstable.tsx | 5 ++-- .../sidebar/header/SidebarHeaderToolbar.tsx | 13 ++++++++++ .../sidebar/sections/OmnichannelSection.tsx | 9 ++++--- apps/meteor/package.json | 2 +- ee/packages/ui-theming/package.json | 2 +- packages/fuselage-ui-kit/package.json | 2 +- packages/gazzodown/package.json | 2 +- packages/i18n/src/locales/en.i18n.json | 2 ++ packages/ui-avatar/package.json | 2 +- packages/ui-client/package.json | 2 +- packages/ui-composer/package.json | 2 +- packages/ui-video-conf/package.json | 2 +- packages/uikit-playground/package.json | 2 +- yarn.lock | 26 +++++++++---------- 15 files changed, 49 insertions(+), 31 deletions(-) create mode 100644 apps/meteor/client/sidebar/header/SidebarHeaderToolbar.tsx diff --git a/apps/meteor/client/sidebar/header/Header.tsx b/apps/meteor/client/sidebar/header/Header.tsx index 8b1c838f8d621..b7f00af460aed 100644 --- a/apps/meteor/client/sidebar/header/Header.tsx +++ b/apps/meteor/client/sidebar/header/Header.tsx @@ -1,8 +1,9 @@ import { Sidebar } from '@rocket.chat/fuselage'; -import { useUser, useTranslation } from '@rocket.chat/ui-contexts'; +import { useTranslation, useUser } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import React, { memo } from 'react'; +import SidebarHeaderToolbar from './SidebarHeaderToolbar'; import UserAvatarWithStatus from './UserAvatarWithStatus'; import UserMenu from './UserMenu'; import Administration from './actions/Administration'; @@ -26,7 +27,7 @@ const Header = (): ReactElement => { return ( {user ? : } - + {user && ( @@ -38,7 +39,7 @@ const Header = (): ReactElement => { )} {!user && } - + ); }; diff --git a/apps/meteor/client/sidebar/header/HeaderUnstable.tsx b/apps/meteor/client/sidebar/header/HeaderUnstable.tsx index c732b646ccc63..ac6929bf2fb3d 100644 --- a/apps/meteor/client/sidebar/header/HeaderUnstable.tsx +++ b/apps/meteor/client/sidebar/header/HeaderUnstable.tsx @@ -3,6 +3,7 @@ import { useUserId, useTranslation } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import React, { memo } from 'react'; +import SidebarHeaderToolbar from './SidebarHeaderToolbar'; import CreateRoom from './actions/CreateRoom'; import Directory from './actions/Directory'; import Login from './actions/Login'; @@ -15,7 +16,7 @@ const HeaderUnstable = (): ReactElement => { return ( - + {uid && ( <> @@ -25,7 +26,7 @@ const HeaderUnstable = (): ReactElement => { )} {!uid && } - + ); }; diff --git a/apps/meteor/client/sidebar/header/SidebarHeaderToolbar.tsx b/apps/meteor/client/sidebar/header/SidebarHeaderToolbar.tsx new file mode 100644 index 0000000000000..d897c352072d9 --- /dev/null +++ b/apps/meteor/client/sidebar/header/SidebarHeaderToolbar.tsx @@ -0,0 +1,13 @@ +import { useToolbar } from '@react-aria/toolbar'; +import { TopBarActions } from '@rocket.chat/fuselage'; +import type { ComponentProps } from 'react'; +import React, { useRef } from 'react'; + +const SidebarHeaderToolbar = (props: ComponentProps) => { + const ref = useRef(null); + const { toolbarProps } = useToolbar(props, ref); + + return ; +}; + +export default SidebarHeaderToolbar; diff --git a/apps/meteor/client/sidebar/sections/OmnichannelSection.tsx b/apps/meteor/client/sidebar/sections/OmnichannelSection.tsx index c4538166bba0f..6dd63e6a36d49 100644 --- a/apps/meteor/client/sidebar/sections/OmnichannelSection.tsx +++ b/apps/meteor/client/sidebar/sections/OmnichannelSection.tsx @@ -6,6 +6,7 @@ import React, { memo } from 'react'; import { useIsCallEnabled, useIsCallReady } from '../../contexts/CallContext'; import { useIsOverMacLimit } from '../../hooks/omnichannel/useIsOverMacLimit'; import { useOmnichannelShowQueueLink } from '../../hooks/omnichannel/useOmnichannelShowQueueLink'; +import SidebarHeaderToolbar from '../header/SidebarHeaderToolbar'; import { OverMacLimitSection } from './OverMacLimitSection'; import { OmniChannelCallDialPad, OmnichannelCallToggle, OmnichannelLivechatToggle } from './actions'; @@ -38,9 +39,9 @@ const OmnichannelSection = () => { <> {isWorkspaceOverMacLimit && } - + {t('Omnichannel')} - + {showOmnichannelQueueLink && ( handleRoute('queue')} /> )} @@ -55,8 +56,8 @@ const OmnichannelSection = () => { /> )} {isCallReady && } - - + + ); }; diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 13a749652ce6a..113b9979f4926 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -240,7 +240,7 @@ "@rocket.chat/favicon": "workspace:^", "@rocket.chat/forked-matrix-appservice-bridge": "^4.0.2", "@rocket.chat/forked-matrix-bot-sdk": "^0.6.0-beta.3", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/fuselage-hooks": "^0.33.0", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/fuselage-toastbar": "~0.31.25", diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json index a8945368b45ac..8243c3a9d664a 100644 --- a/ee/packages/ui-theming/package.json +++ b/ee/packages/ui-theming/package.json @@ -4,7 +4,7 @@ "private": true, "devDependencies": { "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/fuselage-hooks": "^0.33.0", "@rocket.chat/icons": "^0.33.0", "@rocket.chat/ui-contexts": "workspace:~", diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index f4a8fb062e815..068e559f101a6 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -63,7 +63,7 @@ "@babel/preset-typescript": "~7.22.15", "@rocket.chat/apps-engine": "1.41.0", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/fuselage-hooks": "^0.33.0", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/icons": "^0.33.0", diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index 73b164905f931..b95a374fe96c6 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/fuselage-tokens": "~0.32.0", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/styled": "~0.31.25", diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json index 9088b80f4672e..271907a68caa6 100644 --- a/packages/i18n/src/locales/en.i18n.json +++ b/packages/i18n/src/locales/en.i18n.json @@ -3162,6 +3162,7 @@ "Livechat_offline_message_sent": "Livechat offline message sent", "Livechat_OfflineMessageToChannel_enabled": "Send Livechat offline messages to a channel", "Omnichannel_chat_closed_due_to_inactivity": "The chat was automatically closed because we haven't received any reply from {{guest}} in {{timeout}} seconds", + "Omnichannel_actions": "Omnichannel actions", "Omnichannel_on_hold_chat_resumed": "On Hold Chat Resumed: {{comment}}", "Omnichannel_on_hold_chat_automatically": "The chat was automatically resumed from On Hold upon receiving a new message from {{guest}}", "Omnichannel_on_hold_chat_resumed_manually": "The chat was manually resumed from On Hold by {{user}}", @@ -4816,6 +4817,7 @@ "Show_or_hide_the_user_roles_of_message_authors": "Show or hide the user roles of message authors.", "Show_or_hide_the_username_of_message_authors": "Show or hide the username of message authors.", "Sidebar": "Sidebar", + "Sidebar_actions": "Sidebar actions", "Sidebar_list_mode": "Sidebar Channel List Mode", "Sign_in_to_start_talking": "Sign in to start talking", "Sign_in_with__provider__": "Sign in with {{provider}}", diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index f64c5a2383aea..7bf05ddaf2537 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -4,7 +4,7 @@ "private": true, "devDependencies": { "@babel/core": "~7.22.20", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/ui-contexts": "workspace:^", "@types/babel__core": "~7.20.3", "@types/react": "~17.0.69", diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 360e7ef8c02e2..29518b2febe92 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@react-aria/toolbar": "^3.0.0-beta.1", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/fuselage-hooks": "^0.33.0", "@rocket.chat/icons": "^0.33.0", "@rocket.chat/mock-providers": "workspace:^", diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index 468c45b1c39c5..bc63d18be2b31 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@react-aria/toolbar": "^3.0.0-beta.1", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/icons": "^0.33.0", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index 5fa7370d0d215..2bdc366985b0f 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/fuselage-hooks": "^0.33.0", "@rocket.chat/icons": "^0.33.0", "@rocket.chat/styled": "~0.31.25", diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index f9aa9987a6585..f46a2a6f634c1 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -15,7 +15,7 @@ "@codemirror/tooltip": "^0.19.16", "@lezer/highlight": "^1.1.6", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.47.1", + "@rocket.chat/fuselage": "^0.48.0", "@rocket.chat/fuselage-hooks": "^0.33.0", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/fuselage-toastbar": "^0.31.25", diff --git a/yarn.lock b/yarn.lock index c0ec55ab90f51..42180b9cb174f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8717,7 +8717,7 @@ __metadata: "@babel/preset-typescript": ~7.22.15 "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/fuselage-hooks": ^0.33.0 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/gazzodown": "workspace:^" @@ -8772,9 +8772,9 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/fuselage@npm:^0.47.1": - version: 0.47.1 - resolution: "@rocket.chat/fuselage@npm:0.47.1" +"@rocket.chat/fuselage@npm:^0.48.0": + version: 0.48.0 + resolution: "@rocket.chat/fuselage@npm:0.48.0" dependencies: "@rocket.chat/css-in-js": ^0.31.25 "@rocket.chat/css-supports": ^0.31.25 @@ -8792,7 +8792,7 @@ __metadata: react: ^17.0.2 react-dom: ^17.0.2 react-virtuoso: 1.2.4 - checksum: d812e4ed52b53372268b4f5d396fb8d6aeb3f46a4f7e276642edf287ca2038f88e2a6d8bc0264f95fee1772aadc849419f7695e35cc6a278111efcbc18e1472d + checksum: d82121b6e6d0fa6ea204d8cbd2cc32460c4ca3585c05a1a1d908250c9150ed52edfd0acc75520cb29c6bd81a8671dc7d91f427913bcc4364a14b4eacd4bd2bf4 languageName: node linkType: hard @@ -8803,7 +8803,7 @@ __metadata: "@babel/core": ~7.22.20 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/fuselage-tokens": ~0.32.0 "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/styled": ~0.31.25 @@ -9158,7 +9158,7 @@ __metadata: "@rocket.chat/favicon": "workspace:^" "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.2 "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.3 - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/fuselage-hooks": ^0.33.0 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/fuselage-toastbar": ~0.31.25 @@ -10037,7 +10037,7 @@ __metadata: resolution: "@rocket.chat/ui-avatar@workspace:packages/ui-avatar" dependencies: "@babel/core": ~7.22.20 - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/ui-contexts": "workspace:^" "@types/babel__core": ~7.20.3 "@types/react": ~17.0.69 @@ -10063,7 +10063,7 @@ __metadata: "@babel/core": ~7.22.20 "@react-aria/toolbar": ^3.0.0-beta.1 "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/fuselage-hooks": ^0.33.0 "@rocket.chat/icons": ^0.33.0 "@rocket.chat/mock-providers": "workspace:^" @@ -10116,7 +10116,7 @@ __metadata: "@babel/core": ~7.22.20 "@react-aria/toolbar": ^3.0.0-beta.1 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/icons": ^0.33.0 "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 @@ -10208,7 +10208,7 @@ __metadata: resolution: "@rocket.chat/ui-theming@workspace:ee/packages/ui-theming" dependencies: "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/fuselage-hooks": ^0.33.0 "@rocket.chat/icons": ^0.33.0 "@rocket.chat/ui-contexts": "workspace:~" @@ -10251,7 +10251,7 @@ __metadata: "@rocket.chat/css-in-js": ~0.31.25 "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/fuselage-hooks": ^0.33.0 "@rocket.chat/icons": ^0.33.0 "@rocket.chat/styled": ~0.31.25 @@ -10296,7 +10296,7 @@ __metadata: "@codemirror/tooltip": ^0.19.16 "@lezer/highlight": ^1.1.6 "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.47.1 + "@rocket.chat/fuselage": ^0.48.0 "@rocket.chat/fuselage-hooks": ^0.33.0 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/fuselage-toastbar": ^0.31.25 From 59bac17148a039dde1e74be86ea398d46ec7fde9 Mon Sep 17 00:00:00 2001 From: "lingohub[bot]" <69908207+lingohub[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 21:58:23 -0500 Subject: [PATCH 03/23] =?UTF-8?q?i18n:=20Rocket.Chat=20language=20update?= =?UTF-8?q?=20from=20LingoHub=20=F0=9F=A4=96=20on=202024-02-28Z=20(#31856)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/i18n/src/locales/af.i18n.json | 11 ++ packages/i18n/src/locales/ar.i18n.json | 25 ++- packages/i18n/src/locales/az.i18n.json | 11 ++ packages/i18n/src/locales/be-BY.i18n.json | 11 ++ packages/i18n/src/locales/bg.i18n.json | 12 ++ packages/i18n/src/locales/bs.i18n.json | 12 ++ packages/i18n/src/locales/ca.i18n.json | 10 + packages/i18n/src/locales/cs.i18n.json | 25 ++- packages/i18n/src/locales/cy.i18n.json | 12 ++ packages/i18n/src/locales/da.i18n.json | 21 +++ packages/i18n/src/locales/de-AT.i18n.json | 11 ++ packages/i18n/src/locales/de.i18n.json | 6 + packages/i18n/src/locales/el.i18n.json | 9 + packages/i18n/src/locales/eo.i18n.json | 11 ++ packages/i18n/src/locales/es.i18n.json | 25 ++- packages/i18n/src/locales/et.i18n.json | 1 + packages/i18n/src/locales/eu.i18n.json | 2 + packages/i18n/src/locales/fa.i18n.json | 10 + packages/i18n/src/locales/fi.i18n.json | 6 + packages/i18n/src/locales/fr.i18n.json | 13 +- packages/i18n/src/locales/gl.i18n.json | 8 +- packages/i18n/src/locales/he.i18n.json | 14 ++ packages/i18n/src/locales/hi-IN.i18n.json | 217 ++++++++++++++++++++++ packages/i18n/src/locales/hi.i18n.json | 2 + packages/i18n/src/locales/hr.i18n.json | 9 + packages/i18n/src/locales/hu.i18n.json | 12 ++ packages/i18n/src/locales/id.i18n.json | 10 + packages/i18n/src/locales/it.i18n.json | 25 ++- packages/i18n/src/locales/ja.i18n.json | 6 + packages/i18n/src/locales/ka-GE.i18n.json | 15 ++ packages/i18n/src/locales/km.i18n.json | 13 ++ packages/i18n/src/locales/ko.i18n.json | 17 ++ packages/i18n/src/locales/ku.i18n.json | 10 + packages/i18n/src/locales/lo.i18n.json | 10 + packages/i18n/src/locales/lt.i18n.json | 11 ++ packages/i18n/src/locales/lv.i18n.json | 11 ++ packages/i18n/src/locales/mn.i18n.json | 11 ++ packages/i18n/src/locales/ms-MY.i18n.json | 10 + packages/i18n/src/locales/nl.i18n.json | 7 + packages/i18n/src/locales/no.i18n.json | 24 +++ packages/i18n/src/locales/pl.i18n.json | 19 +- packages/i18n/src/locales/pt-BR.i18n.json | 17 +- packages/i18n/src/locales/pt.i18n.json | 11 ++ packages/i18n/src/locales/ro.i18n.json | 10 + packages/i18n/src/locales/ru.i18n.json | 31 ++-- packages/i18n/src/locales/sk-SK.i18n.json | 12 ++ packages/i18n/src/locales/sl-SI.i18n.json | 12 ++ packages/i18n/src/locales/sq.i18n.json | 10 + packages/i18n/src/locales/sr.i18n.json | 13 ++ packages/i18n/src/locales/sv.i18n.json | 6 + packages/i18n/src/locales/ta-IN.i18n.json | 9 + packages/i18n/src/locales/th-TH.i18n.json | 12 ++ packages/i18n/src/locales/tr.i18n.json | 14 ++ packages/i18n/src/locales/ug.i18n.json | 6 + packages/i18n/src/locales/uk.i18n.json | 15 +- packages/i18n/src/locales/vi-VN.i18n.json | 13 ++ packages/i18n/src/locales/zh-HK.i18n.json | 12 ++ packages/i18n/src/locales/zh-TW.i18n.json | 7 + packages/i18n/src/locales/zh.i18n.json | 16 ++ 59 files changed, 875 insertions(+), 56 deletions(-) create mode 100644 packages/i18n/src/locales/hi-IN.i18n.json diff --git a/packages/i18n/src/locales/af.i18n.json b/packages/i18n/src/locales/af.i18n.json index 386ab9826ecea..05926a54689aa 100644 --- a/packages/i18n/src/locales/af.i18n.json +++ b/packages/i18n/src/locales/af.i18n.json @@ -320,6 +320,7 @@ "Apply": "aansoek doen", "Apply_and_refresh_all_clients": "Dien en verfris alle kliënte", "Apps": "programme", + "Apps_context_premium": "onderneming", "Apps_Settings": "Program se instellings", "Apps_WhatIsIt": "Programme: Wat is hulle?", "Apps_WhatIsIt_paragraph1": "'N Nuwe ikoon in die administrasie area! Wat beteken dit en wat is Apps?", @@ -1099,6 +1100,7 @@ "FEDERATION_Domain": "domein", "FEDERATION_Status": "status", "Retry_Count": "Probeer weer", + "Federation_Matrix_enabled": "enabled", "Field": "veld", "Field_removed": "Veld verwyder", "Field_required": "Veld benodig", @@ -1458,6 +1460,10 @@ "Layout_Terms_of_Service": "Diensbepalings", "LDAP": "LDAP", "LDAP_Description": "LDAP is 'n hiërargiese databasis wat baie maatskappye gebruik om 'n enkele teken aan te bied - 'n fasiliteit om een ​​wagwoord tussen verskeie webwerwe en dienste te deel. Vir gevorderde konfigurasie inligting en voorbeelde, raadpleeg asseblief ons wiki: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "enkripsie", + "LDAP_DataSync_BackgroundSync": "Agtergrondsinkronisering", + "LDAP_Server_Type": "Servertipe", + "LDAP_Server_Type_Other": "ander", "LDAP_Authentication": "in staat te stel", "LDAP_Authentication_Password": "wagwoord", "LDAP_Authentication_UserDN": "Gebruiker DN", @@ -2488,6 +2494,7 @@ "Unarchive": "Onargiveer", "unarchive-room": "Unarchive Room", "unarchive-room_description": "Toestemming om kanale te unarchive", + "unauthorized": "Nie gemagtig nie", "Unblock_User": "Ontblok gebruiker", "Unignore": "negeer lys verwyder", "Uninstall": "verwyder", @@ -2664,6 +2671,8 @@ "Visitor_Navigation": "Besoeker Navigasie", "Visitor_page_URL": "URL van besoekersbladsy", "Visitor_time_on_site": "Besoekers tyd op die webwerf", + "VoIP_Management_Server_Username": "Gebruikersnaam", + "VoIP_Management_Server_Password": "wagwoord", "Wait_activation_warning": "Voordat u kan inteken, moet u rekening handmatig deur 'n administrateur geaktiveer word.", "Warnings": "waarskuwings", "We_are_offline_Sorry_for_the_inconvenience": "Ons is vanlyn. Jammer vir die ongerief.", @@ -2738,6 +2747,7 @@ "Your_push_was_sent_to_s_devices": "Jou druk is gestuur na%s toestelle", "Your_server_link": "Jou bediener skakel", "Your_workspace_is_ready": "Jou werkruimte is gereed om 🎉 te gebruik", + "registration.page.login.errors.wrongCredentials": "Gebruiker nie gevind nie of verkeerde wagwoord", "registration.page.registration.waitActivationWarning": "Voordat u kan inteken, moet u rekening handmatig deur 'n administrateur geaktiveer word.", "registration.page.login.forgot": "Het jy jou wagwoord vergeet", "registration.page.resetPassword.sent": "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.", @@ -2747,6 +2757,7 @@ "registration.component.form.emailOrUsername": "E-pos of gebruikersnaam", "registration.component.form.username": "Gebruikersnaam", "registration.component.form.name": "naam", + "registration.component.form.userAlreadyExist": "Gebruikersnaam bestaan ​​reeds. Probeer asseblief 'n ander gebruikersnaam.", "registration.component.form.emailAlreadyExists": "E-pos bestaan ​​reeds", "registration.component.form.usernameAlreadyExists": "Gebruikersnaam bestaan ​​reeds. Probeer asseblief 'n ander gebruikersnaam.", "registration.component.form.invalidEmail": "Die ingevoerde e-pos is ongeldig", diff --git a/packages/i18n/src/locales/ar.i18n.json b/packages/i18n/src/locales/ar.i18n.json index 5fd02c33c1fe4..214a1940a3884 100644 --- a/packages/i18n/src/locales/ar.i18n.json +++ b/packages/i18n/src/locales/ar.i18n.json @@ -409,6 +409,7 @@ "API_Shield_Types_Description": "أنواع الدروع المحددة للتمكين كقائمة مفصولة بفواصل، اختر من بين \"على الإنترنت\" أو \"قناة\" أو \"*\" للكل", "Apps_Framework_Development_Mode": "تمكين وضع التطوير", "API_Shield_user_require_auth": "تلزم المصادقة لدروع المستخدمين", + "Calls_in_queue_many": "{{count}} من المكالمات الانتظار", "API_Token": "الرمز المميز لواجهة برمجة التطبيقات", "Apps_Framework_Development_Mode_Description": "يسمح وضع التطوير بتثبيت التطبيقات غير الواردة من سوق Rocket.Chat.", "API_Tokenpass_URL": "عنوان URL لخادم Tokenpass", @@ -441,6 +442,7 @@ "App_support_url": "عنوان url للدعم", "App_Url_to_Install_From": "تثبيت من عنوان URL", "App_Url_to_Install_From_File": "تثبيت من ملف", + "Calls_in_queue_few": "{{count}} من المكالمات الانتظار", "App_user_not_allowed_to_login": "لا يُسمح لمستخدمي التطبيق بتسجيل الدخول مباشرة.", "Appearance": "مظهر", "Application_added": "تمت إضافة التطبيق", @@ -451,6 +453,7 @@ "Apply_and_refresh_all_clients": "التطبيق وتحديث جميع العملاء", "Apps": "التطبيقات", "Apps_context_installed": "تم التثبيت", + "Apps_context_premium": "مؤسسة", "Apps_Engine_Version": "إصدار محرك التطبيقات", "Apps_Essential_Alert": "هذا التطبيق ضروري للأحداث التالية:", "Apps_Essential_Disclaimer": "سيتم تعطيل الأحداث المذكورة أعلاه إذا تم تعطيل هذا التطبيق. إذا كنت تريد أن يعمل Rocket.Chat بدون وظيفة هذا التطبيق، فسيلزمك إلغاء تثبيته", @@ -487,7 +490,6 @@ "Apps_License_Message_appId": "لم يتم إصدار الترخيص لهذا التطبيق", "Apps_License_Message_bundle": "ترخيص صادر لحزمة لا تحتوي على التطبيق", "Apps_License_Message_expire": "لم يعد الترخيص صالحًا ويحتاج إلى تجديد", - "Calls_in_queue_many": "{{count}} من المكالمات الانتظار", "Apps_License_Message_maxSeats": "لا يستوعب الترخيص العدد الحالي من المستخدمين النشطين. تُرجى زيادة عدد المقاعد", "Apps_License_Message_publicKey": "حدث خطأ أثناء محاولة فك تشفير الترخيص. تُرجى مزامنة مساحة العمل الخاصة بك في خدمات الاتصال وإعادة المحاولة.", "Apps_License_Message_renewal": "انتهت صلاحية الترخيص ويلزم تجديده", @@ -527,7 +529,6 @@ "Apps_Permissions_livechat-message_read": "الوصول إلى معلومات رسالة Livechat ", "Apps_Permissions_livechat-message_write": "تعديل معلومات رسالة Livechat ", "Apps_Permissions_livechat-room_read": "الوصول إلى معلومات غرفة Livechat", - "Calls_in_queue_few": "{{count}} من المكالمات الانتظار", "Apps_Permissions_livechat-room_write": "تعديل معلومات غرفة Livechat", "Apps_Permissions_livechat-department_read": "الوصول إلى معلومات قسم Livechat", "Apps_Permissions_livechat-department_multiple": "الوصول إلى معلومات أقسام Livechat المتعددة", @@ -1375,6 +1376,7 @@ "Desktop_Notifications_Not_Enabled": "إشعارات سطح المكتب غير ممكّنة", "Details": "التفاصيل", "line": "السطر", + "Device_Management_IP": " عنوان IP", "Different_Style_For_User_Mentions": "نمط مختلف لإشارات المستخدم", "Livechat_Facebook_API_Key": "مفتاح واجهة برمجة تطبيقات Channel متعددة الاتجاهات", "Direct": "مباشر", @@ -1627,6 +1629,7 @@ "Enter_Normal": "الوضع العادي (إرسال باستخدام إنتر)", "Enter_to": "إدخال إلى", "Enter_your_E2E_password": "أدخل كلمة مرور التشفير بين الطرفيات", + "message_counter_many": "{{count}} رسائل", "Entertainment": "الترفيه", "Error": "خطأ", "Error_something_went_wrong": "أُووبس! هناك خطأ ما. يرجى إعادة تحميل الصفحة أو الاتصال بالمسؤول.", @@ -1674,6 +1677,7 @@ "error-forwarding-department-target-not-allowed": "غير مسموح بإعادة التوجيه إلى القسم المستهدف.", "error-guests-cant-have-other-roles": "لا يمكن أن يكون للمستخدمين الضيوف أي دور آخر.", "error-import-file-extract-error": "فشل استخراج ملف الاستيراد.", + "meteor_status_reconnect_in_many": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "error-import-file-is-empty": "يبدو أن الملف المستورد فارغ.", "error-import-file-missing": "لم يتم العثور على الملف المراد استيراده على المسار المحدد.", "error-importer-not-defined": "لم يتم تحديد المستورِد بطريقة صحيحة، ففئة الاستيراد غير محددة به.", @@ -1769,6 +1773,7 @@ "error-this-is-not-a-livechat-room": "هذه ليست غرفة قناة متعددة الاتجاهات", "error-token-already-exists": "سبق وجود رمز مميز بهذا الاسم", "error-token-does-not-exists": "لا يوجد رمز مميز", + "message_counter_few": "{{count}} رسائل", "error-too-many-requests": "خطأ، تلقينا الكثير من الطلبات. من فضلك أبطئ الوتيرة، يلزمك الانتظار مدة {{seconds}} من الثواني قبل المحاولة مرة أخرى.", "error-transcript-already-requested": "سبق طلب نسخة مكتوبة", "error-unpinning-message": "تعذر إلغاء تثبيت الرسالة", @@ -1821,6 +1826,7 @@ "Extension_Number": "رقم الامتداد", "Extension_Status": "حالة الامتداد", "External": "خارجي", + "meteor_status_reconnect_in_few": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "External_Domains": "النطاقات الخارجية", "External_Queue_Service_URL": "عنوان URL لخدمة قائمة الانتظار الخارجية", "External_Service": "الخدمة الخارجية", @@ -1966,7 +1972,6 @@ "Finish": "إنهاء", "Finish_Registration": "إنهاء التسجيل", "First_Channel_After_Login": "أول Channel بعد تسجيل الدخول", - "message_counter_many": "{{count}} رسائل", "First_response_time": "وقت للاستجابة الأولى", "Flags": "أعلام", "Follow_message": "رسالة المتابعة", @@ -2026,7 +2031,6 @@ "get-password-policy-mustContainAtLeastOneSpecialCharacter": "يجب أن تحتوي كلمة المرور تحتوي على رمز خاص واحد على الأقل", "get-password-policy-mustContainAtLeastOneUppercase": "يجب أن تحتوي كلمة المرور على حرف كبير واحد على الأقل", "get-server-info": "الحصول على معلومات الخادم", - "meteor_status_reconnect_in_many": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "github_no_public_email": "ليس لديك أي بريد إلكتروني عام في حسابك على Github", "github_HEAD": "العنوان", "Give_a_unique_name_for_the_custom_oauth": "امنح اسمًا فريدًا مخصصًا لـ oauth", @@ -2122,7 +2126,6 @@ "Ignored": "تم التجاهل", "Images": "الصور", "IMAP_intercepter_already_running": "أداة اعتراض IMAP قيد التشغيل الآن", - "message_counter_few": "{{count}} رسائل", "IMAP_intercepter_Not_running": "أداة اعتراض IMAP لا تعمل", "Impersonate_next_agent_from_queue": "انتحال شخصية الوكيل التالي من قائمة الانتظار", "Impersonate_user": "انتحال شخصية المستخدم", @@ -2195,7 +2198,6 @@ "Install": "تثبيت", "Install_Extension": "تثبيت الامتداد", "Install_FxOs": "تثبيت Rocket.Chat على Firefox لديك", - "meteor_status_reconnect_in_few": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "Install_FxOs_done": "رائع! يمكنك الآن استخدام Rocket.Chat عبر الأيقونة التي على الشاشة الرئيسية لديك. انعم بالمرح مع Rocket.Chat!", "Install_FxOs_error": "عذرًا، هذا لم يعمل على النحو المنشود! ظهر الخطأ التالي:", "Install_FxOs_follow_instructions": "يُرجى التأكد من تثبيت التطبيق على جهازك (اضغط على \"تثبيت\" عند التوجيه بذلك).", @@ -2381,7 +2383,9 @@ "Language_Hungarian": "الهنغارية", "Language_Italian": "الإيطالية", "Language_Japanese": "اليابانية", + "message_counter_two": "{{count}} رسائل", "Language_Latvian": "اللاتفية", + "message_counter_zero": "{{count}} رسائل", "Language_Lithuanian": "اللتوانية", "Language_Not_set": "غير محددة", "Language_Polish": "البولندية", @@ -2453,7 +2457,9 @@ "LDAP_Avatar_Field": "حقل الصورة الرمزية للمستخدم", "You_have_to_set_an_API_token_first_in_order_to_use_the_integration": "يجب عليك أولاً تعيين الرمز المميز لواجهة برمجة التطبيقات من أجل استخدام التكامل.", "LDAP_Avatar_Field_Description": "الحقل الذي سيتم استخدامه كـ *صورة رمزية* للمستخدمين. اتركه فارغًا لاستخدام \"thumbnailPhoto\" أولاً و\"jpegPhoto\" كبديل.", + "meteor_status_reconnect_in_two": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "LDAP_Background_Sync": "مزامنة الخلفية", + "meteor_status_reconnect_in_zero": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "LDAP_Background_Sync_Avatars": "مزامنة خلفية الصورة الرمزية", "LDAP_Background_Sync_Avatars_Description": "تمكين إجراء خلفية منفصلة لمزامنة الصور الرمزية للمستخدم.", "LDAP_Background_Sync_Avatars_Interval": "الفاصل الزمني لمزامنة خلفية الصورة الرمزية", @@ -2856,8 +2862,6 @@ "Message_Code_highlight_Description": "قائمة اللغات المفصولة بفواصل (كل اللغات المدعومة على [highlight.js](https://github.com/highlightjs/highlight.js/tree/11.6.0#supported-languages)) التي سيتم استخدامها لتمييز الكتل البرمجية للتعليمات البرمجية", "message_counter_one": "{{count}} رسالة", "message_counter_other": "{{count}} رسائل", - "message_counter_two": "{{count}} رسائل", - "message_counter_zero": "{{count}} رسائل", "Message_DateFormat": "تنسيق التاريخ", "Message_DateFormat_Description": "انظر أيضًا: [Moment.js](http://momentjs.com/docs/#/displaying/format/)", "Message_deleting_blocked": "لا يمكن حذف هذه الرسالة بعد الآن", @@ -2952,8 +2956,6 @@ "meteor_status_offline": "وضع عدم الاتصال.", "meteor_status_reconnect_in_one": "المحاولة مرة أخرى خلال ثانية واحدة...", "meteor_status_reconnect_in_other": "المحاولة مرة أخرى خلال {{count}} من الثواني...", - "meteor_status_reconnect_in_two": "المحاولة مرة أخرى خلال {{count}} من الثواني...", - "meteor_status_reconnect_in_zero": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "meteor_status_try_now_offline": "الاتصال مرة أخرى", "meteor_status_try_now_waiting": "المحاولة الآن", "meteor_status_waiting": "في انتظار اتصال الخادم،", @@ -3354,6 +3356,7 @@ "Privacy": "الخصوصية", "Privacy_Policy": "سياسة الخصوصية", "Private": "خاص", + "Private_channels": "Channels خاصة", "Private_Channel": "Channel خاصة", "Private_Channels": "Channels خاصة", "Private_Chats": "دردشات خاصة", @@ -3594,6 +3597,7 @@ "Unsafe_Url": "عنوان URL غير آمن", "Rocket_Chat_Alert": "تنبيه Rocket.Chat", "Role": "الدور", + "Roles": "الأدوار", "Role_Editing": "تحرير الدور", "Role_Mapping": "تعيين الدور", "Role_removed": "تمت إزالة الدور", @@ -4801,6 +4805,7 @@ "registration.component.form.emailOrUsername": "البريد الإلكتروني أو اسم المستخدم", "registration.component.form.username": "اسم المستخدم", "registration.component.form.name": "الاسم", + "registration.component.form.userAlreadyExist": "سبق وجود اسم المستخدم. تُرجى تجربة اسم مستخدم آخر.", "registration.component.form.emailAlreadyExists": "سبق وجود البريد الإلكتروني", "registration.component.form.usernameAlreadyExists": "سبق وجود اسم المستخدم. تُرجى تجربة اسم مستخدم آخر.", "registration.component.form.invalidEmail": "البريد الإلكتروني الذي تم إدخاله غير صالح", diff --git a/packages/i18n/src/locales/az.i18n.json b/packages/i18n/src/locales/az.i18n.json index a4410953ab145..513bd976f2f62 100644 --- a/packages/i18n/src/locales/az.i18n.json +++ b/packages/i18n/src/locales/az.i18n.json @@ -320,6 +320,7 @@ "Apply": "Tətbiq edin", "Apply_and_refresh_all_clients": "Bütün müştərilərə müraciət edin və yeniləyin", "Apps": "Proqramlar", + "Apps_context_premium": "Müəssisə", "Apps_Settings": "App Ayarları", "Apps_WhatIsIt": "Proqramlar: Onlar nədir?", "Apps_WhatIsIt_paragraph1": "İdarəetmə sahəsində yeni bir simge! Bu nə deməkdir və nədir?", @@ -1099,6 +1100,7 @@ "FEDERATION_Domain": "Domain", "FEDERATION_Status": "Status", "Retry_Count": "Yenidən cəhd edin", + "Federation_Matrix_enabled": "Etkin", "Field": "Alan", "Field_removed": "Alan çıxarıldı", "Field_required": "Alan tələb olunur", @@ -1458,6 +1460,10 @@ "Layout_Terms_of_Service": "Xidmət Şərtləri", "LDAP": "LDAP", "LDAP_Description": "LDAP, bir çox şirkət və birdən çox sayt arasında bir parol paylaşma imkanı olan bir çox şirkətin vahid işarəsi təmin etmək üçün istifadə etdiyi hiyerarşik bir verilənlər bazasıdır. Ətraflı konfiqurasiya məlumatları və nümunələr üçün, bizim wiki müraciət edin: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "Şifrələmə", + "LDAP_DataSync_BackgroundSync": "Background Sync", + "LDAP_Server_Type": "Server Tipi", + "LDAP_Server_Type_Other": "Digər", "LDAP_Authentication": "Enable", "LDAP_Authentication_Password": "Şifrə", "LDAP_Authentication_UserDN": "İstifadəçi DN", @@ -2488,6 +2494,7 @@ "Unarchive": "Arxivsiz", "unarchive-room": "Arxivsiz Otaq", "unarchive-room_description": "Arxivsiz kanallara icazə", + "unauthorized": "Səlahiyyətli deyil", "Unblock_User": "İstifadəçini blokdan çıxarın", "Unignore": "Unignore", "Uninstall": "Silin", @@ -2664,6 +2671,8 @@ "Visitor_Navigation": "Ziyaretçi Naviqasiyası", "Visitor_page_URL": "Ziyaretçi səhifəsinin URL", "Visitor_time_on_site": "Saytda baxış zamanı", + "VoIP_Management_Server_Username": "İstifadəçi adı", + "VoIP_Management_Server_Password": "Şifrə", "Wait_activation_warning": "Giriş yapabilmeniz üçün hesabınız bir administrator tərəfindən əl ilə aktivləşdirilməlidir.", "Warnings": "Uyarılar", "We_are_offline_Sorry_for_the_inconvenience": "Biz offline. Narahatçılığa görə üzr istəyirik.", @@ -2738,6 +2747,7 @@ "Your_push_was_sent_to_s_devices": "Sizin itəniz%s cihazlarına göndərildi", "Your_server_link": "Sizin server bağlantınız", "Your_workspace_is_ready": "İş yeriniz 🎉 istifadə etməyə hazırdır", + "registration.page.login.errors.wrongCredentials": "İstifadəçi tapılmadı ya da yanlış parol", "registration.page.registration.waitActivationWarning": "Giriş yapabilmeniz üçün hesabınız bir administrator tərəfindən əl ilə aktivləşdirilməlidir.", "registration.page.login.forgot": "Şifrəni unutmusan", "registration.page.resetPassword.sent": "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.", @@ -2747,6 +2757,7 @@ "registration.component.form.emailOrUsername": "E-poçt və ya istifadəçi adı", "registration.component.form.username": "İstifadəçi adı", "registration.component.form.name": "Adı", + "registration.component.form.userAlreadyExist": "İstifadəçi adı artıq mövcuddur. Başqa bir istifadəçi adı cəhd edin.", "registration.component.form.emailAlreadyExists": "Elektron poçt ünvanı artıq mövcuddur", "registration.component.form.usernameAlreadyExists": "İstifadəçi adı artıq mövcuddur. Başqa bir istifadəçi adı cəhd edin.", "registration.component.form.invalidEmail": "Girilən e-poçt etibarsızdır", diff --git a/packages/i18n/src/locales/be-BY.i18n.json b/packages/i18n/src/locales/be-BY.i18n.json index 7814ebf6efa5a..5c9fb33cc0d82 100644 --- a/packages/i18n/src/locales/be-BY.i18n.json +++ b/packages/i18n/src/locales/be-BY.i18n.json @@ -333,6 +333,7 @@ "Apply": "Прымяніць", "Apply_and_refresh_all_clients": "Прымяніць і абнавіць ўсіх кліентаў", "Apps": "прыкладання", + "Apps_context_premium": "прадпрыемства", "Apps_Settings": "налады прыкладання", "Apps_WhatIsIt": "Праграмы: Якія яны?", "Apps_WhatIsIt_paragraph1": "Новы значок у галіне кіравання! Што гэта значыць і якія прыкладанні?", @@ -1115,6 +1116,7 @@ "FEDERATION_Domain": "дамен", "FEDERATION_Status": "статус", "Retry_Count": "Retry Count", + "Federation_Matrix_enabled": "Уключана", "Field": "поле", "Field_removed": "поле выдаленае", "Field_required": "абавязковыя для запаўнення палі", @@ -1474,6 +1476,10 @@ "Layout_Terms_of_Service": "Ўмовы абслугоўвання", "LDAP": "LDAP", "LDAP_Description": "LDAP ўяўляе сабой іерархічную базу дадзеных, што многія кампаніі выкарыстоўваюць для забеспячэння адзінага ўваходу - аб'ект для абмену адзін пароля паміж некалькімі сайтамі і паслугамі. Для папярэдняй інфармацыі аб канфігурацыі і прыклады, калі ласка, звярніцеся ў наш вікі: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "шыфраванне", + "LDAP_DataSync_BackgroundSync": "фонавая сінхранізацыя", + "LDAP_Server_Type": "тып сервера", + "LDAP_Server_Type_Other": "іншае", "LDAP_Authentication": "Ўключыць", "LDAP_Authentication_Password": "пароль", "LDAP_Authentication_UserDN": "DN карыстальніка", @@ -2506,6 +2512,7 @@ "Unarchive": "разархіваваць", "unarchive-room": "разархіваваць нумар", "unarchive-room_description": "Дазвол на разархіваваць каналы", + "unauthorized": "забаронена", "Unblock_User": "разблакаваць карыстальніка", "Unignore": "ігнараваць", "Uninstall": "выдаліць", @@ -2682,6 +2689,8 @@ "Visitor_Navigation": "наведвальнік навігацыі", "Visitor_page_URL": "старонка наведвальнікаў URL", "Visitor_time_on_site": "Час для наведвальнікаў на сайце", + "VoIP_Management_Server_Username": "імя карыстальніка", + "VoIP_Management_Server_Password": "пароль", "Wait_activation_warning": "Перад тым, як увайсці, ваш уліковы запіс павінна быць актываваная ўручную адміністратарам.", "Warnings": "папярэджання", "We_are_offline_Sorry_for_the_inconvenience": "Мы не ў сеткі. Прабачце за дастаўленыя нязручнасці.", @@ -2756,6 +2765,7 @@ "Your_push_was_sent_to_s_devices": "Ваш штуршок быў адпраўлены ў%s прылад", "Your_server_link": "Ваша спасылка сервера", "Your_workspace_is_ready": "Ваша працоўная вобласць гатова да выкарыстання 🎉", + "registration.page.login.errors.wrongCredentials": "Карыстальнік не знойдзены або няправільны пароль", "registration.page.registration.waitActivationWarning": "Перад тым, як увайсці, ваш уліковы запіс павінна быць актываваная ўручную адміністратарам.", "registration.page.login.forgot": "Забыліся свой пароль", "registration.page.resetPassword.sent": "Калі гэты ліст зарэгістравана, мы адправім інструкцыі па аднаўленні пароля. Калі вы не атрымаеце па электроннай пошце ў бліжэйшы час, калі ласка, вярніцеся і паспрабуйце ізноў.", @@ -2765,6 +2775,7 @@ "registration.component.form.emailOrUsername": "Email або імя карыстальніка", "registration.component.form.username": "імя карыстальніка", "registration.component.form.name": "імя", + "registration.component.form.userAlreadyExist": "Імя карыстальніка ўжо існуе. Калі ласка, паспрабуйце іншую назву.", "registration.component.form.emailAlreadyExists": "E-mail ўжо існуе", "registration.component.form.usernameAlreadyExists": "Імя карыстальніка ўжо існуе. Калі ласка, паспрабуйце іншую назву.", "registration.component.form.invalidEmail": "Адрас электроннай пошты ня дзейнічае", diff --git a/packages/i18n/src/locales/bg.i18n.json b/packages/i18n/src/locales/bg.i18n.json index 162895dfe48a6..171f8c32ce4fc 100644 --- a/packages/i18n/src/locales/bg.i18n.json +++ b/packages/i18n/src/locales/bg.i18n.json @@ -320,6 +320,7 @@ "Apply": "Приложи", "Apply_and_refresh_all_clients": "Приложете и опреснете всички клиенти", "Apps": "Apps", + "Apps_context_premium": "начинание", "Apps_Settings": "Настройките на приложението", "Apps_WhatIsIt": "Приложения: Какви са те?", "Apps_WhatIsIt_paragraph1": "Нова икона в административната област! Какво означава това и какви са приложенията?", @@ -1099,6 +1100,7 @@ "FEDERATION_Domain": "Домейн", "FEDERATION_Status": "Статус", "Retry_Count": "Повторен опит", + "Federation_Matrix_enabled": "Enabled", "Field": "Поле", "Field_removed": "Полето е премахнато", "Field_required": "Полето е задължително", @@ -1455,6 +1457,10 @@ "Layout_Sidenav_Footer_Dark_description": "Размерът на долния колонтитул е 260 x 70px", "Layout_Terms_of_Service": "Условия за ползване", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Encryption", + "LDAP_DataSync_BackgroundSync": "Синхронизиране на фона", + "LDAP_Server_Type": "Тип сървър", + "LDAP_Server_Type_Other": "Друг", "LDAP_Authentication": "Активиране", "LDAP_Authentication_Password": "Парола", "LDAP_Authentication_UserDN": "Потребителски DN", @@ -1984,6 +1990,7 @@ "Reactions": "реакции", "Read_by": "Прочетете от", "Read_only": "Само за четене", + "This_room_is_read_only": "Тази стая е само за четене", "Read_only_changed_successfully": "Четенето се промени само успешно", "Read_only_channel": "Само канал за четене", "Read_only_group": "Групи само за четене", @@ -2484,6 +2491,7 @@ "Unarchive": "Разархивирайте", "unarchive-room": "Разделна стая", "unarchive-room_description": "Разрешение за премахване на архивите", + "unauthorized": "Неоторизиран", "Unblock_User": "Деблокиране на потребителя", "Unignore": "Отмени пренебрегването", "Uninstall": "Uninstall", @@ -2659,6 +2667,8 @@ "Visitor_Navigation": "Навигационна навигация", "Visitor_page_URL": "URL адрес на страницата на посетителя", "Visitor_time_on_site": "Време за посещение на място", + "VoIP_Management_Server_Username": "Потребителско име", + "VoIP_Management_Server_Password": "Парола", "Wait_activation_warning": "Преди да можете да влезете, вашият акаунт трябва да бъде активиран ръчно от администратор.", "Warnings": "Предопреждения", "We_are_offline_Sorry_for_the_inconvenience": "Ние сме офлайн. Съжалявам за неудобството.", @@ -2732,6 +2742,7 @@ "Your_push_was_sent_to_s_devices": "Натискането ви бе изпратено на %s устройства", "Your_server_link": "Вашата сървърна връзка", "Your_workspace_is_ready": "Работното ви пространство е готово за използване 🎉", + "registration.page.login.errors.wrongCredentials": "Потребителят не е намерен или неправилна парола", "registration.page.registration.waitActivationWarning": "Преди да можете да влезете, вашият акаунт трябва да бъде активиран ръчно от администратор.", "registration.page.resetPassword.sent": "Ако този имейл е регистриран, ще изпратим инструкции как да зададете нова парола. Ако скоро не получите имейл, моля, върнете се и опитайте отново.", "registration.component.login": "Влез", @@ -2739,6 +2750,7 @@ "registration.component.resetPassword": "Нулиране на паролата", "registration.component.form.username": "Потребителско име", "registration.component.form.name": "Име", + "registration.component.form.userAlreadyExist": "Потребителското име вече съществува. Моля, опитайте с друго потребителско име.", "registration.component.form.emailAlreadyExists": "Електроната поща вече съсществува", "registration.component.form.usernameAlreadyExists": "Потребителското име вече съществува. Моля, опитайте с друго потребителско име.", "registration.component.form.invalidEmail": "Въведеният имейл адрес е невалиден", diff --git a/packages/i18n/src/locales/bs.i18n.json b/packages/i18n/src/locales/bs.i18n.json index 6c8f9528afa1c..4fe15d1e24aeb 100644 --- a/packages/i18n/src/locales/bs.i18n.json +++ b/packages/i18n/src/locales/bs.i18n.json @@ -320,6 +320,7 @@ "Apply": "primijeniti", "Apply_and_refresh_all_clients": "Primjeni i osvježi sve klijente", "Apps": "Apps", + "Apps_context_premium": "Poduzeće", "Apps_Settings": "Postavke aplikacije", "Apps_WhatIsIt": "Aplikacije: Koje su to?", "Apps_WhatIsIt_paragraph1": "Nova ikona na području administracije! Što to znači i koje su aplikacije?", @@ -1094,6 +1095,7 @@ "FEDERATION_Domain": "Domena", "FEDERATION_Status": "Status", "Retry_Count": "Ponovite račun", + "Federation_Matrix_enabled": "Omogućeno", "Field": "Polje", "Field_removed": "Polje je uklonjeno", "Field_required": "Polje je obavezno", @@ -1452,6 +1454,10 @@ "Layout_Sidenav_Footer_Dark_description": "Veličina podnožja je 260 x 70px", "Layout_Terms_of_Service": "Uvjeti pružanja usluge", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Šifriranje", + "LDAP_DataSync_BackgroundSync": "Sinkronizacija pozadine", + "LDAP_Server_Type": "Vrsta poslužitelja", + "LDAP_Server_Type_Other": "Ostalo", "LDAP_Authentication": "Omogućiti", "LDAP_Authentication_Password": "Lozinka", "LDAP_Authentication_UserDN": "Korisnički DN", @@ -1980,6 +1986,7 @@ "Reactions": "Reakcije", "Read_by": "Pročitajte", "Read_only": "Samo za čitanje", + "This_room_is_read_only": "Ova soba je samo za čitanje", "Read_only_changed_successfully": "Postavka Samo za čitanje uspješno promjenjena", "Read_only_channel": "Samo za čitanje Soba", "Read_only_group": "Samo za čitanje Grupa", @@ -2480,6 +2487,7 @@ "Unarchive": "Dearhiviraj", "unarchive-room": "Soba za arhiviranje", "unarchive-room_description": "Dopuštenje za uklanjanje kanala", + "unauthorized": "Niste ovlašteni", "Unblock_User": "Odblokiraj Korisnika", "Unignore": "Ponovno prihvati", "Uninstall": "Uninstall", @@ -2655,6 +2663,8 @@ "Visitor_Navigation": "Navigacija Posjetitelja", "Visitor_page_URL": "URL stranice posjetitelja", "Visitor_time_on_site": "Vrijeme posjetitelja na stranici", + "VoIP_Management_Server_Username": "Korisničko ime", + "VoIP_Management_Server_Password": "Lozinka", "Wait_activation_warning": "Prije nego što se prijavite, vaš račun mora ručno aktivirati administrator.", "Warnings": "Upozorenja", "We_are_offline_Sorry_for_the_inconvenience": "Mi smo izvan mreže. Oprostite na neugodnosti.", @@ -2729,6 +2739,7 @@ "Your_push_was_sent_to_s_devices": "Push obavijest je poslana %s uređaje", "Your_server_link": "Veza poslužitelja", "Your_workspace_is_ready": "Radni je prostor spreman za upotrebu 🎉", + "registration.page.login.errors.wrongCredentials": "Korisnik nije pronađen ili pogrešna lozinka", "registration.page.registration.waitActivationWarning": "Prije nego što se prijavite, vaš račun mora ručno aktivirati administrator.", "registration.page.resetPassword.sent": "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.", "registration.component.login": "Prijava", @@ -2736,6 +2747,7 @@ "registration.component.resetPassword": "Resetiraj lozinku", "registration.component.form.username": "Korisničko ime", "registration.component.form.name": "Ime", + "registration.component.form.userAlreadyExist": "Korisničko ime već postoji. Pokušajte s drugim korisničkim imenom.", "registration.component.form.emailAlreadyExists": "Email već postoji", "registration.component.form.usernameAlreadyExists": "Korisničko ime već postoji. Pokušajte s drugim korisničkim imenom.", "registration.component.form.invalidEmail": "Uneseni e-mail nije valjan", diff --git a/packages/i18n/src/locales/ca.i18n.json b/packages/i18n/src/locales/ca.i18n.json index 376d37de9175b..56b5713d155d8 100644 --- a/packages/i18n/src/locales/ca.i18n.json +++ b/packages/i18n/src/locales/ca.i18n.json @@ -451,6 +451,7 @@ "Apply_and_refresh_all_clients": "Aplicar i refrescar tots els clients", "Apps": "Aplicacions", "Apps_context_installed": "Instal·lat", + "Apps_context_premium": "Empresa", "Apps_Engine_Version": "Versió del Motor d'Aplicacions", "Apps_Essential_Alert": "Aquesta aplicació és essencial per als següents esdeveniments:", "Apps_Essential_Disclaimer": "Els esdeveniments enumerats dalt seran interromputs si aquesta aplicació està desactivada. Si vols que Rocket.Chat funcioni sense la funcionalitat d'aquesta aplicació, l'has de desinstal·lar", @@ -1368,6 +1369,7 @@ "Desktop_Notifications_Not_Enabled": "Les notificacions d'escriptori no estan habilitades", "Details": "Detalls", "line": "línia", + "Device_Management_IP": "IP", "Different_Style_For_User_Mentions": "Estil diferent per a les mencions de lusuari", "Livechat_Facebook_API_Key": "Clave API de LiveChat ", "Livechat_Facebook_API_Secret": "API Secret LiveChat ", @@ -1852,6 +1854,7 @@ "FEDERATION_Test_Setup_Error": "No s'ha pogut trobar el vostre servidor usant la vostra configuració, reviseu-ne la configuració.", "FEDERATION_Test_Setup_Success": "La configuració de la seva federació està funcionant i altres servidors poden trobar-se!", "Retry_Count": "Comptador de reintents", + "Federation_Matrix_enabled": "Activa", "Field": "Camp", "Field_removed": "Camp eliminat", "Field_required": "Camp obligatori", @@ -2226,6 +2229,7 @@ "InternalHubot": "Hubot intern", "InternalHubot_EnableForChannels": "Activa per als canals públics", "InternalHubot_EnableForDirectMessages": "Activa per als missatges directes", + "InternalHubot_EnableForPrivateGroups": "Activa per a canals privats", "InternalHubot_PathToLoadCustomScripts": "Carpeta des d'on carregar els scripts", "InternalHubot_reload": "Recarrega els scripts", "InternalHubot_ScriptsToLoad": "Seqüències d'ordres (scripts) per carregar", @@ -3301,6 +3305,7 @@ "Privacy": "Privacitat", "Privacy_Policy": "Política de privacitat", "Private": "Privat", + "Private_channels": "Channels Privats", "Private_Channel": "Canal privat", "Private_Channels": "Channels Privats", "Private_Chats": "Xats privats", @@ -3376,6 +3381,7 @@ "Reactions": "Reaccions", "Read_by": "Llegit per", "Read_only": "Només lectura", + "This_room_is_read_only": "Aquesta sala és de només lectura", "Read_only_changed_successfully": "Només lectura canviat correctament", "Read_only_channel": "Channel Només lectura", "Read_only_group": "Grup de només lectura", @@ -3526,6 +3532,7 @@ "Unsafe_Url": "URL insegura", "Rocket_Chat_Alert": "Alerta Rocket.Chat", "Role": "Rol", + "Roles": "Rols", "Role_Editing": "Edició de rols", "Role_Mapping": "Mapeig de rols", "Role_removed": "Rol eliminat", @@ -4532,6 +4539,8 @@ "Visitor_Navigation": "Navegació del visitant", "Visitor_page_URL": "URL de la pàgina del visitant", "Visitor_time_on_site": "Temps de visita", + "VoIP_Management_Server_Username": "Nom d'usuari", + "VoIP_Management_Server_Password": "Contrasenya", "Chat_opened_by_visitor": "Xat obert pel visitant.", "Wait_activation_warning": "Abans de poder iniciar sessió, els comptes han de ser activats manualment per un administrador.", "Waiting_queue": "Cua d’espera", @@ -4670,6 +4679,7 @@ "registration.component.resetPassword": "Reinicialitza la contrasenya", "registration.component.form.username": "Nom d'usuari", "registration.component.form.name": "Nom", + "registration.component.form.userAlreadyExist": "Nom d'usuari ja existeix. Proveu amb un altre nom d'usuari.", "registration.component.form.emailAlreadyExists": "L'adreça de correu electrònic ja existeix", "registration.component.form.usernameAlreadyExists": "Nom d'usuari ja existeix. Proveu amb un altre nom d'usuari.", "registration.component.form.invalidEmail": "L'adreça de correu-e és invàlida", diff --git a/packages/i18n/src/locales/cs.i18n.json b/packages/i18n/src/locales/cs.i18n.json index bc23ea19b98fe..32a1273965091 100644 --- a/packages/i18n/src/locales/cs.i18n.json +++ b/packages/i18n/src/locales/cs.i18n.json @@ -414,6 +414,7 @@ "Apply_and_refresh_all_clients": "Použít a aktualizovat všechny klienty", "Apps": "Aplikace", "Apps_context_installed": "Instalované", + "Apps_context_premium": "Korporace", "Apps_Engine_Version": "Verze Engine aplikace", "Apps_Essential_Alert": "Tato aplikace je důležité pro následující události:", "Apps_Essential_Disclaimer": "Výše uvedené události budou ovlivněny odebráním této aplikace. Pokud ji i přesto chcete odebrat odinstalujte ji.", @@ -751,6 +752,7 @@ "Confirm_password": "Potvrďte heslo", "Confirm_your_password": "Potvrďte heslo", "Connect": "Připojit", + "Connected": "Připojeno", "Connection_Closed": "Připojení bylo uzavřeno", "Connection_Reset": "Obnovit připojení", "Connectivity_Services": "Služby připojení", @@ -1371,6 +1373,7 @@ "Enter_Normal": "Normální mód (odeslání po stisku klávesy enter)", "Enter_to": "Enter", "Enter_your_E2E_password": "Zadejte heslo E2E", + "message_counter_many": "{{count}} zpráv(y)", "Entertainment": "Zábava", "Error": "Chyba", "Error_404": "Chyba: 404 nenalezeno", @@ -1412,6 +1415,7 @@ "error-forwarding-department-target-not-allowed": "Přesměrování do tohoto oddělení není povoleno", "error-guests-cant-have-other-roles": "Hosté nemůžou mít žádné další role.", "error-import-file-extract-error": "Nepodařilo se rozbalit importovaný soubor.", + "meteor_status_reconnect_in_many": "zkusím znovu za {{count}} sekund...", "error-import-file-is-empty": "Importovaný soubor se zdá být prázdný.", "error-import-file-missing": "Importovaný soubor nebyl na zadané cestě nalezen.", "error-importer-not-defined": "Nástroj pro import špatně nadefinován, chybí třída Importu.", @@ -1493,6 +1497,7 @@ "error-this-is-not-a-livechat-room": "Toto není Omnichannel místnost", "error-token-already-exists": "Token s tímto názvem již existuje", "error-token-does-not-exists": "Token neexistuje", + "message_counter_few": "{{count}} zpráv(y)", "error-too-many-requests": "Chyba, příliš mnoho požadavků. Prosím zpomalte. Vyčkejte {{seconds}} sekund před dalším pokusem.", "error-transcript-already-requested": "Přepis již byl vyžádán", "error-unpinning-message": "Zprávu nelze odepnout", @@ -1536,6 +1541,7 @@ "Export_My_Data": "Exportovat moje data (JSON)", "expression": "Výraz", "Extended": "Rozšířené", + "meteor_status_reconnect_in_few": "zkusím znovu za {{count}} sekund...", "External_Domains": "Externí domény", "External_Queue_Service_URL": "URL Externí služby front", "External_Service": "Externí služba", @@ -1571,6 +1577,7 @@ "FEDERATION_Test_Setup_Error": "Pomocí vašeho nastavení se nepodařilo najít váš server. Zkontrolujte prosím nastavení.", "FEDERATION_Test_Setup_Success": "Vaše nastavení Federace funguje a ostatní servery vás mohou najít!", "Retry_Count": "Počet opakování", + "Federation_Matrix_enabled": "Povoleno", "Field": "Pole", "Field_removed": "Pole odebráno", "Field_required": "Pole vyžadováno", @@ -1655,7 +1662,6 @@ "Filters": "Filtry", "Financial_Services": "Finanční služby", "First_Channel_After_Login": "Výchozí místnost po přihlášení", - "message_counter_many": "{{count}} zpráv(y)", "First_response_time": "První doba odezvy", "Flags": "Vlajky", "Follow_message": "Sledovat zprávu", @@ -1710,7 +1716,6 @@ "get-password-policy-mustContainAtLeastOneNumber": "Heslo musí obsahovat alespoň jednu číslici", "get-password-policy-mustContainAtLeastOneSpecialCharacter": "Heslo musí obsahovat alespoň jeden speciální znak", "get-password-policy-mustContainAtLeastOneUppercase": "Heslo musí obsahovat alespoň jedno velké písmeno", - "meteor_status_reconnect_in_many": "zkusím znovu za {{count}} sekund...", "github_no_public_email": "Ve svém účtu GitHub nemáte žádný e-mail jako veřejný", "Give_a_unique_name_for_the_custom_oauth": "Zadejte jedinečný název pro vlastní OAuth", "strike": "přeškrtnuté", @@ -1797,7 +1802,6 @@ "Ignored": "Ignorováno", "Images": "Obrázky", "IMAP_intercepter_already_running": "Zachytávání IMAP již běží", - "message_counter_few": "{{count}} zpráv(y)", "IMAP_intercepter_Not_running": "Zachytávání IMAP neběží", "Impersonate_next_agent_from_queue": "Vydávat se za dalšího operátora ve frontě", "Impersonate_user": "Vydávat se za uživatele", @@ -1866,7 +1870,6 @@ "Install": "Instalace", "Install_Extension": "Nainstalovat rozšíření", "Install_FxOs": "Nainstalovat Rocket.Chat do Vašeho Firefoxu", - "meteor_status_reconnect_in_few": "zkusím znovu za {{count}} sekund...", "Install_FxOs_done": "Super! Nyní můžete používat Rocket.Chat přes ikonu na úvodní obrazovce. Užijte si Rocket.Chat!", "Install_FxOs_error": "Jejda, tohle se stát nemělo! Objevila se následující chyba:", "Install_FxOs_follow_instructions": "Prosím potvrďte instalaci aplikace na Vašem přístroji (stiskněte tlačítko \"Install\" po výzvě).", @@ -2059,7 +2062,15 @@ "Layout_Sidenav_Footer_Dark_description": "Velikost zápatí je 260 x 70 pixelů", "Layout_Terms_of_Service": "Podmínky služby", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Šifrování", "LDAP_Connection_successful": "LDAP připojení úspěšné", + "LDAP_Connection_Timeouts": "Časové limity", + "LDAP_UserSearch": "Hledat uživatele", + "LDAP_DataSync_DataMap": "Mapování", + "LDAP_DataSync_Advanced": "Pokročilá synchronizace", + "LDAP_DataSync_BackgroundSync": "Synchronizace na pozadí", + "LDAP_Server_Type": "Typ serveru", + "LDAP_Server_Type_Other": "Jiné", "LDAP_Advanced_Sync": "Pokročilá synchronizace", "LDAP_Authentication": "Povolit", "LDAP_Authentication_Password": "Heslo", @@ -2801,6 +2812,7 @@ "Privacy": "Soukromí", "Privacy_Policy": "Zásady ochrany osobních údajů", "Private": "Privátní", + "Private_channels": "Soukromé místnosti", "Private_Channel": "Privátní místnost", "Private_Channels": "Soukromé místnosti", "Private_Chats": "Soukromé konverzace", @@ -2870,6 +2882,7 @@ "Reactions": "Reakce", "Read_by": "Přečteno", "Read_only": "Pouze pro čtení", + "This_room_is_read_only": "Tato místnost je pouze pro čtení", "Read_only_changed_successfully": "Pouze pro čtení změněno", "Read_only_channel": "Místnost pouze pro čtení", "Read_only_group": "Skupina pouze pro čtení", @@ -2994,6 +3007,7 @@ "Robot_Instructions_File_Content": "Obsah souboru robots.txt", "Rocket_Chat_Alert": "Upozornění Rocket.Chat", "Role": "Role", + "Roles": "Role", "Role_Editing": "Editace Role", "Role_Mapping": "Mapování rolí", "Role_removed": "Role odstraněna", @@ -3830,6 +3844,8 @@ "Visitor_Navigation": "Navigace návštěvníka", "Visitor_page_URL": "URL Stránky pro návštěvníky", "Visitor_time_on_site": "Doba návštěvníka na stránce", + "VoIP_Management_Server_Username": "Uživatelské jméno", + "VoIP_Management_Server_Password": "Heslo", "Wait_activation_warning": "Předtím, než se můžete přihlásit, Váš účet musí být ručně aktivován správcem.", "Waiting_queue": "Čekací fronta", "Waiting_queue_message": "Zpráva v čekací frontě", @@ -3951,6 +3967,7 @@ "registration.component.resetPassword": "Obnovit heslo", "registration.component.form.username": "Uživatelské jméno", "registration.component.form.name": "Jméno", + "registration.component.form.userAlreadyExist": "Uživatelské jméno již existuje. Použijte prosím jiné.", "registration.component.form.emailAlreadyExists": "Email již existuje", "registration.component.form.usernameAlreadyExists": "Uživatelské jméno již existuje. Použijte prosím jiné.", "registration.component.form.invalidEmail": "Zadaný e-mail je neplatný", diff --git a/packages/i18n/src/locales/cy.i18n.json b/packages/i18n/src/locales/cy.i18n.json index 8d2b105ee23ff..38cb42a46eb3f 100644 --- a/packages/i18n/src/locales/cy.i18n.json +++ b/packages/i18n/src/locales/cy.i18n.json @@ -320,6 +320,7 @@ "Apply": "Gwneud cais", "Apply_and_refresh_all_clients": "Gwneud cais a adnewyddu pob cleient", "Apps": "Apps", + "Apps_context_premium": "Menter", "Apps_Settings": "Gosodiadau'r App", "Apps_WhatIsIt": "Apps: Beth Ydyn nhw?", "Apps_WhatIsIt_paragraph1": "Eicon newydd yn yr ardal weinyddol! Beth mae hyn yn ei olygu a beth yw Apps?", @@ -1095,6 +1096,7 @@ "FEDERATION_Domain": "Parth", "FEDERATION_Status": "Statws", "Retry_Count": "Ailadroddwch y Cyfrif", + "Federation_Matrix_enabled": "Wedi'i alluogi", "Field": "Maes", "Field_removed": "Cae wedi'i dynnu", "Field_required": "Maes gofynnol", @@ -1453,6 +1455,10 @@ "Layout_Sidenav_Footer_Dark_description": "Maint footer yw 260 x 70px", "Layout_Terms_of_Service": "Telerau'r Gwasanaeth", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Amgryptio", + "LDAP_DataSync_BackgroundSync": "Sync Cefndir", + "LDAP_Server_Type": "Math o Weinyddwr", + "LDAP_Server_Type_Other": "Arall", "LDAP_Authentication": "Galluogi", "LDAP_Authentication_Password": "Cyfrinair", "LDAP_Authentication_UserDN": "DN Defnyddiwr", @@ -1982,6 +1988,7 @@ "Reactions": "Ymatebion", "Read_by": "Darllenwch gan", "Read_only": "Darllen yn unig", + "This_room_is_read_only": "Mae'r ystafell hon yn cael ei ddarllen yn unig", "Read_only_changed_successfully": "Dim ond yn llwyddiannus y mae darllen yn newid", "Read_only_channel": "Sianel Darllen yn Unig", "Read_only_group": "Grŵp Darllen yn Unig", @@ -2482,6 +2489,7 @@ "Unarchive": "Annisgwyl", "unarchive-room": "Ystafell Ddieithr", "unarchive-room_description": "Caniatâd i sianeli anarchifol", + "unauthorized": "Heb ei awdurdodi", "Unblock_User": "Dadlwytho Defnyddiwr", "Unignore": "Unignore", "Uninstall": "Dadstystio", @@ -2657,6 +2665,8 @@ "Visitor_Navigation": "Ymwelwyr Ymwelwyr", "Visitor_page_URL": "URL ymwelwyr tudalen", "Visitor_time_on_site": "Amser ymwelwyr ar y safle", + "VoIP_Management_Server_Username": "Enw Defnyddiwr", + "VoIP_Management_Server_Password": "Cyfrinair", "Wait_activation_warning": "Cyn i chi allu mewngofnodi, rhaid i'ch gweinydd gael ei weithredu gan weinyddwr.", "Warnings": "Rhybuddion", "We_are_offline_Sorry_for_the_inconvenience": "Rydym ni allan. Mae'n ddrwg gennym am yr anghyfleustra.", @@ -2731,6 +2741,7 @@ "Your_push_was_sent_to_s_devices": "Anfonwyd eich gwthio i ddyfeisiau %s", "Your_server_link": "Dolen eich gweinydd", "Your_workspace_is_ready": "Mae'ch gweithle yn barod i ddefnyddio 🎉", + "registration.page.login.errors.wrongCredentials": "Ni chanfuwyd defnyddiwr na chyfrinair anghywir", "registration.page.registration.waitActivationWarning": "Cyn i chi allu mewngofnodi, rhaid i'ch gweinydd gael ei weithredu gan weinyddwr.", "registration.page.resetPassword.sent": "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.", "registration.component.login": "Mewngofnodi", @@ -2738,6 +2749,7 @@ "registration.component.resetPassword": "Ailosod cyfrinair", "registration.component.form.username": "Enw Defnyddiwr", "registration.component.form.name": "Enw", + "registration.component.form.userAlreadyExist": "Mae enw defnyddiwr eisoes yn bodoli. Rhowch gynnig ar enw defnyddiwr arall.", "registration.component.form.emailAlreadyExists": "Ebost eisoes yn bodoli", "registration.component.form.usernameAlreadyExists": "Mae enw defnyddiwr eisoes yn bodoli. Rhowch gynnig ar enw defnyddiwr arall.", "registration.component.form.invalidEmail": "Mae'r e-bost a roddwyd yn annilys", diff --git a/packages/i18n/src/locales/da.i18n.json b/packages/i18n/src/locales/da.i18n.json index 58cec28568803..748e6e3f1fc1c 100644 --- a/packages/i18n/src/locales/da.i18n.json +++ b/packages/i18n/src/locales/da.i18n.json @@ -481,6 +481,7 @@ "Apply_and_refresh_all_clients": "Anvend og opdatér alle klienter", "Apps": "Apps", "Apps_context_installed": "Installeret", + "Apps_context_premium": "Firma", "Apps_Engine_Version": "Apps Engine Version", "Apps_Essential_Alert": "Denne app er vigtig for følgende begivenheder:", "Apps_Essential_Disclaimer": "Begivenheder anført ovenfor vil blive afbrudt hvis denne app bliver deaktiveret. Hvis du vil have Rocket.Chat til at fungere uden denne apps funktionalitet, skal du afinstallere det", @@ -832,6 +833,7 @@ "Confirm_password": "Bekræft dit kodeord", "Confirm_your_password": "Bekræft dit kodeord", "Connect": "Forbind", + "Connected": "Forbundet", "Connection_Closed": "Forbindelse lukket", "Connection_Reset": "Nulstilning af forbindelse", "Connectivity_Services": "Connectivity Services", @@ -1664,6 +1666,7 @@ "FEDERATION_Test_Setup_Error": "Kunne ikke finde din server ved hjælp af din opsætning. Gennemgå venligst dine indstillinger.", "FEDERATION_Test_Setup_Success": "Din føderationsopsætning fungerer og andre servere kan finde dig!", "Retry_Count": "Prøv igen", + "Federation_Matrix_enabled": "Aktiveret", "Field": "Felt", "Field_removed": "Felt fjernet", "Field_required": "Felt påkrævet", @@ -2151,7 +2154,15 @@ "Layout_Sidenav_Footer_Dark_description": "Footer-størrelse er 260 x 70px", "Layout_Terms_of_Service": "Servicevilkår", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Kryptering", "LDAP_Connection_successful": "LDAP-forbindelse lykkedes", + "LDAP_Connection_Timeouts": "Timeout", + "LDAP_UserSearch": "Brugersøgning", + "LDAP_DataSync_DataMap": "Mapping", + "LDAP_DataSync_Advanced": "Avanceret synkronisering", + "LDAP_DataSync_BackgroundSync": "Baggrundssynkronisering", + "LDAP_Server_Type": "Server Type", + "LDAP_Server_Type_Other": "Andet", "LDAP_Advanced_Sync": "Avanceret synkronisering", "LDAP_Authentication": "Aktivér", "LDAP_Authentication_Password": "Adgangskode", @@ -2898,6 +2909,7 @@ "Privacy": "Privatliv", "Privacy_Policy": "Fortrolighedspolitik", "Private": "Privat", + "Private_channels": "Private kanaler", "Private_Channel": "Privat kanal", "Private_Channels": "Private kanaler", "Private_Chats": "Private chats", @@ -2967,6 +2979,7 @@ "Reactions": "Reaktioner", "Read_by": "Læs af", "Read_only": "Læs kun", + "This_room_is_read_only": "Dette rum er skrivebeskyttet", "Read_only_changed_successfully": "Læsning er kun ændret", "Read_only_channel": "Læs kun kanal", "Read_only_group": "Læs kun gruppe", @@ -3094,6 +3107,7 @@ "Robot_Instructions_File_Content": "Indhold af robots.txt-fil", "Rocket_Chat_Alert": "Rocket.Chat Alert", "Role": "Rolle", + "Roles": "Roller", "Role_Editing": "Rollredigering", "Role_Mapping": "Rolletilknytning", "Role_removed": "Rolle fjernet", @@ -3703,6 +3717,7 @@ "Unarchive": "Annuller arkivering", "unarchive-room": "Unarchive Room", "unarchive-room_description": "Tilladelse til at ophæve kanaler", + "unauthorized": "Ikke godkendt", "Unavailable": "Utilgængelig", "Unblock_User": "Fjern blokering af bruger", "Uncheck_All": "Fjern alle markeringer", @@ -3938,6 +3953,8 @@ "Visitor_Navigation": "Visitor Navigation", "Visitor_page_URL": "URL for besøgende side", "Visitor_time_on_site": "Besøgende tid på stedet", + "VoIP_Management_Server_Username": "Brugernavn", + "VoIP_Management_Server_Password": "Adgangskode", "Wait_activation_warning": "Før du kan logge ind, skal din konto manuelt aktiveres af en administrator.", "Waiting_queue": "Ventende kø", "Waiting_queue_message": "Meddelelse for ventende kø", @@ -4050,6 +4067,7 @@ "Your_server_link": "Din server link", "Your_temporary_password_is_password": "Din midlertidige adgangskode er [password].", "Your_workspace_is_ready": "Dit arbejdsområde er klar til brug 🎉", + "registration.page.login.errors.wrongCredentials": "Bruger ikke fundet eller forkert adgangskode", "registration.page.login.errors.loginBlockedForIp": "Login er blevet midlertidigt blokeret til denne IP", "registration.page.login.errors.loginBlockedForUser": "Login er blevet midlertidigt blokeret for denne bruger", "registration.page.login.errors.AppUserNotAllowedToLogin": "App-brugere må ikke logge direkte på.", @@ -4061,6 +4079,7 @@ "registration.component.form.username": "Brugernavn", "registration.component.form.name": "Navn", "registration.component.form.createAnAccount": "Opret en konto", + "registration.component.form.userAlreadyExist": "Brugernavnet eksisterer allerede. Prøv venligst et andet brugernavn.", "registration.component.form.emailAlreadyExists": "E-mailen eksisterer allerede", "registration.component.form.usernameAlreadyExists": "Brugernavnet eksisterer allerede. Prøv venligst et andet brugernavn.", "registration.component.form.invalidEmail": "Den indtastede e-mail er ugyldig", @@ -4074,7 +4093,9 @@ "registration.component.form.sendConfirmationEmail": "Send bekræftelses-email", "onboarding.component.form.action.pasteHere": "Indsæt her ...", "onboarding.form.registerOfflineForm.title": "Registrer offline", + "Create_an_account": "Opret en konto", "New_custom_status": "Ny brugerdefineret status", + "RegisterWorkspace_Features_ThirdPartyLogin_Title": "Login fra tredjepart", "Enterprise": "Firma", "UpgradeToGetMore_engagement-dashboard_Title": "Analyse", "UpgradeToGetMore_auditing_Title": "Meddelelsesovervågning" diff --git a/packages/i18n/src/locales/de-AT.i18n.json b/packages/i18n/src/locales/de-AT.i18n.json index 8981a77afaded..b4073551357c5 100644 --- a/packages/i18n/src/locales/de-AT.i18n.json +++ b/packages/i18n/src/locales/de-AT.i18n.json @@ -320,6 +320,7 @@ "Apply": "Sich bewerben", "Apply_and_refresh_all_clients": "Alle Clients anwenden und aktualisieren", "Apps": "Apps", + "Apps_context_premium": "Unternehmen", "Apps_Settings": "App-Einstellungen", "Apps_WhatIsIt": "Apps: Was sind sie?", "Apps_WhatIsIt_paragraph1": "Ein neues Icon im Administrationsbereich! Was bedeutet das und was sind Apps?", @@ -1102,6 +1103,7 @@ "FEDERATION_Domain": "Domain", "FEDERATION_Status": "Status", "Retry_Count": "Wiederholungsanzahl", + "Federation_Matrix_enabled": "Aktiviert", "Field": "Feld", "Field_removed": "Feld entfernt", "Field_required": "Feld erforderlich", @@ -1459,6 +1461,10 @@ "Layout_Sidenav_Footer_Dark_description": "Die Größe der Fußzeile beträgt 260 x 70 Pixel.", "Layout_Terms_of_Service": "Nutzungsbedingungen", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Verschlüsselung", + "LDAP_DataSync_BackgroundSync": "Hintergrundsynchronisierung", + "LDAP_Server_Type": "Server Typ", + "LDAP_Server_Type_Other": "Andere", "LDAP_Authentication": "Aktivieren", "LDAP_Authentication_Password": "Passwort", "LDAP_Authentication_UserDN": "Benutzer-DN", @@ -1990,6 +1996,7 @@ "Reactions": "Reaktionen", "Read_by": "Gelesen von", "Read_only": "Schreibgeschützt", + "This_room_is_read_only": "Dieser Raum ist nur lesbar", "Read_only_changed_successfully": "Nur Lesen erfolgreich geändert", "Read_only_channel": "Schreibgeschützter Kanal", "Read_only_group": "Schreibgeschützte Gruppe", @@ -2666,6 +2673,8 @@ "Visitor_Navigation": "Besuchernavigation", "Visitor_page_URL": "URL der Besucherseite", "Visitor_time_on_site": "Besucherzeit auf der Seite", + "VoIP_Management_Server_Username": "Nutzername", + "VoIP_Management_Server_Password": "Passwort", "Wait_activation_warning": "Bevor Sie sich anmelden können, muss das Konto von einem Administrator manuell aktiviert werden.", "Warnings": "Warnungen", "We_are_offline_Sorry_for_the_inconvenience": "Wir sind offline. Entschuldigen Sie die Unannehmlichkeiten.", @@ -2747,6 +2756,8 @@ "registration.component.login.userNotFound": "Der/die Benutzer/in konnte nicht gefunden werden.", "registration.component.resetPassword": "Passwort zurücksetzen", "registration.component.form.username": "Nutzername", + "registration.component.form.name": "Name", + "registration.component.form.userAlreadyExist": "Benutzername existiert bereits. Bitte versuchen Sie es mit einem anderen Benutzernamen.", "registration.component.form.emailAlreadyExists": "Die E-Mail-Adresse existiert bereits.", "registration.component.form.usernameAlreadyExists": "Benutzername existiert bereits. Bitte versuchen Sie es mit einem anderen Benutzernamen.", "registration.component.form.invalidEmail": "Die eingegebene E-Mail-Adresse ist ungültig.", diff --git a/packages/i18n/src/locales/de.i18n.json b/packages/i18n/src/locales/de.i18n.json index a21fd248ecfbe..2ce24e2aa0e4a 100644 --- a/packages/i18n/src/locales/de.i18n.json +++ b/packages/i18n/src/locales/de.i18n.json @@ -498,6 +498,7 @@ "Apps_context_explore": "Erkunden", "Apps_context_installed": "Installiert", "Apps_context_requested": "Angefordert", + "Apps_context_premium": "Unternehmen", "Apps_Engine_Version": "Version der Anwendungs-Engine", "Apps_Essential_Alert": "Diese App ist für die folgenden Ereignisse unerlässlich:", "Apps_Essential_Disclaimer": "Die oben aufgeführten Ereignisse werden gestört, wenn diese App deaktiviert wird. Wenn Sie Rocket.Chat ohne die Funktionalität dieser App ausführen möchten, müssen Sie sie deinstallieren", @@ -3763,6 +3764,7 @@ "Privacy_summary": "Zusammenfassung zum Datenschutz", "Private": "Privat", "private": "privat", + "Private_channels": "Private Kanäle", "Private_Channel": "Privater Channel", "Private_Channels": "Private Kanäle", "Private_Chats": "Private Chats", @@ -5380,6 +5382,7 @@ "Your_workspace_is_ready": "Ihr Arbeitsbereich ist einsatzbereit 🎉", "Zapier": "Zapier", "registration.page.login.errors.wrongCredentials": "Entweder konnte der Benutzer nicht gefunden werden oder Sie haben ein falsches Passwort angegeben.", + "registration.page.login.errors.invalidEmail": "Ungültige E-Mail", "registration.page.login.errors.loginBlockedForIp": "Die Anmeldung wurde für diese IP vorübergehend gesperrt", "registration.page.login.errors.loginBlockedForUser": "Die Anmeldung wurde für diesen Benutzer vorübergehend gesperrt", "registration.page.login.errors.licenseUserLimitReached": "Die maximale Anzahl Benutzer wurde erreicht.", @@ -5400,6 +5403,8 @@ "registration.component.form.emailOrUsername": "E-Mail-Adresse oder Nutzername", "registration.component.form.username": "Benutzername", "registration.component.form.name": "Name", + "registration.component.form.createAnAccount": "Ein Konto erstellen", + "registration.component.form.userAlreadyExist": "Benutzername existiert bereits. Bitte versuchen Sie es mit einem anderen Benutzernamen.", "registration.component.form.emailAlreadyExists": "Die E-Mail-Adresse existiert bereits.", "registration.component.form.usernameAlreadyExists": "Benutzername existiert bereits. Bitte versuchen Sie es mit einem anderen Benutzernamen.", "registration.component.form.invalidEmail": "Die eingegebene E-Mail-Adresse ist ungültig.", @@ -5461,6 +5466,7 @@ "onboarding.form.adminInfoForm.fields.password.placeholder": "Passwort erstellen", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Halten Sie mich über Rocket.Chat-Updates auf dem Laufenden", "onboarding.form.awaitConfirmationForm.title": "Warten auf Bestätigung", + "onboarding.form.awaitConfirmationForm.content.securityCode": "Sicherheitscode", "onboarding.form.organizationInfoForm.title": "Organisations-Info", "onboarding.form.organizationInfoForm.subtitle": "Bitte, haben Sie Verständnis. Diese Informationen helfen uns, Ihren Arbeitsbereich zu personalisieren.", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Name der Organisation", diff --git a/packages/i18n/src/locales/el.i18n.json b/packages/i18n/src/locales/el.i18n.json index e9ffacd761172..0c52b2df3259b 100644 --- a/packages/i18n/src/locales/el.i18n.json +++ b/packages/i18n/src/locales/el.i18n.json @@ -326,6 +326,7 @@ "Apply": "Εφαρμόζεται", "Apply_and_refresh_all_clients": "Εφαρμόστε και ανανεώσετε όλους τους πελάτες", "Apps": "Εφαρμογές", + "Apps_context_premium": "Επιχείρηση", "Apps_Settings": "Ρυθμίσεις της εφαρμογής", "Apps_WhatIsIt": "Εφαρμογές: Τι είναι αυτοί;", "Apps_WhatIsIt_paragraph1": "Ένα νέο εικονίδιο στην περιοχή διαχείρισης! Τι σημαίνει αυτό και ποιες είναι οι εφαρμογές;", @@ -1106,6 +1107,7 @@ "FEDERATION_Domain": "Τομέας", "FEDERATION_Status": "Κατάσταση", "Retry_Count": "Επανάληψη μέτρησης", + "Federation_Matrix_enabled": "Ενεργοποιήθηκε", "Field": "Πεδίο", "Field_removed": "Το πεδίο αφαιρεθεί", "Field_required": "Απαιτείται πεδίο", @@ -1465,6 +1467,10 @@ "Layout_Terms_of_Service": "Όροι χρήσης", "LDAP": "LDAP", "LDAP_Description": "LDAP είναι μια ιεραρχική βάση δεδομένων που πολλές εταιρείες χρησιμοποιούν για να παρέχουν Single Sign On - μια εγκατάσταση για την κοινή χρήση ενός κωδικού πρόσβασης από πολλαπλές τοποθεσίες και υπηρεσίες. Για προχωρημένους πληροφορίες διαμόρφωσης και παραδείγματα, συμβουλευτείτε wiki μας: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "κρυπτογράφηση", + "LDAP_DataSync_BackgroundSync": "Συγχρονισμός φόντου", + "LDAP_Server_Type": "Τύπος διακομιστή", + "LDAP_Server_Type_Other": "Άλλα", "LDAP_Authentication": "Ενεργοποίηση", "LDAP_Authentication_Password": "Σύνθημα", "LDAP_Authentication_UserDN": "DN χρήστη", @@ -2672,6 +2678,8 @@ "Visitor_Navigation": "επισκέπτης πλοήγησης", "Visitor_page_URL": "Διεύθυνση URL της σελίδας επισκέπτης", "Visitor_time_on_site": "επισκέπτη φορά στην ιστοσελίδα", + "VoIP_Management_Server_Username": "Όνομα Χρήστη", + "VoIP_Management_Server_Password": "Κωδικός", "Wait_activation_warning": "Για να μπορέσετε να συνδεθείτε, ο λογαριασμός σας θα πρέπει να ενεργοποιηθεί χειροκίνητα από κάποιον διαχειριστή.", "Warnings": "Προειδοποιήσεις", "We_are_offline_Sorry_for_the_inconvenience": "Είμαστε εκτός σύνδεσης. Συγγνώμη για την ταλαιπωρία.", @@ -2756,6 +2764,7 @@ "registration.component.form.emailOrUsername": "Email ή όνομα χρήστη", "registration.component.form.username": "Όνομα Χρήστη", "registration.component.form.name": "Όνομα", + "registration.component.form.userAlreadyExist": "Το όνομα χρήστη υπάρχει ήδη. Δοκιμάστε ένα άλλο όνομα χρήστη.", "registration.component.form.emailAlreadyExists": "Το email υπάρχει ήδη", "registration.component.form.usernameAlreadyExists": "Το όνομα χρήστη υπάρχει ήδη. Δοκιμάστε ένα άλλο όνομα χρήστη.", "registration.component.form.invalidEmail": "Το e-mail που δώσατε δεν είναι έγκυρο", diff --git a/packages/i18n/src/locales/eo.i18n.json b/packages/i18n/src/locales/eo.i18n.json index 69cc5595f5606..f20d82eb96821 100644 --- a/packages/i18n/src/locales/eo.i18n.json +++ b/packages/i18n/src/locales/eo.i18n.json @@ -320,6 +320,7 @@ "Apply": "Apliki", "Apply_and_refresh_all_clients": "Apliki kaj refreŝigi ĉiujn klientojn", "Apps": "Apps", + "Apps_context_premium": "Entrepreno", "Apps_Settings": "Agordoj de la App", "Apps_WhatIsIt": "Aplikaĵoj: Kio Estas Ili?", "Apps_WhatIsIt_paragraph1": "Nova ikono en la administra areo! Kion tio signifas kaj kio estas Apps?", @@ -1099,6 +1100,7 @@ "FEDERATION_Domain": "Domajno", "FEDERATION_Status": "Statuso", "Retry_Count": "Retry Count", + "Federation_Matrix_enabled": "Enabled", "Field": "Kampo", "Field_removed": "Kampo forigita", "Field_required": "Kampo postulita", @@ -1458,6 +1460,10 @@ "Layout_Terms_of_Service": "Reguloj de servado", "LDAP": "LDAP", "LDAP_Description": "LDAP estas hierarkia datumbazo, kiun multaj kompanioj uzas por doni unu signon al ĝi - facilecon por dividi unu pasvorton inter pluraj retejoj kaj servoj. Por altnivelaj agordoj kaj ekzemploj, bonvolu konsulti nian vikion: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "Ĉifrado", + "LDAP_DataSync_BackgroundSync": "Fona Sinkro", + "LDAP_Server_Type": "Servilo Tipo", + "LDAP_Server_Type_Other": "Alia", "LDAP_Authentication": "Ebligu", "LDAP_Authentication_Password": "Pasvorto", "LDAP_Authentication_UserDN": "Uzanto DN", @@ -2488,6 +2494,7 @@ "Unarchive": "Senarkora", "unarchive-room": "Senĉambra Ĉambro", "unarchive-room_description": "Permeso al kanaloj unárquicos", + "unauthorized": "Ne rajtigita", "Unblock_User": "Malŝalti Uzanton", "Unignore": "Senigi", "Uninstall": "Malinstali", @@ -2664,6 +2671,8 @@ "Visitor_Navigation": "Vizitanto Navigado", "Visitor_page_URL": "Vizitanto paĝo URL", "Visitor_time_on_site": "Vizitanto tempo sur retejo", + "VoIP_Management_Server_Username": "Uzulnomo", + "VoIP_Management_Server_Password": "Pasvorto", "Wait_activation_warning": "Antaŭ ol vi povas ensaluti, via konto devas esti permane aktivigita de administranto.", "Warnings": "Avertoj", "We_are_offline_Sorry_for_the_inconvenience": "Ni estas eksterrete. Pardonu la malkomforton.", @@ -2739,6 +2748,7 @@ "Your_server_link": "Via servilo-ligilo", "Your_temporary_password_is_password": "Via provizora pasvorto estas: [pasvorto]", "Your_workspace_is_ready": "Via labora spaco pretas uzi 🎉", + "registration.page.login.errors.wrongCredentials": "Uzanto ne trovita aŭ malĝusta pasvorto", "registration.page.registration.waitActivationWarning": "Antaŭ ol vi povas ensaluti, via konto devas esti permane aktivigita de administranto.", "registration.page.login.forgot": "Ĉu vi forgesis vian pasvorton", "registration.page.resetPassword.sent": "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.", @@ -2748,6 +2758,7 @@ "registration.component.form.emailOrUsername": "Retpoŝtadreso aŭ uzantnomo", "registration.component.form.username": "Uzulnomo", "registration.component.form.name": "Nomo", + "registration.component.form.userAlreadyExist": "Uzantnomo jam ekzistas. Bonvolu provi alian uzantnomon.", "registration.component.form.emailAlreadyExists": "Retpoŝto jam ekzistas", "registration.component.form.usernameAlreadyExists": "Uzantnomo jam ekzistas. Bonvolu provi alian uzantnomon.", "registration.component.form.invalidEmail": "La retpoŝta eniro estas nevalida", diff --git a/packages/i18n/src/locales/es.i18n.json b/packages/i18n/src/locales/es.i18n.json index d49ad1bd10c62..8eca2a2aec15e 100644 --- a/packages/i18n/src/locales/es.i18n.json +++ b/packages/i18n/src/locales/es.i18n.json @@ -13,8 +13,8 @@ "__usersCount__member_joined_other": "{{count}} miembros se han unido", "__usersCount__people_will_be_invited": "{{usersCount}} miembros sern invitados", "__username__is_no_longer__role__defined_by__user_by_": "{{username}} ya no es {{role}} (por {{user_by}})", - "__usersCount__member_joined_many": "{{count}} miembros se han unido", "__username__was_set__role__by__user_by_": "{{username}} se ha establecido como {{role}} por {{user_by}}", + "__usersCount__member_joined_many": "{{count}} miembros se han unido", "__count__without__department__": "{{count}} sin departamentos", "__count__without__tags__": "{{count}} sin etiquetas", "__count__without__assignee__": "{{count}} sin un agente asignado", @@ -468,6 +468,7 @@ "Apply_and_refresh_all_clients": "Aplicar y actualizar todos los clientes", "Apps": "Aplicaciones", "Apps_context_installed": "Instalada", + "Apps_context_premium": "Premium", "Apps_Engine_Version": "Versión de motor de aplicaciones", "Apps_Essential_Alert": "Esta aplicación es esencial para los siguientes eventos:", "Apps_Essential_Disclaimer": "Los eventos enumerados arriba se interrumpirán si esta aplicación se deshabilita. Si quieres que Rocket.Chat funcione sin esta aplicación, tienes que desinstalarla.", @@ -1383,6 +1384,7 @@ "Desktop_Notifications_Not_Enabled": "Las notificaciones de escritorio no están habilitadas", "Details": "Detalles", "line": "línea", + "Device_Management_IP": "IP", "Different_Style_For_User_Mentions": "Estilo diferente para menciones de usuario", "Livechat_Facebook_API_Key": "Clave API de OmniChannel", "Livechat_Facebook_API_Secret": "Secreto de API de OmniChannel", @@ -1632,6 +1634,7 @@ "Enter_Normal": "Modo normal (enviar con Intro)", "Enter_to": "Intro para", "Enter_your_E2E_password": "Introduzca su contraseña E2E", + "message_counter_many": "{{count}} mensajes", "Entertainment": "Entretenimiento", "Error": "Error", "Error_404": "Error 404", @@ -1678,6 +1681,7 @@ "error-forwarding-department-target-not-allowed": "No se permite el reenvío al departamento de destino.", "error-guests-cant-have-other-roles": "Los usuarios invitados no pueden tener ningún otro rol.", "error-import-file-extract-error": "No se ha podido extraer el archivo de importación.", + "meteor_status_reconnect_in_many": "intentando de nuevo dentro de {{count}} segundos...", "error-import-file-is-empty": "El archivo importado parece estar vacío.", "error-import-file-missing": "El archivo para importar no se ha encontrado en la ruta especificada.", "error-importer-not-defined": "El importador no se ha definido correctamente: falta la clase de importación.", @@ -1869,6 +1873,7 @@ "FEDERATION_Test_Setup_Error": "No se ha podido encontrar tu servidor usando tu configuración, así que debes revisarla.", "FEDERATION_Test_Setup_Success": "La configuración de tu federación funciona y otros servidores pueden encontrarte", "Retry_Count": "Contador de reintentos", + "Federation_Matrix_enabled": "Habilitada", "Field": "Campo", "Field_removed": "Campo eliminado", "Field_required": "Campo obligatorio", @@ -1960,7 +1965,6 @@ "Finish": "Finalizar", "Finish_Registration": "Finalizar registro", "First_Channel_After_Login": "Primer Channel tras iniciar sesión", - "message_counter_many": "{{count}} mensajes", "First_response_time": "Tiempo de primera respuesta", "Flags": "Indicadores", "Follow_message": "Mensaje para seguirnos", @@ -2018,7 +2022,6 @@ "get-password-policy-mustContainAtLeastOneNumber": "La contraseña debe contener al menos un número", "get-password-policy-mustContainAtLeastOneSpecialCharacter": "La contraseña debe contener al menos un carácter especial", "get-password-policy-mustContainAtLeastOneUppercase": "La contraseña debe contener al menos una letra en mayúscula", - "meteor_status_reconnect_in_many": "intentando de nuevo dentro de {{count}} segundos...", "github_no_public_email": "No tienes ningún correo electrónico como correo público en tu cuenta de GitHub", "github_HEAD": "HEAD", "Give_a_unique_name_for_the_custom_oauth": "Indicar un nombre único para el OAuth personalizado", @@ -2681,11 +2684,14 @@ "Local_Time_time": "Hora local: {{time}}", "Localization": "Localización", "Location": "Ubicación", + "mentions_counter_many": "{{count}} menciones", "Log_Exceptions_to_Channel": "Registrar excepciones en el Channel", "Log_Exceptions_to_Channel_Description": "Canal que recibirá todas las excepciones capturadas. Dejar vacío para ignorar las excepciones.", "Log_File": "Mostrar archivo y línea", + "threads_counter_many": "{{count}} mensajes en hilo sin leer", "Log_Level": "Nivel de registro", "Log_Package": "Mostrar paquete", + "unread_messages_counter_many": "{{count}} mensajes sin leer", "Log_Trace_Methods": "Seguimiento de llamadas de método", "Log_Trace_Methods_Filter": "Seguimiento de filtro de métodos", "Log_Trace_Methods_Filter_Description": "El texto de aquí se evaluará como regex (\"new RegExp('text')\"). Dejar vacío para mostrar el rastro de cada llamada.", @@ -3190,7 +3196,9 @@ "Only_invited_users_can_acess_this_channel": "Solo los usuarios invitados pueden acceder a este Channel", "Oops_page_not_found": "Vaya, página no encontrada", "Oops!": "¡Vaya!", + "subscription.callout.description.limitsExceeded_many": "Su espacio de trabajo ha superado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", "Open": "Abiertas", + "subscription.callout.description.limitsReached_many": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", "Open_channel_user_search": "\"%s\" - Abrir búsqueda de usuario/Channel", "Open_conversations": "Conversaciones abiertas", "Open_Days": "Días abiertos", @@ -3245,12 +3253,9 @@ "Password_Changed_Email_Subject": "[Site_Name] - Contraseña cambiada", "Password_changed_section": "Contraseña cambiada", "Password_changed_successfully": "Contraseña cambiada correctamente", - "mentions_counter_many": "{{count}} menciones", "Password_History": "Historial de contraseñas", "Password_History_Amount": "Longitud del historial de contraseñas", - "threads_counter_many": "{{count}} mensajes en hilo sin leer", "Password_History_Amount_Description": "Cantidad de contraseñas usadas más recientemente para evitar que los usuarios las reutilicen.", - "unread_messages_counter_many": "{{count}} mensajes sin leer", "Password_Policy": "Política de contraseñas", "Password_to_access": "Contraseña para acceder", "Passwords_do_not_match": "Las contraseñas no coinciden", @@ -3343,6 +3348,7 @@ "Privacy": "Privacidad", "Privacy_Policy": "Política de privacidad", "Private": "Privado", + "Private_channels": "Channels privados", "Private_Channel": "Channel privado", "Private_Channels": "Channels privados", "Private_Chats": "Chats privados", @@ -3419,6 +3425,7 @@ "Reactions": "Reacciones", "Read_by": "Leído por", "Read_only": "Solo lectura", + "This_room_is_read_only": "Esta sala es de solo lectura", "Read_only_changed_successfully": "Solo lectura cambiado correctamente", "Read_only_channel": "Channel de solo lectura", "Read_only_group": "Grupo de solo lectura", @@ -3577,6 +3584,7 @@ "Unsafe_Url": "URL no segura", "Rocket_Chat_Alert": "Alerta de Rocket.Chat", "Role": "Rol", + "Roles": "Roles", "Role_Editing": "Edición de roles", "Role_Mapping": "Asegnación de roles", "Role_removed": "Rol eliminado", @@ -3938,11 +3946,9 @@ "Sound": "Sonido", "Sound_File_mp3": "Archivo de sonido (mp3)", "Source": "Fuente", - "subscription.callout.description.limitsExceeded_many": "Su espacio de trabajo ha superado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", "SSL": "SSL", "Star": "Destacar", "Star_Message": "Destacar mensaje", - "subscription.callout.description.limitsReached_many": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", "Starred_Messages": "Mensajes destacados", "Start": "Iniciar", "Start_audio_call": "Iniciar llamada de audio", @@ -4325,6 +4331,7 @@ "unarchive-room": "Room desarchivada", "unarchive-room_description": "Permiso para desarchivar canales", "Unassigned": "Sin asignar", + "unauthorized": "No autorizado", "Unavailable": "No disponible", "Unblock_User": "Desbloquear usuario ", "Uncheck_All": "Desmarcar todo", @@ -4822,8 +4829,10 @@ "registration.component.form.requiredField": "Este campo es obligatorio", "registration.component.form.joinYourTeam": "Únete a tu equipo", "registration.component.form.reasonToJoin": "Motivo para unirse", + "registration.component.form.invalidConfirmPass": "La confirmación de la contraseña no coincide con la contraseña", "registration.component.form.confirmPassword": "Confirma tu contraseña", "registration.component.form.confirmation": "Confirmación", + "registration.component.form.sendConfirmationEmail": "Enviar correo electrónico de confirmación", "registration.component.form.register": "Registrar", "onboarding.component.form.requiredField": "Este campo es obligatorio", "onboarding.component.form.steps": "Paso {{currentStep}} de {{stepCount}}", diff --git a/packages/i18n/src/locales/et.i18n.json b/packages/i18n/src/locales/et.i18n.json index 52ea2c08027cb..e86303430c09a 100644 --- a/packages/i18n/src/locales/et.i18n.json +++ b/packages/i18n/src/locales/et.i18n.json @@ -43,6 +43,7 @@ "Cancel": "Tühista", "Cancel_message_input": "Tühista", "Close_menu": "Sulge menüü", + "Connected": "Ühendatud", "Edit_Status": "Redigeeri olekut", "How_friendly_was_the_chat_agent": "Kui sõbralik oli sinuga vestelnud agent?", "How_knowledgeable_was_the_chat_agent": "Kui teadlik oli sinuga vestelnud agent? ", diff --git a/packages/i18n/src/locales/eu.i18n.json b/packages/i18n/src/locales/eu.i18n.json index 7585a29458f23..c6e37c60e2c72 100644 --- a/packages/i18n/src/locales/eu.i18n.json +++ b/packages/i18n/src/locales/eu.i18n.json @@ -87,6 +87,7 @@ "Discussions": "Eztabaidak", "Edit_Status": "Editatu egoera", "Enabled": "Gaituta", + "Federation_Matrix_enabled": "Gaituta", "Group_discussions": "Talde eztabaidak", "How_satisfied_were_you_with_this_chat": "Zein pozik zeuden txat honekin?", "Installation": "Instalazioa", @@ -106,6 +107,7 @@ "Send": "Bidali", "Skip": "Saltatu", "Start_Chat": "Hasi txata", + "Stats_Total_Channels": "Kanalak", "Survey": "Inkesta", "Thank_you_for_your_feedback": "Eskerrik asko zure iritziagatik", "Total_Discussions": "Eztabaida guztiak", diff --git a/packages/i18n/src/locales/fa.i18n.json b/packages/i18n/src/locales/fa.i18n.json index a04ca62af4b19..cfeb59e37ddd6 100644 --- a/packages/i18n/src/locales/fa.i18n.json +++ b/packages/i18n/src/locales/fa.i18n.json @@ -382,6 +382,7 @@ "Apply": "درخواست دادن", "Apply_and_refresh_all_clients": "اعمال کن و تمامی کاربران را رفرش کن", "Apps": "برنامه ها", + "Apps_context_premium": "شرکت، پروژه", "Apps_Engine_Version": "ورژن موتور برنامه ها", "Apps_Marketplace_Deactivate_App_Prompt": "آیا واقعاً می خواهید این برنامه را غیرفعال کنید؟", "Apps_Marketplace_Login_Required_Description": "خرید برنامه از Rocket.Chat Marketplace نیاز به ثبت فضای کاری شما و ورود به سیستم دارد.", @@ -1356,6 +1357,7 @@ "FEDERATION_Domain": "دامنه", "FEDERATION_Status": "وضعیت", "Retry_Count": "تعداد تلاش مجدد", + "Federation_Matrix_enabled": "فعال شد", "Field": "فیلد", "Field_removed": "فیلد حذف شد", "Field_required": "فیلد مورد نیاز است", @@ -1722,6 +1724,11 @@ "Layout_Terms_of_Service": "شرایط استفاده از خدمات", "LDAP": "LDAP", "LDAP_Description": "یک مرکز برای به اشتراک گذاری یک رمز عبور بین سایت و خدمات مختلف - LDAP یک پایگاه داده سلسله مراتبی است که بسیاری از شرکت ها برای ارائه یکبار ورود به سیستم است. https://rocket.chat/docs/administrator-guides/authentication/ldap/: برای کسب اطلاعات پیکربندی پیشرفته و نمونه، لطفا ویکی ما مشورت کنید.", + "LDAP_Connection_Encryption": "رمزگذاری", + "LDAP_DataSync_Advanced": "همگام سازی پیشرفته", + "LDAP_DataSync_BackgroundSync": "همگام سازی پس زمینه", + "LDAP_Server_Type": "نوع سرور", + "LDAP_Server_Type_Other": "دیگر", "LDAP_Advanced_Sync": "همگام سازی پیشرفته", "LDAP_Authentication": "فعال کردن", "LDAP_Authentication_Password": "رمز عبور", @@ -3008,6 +3015,8 @@ "Visitor_Navigation": "کنترل های بازدید کننده", "Visitor_page_URL": "URL صفحه های بازدید کننده", "Visitor_time_on_site": "زمان بازدید کنندگان در سایت", + "VoIP_Management_Server_Username": "نام کاربری", + "VoIP_Management_Server_Password": "رمز عبور", "Wait_activation_warning": "قبل از اینکه شما می توانید وارد شوید، حساب خود را باید به صورت دستی توسط مدیر فعال می شود.", "Warnings": "اخطارها", "We_are_offline_Sorry_for_the_inconvenience": "متاسفانه ما برخط نیستیم.", @@ -3093,6 +3102,7 @@ "registration.component.form.emailOrUsername": "ایمیل یا نام کاربری", "registration.component.form.username": "نام کاربری", "registration.component.form.name": "نام", + "registration.component.form.userAlreadyExist": "نام کاربری از قبل وجود دارد. لطفا نام کاربری دیگری را امتحان کنید", "registration.component.form.emailAlreadyExists": "ایمیل از قبل وجود دارد", "registration.component.form.usernameAlreadyExists": "نام کاربری از قبل وجود دارد. لطفا نام کاربری دیگری را امتحان کنید", "registration.component.form.invalidEmail": "ایمیل وارد شده نامعتبر است", diff --git a/packages/i18n/src/locales/fi.i18n.json b/packages/i18n/src/locales/fi.i18n.json index 6783b74a9ea98..7cc44651e568e 100644 --- a/packages/i18n/src/locales/fi.i18n.json +++ b/packages/i18n/src/locales/fi.i18n.json @@ -11,6 +11,7 @@ "__username__was_set__role__by__user_by_": "{{user_by}} muutti käyttäjän {{username}} rooliksi {{role}} ", "This_room_encryption_has_been_enabled_by__username_": "Tämän huoneen salauksen otti käyttöön {{username}} ", "This_room_encryption_has_been_disabled_by__username_": "Tämän huoneen salauksen poisti käytöstä {{username}}", + "Third_party_login": "Kolmannen osapuolen kirjautuminen", "Enabled_E2E_Encryption_for_this_room": "otti E2E-salauksen käyttöön tässä huoneessa", "disabled": "poissa käytöstä", "Disabled_E2E_Encryption_for_this_room": "poisti E2E-salauksen käytöstä tässä huoneessa", @@ -507,6 +508,7 @@ "Apps_context_installed": "Asennettu", "Apps_context_requested": "Pyydetty", "Apps_context_private": "Yksityiset sovellukset", + "Apps_context_premium": "Yritys", "Apps_Count_Enabled_one": "{{count}} sovellus käytössä", "Apps_Count_Enabled_other": "{{count}} sovellusta käytössä", "Private_Apps_Count_Enabled_one": "{{count}} yksityistä sovellusta käytössä", @@ -3831,6 +3833,7 @@ "Privacy_summary": "Tietosuojakäytännön yhteenveto", "Private": "Yksityinen", "private": "yksityinen", + "Private_channels": "Yksityiset kanavat Channel", "Private_Apps": "Yksityiset sovellukset", "Private_Channel": "Yksityinen kanava Channel", "Private_Channels": "Yksityiset kanavat Channel", @@ -5569,6 +5572,7 @@ "onboarding.component.form.action.next": "Seuraava", "onboarding.component.form.action.skip": "Ohita tämä vaihe", "onboarding.component.form.action.register": "Rekisteröi", + "onboarding.component.form.action.registerWorkspace": "Rekisteröi työtila", "onboarding.component.form.action.confirm": "Vahvista", "onboarding.component.form.termsAndConditions": "Hyväksyn käyttöehdot <1>ja <3>tietosuojaselosteen", "onboarding.component.emailCodeFallback": "Etkö saanut sähköpostia? <1>Lähetä uudelleen tai <3>muuta sähköpostia", @@ -5609,6 +5613,7 @@ "onboarding.form.adminInfoForm.fields.password.placeholder": "Luo salasana", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Pidä minut ajan tasalla chatsovelluksen päivityksistä", "onboarding.form.awaitConfirmationForm.title": "Odotamme vahvistusta", + "onboarding.form.awaitConfirmationForm.content.securityCode": "Turvakoodi", "onboarding.form.organizationInfoForm.title": "Organisaation tiedot", "onboarding.form.organizationInfoForm.subtitle": "Pyydämme kärsivällisyyttä, nämä tiedot auttavat meitä muokkaamaan työtilasi yksilölliseksi", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Organisaation nimi", @@ -5621,6 +5626,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Valitse", "onboarding.form.organizationInfoForm.fields.country.label": "Maa", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Valitse", + "onboarding.form.registerOfflineForm.title": "Rekisteröidy offline-tilassa", "onboarding.form.registeredServerForm.title": "Rekisteröi palvelimesi", "onboarding.form.registeredServerForm.included.push": "Mobiili push-ilmoitukset", "onboarding.form.registeredServerForm.included.externalProviders": "Integrointi ulkoisten palveluntarjoajien kanssa (WhatsApp, Facebook, Telegram, Twitter)", diff --git a/packages/i18n/src/locales/fr.i18n.json b/packages/i18n/src/locales/fr.i18n.json index ed73b52dccbdb..b8c6ee5b64146 100644 --- a/packages/i18n/src/locales/fr.i18n.json +++ b/packages/i18n/src/locales/fr.i18n.json @@ -409,6 +409,7 @@ "API_Shield_Types_Description": "Types de bouclier à activer sous forme de liste séparée par des virgules, choisissez parmi `en ligne`,` canal` ou `*` pour tout", "Apps_Framework_Development_Mode": "Activer le mode de développement", "API_Shield_user_require_auth": "Exiger une authentification pour les boucliers des utilisateurs", + "Calls_in_queue_many": "{{count}} appels en file d'attente", "API_Token": "Jeton d'API", "Apps_Framework_Development_Mode_Description": "Le mode de développement permet l'installation d'applications qui ne proviennent pas du marketplace Rocket.Chat.", "API_Tokenpass_URL": "URL du serveur Tokenpass", @@ -452,6 +453,7 @@ "Apply_and_refresh_all_clients": "Appliquer et actualiser tous les clients", "Apps": "Applications", "Apps_context_installed": "Installé", + "Apps_context_premium": "Entreprise", "Apps_Engine_Version": "Version d'Apps Engine", "Apps_Essential_Alert": "Cette application est indispensable pour les événements suivants :", "Apps_Essential_Disclaimer": "Les événements ci-dessus seront perturbés si cette application est désactivée. Si vous voulez que Rocket.Chat fonctionne sans les fonctionnalités de cette application, vous devez la désinstaller", @@ -488,7 +490,6 @@ "Apps_License_Message_appId": "La licence n'a pas été émise pour cette application", "Apps_License_Message_bundle": "Licence émise pour un bundle qui ne contient pas l'application", "Apps_License_Message_expire": "La licence n'est plus valide et doit être renouvelée", - "Calls_in_queue_many": "{{count}} appels en file d'attente", "Apps_License_Message_maxSeats": "La licence n'est pas adaptée au nombre actuel d'utilisateurs actifs. Augmentez le nombre de sièges", "Apps_License_Message_publicKey": "Une erreur s'est produite lors du déchiffrement de la licence. Synchronisez votre espace de travail dans les services de connectivité et réessayez", "Apps_License_Message_renewal": "La licence a expiré et doit être renouvelée", @@ -1380,6 +1381,7 @@ "Desktop_Notifications_Not_Enabled": "Les notifications de bureau ne sont pas activées", "Details": "Détails", "line": "ligne", + "Device_Management_IP": "IP", "Different_Style_For_User_Mentions": "Style différent pour les mentions d'utilisateur", "Livechat_Facebook_API_Key": "Clé API d'omnicanal", "Livechat_Facebook_API_Secret": "Clé secrète d'API d'omnicanal", @@ -1630,6 +1632,7 @@ "Enter_Normal": "Mode normal (envoyé avec Entrée)", "Enter_to": "Entrée pour", "Enter_your_E2E_password": "Entrez votre mot de passe E2E", + "message_counter_many": "{{count}} messages", "Entertainment": "Divertissement", "Error": "Erreur", "Error_404": "Erreur 404", @@ -1676,6 +1679,7 @@ "error-forwarding-department-target-not-allowed": "Le transfert vers le département cible n'est pas autorisé.", "error-guests-cant-have-other-roles": "Les utilisateurs invités ne peuvent avoir aucun autre rôle.", "error-import-file-extract-error": "Échec de l'extraction du fichier d'importation.", + "meteor_status_reconnect_in_many": "nouvelle tentative dans {{count}} secondes...", "error-import-file-is-empty": "Le fichier importé semble être vide.", "error-import-file-missing": "Le fichier à importer est introuvable dans l'emplacement spécifié.", "error-importer-not-defined": "L'importateur n'a pas été défini correctement, il manque la classe d'importation.", @@ -1866,6 +1870,7 @@ "FEDERATION_Test_Setup_Error": "Impossible de trouver votre serveur en utilisant votre configuration, vérifiez vos paramètres.", "FEDERATION_Test_Setup_Success": "Votre configuration de fédération fonctionne et d'autres serveurs peuvent vous trouver !", "Retry_Count": "Nombre de tentatives", + "Federation_Matrix_enabled": "Activé", "Field": "Champ", "Field_removed": "Champ supprimé", "Field_required": "Champ requis", @@ -1957,7 +1962,6 @@ "Finish": "Terminer", "Finish_Registration": "Terminer l'inscription", "First_Channel_After_Login": "Premier canal après la connexion", - "message_counter_many": "{{count}} messages", "First_response_time": "Temps de première réponse", "Flags": "Indicateurs", "Follow_message": "Suivre le message", @@ -2016,7 +2020,6 @@ "get-password-policy-mustContainAtLeastOneSpecialCharacter": "Le mot de passe doit contenir au moins un caractère spécial", "get-password-policy-mustContainAtLeastOneUppercase": "Le mot de passe doit contenir au moins une lettre majuscule", "get-server-info": "Obtenir des informations sur le serveur", - "meteor_status_reconnect_in_many": "nouvelle tentative dans {{count}} secondes...", "github_no_public_email": "Vous n'avez pas d'adresse e-mail publique associée à votre compte GitHub", "github_HEAD": "EN-TÊTE", "Give_a_unique_name_for_the_custom_oauth": "Indiquez un nom unique pour OAuth personnalisé", @@ -3343,6 +3346,7 @@ "Privacy": "Confidentialité", "Privacy_Policy": "Politique de confidentialité", "Private": "Privé", + "Private_channels": "Canaux privés", "Private_Channel": "Canal privé", "Private_Channels": "Canaux privés", "Private_Chats": "Chats privés", @@ -3419,6 +3423,7 @@ "Reactions": "Réactions", "Read_by": "Lu par", "Read_only": "Lecture seule", + "This_room_is_read_only": "Le salon est en lecture seule", "Read_only_changed_successfully": "Modification du mode lecture seule réussie", "Read_only_channel": "Canal en lecture seule", "Read_only_group": "Groupe en lecture seule", @@ -3581,6 +3586,7 @@ "Unsafe_Url": "URL non sécurisées", "Rocket_Chat_Alert": "Alerte Rocket.Chat", "Role": "Rôle", + "Roles": "Rôles", "Role_Editing": "Modification de rôle", "Role_Mapping": "Mappage de rôles", "Role_removed": "Rôle supprimé", @@ -4794,6 +4800,7 @@ "registration.component.resetPassword": "Réinitialiser le mot de passe", "registration.component.form.username": "Nom d'utilisateur", "registration.component.form.name": "Nom", + "registration.component.form.userAlreadyExist": "Ce nom d'utilisateur existe déjà. Essayez avec un autre nom d'utilisateur.", "registration.component.form.emailAlreadyExists": "L'adresse e-mail existe déjà", "registration.component.form.usernameAlreadyExists": "Ce nom d'utilisateur existe déjà. Essayez avec un autre nom d'utilisateur.", "registration.component.form.invalidEmail": "L'adresse e-mail saisie est invalide", diff --git a/packages/i18n/src/locales/gl.i18n.json b/packages/i18n/src/locales/gl.i18n.json index a17dba96f252d..c616ab6c6b4eb 100644 --- a/packages/i18n/src/locales/gl.i18n.json +++ b/packages/i18n/src/locales/gl.i18n.json @@ -167,6 +167,7 @@ "Favorite": "Favorito", "Favorite_Rooms": "Habilitar Room favoritas", "Favorites": "Favoritos", + "Federation_Matrix_enabled": "Activado", "File_name_Placeholder": "Procurar arquivos...", "files": "arquivos", "Files": "Lista de arquivos", @@ -262,6 +263,8 @@ "Started_a_video_call": "Iniciou unha videochamada", "Stats_Away_Users": "Usuarios ausentes", "Stats_Online_Users": "Usuarios en liña", + "Stats_Total_Channels": "Channel", + "Stats_Total_Messages": "Mensaxes", "StatusMessage": "Mensaxe de Estado", "Symbols": "Símbolos", "theme-color-status-away": "Cor do estado ausente", @@ -385,5 +388,8 @@ "onboarding.form.standaloneServerForm.title": "Confirmación do servidor autónomo", "onboarding.form.standaloneServerForm.servicesUnavailable": "Algúns dos servizos non estarán dispoñibles ou requirirán unha configuración manual", "onboarding.form.standaloneServerForm.publishOwnApp": "Para enviar notificacións push, debes compilar e publicar a túa propia aplicación en Google Play e App Store", - "onboarding.form.standaloneServerForm.manuallyIntegrate": "Necesita integrarse manualmente con servizos externos" + "onboarding.form.standaloneServerForm.manuallyIntegrate": "Necesita integrarse manualmente con servizos externos", + "Awaiting_confirmation": "Agardando confirmación", + "RegisterWorkspace_Features_MobileNotifications_Title": "Notificacións push móbiles", + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Acepto os <1>Termos e condicións e a <3>Política de privacidade" } \ No newline at end of file diff --git a/packages/i18n/src/locales/he.i18n.json b/packages/i18n/src/locales/he.i18n.json index b231a2c2ce9ae..84da76d594214 100644 --- a/packages/i18n/src/locales/he.i18n.json +++ b/packages/i18n/src/locales/he.i18n.json @@ -58,6 +58,7 @@ "Accounts_OAuth_Custom_Identity_Path": "נתיב הזהות", "Accounts_OAuth_Custom_Login_Style": "סגנון כניסה", "Accounts_OAuth_Custom_Roles_Claim": "שם שדה / קבוצות", + "Accounts_OAuth_Custom_Scope": "תְחוּם", "Accounts_OAuth_Custom_Secret": "סוד", "Accounts_OAuth_Custom_Token_Path": "נתיב ה-Token ", "Accounts_OAuth_Custom_Token_Sent_Via": "Via אסימון שנשלח", @@ -179,6 +180,7 @@ "Announcement": "הודעת הכרזה", "API": "API", "API_Analytics": "סטטיסטיקה", + "API_Drupal_URL_Description": "דוגמה: `https://domain.com` (ללא \"/\" בסוף הכתובת)", "API_Embed": "הטמעה", "API_EmbedIgnoredHosts": "מארחי שבץ שהתעלמו מהן", "API_EmbedIgnoredHosts_Description": "רשימה מופרדת בפסיקים של מארחים או כתובות CIDR, למשל. localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", @@ -355,6 +357,7 @@ "Create_unique_rules_for_this_channel": "יצירת חוקים ייחודיים לערוץ זה", "Created_at": "נוצר ב־", "Created_at_s_by_s": "נוצר בתאריך %s על ידי %s", + "CROWD_Reject_Unauthorized": "דחית מורשה", "Current_Chats": "צ'אטים נוכחיים", "Current_Status": "סטטוס נוכחי", "Custom": "מותאם", @@ -401,6 +404,7 @@ "Direct_message_someone": "מישהו מסר ישיר", "Direct_Messages": "הודעות ישירות", "Direct_Reply": "הגב בפרטי", + "Direct_Reply_Username": "שם משתמש", "Directory": "קבוצות ציבוריות ומשתמשים", "Disable_Notifications": "השבת נוטיפיקציות", "Disabled": "לא משופעל", @@ -561,6 +565,7 @@ "Favorites": "מועדפים", "FEDERATION_Domain": "תחום", "FEDERATION_Status": "סטטוס", + "Federation_Matrix_enabled": "משופעל", "Field": "שדה", "Field_removed": "שדה הוסר", "Field_required": "שדה נדרש", @@ -691,6 +696,8 @@ "Integrations_Outgoing_Type_SendMessage": "הודעה נשלחה", "Integrations_Outgoing_Type_UserCreated": "המשתמש נוצר", "InternalHubot": "Hubot הפנימי", + "InternalHubot_EnableForChannels": "אפשר ערוצים ציבוריים", + "InternalHubot_EnableForPrivateGroups": "אפשר ערוצים פרטיים", "InternalHubot_ScriptsToLoad": "סקריפטים לטעון", "InternalHubot_ScriptsToLoad_Description": "הזן רשימה מופרדת בפסיקים של סקריפטים לטעון מן https://github.com/github/hubot-scripts/tree/master/src/scripts", "InternalHubot_Username_Description": "זה חייב להיות שם משתמש תקין של בוט רשום בשרת שלך.", @@ -766,6 +773,8 @@ "Layout_Sidenav_Footer_Dark_description": "גודל חלק תחתון הוא 260 על 70 פיקסלים", "Layout_Terms_of_Service": "תנאי השירות", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "הצף", + "LDAP_UserSearch": "חיפוש משתמשים", "LDAP_Authentication": "לאפשר", "LDAP_Authentication_UserDN_Description": "משתמש LDAP שמבצע חיפושי משתמש כדי לאמת משתמשים אחרים כאשר הם נכנסים. \n זה בדרך כלל חשבון שירות שנוצרו במיוחד עבור ואינטגרציות צד שלישי. השתמש בשם מלא, כגון `cn = מנהל, cn = Users, dc = דוגמא, dc = com`.", "LDAP_BaseDN_Description": "השם הייחודי מלא (DN) של עץ משנה LDAP אתה רוצה לחפש משתמשים וקבוצות. אתה יכול להוסיף כמה שאתה רוצה; עם זאת, כל קבוצה חייבת להיות מוגדרת באותו הבסיס מושלם בתור המשתמשים ששייכים אליו. אם תציין קבוצות משתמש מוגבלות, רק משתמשים השייכים לקבוצות אלו יהיו בהיקפה. אנו ממליצים לציין את הרמה העליונה של ספריית עץ LDAP שלך כבסיס התחום שלך ולהשתמש במסנן חיפוש כדי לשלוט בגישה.", @@ -890,6 +899,7 @@ "Message_removed": "ההודעה הוסרה", "Message_ShowDeletedStatus": "הצגת מצב מחיקה", "Message_starring": "סימון הודעות בכוכב", + "Message_TimeAndDateFormat_Description": "לעיון נוסף: [Moment.js](http://momentjs.com/docs/#/displaying/format/)", "Message_TimeFormat": "תבנית זמן", "Message_TimeFormat_Description": "ראו גם: [Moment.js](http://momentjs.com/docs/#/displaying/format/)", "Message_too_long": "ההודעה ארוכה מדי", @@ -1312,6 +1322,7 @@ "theme-color-primary-background-color": "צבע רקע ראשי", "theme-color-primary-font-color": "צבע פונט ראשי", "theme-color-rc-color-content": "תוכן", + "theme-color-rc-color-error": "שגיאה", "theme-color-secondary-background-color": "צבע רקע משני", "theme-color-secondary-font-color": "צבע פונט משני", "theme-color-status-away": "צבע סטטוס לא נמצא", @@ -1452,6 +1463,7 @@ "View_mode": "מצב תצוגה", "View_All": "הצגת הכול", "View_Logs": "יומנים", + "view-logs": "יומנים", "Viewing_room_administration": "ניהול הצפייה בחדר", "Visibility": "רְאוּת", "Visible": "נִרְאֶה", @@ -1460,6 +1472,8 @@ "Visitor_Navigation": "ניווט גולשים", "Visitor_page_URL": "כתובת אתר של דף הגולש", "Visitor_time_on_site": "זמן גולש באתר", + "VoIP_Management_Server_Username": "שם משתמש", + "VoIP_Management_Server_Password": "ססמה", "Wait_activation_warning": "לפני שתוכל להתחבר, החשבון שלך חייב לעבור אישור על ידי האדמין.", "We_are_offline_Sorry_for_the_inconvenience": "אנחנו במצב לא מקוון. מצטער על אי הנוחות.", "We_have_sent_password_email": "בדקות הקרובות אמורה להגיע אליך הודעה בדוא״ל עם הוראות לאיפוס הססמה. אם ההודעה לא מגיעה אליך, נא לנסות שוב.", diff --git a/packages/i18n/src/locales/hi-IN.i18n.json b/packages/i18n/src/locales/hi-IN.i18n.json new file mode 100644 index 0000000000000..a2b3e208382f2 --- /dev/null +++ b/packages/i18n/src/locales/hi-IN.i18n.json @@ -0,0 +1,217 @@ +{ + "500": "आंतरिक सर्वर त्रुटि", + "__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}}", + "@username": "@यूज़रनेम", + "@username_message": "@यूज़रनेम ", + "#channel": "#चैनल", + "%_of_conversations": "% बातचीत", + "0_Errors_Only": "0 - त्रुटियां केवल", + "1_Errors_and_Information": "1 - त्रुटियां और सूचना", + "2_Erros_Information_and_Debug": "2 - त्रुटियां, सूचना और डिबग", + "12_Hour": "12-घंटे की घड़ी", + "24_Hour": "24-घंटे की घड़ी", + "Accept": "स्वीकार करें", + "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "यदि कोई ऑनलाइन एजेंट नहीं हैं, तो भी इनकमिंग लाइवचैट अनुरोध स्वीकार करें", + "Accept_with_no_online_agents": "कोई ऑनलाइन एजेंटों के साथ स्वीकार करें", + "Access_not_authorized": "प्रवेश अधिकृत नहीं है", + "Access_Token_URL": "एक्सेस टोकन URL", + "access-mailer": "मेलर स्क्रीन एक्सेस करें", + "access-mailer_description": "सभी उपयोगकर्ताओं को बड़े पैमाने पर ईमेल भेजने की अनुमति।", + "access-permissions": "अनुमतियाँ स्क्रीन एक्सेस करें", + "access-permissions_description": "विभिन्न भूमिकाओं के लिए अनुमतियों को संशोधित करें।", + "Accessing_permissions": "अक्सेस्सिंग की अनुमति", + "Account_SID": "खाता एसआईडी", + "Accounts": "खाता", + "Accounts_Admin_Email_Approval_Needed_Default": "

The user [name] ([email]) has been registered.

Please check \"Administration -> Users\" to activate or delete it.

", + "Accounts_Admin_Email_Approval_Needed_Subject_Default": "एक नया उपयोगकर्ता पंजीकृत है और उसे अनुमोदन की आवश्यकता है", + "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

The user [name] ([email]) has been registered.

Reason: [reason]

Please check \"Administration -> Users\" to activate or delete it.

", + "Accounts_AllowAnonymousRead": "अनाम पढ़ने की अनुमति दें", + "Accounts_AllowAnonymousWrite": "अनाम लिखने की अनुमति दें", + "Accounts_AllowDeleteOwnAccount": "उपयोगकर्ताओं को स्वयं का खाता हटाने की अनुमति दें", + "Accounts_AllowedDomainsList": "अनुमत डोमेन सूची", + "Accounts_AllowedDomainsList_Description": "अनुमत डोमेन की कोमा-पृथक सूची", + "Accounts_AllowEmailChange": "ईमेल परिवर्तन की अनुमति दें", + "Accounts_AllowPasswordChange": "पासवर्ड बदलने की अनुमति दें", + "Accounts_AllowRealNameChange": "नाम बदलने की अनुमति दें", + "Accounts_AllowUserAvatarChange": "उपयोगकर्ता अवतार परिवर्तन की अनुमति दें", + "Accounts_AllowUsernameChange": "उपयोगकर्ता नाम बदलने की अनुमति दें", + "Accounts_AllowUserProfileChange": "उपयोगकर्ता प्रोफ़ाइल बदलने की अनुमति दें", + "Accounts_AvatarBlockUnauthenticatedAccess": "अपुष्ट एक्सेस को अवतारों से ब्लॉक करें", + "Accounts_AvatarCacheTime": "अवतार कैश समय", + "Accounts_AvatarCacheTime_description": "HTTP प्रोटोकॉल को अवतार छवियों को कैश करने के लिए सेकंड की संख्या बताई गई है।", + "Accounts_AvatarExternalProviderUrl": "अवतार बाहरी प्रदाता URL", + "Accounts_AvatarExternalProviderUrl_Description": "उदाहरण: `https://acme.com/api/v1/ {उपयोगकर्ता नाम}`", + "Accounts_AvatarResize": "अवतार का आकार बदलें", + "Accounts_AvatarSize": "अवतार का आकार", + "Accounts_BlockedDomainsList": "अवरुद्ध डोमेन सूची", + "Accounts_BlockedDomainsList_Description": "अवरुद्ध डोमेन की कोमा से अलग सूची", + "Accounts_BlockedUsernameList": "अवरुद्ध उपयोगकर्ता नाम सूची", + "Accounts_BlockedUsernameList_Description": "कॉमा-अवरुद्ध उपयोगकर्ता नाम की अलग-अलग सूची (केस-असंवेदनशील)", + "Accounts_CustomFields_Description": "एक वैध JSON होना चाहिए जहां कुंजियाँ फ़ील्ड नाम हैं जिसमें फ़ील्ड सेटिंग्स का शब्दकोश है। उदाहरण: \n`{\"role\":{ \"type\": \"select\", \"defaultValue\": \"student\", \"options\": [\"teacher\", \"student\"], \"required\": true, \"modifyRecordField\": { \"array\": true, \"field\": \"roles\" } }, \"twitter\": { \"type\": \"text\", \"required\": true, \"minLength\": 2, \"maxLength\": 10 }}`", + "Accounts_CustomFieldsToShowInUserInfo": "कस्टम फ़ील्ड उपयोगकर्ता जानकारी में दिखाने के लिए", + "Accounts_Default_User_Preferences": "डिफ़ॉल्ट उपयोगकर्ता प्राथमिकताएं", + "Accounts_Default_User_Preferences_audioNotifications": "ऑडियो सूचनाएं डिफ़ॉल्ट चेतावनी", + "Accounts_Default_User_Preferences_desktopNotifications": "डेस्कटॉप सूचनाएं डिफ़ॉल्ट चेतावनी", + "Accounts_Default_User_Preferences_pushNotifications": "मोबाइल सूचनाएं डिफ़ॉल्ट चेतावनी", + "Accounts_Default_User_Preferences_not_available": "उपयोगकर्ता प्राथमिकताएँ प्राप्त करने में विफल, क्योंकि वे उपयोगकर्ता द्वारा अभी तक सेट नहीं किए गए हैं", + "Accounts_DefaultUsernamePrefixSuggestion": "डिफ़ॉल्ट उपयोगकर्ता नाम उपसर्ग सुझाव", + "Accounts_denyUnverifiedEmail": "अयोग्य ईमेल अस्वीकार करें", + "Accounts_Email_Activated": "[name]

आपका खाता सक्रिय हो गया था।

", + "Accounts_Email_Activated_Subject": "खाता सक्रिय किया गया", + "Accounts_Email_Approved": "[name]

आपका खाता स्वीकृत हो गया।

", + "Accounts_Email_Approved_Subject": "खाता स्वीकृत हुआ", + "Accounts_Email_Deactivated": "[name]

आपका खाता निष्क्रिय कर दिया गया।

", + "Accounts_Email_Deactivated_Subject": "खाता निष्क्रिय किया गया", + "Accounts_EmailVerification": "ई - मेल सत्यापन", + "Accounts_EmailVerification_Description": "सुनिश्चित करें कि आपके पास इस सुविधा का उपयोग करने के लिए SMTP सेटिंग्स सही हैं", + "Accounts_Enrollment_Email": "नामांकन ईमेल", + "Accounts_Enrollment_Email_Default": "

Welcome to [Site_Name]

Go to [Site_URL] and try the best open source chat solution available today!

", + "Accounts_Enrollment_Email_Description": "आप निम्नलिखित प्लेसहोल्डर का उपयोग कर सकते हैं: \n - `[name]`, `[fname]`, `[lname]` उपयोगकर्ता के पूर्ण नाम के लिए, क्रमशः पहला नाम या अंतिम नाम। - । ईमेल] उपयोगकर्ता के ईमेल के लिए। \n - `[Site_Name]` और `[Site_URL]` क्रमशः अनुप्रयोग नाम और URL के लिए। ", + "Accounts_Enrollment_Email_Subject_Default": "[Site_Name] में आपका स्वागत है", + "Accounts_ForgetUserSessionOnWindowClose": "विंडो बंद होने पर उपयोगकर्ता सत्र को भूल जाएं", + "Accounts_Iframe_api_method": "API विधि", + "Accounts_Iframe_api_url": "API URL", + "Accounts_iframe_enabled": "सक्रिय", + "Accounts_iframe_url": "Iframe URL", + "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": "Id", + "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_Scope": "क्षेत्र", + "Accounts_OAuth_Custom_Secret": "गुप्त", + "Accounts_OAuth_Custom_Token_Path": "टोकन पथ", + "Accounts_OAuth_Custom_Token_Sent_Via": "के जरिए टोकन भेजा गया", + "Accounts_OAuth_Custom_Username_Field": "उपयोगकर्ता नाम फ़ील्ड", + "Accounts_OAuth_Drupal": "Drupal लॉगिन सक्षम है", + "Accounts_OAuth_Drupal_callback_url": "Drupal oAuth2 रीडायरेक्ट URI", + "Accounts_OAuth_Drupal_id": "Drupal oAuth2 क्लाइंट आईडी", + "Accounts_OAuth_Drupal_secret": "Drupal oAuth2 क्लाइंट सीक्रेट", + "Accounts_OAuth_Facebook": "फेसबुक लोगिन", + "Accounts_OAuth_Facebook_callback_url": "फेसबुक कॉलबैक URL", + "Accounts_OAuth_Facebook_id": "फेसबुक ऐप आईडी", + "Accounts_OAuth_Facebook_secret": "फेसबुक सीक्रेट", + "Accounts_OAuth_Github": "OAuth सक्षम", + "Accounts_OAuth_Github_callback_url": "GitHub कॉलबैक यूआरएल", + "Accounts_OAuth_GitHub_Enterprise": "OAuth सक्षम", + "Accounts_OAuth_GitHub_Enterprise_callback_url": "GitHub एंटरप्राइज़ कॉलबैक URL", + "Accounts_OAuth_GitHub_Enterprise_id": "क्लाइंट ID", + "Accounts_OAuth_GitHub_Enterprise_secret": "क्लाइंट Secret", + "Accounts_OAuth_Github_id": "क्लाइंट Id", + "Accounts_OAuth_Github_secret": "क्लाइंट Secret", + "Accounts_OAuth_Gitlab": "OAuth सक्षम", + "Accounts_OAuth_Gitlab_callback_url": "GitLab कॉलबैक URL", + "Accounts_OAuth_Gitlab_id": "Gitlab Id", + "Accounts_OAuth_Gitlab_identity_path": "पहचान पथ", + "Accounts_OAuth_Gitlab_secret": "क्लाइंट Secret", + "Accounts_OAuth_Google": "Google लॉगिन", + "Accounts_OAuth_Google_callback_url": "Google कॉलबैक URL", + "Accounts_OAuth_Google_id": "Google Id", + "Accounts_OAuth_Google_secret": "Google Secret", + "Accounts_OAuth_Linkedin": "LinkedIn लॉगिन", + "Accounts_OAuth_Linkedin_callback_url": "LinkedIn कॉलबैक URL", + "Accounts_OAuth_Linkedin_id": "LinkedIn Id", + "Accounts_OAuth_Linkedin_secret": "LinkedIn Secret", + "Accounts_OAuth_Meteor": "Meteor Login", + "Accounts_OAuth_Meteor_callback_url": "Meteor कॉलबैक URL", + "Accounts_OAuth_Meteor_id": "Meteor Id", + "Accounts_OAuth_Meteor_secret": "Meteor Secret", + "Accounts_OAuth_Nextcloud": "OAuth सक्षम", + "Accounts_OAuth_Nextcloud_secret": "क्लाइंट Secret", + "Accounts_OAuth_Proxy_host": "प्रॉक्सी होस्ट", + "Accounts_OAuth_Proxy_services": "प्रॉक्सी सेवाएँ", + "Accounts_OAuth_Tokenpass": "Tokenpass लॉगइन", + "Accounts_OAuth_Tokenpass_callback_url": "Tokenpass कॉलबैक URL", + "Accounts_OAuth_Tokenpass_id": "Tokenpass Id", + "Accounts_OAuth_Tokenpass_secret": "Tokenpass Secret", + "Accounts_OAuth_Twitter": "ट्विटर लॉगइन", + "Accounts_OAuth_Twitter_callback_url": "ट्विटर कॉलबैक URL", + "Accounts_OAuth_Twitter_id": "ट्विटर Id", + "Accounts_OAuth_Twitter_secret": "ट्विटर Secret", + "Accounts_OAuth_Wordpress": "वर्डप्रेस लॉगिन", + "Accounts_OAuth_Wordpress_authorize_path": "पथ अधिकृत करें", + "Accounts_OAuth_Wordpress_callback_url": "वर्डप्रेस कॉलबैक URL", + "Accounts_OAuth_Wordpress_id": "वर्डप्रेस Id", + "Accounts_OAuth_Wordpress_identity_path": "पहचान पथ", + "Accounts_OAuth_Wordpress_identity_token_sent_via": "के जरिए पहचान टोकन भेजा गया", + "Accounts_OAuth_Wordpress_scope": "क्षेत्र", + "Accounts_OAuth_Wordpress_secret": "वर्डप्रेस Secret", + "Accounts_OAuth_Wordpress_server_type_custom": "कस्टम", + "Accounts_OAuth_Wordpress_server_type_wordpress_com": "Wordpress.com", + "Accounts_OAuth_Wordpress_server_type_wp_oauth_server": "WP OAuth Server Plugin", + "Accounts_OAuth_Wordpress_token_path": "टोकन पथ", + "Accounts_Password_Policy_AtLeastOneLowercase": "कम से कम एक लोअरकेस में", + "Accounts_Password_Policy_AtLeastOneLowercase_Description": "लागू करें कि पासवर्ड में कम से कम एक लोअरकेस वर्ण हो।", + "Accounts_Password_Policy_AtLeastOneNumber": "कम से कम एक नंबर", + "Accounts_Password_Policy_AtLeastOneNumber_Description": "लागू करें कि एक पासवर्ड में कम से कम एक संख्यात्मक चरित्र होता है।", + "Accounts_Password_Policy_AtLeastOneUppercase_Description": "लागू करें कि पासवर्ड में कम से कम एक लोअरकेस वर्ण हो।", + "Accounts_Registration_InviteUrlType_Direct": "सीधा", + "Accounts_RegistrationForm": "पंजीकरण पत्र", + "Accounts_RegistrationForm_Disabled": "उपयोग करने की अनुमति नहीं है", + "Accounts_RegistrationForm_Public": "जनता", + "Accounts_TwoFactorAuthentication_MaxDelta": "soochna", + "Additional_Feedback": "अतिरिक्त प्रतिक्रिया", + "App_status_auto_enabled": "सक्रिय", + "App_status_disabled": "उपयोग करने की अनुमति नहीं है", + "App_status_manually_enabled": "सक्रिय", + "Appearance": "दिखावट", + "Audio_Notifications_Default_Alert": "ऑडियो सूचनाएं डिफ़ॉल्ट चेतावनी", + "Cancel": "रद्द करना", + "Cancel_message_input": "रद्द करना", + "CAS_enabled": "सक्रिय", + "Client_Secret": "क्लाइंट Secret", + "Close_menu": "मेनू बंद करें", + "Custom": "कस्टम", + "Desktop_Notifications_Default_Alert": "डेस्कटॉप सूचनाएं डिफ़ॉल्ट चेतावनी", + "Disabled": "उपयोग करने की अनुमति नहीं है", + "Edit_Status": "स्थिति संपादित करें", + "Email_Notification_Mode_Disabled": "उपयोग करने की अनुमति नहीं है", + "Enable": "सक्षम करें", + "Enabled": "सक्रिय", + "Federation_Matrix_enabled": "सक्रिय", + "Filters": "फिल्टर", + "Home": "होम", + "How_friendly_was_the_chat_agent": "चैट एजेंट कितना दोस्ताना था?", + "How_knowledgeable_was_the_chat_agent": "चैट एजेंट कितना जानकार था?", + "How_responsive_was_the_chat_agent": "चैट एजेंट कितना उत्तरदायी था?", + "How_satisfied_were_you_with_this_chat": "आप इस चैट से कितने संतुष्ट थे?", + "Installation": "स्थापना", + "LDAP_Authentication": "सक्षम करें", + "LDAP_Enable": "सक्षम करें", + "LDAP_User_Search_Scope": "क्षेत्र", + "Livechat_registration_form": "पंजीकरण ", + "Mobile_Push_Notifications_Default_Alert": "मोबाइल सूचनाएं डिफ़ॉल्ट चेतावनी", + "New_messages": "नए संदेश", + "No": "नहीं", + "Options": "विकल्प", + "Outlook_Calendar_Enabled": "सक्रिय", + "Please_answer_survey": "कृपया इस चैट के बारे में त्वरित सर्वेक्षण का उत्तर देने के लिए एक क्षण लें", + "Please_fill_name_and_email": "कृपया नाम और ईमेल भरें", + "Public": "जनता", + "Push_enable": "सक्षम करें", + "Scope": "क्षेत्र", + "Select_a_department": "एक विभाग का चयन करें", + "Select_department": "एक विभाग का चयन करें", + "Send": "भेजना", + "Skip": "छोड़ें", + "Start_Chat": "बातचीत शुरू ", + "Survey": "सर्वेक्षण", + "Survey_instructions": "प्रत्येक प्रश्न को अपनी संतुष्टि के अनुसार रेट करें, 1 मतलब कि आप पूरी तरह से असंतुष्ट हैं और 5 का अर्थ है कि आप पूरी तरह से संतुष्ट हैं।", + "Thank_you_for_your_feedback": "आपकी प्रतिक्रिया के लिए आपका धन्यवाद", + "Type_your_email": "अपना ईमेल टाइप करें", + "Type_your_message": "अपना संदेश टाइप करें", + "Type_your_name": "अपना नाम लिखें", + "Upload_file_question": "दस्तावेज अपलोड करें?", + "User_left": "उपयोगकर्ता छोड़ दिया", + "We_are_offline_Sorry_for_the_inconvenience": "हम ऑफ़लाइन हैं। असुविधा के लिए खेद है।", + "Yes": "हाँ", + "You": "आप" +} \ No newline at end of file diff --git a/packages/i18n/src/locales/hi.i18n.json b/packages/i18n/src/locales/hi.i18n.json index c8d21e6638fc5..25ab23420654e 100644 --- a/packages/i18n/src/locales/hi.i18n.json +++ b/packages/i18n/src/locales/hi.i18n.json @@ -176,6 +176,7 @@ "Email_Notification_Mode_Disabled": "उपयोग करने की अनुमति नहीं है", "Enable": "सक्षम करें", "Enabled": "सक्रिय", + "Federation_Matrix_enabled": "सक्रिय", "Filters": "फिल्टर", "Home": "होम", "How_friendly_was_the_chat_agent": "चैट एजेंट कितना दोस्ताना था?", @@ -191,6 +192,7 @@ "New_messages": "नए संदेश", "No": "नहीं", "Options": "विकल्प", + "Outlook_Calendar_Enabled": "सक्रिय", "Please_answer_survey": "कृपया इस चैट के बारे में त्वरित सर्वेक्षण का उत्तर देने के लिए एक क्षण लें", "Please_fill_name_and_email": "कृपया नाम और ईमेल भरें", "Public": "जनता", diff --git a/packages/i18n/src/locales/hr.i18n.json b/packages/i18n/src/locales/hr.i18n.json index 4933ef5f94f9f..5f3f16e6ed672 100644 --- a/packages/i18n/src/locales/hr.i18n.json +++ b/packages/i18n/src/locales/hr.i18n.json @@ -354,6 +354,7 @@ "Apply": "primijeniti", "Apply_and_refresh_all_clients": "Primjeni i osvježi sve klijente", "Apps": "Apps", + "Apps_context_premium": "Poduzeće", "Apps_Engine_Version": "Verzija Apps Enginea", "Apps_Settings": "Postavke aplikacije", "AutoLinker": "AutoLinker", @@ -1230,6 +1231,7 @@ "FEDERATION_Domain": "Domena", "FEDERATION_Status": "Status", "Retry_Count": "Ponovite račun", + "Federation_Matrix_enabled": "Omogućeno", "Field": "Polje", "Field_removed": "Polje je uklonjeno", "Field_required": "Polje je obavezno", @@ -1590,6 +1592,10 @@ "Layout_Terms_of_Service": "Uvjeti pružanja usluge", "LDAP": "LDAP", "LDAP_Description": "LDAP je hijerarhijska baza podataka koja mnoge tvrtke koriste za pružanje jedinstvene prijave - usluge za dijeljenje jedne lozinke između više web-mjesta i usluga. Za napredne podatke o konfiguraciji i primjere, obratite se našem wiki: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "Šifriranje", + "LDAP_DataSync_BackgroundSync": "Sinkronizacija pozadine", + "LDAP_Server_Type": "Vrsta poslužitelja", + "LDAP_Server_Type_Other": "Ostalo", "LDAP_Authentication": "Omogućiti", "LDAP_Authentication_Password": "Lozinka", "LDAP_Authentication_UserDN": "Korisnički DN", @@ -2800,6 +2806,8 @@ "Visitor_Navigation": "Navigacija Posjetitelja", "Visitor_page_URL": "URL stranice posjetitelja", "Visitor_time_on_site": "Vrijeme posjetitelja na stranici", + "VoIP_Management_Server_Username": "Korisničko ime", + "VoIP_Management_Server_Password": "Lozinka", "Wait_activation_warning": "Prije nego što se prijavite, vaš račun mora ručno aktivirati administrator.", "Warnings": "Upozorenja", "We_are_offline_Sorry_for_the_inconvenience": "Mi smo izvan mreže. Oprostite na neugodnosti.", @@ -2884,6 +2892,7 @@ "registration.component.form.emailOrUsername": "Email or username", "registration.component.form.username": "Korisničko ime", "registration.component.form.name": "Ime", + "registration.component.form.userAlreadyExist": "Korisničko ime već postoji. Pokušajte s drugim korisničkim imenom.", "registration.component.form.emailAlreadyExists": "Email već postoji", "registration.component.form.usernameAlreadyExists": "Korisničko ime već postoji. Pokušajte s drugim korisničkim imenom.", "registration.component.form.invalidEmail": "Uneseni e-mail nije valjan", diff --git a/packages/i18n/src/locales/hu.i18n.json b/packages/i18n/src/locales/hu.i18n.json index 5d724f8d69f93..69afdb75f2330 100644 --- a/packages/i18n/src/locales/hu.i18n.json +++ b/packages/i18n/src/locales/hu.i18n.json @@ -490,6 +490,7 @@ "Apply_and_refresh_all_clients": "Alkalmaz és minden ügyfél frissítése", "Apps": "Alkalmazások", "Apps_context_installed": "Telepítve", + "Apps_context_premium": "Vállalati", "Apps_Engine_Version": "Alkalmazások motorjának verziója", "Apps_Essential_Alert": "Ez az alkalmazás elengedhetetlen a következő eseményekhez:", "Apps_Essential_Disclaimer": "A fent felsorolt események megszakadnak, ha ez az alkalmazás le van tiltva. Ha azt szeretné, hogy a Rocket.Chat ezen alkalmazás funkciói nélkül is működjön, akkor el kell távolítania azt.", @@ -3687,6 +3688,7 @@ "Privacy_summary": "Adatvédelem összegzése", "Private": "Személyes", "private": "személyes", + "Private_channels": "Személyes csatornák", "Private_Channel": "Személyes csatorna", "Private_Channels": "Személyes csatornák", "Private_Chats": "Személyes csevegések", @@ -5307,6 +5309,7 @@ "Your_workspace_is_ready": "A munkaterülete használatra kész 🎉", "Zapier": "Zapier", "registration.page.login.errors.wrongCredentials": "A felhasználó nem található vagy hibás a jelszó", + "registration.page.login.errors.invalidEmail": "Érvénytelen e-mail-cím", "registration.page.login.errors.loginBlockedForIp": "A bejelentkezés átmenetileg tiltva lett ennél az IP-címnél", "registration.page.login.errors.loginBlockedForUser": "A bejelentkezés átmenetileg tiltva lett ennél a felhasználónál", "registration.page.login.errors.licenseUserLimitReached": "A felhasználók legnagyobb száma el lett érve.", @@ -5330,6 +5333,8 @@ "registration.component.form.emailOrUsername": "E-mail-cím vagy felhasználónév", "registration.component.form.username": "Felhasználónév", "registration.component.form.name": "Név", + "registration.component.form.createAnAccount": "Fiók létrehozása", + "registration.component.form.userAlreadyExist": "A felhasználónév már létezik. Próbáljon más felhasználónevet.", "registration.component.form.emailAlreadyExists": "Az e-mail cím már létezik", "registration.component.form.usernameAlreadyExists": "Felhasználónév már létezik. Próbálj meg egy másik felhasználónevet.", "registration.component.form.invalidEmail": "Érvénytelen email cím", @@ -5339,9 +5344,11 @@ "registration.component.form.divider": "vagy", "registration.component.form.submit": "Elküldés", "registration.component.form.requiredField": "Ez a mező kötelező", + "registration.component.form.joinYourTeam": "Csatlakozás csapathoz", "registration.component.form.reasonToJoin": "A csatlakozás oka", "registration.component.form.invalidConfirmPass": "A két jelszó nem eggyezik", "registration.component.form.confirmPassword": "Erősítse meg a jelszavát", + "registration.component.form.confirmation": "Megerősítés", "registration.component.form.sendConfirmationEmail": "Megerősítő email elküldése", "onboarding.component.form.requiredField": "Ez a mező kötelező", "onboarding.component.form.steps": "{{currentStep}} / {{stepCount}} lépés", @@ -5402,6 +5409,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Kiválasztás", "onboarding.form.organizationInfoForm.fields.country.label": "Ország", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Kiválasztás", + "onboarding.form.registerOfflineForm.title": "Kapcsolat nélküli regisztráció", "onboarding.form.registeredServerForm.title": "Kiszolgáló regisztrálása", "onboarding.form.registeredServerForm.included.push": "Mobil leküldéses értesítések", "onboarding.form.registeredServerForm.included.externalProviders": "Integráció külső szolgáltatókkal (WhatsApp, Facebook, Telegram, Twitter)", @@ -5419,7 +5427,11 @@ "Theme_dark": "Sötét", "Join_your_team": "Csatlakozás csapathoz", "Create_an_account": "Fiók létrehozása", + "Awaiting_confirmation": "Megerősítésre vár", + "RegisterWorkspace_Features_MobileNotifications_Title": "Mobil leküldéses értesítések", "RegisterWorkspace_Features_Marketplace_Title": "Piactér", + "RegisterWorkspace_Features_Omnichannel_Title": "Összcsatorna", + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Elfogadom a <1>használati feltételeket és az <3>adatvédelmi irányelveket", "Enterprise": "Vállalati", "UpgradeToGetMore_engagement-dashboard_Title": "Analitika", "UpgradeToGetMore_auditing_Title": "Üzenet ellenőrzés" diff --git a/packages/i18n/src/locales/id.i18n.json b/packages/i18n/src/locales/id.i18n.json index 9c078112ecbcd..db105e17538e2 100644 --- a/packages/i18n/src/locales/id.i18n.json +++ b/packages/i18n/src/locales/id.i18n.json @@ -320,6 +320,7 @@ "Apply": "Menerapkan", "Apply_and_refresh_all_clients": "Berlaku dan menyegarkan semua klien", "Apps": "Aplikasi", + "Apps_context_premium": "Perusahaan", "Apps_Settings": "Setelan Aplikasi", "Apps_WhatIsIt": "Aplikasi: Apakah Mereka?", "Apps_WhatIsIt_paragraph1": "Ikon baru di area administrasi! Apa artinya ini dan apa itu Apps?", @@ -490,6 +491,7 @@ "Confirm_New_Password_Placeholder": "Silakan masukkan kembali kata sandi baru ...", "Confirm_password": "Konfirmasikan kata sandi anda", "Confirm_your_password": "Konfirmasikan kata sandi anda", + "Connected": "Terhubung", "Connection_Closed": "Koneksi ditutup", "Connection_Reset": "Koneksi diatur ulang", "Consulting": "Konsultasi", @@ -1099,6 +1101,7 @@ "FEDERATION_Domain": "Domain", "FEDERATION_Status": "Status", "Retry_Count": "Coba lagi", + "Federation_Matrix_enabled": "Diaktifkan", "Field": "Bidang", "Field_removed": "bidang dihapus", "Field_required": "Bidang yang dibutuhkan", @@ -1457,6 +1460,10 @@ "Layout_Terms_of_Service": "Kebijakan Layanan", "LDAP": "LDAP", "LDAP_Description": "LDAP adalah basis data hirarki yang banyak digunakan perusahaan untuk menyediakan fasilitas single sing on untuk berbagi satu kata sandi diantara beberapa situs dan services. Untuk informasi dan contoh konfigurasi lebih lanjut, silahkan berkonsultasi di wiki kami: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "enkripsi", + "LDAP_DataSync_BackgroundSync": "Sinkronisasi Latar Belakang", + "LDAP_Server_Type": "Tipe Server", + "LDAP_Server_Type_Other": "Lain", "LDAP_Authentication": "Memungkinkan", "LDAP_Authentication_Password": "Kata sandi", "LDAP_Authentication_UserDN": "Pengguna DN", @@ -2672,6 +2679,8 @@ "Visitor_Navigation": "Navigasi pengunjung", "Visitor_page_URL": "URL halaman Pengunjung", "Visitor_time_on_site": "waktu pengunjung di situs", + "VoIP_Management_Server_Username": "Nama pengguna", + "VoIP_Management_Server_Password": "Kata sandi", "Wait_activation_warning": "Akun anda harus terlebih dahulu diaktifkan secara manual oleh seorang administrator untuk dapat melakukan login.", "Warnings": "Peringatan", "We_are_offline_Sorry_for_the_inconvenience": "Kami sedang offline. Maaf untuk ketidaknyamanannya.", @@ -2756,6 +2765,7 @@ "registration.component.form.emailOrUsername": "Email atau username", "registration.component.form.username": "Nama pengguna", "registration.component.form.name": "Nama", + "registration.component.form.userAlreadyExist": "Nama pengguna sudah ada. Silakan coba nama pengguna lain", "registration.component.form.emailAlreadyExists": "Email sudah terdaftar", "registration.component.form.usernameAlreadyExists": "Nama pengguna sudah ada. Silakan coba nama pengguna lain", "registration.component.form.invalidEmail": "Email yang anda masukkan tidak valid", diff --git a/packages/i18n/src/locales/it.i18n.json b/packages/i18n/src/locales/it.i18n.json index 737acbf3b847f..79dcaded9d78e 100644 --- a/packages/i18n/src/locales/it.i18n.json +++ b/packages/i18n/src/locales/it.i18n.json @@ -13,8 +13,8 @@ "__usersCount__member_joined_other": "+ {{count}} membri si sono uniti", "__usersCount__people_will_be_invited": "{{usersCount}} persone saranno invitate", "__username__is_no_longer__role__defined_by__user_by_": "{{username}} non è più {{role}}, da {{user_by}}", - "__usersCount__member_joined_many": "+ {{count}} membri si sono uniti", "__username__was_set__role__by__user_by_": "A {{username}} è stato assegnato il ruolo di {{role}} da {{user_by}}", + "__usersCount__member_joined_many": "+ {{count}} membri si sono uniti", "__count__without__department__": "{{count}} senza reparto", "__count__without__tags__": "{{count}} senza tag", "__count__without__assignee__": "{{count}} non assegnate", @@ -320,7 +320,9 @@ "Allow_Invalid_SelfSigned_Certs": "Consenti i certificati SSL auto-firmati", "Allow_Invalid_SelfSigned_Certs_Description": "Consenti l'uso di certificati SSL non validi e auto-firmati per la validazione dei link e le anteprime.", "Allow_Marketing_Emails": "Consenti email di marketing", + "Apps_Count_Enabled_many": "{{count}} app abilitate", "Allow_switching_departments": "Consenti ai visitatori di cambiare dipartimento", + "Private_Apps_Count_Enabled_many": "{{count}} applicazioni private abilitate", "Almost_done": "Quasi fatto", "Alphabetical": "Alfabetico", "bold": "grassetto", @@ -411,10 +413,8 @@ "Apps_context_premium": "Premium", "Apps_Count_Enabled_one": "{{count}} app abilitate", "Apps_Count_Enabled_other": "{{count}} app abilitate", - "Apps_Count_Enabled_many": "{{count}} app abilitate", "Private_Apps_Count_Enabled_one": "{{count}} applicazione private abilitate", "Private_Apps_Count_Enabled_other": "{{count}} applicazioni private abilitate", - "Private_Apps_Count_Enabled_many": "{{count}} applicazioni private abilitate", "Apps_Count_Enabled_tooltip": "Gli spazi di lavoro comunitari possono abilitare fino a {{number}} applicazioni {{context}}", "Apps_disabled_when_Premium_trial_ended": "App disabilitate al termine della prova del piano Premium", "Apps_Game_Center": "Game Center", @@ -1322,6 +1322,7 @@ "error-failed-to-delete-department": "Eliminazione del reparto fallita", "error-field-unavailable": "{{field}} è già in uso :(", "error-file-too-large": "Il file è troppo grande", + "meteor_status_reconnect_in_many": "riprovo tra {{count}} secondi...", "error-importer-not-defined": "L'importatore non è stato definito correttamente, manca la classe di importazione.", "error-input-is-not-a-valid-field": "{{input}} non è una valido {{field}}", "error-invalid-actionlink": "Link d'azione non valido", @@ -1453,6 +1454,7 @@ "FEDERATION_Public_Key": "Chiave pubblica", "FEDERATION_Status": "Stato", "Retry_Count": "Conteggio tentativi", + "Federation_Matrix_enabled": "Abilitato", "Field": "Campo", "Field_removed": "Campo rimosso", "Field_required": "Campo richiesto", @@ -1568,7 +1570,6 @@ "get-password-policy-mustContainAtLeastOneUppercase-label": "Almeno una lettera maiuscola", "get-password-policy-mustContainAtLeastOneNumber-label": "Almeno un numero", "get-password-policy-mustContainAtLeastOneSpecialCharacter-label": "Almeno un simbolo", - "meteor_status_reconnect_in_many": "riprovo tra {{count}} secondi...", "github_no_public_email": "Non hai un email publica sul tuo account GitHub", "github_HEAD": "HEAD", "Give_a_unique_name_for_the_custom_oauth": "Dai un nome univoco per l'OAuth personalizzato", @@ -1803,6 +1804,7 @@ "Invite_user_to_join_channel_all_from": "Invita tutti gli utenti da [#channell] per unirsi a questo canale", "Invite_user_to_join_channel_all_to": "Invita tutti gli utenti di questo canale a unirsi [#channel]", "Invite_Users": "Invita utenti", + "IP": "IP", "IP_Address": "Indirizzo IP", "IRC_Channel_Join": "Output del comando JOIN", "IRC_Channel_Leave": "Output del comando PART", @@ -1918,7 +1920,10 @@ "LDAP_DataSync_Avatar": "Avatar", "LDAP_DataSync_Advanced": "Sincronizzazione avanzata", "LDAP_Enterprise": "Premium", + "LDAP_DataSync_BackgroundSync": "Sincronizzazione di sfondo", + "LDAP_Server_Type": "Tipo di server", "LDAP_Server_Type_Other": "Altro", + "LDAP_Advanced_Sync": "Sincronizzazione avanzata", "LDAP_Authentication": "Permettere", "LDAP_Authentication_Password": "Password", "LDAP_Authentication_UserDN": "DN utente", @@ -2290,6 +2295,7 @@ "Normal": "Normale", "Not_Available": "Non disponibile", "Not_found_or_not_allowed": "Non trovato o Non Permesso", + "Not_started": "Non iniziato/a", "Not_Visible_To_Workspace": "Non visibile nell'area di lavoro", "Nothing": "Niente", "Nothing_found": "Non abbiamo trovato nulla", @@ -2353,6 +2359,7 @@ "Organization_Name": "Nome dell'organizzazione", "Organization_Type": "Tipo di Organizzazione", "Original": "Originale", + "OS": "OS", "OS_Arch": "Architettura", "OS_Cpus": "Numero CPU", "OS_Freemem": "Memoria Libera", @@ -2599,6 +2606,7 @@ "RetentionPolicyRoom_OverrideGlobal": "Sostituisci la politica di conservazione globale", "RetentionPolicyRoom_ReadTheDocs": "Attenzione! Modificare queste impostazioni senza la massima cura può causare la distruzzione di tutta la cronologia dei messaggi. Leggere la documentazione qui prima di attivare la funzione.", "Role": "Ruolo", + "Roles": "Ruoli", "Role_Editing": "Ruolo Editing", "Role_removed": "Ruolo rimosso", "Room": "Canale", @@ -2657,6 +2665,7 @@ "SAML_Custom_user_data_fieldmap": "Campo Utente Dati Mappa", "SAML_Section_1_User_Interface": "Interfaccia utente", "SAML_Section_4_Roles": "Ruoli", + "SAML_Section_5_Mapping": "Mappatura", "Saturday": "Sabato", "Save": "Salva", "Save_changes": "Salva le modifiche", @@ -2981,6 +2990,7 @@ "Threads": "Thread", "Thursday": "Giovedì", "Time_in_seconds": "Tempo in secondi", + "Timeouts": "Timeout", "Timezone": "Fuso orario", "Title": "Titolo", "Title_bar_color": "Colore della Barra del Titolo", @@ -3097,6 +3107,7 @@ "Use_User_Preferences_or_Global_Settings": "Usa le Preferenze Utente o Globali", "User": "Utente", "User_menu": "Menu utente", + "User Search": "Ricerca utente", "User__username__is_now_a_leader_of__room_name_": "L'utente {{username}} è ora un leader di {{room_name}}", "User__username__is_now_a_moderator_of__room_name_": "L'Utente {{username}} è ora un moderatore di {{room_name}}", "User__username__is_now_an_owner_of__room_name_": "L'Utente {{username}} è ora proprietario di {{room_name}}", @@ -3251,6 +3262,8 @@ "Visitor_Navigation": "Navigazione Visitatori", "Visitor_page_URL": "URL Pagina Visitatori", "Visitor_time_on_site": "Tempo dei visitatori sul sito", + "VoIP_Management_Server_Username": "Nome utente", + "VoIP_Management_Server_Password": "Password", "Wait_activation_warning": "Prima di poter effettuare il login, il tuo account deve essere attivato manualmente da un amministratore.", "Warnings": "Avvisi", "We_are_offline_Sorry_for_the_inconvenience": "Non siamo in linea. Ci dispiace per l'inconveniente.", @@ -3335,6 +3348,7 @@ "Your_server_link": "Il tuo collegamento al server", "Your_workspace_is_ready": "Il tuo spazio di lavoro è pronto per l'uso 🎉", "registration.page.login.errors.wrongCredentials": "Utente non trovato o password sbagliata", + "registration.page.login.errors.AppUserNotAllowedToLogin": "Gli utenti dell'app non possono accedere direttamente.", "registration.page.registration.waitActivationWarning": "Prima di poter effettuare il login, il tuo account deve essere attivato manualmente da un amministratore.", "registration.page.login.forgot": "Password dimenticata", "registration.page.resetPassword.sent": "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.", @@ -3347,6 +3361,7 @@ "registration.component.form.emailOrUsername": "Email o nome utente", "registration.component.form.username": "Nome utente", "registration.component.form.name": "Nome", + "registration.component.form.userAlreadyExist": "Il nome utente esiste già. Si prega di provare un altro nome utente.", "registration.component.form.emailAlreadyExists": "Email già esistente", "registration.component.form.usernameAlreadyExists": "Il nome utente esiste già. Si prega di provare un altro nome utente.", "registration.component.form.invalidEmail": "L'email inserita non è valida", @@ -3359,6 +3374,7 @@ "registration.component.form.invalidConfirmPass": "La password di conferma non corrisponde con la password", "registration.component.form.confirmPassword": "Conferma la tua password", "registration.component.form.sendConfirmationEmail": "Invia email di conferma", + "onboarding.form.awaitConfirmationForm.content.securityCode": "Codice di sicurezza", "subscription.callout.allPremiumCapabilitiesDisabled": "Tutte le funzionalità premium disattivate", "subscription.callout.privateApps": "applicazioni private installate", "subscription.callout.marketplaceApps": "applicazioni del marketplace installate", @@ -3384,6 +3400,7 @@ "RegisterWorkspace_Features_ThirdPartyLogin_Disconnect": "Le opzioni di login di terze parti non saranno più disponibili.", "RegisterWorkspace_Syncing_Complete": "Sincronizzazione completata", "RegisterWorkspace_Connection_Error": "Si è verificato un errore di connessione", + "Premium": "Premium", "Enterprise": "impresa", "Operating_withing_plan_limits": "Attualmente entro i limiti del piano attivo", "Workspace_not_registered": "Spazio di lavoro non registrato", diff --git a/packages/i18n/src/locales/ja.i18n.json b/packages/i18n/src/locales/ja.i18n.json index 4aca5b5dec578..2e50c926f7bbc 100644 --- a/packages/i18n/src/locales/ja.i18n.json +++ b/packages/i18n/src/locales/ja.i18n.json @@ -449,6 +449,7 @@ "Apply_and_refresh_all_clients": "すべてのクライアントを適用して更新", "Apps": "アプリ", "Apps_context_installed": "インストール済み", + "Apps_context_premium": "エンタープライズ", "Apps_Engine_Version": "アプリエンジンのバージョン", "Apps_Essential_Alert": "このアプリは次のイベントに不可欠です:", "Apps_Essential_Disclaimer": "このアプリが無効になっていると、上記のイベントが中断されます。このアプリの機能を使用せずにRocket.Chatを動作させたい場合は、アンインストールする必要があります。", @@ -1362,6 +1363,7 @@ "Desktop_Notifications_Not_Enabled": "デスクトップ通知が有効ではありません", "Details": "詳細", "line": "ライン", + "Device_Management_IP": "IP", "Different_Style_For_User_Mentions": "ユーザーメンションには異なるスタイル", "Livechat_Facebook_API_Key": "オムニChannelAPIキー", "Livechat_Facebook_API_Secret": "オムニChannelAPIシークレット", @@ -1846,6 +1848,7 @@ "FEDERATION_Test_Setup_Error": "設定を使用しているサーバーが見つかりませんでした。設定を確認してください。", "FEDERATION_Test_Setup_Success": "フェデレーション設定は正常に機能しており、他のサーバーがあなたを見つけることができます!", "Retry_Count": "再試行回数", + "Federation_Matrix_enabled": "有効", "Field": "フィールド", "Field_removed": "フィールドが削除されました", "Field_required": "必要なフィールド", @@ -3308,6 +3311,7 @@ "Privacy": "プライバシー", "Privacy_Policy": "プライバシーポリシー", "Private": "プライベート", + "Private_channels": "プライベートChannel", "Private_Channel": "プライベートChannel", "Private_Channels": "プライベートChannel", "Private_Chats": "プライベートチャット", @@ -3543,6 +3547,7 @@ "Unsafe_Url": "安全でないURL", "Rocket_Chat_Alert": "Rocket.Chatアラート", "Role": "ロール", + "Roles": "ロール", "Role_Editing": "ロールの編集", "Role_Mapping": "ロールマッピング", "Role_removed": "ロールを削除しました", @@ -4738,6 +4743,7 @@ "registration.component.form.emailOrUsername": "メールアドレスまたはユーザー名", "registration.component.form.username": "ユーザー名", "registration.component.form.name": "名前", + "registration.component.form.userAlreadyExist": "ユーザー名はすでに存在します。別のユーザー名をお試しください。", "registration.component.form.emailAlreadyExists": "メールはすでに存在します", "registration.component.form.usernameAlreadyExists": "ユーザー名はすでに存在します。別のユーザー名をお試しください。", "registration.component.form.invalidEmail": "入力されたメールアドレスは無効です", diff --git a/packages/i18n/src/locales/ka-GE.i18n.json b/packages/i18n/src/locales/ka-GE.i18n.json index 5b775db06eb66..7fab42bd2f143 100644 --- a/packages/i18n/src/locales/ka-GE.i18n.json +++ b/packages/i18n/src/locales/ka-GE.i18n.json @@ -694,6 +694,7 @@ "Confirm_password": "დაადასტურეთ თქვენი პაროლი", "Confirm_your_password": "დაადასტურეთ თქვენი პაროლი", "Connect": "დაკავშირება", + "Connected": "დაკავშირებულია", "Connection_Closed": "კავშირი დაიხურა", "Connection_Reset": "კავშირის გადატვირთვა", "Connectivity_Services": "დაკავშირების სერვისები", @@ -1495,6 +1496,7 @@ "FEDERATION_Test_Setup_Error": "ვერ ვიპოვნეთ თქვენი სერვერი თქვენი კონფიგურაციის გამოყენებით, გადახედეთ თქვენს პარამეტრებს.", "FEDERATION_Test_Setup_Success": "თქვენი ფედერაციის კონფიგურაცია მუშაობს და სხვა სერვერებს შეუძლიათ თქვენი პოვნა", "Retry_Count": "ხელახლა დათვლა", + "Federation_Matrix_enabled": "ჩართული", "Field": "ველი", "Field_removed": "ველი ამოღებულია", "Field_required": "ველი მოითხოვება", @@ -1952,6 +1954,13 @@ "Layout_Terms_of_Service": "მომსახურების პირობები", "LDAP": "LDAP", "LDAP_Description": "LDAP არის იერარქიული მონაცემთა ბაზა, რომელსაც მრავალი კომპანია იყენებს ერთი ავტორიზაციის შესაქმნელად - ერთი პაროლი სხვადასხვა მომსახურება და საიტებისთვის. კონფიგურაციის შესახებ ინფორმაციის და მაგალითებისთვის მიმართეთ ჩვენს ვიკებს: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "დაშიფვრა", + "LDAP_Connection_Timeouts": "თაიმაუტები", + "LDAP_UserSearch": "მომხმარებლის ძებნა", + "LDAP_DataSync_Advanced": "დამატებითი სინქრონიზაცია", + "LDAP_DataSync_BackgroundSync": "ფონის სინქრონიზაცია", + "LDAP_Server_Type": "სერვერის ტიპი", + "LDAP_Server_Type_Other": "სხვა", "LDAP_Advanced_Sync": "დამატებითი სინქრონიზაცია", "LDAP_Authentication": "ჩართვა", "LDAP_Authentication_Password": "პაროლი", @@ -2632,6 +2641,7 @@ "Privacy": "კონფიდენციალურობა", "Privacy_Policy": "კონფიდენციალურობის წესები", "Private": "პირადი", + "Private_channels": "პირადი არხები", "Private_Channel": "პირადი არხი", "Private_Channels": "პირადი არხები", "Private_Chats": "პირადი ჩეთები", @@ -3333,6 +3343,7 @@ "UI_Use_Name_Avatar": "სახელის სრული ინიციალების გამოყენება ავატარის გენერაციისთვის", "UI_Use_Real_Name": "გამოიყენეთ ნამდვილი სახელი", "unable-to-get-file": "ფაილის მიღება შეუძლებელია", + "unauthorized": "არაა უფლებამოსილი", "Unavailable": "მიუწვდომელია", "Unblock_User": "მომხმარებლის განბლოკვა", "Uncheck_All": "ყველა მონიშვნის მოხსნა", @@ -3558,6 +3569,8 @@ "Visitor_Navigation": "ვიზიტორთა ნავიგაცია", "Visitor_page_URL": "ვიზიტორის გვერდის URL", "Visitor_time_on_site": "ვიზიტის დრო საიტზე", + "VoIP_Management_Server_Username": "მომხმარებლის სახელი", + "VoIP_Management_Server_Password": "პაროლი", "Wait_activation_warning": "სანამ შეხვალთ, თქვენი ანგარიში ხელით უნდა გააქტიურდეს ადმინისტრატორის მიერ.", "Waiting_queue": "რიგის მოლოდინში", "Waiting_queue_message": "რიგის შეტყობინების მოლოდინი", @@ -3644,6 +3657,7 @@ "Your_server_link": "თქვენი სერვერის მისამართი", "Your_temporary_password_is_password": "თქვენი დროებითი პაროლია არის [password]", "Your_workspace_is_ready": "თქვენი სამუშაო გარემო მზად არის სამუშაოდ 🎉", + "registration.page.login.errors.wrongCredentials": "მომხმარებელი ვერ მოიძებნა ან პაროლია არასწორი ", "registration.page.login.errors.AppUserNotAllowedToLogin": "აპლიკაციის მომხამრებლებს არ აქვთ უფლება პირდაპირ შემოვიდნენ", "registration.page.registration.waitActivationWarning": "სანამ შეხვალთ, თქვენი ანგარიში ხელით უნდა გააქტიურდეს ადმინისტრატორის მიერ.", "registration.page.login.forgot": "დაგავიწყდათ პაროლი?", @@ -3654,6 +3668,7 @@ "registration.component.form.emailOrUsername": "ელ.ფოსტის ან მომხმარებლის სახელი", "registration.component.form.username": "მომხმარებლის სახელი", "registration.component.form.name": "სახელი", + "registration.component.form.userAlreadyExist": "სახელი უკვე არსებობს. გთხოვთ, სცადოთ სხვა სახელი.", "registration.component.form.emailAlreadyExists": "იმეილი უკვე არსებობს", "registration.component.form.usernameAlreadyExists": "სახელი უკვე არსებობს. გთხოვთ, სცადოთ სხვა სახელი.", "registration.component.form.invalidEmail": "შეყვანილი ელ.ფოსტა არასწორია", diff --git a/packages/i18n/src/locales/km.i18n.json b/packages/i18n/src/locales/km.i18n.json index fcaf5e71b14a8..116fbfc12d6a9 100644 --- a/packages/i18n/src/locales/km.i18n.json +++ b/packages/i18n/src/locales/km.i18n.json @@ -383,6 +383,7 @@ "Apply": "អនុវត្ត", "Apply_and_refresh_all_clients": "អនុវត្តនិងធ្វើឱ្យអតិថិជនទាំងអស់", "Apps": "កម្មវិធី", + "Apps_context_premium": "សហគ្រាស", "Apps_Engine_Version": "កំណែកម្មវិធីម៉ាស៊ីន", "Apps_Marketplace_Deactivate_App_Prompt": "តើអ្នកពិតជាចង់បិទកម្មវិធីនេះមែនទេ?", "Apps_Marketplace_Login_Required_Description": "ការទិញកម្មវិធីពីផ្សាររ៉ក់ខេត។ តំរូវអោយចុះឈ្មោះកន្លែងធ្វើការរបស់អ្នកហើយចូល។", @@ -1341,6 +1342,7 @@ "FEDERATION_Domain": "ដែន", "FEDERATION_Status": "ស្ថានភាព", "Retry_Count": "ព្យាយាមរាប់ឡើងវិញ", + "Federation_Matrix_enabled": "បានបើក", "Field": "វាល", "Field_removed": "វាលបានយកចេញ", "Field_required": "ត្រូវការវាល", @@ -1732,6 +1734,12 @@ "Layout_Sidenav_Footer_Dark_description": "​ទំហំ​បាន​គឺ 260x70", "Layout_Terms_of_Service": "ល័ក្ខខ័ណ្ឌ​នៃ​សេវាកម្ម", "LDAP": "ប្រើ LDAP", + "LDAP_Connection_Encryption": "ការអ៊ីនគ្រីប", + "LDAP_Connection_Timeouts": "អស់ពេល", + "LDAP_UserSearch": "ស្វែងរកអ្នកប្រើ", + "LDAP_DataSync_BackgroundSync": "ធ្វើសមកាលកម្មផ្ទៃខាងក្រោយ", + "LDAP_Server_Type": "ប្រភេទម៉ាស៊ីនបម្រើ", + "LDAP_Server_Type_Other": "ផ្សេងទៀត", "LDAP_Authentication": "អនុញ្ញាត", "LDAP_Authentication_Password": "ពាក្យសម្ងាត់", "LDAP_Authentication_UserDN": "អ្នកប្រើ DN", @@ -2301,6 +2309,7 @@ "Reactions": "ប្រតិកម្ម", "Read_by": "អានដោយ", "Read_only": "អាច​បាន​តែ​អាន", + "This_room_is_read_only": "បន្ទប់នេះត្រូវបានអានតែប៉ុណ្ណោះ", "Read_only_changed_successfully": "បានតែអានបានប្ដូរដោយជោគជ័យ", "Read_only_channel": "អានតែឆានែល", "Read_only_group": "អានតែក្រុម", @@ -3014,6 +3023,8 @@ "Visitor_Navigation": "ចំនួនអ្នកទស្សនារុករក", "Visitor_page_URL": "URL របស់ទំព័រអ្នកទស្សនា", "Visitor_time_on_site": "ពេលដែលអ្នកទស្សនានៅលើគេហទំព័រ", + "VoIP_Management_Server_Username": "ឈ្មោះ​អ្នកប្រើប្រាស់", + "VoIP_Management_Server_Password": "ពាក្យសម្ងាត់", "Wait_activation_warning": "មុន​ពេល​ចូល​ប្រើប្រាស់​គណនី​អ្នក​ត្រូវ​តែ​ទទួល​បាន​ការ​អនុញ្ញាតិ​ពី​អ្នក​គ្រប់​គ្រង​ជាមុន​សិន​", "Warnings": "ការព្រមាន", "We_are_offline_Sorry_for_the_inconvenience": "យើងមាននៅក្រៅបណ្ដាញ។ សូមអភ័យទោសចំពោះការរំខាននេះ។", @@ -3102,6 +3113,8 @@ "registration.component.login.userNotFound": "រកមិនឃើញអ្នកប្រើ", "registration.component.resetPassword": "កំណត់​ពាក្យ​សម្ងាត់​ឡើងវិញ", "registration.component.form.username": "ឈ្មោះ​អ្នកប្រើប្រាស់", + "registration.component.form.name": "Name", + "registration.component.form.userAlreadyExist": "ឈ្មោះ​របស់​អ្នកប្រើប្រាស់​ធ្លាប់​មាន​ហើយ។ សូមសាកល្បងឈ្មោះអ្នកប្រើប្រាស់ផ្សេងទៀត។", "registration.component.form.emailAlreadyExists": "អ៊ី​ម៉ែ​ល​ដែល​មាន​រួច​ហើយ", "registration.component.form.usernameAlreadyExists": "ឈ្មោះ​របស់​អ្នកប្រើប្រាស់​ធ្លាប់​មាន​ហើយ។ សូមសាកល្បងឈ្មោះអ្នកប្រើប្រាស់ផ្សេងទៀត។", "registration.component.form.invalidEmail": "អ៊ី​មែល​ដែល​បញ្ចូល​មិន​ត្រឹម​ត្រូវ", diff --git a/packages/i18n/src/locales/ko.i18n.json b/packages/i18n/src/locales/ko.i18n.json index fe7eb9b0177df..468da203f883b 100644 --- a/packages/i18n/src/locales/ko.i18n.json +++ b/packages/i18n/src/locales/ko.i18n.json @@ -428,6 +428,7 @@ "Apply_and_refresh_all_clients": "적용하고 모든 클라이언트를 새로 고침", "Apps": "Apps", "Apps_context_installed": "설치됨", + "Apps_context_premium": "기업", "Apps_Engine_Version": "앱 엔진 버전", "Apps_Essential_Alert": "이 앱은 다음과 같은 이벤트에 필수적입니다.", "Apps_Essential_Disclaimer": "이 앱을 사용 중지하면 위에 나열된 이벤트가 중단됩니다. 이 앱의 기능없이 작동하려면 Rocket.Chat을 제거해야합니다.", @@ -793,6 +794,7 @@ "Confirm_password": "비밀번호를 확인하세요", "Confirm_your_password": "비밀번호를 확인하세요", "Connect": "연결", + "Connected": "연결됨", "Connection_Closed": "연결이 닫혔습니다.", "Connection_Reset": "연결 재설정", "Connectivity_Services": "연결 서비스", @@ -1630,6 +1632,7 @@ "FEDERATION_Test_Setup_Error": "설정을 사용하여 서버를 찾을 수 없습니다. 설정을 검토하십시오.", "FEDERATION_Test_Setup_Success": "Federation 설정이 작동중이고, 다른 서버에서도 찾을 수 있습니다!", "Retry_Count": "다시 시도 횟수", + "Federation_Matrix_enabled": "활성화", "Field": "필드", "Field_removed": "필드 지우기", "Field_required": "필요한 필드", @@ -2112,7 +2115,15 @@ "Layout_Sidenav_Footer_Dark_description": "바닥글 크기는 260x70 입니다.", "Layout_Terms_of_Service": "이용약관", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "암호화", "LDAP_Connection_successful": "LDAP 연결 성공", + "LDAP_Connection_Timeouts": "시간 초과", + "LDAP_UserSearch": "사용자 검색", + "LDAP_DataSync_DataMap": "매핑", + "LDAP_DataSync_Advanced": "고급 동기화", + "LDAP_DataSync_BackgroundSync": "백그라운드 동기화", + "LDAP_Server_Type": "서버 유형", + "LDAP_Server_Type_Other": "기타", "LDAP_Advanced_Sync": "고급 동기화", "LDAP_Authentication": "사용", "LDAP_Authentication_Password": "비밀번호", @@ -2854,6 +2865,7 @@ "Privacy": "개인정보", "Privacy_Policy": "개인정보취급방침", "Private": "비공개", + "Private_channels": "비공개 Channel", "Private_Channel": "비공개 대화방", "Private_Channels": "비공개 Channel", "Private_Chats": "비공개 대화", @@ -2923,6 +2935,7 @@ "Reactions": "반응", "Read_by": "읽기", "Read_only": "읽기 전용", + "This_room_is_read_only": "이 대화방은 읽기 전용입니다.", "Read_only_changed_successfully": "읽기 전용 변경 완료", "Read_only_channel": "읽기 전용 Channel", "Read_only_group": "읽기 전용 비공개 대화방", @@ -3047,6 +3060,7 @@ "Robot_Instructions_File_Content": "Robots.txt 파일 내용", "Rocket_Chat_Alert": "Rocket.Chat 알림", "Role": "역할", + "Roles": "역할", "Role_Editing": "역할 편집", "Role_Mapping": "역할 매핑", "Role_removed": "역할이 제거되었습니다.", @@ -3887,6 +3901,8 @@ "Visitor_Navigation": "방문자 탐색", "Visitor_page_URL": "방문자 페이지 URL", "Visitor_time_on_site": "방문자 체류 시간", + "VoIP_Management_Server_Username": "사용자명", + "VoIP_Management_Server_Password": "비밀번호", "Wait_activation_warning": "관리자가 계정을 수동으로 활성화시켜야 사용할 수 있습니다.", "Waiting_queue": "지연 대기열", "Waiting_queue_message": "지연 대기열 메시지", @@ -4009,6 +4025,7 @@ "registration.component.resetPassword": "비밀번호 초기화", "registration.component.form.username": "사용자명", "registration.component.form.name": "이름", + "registration.component.form.userAlreadyExist": "사용자명이 이미 존재합니다. 다른 사용자명을 입력해보세요.", "registration.component.form.emailAlreadyExists": "이메일이 이미 있습니다.", "registration.component.form.usernameAlreadyExists": "사용자명이 이미 존재합니다. 다른 사용자명을 입력해보세요.", "registration.component.form.invalidEmail": "입력한 이메일이 잘못되었습니다.", diff --git a/packages/i18n/src/locales/ku.i18n.json b/packages/i18n/src/locales/ku.i18n.json index b82aff287a0f2..b5b69caa01435 100644 --- a/packages/i18n/src/locales/ku.i18n.json +++ b/packages/i18n/src/locales/ku.i18n.json @@ -319,6 +319,7 @@ "Apply": "Bikaranîn", "Apply_and_refresh_all_clients": "Apply û refresh hemû mişterîyên", "Apps": "Apps", + "Apps_context_premium": "Enterprise", "Apps_Settings": "Mîhengên App App", "Apps_WhatIsIt": "Apps: Ew çi ye?", "Apps_WhatIsIt_paragraph1": "Mîhengek nû ya di rêveberiya îdarî de! Ev çi tê wateya û çi ye?", @@ -1096,6 +1097,7 @@ "FEDERATION_Domain": "Domain", "FEDERATION_Status": "Cî", "Retry_Count": "Vebijêrk", + "Federation_Matrix_enabled": "çalake", "Field": "Erd", "Field_removed": "meydanê", "Field_required": "Zevî hewce ye", @@ -1452,6 +1454,10 @@ "Layout_Sidenav_Footer_Dark_description": "size footer e 260 x 70px", "Layout_Terms_of_Service": "Terms of Service", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Şîfrekirin,", + "LDAP_DataSync_BackgroundSync": "Hevpeywendiya paşde", + "LDAP_Server_Type": "Server Type", + "LDAP_Server_Type_Other": "Yên din", "LDAP_Authentication": "Bikêrkirin", "LDAP_Authentication_Password": "Şîfre", "LDAP_Authentication_UserDN": "DN bikarhêner", @@ -1982,6 +1988,7 @@ "Reactions": "reaksiyonên", "Read_by": "Pîroz bixwînin", "Read_only": "Tenê bixwînin", + "This_room_is_read_only": "Ev odeyê tenê xwendinê ye", "Read_only_changed_successfully": "Tenê bi serkeftî veguherîn", "Read_only_channel": "Tenê Channel Only Read", "Read_only_group": "Tenê Komê Hilbijartin", @@ -2656,6 +2663,8 @@ "Visitor_Navigation": "Navigation Mêvan", "Visitor_page_URL": "URL rûpel Mêvan", "Visitor_time_on_site": "dem Mêvan li ser malpera", + "VoIP_Management_Server_Username": "Navê bikarhêner", + "VoIP_Management_Server_Password": "Şîfre", "Wait_activation_warning": "Berî ku hun nikarim têkevim, hesabê xwe divê bi destan an administrator aktîfkirin.", "Warnings": "Hişyar", "We_are_offline_Sorry_for_the_inconvenience": "Em ne offline. Mixabin ji ber nerihetîya.", @@ -2738,6 +2747,7 @@ "registration.component.resetPassword": "تێپەڕەوشە دابنێرەوە", "registration.component.form.username": "Navê bikarhêner", "registration.component.form.name": "ناو", + "registration.component.form.userAlreadyExist": "Ev nav tê bikaranîn. Ji kerema xwe bikarhênerek din bixwazin.", "registration.component.form.emailAlreadyExists": "Email jixwe heye", "registration.component.form.usernameAlreadyExists": "Ev nav tê bikaranîn. Ji kerema xwe bikarhênerek din bixwazin.", "registration.component.form.invalidEmail": "ئیمەیڵی نوسراو هەڵەیە.", diff --git a/packages/i18n/src/locales/lo.i18n.json b/packages/i18n/src/locales/lo.i18n.json index 4fc5eeb0c7665..7bcd89dc402aa 100644 --- a/packages/i18n/src/locales/lo.i18n.json +++ b/packages/i18n/src/locales/lo.i18n.json @@ -330,6 +330,7 @@ "Apply": "ນໍາໃຊ້", "Apply_and_refresh_all_clients": "ສະຫມັກຕໍາແລະໂຫຼດຫນ້າຈໍຄືນລູກຄ້າທັງຫມົດ", "Apps": "Apps", + "Apps_context_premium": "Enterprise", "Apps_Settings": "ການຕັ້ງຄ່າແອັບຯ", "Apps_WhatIsIt": "ແອັບພລິເຄຊັນ: ພວກເຂົາແມ່ນຫຍັງ?", "Apps_WhatIsIt_paragraph1": "ໄອຄອນໃຫມ່ໃນພື້ນທີ່ບໍລິຫານ! ນີ້ຫມາຍຄວາມວ່າແນວໃດແລະສິ່ງທີ່ເປັນແອັບຯ?", @@ -1133,6 +1134,7 @@ "FEDERATION_Domain": "ໂດເມນ", "FEDERATION_Status": "ສະຖານະພາບ", "Retry_Count": "Retry Count", + "Federation_Matrix_enabled": "ເປີດການໃຊ້ງານ", "Field": "ພາກສະຫນາມ", "Field_removed": "ພາກສະຫນາມອອກ", "Field_required": "ຕ້ອງການພາກສະຫນາມ", @@ -1494,6 +1496,11 @@ "Layout_Terms_of_Service": "ເງື່ອນໄຂການໃຫ້ບໍລິການ", "LDAP": "LDAP", "LDAP_Description": "LDAP ເປັນຖານຂໍ້ມູນລໍາດັບຊັ້ນທີ່ຫຼາຍບໍລິສັດນໍາໃຊ້ເພື່ອສະຫນອງການເຂົ້າສູ່ລະບົບໃນ - ສະຖານທີ່ສໍາລັບການແລກປ່ຽນລະຫັດຜ່ານຫນຶ່ງລະຫວ່າງສະຖານທີ່ແລະບໍລິການທີ່ຫຼາກຫຼາຍ. ສໍາລັບຂໍ້ມູນການຕັ້ງຄ່າຂັ້ນສູງແລະຕົວຢ່າງ, ກະລຸນາປືກສາຫາລື wiki ຂອງພວກເຮົາ: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "ການເຂົ້າລະຫັດ", + "LDAP_DataSync_Advanced": "ຊິງຂັ້ນສູງ", + "LDAP_DataSync_BackgroundSync": "Background Sync", + "LDAP_Server_Type": "Server Type", + "LDAP_Server_Type_Other": "ອື່ນໆ", "LDAP_Advanced_Sync": "ຊິງຂັ້ນສູງ", "LDAP_Authentication": "ເປີດໃຊ້ງານ", "LDAP_Authentication_Password": "ລະຫັດຜ່ານ", @@ -2701,6 +2708,8 @@ "Visitor_Navigation": "ຈໍານວນຜູ້ເຂົ້າ Navigation", "Visitor_page_URL": "URL ຫນ້າຈໍານວນຜູ້ເຂົ້າ", "Visitor_time_on_site": "ທີ່ໃຊ້ເວລາຈໍານວນຜູ້ເຂົ້າຢູ່ໃນເວັບໄຊ", + "VoIP_Management_Server_Username": "ຊື່ຜູ້ໃຊ້", + "VoIP_Management_Server_Password": "ລະຫັດຜ່ານ", "Wait_activation_warning": "ກ່ອນທີ່ທ່ານຈະສາມາດເຂົ້າສູ່ລະບົບ, ບັນຊີຂອງທ່ານຕ້ອງໄດ້ຮັບການເປີດໃຊ້ວຽກດ້ວຍຕົນເອງໂດຍຜູ້ບໍລິຫານ.", "Warnings": "ຄໍາເຕືອນ", "We_are_offline_Sorry_for_the_inconvenience": "ພວກເຮົາມີຄວາມອອຟໄລ. ຂໍ​ອະ​ໄພ​ໃນ​ຄວາມ​ບໍ່​ສະ​ດວກ.", @@ -2785,6 +2794,7 @@ "registration.component.form.emailOrUsername": "ອີ​ເມລ​ຫຼື​ຊື່​ຜູ້​ໃຊ້", "registration.component.form.username": "ຊື່ຜູ້ໃຊ້", "registration.component.form.name": "ຊື່", + "registration.component.form.userAlreadyExist": "ຊື່ຜູ້ໃຊ້ມີຢູ່ແລ້ວ. ກະລຸນາລອງໃຊ້ຊື່ຜູ້ໃຊ້ອີກຄັ້ງຫນຶ່ງ.", "registration.component.form.emailAlreadyExists": "Email ຢູ່ແລ້ວ", "registration.component.form.usernameAlreadyExists": "ຊື່ຜູ້ໃຊ້ມີຢູ່ແລ້ວ. ກະລຸນາລອງໃຊ້ຊື່ຜູ້ໃຊ້ອີກຄັ້ງຫນຶ່ງ.", "registration.component.form.invalidEmail": "ອີເມວນັ້ນບໍ່ຖືກຕ້ອງ", diff --git a/packages/i18n/src/locales/lt.i18n.json b/packages/i18n/src/locales/lt.i18n.json index 45eb0f343c17b..3a866a790e77b 100644 --- a/packages/i18n/src/locales/lt.i18n.json +++ b/packages/i18n/src/locales/lt.i18n.json @@ -355,6 +355,7 @@ "Apply": "Taikyti", "Apply_and_refresh_all_clients": "Taikykite ir atnaujinkite visus klientus", "Apps": "Programos", + "Apps_context_premium": "Įmonė", "Apps_Game_Center_Back": "Grįžti į žaidimų centrą", "Apps_Game_Center_Invite_Friends": "Pakvieskite draugus prisijungti", "Apps_Game_Center_Play_Game_Together": "@here Žaiskime {{name}} kartu!", @@ -1154,6 +1155,7 @@ "FEDERATION_Domain": "Domenas", "FEDERATION_Status": "Statusas", "Retry_Count": "Pakartotinai kartoti", + "Federation_Matrix_enabled": "Įjungtas", "Field": "Laukas", "Field_removed": "Laukas pašalintas", "Field_required": "Reikalingas laukas", @@ -1513,6 +1515,10 @@ "Layout_Terms_of_Service": "Paslaugų teikimo sąlygos", "LDAP": "LDAP", "LDAP_Description": "LDAP yra hierarchinė duomenų bazė, kurią daugelis kompanijų naudoja vieninteliam prisijungimui - tai galimybė dalintis vienu slaptažodžiu tarp kelių svetainių ir paslaugų. Išsamesnės konfigūracijos informacijos ir pavyzdžių rasite mūsų wiki: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "Šifravimas", + "LDAP_DataSync_BackgroundSync": "Fono sinchronizavimas", + "LDAP_Server_Type": "Serverio tipas", + "LDAP_Server_Type_Other": "Kitas", "LDAP_Authentication": "Įgalinti", "LDAP_Authentication_Password": "Slaptažodis", "LDAP_Authentication_UserDN": "Vartotojo DN", @@ -2543,6 +2549,7 @@ "Unarchive": "Unarchyvuoti", "unarchive-room": "Unarchive kambarys", "unarchive-room_description": "Leidimas archyvuoti kanalus", + "unauthorized": "Neleidžiama", "Unblock_User": "Atblokuoti naudotoją", "Unignore": "Neignore", "Uninstall": "Pašalinti", @@ -2719,6 +2726,8 @@ "Visitor_Navigation": "Lankytojo navigacija", "Visitor_page_URL": "Lankytojo puslapio URL", "Visitor_time_on_site": "Lankytojo laikas svetainėje", + "VoIP_Management_Server_Username": "Vartotojo vardas", + "VoIP_Management_Server_Password": "Slaptažodis", "Wait_activation_warning": "Prieš prisijungdami, administratoriaus rankiniu būdu turi įjungti savo sąskaitą.", "Warnings": "Įspėjimai", "We_are_offline_Sorry_for_the_inconvenience": "Mes neprisijungę. Atsiprašome už nepatogumus.", @@ -2793,6 +2802,7 @@ "Your_push_was_sent_to_s_devices": "Jūsų paspaudimas buvo išsiųstas į%s įrenginius", "Your_server_link": "Jūsų serverio nuoroda", "Your_workspace_is_ready": "Jūsų darbo vieta yra paruošta naudoti 🎉", + "registration.page.login.errors.wrongCredentials": "Vartotojas nerastas arba neteisingas slaptažodis", "registration.page.registration.waitActivationWarning": "Prieš prisijungdami, administratoriaus rankiniu būdu turi įjungti savo sąskaitą.", "registration.page.login.forgot": "Pamiršai slaptažodį", "registration.page.resetPassword.sent": "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ą.", @@ -2802,6 +2812,7 @@ "registration.component.form.emailOrUsername": "El. pastas arba vartotojo vardas", "registration.component.form.username": "Vartotojo vardas", "registration.component.form.name": "Pavadinimas", + "registration.component.form.userAlreadyExist": "Vardas jau egzistuoja. Pabandykite kitą vartotojo vardą.", "registration.component.form.emailAlreadyExists": "El. Laiškas jau egzistuoja", "registration.component.form.usernameAlreadyExists": "Vardas jau egzistuoja. Pabandykite kitą vartotojo vardą.", "registration.component.form.invalidEmail": "Įvestas el. Pašto adresas neteisingas", diff --git a/packages/i18n/src/locales/lv.i18n.json b/packages/i18n/src/locales/lv.i18n.json index 50fd40831e5f5..697c5b577600f 100644 --- a/packages/i18n/src/locales/lv.i18n.json +++ b/packages/i18n/src/locales/lv.i18n.json @@ -325,6 +325,7 @@ "Apply": "Pieteikties", "Apply_and_refresh_all_clients": "Pieteikties un atsvaidzināt visus klientus", "Apps": "Lietotnes", + "Apps_context_premium": "Uzņēmums", "Apps_Settings": "Lietotnes iestatījumi", "Apps_WhatIsIt": "Litetotnes: Kas tās tādas?", "Apps_WhatIsIt_paragraph1": "Jauna ikona administrācijas laukā! Ko tas nozīmē un kas ir lietotnes?", @@ -1112,6 +1113,7 @@ "FEDERATION_Domain": "Domēns", "FEDERATION_Status": "Stāvoklis", "Retry_Count": "Mēģinājumu skaits", + "Federation_Matrix_enabled": "Iespējots", "Field": "Lauks", "Field_removed": "Lauks noņemts", "Field_required": "Vajadzīgs lauks", @@ -1471,6 +1473,10 @@ "Layout_Terms_of_Service": "Pakalpojumu sniegšanas noteikumi", "LDAP": "LDAP", "LDAP_Description": "LDAP ir hierarhiska datu bāze, ko daudzi uzņēmumi izmanto, lai nodrošinātu vienotu pieteikšanos - telpu kur dalties ar vienu paroli starp vairākām vietnēm un pakalpojumiem. Papildu konfigurācijas informācijai un piemēriem, lūdzu skatiet mūsu wiki: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "Šifrēšana", + "LDAP_DataSync_BackgroundSync": "Fona sinhronizācija", + "LDAP_Server_Type": "Servera veids", + "LDAP_Server_Type_Other": "Cits", "LDAP_Authentication": "Iespējot", "LDAP_Authentication_Password": "Parole", "LDAP_Authentication_UserDN": "Lietotāja DN", @@ -2495,6 +2501,7 @@ "Unarchive": "Izņemt no arhīva", "unarchive-room": "Izņemt istabu no arhīva", "unarchive-room_description": "Atļauja izņemt kanālus no arhīva", + "unauthorized": "Nav atļauts", "Unblock_User": "Atbloķēt lietotāju", "Unignore": "Noņemt ignorēt", "Uninstall": "Atinstalēt", @@ -2662,6 +2669,8 @@ "Visitor_Navigation": "Apmeklētāju navigācija", "Visitor_page_URL": "Apmeklētāja lapas URL", "Visitor_time_on_site": "Apmeklētāja laiks vietnē", + "VoIP_Management_Server_Username": "Lietotājvārds", + "VoIP_Management_Server_Password": "Parole", "Wait_activation_warning": "Pirms jūs varat pieteikties, administratoram manuāli jāaktivizē jūsu kontu .", "Warnings": "Brīdinājumi", "We_are_offline_Sorry_for_the_inconvenience": "Mēs esam bezsaistē. Atvainojamies par sagādātajām neērtībām.", @@ -2734,6 +2743,7 @@ "Your_push_was_sent_to_s_devices": "Jūsu push tika nosūtīts uz %s ierīcēm", "Your_server_link": "Jūsu servera saite", "Your_workspace_is_ready": "Jūsu darbastacija ir gatava lietošanai 🎉", + "registration.page.login.errors.wrongCredentials": "Lietotājs nav atrasts vai ir nepareiza parole", "registration.page.registration.waitActivationWarning": "Pirms jūs varat pieteikties, administratoram manuāli jāaktivizē jūsu kontu .", "registration.page.login.forgot": "Aizmirsi savu paroli", "registration.page.resetPassword.sent": "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.", @@ -2743,6 +2753,7 @@ "registration.component.form.emailOrUsername": "E-pasts vai lietotājvārds", "registration.component.form.username": "Lietotājvārds", "registration.component.form.name": "Vārds", + "registration.component.form.userAlreadyExist": "Lietotājvārds jau eksistē. Lūdzu, izmēģiniet citu lietotājvārdu.", "registration.component.form.emailAlreadyExists": "E-pasta adrese jau pastāv", "registration.component.form.usernameAlreadyExists": "Lietotājvārds jau eksistē. Lūdzu, izmēģiniet citu lietotājvārdu.", "registration.component.form.invalidEmail": "Ievadītais e-pasts nav derīgs", diff --git a/packages/i18n/src/locales/mn.i18n.json b/packages/i18n/src/locales/mn.i18n.json index 8520175e2189c..b8dd78554925c 100644 --- a/packages/i18n/src/locales/mn.i18n.json +++ b/packages/i18n/src/locales/mn.i18n.json @@ -319,6 +319,7 @@ "Apply": "Хүсэлт гаргах", "Apply_and_refresh_all_clients": "Бүх үйлчлүүлэгчийг өргөж, сэргээнэ үү", "Apps": "Аппууд", + "Apps_context_premium": "Аж ахуйн нэгж", "Apps_Settings": "Апп тохиргоо", "Apps_WhatIsIt": "Апп: Тэдгээр нь юу вэ?", "Apps_WhatIsIt_paragraph1": "Захиргааны бүс дэх шинэ дүрс Энэ нь юу гэсэн үг вэ, Apps гэж юу вэ?", @@ -1095,6 +1096,7 @@ "FEDERATION_Domain": "Домэйн", "FEDERATION_Status": "Статус", "Retry_Count": "Дахин оролдох", + "Federation_Matrix_enabled": "Идэвхжүүлсэн", "Field": "Талбар", "Field_removed": "Талбарыг арилгасан", "Field_required": "Шаардлагатай талбар", @@ -1453,6 +1455,10 @@ "Layout_Terms_of_Service": "Үйлчилгээний нөхцөл", "LDAP": "LDAP", "LDAP_Description": "LDAP нь олон компаниуд сайтууд болон үйлчилгээнүүдийн хооронд нэг нууц үг солилцох боломжийг олгодог шаталбар бүхий өгөгдлийн сан юм. Нэмэлт тохиргооны мэдээлэл болон жишээнүүдийн хувьд манай викитэй холбогдоно уу: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "Шифрлэлт", + "LDAP_DataSync_BackgroundSync": "Үндсэн синх", + "LDAP_Server_Type": "Серверийн төрөл", + "LDAP_Server_Type_Other": "Бусад", "LDAP_Authentication": "Бататгах", "LDAP_Authentication_Password": "Нууц үг", "LDAP_Authentication_UserDN": "Хэрэглэгчийн DN", @@ -2481,6 +2487,7 @@ "Unarchive": "Unarchive", "unarchive-room": "Unarchive Room", "unarchive-room_description": "Ноцтой суваг руу зөвшөөрөл өгөх", + "unauthorized": "Эрх мэдэлгүй байх", "Unblock_User": "Хэрэглэгчийг хориглох", "Unignore": "Unignore", "Uninstall": "Устгах", @@ -2654,6 +2661,8 @@ "Visitor_Navigation": "Зорчигч навигацийн", "Visitor_page_URL": "Зочлогч хуудасны URL", "Visitor_time_on_site": "Сайтын цаг", + "VoIP_Management_Server_Username": "Хэрэглэгчийн нэр", + "VoIP_Management_Server_Password": "Нууц үг", "Wait_activation_warning": "Нэвтрэхийн өмнө, таны данс администратор гараар идэвхжүүлсэн байх ёстой.", "Warnings": "Анхааруулга", "We_are_offline_Sorry_for_the_inconvenience": "Бид офлайн байна. Төвөг удсанд уучлаарай.", @@ -2727,6 +2736,7 @@ "Your_push_was_sent_to_s_devices": "Таны түлхэлт %s төхөөрөмж рүү илгээгдсэн", "Your_server_link": "Таны серверийн холбоос", "Your_workspace_is_ready": "Таны ажлын талбарыг ашиглахад бэлэн байна", + "registration.page.login.errors.wrongCredentials": "Хэрэглэгч олдсонгүй эсвэл буруу нууц үг", "registration.page.registration.waitActivationWarning": "Нэвтрэхийн өмнө, таны данс администратор гараар идэвхжүүлсэн байх ёстой.", "registration.page.login.forgot": "Нууц үгээ мартсан", "registration.page.resetPassword.sent": "Хэрэв энэ имэйл бүртгэгдсэн бол бид таны нууц үгийг шинэчлэх талаар зааварчилгааг илгээх болно. Хэрэв та имэйлээ удахгүй хүлээж авахгүй бол эргэж ороод дахин оролдоно уу.", @@ -2736,6 +2746,7 @@ "registration.component.form.emailOrUsername": "И-мэйл эсвэл Хэрэглэгчийн нэр", "registration.component.form.username": "Хэрэглэгчийн нэр", "registration.component.form.name": "Нэр", + "registration.component.form.userAlreadyExist": "Хэрэглэгчийн нэр өмнө байна. Өөр хэрэглэгчийн нэрийг оруулна уу.", "registration.component.form.emailAlreadyExists": "Имэйл аль хэдийн байна", "registration.component.form.usernameAlreadyExists": "Хэрэглэгчийн нэр өмнө байна. Өөр хэрэглэгчийн нэрийг оруулна уу.", "registration.component.form.invalidEmail": "Оруулсан имэйл буруу байна", diff --git a/packages/i18n/src/locales/ms-MY.i18n.json b/packages/i18n/src/locales/ms-MY.i18n.json index 2c14909ec239c..4089904315cbc 100644 --- a/packages/i18n/src/locales/ms-MY.i18n.json +++ b/packages/i18n/src/locales/ms-MY.i18n.json @@ -319,6 +319,7 @@ "Apply": "Memohon", "Apply_and_refresh_all_clients": "Dikenakan dan menyegarkan semua pelanggan", "Apps": "Apps", + "Apps_context_premium": "Enterprise", "Apps_Settings": "Tetapan Apl", "Apps_WhatIsIt": "Apps: Apakah Mereka?", "Apps_WhatIsIt_paragraph1": "Ikon baru di kawasan pentadbiran! Apa maksudnya dan apa yang Apps?", @@ -489,6 +490,7 @@ "Confirm_New_Password_Placeholder": "Sila masukkan semula kata laluan baru ...", "Confirm_password": "Sahkan kata laluan anda", "Confirm_your_password": "Sahkan kata laluan anda", + "Connected": "Bersambung", "Connection_Closed": "Sambungan ditutup", "Connection_Reset": "Tetap semula sambungan", "Consulting": "Perundingan", @@ -1097,6 +1099,7 @@ "FEDERATION_Domain": "domain", "FEDERATION_Status": "Status", "Retry_Count": "Cuba semula", + "Federation_Matrix_enabled": "didayakan", "Field": "Field", "Field_removed": "Field dikeluarkan", "Field_required": "Bidang diperlukan", @@ -1455,6 +1458,10 @@ "Layout_Terms_of_Service": "Terma Perkhidmatan", "LDAP": "LDAP", "LDAP_Description": "LDAP adalah pangkalan data hierarki bahawa banyak syarikat gunakan untuk menyediakan single sign on - kemudahan untuk berkongsi satu kata laluan antara beberapa tapak dan perkhidmatan. Untuk maklumat konfigurasi lanjutan dan contoh, sila rujuk wiki kami: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "penyulitan", + "LDAP_DataSync_BackgroundSync": "Penyegerakan Latar Belakang", + "LDAP_Server_Type": "Jenis pelayan", + "LDAP_Server_Type_Other": "lain", "LDAP_Authentication": "Membolehkan", "LDAP_Authentication_Password": "Kata laluan", "LDAP_Authentication_UserDN": "DN pengguna", @@ -2668,6 +2675,8 @@ "Visitor_Navigation": "Navigation pelawat", "Visitor_page_URL": "URL halaman Pelawat", "Visitor_time_on_site": "kali pengunjung di laman web", + "VoIP_Management_Server_Username": "Nama pengguna", + "VoIP_Management_Server_Password": "Kata laluan", "Wait_activation_warning": "Sebelum anda boleh log masuk, akaun anda mesti diaktifkan secara manual oleh pentadbiran.", "Warnings": "Amaran", "We_are_offline_Sorry_for_the_inconvenience": "Kami berada di luar talian. Maaf atas kesulitan.", @@ -2752,6 +2761,7 @@ "registration.component.form.emailOrUsername": "E-mel atau nama pengguna", "registration.component.form.username": "Nama pengguna", "registration.component.form.name": "Nama", + "registration.component.form.userAlreadyExist": "Nama pengguna sudah wujud. Sila cuba nama pengguna lain.", "registration.component.form.emailAlreadyExists": "E-mel telah wujud", "registration.component.form.usernameAlreadyExists": "Nama pengguna sudah wujud. Sila cuba nama pengguna lain.", "registration.component.form.invalidEmail": "E-mel yang dimasukkan tidak sah", diff --git a/packages/i18n/src/locales/nl.i18n.json b/packages/i18n/src/locales/nl.i18n.json index 29a69550e75e3..a5626058a8feb 100644 --- a/packages/i18n/src/locales/nl.i18n.json +++ b/packages/i18n/src/locales/nl.i18n.json @@ -452,6 +452,7 @@ "Apply_and_refresh_all_clients": "Toepassen en alle klanten opnieuw laden", "Apps": "Apps", "Apps_context_installed": "Geïnstalleerd", + "Apps_context_premium": "Onderneming", "Apps_Engine_Version": "Apps Engine-versie", "Apps_Essential_Alert": "Deze app is essentieel voor de volgende evenementen:", "Apps_Essential_Disclaimer": "De hierboven genoemde gebeurtenissen worden onderbroken als deze app is uitgeschakeld. Als je wilt dat Rocket.Chat werkt zonder de functionaliteit van deze app, moet je deze verwijderen", @@ -1374,6 +1375,7 @@ "Desktop_Notifications_Not_Enabled": "Desktopmeldingen zijn niet ingeschakeld", "Details": "Details", "line": "lijn", + "Device_Management_IP": "IP", "Different_Style_For_User_Mentions": "Andere stijl voor gebruikersvermeldingen", "Livechat_Facebook_API_Key": "OmniChannel API-sleutel", "Livechat_Facebook_API_Secret": "OmniChannel API-geheim", @@ -1860,6 +1862,7 @@ "FEDERATION_Test_Setup_Error": "Kan uw server niet vinden met uw installatie. Controleer uw instellingen.", "FEDERATION_Test_Setup_Success": "Uw federatie-installatie werkt en andere servers kunnen u vinden!", "Retry_Count": "Aantal pogingen", + "Federation_Matrix_enabled": "Ingeschakeld", "Field": "Veld", "Field_removed": "Veld verwijderd", "Field_required": "Veld vereist", @@ -3333,6 +3336,7 @@ "Privacy": "Privacy", "Privacy_Policy": "Privacybeleid", "Private": "Privé", + "Private_channels": "Privékanalen", "Private_Channel": "Privékanaal", "Private_Channels": "Privékanalen", "Private_Chats": "Privéchats", @@ -3409,6 +3413,7 @@ "Reactions": "Reacties", "Read_by": "Gelezen door", "Read_only": "Alleen lezen", + "This_room_is_read_only": "Deze kamer is alleen-lezen", "Read_only_changed_successfully": "Alleen lezen is succesvol gewijzigd", "Read_only_channel": "Alleen lezen kanaal", "Read_only_group": "Alleen lezen groep", @@ -3571,6 +3576,7 @@ "Unsafe_Url": "Onveilige URL", "Rocket_Chat_Alert": "Rocket.Chat-waarschuwing", "Role": "Rol", + "Roles": "Rollen", "Role_Editing": "Rolbewerking", "Role_Mapping": "Roltoewijzing", "Role_removed": "Rol verwijderd", @@ -4779,6 +4785,7 @@ "registration.component.resetPassword": "Wachtwoord opnieuw instellen", "registration.component.form.username": "Gebruikersnaam", "registration.component.form.name": "Naam", + "registration.component.form.userAlreadyExist": "Gebruikersnaam bestaat al. Probeer een andere gebruikersnaam.", "registration.component.form.emailAlreadyExists": "E-mailadres bestaat al", "registration.component.form.usernameAlreadyExists": "Gebruikersnaam bestaat al. Probeer een andere gebruikersnaam.", "registration.component.form.invalidEmail": "Het ingevoerde e-mailadres is ongeldig", diff --git a/packages/i18n/src/locales/no.i18n.json b/packages/i18n/src/locales/no.i18n.json index 7d25488a7c40e..0397bf518f7c6 100644 --- a/packages/i18n/src/locales/no.i18n.json +++ b/packages/i18n/src/locales/no.i18n.json @@ -565,6 +565,7 @@ "Apps_Interface_IPreMessageDeletePrevent": "Hendelse som skjer før en melding slettes", "Apps_Interface_IPreMessageSentExtend": "Hendelse som skjer før en melding sendes", "Apps_Interface_IPreMessageSentModify": "Hendelse som skjer før en melding sendes", + "Apps_Interface_IPreMessageSentPrevent": "Hendelse som skjer før en melding sendes", "Apps_License_Message_maxSeats": "Lisensen tar ikke imot gjeldende antall aktive brukere. Vennligst øk antall seter", "Apps_License_Message_publicKey": "Det har oppstått en feil under dekryptering av lisensen. Synkroniser arbeidsområdet ditt i Connectivity Service og prøv på nytt", "Apps_License_Message_renewal": "Lisensen er utløpt og må fornyes", @@ -1930,10 +1931,12 @@ "Favorites": "Favoritter", "Feature_Depends_on_Livechat_Visitor_navigation_as_a_message_to_be_enabled": "Denne funksjonen avhenger av \"Send besøkende navigasjonshistorikk som en melding\" for å være aktivert.", "Federation_Example_matrix_server": "Eksempel: matrix.org", + "Federation_Public_key": "Offentlig nøkkel", "FEDERATION_Domain": "Domene", "FEDERATION_Public_Key": "Offentlig nøkkel", "FEDERATION_Status": "Status", "Retry_Count": "Prøv på nytt", + "Federation_Matrix_enabled": "aktivert", "Federation_Matrix_id": "AppService-ID", "Federation_Matrix_hs_token": "Hjemmeserver-token", "Federation_Matrix_as_token": "AppService-token", @@ -2523,6 +2526,10 @@ "LDAP_DataSync_Advanced": "Avansert synkronisering", "LDAP_DataSync_Roles": "Synkroniser roller", "LDAP_DataSync_Channels": "Synkroniser kanaler", + "LDAP_DataSync_BackgroundSync": "Bakgrunnssynkronisering", + "LDAP_Server_Type": "Server Type", + "LDAP_Server_Type_Other": "Andre", + "LDAP_Advanced_Sync": "Avansert synkronisering", "LDAP_Authentication": "Aktiver", "LDAP_Authentication_Password": "Passord", "LDAP_Authentication_UserDN": "Bruker DN", @@ -3350,6 +3357,7 @@ "Read_by": "Les av", "Read_only": "Les bare", "Readability": "Lesbarhet", + "This_room_is_read_only": "Dette rommet er kun skrivebeskyttet", "Read_only_changed_successfully": "Bare lest endret", "Read_only_channel": "Les kun kanal", "Read_only_group": "Read Only Group", @@ -3482,6 +3490,7 @@ "Notes": "Notater", "Unsafe_Url": "Usikker URL", "Role": "rolle", + "Roles": "Roller", "Role_Editing": "Rollredigering", "Role_Mapping": "Rollekobling", "Role_removed": "Rolle fjernet", @@ -3566,6 +3575,7 @@ "SAML_Section_2_Certificate": "Sertifikat", "SAML_Section_3_Behavior": "Oppførsel", "SAML_Section_4_Roles": "Roller", + "SAML_Section_5_Mapping": "Kartlegging", "SAML_Section_6_Advanced": "Avansert", "Saturday": "lørdag", "Save": "Lagre", @@ -4039,6 +4049,7 @@ "Threads": "Tråder", "Thursday": "Torsdag", "Time_in_seconds": "Tid i sekunder", + "Timeouts": "Tidsavbrudd", "Timezone": "Tidssone", "Title": "Tittel", "Title_bar_color": "Tittel bar farge", @@ -4074,6 +4085,7 @@ "Total_Threads": "Totalt antall tråder", "Total_visitors": "Totalt antall besøkende", "TOTP Invalid [totp-invalid]": "Kode eller passord er ugyldig", + "totp-invalid": "Kode eller passord er ugyldig", "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", "Transcript_of_your_livechat_conversation": "Transkripsjon av livechat-samtalen.", @@ -4186,6 +4198,7 @@ "Use_User_Preferences_or_Global_Settings": "Bruk brukerinnstillinger eller globale innstillinger", "User": "Bruker", "User_menu": "Brukermeny", + "User Search": "Brukersøk", "User__username__is_now_a_leader_of__room_name_": "Bruker {{username}} er nå leder av {{room_name}}", "User__username__is_now_a_moderator_of__room_name_": "Bruker {{username}} er nå en moderator av {{room_name}}", "User__username__is_now_an_owner_of__room_name_": "Bruker {{username}} er nå eier av {{room_name}}", @@ -4307,6 +4320,7 @@ "video_conference_ended": "_Samtalen har sluttet._", "video_livechat_started": "_Startet en videosamtale._", "video_direct_calling": "_Ringer._", + "video_direct_ended": "_Samtalen er avsluttet._", "View_mode": "Visningsmodus", "View_All": "Se alle medlemmer", "View_channels": "Se kanaler", @@ -4362,6 +4376,8 @@ "Visitor_Navigation": "Visitor Navigasjon", "Visitor_page_URL": "URL for besøkende siden", "Visitor_time_on_site": "Besøkende tid på stedet", + "VoIP_Management_Server_Username": "Brukernavn", + "VoIP_Management_Server_Password": "Passord", "Voip_call_duration": "Samtalen varte i {{duration}}", "Voip_call_ended_unexpectedly": "Samtalen ble avbrutt uventet: {{reason}}", "Wait_activation_warning": "Før du kan logge inn, må kontoen din aktiveres manuelt av en administrator.", @@ -4467,6 +4483,10 @@ "Youre_not_a_part_of__channel__and_I_mentioned_you_there": "Du er ikke en del av {{channel}} og jeg nevnte deg der", "registration.page.login.errors.wrongCredentials": "Bruker finnes ikke eller så er passordet feil", "registration.page.login.errors.invalidEmail": "Ugyldig e-post", + "registration.page.login.errors.loginBlockedForIp": "Innlogging er midlertidig blokkert for denne IP-adressen", + "registration.page.login.errors.loginBlockedForUser": "Innlogging er midlertidig blokkert for denne brukeren", + "registration.page.login.errors.licenseUserLimitReached": "Maksimalt antall brukere er nådd.", + "registration.page.login.errors.AppUserNotAllowedToLogin": "Appbrukere har ikke lov til å logge inn direkte.", "registration.page.registration.waitActivationWarning": "Før du kan logge inn, må kontoen din aktiveres manuelt av en administrator.", "registration.page.login.register": "Ny her? <1>Opprett en konto", "registration.page.resetPassword.sent": "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.", @@ -4498,6 +4518,7 @@ "registration.component.form.reasonToJoin": "Årsak til å bli med", "registration.component.form.invalidConfirmPass": "Passordbekreftelsen stemmer ikke overens med passordet", "registration.component.form.confirmPassword": "Bekreft passordet ditt", + "registration.component.form.confirmation": "Bekreftelse", "registration.component.form.sendConfirmationEmail": "Send bekreftelses-e-post", "onboarding.component.form.action.registerWorkspace": "Registrer arbeidsområde", "onboarding.component.form.action.registerOffline": "Registrer deg offline", @@ -4518,6 +4539,7 @@ "Community_Private_apps_limit_exceeded": "Grensen for Community-apper er overskredet.", "Theme_high_contrast": "Høy kontrast", "Highlighted_chosen_word": "Uthevet valgt ord", + "Join_your_team": "Bli med teamet ditt", "Create_a_password": "Opprett et passord", "Create_an_account": "Opprett en konto", "Get_all_apps": "Få alle appene teamet ditt trenger", @@ -4535,9 +4557,11 @@ "User_status_temporarily_disabled": "Brukerstatus er midlertidig deaktivert", "Use_token": "Bruk token", "Disconnected": "Frakoblet", + "Security_code": "Sikkerhetskode", "Registration_Token": "Registreringstoken", "RegisterWorkspace_Button": "Registrer arbeidsområde", "RegisterWorkspace_Features_Marketplace_Disconnect": "Det vil ikke lenger være mulig å installere apper.", + "RegisterWorkspace_Features_ThirdPartyLogin_Title": "Tredjeparts innlogging", "RegisterWorkspace_Setup_Steps": "Steg {{step}} av {{numberOfSteps}}", "RegisterWorkspace_Setup_Have_Account_Title": "Har en konto?", "RegisterWorkspace_Setup_No_Account_Title": "Har du ikke en konto?", diff --git a/packages/i18n/src/locales/pl.i18n.json b/packages/i18n/src/locales/pl.i18n.json index 4461e54d899cc..0d2325e2e47e4 100644 --- a/packages/i18n/src/locales/pl.i18n.json +++ b/packages/i18n/src/locales/pl.i18n.json @@ -1,7 +1,7 @@ { "500": "Wewnętrzny błąd serwera", - "__count__empty_rooms_will_be_removed_automatically": "Liczba pokojów do automatycznego usunięcia: {{count}}.", "__count__message_pruned_few": "{{count}} wiadomość(i) usuniętych", + "__count__empty_rooms_will_be_removed_automatically": "Liczba pokojów do automatycznego usunięcia: {{count}}.", "__count__empty_rooms_will_be_removed_automatically__rooms__": "Puste pokoje ({{count}}) zostaną automatycznie usunięte:
{{rooms}}.", "__count__message_pruned_one": "{{count}} wiadomość(i) usuniętych", "__count__message_pruned_other": "{{count}} wiadomość(i) usuniętych", @@ -11,8 +11,8 @@ "__usersCount__member_joined_other": "+ {{count}} członków dołączyło", "__usersCount__people_will_be_invited": "{{usersCount}} ludzi zostanie zostanie zaproszonych", "__username__is_no_longer__role__defined_by__user_by_": "Użytkownik {{username}} nie ma już roli {{role}}; zmienił to użytkownik {{user_by}}", - "__usersCount__member_joined_many": "+ {{count}} członków dołączyło", "__username__was_set__role__by__user_by_": "Użytkownik {{username}} otrzymał rolę {{role}} od użytkownika {{user_by}}", + "__usersCount__member_joined_many": "+ {{count}} członków dołączyło", "This_room_encryption_has_been_enabled_by__username_": "Użytkownik {{username}} włączył szyfrowanie w tym pokoju", "This_room_encryption_has_been_disabled_by__username_": "Użytkownik {{username}} wyłączył szyfrowanie w tym pokoju", "disabled": "wyłączone", @@ -441,6 +441,7 @@ "API_Shield_Types_Description": "Typy osłon do włączenia jako lista rozdzielona przecinkami. Do wyboru „online”, „channel” lub „*” w przypadku wszystkich", "Apps_Framework_Development_Mode": "Włącz tryb programistyczny", "API_Shield_user_require_auth": "Wymagaj uwierzytelnienia dla osłon użytkowników", + "Calls_in_queue_many": "{{count}} połączeń w kolejce", "API_Token": "Token API", "Apps_Framework_Development_Mode_Description": "Tryb programistyczny zezwala na instalację aplikacji niepochodzących z Rocket.Chat Marketplace.", "API_Tokenpass_URL": "Adres URL serwera Tokenpass", @@ -475,6 +476,7 @@ "App_support_url": "adres URL pomocy", "App_Url_to_Install_From": "Zainstaluj z adresu URL", "App_Url_to_Install_From_File": "Zainstaluj z pliku", + "Calls_in_queue_few": "{{count}} połączeń w kolejce", "App_user_not_allowed_to_login": "Użytkownicy aplikacji nie mogą logować się bezpośrednio.", "Appearance": "Wygląd", "Application_added": "Aplikacja dodana", @@ -486,6 +488,7 @@ "Apps": "Aplikacje", "Apps_context_explore": "Poznaj", "Apps_context_installed": "Zainstalowana", + "Apps_context_premium": "Enterprise", "Apps_Engine_Version": "Wersja silnika aplikacji", "Apps_Essential_Alert": "Ta aplikacja jest niezbędna dla następujących zdarzeń:", "Apps_Essential_Disclaimer": "Zdarzenia wymienione powyżej zostaną zakłócone, jeśli ta aplikacja jest wyłączona. Jeśli chcesz, aby Rocket.Chat działał bez tej aplikacji, musisz ją odinstalować", @@ -522,7 +525,6 @@ "Apps_License_Message_appId": "Licencja nie została wydana dla tej aplikacji", "Apps_License_Message_bundle": "Licencja wydana dla paczki, która nie zawiera aplikacji", "Apps_License_Message_expire": "Licencja straciła ważność i musi zostać odnowiona", - "Calls_in_queue_many": "{{count}} połączeń w kolejce", "Apps_License_Message_maxSeats": "Licencja nie jest dostosowana do obecnej liczby aktywnych użytkowników. Zwiększ liczbę miejsc", "Apps_License_Message_publicKey": "Wystąpił błąd podczas próby odszyfrowania licencji. Zsynchronizuj przestrzeń roboczą w usługach łączności i spróbuj ponownie", "Apps_License_Message_renewal": "Licencja wygasła i wymaga odnowienia", @@ -574,7 +576,6 @@ "Apps_Permissions_livechat-message_read": "Uzyskaj dostęp do informacji o wiadomościach Livechat", "Apps_Permissions_livechat-message_write": "Zmień informacje o wiadomościach Livechat", "Apps_Permissions_livechat-room_read": "Uzyskaj dostęp do informacji o pokojach Livechat", - "Calls_in_queue_few": "{{count}} połączeń w kolejce", "Apps_Permissions_livechat-room_write": "Zmień informacje o pokojach Livechat", "Apps_Permissions_livechat-department_read": "Uzyskaj dostęp do informacji o działach Livechat", "Apps_Permissions_livechat-department_multiple": "Dostęp do informacji o wielu działach Livechat", @@ -1771,6 +1772,7 @@ "Enter_Normal": "Tryb normalny (wysyłaj klawiszem Enter)", "Enter_to": "Naciśnij Enter: ", "Enter_your_E2E_password": "Wprowadź swoje hasło E2E", + "message_counter_many": "{{count}} wiadomości", "Entertainment": "Rozrywka", "Error": "Błąd", "Error_something_went_wrong": "Ups! Coś poszło nie tak. Odśwież stronę lub skontaktuj się z administratorem.", @@ -1819,6 +1821,7 @@ "error-forwarding-department-target-not-allowed": "Przekazywanie do docelowego działu nie jest dozwolone.", "error-guests-cant-have-other-roles": "Goście nie mogą mieć żadnych innych ról.", "error-import-file-extract-error": "Nie można wyodrębnić pliku importu.", + "meteor_status_reconnect_in_many": "spróbuj jeszcze raz za {{count}} sekund...", "error-import-file-is-empty": "Zaimportowany plik wydaje się być pusty.", "error-import-file-missing": "Plik, który ma zostać zaimportowany, nie został znaleziony w podanej ścieżce.", "error-importer-not-defined": "Importer nie została określona prawidłowo, to brakuje klasy Import.", @@ -1916,6 +1919,7 @@ "error-this-is-not-a-livechat-room": "To nie jest pokój Livechata", "error-token-already-exists": "Token o tej nazwie już istnieje", "error-token-does-not-exists": "Token nie istnieje", + "message_counter_few": "{{count}} wiadomości", "error-too-many-requests": "Błąd, zbyt wiele żądań. Proszę zwolnij. Musisz czekać {{seconds}} sekund przed ponowną próbą.", "error-transcript-already-requested": "Transkrypcja jest już wymagana", "error-unpinning-message": "Wiadomość nie może być odpięta", @@ -1969,6 +1973,7 @@ "Extension_Number": "Numer wewnętrzny", "Extension_Status": "Status rozszerzenia", "External": "Zewnętrzny", + "meteor_status_reconnect_in_few": "spróbuj jeszcze raz za {{count}} sekund...", "External_Domains": "Domeny zewnętrzne", "External_Queue_Service_URL": "URL usługi kolejki zewnętrznej", "External_Service": "Usługa zewnętrzna", @@ -2130,7 +2135,6 @@ "Finish": "Koniec", "Finish_Registration": "Zakończ rejestrację", "First_Channel_After_Login": "Pierwszy Channel po zalogowaniu", - "message_counter_many": "{{count}} wiadomości", "First_response_time": "Czas pierwszej reakcji", "Flags": "Flagi", "Follow_message": "Śledź wiadomość", @@ -2193,7 +2197,6 @@ "get-password-policy-mustContainAtLeastOneUppercase": "Hasło powinno zawierać co najmniej jedną wielką literę", "get-server-info": "Pobierz info o serwerze", "get-server-info_description": "Pozwolenie na uzyskanie informacji o serwerze", - "meteor_status_reconnect_in_many": "spróbuj jeszcze raz za {{count}} sekund...", "github_no_public_email": "Nie posiadasz publicznego konta e-mail przypisanego do swojego profilu GitHub.", "github_HEAD": "HEAD", "Give_a_unique_name_for_the_custom_oauth": "Podaj unikalną nazwę dla własnego OAuth", @@ -2297,7 +2300,6 @@ "Ignore_Two_Factor_Authentication": "Ignorowanie uwierzytelniania dwuskładnikowego", "Images": "Obrazki", "IMAP_intercepter_already_running": "Intercom protokołu IMAP już działa", - "message_counter_few": "{{count}} wiadomości", "IMAP_intercepter_Not_running": "Intercom protokołu IMAP Nie działa", "Impersonate_next_agent_from_queue": "Podszywaj się pod kolejnego agenta z kolejki", "Impersonate_user": "Podszywać się pod użytkownika", @@ -2373,7 +2375,6 @@ "Install": "Zainstaluj", "Install_Extension": "Zainstaluj rozszerzenie", "Install_FxOs": "Zainstaluj Rocket.Chat w Firefoksie", - "meteor_status_reconnect_in_few": "spróbuj jeszcze raz za {{count}} sekund...", "Install_FxOs_done": "Świetnie! Możesz teraz włączać Rocket.Chat poprzez ikonę na ekranie głównym. Życzymy miłego korzystania z Rocket.Chat!", "Install_FxOs_error": "Niestety, coś nie zadziałało! Wystąpił następujący błąd:", "Install_FxOs_follow_instructions": "Potwierdź instalowanie aplikacji na twoim urządzeniu (gdy wyskoczy pytanie naciśnij przycisk \"Zainstaluj\").", @@ -3631,6 +3632,7 @@ "Privacy_policy": "Polityka Prywatności", "Privacy_summary": "Podsumowanie dotyczące prywatności", "Private": "Prywatny", + "Private_channels": "Kanały prywatne", "Private_Channel": "Prywatny kanał", "Private_Channels": "Kanały prywatne", "Private_Chats": "Prywatne czaty", @@ -5248,6 +5250,7 @@ "registration.component.form.username": "Nazwa użytkownika", "registration.component.form.name": "Nazwa", "registration.component.form.createAnAccount": "Utwórz konto", + "registration.component.form.userAlreadyExist": "Nazwa użytkownika już istnieje. Spróbuj użyć innej nazwy użytkownika.", "registration.component.form.emailAlreadyExists": "Ten email jest zajęty", "registration.component.form.usernameAlreadyExists": "Nazwa użytkownika już istnieje. Spróbuj użyć innej nazwy użytkownika.", "registration.component.form.invalidEmail": "E-mail jest nieprawidłowy", diff --git a/packages/i18n/src/locales/pt-BR.i18n.json b/packages/i18n/src/locales/pt-BR.i18n.json index 982f90b04157c..0976838bf4bd7 100644 --- a/packages/i18n/src/locales/pt-BR.i18n.json +++ b/packages/i18n/src/locales/pt-BR.i18n.json @@ -13,8 +13,8 @@ "__usersCount__member_joined_other": "+ {{count}} membros entraram", "__usersCount__people_will_be_invited": "{{usersCount}} usuários vão ser convidados", "__username__is_no_longer__role__defined_by__user_by_": "{{username}} não pertence mais a {{role}}, por {{user_by}}", - "__usersCount__member_joined_many": "+ {{count}} membros entraram", "__username__was_set__role__by__user_by_": "{{username}} foi definido como {{role}} por {{user_by}}", + "__usersCount__member_joined_many": "+ {{count}} membros entraram", "__count__without__department__": "{{count}} sem departamento", "__count__without__tags__": "{{count}} sem tags", "__count__without__assignee__": "{{count}} sem responsável", @@ -442,6 +442,7 @@ "API_Shield_Types_Description": "Tipos de escudos para habilitar como uma lista separada por vírgulas; escolha entre `online`, `canal` ou `*` para todos", "Apps_Framework_Development_Mode": "Habilitar modo de desenvolvimento", "API_Shield_user_require_auth": "Exigir autenticaçāo para escudos de usuários", + "Calls_in_queue_many": "{{count}} chamadas na fila", "API_Token": "Token da API", "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.", "API_Tokenpass_URL": "URL do servidor Tokenpass", @@ -485,6 +486,7 @@ "Apply_and_refresh_all_clients": "Aplicar e atualizar todos os clientes", "Apps": "Aplicativos", "Apps_context_installed": "Instalado", + "Apps_context_premium": "Enterprise", "Apps_Engine_Version": "Versão do mecanismo de aplicativos", "Apps_Essential_Alert": "Este aplicativo é essencial para os seguintes eventos:", "Apps_Essential_Disclaimer": "Eventos listados acima serão interrompidos se esse app for desativado. Se você quiser que o Rocket.Chat funcione sem a funcionalidade deste aplicativo, você precisará desinstalá-lo", @@ -521,7 +523,6 @@ "Apps_License_Message_appId": "A licença foi gerada para um app diferente", "Apps_License_Message_bundle": "A licença foi gerada para um Bundle que não contém este app", "Apps_License_Message_expire": "A licença não é mais válida e precisa ser renovada", - "Calls_in_queue_many": "{{count}} chamadas na fila", "Apps_License_Message_maxSeats": "A licença não comporta a quantidade atual de usuários ativos. Aumente o número de lugares.", "Apps_License_Message_publicKey": "Ocorreu um erro ao tentar descriptografar a licença. Sincronize seu espaço de trabalho em Serviços de conectividade e tente novamente", "Apps_License_Message_renewal": "A licença expirou e precisa ser renovada", @@ -1420,6 +1421,7 @@ "Device_Changes_Not_Available": "Mudanças de dispositivo não estão disponíveis neste navegador, para disponíbilidade garantida, use o aplicativo desktop oficial do Rocket.Chat.", "Device_Changes_Not_Available_Insecure_Context": "Mudanças de dispositivo somente estão disponíveis em contextos seguros. (https://)", "line": "linha", + "Device_Management_IP": "IP", "Different_Style_For_User_Mentions": "Estilo diferente para as menções do usuário", "Livechat_Facebook_API_Key": "Chave da API OmniChannel", "Livechat_Facebook_API_Secret": "Secret da API OmniChannel", @@ -1671,6 +1673,7 @@ "Enter_Normal": "Modo normal (enviar com Enter)", "Enter_to": "Enter para", "Enter_your_E2E_password": "Digite sua senha E2E", + "message_counter_many": "{{count}} mensagens", "Entertainment": "Entretenimento", "Error": "Erro", "Error_404": "Erro 404", @@ -1717,6 +1720,7 @@ "error-forwarding-department-target-not-allowed": "O encaminhamento para o departamento selecionado não é permitido.", "error-guests-cant-have-other-roles": "Usuários visitantes não podem ter nenhuma outra função.", "error-import-file-extract-error": "Falha ao extrair o arquivo importado.", + "meteor_status_reconnect_in_many": "tentando novamente em {{count}} segundos...", "error-import-file-is-empty": "Arquivo importado parece estar vazio.", "error-import-file-missing": "O arquivo a ser importado não foi encontrado no caminho especificado.", "error-importer-not-defined": "O importador não foi definido corretamente; está faltando a classe Import.", @@ -1911,6 +1915,7 @@ "FEDERATION_Test_Setup_Error": "Não foi possível encontrar seu servidor usando sua configuração. Revise suas configurações.", "FEDERATION_Test_Setup_Success": "Sua configuração de federação está funcionando e outros servidores podem encontrá-lo!", "Retry_Count": "Tentar contagem novamente", + "Federation_Matrix_enabled": "Ativado", "Field": "Campo", "Field_removed": "Campo removido", "Field_required": "Campo obrigatório", @@ -2003,7 +2008,6 @@ "Finish": "Finalizar", "Finish_Registration": "Finalizar registro", "First_Channel_After_Login": "Primeiro canal após o login", - "message_counter_many": "{{count}} mensagens", "First_response_time": "Tempo para primeira resposta", "Flags": "Sinalizações", "Follow_message": "Seguir mensagem", @@ -2065,7 +2069,6 @@ "get-password-policy-mustContainAtLeastOneSpecialCharacter": "A senha deve conter no mínimo um caractere especial", "get-password-policy-mustContainAtLeastOneUppercase": "A senha deve conter no mínimo um caractere maiúsculo", "get-server-info": "Obter informações do servidor", - "meteor_status_reconnect_in_many": "tentando novamente em {{count}} segundos...", "github_no_public_email": "Você não possui um e-mail público em sua conta do GitHub", "github_HEAD": "HEAD", "Give_a_unique_name_for_the_custom_oauth": "Dê um nome exclusivo para o oauth customizado", @@ -3407,6 +3410,7 @@ "Privacy": "Privacidade", "Privacy_Policy": "Política de privacidade", "Private": "Privado", + "Private_channels": "Canais privados", "Private_Channel": "Canal privado", "Private_Channels": "Canais privados", "Private_Chats": "Conversas privadas", @@ -3484,6 +3488,7 @@ "Reactions": "Reações", "Read_by": "Lido por", "Read_only": "Somente leitura", + "This_room_is_read_only": "Esta sala é somente leitura", "Read_only_changed_successfully": "Somente leitura foi alterado com sucesso", "Read_only_channel": "Canal somente leitura", "Read_only_group": "Grupo somente de leitura", @@ -3655,6 +3660,7 @@ "Unsafe_Url": "URL não seguro", "Rocket_Chat_Alert": "Alerta Rocket.Chat", "Role": "Função", + "Roles": "Funções", "Role_Editing": "Edição de função", "Role_Mapping": "Mapeamento de funções", "Role_removed": "Função removida", @@ -4423,6 +4429,7 @@ "unarchive-room": "Desarquivar Sala", "unarchive-room_description": "Permissão para desarquivar canais", "Unassigned": "Não atribuído", + "unauthorized": "Não autorizado", "Unavailable": "Indisponível", "Unblock_User": "Desbloquear usuário", "Uncheck_All": "Desmarcar todos", @@ -4875,6 +4882,7 @@ "Your_TOTP_has_been_reset": "Seu TOTP de dois fatores foi redefinido.", "Your_workspace_is_ready": "O seu espaço de trabalho está pronto para usar 🎉", "Zapier": "Zapier", + "registration.page.login.errors.wrongCredentials": "Usuário não encontrado ou senha incorreta", "registration.page.login.errors.loginBlockedForIp": "O login foi temporariamente bloqueado para este IP", "registration.page.login.errors.loginBlockedForUser": "O login foi temporariamente bloqueado para este Usuário", "registration.page.login.errors.licenseUserLimitReached": "O número máximo de usuários foi atingido.", @@ -4886,6 +4894,7 @@ "registration.component.resetPassword": "Redefinir senha", "registration.component.form.username": "Nome de usuário", "registration.component.form.name": "Nome", + "registration.component.form.userAlreadyExist": "O nome de usuário já existe. Tente outro nome de usuário.", "registration.component.form.emailAlreadyExists": "E-mail já existe", "registration.component.form.usernameAlreadyExists": "O nome de usuário já existe. Tente outro nome de usuário.", "registration.component.form.invalidEmail": "O e-mail informado é inválido", diff --git a/packages/i18n/src/locales/pt.i18n.json b/packages/i18n/src/locales/pt.i18n.json index 0d8b0884a477b..d60379ef7ed9a 100644 --- a/packages/i18n/src/locales/pt.i18n.json +++ b/packages/i18n/src/locales/pt.i18n.json @@ -390,6 +390,7 @@ "Apply_and_refresh_all_clients": "Aplicar e actualizar todos os clientes", "Apps": "Aplicações", "Apps_context_installed": "Instalado", + "Apps_context_premium": "Empreendimento", "Apps_Engine_Version": "Versão do Motor da Aplicação", "Apps_Marketplace_Deactivate_App_Prompt": "Queres mesmo desativar esta aplicação?", "Apps_Marketplace_Login_Required_Description": "A compra de aplicações do Marketplace Rocket.Chat requer o registo no sua área de trabalho e o login.", @@ -1326,6 +1327,7 @@ "FEDERATION_Public_Key_Description": "Esta é a chave que pode partilhar com outros.", "FEDERATION_Status": "Estado", "Retry_Count": "Contagem de tentativas", + "Federation_Matrix_enabled": "Activo", "Field": "Campo", "Field_removed": "Campo removido", "Field_required": "Campo requerido", @@ -1723,6 +1725,12 @@ "Layout_Terms_of_Service": "Termos de Serviço", "LDAP": "LDAP", "LDAP_Description": "LDAP é um banco de dados hierárquico que muitas empresas usam para fornecer single sign on - uma facilidade para compartilhar uma senha entre múltiplos sites e serviços. Para exemplos e informações de configurações avançadas, por favor consulte nosso wiki: https://rocket.chat/docs/administrator-guides/authentication/ldap/", + "LDAP_Connection_Encryption": "Criptografia", + "LDAP_Connection_Timeouts": "Tempos limite", + "LDAP_UserSearch": "Pesquisa de usuário", + "LDAP_DataSync_BackgroundSync": "Sincronização fundo", + "LDAP_Server_Type": "Tipo de servidor", + "LDAP_Server_Type_Other": "Outro", "LDAP_Authentication": "Habilitar", "LDAP_Authentication_Password": "Senha", "LDAP_Authentication_UserDN": "DN do utilizador", @@ -3070,6 +3078,8 @@ "Visitor_Navigation": "Navegação do convidado", "Visitor_page_URL": "URL da página do convidado", "Visitor_time_on_site": "Tempo do convidado no site", + "VoIP_Management_Server_Username": "Nome de utilizador", + "VoIP_Management_Server_Password": "Palavra-passe", "Wait_activation_warning": "Antes de se conectar, a sua conta deverá ser manualmente activa por um administrador.", "Warnings": "Alertas", "We_are_offline_Sorry_for_the_inconvenience": "Estamos offline. Pedimos desculpa pela inconveniência.", @@ -3165,6 +3175,7 @@ "registration.component.form.emailOrUsername": "Email ou nome de utilizador", "registration.component.form.username": "Nome de utilizador", "registration.component.form.name": "Nome", + "registration.component.form.userAlreadyExist": "O nome de utilizador já existe. Por favor, tente outro nome de utilizador.", "registration.component.form.emailAlreadyExists": "Email já registado", "registration.component.form.usernameAlreadyExists": "O nome de utilizador já existe. Por favor, tente outro nome de utilizador.", "registration.component.form.invalidEmail": "O email introduzido é inválido", diff --git a/packages/i18n/src/locales/ro.i18n.json b/packages/i18n/src/locales/ro.i18n.json index ab8234afc67b3..21e950c876782 100644 --- a/packages/i18n/src/locales/ro.i18n.json +++ b/packages/i18n/src/locales/ro.i18n.json @@ -320,6 +320,7 @@ "Apply": "aplica", "Apply_and_refresh_all_clients": "Se aplică și actualizați toți clienții", "Apps": "Aplicații", + "Apps_context_premium": "Afacere", "Apps_Settings": "Setările aplicației", "Apps_WhatIsIt": "Aplicații: Ce sunt acestea?", "Apps_WhatIsIt_paragraph1": "O nouă pictogramă în zona de administrare! Ce înseamnă aceasta și ce sunt aplicațiile?", @@ -1098,6 +1099,7 @@ "FEDERATION_Domain": "Domeniu", "FEDERATION_Status": "Stare", "Retry_Count": "Retry Count", + "Federation_Matrix_enabled": "Activat", "Field": "Camp", "Field_removed": "câmp îndepărtat", "Field_required": "Câmp obligatoriu", @@ -1456,6 +1458,10 @@ "Layout_Sidenav_Footer_Dark_description": "Dimensiunea footer-ului este de 260 x 70px", "Layout_Terms_of_Service": "Condții de utilizare", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Encriptare", + "LDAP_DataSync_BackgroundSync": "Background Sync", + "LDAP_Server_Type": "Tip server", + "LDAP_Server_Type_Other": "Alte", "LDAP_Authentication": "Permite", "LDAP_Authentication_Password": "Parolă", "LDAP_Authentication_UserDN": "DN utilizator", @@ -1986,6 +1992,7 @@ "Reactions": "Reacții", "Read_by": "Citește de", "Read_only": "Numai citire", + "This_room_is_read_only": "Această cameră este numai pentru citire", "Read_only_changed_successfully": "Citirea a fost modificată cu succes", "Read_only_channel": "Numai canal de citire", "Read_only_group": "Citiți numai grupul", @@ -2661,6 +2668,8 @@ "Visitor_Navigation": "Navigare vizitator", "Visitor_page_URL": "Pagina URL a vizitatorului", "Visitor_time_on_site": "Timpul vizitatorului pe site", + "VoIP_Management_Server_Username": "Utilizator", + "VoIP_Management_Server_Password": "Parolă", "Wait_activation_warning": "Ca să vă puteți autentifica, contul dumneavoastră trebuie să fie activat manual de către un administrator.", "Warnings": "Avertismente", "We_are_offline_Sorry_for_the_inconvenience": "Suntem offline. Scuze pentru neplăcerile provocate.", @@ -2742,6 +2751,7 @@ "registration.component.resetPassword": "Resetează parola", "registration.component.form.username": "Utilizator", "registration.component.form.name": "Nume", + "registration.component.form.userAlreadyExist": "Nume de utilizator deja existent. Încercați un alt nume de utilizator.", "registration.component.form.emailAlreadyExists": "Adresa de e-mail există deja", "registration.component.form.usernameAlreadyExists": "Nume de utilizator deja existent. Încercați un alt nume de utilizator.", "registration.component.form.invalidEmail": "Adresa de email folosită este invalidă", diff --git a/packages/i18n/src/locales/ru.i18n.json b/packages/i18n/src/locales/ru.i18n.json index da6f72b0e15b6..b014b6da9d564 100644 --- a/packages/i18n/src/locales/ru.i18n.json +++ b/packages/i18n/src/locales/ru.i18n.json @@ -1,7 +1,7 @@ { "500": "Внутренняя ошибка сервера", - "__count__empty_rooms_will_be_removed_automatically": "{{count}}пустые комнаты будут удалены автоматически.", "__count__message_pruned_few": "{{count}} сообщений удалено", + "__count__empty_rooms_will_be_removed_automatically": "{{count}}пустые комнаты будут удалены автоматически.", "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} пустых чатов будет удалено автоматически:
{{rooms}}.", "__count__message_pruned_one": "{{count}} сообщение удалено", "__count__message_pruned_other": "{{count}} сообщений удалено", @@ -11,8 +11,8 @@ "__usersCount__member_joined_other": "+ {{count}} участников присоединилось", "__usersCount__people_will_be_invited": "{{usersCount}} человек будет приглашено", "__username__is_no_longer__role__defined_by__user_by_": "{{username}} больше не {{role}} по решению {{user_by}}", - "__usersCount__member_joined_many": "+ {{count}} участников присоединилось", "__username__was_set__role__by__user_by_": "{{username}} был установлен {{role}} по решению {{user_by}}", + "__usersCount__member_joined_many": "+ {{count}} участников присоединилось", "This_room_encryption_has_been_enabled_by__username_": "Шифрование этой комнаты было включено {{username}}", "This_room_encryption_has_been_disabled_by__username_": "Шифрование этой комнаты было отключено {{username}}", "Enabled_E2E_Encryption_for_this_room": "включено шифрование E2E для этой комнаты", @@ -385,9 +385,11 @@ "Allow_Invalid_SelfSigned_Certs_Description": "Разрешить недействительные и самоподписанные SSL сертификаты для проверки ссылок и предосмотра.", "Allow_Marketing_Emails": "Разрешить маркетинговые E-mail", "Allow_Online_Agents_Outside_Business_Hours": "Разрешить агентов в сети вне рабочих часов", + "Apps_Count_Enabled_many": "{{count}} приложений(-я) включено", "Allow_Online_Agents_Outside_Office_Hours": "Разрешить агентов в сети вне рабочего времени", "Allow_Save_Media_to_Gallery": "Разрешить сохранять медиа данные в галерее", "Allow_switching_departments": "Разрешить посетителю сменить отдел", + "Private_Apps_Count_Enabled_many": "{{count}} приватных приложений включено", "Almost_done": "Почти сделано", "Alphabetical": "По алфавиту", "bold": "жирный", @@ -415,11 +417,13 @@ "API_Analytics": "Аналитика", "API_CORS_Origin": "Заголовок CORS Origin", "API_Apply_permission_view-outside-room_on_users-list": "Примените разрешение `view-outside-room` к api `users.list`", + "Apps_Count_Enabled_few": "{{count}} приложений(-я) включено", "API_Apply_permission_view-outside-room_on_users-list_Description": "Временная настройка для принудительного разрешения. Будет удалена в следующем крупном обновлении в рамках изменения для постоянного применения разрешения", "API_Default_Count": "Количество по-умолчанию", "API_Default_Count_Description": "Количество результатов REST API для использования по-умолчанию, если потребитель не указал его.", "API_Drupal_URL": "URL сервера Drupal", "API_Drupal_URL_Description": "Пример: `https://domain.com` (без слэша в конце)", + "Private_Apps_Count_Enabled_few": "{{count}} приватных приложений включено", "API_Embed": "Встроенный просмотр ссылок", "API_Embed_Description": "Включить ли предварительный просмотр ссылок, когда пользователь выкладывает ссылку на веб-сайт.", "API_EmbedIgnoredHosts": "Вставить игнорируемые хосты", @@ -446,21 +450,18 @@ "API_GitHub_Enterprise_URL_Description": "Пример: `https://domain.com` (без завершающего слеша)", "API_Gitlab_URL": "GitLab URL", "API_Personal_Access_Token_Generated": "Идентификатор персонального доступа успешно сгенерирован", - "Apps_Count_Enabled_few": "{{count}} приложений(-я) включено", "API_Personal_Access_Token_Generated_Text_Token_s_UserId_s": "Пожалуйста, аккуратно сохраните токен, так как вы больше не сможете его просматривать.
Токен: {{token}}
Ваш Id пользователя: {{userId}} ", - "Apps_Count_Enabled_many": "{{count}} приложений(-я) включено", "API_Personal_Access_Token_Name": "Идентификатор имени персонального доступа", "API_Personal_Access_Tokens_Regenerate_It": "Пересоздать токен", - "Private_Apps_Count_Enabled_few": "{{count}} приватных приложений включено", "API_Personal_Access_Tokens_Regenerate_Modal": "Если вы потеряли или забыли свой токен, вы можете его восстановить, но помните, что все приложения, использующие этот токен, должны быть обновлены", "API_Personal_Access_Tokens_Remove_Modal": "Вы действительно хотите удалить этот токен доступа?", "API_Personal_Access_Tokens_To_REST_API": "Личные токены доступа к rest API", - "Private_Apps_Count_Enabled_many": "{{count}} приватных приложений включено", "API_Rate_Limiter": "Ограничение частоты запросов к API", "API_Shield_Types": "Типы бейджей", "API_Shield_Types_Description": "Типы бейджей в виде списка с разделением запятой, выберите `online`, `channel` либо используйте `*` для выбора всех", "Apps_Framework_Development_Mode": "Включить режим разработки", "API_Shield_user_require_auth": "Требование аутентификации для users shields", + "Calls_in_queue_many": "{{count}} Звонков в очереди", "API_Token": "API Токен", "Apps_Framework_Development_Mode_Description": "Режим разработки позволяет устанавливать Приложения не из Торговой площадки Rocket.Chat.", "API_Tokenpass_URL": "Tokenpass Server URL", @@ -498,6 +499,7 @@ "App_support_url": "URL поддержки", "App_Url_to_Install_From": "Установить с URL", "App_Url_to_Install_From_File": "Установить из файла", + "Calls_in_queue_few": "{{count}} Звонков в очереди", "App_user_not_allowed_to_login": "Пользователям приложений не разрешается напрямую входить в систему.", "Appearance": "Внешний вид", "Application_added": "Приложение добавлено", @@ -510,6 +512,7 @@ "Apps_context_installed": "Установлен", "Apps_context_requested": "Запрошено", "Apps_context_private": "Приватные приложения", + "Apps_context_premium": "Корпорация", "Apps_Count_Enabled_one": "{{count}} приложение включено", "Apps_Count_Enabled_other": "{{count}} приложений(-я) включено", "Private_Apps_Count_Enabled_one": "{{count}} приватное приложение включено", @@ -551,7 +554,6 @@ "Apps_License_Message_appId": "Лицензия на это приложение не выдавалась", "Apps_License_Message_bundle": "Лицензия выдана на пакет, не содержащий приложение", "Apps_License_Message_expire": "Лицензия больше не действительна и нуждается в продлении", - "Calls_in_queue_many": "{{count}} Звонков в очереди", "Apps_License_Message_maxSeats": "Лицензия не рассчитана на текущее количество активных пользователей. Пожалуйста, увеличьте количество мест", "Apps_License_Message_publicKey": "Произошла ошибка при попытке расшифровать лицензию. Пожалуйста, синхронизируйте рабочее пространство в службах подключения и повторите попытку", "Apps_License_Message_renewal": "Срок действия лицензии истек и ее необходимо продлить", @@ -603,7 +605,6 @@ "Apps_Permissions_livechat-message_read": "Доступ к информации о сообщениях Livechat", "Apps_Permissions_livechat-message_write": "Изменение информации о сообщениях Livechat", "Apps_Permissions_livechat-room_read": "Доступ к информации о чате Livechat", - "Calls_in_queue_few": "{{count}} Звонков в очереди", "Apps_Permissions_livechat-room_write": "Изменение информации о чате Livechat", "Apps_Permissions_livechat-department_read": "Доступ к информации отдела Livechat", "Apps_Permissions_livechat-department_multiple": "Доступ к информации нескольких отделов Livechat", @@ -1768,6 +1769,7 @@ "Enter_Normal": "Обычный режим (отправка по Enter)", "Enter_to": "Войти в", "Enter_your_E2E_password": "Введите пароль E2E", + "message_counter_many": "{{count}} сообщения", "Entertainment": "Развлечения", "Error": "Ошибка", "Error_something_went_wrong": "Ой! Что-то пошло не так. Пожалуйста, перезагрузите страницу или обратитесь к администратору.", @@ -1816,6 +1818,7 @@ "error-forwarding-department-target-not-allowed": "Переадресация в целевой отдел не допускается.", "error-guests-cant-have-other-roles": "Гостевые пользователи не могут иметь других ролей.", "error-import-file-extract-error": "Не удалось извлечь файл импорта.", + "meteor_status_reconnect_in_many": "пытается снова через {{count}} секунд ...", "error-import-file-is-empty": "Импортированный файл кажется пустым.", "error-import-file-missing": "Импортируемый файл не найден по указанному пути.", "error-importer-not-defined": "Импортер не был определен правильно, отсутствует класс импорта.", @@ -1910,6 +1913,7 @@ "error-this-is-not-a-livechat-room": "Это не Livechat комната", "error-token-already-exists": "Токен с этим именем уже существует", "error-token-does-not-exists": "Токен не существует", + "message_counter_few": "{{count}} сообщения", "error-too-many-requests": "Ошибка, слишком много запросов. вы должны подождать {{seconds}} секунд перед тем, как попробовать снова.", "error-transcript-already-requested": "Транскрипт уже запрошен", "error-unpinning-message": "Сообщение не может быть откреплено", @@ -1962,6 +1966,7 @@ "Extension_Number": "Номер расширения", "Extension_Status": "Статус расширения", "External": "Внешний", + "meteor_status_reconnect_in_few": "пытается снова через {{count}} секунд ...", "External_Domains": "Внешние Домены", "External_Queue_Service_URL": "URL внешнего сервера очередей", "External_Service": "Внешний сервис", @@ -2010,6 +2015,7 @@ "FEDERATION_Test_Setup_Success": "Ваша федерация работает, и другие серверы могут найти вас!", "Retry_Count": "Число повторных попыток", "Federation_Matrix": "Федерация V2", + "Federation_Matrix_enabled": "Включено", "Field": "Поле", "Field_removed": "Поле удалено", "Field_required": "Обязательное поле", @@ -2104,7 +2110,6 @@ "Finish": "Завершить", "Finish_Registration": "Завершение регистрации", "First_Channel_After_Login": "Открыть канал после авторизации", - "message_counter_many": "{{count}} сообщения", "First_response_time": "Время первого ответа", "Flags": "Флаги", "Follow_message": "Подписаться на сообщение", @@ -2163,7 +2168,6 @@ "get-password-policy-mustContainAtLeastOneSpecialCharacter": "Пароль должен содержать как минимум один специальный символ", "get-password-policy-mustContainAtLeastOneUppercase": "Пароль должен содержать как минимум одну заглавную букву", "get-server-info": "Получить информацию о сервере", - "meteor_status_reconnect_in_many": "пытается снова через {{count}} секунд ...", "github_no_public_email": "В вашей учетной записи GitHub отсутствует публично доступный адрес электронной почты", "github_HEAD": "HEAD", "Give_a_unique_name_for_the_custom_oauth": "Выберите имя OAuth сервиса", @@ -2261,7 +2265,6 @@ "Ignore_Two_Factor_Authentication": "Игнорировать двухфакторную авторизацию", "Images": "Изображения", "IMAP_intercepter_already_running": "Перехватчик IMAP уже запущен", - "message_counter_few": "{{count}} сообщения", "IMAP_intercepter_Not_running": "Перехватчик IMAP не запущен", "Impersonate_next_agent_from_queue": "Выполните олицетворение следующего агента из очереди", "Impersonate_user": "Представляться пользователем", @@ -2337,7 +2340,6 @@ "Install": "Устанавить", "Install_Extension": "Установить расширение", "Install_FxOs": "Установить Rocket.Chat на Firefox", - "meteor_status_reconnect_in_few": "пытается снова через {{count}} секунд ...", "Install_FxOs_done": "Отлично! Теперь вы можете использовать Rocket.Chat через иконку на вашем рабочем столе. Развлекайтесь вместе с Rocket.Chat!", "Install_FxOs_error": "Извините, что-то пошло не так! Появилась следующая ошибка:", "Install_FxOs_follow_instructions": "Подтвердите установку приложения на ваше устройство (при запросе нажмите \"Установить\").", @@ -3374,6 +3376,7 @@ "Organization_Name": "Название организации", "Organization_Type": "Тип организации", "Original": "Оригинальный", + "OS": "ОС", "OS_Arch": "Архитектура ОС", "OS_Cpus": "Количество процессоров в ОС", "OS_Freemem": "Свободное количество памяти", @@ -3504,6 +3507,7 @@ "Privacy": "Приватность", "Privacy_Policy": "Политика конфиденциальности", "Private": "Закрытый канал", + "Private_channels": "Закрытый канал", "Private_Apps": "Приватные приложения", "Private_Channel": "Закрытый канал", "Private_Channels": "Закрытый канал", @@ -3581,6 +3585,7 @@ "Reactions": "Реакции", "Read_by": "Читать", "Read_only": "Только для чтения", + "This_room_is_read_only": "Этот чат доступен только для чтения", "Read_only_changed_successfully": "Режим \"только для чтения\" успешно изменен", "Read_only_channel": "Канал только для чтения", "Read_only_group": "Группа только для чтения", @@ -3746,6 +3751,7 @@ "Unsafe_Url": "Небезопасный URL", "Rocket_Chat_Alert": "Rocket.Chat Alert", "Role": "Роль", + "Roles": "Роли", "Role_Editing": "Редактировать роль", "Role_Mapping": "Сопоставление ролей", "Role_removed": "Роль удалена", @@ -4990,6 +4996,7 @@ "registration.component.resetPassword": "Восстановить пароль", "registration.component.form.username": "Имя пользователя", "registration.component.form.name": "Имя", + "registration.component.form.userAlreadyExist": "Такой пользователь уже существует. Пожалуйста, выберите другое имя.", "registration.component.form.emailAlreadyExists": "Такой адрес электронной почты уже используется", "registration.component.form.usernameAlreadyExists": "Такой пользователь уже существует. Пожалуйста, выберите другое имя.", "registration.component.form.invalidEmail": "Введен некорректный адрес электронной почты", diff --git a/packages/i18n/src/locales/sk-SK.i18n.json b/packages/i18n/src/locales/sk-SK.i18n.json index ed0b76c0e3b24..8e80bd7a0affc 100644 --- a/packages/i18n/src/locales/sk-SK.i18n.json +++ b/packages/i18n/src/locales/sk-SK.i18n.json @@ -322,6 +322,7 @@ "Apply": "Použiť", "Apply_and_refresh_all_clients": "Použiť a obnoviť všetkých klientov", "Apps": "aplikácie", + "Apps_context_premium": "podnik", "Apps_Settings": "Nastavenia aplikácií", "Apps_WhatIsIt": "Aplikácie: Čo sú zač?", "Apps_WhatIsIt_paragraph1": "Nová ikona v administratívnej oblasti! Čo to znamená a čo sú aplikácie?", @@ -1109,6 +1110,7 @@ "FEDERATION_Domain": "Doména", "FEDERATION_Status": "Postavenie", "Retry_Count": "Opakovať počet", + "Federation_Matrix_enabled": "povolené", "Field": "Lúka", "Field_removed": "Pole bolo odstránené", "Field_required": "Vyžaduje sa pole", @@ -1467,6 +1469,10 @@ "Layout_Sidenav_Footer_Dark_description": "Veľkosť päty je 260 x 70 pixlov", "Layout_Terms_of_Service": "Podmienky služby", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "šifrovanie", + "LDAP_DataSync_BackgroundSync": "Synchronizácia pozadia", + "LDAP_Server_Type": "Typ servera", + "LDAP_Server_Type_Other": "ostatné", "LDAP_Authentication": "umožniť", "LDAP_Authentication_Password": "Heslo", "LDAP_Authentication_UserDN": "DN užívateľa", @@ -1996,6 +2002,7 @@ "Reactions": "reakcie", "Read_by": "Prečítajte si", "Read_only": "Iba na čítanie", + "This_room_is_read_only": "Táto miestnosť je iba na čítanie", "Read_only_changed_successfully": "Čítanie bolo úspešne zmenené", "Read_only_channel": "Kanál iba na čítanie", "Read_only_group": "Skupina iba na čítanie", @@ -2496,6 +2503,7 @@ "Unarchive": "Zrušiť archiváciu", "unarchive-room": "Rozbaľovacia miestnosť", "unarchive-room_description": "Povolenie na dearchizáciu kanálov", + "unauthorized": "Nie je povolené", "Unblock_User": "Odblokovať používateľa", "Unignore": "prestať ignorovať", "Uninstall": "Uninstall", @@ -2671,6 +2679,8 @@ "Visitor_Navigation": "Navigácia pre návštevníkov", "Visitor_page_URL": "Adresa URL stránky návštevníka", "Visitor_time_on_site": "Čas návštevnosti na stránkach", + "VoIP_Management_Server_Username": "Používateľské meno", + "VoIP_Management_Server_Password": "Heslo", "Wait_activation_warning": "Skôr ako sa môžete prihlásiť, váš účet musí byť ručne aktivovaný správcom.", "Warnings": "varovanie", "We_are_offline_Sorry_for_the_inconvenience": "Sme offline. Ospravedlňujem sa za nepríjemnosť.", @@ -2745,6 +2755,7 @@ "Your_push_was_sent_to_s_devices": "Posun bol odoslaný na zariadenia%s", "Your_server_link": "Váš odkaz na server", "Your_workspace_is_ready": "Váš pracovný priestor je pripravený na použitie 🎉", + "registration.page.login.errors.wrongCredentials": "Používateľ nebol nájdený alebo nesprávne heslo", "registration.page.registration.waitActivationWarning": "Skôr ako sa môžete prihlásiť, váš účet musí byť ručne aktivovaný správcom.", "registration.page.resetPassword.sent": "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.", "registration.component.login": "Prihlásiť sa", @@ -2752,6 +2763,7 @@ "registration.component.resetPassword": "Obnoviť heslo", "registration.component.form.username": "Používateľské meno", "registration.component.form.name": "Názov", + "registration.component.form.userAlreadyExist": "Užívateľské meno už existuje. Skúste iné používateľské meno.", "registration.component.form.emailAlreadyExists": "Email už existuje", "registration.component.form.usernameAlreadyExists": "Užívateľské meno už existuje. Skúste iné používateľské meno.", "registration.component.form.invalidEmail": "Zadaný e-mail je neplatný", diff --git a/packages/i18n/src/locales/sl-SI.i18n.json b/packages/i18n/src/locales/sl-SI.i18n.json index 781710d36d501..d08c083ee9ceb 100644 --- a/packages/i18n/src/locales/sl-SI.i18n.json +++ b/packages/i18n/src/locales/sl-SI.i18n.json @@ -318,6 +318,7 @@ "Apply": "Uporabi", "Apply_and_refresh_all_clients": "Dodaj in osveži vse stranke", "Apps": "Aplikacije", + "Apps_context_premium": "Podjetje", "Apps_Settings": "Nastavitve aplikacije", "Apps_WhatIsIt": "Aplikacije: kaj so?", "Apps_WhatIsIt_paragraph1": "Nova ikona v upravnem območju! Kaj to pomeni in kakšne so aplikacije?", @@ -1090,6 +1091,7 @@ "FEDERATION_Domain": "Domena", "FEDERATION_Status": "Stanje", "Retry_Count": "Število ponovnih poskusov", + "Federation_Matrix_enabled": "Omogočeno", "Field": "Polje", "Field_removed": "Polje je odstranjeno", "Field_required": "Polje je zahtevano", @@ -1447,6 +1449,10 @@ "Layout_Sidenav_Footer_Dark_description": "Velikost noge 260 x 70 px", "Layout_Terms_of_Service": "Pogoji storitev", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Šifriranje", + "LDAP_DataSync_BackgroundSync": "Sinhronizacija v ozadju", + "LDAP_Server_Type": "Vrsta strežnika", + "LDAP_Server_Type_Other": "Drugo", "LDAP_Authentication": "Omogči", "LDAP_Authentication_Password": "Geslo", "LDAP_Authentication_UserDN": "Uporabnik DN", @@ -1976,6 +1982,7 @@ "Reactions": "Odzivi", "Read_by": "Prebrano", "Read_only": "Samo za branje", + "This_room_is_read_only": "Ta soba je samo za branje", "Read_only_changed_successfully": "Uspešno spremenjeno v samo za branje", "Read_only_channel": "Kanal samo za branje", "Read_only_group": "Skupina samo za branje", @@ -2476,6 +2483,7 @@ "Unarchive": "Odarhiviraj", "unarchive-room": "Odarhiviraj sobo", "unarchive-room_description": "Dovoljenje za odarhiviranje kanalov", + "unauthorized": "Brez pooblastila ", "Unblock_User": "Odblokiraj uporabnika", "Unignore": "Unignore", "Uninstall": "Odstrani", @@ -2651,6 +2659,8 @@ "Visitor_Navigation": "Navigacija obiskovalcev", "Visitor_page_URL": "URL spletnega mesta za obiskovalce", "Visitor_time_on_site": "Čas, ki ga je obiskovalec porabil na spletni strani", + "VoIP_Management_Server_Username": "Uporabniško ime", + "VoIP_Management_Server_Password": "Geslo", "Wait_activation_warning": "Preden se lahko prijavite, mora skrbnik ročno aktivirati vaš račun.", "Warnings": "Opozorila", "We_are_offline_Sorry_for_the_inconvenience": "Brez povezave. Oprostite za nevšečnosti.", @@ -2725,6 +2735,7 @@ "Your_push_was_sent_to_s_devices": "Vaš potisk je bil poslan v naprave %s", "Your_server_link": "Povezava strežnika", "Your_workspace_is_ready": "Vaš delovni prostor je pripravljen za uporabo 🎉", + "registration.page.login.errors.wrongCredentials": "Napačno geslo ali neznan uporabnik", "registration.page.registration.waitActivationWarning": "Preden se lahko prijavite, mora skrbnik ročno aktivirati vaš račun.", "registration.page.resetPassword.sent": "Č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. ", "registration.component.login": "Prijava", @@ -2732,6 +2743,7 @@ "registration.component.resetPassword": "Ponastavitev gesla", "registration.component.form.username": "Uporabniško ime", "registration.component.form.name": "Ime", + "registration.component.form.userAlreadyExist": "Uporabniško ime že obstaja. Poskusite drugo uporabniško ime.", "registration.component.form.emailAlreadyExists": "E-potšni naslov že obstaja", "registration.component.form.usernameAlreadyExists": "Uporabniško ime že obstaja. Poskusite drugo uporabniško ime.", "registration.component.form.invalidEmail": "Vneseni e-poštni naslov je neveljaven", diff --git a/packages/i18n/src/locales/sq.i18n.json b/packages/i18n/src/locales/sq.i18n.json index 202d02670595c..80ff384d4cc45 100644 --- a/packages/i18n/src/locales/sq.i18n.json +++ b/packages/i18n/src/locales/sq.i18n.json @@ -320,6 +320,7 @@ "Apply": "aplikoni", "Apply_and_refresh_all_clients": "Aplikoni dhe rifreskoni të gjithë klientët", "Apps": "Apps", + "Apps_context_premium": "Ndërmarrje", "Apps_Settings": "Cilësimet e aplikacionit", "Apps_WhatIsIt": "Aplikacionet: Cilat janë ato?", "Apps_WhatIsIt_paragraph1": "Një ikonë e re në zonën e administratës! Çfarë do të thotë kjo dhe cilat janë Apps?", @@ -1100,6 +1101,7 @@ "FEDERATION_Domain": "fushë", "FEDERATION_Status": "status", "Retry_Count": "Përsëritni Numrin", + "Federation_Matrix_enabled": "enabled", "Field": "fushë", "Field_removed": "Field hequr", "Field_required": "Fusha e kërkuar", @@ -1456,6 +1458,10 @@ "Layout_Sidenav_Footer_Dark_description": "Madhësia Footer është 260 x 70px", "Layout_Terms_of_Service": "Kushtet e Shërbimit", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "encryption", + "LDAP_DataSync_BackgroundSync": "Sinkronizimi i sfondit", + "LDAP_Server_Type": "Lloji i serverit", + "LDAP_Server_Type_Other": "tjetër", "LDAP_Authentication": "mundësoj", "LDAP_Authentication_Password": "Fjalëkalim", "LDAP_Authentication_UserDN": "Përdoruesi DN", @@ -1986,6 +1992,7 @@ "Reactions": "reagimet", "Read_by": "Lexo nga", "Read_only": "Lexo vetem", + "This_room_is_read_only": "Kjo dhomë lexohet vetëm", "Read_only_changed_successfully": "Lexo vetëm ndryshoi me sukses", "Read_only_channel": "Lexo vetëm kanalin", "Read_only_group": "Lexo Grupin Vetëm", @@ -2662,6 +2669,8 @@ "Visitor_Navigation": "Visitor Navigation", "Visitor_page_URL": "faqe Visitor URL", "Visitor_time_on_site": "Ora Visitor në faqen", + "VoIP_Management_Server_Username": "Emri i përdoruesit", + "VoIP_Management_Server_Password": "Fjalëkalim", "Wait_activation_warning": "Para se ju të identifikoheni, llogaria juaj duhet të aktivizohet nga një administrator.", "Warnings": "Paralajmërimet", "We_are_offline_Sorry_for_the_inconvenience": "Ne jemi offline. Na vjen keq për bezdisjen.", @@ -2744,6 +2753,7 @@ "registration.component.resetPassword": "Rivendos fjalëkalimin", "registration.component.form.username": "Emri i përdoruesit", "registration.component.form.name": "Emër", + "registration.component.form.userAlreadyExist": "Emri i përdoruesit tashmë ekziston. Të lutem provo një tjetër emër përdoruesi.", "registration.component.form.emailAlreadyExists": "Emaili ekziston", "registration.component.form.usernameAlreadyExists": "Emri i përdoruesit tashmë ekziston. Të lutem provo një tjetër emër përdoruesi.", "registration.component.form.invalidEmail": "Email-i vendosur është i pavlefshëm", diff --git a/packages/i18n/src/locales/sr.i18n.json b/packages/i18n/src/locales/sr.i18n.json index 80c9b9ae65fb9..adec89c9568ba 100644 --- a/packages/i18n/src/locales/sr.i18n.json +++ b/packages/i18n/src/locales/sr.i18n.json @@ -82,6 +82,7 @@ "Accounts_OAuth_GitHub_Enterprise_secret": "Тајна клијента", "Accounts_OAuth_Github_id": "Ид клијента", "Accounts_OAuth_Github_secret": "Тајна клијента", + "Accounts_OAuth_Gitlab": "ОАутх Омогућено", "Accounts_OAuth_Gitlab_identity_path": "Путања до идентитета", "Accounts_OAuth_Gitlab_secret": "Тајна клијента", "Accounts_OAuth_Google_callback_url": "Гоогле УРЛ за повратни позив", @@ -255,6 +256,7 @@ "Apply": "Примени", "Apply_and_refresh_all_clients": "Примени и освежи све клијенте", "Apps": "Програми", + "Apps_context_premium": "Предузеће", "Apps_Settings": "Подешавања апликације", "Apps_WhatIsIt": "Апликације: Шта су оне?", "Apps_WhatIsIt_paragraph1": "Нова икона у области администрације! Шта ово значи и шта су апликације?", @@ -998,6 +1000,7 @@ "FEDERATION_Domain": "Домен", "FEDERATION_Status": "Стање", "Retry_Count": "Покушајте поново", + "Federation_Matrix_enabled": "Оmogućeno", "Field": "Поље", "Field_removed": "Поље уклоњено", "Field_required": "Неопходно поље", @@ -1017,6 +1020,7 @@ "FileUpload_Error": "Грешка при постављању датотеке", "FileUpload_File_Empty": "Датотека је празна", "FileUpload_FileSystemPath": "Системска путања", + "FileUpload_GoogleStorage_Proxy_Avatars": "Проки Аватарс", "FileUpload_GoogleStorage_Secret": "Гоогле Стораге Сецрет", "FileUpload_GoogleStorage_Secret_Description": "Пратите [ова упутства](https://github.com/CulturalMe/meteor-slingshot#google-cloud) и залепите резултат овде.", "FileUpload_MaxFileSize": "Максимална величина уплоад сизе (ин битес)", @@ -1308,6 +1312,10 @@ "Layout_Sidenav_Footer_Dark_description": "Фоотер је величине 260 х 70 пиксела", "Layout_Terms_of_Service": "Услови коришћења", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Шифровање", + "LDAP_DataSync_BackgroundSync": "Синхронизација позадине", + "LDAP_Server_Type": "Тип сервера", + "LDAP_Server_Type_Other": "Друго", "LDAP_Authentication": "Омогући", "LDAP_Authentication_Password": "Лозинка", "LDAP_Authentication_UserDN": "Корисник ДН", @@ -1352,6 +1360,7 @@ "LDAP_Login_Fallback_Description": "Ако пријава на ЛДАП-у није успешна, покушајте да се пријавите у систему подразумеваног / локалног налога. Помаже када је ЛДАП из неког разлога пао.", "LDAP_Merge_Existing_Users": "Споји постојеће кориснике", "LDAP_Merge_Existing_Users_Description": "* Опрез! * Када увозите корисника из ЛДАП-а и корисник са истим корисничким именом већ постоји, ЛДАП инфо и лозинка ће бити постављени у постојећи корисник.", + "LDAP_Port": "лука", "LDAP_Reconnect": "Поново повежите", "LDAP_Reconnect_Description": "Покушајте да се аутоматски повежете када је веза прекинута из неког разлога током извршавања операција", "LDAP_Reject_Unauthorized": "Одбиј неовлашћено", @@ -1817,6 +1826,7 @@ "Reactions": "reakcije", "Read_by": "Прочитајте", "Read_only": "Само за читање", + "This_room_is_read_only": "Ова соба је само за читање", "Read_only_changed_successfully": "Читање је само успешно промењено", "Read_only_channel": "Само за читање канала", "Read_only_group": "Група само за читање", @@ -2472,6 +2482,8 @@ "Visitor_Navigation": "посетилац Навигација", "Visitor_page_URL": "Посетилац веб страница", "Visitor_time_on_site": "Посетилац време на сајту", + "VoIP_Management_Server_Username": "Корисничко име", + "VoIP_Management_Server_Password": "Лозинка", "Wait_activation_warning": "Пре него што се пријавите, ваш налог мора да буде ручно активиран од стране администратора.", "Warnings": "Упозорења", "We_are_offline_Sorry_for_the_inconvenience": "Ми смо онлине. Жао због непријатности.", @@ -2553,6 +2565,7 @@ "registration.component.resetPassword": "Поново постави лозинку", "registration.component.form.username": "Корисничко име", "registration.component.form.name": "Име", + "registration.component.form.userAlreadyExist": "Корисничко име већ постоји. Молимо покушајте друго корисничко име.", "registration.component.form.emailAlreadyExists": "Е-пошта већ постоји", "registration.component.form.usernameAlreadyExists": "Корисничко име већ постоји. Молимо покушајте друго корисничко име.", "registration.component.form.invalidEmail": "Унета је неисправна адреса е-поште", diff --git a/packages/i18n/src/locales/sv.i18n.json b/packages/i18n/src/locales/sv.i18n.json index 83471ec5983c1..4059cf4a19324 100644 --- a/packages/i18n/src/locales/sv.i18n.json +++ b/packages/i18n/src/locales/sv.i18n.json @@ -12,6 +12,7 @@ "__username__was_set__role__by__user_by_": "{{username}} sattes {{role}} av {{user_by}}", "This_room_encryption_has_been_enabled_by__username_": "Rummets kryptering har aktiverats av {{username}}", "This_room_encryption_has_been_disabled_by__username_": "Rummets kryptering har inaktiverats av {{username}}", + "Third_party_login": "Inloggning från tredje part", "Enabled_E2E_Encryption_for_this_room": "aktivera end-to-end-kryptering för rummet", "disabled": "Inaktiverad", "Disabled_E2E_Encryption_for_this_room": "inaktivera end-to-end-kryptering för rummet", @@ -504,6 +505,7 @@ "Apps_context_installed": "Installerad", "Apps_context_requested": "Förfrågningar", "Apps_context_private": "Privata appar", + "Apps_context_premium": "Enterprise", "Apps_Count_Enabled_one": "{{count}} app aktiverad", "Apps_Count_Enabled_other": "{{count}} appar aktiverade", "Private_Apps_Count_Enabled_one": "{{count}} privat app aktiverad", @@ -3836,6 +3838,7 @@ "Privacy_summary": "Integritetsöversikt", "Private": "Privat", "private": "privat", + "Private_channels": "Privata kanaler", "Private_Apps": "Privata appar", "Private_Channel": "Privat kanal", "Private_Channels": "Privata kanaler", @@ -5571,6 +5574,7 @@ "onboarding.component.form.action.next": "Nästa", "onboarding.component.form.action.skip": "Hoppa över det här steget", "onboarding.component.form.action.register": "Registrera", + "onboarding.component.form.action.registerWorkspace": "Registrera arbetsytan", "onboarding.component.form.action.confirm": "Bekräfta", "onboarding.component.form.termsAndConditions": "Jag godkänner <1>villkoren och <3>integritetspolicyn", "onboarding.component.emailCodeFallback": "Fick du inget e-postmeddelande? <1>Skicka igen eller <3>ändra e-postadressen", @@ -5611,6 +5615,7 @@ "onboarding.form.adminInfoForm.fields.password.placeholder": "Skapa lösenord", "onboarding.form.adminInfoForm.fields.keepPosted.label": "Håll mig informerad om Rocket.Chat-uppdateringar", "onboarding.form.awaitConfirmationForm.title": "Väntar på bekräftelse", + "onboarding.form.awaitConfirmationForm.content.securityCode": "Säkerhetskod", "onboarding.form.organizationInfoForm.title": "Organisationsinfo", "onboarding.form.organizationInfoForm.subtitle": "Bara lite till. Vi behöver den här informationen för att anpassa din arbetsyta", "onboarding.form.organizationInfoForm.fields.organizationName.label": "Organisationsnamn", @@ -5623,6 +5628,7 @@ "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "Välj", "onboarding.form.organizationInfoForm.fields.country.label": "Land", "onboarding.form.organizationInfoForm.fields.country.placeholder": "Välj", + "onboarding.form.registerOfflineForm.title": "Registrera dig offline", "onboarding.form.registeredServerForm.title": "Registrera din server", "onboarding.form.registeredServerForm.included.push": "Mobila push-meddelanden", "onboarding.form.registeredServerForm.included.externalProviders": "Integrering med externa leverantörer (WhatsApp, Facebook, Telegram, Twitter)", diff --git a/packages/i18n/src/locales/ta-IN.i18n.json b/packages/i18n/src/locales/ta-IN.i18n.json index b31adfdda0657..4ee378f673197 100644 --- a/packages/i18n/src/locales/ta-IN.i18n.json +++ b/packages/i18n/src/locales/ta-IN.i18n.json @@ -320,6 +320,7 @@ "Apply": "விண்ணப்பிக்கவும்", "Apply_and_refresh_all_clients": "விண்ணப்பிக்க மற்றும் அனைத்து வாடிக்கையாளர்கள் புதுப்பிக்க", "Apps": "ஆப்ஸ்", + "Apps_context_premium": "நிறுவன", "Apps_Settings": "பயன்பாட்டின் அமைப்புகள்", "Apps_WhatIsIt": "பயன்பாடுகள்: அவர்கள் என்ன?", "Apps_WhatIsIt_paragraph1": "நிர்வாக பகுதியில் ஒரு புதிய ஐகான்! இது என்ன அர்த்தம் மற்றும் பயன்பாடுகள் என்ன?", @@ -1099,6 +1100,7 @@ "FEDERATION_Domain": "டொமைன்", "FEDERATION_Status": "நிலைமை", "Retry_Count": "மீண்டும் முயற்சி செய்", + "Federation_Matrix_enabled": "இயக்கப்பட்டது", "Field": "களம்", "Field_removed": "துறையில் நீக்கப்பட்டது", "Field_required": "புலம் தேவை", @@ -1457,6 +1459,10 @@ "Layout_Terms_of_Service": "சேவை விதிமுறைகள்", "LDAP": "LDAP,", "LDAP_Description": "பல தளங்கள் மற்றும் சேவைகள் இடையே ஒரு கடவுச்சொல்லை பகிர்ந்து ஒரு வசதி - LDAP, பல நிறுவனங்கள் ஒற்றை அடையாளம் வழங்க பயன்படுத்த என்று ஒரு படிநிலை தரவுத்தள உள்ளது. https://rocket.chat/docs/administrator-guides/authentication/ldap/: மேம்பட்ட கட்டமைப்பு தகவல் மற்றும் உதாரணங்கள், எங்கள் விக்கி கலந்தாலோசிக்கவும்.", + "LDAP_Connection_Encryption": "குறியாக்க", + "LDAP_DataSync_BackgroundSync": "பின்னணி ஒத்திசைவு", + "LDAP_Server_Type": "சர்வர் வகை", + "LDAP_Server_Type_Other": "மற்ற", "LDAP_Authentication": "இயக்கு", "LDAP_Authentication_Password": "கடவுச்சொல்", "LDAP_Authentication_UserDN": "பயனர் DN", @@ -2664,6 +2670,8 @@ "Visitor_Navigation": "பார்வையாளர் நேவிகேஷன்", "Visitor_page_URL": "பார்வையாளர் பக்கம் URL", "Visitor_time_on_site": "தளத்தில் பார்வையாளர் நேரம்", + "VoIP_Management_Server_Username": "பயனர் பெயர்", + "VoIP_Management_Server_Password": "கடவுச்சொல்", "Wait_activation_warning": "நீங்கள் உள்நுழைய முடியும் முன், உங்கள் கணக்கு நிர்வாகியால் மூலம் செயல்படுத்தப்படுகிறது வேண்டும்.", "Warnings": "எச்சரிக்கைகள்", "We_are_offline_Sorry_for_the_inconvenience": "நாம் லைனில் உள்ளனர். சிரமத்திற்கு வருந்துகிறோம்.", @@ -2747,6 +2755,7 @@ "registration.component.form.emailOrUsername": "மின்னஞ்சல் அல்லது பயனர் பெயர்", "registration.component.form.username": "பயனர் பெயர்", "registration.component.form.name": "பெயர்", + "registration.component.form.userAlreadyExist": "பெயர் ஏற்கனவே உள்ளது. மற்றொரு பயனர்பெயரை முயற்சிக்கவும்.", "registration.component.form.emailAlreadyExists": "மின்னஞ்சல் ஏற்கனவே உள்ளது", "registration.component.form.usernameAlreadyExists": "பெயர் ஏற்கனவே உள்ளது. மற்றொரு பயனர்பெயரை முயற்சிக்கவும்.", "registration.component.form.invalidEmail": "உள்ளிட்ட மின்னஞ்சல் தவறானது", diff --git a/packages/i18n/src/locales/th-TH.i18n.json b/packages/i18n/src/locales/th-TH.i18n.json index 1c786cf47aa95..996333840758d 100644 --- a/packages/i18n/src/locales/th-TH.i18n.json +++ b/packages/i18n/src/locales/th-TH.i18n.json @@ -319,6 +319,7 @@ "Apply": "ใช้", "Apply_and_refresh_all_clients": "ใช้และรีเฟรชลูกค้าทั้งหมด", "Apps": "ปพลิเคชัน", + "Apps_context_premium": "องค์กร", "Apps_Settings": "การตั้งค่าของแอป", "Apps_WhatIsIt": "แอป: อะไรคือพวกเขา?", "Apps_WhatIsIt_paragraph1": "ไอคอนใหม่ในพื้นที่การบริหาร! นี่หมายถึงอะไรและ Apps คืออะไร?", @@ -1095,6 +1096,7 @@ "FEDERATION_Domain": "โดเมน", "FEDERATION_Status": "สถานะ", "Retry_Count": "ลองนับใหม่", + "Federation_Matrix_enabled": "เปิดการใช้งาน", "Field": "สนาม", "Field_removed": "ลบฟิลด์แล้ว", "Field_required": "ต้องระบุฟิลด์", @@ -1451,6 +1453,10 @@ "Layout_Sidenav_Footer_Dark_description": "ขนาดท้ายคือ 260 x 70px", "Layout_Terms_of_Service": "เงื่อนไขการให้บริการ", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "การเข้ารหัสลับ", + "LDAP_DataSync_BackgroundSync": "พื้นหลังซิงค์", + "LDAP_Server_Type": "ประเภทเซิร์ฟเวอร์", + "LDAP_Server_Type_Other": "อื่น ๆ", "LDAP_Authentication": "ทำให้สามารถ", "LDAP_Authentication_Password": "รหัสผ่าน", "LDAP_Authentication_UserDN": "DN ผู้ใช้", @@ -1980,6 +1986,7 @@ "Reactions": "ปฏิกิริยา", "Read_by": "อ่านโดย", "Read_only": "อ่านเท่านั้น", + "This_room_is_read_only": "ห้องนี้เป็นแบบอ่านอย่างเดียว", "Read_only_changed_successfully": "อ่านแล้วเปลี่ยนได้สำเร็จแล้ว", "Read_only_channel": "ช่องอ่านอย่างเดียว", "Read_only_group": "กลุ่มแบบอ่านอย่างเดียว", @@ -2478,6 +2485,7 @@ "Unarchive": "ยกเลิกการเก็บ", "unarchive-room": "ห้องที่ยกเลิกการจอง", "unarchive-room_description": "การอนุญาตให้ยกเลิกการเก็บถาวรช่อง", + "unauthorized": "ไม่มีอำนาจ", "Unblock_User": "ผู้ใช้ยกเลิกการปิดกั้น", "Unignore": "ให้ความสนใจ", "Uninstall": "ถอนการติดตั้ง", @@ -2649,6 +2657,8 @@ "Visitor_Navigation": "การนำทางของผู้เยี่ยมชม", "Visitor_page_URL": "URL ของหน้าผู้เข้าชม", "Visitor_time_on_site": "เวลาผู้เยี่ยมชมในไซต์", + "VoIP_Management_Server_Username": "ชื่อผู้ใช้", + "VoIP_Management_Server_Password": "รหัสผ่าน", "Wait_activation_warning": "ก่อนที่คุณจะสามารถเข้าสู่ระบบบัญชีของคุณต้องเปิดใช้งานด้วยตนเองโดยผู้ดูแลระบบ", "Warnings": "คำเตือน", "We_are_offline_Sorry_for_the_inconvenience": "เราออฟไลน์ ขออภัยในความไม่สะดวก.", @@ -2723,6 +2733,7 @@ "Your_push_was_sent_to_s_devices": "การกดของคุณถูกส่งไปยังอุปกรณ์%s", "Your_server_link": "ลิงค์เซิร์ฟเวอร์ของคุณ", "Your_workspace_is_ready": "พื้นที่ทำงานของคุณพร้อมใช้งานแล้ว🎉", + "registration.page.login.errors.wrongCredentials": "ผู้ใช้ไม่พบหรือรหัสผ่านไม่ถูกต้อง", "registration.page.registration.waitActivationWarning": "ก่อนที่คุณจะสามารถเข้าสู่ระบบบัญชีของคุณต้องเปิดใช้งานด้วยตนเองโดยผู้ดูแลระบบ", "registration.page.resetPassword.sent": "หากอีเมลนี้ได้รับการลงทะเบียนเราจะส่งคำแนะนำเกี่ยวกับวิธีรีเซ็ตรหัสผ่านของคุณ หากคุณไม่ได้รับอีเมลในไม่ช้าโปรดกลับมาลองอีกครั้ง", "registration.component.login": "เข้าสู่ระบบ", @@ -2730,6 +2741,7 @@ "registration.component.resetPassword": "รีเซ็ตรหัสผ่าน", "registration.component.form.username": "ชื่อผู้ใช้", "registration.component.form.name": "ชื่อ", + "registration.component.form.userAlreadyExist": "ชื่อผู้ใช้อยู่แล้ว. โปรดลองชื่อผู้ใช้อื่น", "registration.component.form.emailAlreadyExists": "มีอีเมลอยู่แล้ว", "registration.component.form.usernameAlreadyExists": "ชื่อผู้ใช้อยู่แล้ว. โปรดลองชื่อผู้ใช้อื่น", "registration.component.form.invalidEmail": "อีเมลที่ป้อนไม่ถูกต้อง", diff --git a/packages/i18n/src/locales/tr.i18n.json b/packages/i18n/src/locales/tr.i18n.json index 3986ee173be06..c4899dab439e0 100644 --- a/packages/i18n/src/locales/tr.i18n.json +++ b/packages/i18n/src/locales/tr.i18n.json @@ -373,6 +373,7 @@ "Apply_and_refresh_all_clients": "Uygulayın ve tüm istemcilerin yenilemek", "Apps": "Uygulamalar", "Apps_context_installed": "Yüklü", + "Apps_context_premium": "Kuruluş", "Apps_Engine_Version": "Uygulamalar Motoru Sürümü", "Apps_Marketplace_Deactivate_App_Prompt": "Gerçekten bu uygulamayı devre dışı bırakmak istiyor musunuz?", "Apps_Marketplace_Login_Required_Title": "Market Oturum Açması Gerekli", @@ -617,6 +618,7 @@ "Confirm_password": "Parolanızı onaylayın", "Confirm_your_password": "Parolanızı onaylayın", "Connect": "Bağlan", + "Connected": "Bağlantı sağlandı", "Connection_Closed": "Bağlantı kapandı", "Connection_Reset": "Bağlantı sıfırlama", "Connectivity_Services": "Bağlantı Hizmetleri", @@ -1343,6 +1345,7 @@ "FEDERATION_Test_Setup": "Test yüklemesi", "FEDERATION_Test_Setup_Error": "Kurulumunuzu kullanarak sunucu bulunamadı,", "Retry_Count": "Yeniden Dene Sayımı", + "Federation_Matrix_enabled": "Etkin", "Field": "Alan", "Field_removed": "Alan çıkarıldı", "Field_required": "Alan gerekli", @@ -1751,6 +1754,12 @@ "Layout_Sidenav_Footer_Dark_description": "Alt kısım 260x70 piksel boyutundadır", "Layout_Terms_of_Service": "Kullanım Koşulları", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Şifreleme", + "LDAP_Connection_Timeouts": "Zaman Aşımları", + "LDAP_UserSearch": "Kullanıcı Arama", + "LDAP_DataSync_BackgroundSync": "Arka Plan Senkronizasyonu", + "LDAP_Server_Type": "Sunucu Türü", + "LDAP_Server_Type_Other": "Diğer", "LDAP_Authentication": "Etkinleştir", "LDAP_Authentication_Password": "Şifre", "LDAP_Authentication_UserDN": "Kullanıcı DN", @@ -2371,6 +2380,7 @@ "Reactions": "Tepkiler", "Read_by": "Okuyan", "Read_only": "Yalnızca Oku", + "This_room_is_read_only": "Bu oda salt okunur", "Read_only_changed_successfully": "Salt okunur sadece başarıyla değiştirildi", "Read_only_channel": "Salt Okunur", "Read_only_group": "Salt Okunur Grup", @@ -2480,6 +2490,7 @@ "Robot_Instructions_File_Content": "Robots.txt Dosya İçeriği", "Rocket_Chat_Alert": "Rocket.Chat Uyarısı", "Role": "Rol", + "Roles": "Roller", "Role_Editing": "Rol düzenleniyor", "Role_removed": "Rol kaldırıldı", "Room": "Oda", @@ -3152,6 +3163,8 @@ "Visitor_Navigation": "Ziyaretçi Dolaşımı", "Visitor_page_URL": "Ziyaretçi sayfası URL'si", "Visitor_time_on_site": "Sitedeki ziyaretçi süresi", + "VoIP_Management_Server_Username": "Kullanıcı Adı", + "VoIP_Management_Server_Password": "Şifre", "Wait_activation_warning": "Oturum açmadan önce, hesabınızın yönetici tarafından etkinleştirilmesi gerekiyor.", "Warning": "Uyarı", "Warnings": "Uyarılar", @@ -3248,6 +3261,7 @@ "registration.component.resetPassword": "Şifreyi sıfırla", "registration.component.form.username": "Kullanıcı Adı", "registration.component.form.name": "Ad", + "registration.component.form.userAlreadyExist": "Kullanıcı adı zaten var. Lütfen başka bir kullanıcı adı deneyin.", "registration.component.form.emailAlreadyExists": "Bu e-posta zaten var", "registration.component.form.usernameAlreadyExists": "Kullanıcı adı zaten var. Lütfen başka bir kullanıcı adı deneyin.", "registration.component.form.invalidEmail": "Girilen e-posta geçersiz", diff --git a/packages/i18n/src/locales/ug.i18n.json b/packages/i18n/src/locales/ug.i18n.json index 737d8c8e4b9ab..ba8077844663e 100644 --- a/packages/i18n/src/locales/ug.i18n.json +++ b/packages/i18n/src/locales/ug.i18n.json @@ -45,6 +45,7 @@ "Accounts_OAuth_Custom_id": "ID تېرمىنال", "Accounts_OAuth_Custom_Identity_Path": "سالاھىيەت ئادرېسى", "Accounts_OAuth_Custom_Login_Style": "كىرىش خىلى", + "Accounts_OAuth_Custom_Scope": "دائىرىسى", "Accounts_OAuth_Custom_Secret": "ئاچقۇچ", "Accounts_OAuth_Custom_Token_Path": "ئادرېسىToken", "Accounts_OAuth_Custom_Token_Sent_Via": "شەرتلىك بەلگە يوللاش ئارقىلىق", @@ -157,6 +158,7 @@ "Animals_and_Nature": "ھايۋانات ۋە تەبىئەت", "API": "API", "API_Analytics": "ئانالىز قىلىش", + "API_Drupal_URL_Description": "ئايىغىدىكى يانتۇ سىزىق كىرەكسىز `https://domain.com` مەسلەن", "API_Embed": "قىستۇرۇش", "API_EmbedIgnoredHosts": "ئۇنتۇلغان كومپيۇتېرنى قىستۇرۇش", "API_EmbedIgnoredHosts_Description": "localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 ئادرېسى مەسلەن CIDR پەش ئارقىلىق بۆلۈنگەن", @@ -430,6 +432,7 @@ "Favorite_Rooms": "ياخشى كۆرگەن ئۆينى ئىشلىتىش", "Favorites": "ساقلاش", "FEDERATION_Domain": "دائىرە نامى", + "Federation_Matrix_enabled": "ئىشلىتىلدى", "Field": "خەت بۆلىكى", "Field_removed": "خەت بۆلىكى يۇيۇۋېتىلىدۇى", "File_exceeds_allowed_size_of_bytes": "بايتتىن ئېشىپ كەتتى {{size}} ھۆججەتنىڭ چوڭ كىچىكلىكى رۇخسەت قىلىنش", @@ -585,6 +588,7 @@ "Layout_Terms_of_Service": "مۇلازىمەت تارمىقى", "LDAP": "LDAP", "LDAP_Description": "ئادەتتە شىركەتلەر تەرىپىدىن ئاددىي نۇقتا كىرىش مېخانىزىمى قىلىپ قوللىنىدۇ .بۇ خىلمېخانىزىم بىر ئەزانى ئوخشاش بىر يۈرۈش ھېسابات نومۇرى ۋە مەخپىي نومۇر ئارقىلىق كۆپلىگەن تور بەت ۋەمۇلازىمەتكە كىرگىلى بولىدۇ.كۆپلىگەن LDAPگۇۋاھنامىسىنى تەڭشەش ۋە مىساللىرىنى ئىچكىرى چۈشەنمەكچى بولسىڭىز بىزنىڭ wikiتور بېتىمىزدىن پايدىلانسىڭىز بولىدۇ https://rocket.chat/docs/administrator-guides/authentication/ldap/ (ېنىك مۇندەرىجىنى زىيارەت قىلىش كېلىشىمى)LDAP", + "LDAP_Connection_Encryption": "مەخپىيلەشتۈرۈش ئۇسۇلى", "LDAP_Authentication": "LDAP", "LDAP_Authentication_Password": "پارول", "LDAP_Authentication_UserDN_Description": "`cn=Administrator,cn=Users,dc=Example,dc=com`دە ئۈچىنچى تەرەپنىڭ توپلىشىشى ئۈچۈن قۇرۇلغان ھېسابات نومۇرى. ئىناۋەتلىك بولغان پۈتۈن ئىسىم ئىشلىتىڭ مەسىلەن: . LDAP كۆپ ئەھۋالدا ، ئۇ ئەزا \n نىڭ ئىچىدە ئىزدەش ۋە دەلىللەش رولىنى ئۆتەيدۇ.LDAP ئەزا باشقا ئەزالار كىرگەن چاغدا LDAP بۇ", @@ -1177,6 +1181,8 @@ "Visitor_Navigation": "زىيارەت قىلغۇچى يول باشلىغۇچى", "Visitor_page_URL": "زىيارەت قىلغۇچى تور بەت ئادرېسى", "Visitor_time_on_site": "زىيارەت قىلغۇچىنىڭ تور بەتتە تۇرغان ۋاقتى", + "VoIP_Management_Server_Username": "ئەزا ئىسمى", + "VoIP_Management_Server_Password": "پارول", "Wait_activation_warning": "سىزنىڭ ئاكونتىڭىز چوقۇم باشقۇرغۇچى قولى بىلەن قوزغاتقاندىن كېيىن ئاندىن كىرگىلى بولىدۇ.", "We_are_offline_Sorry_for_the_inconvenience": "ھازىر توردا ئادەم يوق ،. قولايسىزلىق ئېلىپ كەلگەن بولسا چۈشۈنۈىشۈڭىزنى ئۈمىد قىلىمىز .", "We_have_sent_password_email": "بىز سىزگە پارولنى قايتىدىن ئۆزگەرتىش ئىلخىتىنى ئەۋەتتۇق ، ئەگەر تاپشۇرۇپ ئالمىغان بولسىڭىز ، قايتىدىن سىناڭ.", diff --git a/packages/i18n/src/locales/uk.i18n.json b/packages/i18n/src/locales/uk.i18n.json index d09362b93dcc2..94d4701717615 100644 --- a/packages/i18n/src/locales/uk.i18n.json +++ b/packages/i18n/src/locales/uk.i18n.json @@ -410,6 +410,7 @@ "Apply_and_refresh_all_clients": "Застосувати і оновити для всіх клієнтів", "Apps": "Застосунки", "Apps_context_installed": "Встановлено", + "Apps_context_premium": "Підприємство", "Apps_Engine_Version": "Версія ядра застосунків", "Apps_Game_Center": "Ігровий центр", "Apps_Game_Center_Back": "Повернутися до ігрового центру", @@ -1290,6 +1291,7 @@ "Enter_Normal": "Нормальний режим (відправляти клавішою \"Enter\")", "Enter_to": "Ввійти в", "Enter_your_E2E_password": "Введіть свій пароль E2E", + "message_counter_many": "{{count}} повідомлень", "Entertainment": "Розваги", "Error": "Помилка", "Error_404": "Помилка: 404", @@ -1401,6 +1403,7 @@ "error-this-is-not-a-livechat-room": "Це не Livechat кімната", "error-token-already-exists": "Токен з таким іменем вже існує", "error-token-does-not-exists": "Токен не існує", + "message_counter_few": "{{count}} повідомлень", "error-too-many-requests": "Помилка, занадто багато запитів. Будь ласка сповільнитися. Ви повинні почекати {{seconds}} секунд, перш ніж знову спробувати.", "error-user-has-no-roles": "Користувач не має ролей", "error-user-is-not-activated": "Користувача не активовано", @@ -1470,6 +1473,7 @@ "FEDERATION_Test_Setup_Error": "Не вдалося знайти ваш сервер за допомогою налаштувань, перегляньте свої налаштування.", "FEDERATION_Test_Setup_Success": "Ваша настройка федерації працює, і інші сервери можуть знайти вас!", "Retry_Count": "Повторити граф", + "Federation_Matrix_enabled": "Увімкнено", "Field": "Поле", "Field_removed": "Поле видалено", "Field_required": "Поле обов'язкове", @@ -1549,7 +1553,6 @@ "Filters": "Фільтри", "Financial_Services": "Фінансові послуги", "First_Channel_After_Login": "Перший канал після входу", - "message_counter_many": "{{count}} повідомлень", "First_response_time": "Час першої відповіді", "Flags": "Прапори", "Follow_message": "Відслідковувати повідомлення", @@ -1669,7 +1672,6 @@ "Ignored": "Ігнорується", "Images": "Зображення", "IMAP_intercepter_already_running": "Інтерфейтер IMAP вже працює", - "message_counter_few": "{{count}} повідомлень", "IMAP_intercepter_Not_running": "Інтерфейс IMAP не працює", "Impersonate_next_agent_from_queue": "Використовуйте наступного представника з черги", "Impersonate_user": "Уособлення користувача", @@ -1915,6 +1917,12 @@ "Layout_Terms_of_Service": "Умови обслуговування", "LDAP": "LDAP", "LDAP_Description": "LDAP є ієрархічною базу даних, що багато компаній використовують для забезпечення єдиного входу - об'єкта для спільного використання одного пароля між декількома сайтами і послугами. Для отримання попередньої інформації про конфігурацію і приклади, будь ласка, зверніться до нашої вікі: https://rocket.chat/docs/administrator-guides/authentication/ldap/.", + "LDAP_Connection_Encryption": "шифрування", + "LDAP_Connection_Timeouts": "Час очікування", + "LDAP_UserSearch": "Пошук користувачів", + "LDAP_DataSync_BackgroundSync": "Фонова синхронізація", + "LDAP_Server_Type": "Тип сервера", + "LDAP_Server_Type_Other": "Інший", "LDAP_Authentication": "Увімкнути", "LDAP_Authentication_Password": "Пароль", "LDAP_Authentication_UserDN": "Користувач DN", @@ -3240,6 +3248,8 @@ "Visitor_Navigation": "відвідувач навігації", "Visitor_page_URL": "URL-адреса сторінки відвідувача", "Visitor_time_on_site": "Час для відвідувачів на сайті", + "VoIP_Management_Server_Username": "Ім'я користувача", + "VoIP_Management_Server_Password": "Пароль", "Wait_activation_warning": "Перед тим, як увійти, ваш обліковий запис повинен бути активована вручну адміністратором.", "Warning": "Увага", "Warnings": "Попередження", @@ -3339,6 +3349,7 @@ "registration.component.form.emailOrUsername": "Адреса електронної пошти або логін", "registration.component.form.username": "Ім'я користувача", "registration.component.form.name": "Ім'я", + "registration.component.form.userAlreadyExist": "Ім'я користувача вже існує. Будь ласка, спробуйте інше ім'я користувача.", "registration.component.form.emailAlreadyExists": "Email вже існує", "registration.component.form.usernameAlreadyExists": "Ім'я користувача вже існує. Будь ласка, спробуйте інше ім'я користувача.", "registration.component.form.invalidEmail": "Невірний email", diff --git a/packages/i18n/src/locales/vi-VN.i18n.json b/packages/i18n/src/locales/vi-VN.i18n.json index 002d257306b05..a2fc50733b1ee 100644 --- a/packages/i18n/src/locales/vi-VN.i18n.json +++ b/packages/i18n/src/locales/vi-VN.i18n.json @@ -380,6 +380,7 @@ "Apply": "Áp dụng", "Apply_and_refresh_all_clients": "Áp dụng và làm mới tất cả các khách hàng", "Apps": "Ứng dụng", + "Apps_context_premium": "Doanh nghiệp", "Apps_Essential_Alert": "Ứng dụng này rất cần thiết cho các sự kiện sau:", "Apps_Essential_Disclaimer": "Các sự kiện được liệt kê ở trên sẽ bị gián đoạn nếu ứng dụng này bị vô hiệu hóa. Nếu bạn muốn Rocket.Chat hoạt động mà không có chức năng của ứng dụng này, bạn cần gỡ cài đặt nó", "Apps_Framework_Source_Package_Storage_Type": "Loại lưu trữ gói nguồn của ứng dụng", @@ -585,6 +586,7 @@ "Confirm_New_Password_Placeholder": "Vui lòng nhập lại mật khẩu mới ...", "Confirm_password": "Xác nhận mật khẩu của bạn", "Confirm_your_password": "Xác nhận mật khẩu của bạn", + "Connected": "Đã kết nối", "Connection_Closed": "Kêt nôi bị đong", "Connection_Reset": "Đặt lại kết nối", "Consulting": "Tư vấn", @@ -1193,6 +1195,7 @@ "FEDERATION_Domain": "Tên miền", "FEDERATION_Status": "Trạng thái", "Retry_Count": "Thử lại đếm", + "Federation_Matrix_enabled": "Đã bật", "Field": "Cánh đồng", "Field_removed": "Trường đã bị xóa", "Field_required": "Trường bắt buộc", @@ -1549,6 +1552,10 @@ "Layout_Sidenav_Footer_Dark_description": "Kích thước chân trang là 260 x 70px", "Layout_Terms_of_Service": "Điều khoản dịch vụ", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "Mã hóa", + "LDAP_DataSync_BackgroundSync": "Đồng bộ hóa nền", + "LDAP_Server_Type": "Loại máy chủ", + "LDAP_Server_Type_Other": "Khác", "LDAP_Authentication": "Bật", "LDAP_Authentication_Password": "Mật khẩu", "LDAP_Authentication_UserDN": "DN người dùng", @@ -2086,6 +2093,7 @@ "Reactions": "Biểu cảm", "Read_by": "Đọc bởi", "Read_only": "Chỉ đọc", + "This_room_is_read_only": "Phòng này chỉ đọc", "Read_only_changed_successfully": "Đã đọc thành công chỉ đọc", "Read_only_channel": "Kênh chỉ đọc", "Read_only_group": "Nhóm chỉ đọc", @@ -2586,6 +2594,7 @@ "Unarchive": "Hủy lưu trữ", "unarchive-room": "Phòng chưa lưu trữ", "unarchive-room_description": "Cho phép hủy bỏ các kênh", + "unauthorized": "Chưa được phép", "Unblock_User": "Mở khoá người dùng", "Unignore": "Hủy bỏ", "Uninstall": "Gỡ cài đặt", @@ -2758,6 +2767,8 @@ "Visitor_Navigation": "Điều hướng truy cập", "Visitor_page_URL": "URL của trang truy cập", "Visitor_time_on_site": "Thời gian khách thăm trên trang web", + "VoIP_Management_Server_Username": "Tên đăng nhập", + "VoIP_Management_Server_Password": "Mật khẩu", "Wait_activation_warning": "Trước khi bạn có thể đăng nhập, tài khoản của bạn phải được quản trị viên kích hoạt theo cách thủ công.", "Warnings": "Cảnh báo", "We_are_offline_Sorry_for_the_inconvenience": "Chúng tôi đang offline. Xin lỗi vì sự bất tiện.", @@ -2832,6 +2843,7 @@ "Your_push_was_sent_to_s_devices": "Đã được gửi tới % thiết bị", "Your_server_link": "Đường dẫn máy chủ của bạn", "Your_workspace_is_ready": "Workspace của bạn đã sẵn sàng", + "registration.page.login.errors.wrongCredentials": "Người dùng không tìm thấy hoặc không chính xác mật khẩu", "registration.page.login.errors.AppUserNotAllowedToLogin": "Người dùng ứng dụng không được phép đăng nhập trực tiếp.", "registration.page.registration.waitActivationWarning": "Trước khi bạn có thể đăng nhập, tài khoản của bạn phải được quản trị viên kích hoạt theo cách thủ công.", "registration.page.resetPassword.sent": "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.", @@ -2840,6 +2852,7 @@ "registration.component.resetPassword": "Đặt lại mật khẩu", "registration.component.form.username": "Tên đăng nhập", "registration.component.form.name": "Tên", + "registration.component.form.userAlreadyExist": "Tên này đã có người dùng. Vui lòng thử tên người dùng khác.", "registration.component.form.emailAlreadyExists": "Email đã tồn tại", "registration.component.form.usernameAlreadyExists": "Tên này đã có người dùng. Vui lòng thử tên người dùng khác.", "registration.component.form.invalidEmail": "Email nhập vào không hợp lệ", diff --git a/packages/i18n/src/locales/zh-HK.i18n.json b/packages/i18n/src/locales/zh-HK.i18n.json index 1b4f84a32d60c..2f416acc4f2f8 100644 --- a/packages/i18n/src/locales/zh-HK.i18n.json +++ b/packages/i18n/src/locales/zh-HK.i18n.json @@ -335,6 +335,7 @@ "Apply": "应用", "Apply_and_refresh_all_clients": "申请并刷新所有客户", "Apps": "应用", + "Apps_context_premium": "企业", "Apps_Marketplace_Deactivate_App_Prompt": "是否確定要禁用此應用程序?", "Apps_Marketplace_Modify_App_Subscription": "修改訂閱", "Apps_Marketplace_Uninstall_App_Prompt": "是否確定要卸載此應用程序?", @@ -1119,6 +1120,7 @@ "FEDERATION_Domain": "域", "FEDERATION_Status": "状态", "Retry_Count": "重试计数", + "Federation_Matrix_enabled": "启用", "Field": "领域", "Field_removed": "现场删除", "Field_required": "必填字段", @@ -1477,6 +1479,10 @@ "Layout_Sidenav_Footer_Dark_description": "页脚大小是260 x 70px", "Layout_Terms_of_Service": "服务条款", "LDAP": "LDAP", + "LDAP_Connection_Encryption": "加密", + "LDAP_DataSync_BackgroundSync": "后台同步", + "LDAP_Server_Type": "服务器类型", + "LDAP_Server_Type_Other": "其他", "LDAP_Authentication": "启用", "LDAP_Authentication_Password": "密码", "LDAP_Authentication_UserDN": "用户DN", @@ -2011,6 +2017,7 @@ "Reactions": "反应", "Read_by": "阅读", "Read_only": "只读", + "This_room_is_read_only": "这个房间是只读的", "Read_only_changed_successfully": "只读更改成功", "Read_only_channel": "只读频道", "Read_only_group": "只读组", @@ -2511,6 +2518,7 @@ "Unarchive": "取消封存", "unarchive-room": "unarchive房间", "unarchive-room_description": "允许非存档渠道", + "unauthorized": "未经授权", "Unblock_User": "取消阻止用户", "Unignore": "屏蔽", "Uninstall": "卸载", @@ -2680,6 +2688,8 @@ "Visitor_Navigation": "访客导航", "Visitor_page_URL": "访客页面网址", "Visitor_time_on_site": "访客在现场的时间", + "VoIP_Management_Server_Username": "用户名", + "VoIP_Management_Server_Password": "密码", "Wait_activation_warning": "您的帐户必须由管理员手工启动后才能登录。", "Warning": "警告", "Warnings": "警告", @@ -2755,6 +2765,7 @@ "Your_push_was_sent_to_s_devices": "您的推送已发送到%s设备", "Your_server_link": "您的服务器链接", "Your_workspace_is_ready": "您的工作区已准备好使用🎉", + "registration.page.login.errors.wrongCredentials": "用户未找到或密码不正确", "registration.page.registration.waitActivationWarning": "您的帐户必须由管理员手工启动后才能登录。", "registration.page.resetPassword.sent": "如果此电子邮件已注册,我们将发送有关如何重置密码的说明。如果您很短时间内没有收到电子邮件,请返回并重试。", "registration.component.login": "登录", @@ -2762,6 +2773,7 @@ "registration.component.resetPassword": "重设密码", "registration.component.form.username": "用户名", "registration.component.form.name": "姓名", + "registration.component.form.userAlreadyExist": "此用户名已存在。请尝试其他用户名。", "registration.component.form.emailAlreadyExists": "邮件已存在", "registration.component.form.usernameAlreadyExists": "此用户名已存在。请尝试其他用户名。", "registration.component.form.invalidEmail": "无效的电子邮件", diff --git a/packages/i18n/src/locales/zh-TW.i18n.json b/packages/i18n/src/locales/zh-TW.i18n.json index daab1ff461806..1b9cbed4a5ee4 100644 --- a/packages/i18n/src/locales/zh-TW.i18n.json +++ b/packages/i18n/src/locales/zh-TW.i18n.json @@ -448,6 +448,7 @@ "Apply_and_refresh_all_clients": "套用並重新整理所有客戶端", "Apps": "應用程式", "Apps_context_installed": "已安裝", + "Apps_context_premium": "企業", "Apps_Engine_Version": "應用程式引擎版本", "Apps_Essential_Alert": "對於以下事件,此應用程式必不可少:", "Apps_Essential_Disclaimer": "如果停用此應用程式,則上面列出的事件將被中斷。如果您希望 Rocket.Chat 在沒有此應用程式功能的情況下正常工作,則需要將其反安裝", @@ -1360,6 +1361,7 @@ "Desktop_Notifications_Not_Enabled": "桌面通知未啟用", "Details": "詳細", "line": "行", + "Device_Management_IP": "IP", "Different_Style_For_User_Mentions": "使用者提到的不同風格", "Livechat_Facebook_API_Key": "Omni Channel API 金鑰", "Livechat_Facebook_API_Secret": "Omni Channel API 加密", @@ -1828,6 +1830,7 @@ "FEDERATION_Test_Setup_Error": "無法用您的設定找到您的伺服器,請確認您的設定。", "FEDERATION_Test_Setup_Success": "您的聯合設定正在執行且其他伺服器都可以找到您!", "Retry_Count": "重試計數", + "Federation_Matrix_enabled": "已啟用", "Field": "欄位", "Field_removed": "欄位已移除", "Field_required": "必填字段", @@ -3237,6 +3240,7 @@ "Privacy": "隱私條款", "Privacy_Policy": "隱私政策", "Private": "私人", + "Private_channels": "私人Channel s", "Private_Channel": "私人Channel", "Private_Channels": "私人Channel s", "Private_Chats": "私人聊天", @@ -3311,6 +3315,7 @@ "Reactions": "反應", "Read_by": "閱讀", "Read_only": "唯讀", + "This_room_is_read_only": "這是個唯讀頻道", "Read_only_changed_successfully": "唯讀更改成功", "Read_only_channel": "唯讀Channel", "Read_only_group": "唯讀群組", @@ -3455,6 +3460,7 @@ "Unsafe_Url": "不安全的網址", "Rocket_Chat_Alert": "Rocket.Chat 警報", "Role": "角色", + "Roles": "角色", "Role_Editing": "角色編輯", "Role_Mapping": "對應身份", "Role_removed": "角色已刪除", @@ -4492,6 +4498,7 @@ "registration.component.resetPassword": "重設密碼", "registration.component.form.username": "使用者名稱", "registration.component.form.name": "姓名", + "registration.component.form.userAlreadyExist": "此使用者名稱已存在。請嘗試其他使用者名稱。", "registration.component.form.emailAlreadyExists": "電子郵件已存在", "registration.component.form.usernameAlreadyExists": "此使用者名稱已存在。請嘗試其他使用者名稱。", "registration.component.form.invalidEmail": "電子郵件無效", diff --git a/packages/i18n/src/locales/zh.i18n.json b/packages/i18n/src/locales/zh.i18n.json index de49283fd4711..6929e3eeab8d5 100644 --- a/packages/i18n/src/locales/zh.i18n.json +++ b/packages/i18n/src/locales/zh.i18n.json @@ -422,6 +422,7 @@ "Apply_and_refresh_all_clients": "应用并刷新所有客户端", "Apps": "应用", "Apps_context_installed": "已安装", + "Apps_context_premium": "企业", "Apps_Engine_Version": "应用程序引擎版本", "Apps_Essential_Alert": "此应用对以下事件为必须:", "Apps_Essential_Disclaimer": "此应用禁用时上方列出的事件将被影响。如果想让 Rocket.Chat 在没有此应用的情况下运行,您需要卸载它。", @@ -806,6 +807,7 @@ "Confirm_password": "确认密码", "Confirm_your_password": "确认密码", "Connect": "连接", + "Connected": "已连接", "Connect_SSL_TLS": "使用 SSL/TLS 连接", "Connection_Closed": "连接关闭", "Connection_Reset": "连接重置", @@ -1660,6 +1662,7 @@ "FEDERATION_Test_Setup_Error": "无法通过您的配置找到服务器,请检查您的设定。", "FEDERATION_Test_Setup_Success": "您的联邦配置生效并且可被其他服务器找到!", "Retry_Count": "重试计数", + "Federation_Matrix_enabled": "已启用", "Field": "字段", "Field_removed": "已移除字段", "Field_required": "字段必须填写", @@ -2150,7 +2153,15 @@ "Layout_Terms_of_Service": "服务条款", "LDAP": "LDAP", "LDAP_Description": "LDAP(轻量目录访问协议)是一种层次数据库,常被企业用于提供单点登录机制——该机制允许用户使用同一套帐号密码登录多个网站或服务。想要了解LDAP认证的设置及示例,可参考我们的wiki页: https://rocket.chat/docs/administrator-guides/authentication/ldap/", + "LDAP_Connection_Encryption": "加密", "LDAP_Connection_successful": "LDAP 连接成功", + "LDAP_Connection_Timeouts": "超时", + "LDAP_UserSearch": "用户搜索", + "LDAP_DataSync_DataMap": "映射", + "LDAP_DataSync_Advanced": "高级同步", + "LDAP_DataSync_BackgroundSync": "后台同步", + "LDAP_Server_Type": "服务器类型", + "LDAP_Server_Type_Other": "其他", "LDAP_Advanced_Sync": "高级同步", "LDAP_Authentication": "启用", "LDAP_Authentication_Password": "密码", @@ -2919,6 +2930,7 @@ "Privacy": "隐私条款", "Privacy_Policy": "隐私政策", "Private": "私人", + "Private_channels": "私人频道", "Private_Channel": "私人频道", "Private_Channels": "私人频道", "Private_Chats": "私人聊天", @@ -3120,6 +3132,7 @@ "Robot_Instructions_File_Content": "Robots.txt 文件内容", "Rocket_Chat_Alert": "Rocket.Chat 提醒", "Role": "角色", + "Roles": "角色", "Role_Editing": "编辑角色", "Role_Mapping": "角色映射", "Role_removed": "已移除角色", @@ -3987,6 +4000,8 @@ "Visitor_Navigation": "游客导航", "Visitor_page_URL": "访客页面地址", "Visitor_time_on_site": "访客网站停留时间", + "VoIP_Management_Server_Username": "用户名", + "VoIP_Management_Server_Password": "密码", "Wait_activation_warning": "您的帐户必须由管理员手工激活后才能登录。", "Waiting_queue": "等待队列", "Waiting_queue_message": "等待队列消息", @@ -4117,6 +4132,7 @@ "registration.component.form.emailOrUsername": "电子邮件或用户名", "registration.component.form.username": "用户名", "registration.component.form.name": "姓名", + "registration.component.form.userAlreadyExist": "此用户名已存在。请尝试其他用户名。", "registration.component.form.emailAlreadyExists": "邮箱已存在", "registration.component.form.usernameAlreadyExists": "此用户名已存在。请尝试其他用户名。", "registration.component.form.invalidEmail": "输入的电子邮件地址无效", From 0f68bdb63ddd302eca576e5e5a30e9065f55035d Mon Sep 17 00:00:00 2001 From: "lingohub[bot]" <69908207+lingohub[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 21:58:59 -0500 Subject: [PATCH 04/23] =?UTF-8?q?i18n:=20Rocket.Chat.Livechat=20language?= =?UTF-8?q?=20update=20from=20LingoHub=20=F0=9F=A4=96=20on=202024-02-28Z?= =?UTF-8?q?=20(#31855)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/livechat/src/i18n/af.json | 26 ++-- packages/livechat/src/i18n/ar.json | 26 ++-- packages/livechat/src/i18n/az.json | 26 ++-- packages/livechat/src/i18n/be-BY.json | 24 +-- packages/livechat/src/i18n/bg.json | 26 ++-- packages/livechat/src/i18n/bs.json | 8 +- packages/livechat/src/i18n/ca.json | 24 +-- packages/livechat/src/i18n/cs.json | 152 +++++++++---------- packages/livechat/src/i18n/cy.json | 26 ++-- packages/livechat/src/i18n/da.json | 26 ++-- packages/livechat/src/i18n/de-AT.json | 150 +++++++++---------- packages/livechat/src/i18n/de.json | 152 +++++++++---------- packages/livechat/src/i18n/el.json | 26 ++-- packages/livechat/src/i18n/en.json | 208 +++++++++++++------------- packages/livechat/src/i18n/eo.json | 26 ++-- packages/livechat/src/i18n/es.json | 152 +++++++++---------- packages/livechat/src/i18n/et.json | 24 +-- packages/livechat/src/i18n/eu.json | 24 +-- packages/livechat/src/i18n/fa.json | 200 ++++++++++++------------- packages/livechat/src/i18n/fi.json | 26 ++-- packages/livechat/src/i18n/fr.json | 152 +++++++++---------- packages/livechat/src/i18n/he.json | 134 ++++++++--------- packages/livechat/src/i18n/hr.json | 28 ++-- packages/livechat/src/i18n/hu.json | 26 ++-- packages/livechat/src/i18n/id.json | 26 ++-- packages/livechat/src/i18n/it.json | 140 ++++++++--------- packages/livechat/src/i18n/ja.json | 154 +++++++++---------- packages/livechat/src/i18n/km.json | 28 ++-- packages/livechat/src/i18n/ko.json | 28 ++-- packages/livechat/src/i18n/ku.json | 26 ++-- packages/livechat/src/i18n/lo.json | 24 +-- packages/livechat/src/i18n/lt.json | 26 ++-- packages/livechat/src/i18n/lv.json | 26 ++-- packages/livechat/src/i18n/mn.json | 26 ++-- packages/livechat/src/i18n/ms-MY.json | 24 +-- packages/livechat/src/i18n/nl.json | 160 ++++++++++---------- packages/livechat/src/i18n/no.json | 26 ++-- packages/livechat/src/i18n/pl.json | 144 +++++++++--------- packages/livechat/src/i18n/pt-BR.json | 168 ++++++++++----------- packages/livechat/src/i18n/pt.json | 36 ++--- packages/livechat/src/i18n/ro.json | 34 ++--- packages/livechat/src/i18n/ru.json | 152 +++++++++---------- packages/livechat/src/i18n/sk-SK.json | 24 +-- packages/livechat/src/i18n/sl-SI.json | 24 +-- packages/livechat/src/i18n/sq.json | 26 ++-- packages/livechat/src/i18n/sr.json | 148 +++++++++--------- packages/livechat/src/i18n/sv.json | 200 ++++++++++++------------- packages/livechat/src/i18n/ta-IN.json | 24 +-- packages/livechat/src/i18n/th-TH.json | 24 +-- packages/livechat/src/i18n/tr.json | 28 ++-- packages/livechat/src/i18n/ug.json | 14 +- packages/livechat/src/i18n/uk.json | 26 ++-- packages/livechat/src/i18n/vi-VN.json | 24 +-- packages/livechat/src/i18n/zh-HK.json | 24 +-- packages/livechat/src/i18n/zh-TW.json | 24 +-- packages/livechat/src/i18n/zh.json | 154 +++++++++---------- 56 files changed, 1852 insertions(+), 1852 deletions(-) diff --git a/packages/livechat/src/i18n/af.json b/packages/livechat/src/i18n/af.json index 70eee6311b8c8..5a16326ec323f 100644 --- a/packages/livechat/src/i18n/af.json +++ b/packages/livechat/src/i18n/af.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "kanselleer", - "conversation_finished": "Gesprek afgehandel", - "department_switched": "Departement aangeskakel", - "no": "Geen", - "options": "opsies", - "send": "stuur", - "user_joined": "Gebruiker aangesluit", - "user_left": "Gebruiker oor", - "we_are_not_online_right_now_please_leave_a_message": "Ons is nie aanlyn nie. Asseblief, laat 'n boodskap.", - "yes": "Ja" - } -} + "translation": { + "cancel": "kanselleer", + "conversation_finished": "Gesprek afgehandel", + "department_switched": "Departement aangeskakel", + "no": "Geen", + "options": "opsies", + "send": "stuur", + "user_joined": "Gebruiker aangesluit", + "user_left": "Gebruiker oor", + "we_are_not_online_right_now_please_leave_a_message": "Ons is nie aanlyn nie. Asseblief, laat 'n boodskap.", + "yes": "Ja" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ar.json b/packages/livechat/src/i18n/ar.json index 6d412e97aa657..6c12b245ca9d8 100644 --- a/packages/livechat/src/i18n/ar.json +++ b/packages/livechat/src/i18n/ar.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "إلغاء", - "conversation_finished": "تم إنهاء المحادثة", - "department_switched": "تم تغيير الفرع", - "no": "لا", - "options": "خيارات", - "send": "إرسال", - "user_joined": "العضو انضم", - "user_left": "اليسار المستخدم", - "we_are_not_online_right_now_please_leave_a_message": "نحن لسنا على الانترنت الآن. يرجى ترك رسالة.", - "yes": "نعم" - } -} + "translation": { + "cancel": "إلغاء", + "conversation_finished": "تم إنهاء المحادثة", + "department_switched": "تم تغيير الفرع", + "no": "لا", + "options": "خيارات", + "send": "إرسال", + "user_joined": "العضو انضم", + "user_left": "اليسار المستخدم", + "we_are_not_online_right_now_please_leave_a_message": "نحن لسنا على الانترنت الآن. يرجى ترك رسالة.", + "yes": "نعم" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/az.json b/packages/livechat/src/i18n/az.json index aecf5849101a8..d53fd2232bd0f 100644 --- a/packages/livechat/src/i18n/az.json +++ b/packages/livechat/src/i18n/az.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Ləğv et", - "conversation_finished": "Söhbət başa çatdı", - "department_switched": "Şöbə keçdi", - "no": "Yox", - "options": "Seçimlər", - "send": "Göndər", - "user_joined": "İstifadəçi qatıldı", - "user_left": "İstifadəçi buraxdı", - "we_are_not_online_right_now_please_leave_a_message": "İndi online deyil. Xahiş edirik bir mesaj buraxın.", - "yes": "Bəli" - } -} + "translation": { + "cancel": "Ləğv et", + "conversation_finished": "Söhbət başa çatdı", + "department_switched": "Şöbə keçdi", + "no": "Yox", + "options": "Seçimlər", + "send": "Göndər", + "user_joined": "İstifadəçi qatıldı", + "user_left": "İstifadəçi buraxdı", + "we_are_not_online_right_now_please_leave_a_message": "İndi online deyil. Xahiş edirik bir mesaj buraxın.", + "yes": "Bəli" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/be-BY.json b/packages/livechat/src/i18n/be-BY.json index 60148939c7872..7123d8067ea6f 100644 --- a/packages/livechat/src/i18n/be-BY.json +++ b/packages/livechat/src/i18n/be-BY.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Адмяніць", - "conversation_finished": "Размова скончана", - "department_switched": "Аддзел пераключыўся", - "no": "Няма", - "options": "Опцыі", - "send": "Паслаць", - "user_joined": "Карыстальнік далучыўся", - "user_left": "Карыстальнік выйшаў", - "we_are_not_online_right_now_please_leave_a_message": "Мы зараз не ў сеткі. Калі ласка, пакіньце паведамленне.", - "yes": "Да" - } + "translation": { + "cancel": "Адмяніць", + "conversation_finished": "Размова скончана", + "department_switched": "Аддзел пераключыўся", + "no": "Няма", + "options": "Опцыі", + "send": "Паслаць", + "user_joined": "Карыстальнік далучыўся", + "user_left": "Карыстальнік выйшаў", + "we_are_not_online_right_now_please_leave_a_message": "Мы зараз не ў сеткі. Калі ласка, пакіньце паведамленне.", + "yes": "Да" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/bg.json b/packages/livechat/src/i18n/bg.json index 0f38e4b93866b..8046760ebc5ee 100644 --- a/packages/livechat/src/i18n/bg.json +++ b/packages/livechat/src/i18n/bg.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Отказ", - "conversation_finished": "Разговорът завърши", - "department_switched": "Отделът е включен", - "no": "Не", - "options": "Настроики", - "send": "Изпрати", - "user_joined": "Потребителят се присъедини", - "user_left": "Потребителят остана", - "we_are_not_online_right_now_please_leave_a_message": "В момента не сме онлайн. Моля, оставете съобщение.", - "yes": "Да" - } -} + "translation": { + "cancel": "Отказ", + "conversation_finished": "Разговорът завърши", + "department_switched": "Отделът е включен", + "no": "Не", + "options": "Настроики", + "send": "Изпрати", + "user_joined": "Потребителят се присъедини", + "user_left": "Потребителят остана", + "we_are_not_online_right_now_please_leave_a_message": "В момента не сме онлайн. Моля, оставете съобщение.", + "yes": "Да" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/bs.json b/packages/livechat/src/i18n/bs.json index 268699ce2c1af..60fd1779c2aa8 100644 --- a/packages/livechat/src/i18n/bs.json +++ b/packages/livechat/src/i18n/bs.json @@ -1,5 +1,5 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "Jeste li sigurni da želite prebaciti odjel?" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "Jeste li sigurni da želite prebaciti odjel?" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ca.json b/packages/livechat/src/i18n/ca.json index f97136b84dfa3..1aedaf79a3435 100644 --- a/packages/livechat/src/i18n/ca.json +++ b/packages/livechat/src/i18n/ca.json @@ -1,13 +1,13 @@ { - "translation": { - "cancel": "Cancel·la", - "conversation_finished": "Conversa acabada", - "department_switched": "Departament canviat", - "options": "Opcions", - "send": "Envia", - "user_joined": "usuari unit", - "user_left": "L'usuari ha abandonat la sala", - "we_are_not_online_right_now_please_leave_a_message": "No estem en línia ara mateix. Sisplau, deixa un missatge.", - "yes": "Sí" - } -} + "translation": { + "cancel": "Cancel·la", + "conversation_finished": "Conversa acabada", + "department_switched": "Departament canviat", + "options": "Opcions", + "send": "Envia", + "user_joined": "usuari unit", + "user_left": "L'usuari ha abandonat la sala", + "we_are_not_online_right_now_please_leave_a_message": "No estem en línia ara mateix. Sisplau, deixa un missatge.", + "yes": "Sí" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/cs.json b/packages/livechat/src/i18n/cs.json index ea56d75054734..f2c32fa7c56e8 100644 --- a/packages/livechat/src/i18n/cs.json +++ b/packages/livechat/src/i18n/cs.json @@ -1,77 +1,77 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Opravdu chcete ukončit chat?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Opravdu chcete smazat všechny Vaše osobní údaje?", - "are_you_sure_you_want_to_switch_the_department": "Opravdu chcete změnit oddělení?", - "cancel": "Zrušit", - "change_department": "Změnit oddělení", - "change_department_1": "Změnit Oddělení", - "chat_finished": "Chat Ukončen", - "choose_a_department": "Vybrat oddělení...", - "choose_a_department_1": "Vybrat oddělení", - "choose_an_option": "Vybrat možnost...", - "conversation_finished": "Konverzace ukončena", - "count_new_messages_since_since_one": "Jedna nová zpráva od {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} nových zpráv od {{val, datetime}}", - "department_switched": "Oddělení změněno", - "departments": "Oddělení", - "disable_notifications": "Zakázat oznámení", - "dismiss_this_alert": "Zrušit toto upozornění", - "drop_here_to_upload_a_file": "Přetažením sem nahrajte soubor", - "email": "E-mail", - "enable_notifications": "Povolit oznámení", - "error_closing_chat": "Chyba při zavírání chatu.", - "error_removing_user_data": "Chyba při odstraňování uživatelských dat.", - "error_starting_a_new_conversation_reason": "Chyba při zahájení nové konverzace: {{reason}}", - "expand_chat": "Rozbalit chat", - "field_required": "Pole je povinné", - "file_exceeds_allowed_size_of_size": "Soubor překračuje povolenou velikost{{size}}.", - "fileupload_error": "Chyba při nahrávání souboru", - "finish_this_chat": "Ukončit tento chat", - "forget_remove_my_data": "Zapomenout/Odebrat mé údaje", - "go_to_menu_options_forget_remove_my_personal_data": "Přejít do <1>možnosti nabídky → Zapomenout/Odebrat mé osobní údaje vyžádat okamžité odstranění Vašich osobních údajů.", - "i_agree": "Souhlasím", - "i_need_help_with": "Potřebuji pomoct s...", - "if_you_have_any_other_questions_just_press_the_but": "Pokud máte jakékoli další otázky, stačí stisknout tlačítko níže a zahájit nový chat", - "insert_your_field_here": "Sem vložte {{field}} ...", - "invalid_email": "Neplatný e-mail", - "invalid_value": "Neplatná hodnota", - "leave_a_message": "Zanechte zprávu", - "livechat_connected": "Livechat připojen.", - "livechat_is_not_connected": "Livechat není připojen.", - "media_types_not_accepted": "Typy příloh nebyly přijaty.", - "message": "Zpráva", - "minimize_chat": "Minimalizovat chat", - "name": "Jméno", - "need_help": "Potřebujete pomoc?", - "new_chat": "Nová konverzace", - "no": "Ne", - "no_available_agents_to_transfer": "Nejsou k dispozici žádní dostupní operátoři pro přenos", - "options": "Volby", - "please_tell_us_some_information_to_start_the_chat": "Řekněte nám prosím nějaké informace pro zahájení chatu", - "please_wait_for_the_next_available_agent": "Počkejte prosím na dalšího dostupného operátora", - "restore_chat": "Obnovit konverzaci", - "room_name_changed": "Název okna změněn", - "send": "Poslat", - "sound_is_off": "Zvuk je vypnutý", - "sound_is_on": "Zvuk je zapnutý", - "start_chat": "Zahájit konverzaci", - "thanks_for_talking_with_us": "Děkujeme, že jste s námi hovořil", - "the_controller_of_your_personal_data_is_company_na": "Správcem vašich osobních údajů je [Název společnosti] se sídlem [Adresa společnosti]. Zahájením konverzace souhlaste s tím, že vaše osobní údaje budou zpracovávány a předávány v souladu s obecným nařízením o ochraně údajů (GDPR).", - "type_your_message_here": "Zde napište svou zprávu", - "unread_messages": "nepřečtené zprávy", - "user_added_by": "Uživatel přidán", - "user_joined": "Uživatel se připojil", - "user_left": "Uživatel odešel", - "user_removed_by": "Uživatel odstraněn", - "waiting_queue": "Čekající v pořadí...", - "we_are_not_online_right_now_please_leave_a_message": "Zrovna nejsme online. Zanechte nám prosím zprávu.", - "welcome": "Vítejte", - "write_your_message": "Napište svou zprávu...", - "yes": "Ano", - "you_browser_doesn_t_support_audio_element": "Váš prohlížeč nepodporuje zvukový prvek", - "you_browser_doesn_t_support_video_element": "Váš prohlížeč nepodporuje video prvek ", - "your_spot_is_spot": "Vaše místo je #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Vaše místo je #{{spot}} (Předpokládaný čas čekání: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Opravdu chcete ukončit chat?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Opravdu chcete smazat všechny Vaše osobní údaje?", + "are_you_sure_you_want_to_switch_the_department": "Opravdu chcete změnit oddělení?", + "cancel": "Zrušit", + "change_department": "Změnit oddělení", + "change_department_1": "Změnit Oddělení", + "chat_finished": "Chat Ukončen", + "choose_a_department": "Vybrat oddělení...", + "choose_a_department_1": "Vybrat oddělení", + "choose_an_option": "Vybrat možnost...", + "conversation_finished": "Konverzace ukončena", + "count_new_messages_since_since_one": "Jedna nová zpráva od {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} nových zpráv od {{val, datetime}}", + "department_switched": "Oddělení změněno", + "departments": "Oddělení", + "disable_notifications": "Zakázat oznámení", + "dismiss_this_alert": "Zrušit toto upozornění", + "drop_here_to_upload_a_file": "Přetažením sem nahrajte soubor", + "email": "E-mail", + "enable_notifications": "Povolit oznámení", + "error_closing_chat": "Chyba při zavírání chatu.", + "error_removing_user_data": "Chyba při odstraňování uživatelských dat.", + "error_starting_a_new_conversation_reason": "Chyba při zahájení nové konverzace: {{reason}}", + "expand_chat": "Rozbalit chat", + "field_required": "Pole je povinné", + "file_exceeds_allowed_size_of_size": "Soubor překračuje povolenou velikost{{size}}.", + "fileupload_error": "Chyba při nahrávání souboru", + "finish_this_chat": "Ukončit tento chat", + "forget_remove_my_data": "Zapomenout/Odebrat mé údaje", + "go_to_menu_options_forget_remove_my_personal_data": "Přejít do <1>možnosti nabídky → Zapomenout/Odebrat mé osobní údaje vyžádat okamžité odstranění Vašich osobních údajů.", + "i_agree": "Souhlasím", + "i_need_help_with": "Potřebuji pomoct s...", + "if_you_have_any_other_questions_just_press_the_but": "Pokud máte jakékoli další otázky, stačí stisknout tlačítko níže a zahájit nový chat", + "insert_your_field_here": "Sem vložte {{field}} ...", + "invalid_email": "Neplatný e-mail", + "invalid_value": "Neplatná hodnota", + "leave_a_message": "Zanechte zprávu", + "livechat_connected": "Livechat připojen.", + "livechat_is_not_connected": "Livechat není připojen.", + "media_types_not_accepted": "Typy příloh nebyly přijaty.", + "message": "Zpráva", + "minimize_chat": "Minimalizovat chat", + "name": "Jméno", + "need_help": "Potřebujete pomoc?", + "new_chat": "Nová konverzace", + "no": "Ne", + "no_available_agents_to_transfer": "Nejsou k dispozici žádní dostupní operátoři pro přenos", + "options": "Volby", + "please_tell_us_some_information_to_start_the_chat": "Řekněte nám prosím nějaké informace pro zahájení chatu", + "please_wait_for_the_next_available_agent": "Počkejte prosím na dalšího dostupného operátora", + "restore_chat": "Obnovit konverzaci", + "room_name_changed": "Název okna změněn", + "send": "Poslat", + "sound_is_off": "Zvuk je vypnutý", + "sound_is_on": "Zvuk je zapnutý", + "start_chat": "Zahájit konverzaci", + "thanks_for_talking_with_us": "Děkujeme, že jste s námi hovořil", + "the_controller_of_your_personal_data_is_company_na": "Správcem vašich osobních údajů je [Název společnosti] se sídlem [Adresa společnosti]. Zahájením konverzace souhlaste s tím, že vaše osobní údaje budou zpracovávány a předávány v souladu s obecným nařízením o ochraně údajů (GDPR).", + "type_your_message_here": "Zde napište svou zprávu", + "unread_messages": "nepřečtené zprávy", + "user_added_by": "Uživatel přidán", + "user_joined": "Uživatel se připojil", + "user_left": "Uživatel odešel", + "user_removed_by": "Uživatel odstraněn", + "waiting_queue": "Čekající v pořadí...", + "we_are_not_online_right_now_please_leave_a_message": "Zrovna nejsme online. Zanechte nám prosím zprávu.", + "welcome": "Vítejte", + "write_your_message": "Napište svou zprávu...", + "yes": "Ano", + "you_browser_doesn_t_support_audio_element": "Váš prohlížeč nepodporuje zvukový prvek", + "you_browser_doesn_t_support_video_element": "Váš prohlížeč nepodporuje video prvek ", + "your_spot_is_spot": "Vaše místo je #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Vaše místo je #{{spot}} (Předpokládaný čas čekání: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/cy.json b/packages/livechat/src/i18n/cy.json index 51006ddd71f02..bccee500c9258 100644 --- a/packages/livechat/src/i18n/cy.json +++ b/packages/livechat/src/i18n/cy.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Diddymu", - "conversation_finished": "Mae'r sgwrs wedi gorffen", - "department_switched": "Adran wedi newid", - "no": "Na", - "options": "Dewisiadau", - "send": "Anfon", - "user_joined": "Ymunodd y defnyddiwr", - "user_left": "Defnyddiwr ar ôl", - "we_are_not_online_right_now_please_leave_a_message": "Nid ydym ar-lein ar hyn o bryd. Os gwelwch yn dda, gadewch neges.", - "yes": "Ydw" - } -} + "translation": { + "cancel": "Diddymu", + "conversation_finished": "Mae'r sgwrs wedi gorffen", + "department_switched": "Adran wedi newid", + "no": "Na", + "options": "Dewisiadau", + "send": "Anfon", + "user_joined": "Ymunodd y defnyddiwr", + "user_left": "Defnyddiwr ar ôl", + "we_are_not_online_right_now_please_leave_a_message": "Nid ydym ar-lein ar hyn o bryd. Os gwelwch yn dda, gadewch neges.", + "yes": "Ydw" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/da.json b/packages/livechat/src/i18n/da.json index 1255c18e9c2cf..9973473129873 100644 --- a/packages/livechat/src/i18n/da.json +++ b/packages/livechat/src/i18n/da.json @@ -1,14 +1,14 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "Er du sikker på, at du vil skifte afdeling?", - "cancel": "Annuller", - "conversation_finished": "Samtalen er slut", - "department_switched": "Du har skiftet afdeling", - "no": "Nej", - "options": "Indstillinger", - "user_joined": "Brugeren sluttede sig til", - "user_left": "Brugeren tog sin afsked", - "we_are_not_online_right_now_please_leave_a_message": "Vi er ikke online lige nu. Efterlad en besked til os.", - "yes": "Ja" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "Er du sikker på, at du vil skifte afdeling?", + "cancel": "Annuller", + "conversation_finished": "Samtalen er slut", + "department_switched": "Du har skiftet afdeling", + "no": "Nej", + "options": "Indstillinger", + "user_joined": "Brugeren sluttede sig til", + "user_left": "Brugeren tog sin afsked", + "we_are_not_online_right_now_please_leave_a_message": "Vi er ikke online lige nu. Efterlad en besked til os.", + "yes": "Ja" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/de-AT.json b/packages/livechat/src/i18n/de-AT.json index 870f2cdc71839..3bfe91cae32c2 100644 --- a/packages/livechat/src/i18n/de-AT.json +++ b/packages/livechat/src/i18n/de-AT.json @@ -1,77 +1,77 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Sind Sie sicher, dass Sie den Chat beenden möchten?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Sind Sie sicher, dass Sie alle Ihre Daten löschen möchten?", - "are_you_sure_you_want_to_switch_the_department": "Sind Sie sicher, dass Sie die Abteilung wechseln möchten?", - "cancel": "Abbrechen", - "change_department": "Abteilung wechseln", - "change_department_1": "Abteilung wechseln", - "chat_finished": "Chat beendet", - "choose_a_department": "Wählen Sie eine Abteilung", - "choose_a_department_1": "Wählen Sie eine Abteilung", - "choose_an_option": "Wählen Sie eine Option", - "conversation_finished": "Gespräch beendet", - "count_new_messages_since_since_one": "Eine neue Nachricht seit {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} neue Nachrichten seit {{val, datetime}}", - "department_switched": "Abteilung wurde gewechselt", - "departments": "Abteilungen", - "disable_notifications": "Benachrichtigungen deaktivieren", - "dismiss_this_alert": "Diese Warnung schließen", - "drop_here_to_upload_a_file": "Datei zum Hochladen hierher ziehen", - "email": "E-Mail", - "enable_notifications": "Benachrichtigungen aktivieren", - "error_closing_chat": "Beim Schließen des Chats ist ein Fehler aufgetreten", - "error_removing_user_data": "Beim Löschen der Benutzerdaten ist ein Fehler aufgetreten", - "error_starting_a_new_conversation_reason": "Fehler beim Starten einer neuen Konversation: {{reason}}", - "expand_chat": "Chat vergrößern", - "field_required": "Feld erforderlich", - "file_exceeds_allowed_size_of_size": "Die Datei überschreitet die maximal erlaubte Größe von: {{size}}.", - "fileupload_error": "Datei-Upload Fehler", - "finish_this_chat": "Diesen Chat beenden", - "forget_remove_my_data": "Vergiss/Lösche meine Daten", - "gdpr": "DSGVO", - "go_to_menu_options_forget_remove_my_personal_data": "Gehen Sie zu <1>Menü Optionen → Vergiss/Lösche meine Daten, um die sofortige Löschung Ihrer Daten zu beantragen.", - "i_agree": "Ich stimme zu", - "i_need_help_with": "Ich benötige Hilfe mit ...", - "if_you_have_any_other_questions_just_press_the_but": "Falls Sie weitere Fragen haben, drücken Sie unten den Button, um einen neuen Chat zu beginnen.", - "insert_your_field_here": "Hier {{field}} eintragen ...", - "invalid_email": "Ungültige E-Mail-Adresse", - "invalid_value": "Ungültiger Wert", - "leave_a_message": "Hinterlassen Sie eine Nachricht", - "livechat_connected": "Livechat verbunden.", - "livechat_is_not_connected": "Livechat ist nicht verbunden.", - "media_types_not_accepted": "Der Medientyp wird nicht akzeptiert.", - "message": "Nachricht", - "minimize_chat": "Chat minimieren", - "need_help": "Benötigen Sie Hilfe?", - "new_chat": "Neuer Chat", - "no": "Nein", - "no_available_agents_to_transfer": "Keine verfügbaren Mitarbeiter/innen zum Übertragen", - "options": "Optionen", - "please_tell_us_some_information_to_start_the_chat": "Bitte nennen Sie uns ein paar Informationen, um den Chat zu beginnen", - "please_wait_for_the_next_available_agent": "Bitte haben Sie etwas Geduld. Wir sind in Kürze für Sie da ...", - "restore_chat": "Chat wiederaufnehmen", - "room_name_changed": "Raumname geändert", - "send": "Senden", - "sound_is_off": "Ton ist aus", - "sound_is_on": "Ton ist an", - "start_chat": "Chat beginnen", - "thanks_for_talking_with_us": "Vielen Dank für unser Gespräch", - "the_controller_of_your_personal_data_is_company_na": "Der Datenschutzbeauftragte Ihrer persönlichen Daten ist [Company Name], mit eingetragenem Firmensitz in [Company Address]. Indem Sie den Chat starten, erklären Sie sich damit einverstanden, dass Ihre persönlichen Daten im Einklang mit der Datenschutz-Grundverordnung (DSGVO) verarbeitet und weitergegeben werden.", - "type_your_message_here": "Geben Sie hier Ihre Nachricht ein", - "unread_messages": "ungelesene Nachrichten", - "user_added_by": "Benutzer/in hinzugefügt von", - "user_joined": "Benutzer/in ist dem Kanal beigetreten", - "user_left": "Benutzer/in hat den Kanal verlassen", - "user_removed_by": "Benutzer/in entfernt von", - "waiting_queue": "Warteschlange ...", - "we_are_not_online_right_now_please_leave_a_message": "Wir sind momentan nicht online. Bitte hinterlassen Sie uns eine Nachricht.", - "welcome": "Willkommen", - "write_your_message": "Schreiben Sie Ihre Nachricht ...", - "yes": "Ja", - "you_browser_doesn_t_support_audio_element": "Ihr Browser unterstützt keine Audio Elemente", - "you_browser_doesn_t_support_video_element": "Ihr Browser unterstützt keine Video Elemente", - "your_spot_is_spot": "Ihr Platz ist #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Ihr Platz ist #{{spot}} (geschätzte Wartezeit: {{estimatedWaitTime}})" - } + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Sind Sie sicher, dass Sie den Chat beenden möchten?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Sind Sie sicher, dass Sie alle Ihre Daten löschen möchten?", + "are_you_sure_you_want_to_switch_the_department": "Sind Sie sicher, dass Sie die Abteilung wechseln möchten?", + "cancel": "Abbrechen", + "change_department": "Abteilung wechseln", + "change_department_1": "Abteilung wechseln", + "chat_finished": "Chat beendet", + "choose_a_department": "Wählen Sie eine Abteilung", + "choose_a_department_1": "Wählen Sie eine Abteilung", + "choose_an_option": "Wählen Sie eine Option", + "conversation_finished": "Gespräch beendet", + "count_new_messages_since_since_one": "Eine neue Nachricht seit {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} neue Nachrichten seit {{val, datetime}}", + "department_switched": "Abteilung wurde gewechselt", + "departments": "Abteilungen", + "disable_notifications": "Benachrichtigungen deaktivieren", + "dismiss_this_alert": "Diese Warnung schließen", + "drop_here_to_upload_a_file": "Datei zum Hochladen hierher ziehen", + "email": "E-Mail", + "enable_notifications": "Benachrichtigungen aktivieren", + "error_closing_chat": "Beim Schließen des Chats ist ein Fehler aufgetreten", + "error_removing_user_data": "Beim Löschen der Benutzerdaten ist ein Fehler aufgetreten", + "error_starting_a_new_conversation_reason": "Fehler beim Starten einer neuen Konversation: {{reason}}", + "expand_chat": "Chat vergrößern", + "field_required": "Feld erforderlich", + "file_exceeds_allowed_size_of_size": "Die Datei überschreitet die maximal erlaubte Größe von: {{size}}.", + "fileupload_error": "Datei-Upload Fehler", + "finish_this_chat": "Diesen Chat beenden", + "forget_remove_my_data": "Vergiss/Lösche meine Daten", + "gdpr": "DSGVO", + "go_to_menu_options_forget_remove_my_personal_data": "Gehen Sie zu <1>Menü Optionen → Vergiss/Lösche meine Daten, um die sofortige Löschung Ihrer Daten zu beantragen.", + "i_agree": "Ich stimme zu", + "i_need_help_with": "Ich benötige Hilfe mit ...", + "if_you_have_any_other_questions_just_press_the_but": "Falls Sie weitere Fragen haben, drücken Sie unten den Button, um einen neuen Chat zu beginnen.", + "insert_your_field_here": "Hier {{field}} eintragen ...", + "invalid_email": "Ungültige E-Mail-Adresse", + "invalid_value": "Ungültiger Wert", + "leave_a_message": "Hinterlassen Sie eine Nachricht", + "livechat_connected": "Livechat verbunden.", + "livechat_is_not_connected": "Livechat ist nicht verbunden.", + "media_types_not_accepted": "Der Medientyp wird nicht akzeptiert.", + "message": "Nachricht", + "minimize_chat": "Chat minimieren", + "need_help": "Benötigen Sie Hilfe?", + "new_chat": "Neuer Chat", + "no": "Nein", + "no_available_agents_to_transfer": "Keine verfügbaren Mitarbeiter/innen zum Übertragen", + "options": "Optionen", + "please_tell_us_some_information_to_start_the_chat": "Bitte nennen Sie uns ein paar Informationen, um den Chat zu beginnen", + "please_wait_for_the_next_available_agent": "Bitte haben Sie etwas Geduld. Wir sind in Kürze für Sie da ...", + "restore_chat": "Chat wiederaufnehmen", + "room_name_changed": "Raumname geändert", + "send": "Senden", + "sound_is_off": "Ton ist aus", + "sound_is_on": "Ton ist an", + "start_chat": "Chat beginnen", + "thanks_for_talking_with_us": "Vielen Dank für unser Gespräch", + "the_controller_of_your_personal_data_is_company_na": "Der Datenschutzbeauftragte Ihrer persönlichen Daten ist [Company Name], mit eingetragenem Firmensitz in [Company Address]. Indem Sie den Chat starten, erklären Sie sich damit einverstanden, dass Ihre persönlichen Daten im Einklang mit der Datenschutz-Grundverordnung (DSGVO) verarbeitet und weitergegeben werden.", + "type_your_message_here": "Geben Sie hier Ihre Nachricht ein", + "unread_messages": "ungelesene Nachrichten", + "user_added_by": "Benutzer/in hinzugefügt von", + "user_joined": "Benutzer/in ist dem Kanal beigetreten", + "user_left": "Benutzer/in hat den Kanal verlassen", + "user_removed_by": "Benutzer/in entfernt von", + "waiting_queue": "Warteschlange ...", + "we_are_not_online_right_now_please_leave_a_message": "Wir sind momentan nicht online. Bitte hinterlassen Sie uns eine Nachricht.", + "welcome": "Willkommen", + "write_your_message": "Schreiben Sie Ihre Nachricht ...", + "yes": "Ja", + "you_browser_doesn_t_support_audio_element": "Ihr Browser unterstützt keine Audio Elemente", + "you_browser_doesn_t_support_video_element": "Ihr Browser unterstützt keine Video Elemente", + "your_spot_is_spot": "Ihr Platz ist #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Ihr Platz ist #{{spot}} (geschätzte Wartezeit: {{estimatedWaitTime}})" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/de.json b/packages/livechat/src/i18n/de.json index 1c59667099ed2..3bfe91cae32c2 100644 --- a/packages/livechat/src/i18n/de.json +++ b/packages/livechat/src/i18n/de.json @@ -1,77 +1,77 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Sind Sie sicher, dass Sie den Chat beenden möchten?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Sind Sie sicher, dass Sie alle Ihre Daten löschen möchten?", - "are_you_sure_you_want_to_switch_the_department": "Sind Sie sicher, dass Sie die Abteilung wechseln möchten?", - "cancel": "Abbrechen", - "change_department": "Abteilung wechseln", - "change_department_1": "Abteilung wechseln", - "chat_finished": "Chat beendet", - "choose_a_department": "Wählen Sie eine Abteilung", - "choose_a_department_1": "Wählen Sie eine Abteilung", - "choose_an_option": "Wählen Sie eine Option", - "conversation_finished": "Gespräch beendet", - "count_new_messages_since_since_one": "Eine neue Nachricht seit {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} neue Nachrichten seit {{val, datetime}}", - "department_switched": "Abteilung wurde gewechselt", - "departments": "Abteilungen", - "disable_notifications": "Benachrichtigungen deaktivieren", - "dismiss_this_alert": "Diese Warnung schließen", - "drop_here_to_upload_a_file": "Datei zum Hochladen hierher ziehen", - "email": "E-Mail", - "enable_notifications": "Benachrichtigungen aktivieren", - "error_closing_chat": "Beim Schließen des Chats ist ein Fehler aufgetreten", - "error_removing_user_data": "Beim Löschen der Benutzerdaten ist ein Fehler aufgetreten", - "error_starting_a_new_conversation_reason": "Fehler beim Starten einer neuen Konversation: {{reason}}", - "expand_chat": "Chat vergrößern", - "field_required": "Feld erforderlich", - "file_exceeds_allowed_size_of_size": "Die Datei überschreitet die maximal erlaubte Größe von: {{size}}.", - "fileupload_error": "Datei-Upload Fehler", - "finish_this_chat": "Diesen Chat beenden", - "forget_remove_my_data": "Vergiss/Lösche meine Daten", - "gdpr": "DSGVO", - "go_to_menu_options_forget_remove_my_personal_data": "Gehen Sie zu <1>Menü Optionen → Vergiss/Lösche meine Daten, um die sofortige Löschung Ihrer Daten zu beantragen.", - "i_agree": "Ich stimme zu", - "i_need_help_with": "Ich benötige Hilfe mit ...", - "if_you_have_any_other_questions_just_press_the_but": "Falls Sie weitere Fragen haben, drücken Sie unten den Button, um einen neuen Chat zu beginnen.", - "insert_your_field_here": "Hier {{field}} eintragen ...", - "invalid_email": "Ungültige E-Mail-Adresse", - "invalid_value": "Ungültiger Wert", - "leave_a_message": "Hinterlassen Sie eine Nachricht", - "livechat_connected": "Livechat verbunden.", - "livechat_is_not_connected": "Livechat ist nicht verbunden.", - "media_types_not_accepted": "Der Medientyp wird nicht akzeptiert.", - "message": "Nachricht", - "minimize_chat": "Chat minimieren", - "need_help": "Benötigen Sie Hilfe?", - "new_chat": "Neuer Chat", - "no": "Nein", - "no_available_agents_to_transfer": "Keine verfügbaren Mitarbeiter/innen zum Übertragen", - "options": "Optionen", - "please_tell_us_some_information_to_start_the_chat": "Bitte nennen Sie uns ein paar Informationen, um den Chat zu beginnen", - "please_wait_for_the_next_available_agent": "Bitte haben Sie etwas Geduld. Wir sind in Kürze für Sie da ...", - "restore_chat": "Chat wiederaufnehmen", - "room_name_changed": "Raumname geändert", - "send": "Senden", - "sound_is_off": "Ton ist aus", - "sound_is_on": "Ton ist an", - "start_chat": "Chat beginnen", - "thanks_for_talking_with_us": "Vielen Dank für unser Gespräch", - "the_controller_of_your_personal_data_is_company_na": "Der Datenschutzbeauftragte Ihrer persönlichen Daten ist [Company Name], mit eingetragenem Firmensitz in [Company Address]. Indem Sie den Chat starten, erklären Sie sich damit einverstanden, dass Ihre persönlichen Daten im Einklang mit der Datenschutz-Grundverordnung (DSGVO) verarbeitet und weitergegeben werden.", - "type_your_message_here": "Geben Sie hier Ihre Nachricht ein", - "unread_messages": "ungelesene Nachrichten", - "user_added_by": "Benutzer/in hinzugefügt von", - "user_joined": "Benutzer/in ist dem Kanal beigetreten", - "user_left": "Benutzer/in hat den Kanal verlassen", - "user_removed_by": "Benutzer/in entfernt von", - "waiting_queue": "Warteschlange ...", - "we_are_not_online_right_now_please_leave_a_message": "Wir sind momentan nicht online. Bitte hinterlassen Sie uns eine Nachricht.", - "welcome": "Willkommen", - "write_your_message": "Schreiben Sie Ihre Nachricht ...", - "yes": "Ja", - "you_browser_doesn_t_support_audio_element": "Ihr Browser unterstützt keine Audio Elemente", - "you_browser_doesn_t_support_video_element": "Ihr Browser unterstützt keine Video Elemente", - "your_spot_is_spot": "Ihr Platz ist #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Ihr Platz ist #{{spot}} (geschätzte Wartezeit: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Sind Sie sicher, dass Sie den Chat beenden möchten?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Sind Sie sicher, dass Sie alle Ihre Daten löschen möchten?", + "are_you_sure_you_want_to_switch_the_department": "Sind Sie sicher, dass Sie die Abteilung wechseln möchten?", + "cancel": "Abbrechen", + "change_department": "Abteilung wechseln", + "change_department_1": "Abteilung wechseln", + "chat_finished": "Chat beendet", + "choose_a_department": "Wählen Sie eine Abteilung", + "choose_a_department_1": "Wählen Sie eine Abteilung", + "choose_an_option": "Wählen Sie eine Option", + "conversation_finished": "Gespräch beendet", + "count_new_messages_since_since_one": "Eine neue Nachricht seit {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} neue Nachrichten seit {{val, datetime}}", + "department_switched": "Abteilung wurde gewechselt", + "departments": "Abteilungen", + "disable_notifications": "Benachrichtigungen deaktivieren", + "dismiss_this_alert": "Diese Warnung schließen", + "drop_here_to_upload_a_file": "Datei zum Hochladen hierher ziehen", + "email": "E-Mail", + "enable_notifications": "Benachrichtigungen aktivieren", + "error_closing_chat": "Beim Schließen des Chats ist ein Fehler aufgetreten", + "error_removing_user_data": "Beim Löschen der Benutzerdaten ist ein Fehler aufgetreten", + "error_starting_a_new_conversation_reason": "Fehler beim Starten einer neuen Konversation: {{reason}}", + "expand_chat": "Chat vergrößern", + "field_required": "Feld erforderlich", + "file_exceeds_allowed_size_of_size": "Die Datei überschreitet die maximal erlaubte Größe von: {{size}}.", + "fileupload_error": "Datei-Upload Fehler", + "finish_this_chat": "Diesen Chat beenden", + "forget_remove_my_data": "Vergiss/Lösche meine Daten", + "gdpr": "DSGVO", + "go_to_menu_options_forget_remove_my_personal_data": "Gehen Sie zu <1>Menü Optionen → Vergiss/Lösche meine Daten, um die sofortige Löschung Ihrer Daten zu beantragen.", + "i_agree": "Ich stimme zu", + "i_need_help_with": "Ich benötige Hilfe mit ...", + "if_you_have_any_other_questions_just_press_the_but": "Falls Sie weitere Fragen haben, drücken Sie unten den Button, um einen neuen Chat zu beginnen.", + "insert_your_field_here": "Hier {{field}} eintragen ...", + "invalid_email": "Ungültige E-Mail-Adresse", + "invalid_value": "Ungültiger Wert", + "leave_a_message": "Hinterlassen Sie eine Nachricht", + "livechat_connected": "Livechat verbunden.", + "livechat_is_not_connected": "Livechat ist nicht verbunden.", + "media_types_not_accepted": "Der Medientyp wird nicht akzeptiert.", + "message": "Nachricht", + "minimize_chat": "Chat minimieren", + "need_help": "Benötigen Sie Hilfe?", + "new_chat": "Neuer Chat", + "no": "Nein", + "no_available_agents_to_transfer": "Keine verfügbaren Mitarbeiter/innen zum Übertragen", + "options": "Optionen", + "please_tell_us_some_information_to_start_the_chat": "Bitte nennen Sie uns ein paar Informationen, um den Chat zu beginnen", + "please_wait_for_the_next_available_agent": "Bitte haben Sie etwas Geduld. Wir sind in Kürze für Sie da ...", + "restore_chat": "Chat wiederaufnehmen", + "room_name_changed": "Raumname geändert", + "send": "Senden", + "sound_is_off": "Ton ist aus", + "sound_is_on": "Ton ist an", + "start_chat": "Chat beginnen", + "thanks_for_talking_with_us": "Vielen Dank für unser Gespräch", + "the_controller_of_your_personal_data_is_company_na": "Der Datenschutzbeauftragte Ihrer persönlichen Daten ist [Company Name], mit eingetragenem Firmensitz in [Company Address]. Indem Sie den Chat starten, erklären Sie sich damit einverstanden, dass Ihre persönlichen Daten im Einklang mit der Datenschutz-Grundverordnung (DSGVO) verarbeitet und weitergegeben werden.", + "type_your_message_here": "Geben Sie hier Ihre Nachricht ein", + "unread_messages": "ungelesene Nachrichten", + "user_added_by": "Benutzer/in hinzugefügt von", + "user_joined": "Benutzer/in ist dem Kanal beigetreten", + "user_left": "Benutzer/in hat den Kanal verlassen", + "user_removed_by": "Benutzer/in entfernt von", + "waiting_queue": "Warteschlange ...", + "we_are_not_online_right_now_please_leave_a_message": "Wir sind momentan nicht online. Bitte hinterlassen Sie uns eine Nachricht.", + "welcome": "Willkommen", + "write_your_message": "Schreiben Sie Ihre Nachricht ...", + "yes": "Ja", + "you_browser_doesn_t_support_audio_element": "Ihr Browser unterstützt keine Audio Elemente", + "you_browser_doesn_t_support_video_element": "Ihr Browser unterstützt keine Video Elemente", + "your_spot_is_spot": "Ihr Platz ist #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Ihr Platz ist #{{spot}} (geschätzte Wartezeit: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/el.json b/packages/livechat/src/i18n/el.json index 29751d5cac7ab..eaf6ce80fc822 100644 --- a/packages/livechat/src/i18n/el.json +++ b/packages/livechat/src/i18n/el.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Ακύρωση", - "conversation_finished": "Η συνομιλία τελείωσε", - "department_switched": "Το τμήμα άλλαξε", - "no": "Όχι", - "options": "Επιλογές", - "send": "Αποστολή", - "user_joined": "Ο χρήστης συνδέθηκε", - "user_left": "Ο χρήστης έφυγε", - "we_are_not_online_right_now_please_leave_a_message": "Δεν είμαστε συνδεδεμένοι αυτήν τη στιγμή. Παρακαλώ αφήστε μήνυμα.", - "yes": "Ναι" - } -} + "translation": { + "cancel": "Ακύρωση", + "conversation_finished": "Η συνομιλία τελείωσε", + "department_switched": "Το τμήμα άλλαξε", + "no": "Όχι", + "options": "Επιλογές", + "send": "Αποστολή", + "user_joined": "Ο χρήστης συνδέθηκε", + "user_left": "Ο χρήστης έφυγε", + "we_are_not_online_right_now_please_leave_a_message": "Δεν είμαστε συνδεδεμένοι αυτήν τη στιγμή. Παρακαλώ αφήστε μήνυμα.", + "yes": "Ναι" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/en.json b/packages/livechat/src/i18n/en.json index 791e2262351f8..620f53be45e74 100644 --- a/packages/livechat/src/i18n/en.json +++ b/packages/livechat/src/i18n/en.json @@ -1,105 +1,105 @@ { - "translation": { - "accept": "Accept", - "are_you_sure_you_want_to_finish_this_chat": "Are you sure you want to finish this chat?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Are you sure you want to remove all of your personal data?", - "are_you_sure_you_want_to_switch_the_department": "Are you sure you want to switch the department?", - "call_end_time": "Call Ended at {{time, datetime}} - Lasted {{callDuration, datetime}}", - "cancel": "Cancel", - "change_department": "Change department", - "change_department_1": "Change Department", - "chat_finished": "Chat Finished", - "chat_now": "Chat now", - "chat_started": "Chat started", - "choose_a_department": "Choose a department...", - "choose_a_department_1": "Choose a department", - "choose_an_option": "Choose an option...", - "conversation_finished": "Conversation finished", - "count_new_messages_since_since_one": "One new message since {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} new messages since {{val, datetime}}", - "decline": "Decline", - "department_switched": "Department switched", - "departments": "Departments", - "disable_notifications": "Disable notifications", - "dismiss_this_alert": "Dismiss this alert", - "drop_here_to_upload_a_file": "Drop here to upload a file", - "email": "Email", - "enable_notifications": "Enable notifications", - "error_closing_chat": "Error closing chat.", - "error_getting_call_alert": "Error getting call alert.", - "error_removing_user_data": "Error removing user data.", - "error_starting_a_new_conversation_reason": "Error starting a new conversation: {{reason}}", - "expand_chat": "Expand chat", - "field_required": "Field required", - "file_exceeds_allowed_size_of_size": "File exceeds allowed size of {{size}}.", - "fileupload_error": "FileUpload Error", - "finish_this_chat": "Finish this chat", - "forget_remove_my_data": "Forget/Remove my data", - "from_returned_the_chat_to_the_queue": "{{from}} returned the chat to the queue", - "the_agent_transferred_the_chat_to_the_department_to": "The agent transferred the chat to the department {{to}}", - "from_transferred_the_chat_to_the_department_to": "{{from}} transferred the chat to the department {{to}}", - "from_transferred_the_chat_to_to": "{{from}} transferred the chat to {{to}}", - "gdpr": "GDPR", - "go_to_menu_options_forget_remove_my_personal_data": "Go to <1>menu options → Forget/Remove my personal data to request the immediate removal of your data.", - "hiddenelementscount_more": "+ {{hiddenElementsCount}} more", - "i_agree": "I Agree", - "i_need_help_with": "I need help with...", - "if_you_have_any_other_questions_just_press_the_but": "If you have any other questions, just press the button below to start a new chat.", - "incoming_video_call": "Incoming video Call", - "insert_your_field_here": "Insert your {{field}} here...", - "invalid_email": "Invalid email", - "invalid_value": "Invalid value", - "join_call": "Join Call", - "join_my_room_to_start_the_video_call": "Join my room to start the video call", - "leave_a_message": "Leave a message", - "livechat_connected": "Livechat connected.", - "livechat_is_not_connected": "Livechat is not connected.", - "media_types_not_accepted": "Media Types Not Accepted.", - "message": "Message", - "messages": "Messages", - "message_separator_date": "{{val, datetime}}", - "message_time": "{{val, datetime}}", - "minimize_chat": "Minimize chat", - "name": "Name", - "need_help": "Need help?", - "new_chat": "New Chat", - "no": "No", - "no_available_agents_to_transfer": "No available agents to transfer", - "ok": "OK", - "options": "Options", - "please_tell_us_some_information_to_start_the_chat": "Please, tell us some information to start the chat", - "please_wait_for_the_next_available_agent": "Please, wait for the next available agent..", - "powered_by_rocket_chat": "Powered by Rocket.Chat", - "restore_chat": "Restore chat", - "room_name_changed": "Room name changed", - "send": "Send", - "sound_is_off": "Sound is off", - "sound_is_on": "Sound is on", - "start_chat": "Start chat", - "thanks_for_talking_with_us": "Thanks for talking with us", - "the_chat_was_moved_back_to_queue": "The chat was moved back to queue", - "the_chat_was_moved_back_to_queue_due_to_unanswered": "The chat was moved back to queue since it was unanswered for {{duration}} seconds", - "the_chat_was_transferred_to_another_agent": "The chat was transferred to another agent", - "the_chat_was_transferred_to_another_agent_due_to_unanswered": "The chat was transferred to another agent since it was unanswered for {{duration}} seconds", - "the_controller_of_your_personal_data_is_company_na": "The controller of your personal data is [Company Name], with registered office at [Company Address]. To start the chat you agree that your personal data shall be processed and trasmitted in accordance with the General Data Protection Regulation (GDPR).", - "transcript_success": "Transcript sent", - "type_your_message_here": "Type your message here", - "unread_messages_count_one": "{{count}} unread message", - "unread_messages_count_other": "{{count}} unread messages", - "unread_messages": "unread messages", - "user_added_by": "User added by", - "user_joined": "User joined", - "user_left": "User left", - "user_removed_by": "User removed by", - "waiting_queue": "Waiting queue...", - "we_are_not_online_right_now_please_leave_a_message": "We are not online right now. Please, leave a message.", - "welcome": "Welcome", - "would_you_like_a_copy_of_this_chat_emailed":"Would you like a copy of this chat emailed?", - "write_your_message": "Write your message...", - "yes": "Yes", - "you_browser_doesn_t_support_audio_element": "You browser doesn't support audio element", - "you_browser_doesn_t_support_video_element": "You browser doesn't support video element", - "your_spot_is_spot": "Your spot is #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Your spot is #{{spot}} (Estimated wait time: {{estimatedWaitTime}})" - } -} + "translation": { + "accept": "Accept", + "are_you_sure_you_want_to_finish_this_chat": "Are you sure you want to finish this chat?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Are you sure you want to remove all of your personal data?", + "are_you_sure_you_want_to_switch_the_department": "Are you sure you want to switch the department?", + "call_end_time": "Call Ended at {{time, datetime}} - Lasted {{callDuration, datetime}}", + "cancel": "Cancel", + "change_department": "Change department", + "change_department_1": "Change Department", + "chat_finished": "Chat Finished", + "chat_now": "Chat now", + "chat_started": "Chat started", + "choose_a_department": "Choose a department...", + "choose_a_department_1": "Choose a department", + "choose_an_option": "Choose an option...", + "conversation_finished": "Conversation finished", + "count_new_messages_since_since_one": "One new message since {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} new messages since {{val, datetime}}", + "decline": "Decline", + "department_switched": "Department switched", + "departments": "Departments", + "disable_notifications": "Disable notifications", + "dismiss_this_alert": "Dismiss this alert", + "drop_here_to_upload_a_file": "Drop here to upload a file", + "email": "Email", + "enable_notifications": "Enable notifications", + "error_closing_chat": "Error closing chat.", + "error_getting_call_alert": "Error getting call alert.", + "error_removing_user_data": "Error removing user data.", + "error_starting_a_new_conversation_reason": "Error starting a new conversation: {{reason}}", + "expand_chat": "Expand chat", + "field_required": "Field required", + "file_exceeds_allowed_size_of_size": "File exceeds allowed size of {{size}}.", + "fileupload_error": "FileUpload Error", + "finish_this_chat": "Finish this chat", + "forget_remove_my_data": "Forget/Remove my data", + "from_returned_the_chat_to_the_queue": "{{from}} returned the chat to the queue", + "the_agent_transferred_the_chat_to_the_department_to": "The agent transferred the chat to the department {{to}}", + "from_transferred_the_chat_to_the_department_to": "{{from}} transferred the chat to the department {{to}}", + "from_transferred_the_chat_to_to": "{{from}} transferred the chat to {{to}}", + "gdpr": "GDPR", + "go_to_menu_options_forget_remove_my_personal_data": "Go to <1>menu options → Forget/Remove my personal data to request the immediate removal of your data.", + "hiddenelementscount_more": "+ {{hiddenElementsCount}} more", + "i_agree": "I Agree", + "i_need_help_with": "I need help with...", + "if_you_have_any_other_questions_just_press_the_but": "If you have any other questions, just press the button below to start a new chat.", + "incoming_video_call": "Incoming video Call", + "insert_your_field_here": "Insert your {{field}} here...", + "invalid_email": "Invalid email", + "invalid_value": "Invalid value", + "join_call": "Join Call", + "join_my_room_to_start_the_video_call": "Join my room to start the video call", + "leave_a_message": "Leave a message", + "livechat_connected": "Livechat connected.", + "livechat_is_not_connected": "Livechat is not connected.", + "media_types_not_accepted": "Media Types Not Accepted.", + "message": "Message", + "messages": "Messages", + "message_separator_date": "{{val, datetime}}", + "message_time": "{{val, datetime}}", + "minimize_chat": "Minimize chat", + "name": "Name", + "need_help": "Need help?", + "new_chat": "New Chat", + "no": "No", + "no_available_agents_to_transfer": "No available agents to transfer", + "ok": "OK", + "options": "Options", + "please_tell_us_some_information_to_start_the_chat": "Please, tell us some information to start the chat", + "please_wait_for_the_next_available_agent": "Please, wait for the next available agent..", + "powered_by_rocket_chat": "Powered by Rocket.Chat", + "restore_chat": "Restore chat", + "room_name_changed": "Room name changed", + "send": "Send", + "sound_is_off": "Sound is off", + "sound_is_on": "Sound is on", + "start_chat": "Start chat", + "thanks_for_talking_with_us": "Thanks for talking with us", + "the_chat_was_moved_back_to_queue": "The chat was moved back to queue", + "the_chat_was_moved_back_to_queue_due_to_unanswered": "The chat was moved back to queue since it was unanswered for {{duration}} seconds", + "the_chat_was_transferred_to_another_agent": "The chat was transferred to another agent", + "the_chat_was_transferred_to_another_agent_due_to_unanswered": "The chat was transferred to another agent since it was unanswered for {{duration}} seconds", + "the_controller_of_your_personal_data_is_company_na": "The controller of your personal data is [Company Name], with registered office at [Company Address]. To start the chat you agree that your personal data shall be processed and trasmitted in accordance with the General Data Protection Regulation (GDPR).", + "transcript_success": "Transcript sent", + "type_your_message_here": "Type your message here", + "unread_messages_count_one": "{{count}} unread message", + "unread_messages_count_other": "{{count}} unread messages", + "unread_messages": "unread messages", + "user_added_by": "User added by", + "user_joined": "User joined", + "user_left": "User left", + "user_removed_by": "User removed by", + "waiting_queue": "Waiting queue...", + "we_are_not_online_right_now_please_leave_a_message": "We are not online right now. Please, leave a message.", + "welcome": "Welcome", + "would_you_like_a_copy_of_this_chat_emailed": "Would you like a copy of this chat emailed?", + "write_your_message": "Write your message...", + "yes": "Yes", + "you_browser_doesn_t_support_audio_element": "You browser doesn't support audio element", + "you_browser_doesn_t_support_video_element": "You browser doesn't support video element", + "your_spot_is_spot": "Your spot is #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Your spot is #{{spot}} (Estimated wait time: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/eo.json b/packages/livechat/src/i18n/eo.json index 58a17723677d5..8b3e977052811 100644 --- a/packages/livechat/src/i18n/eo.json +++ b/packages/livechat/src/i18n/eo.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Nuligi", - "conversation_finished": "Konversacio finis", - "department_switched": "Fako ŝaltis", - "no": "Ne", - "options": "Opcioj", - "send": "Sendu", - "user_joined": "Uzanto aliĝis", - "user_left": "Uzanto maldekstre", - "we_are_not_online_right_now_please_leave_a_message": "Ni ne estas interrete nun. Bonvolu lasi mesaĝon.", - "yes": "Jes" - } -} + "translation": { + "cancel": "Nuligi", + "conversation_finished": "Konversacio finis", + "department_switched": "Fako ŝaltis", + "no": "Ne", + "options": "Opcioj", + "send": "Sendu", + "user_joined": "Uzanto aliĝis", + "user_left": "Uzanto maldekstre", + "we_are_not_online_right_now_please_leave_a_message": "Ni ne estas interrete nun. Bonvolu lasi mesaĝon.", + "yes": "Jes" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/es.json b/packages/livechat/src/i18n/es.json index 832654c2c089d..04bb8438d13fc 100644 --- a/packages/livechat/src/i18n/es.json +++ b/packages/livechat/src/i18n/es.json @@ -1,77 +1,77 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "¿Estás seguro que quieres finalizar este chat?", - "are_you_sure_you_want_to_remove_all_of_your_person": "¿Estás seguro que quieres eliminar todos tus datos personales?", - "are_you_sure_you_want_to_switch_the_department": "¿Estás seguro que quieres cambiar el departamento?", - "cancel": "Cancelar", - "change_department": "Cambiar el departamento", - "change_department_1": "Cambiar el departamento", - "chat_finished": "Chat terminado", - "chat_now": "Chatear ahora", - "choose_a_department": "Seleccione un departamento", - "choose_a_department_1": "Seleccione un departamento", - "choose_an_option": "Seleccione una opción...", - "conversation_finished": "Conversación terminada", - "count_new_messages_since_since_one": "Un nuevo mensaje desde {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} nuevos mensajes desde {{val, datetime}}", - "department_switched": "Departamento cambiado", - "departments": "Departamentos", - "disable_notifications": "Desactivar notificaciones", - "dismiss_this_alert": "Descartar esta alerta", - "drop_here_to_upload_a_file": "Arrastre aquí para subir un archivo", - "enable_notifications": "Activar notificaciones", - "error_closing_chat": "Error cerrando el chat.", - "error_removing_user_data": "Error eliminando datos de usuario.", - "error_starting_a_new_conversation_reason": "Error al iniciar una nueva conversación: {{reason}}", - "expand_chat": "Expandir chat", - "field_required": "Archivo requerido", - "file_exceeds_allowed_size_of_size": "El archivo excede el tamaño permitido {{size}}.", - "fileupload_error": "Error en subida de archivo", - "finish_this_chat": "Finalizar este chat", - "forget_remove_my_data": "Olvidar/Eliminar mis datos", - "go_to_menu_options_forget_remove_my_personal_data": "Ir al <1>menu opciones → Olvidar/Eliminar mis datos para solicitar la inmediata remoción de tus datos.", - "hiddenelementscount_more": "+ {{hiddenElementsCount}} más", - "i_agree": "Acepto", - "i_need_help_with": "Necesito ayuda con...", - "if_you_have_any_other_questions_just_press_the_but": "Si tiene otra pregunta, simplemente presione el botón a continuación para iniciar un nuevo chat.", - "insert_your_field_here": "Ingrese su {{field}} aquí...", - "invalid_email": "Email no válido", - "invalid_value": "Valor no válido", - "leave_a_message": "Deje un mensaje", - "livechat_connected": "Livechat conectado.", - "livechat_is_not_connected": "Livechat no está conectado.", - "media_types_not_accepted": "Tipos de medios no aceptado.", - "message": "Mensaje", - "minimize_chat": "Minimizar chat", - "name": "Nombre", - "need_help": "¿Necesita ayuda?", - "new_chat": "Nuevo Chat", - "no_available_agents_to_transfer": "No hay agentes disponibles para transferir", - "options": "Opciones", - "please_tell_us_some_information_to_start_the_chat": "Por favor, ingrese alguna información para iniciar el chat", - "please_wait_for_the_next_available_agent": "Por favor, espere al próximo agente disponible.", - "restore_chat": "Restaurar chat", - "room_name_changed": "Nombre de sala cambiado", - "send": "Enviar", - "sound_is_off": "Sonido encendido", - "sound_is_on": "Sonido apagado", - "start_chat": "Comenzar chat", - "thanks_for_talking_with_us": "Gracias por hablar con nosotros", - "the_controller_of_your_personal_data_is_company_na": "El controlador de sus datos personales es [Company Name], con domicilio en [Company Address]. Para iniciar el chat, acepta que sus datos personales se procesen y transmitan de acuerdo con el Reglamento General de Protección de Datos (GDPR).", - "type_your_message_here": "Escribe tu mensaje aquí", - "unread_messages": "Mensajes no leídos", - "user_added_by": "Usuario agregado por", - "user_joined": "Usuario agregado", - "user_left": "El usuario ha abandonado la sala", - "user_removed_by": "Usuario eliminado por", - "waiting_queue": "Esperando cola...", - "we_are_not_online_right_now_please_leave_a_message": "No estamos en línea en este momento. Por favor, deje un mensaje.", - "welcome": "Bienvenido", - "write_your_message": "Escribe tu mensaje...", - "yes": "Si", - "you_browser_doesn_t_support_audio_element": "Tu navegador no soporta elementos de audio", - "you_browser_doesn_t_support_video_element": "Tu navegador no soporta elementos de video", - "your_spot_is_spot": "Tu lugar es #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Tu lugar es #{{spot}} (Tiempo de espera estimado: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "¿Estás seguro que quieres finalizar este chat?", + "are_you_sure_you_want_to_remove_all_of_your_person": "¿Estás seguro que quieres eliminar todos tus datos personales?", + "are_you_sure_you_want_to_switch_the_department": "¿Estás seguro que quieres cambiar el departamento?", + "cancel": "Cancelar", + "change_department": "Cambiar el departamento", + "change_department_1": "Cambiar el departamento", + "chat_finished": "Chat terminado", + "chat_now": "Chatear ahora", + "choose_a_department": "Seleccione un departamento", + "choose_a_department_1": "Seleccione un departamento", + "choose_an_option": "Seleccione una opción...", + "conversation_finished": "Conversación terminada", + "count_new_messages_since_since_one": "Un nuevo mensaje desde {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} nuevos mensajes desde {{val, datetime}}", + "department_switched": "Departamento cambiado", + "departments": "Departamentos", + "disable_notifications": "Desactivar notificaciones", + "dismiss_this_alert": "Descartar esta alerta", + "drop_here_to_upload_a_file": "Arrastre aquí para subir un archivo", + "enable_notifications": "Activar notificaciones", + "error_closing_chat": "Error cerrando el chat.", + "error_removing_user_data": "Error eliminando datos de usuario.", + "error_starting_a_new_conversation_reason": "Error al iniciar una nueva conversación: {{reason}}", + "expand_chat": "Expandir chat", + "field_required": "Archivo requerido", + "file_exceeds_allowed_size_of_size": "El archivo excede el tamaño permitido {{size}}.", + "fileupload_error": "Error en subida de archivo", + "finish_this_chat": "Finalizar este chat", + "forget_remove_my_data": "Olvidar/Eliminar mis datos", + "go_to_menu_options_forget_remove_my_personal_data": "Ir al <1>menu opciones → Olvidar/Eliminar mis datos para solicitar la inmediata remoción de tus datos.", + "hiddenelementscount_more": "+ {{hiddenElementsCount}} más", + "i_agree": "Acepto", + "i_need_help_with": "Necesito ayuda con...", + "if_you_have_any_other_questions_just_press_the_but": "Si tiene otra pregunta, simplemente presione el botón a continuación para iniciar un nuevo chat.", + "insert_your_field_here": "Ingrese su {{field}} aquí...", + "invalid_email": "Email no válido", + "invalid_value": "Valor no válido", + "leave_a_message": "Deje un mensaje", + "livechat_connected": "Livechat conectado.", + "livechat_is_not_connected": "Livechat no está conectado.", + "media_types_not_accepted": "Tipos de medios no aceptado.", + "message": "Mensaje", + "minimize_chat": "Minimizar chat", + "name": "Nombre", + "need_help": "¿Necesita ayuda?", + "new_chat": "Nuevo Chat", + "no_available_agents_to_transfer": "No hay agentes disponibles para transferir", + "options": "Opciones", + "please_tell_us_some_information_to_start_the_chat": "Por favor, ingrese alguna información para iniciar el chat", + "please_wait_for_the_next_available_agent": "Por favor, espere al próximo agente disponible.", + "restore_chat": "Restaurar chat", + "room_name_changed": "Nombre de sala cambiado", + "send": "Enviar", + "sound_is_off": "Sonido encendido", + "sound_is_on": "Sonido apagado", + "start_chat": "Comenzar chat", + "thanks_for_talking_with_us": "Gracias por hablar con nosotros", + "the_controller_of_your_personal_data_is_company_na": "El controlador de sus datos personales es [Company Name], con domicilio en [Company Address]. Para iniciar el chat, acepta que sus datos personales se procesen y transmitan de acuerdo con el Reglamento General de Protección de Datos (GDPR).", + "type_your_message_here": "Escribe tu mensaje aquí", + "unread_messages": "Mensajes no leídos", + "user_added_by": "Usuario agregado por", + "user_joined": "Usuario agregado", + "user_left": "El usuario ha abandonado la sala", + "user_removed_by": "Usuario eliminado por", + "waiting_queue": "Esperando cola...", + "we_are_not_online_right_now_please_leave_a_message": "No estamos en línea en este momento. Por favor, deje un mensaje.", + "welcome": "Bienvenido", + "write_your_message": "Escribe tu mensaje...", + "yes": "Si", + "you_browser_doesn_t_support_audio_element": "Tu navegador no soporta elementos de audio", + "you_browser_doesn_t_support_video_element": "Tu navegador no soporta elementos de video", + "your_spot_is_spot": "Tu lugar es #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Tu lugar es #{{spot}} (Tiempo de espera estimado: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/et.json b/packages/livechat/src/i18n/et.json index eb808a79f6db6..364e82585912d 100644 --- a/packages/livechat/src/i18n/et.json +++ b/packages/livechat/src/i18n/et.json @@ -1,13 +1,13 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "Oled sa kindel, et soovid osakonda vahetada?", - "cancel": "Tühista", - "conversation_finished": "Vestlus on lõppenud", - "department_switched": "Osakond vahetatud", - "no": "Ei", - "options": "Valikud", - "send": "Saada", - "user_joined": "Kasutaja liitus", - "user_left": "Kasutaja lahkus" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "Oled sa kindel, et soovid osakonda vahetada?", + "cancel": "Tühista", + "conversation_finished": "Vestlus on lõppenud", + "department_switched": "Osakond vahetatud", + "no": "Ei", + "options": "Valikud", + "send": "Saada", + "user_joined": "Kasutaja liitus", + "user_left": "Kasutaja lahkus" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/eu.json b/packages/livechat/src/i18n/eu.json index 5516b0b65fc62..f4c701fbc6a38 100644 --- a/packages/livechat/src/i18n/eu.json +++ b/packages/livechat/src/i18n/eu.json @@ -1,13 +1,13 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "Ziur zaude saioa aldatu nahi duzula?", - "cancel": "Ezeztatu", - "conversation_finished": "Elkarrizketa amaitu da", - "no": "Ez", - "options": "Aukerak", - "send": "Bidali", - "user_joined": "Erabiltzailea sartu da", - "user_left": "Erabiltzailea irten da", - "yes": "Bai" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "Ziur zaude saioa aldatu nahi duzula?", + "cancel": "Ezeztatu", + "conversation_finished": "Elkarrizketa amaitu da", + "no": "Ez", + "options": "Aukerak", + "send": "Bidali", + "user_joined": "Erabiltzailea sartu da", + "user_left": "Erabiltzailea irten da", + "yes": "Bai" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/fa.json b/packages/livechat/src/i18n/fa.json index 91fced7f0b60b..283d32401d81d 100644 --- a/packages/livechat/src/i18n/fa.json +++ b/packages/livechat/src/i18n/fa.json @@ -1,101 +1,101 @@ { - "translation": { - "accept": "پذیرفتن", - "are_you_sure_you_want_to_finish_this_chat": "آیا شما می خواید به این مکالمه پایان دهید؟", - "are_you_sure_you_want_to_remove_all_of_your_person": "آیا از پاک شدن تمام اطلاعات شخصی خود اطمینان دارید؟", - "are_you_sure_you_want_to_switch_the_department": "ایا مطمئن هستید که میخواهید بخش را عوض کنید؟", - "call_end_time": "تماس در زمان {{time, datetime}} پایان یافت - مدت {{callDuration, datetime}}", - "cancel": "لغو", - "change_department": "تغییر بخش", - "change_department_1": "تغییر بخش", - "chat_finished": "گفتگو پایان یافت", - "chat_now": "گفتگو کنید", - "chat_started": "گفتگو شروع شد", - "choose_a_department": "یک بخش را انتخاب کنید ...", - "choose_a_department_1": "یک بخش را انتخاب کنید", - "choose_an_option": "یک گزینه را انتخاب کنید", - "conversation_finished": "مکالمه به پایان رسید", - "count_new_messages_since_since_one": "یک پیام جدید از {{val, datetime}} قبل", - "count_new_messages_since_since_other": "{{count}} پیام جدید از {{val, datetime}} قبل", - "decline": "رد کردن", - "department_switched": "گروه عوض شد", - "departments": "بخش ها", - "disable_notifications": "غیرفعال کردن اعلان ها", - "dismiss_this_alert": "نادیده گرفتن این هشدار", - "drop_here_to_upload_a_file": "فایل را اینجا رها کنید", - "email": "ایمیل", - "enable_notifications": "فعال کردن اعلان ها", - "error_closing_chat": "خطا در بستن گفتگو.", - "error_getting_call_alert": "خطا در دریافت هشدار تماس.", - "error_removing_user_data": "خطا در حذف اطلاعات کاربر.", - "error_starting_a_new_conversation_reason": "خطا در ایجاد گفتگوی جدید: {{reason}}", - "expand_chat": "گسترش گفتگو", - "field_required": "فیلد اجباری است", - "file_exceeds_allowed_size_of_size": "حجم فایل بیشتر از حد مجاز ({{size}}) است.", - "fileupload_error": "خطا در آپلود فایل", - "finish_this_chat": "پایان این گفتگو", - "forget_remove_my_data": "حذف اطلاعات من", - "from_returned_the_chat_to_the_queue": "{{from}} گفتگو را به صف برگرداند", - "the_agent_transferred_the_chat_to_the_department_to": "پشتیبان چت را به بخش {{to}} منتقل کرد", - "from_transferred_the_chat_to_the_department_to": "{{from}} گفتگو را به بخش {{to}} منتقل کرد", - "from_transferred_the_chat_to_to": "{{from}} گفتگو را به {{to}} منتقل کرد", - "gdpr": "مقررات عمومی حفاظت از داده اتحادیه اروپا (GDPR)", - "go_to_menu_options_forget_remove_my_personal_data": "به <1>menu options → Forget/Remove my personal data بروید تا درخواست حذف بلافاصله ی اطلاعات خود را بدهید", - "hiddenelementscount_more": "+ {{hiddenElementsCount}} مورد دیگر", - "i_agree": "موافقم", - "i_need_help_with": "نیاز به کمک در بخش زیر را دارم", - "if_you_have_any_other_questions_just_press_the_but": "اگر هرگونه سوال دیگری دارید، بر روی دکمه ی زیر کلیک کنید تا یک گفتگو آغاز شود", - "incoming_video_call": "تماس تصویری دریافتی", - "insert_your_field_here": "{{field}} خود را اینجا وارد کنید ...", - "invalid_email": "ایمیل نامعتبر است", - "invalid_value": "مقدار نامعتبر است", - "join_call": "به تماس بپیوندید", - "join_my_room_to_start_the_video_call": "برای شروع تماس تصویری به اتاق من بپیوندید", - "leave_a_message": "یک پیام بگذارید", - "livechat_connected": "Livechat وصل شد.", - "livechat_is_not_connected": "Livechat وصل نشد.", - "media_types_not_accepted": "این نوع فایل قابل قبول نیست.", - "message": "پیام", - "messages": "پیام ها", - "minimize_chat": "کوچک کردن گفتگو", - "name": "نام", - "need_help": "نیاز به کمک دارید?", - "new_chat": "گفتگوی جدید", - "no": "خیر", - "no_available_agents_to_transfer": "هیچ پشتیبانی برای انتقال در دسترس نیست", - "ok": "باشد", - "options": "گزینه ها", - "please_tell_us_some_information_to_start_the_chat": "لطفاً برای شروع گفتگو اطلاعاتی را به ما بدهید", - "please_wait_for_the_next_available_agent": "لطفا تا در دسترس قرار گرفتن پشتیبان متنظر بمانید..", - "powered_by_rocket_chat": "قدرت گرفته از Rocket.Chat", - "restore_chat": "بازگردانی گفتگو", - "room_name_changed": "نام اتاق عوض شد", - "send": "ارسال", - "sound_is_off": "صدا قطع شد", - "sound_is_on": "صدا وصل شد", - "start_chat": "آغاز گفتگو", - "thanks_for_talking_with_us": "متشکر از تماس شما با ما", - "the_chat_was_moved_back_to_queue": "گفتگو به صف برگشت", - "the_chat_was_moved_back_to_queue_due_to_unanswered": "گفتگو از آنجایی که برای {{duration}} ثانیه بی پاسخ بود، به صف برگشت", - "the_chat_was_transferred_to_another_agent": "گفتگو به پشتیبان دیگری منتقل شد", - "the_chat_was_transferred_to_another_agent_due_to_unanswered": "گفتگو از آنجایی که برای {{duration}} ثانیه بی پاسخ بود به پشتیبان دیگری منتقل شد", - "the_controller_of_your_personal_data_is_company_na": "کنترل اطلاعات شما در دست شرکت [Company Name], به آدرس [Company Address] است. برای شروع گفتگو لازم از مقررات عمومی حفاظت از داده اتحادیه اروپا (GDPR) را تایید کنید.", - "transcript_success": "رونوشت ارسال شد", - "type_your_message_here": "پیام خود را اینجا تایپ کنید", - "unread_messages_count_one": "{{count}} پیام خوانده نشده", - "unread_messages": "پیام های خوانده نشده", - "user_added_by": "کاربر اضافه شد، توسط", - "user_joined": "کابر ملحق شد", - "user_left": "کاربر خارج شد", - "user_removed_by": "کاربر حذف شد، توسط", - "waiting_queue": "صف انتظار ...", - "we_are_not_online_right_now_please_leave_a_message": "ما در حال حاضر آنلاین نیستیم. لطفا پیام بگذارید", - "welcome": "خوش آمدید", - "write_your_message": "پیام خود را بنویسید ...", - "yes": "بله", - "you_browser_doesn_t_support_audio_element": "مرورگر شما صوت را پشتیبانی نمی کند", - "you_browser_doesn_t_support_video_element": "مرورگر شما ویدئو را پشتیبانی نمی کند", - "your_spot_is_spot": "نوبت شما #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "نوبت شما #{{spot}} است (مدت زمان تخمین زده شده: {{estimatedWaitTime}})" - } -} + "translation": { + "accept": "پذیرفتن", + "are_you_sure_you_want_to_finish_this_chat": "آیا شما می خواید به این مکالمه پایان دهید؟", + "are_you_sure_you_want_to_remove_all_of_your_person": "آیا از پاک شدن تمام اطلاعات شخصی خود اطمینان دارید؟", + "are_you_sure_you_want_to_switch_the_department": "ایا مطمئن هستید که میخواهید بخش را عوض کنید؟", + "call_end_time": "تماس در زمان {{time, datetime}} پایان یافت - مدت {{callDuration, datetime}}", + "cancel": "لغو", + "change_department": "تغییر بخش", + "change_department_1": "تغییر بخش", + "chat_finished": "گفتگو پایان یافت", + "chat_now": "گفتگو کنید", + "chat_started": "گفتگو شروع شد", + "choose_a_department": "یک بخش را انتخاب کنید ...", + "choose_a_department_1": "یک بخش را انتخاب کنید", + "choose_an_option": "یک گزینه را انتخاب کنید", + "conversation_finished": "مکالمه به پایان رسید", + "count_new_messages_since_since_one": "یک پیام جدید از {{val, datetime}} قبل", + "count_new_messages_since_since_other": "{{count}} پیام جدید از {{val, datetime}} قبل", + "decline": "رد کردن", + "department_switched": "گروه عوض شد", + "departments": "بخش ها", + "disable_notifications": "غیرفعال کردن اعلان ها", + "dismiss_this_alert": "نادیده گرفتن این هشدار", + "drop_here_to_upload_a_file": "فایل را اینجا رها کنید", + "email": "ایمیل", + "enable_notifications": "فعال کردن اعلان ها", + "error_closing_chat": "خطا در بستن گفتگو.", + "error_getting_call_alert": "خطا در دریافت هشدار تماس.", + "error_removing_user_data": "خطا در حذف اطلاعات کاربر.", + "error_starting_a_new_conversation_reason": "خطا در ایجاد گفتگوی جدید: {{reason}}", + "expand_chat": "گسترش گفتگو", + "field_required": "فیلد اجباری است", + "file_exceeds_allowed_size_of_size": "حجم فایل بیشتر از حد مجاز ({{size}}) است.", + "fileupload_error": "خطا در آپلود فایل", + "finish_this_chat": "پایان این گفتگو", + "forget_remove_my_data": "حذف اطلاعات من", + "from_returned_the_chat_to_the_queue": "{{from}} گفتگو را به صف برگرداند", + "the_agent_transferred_the_chat_to_the_department_to": "پشتیبان چت را به بخش {{to}} منتقل کرد", + "from_transferred_the_chat_to_the_department_to": "{{from}} گفتگو را به بخش {{to}} منتقل کرد", + "from_transferred_the_chat_to_to": "{{from}} گفتگو را به {{to}} منتقل کرد", + "gdpr": "مقررات عمومی حفاظت از داده اتحادیه اروپا (GDPR)", + "go_to_menu_options_forget_remove_my_personal_data": "به <1>menu options → Forget/Remove my personal data بروید تا درخواست حذف بلافاصله ی اطلاعات خود را بدهید", + "hiddenelementscount_more": "+ {{hiddenElementsCount}} مورد دیگر", + "i_agree": "موافقم", + "i_need_help_with": "نیاز به کمک در بخش زیر را دارم", + "if_you_have_any_other_questions_just_press_the_but": "اگر هرگونه سوال دیگری دارید، بر روی دکمه ی زیر کلیک کنید تا یک گفتگو آغاز شود", + "incoming_video_call": "تماس تصویری دریافتی", + "insert_your_field_here": "{{field}} خود را اینجا وارد کنید ...", + "invalid_email": "ایمیل نامعتبر است", + "invalid_value": "مقدار نامعتبر است", + "join_call": "به تماس بپیوندید", + "join_my_room_to_start_the_video_call": "برای شروع تماس تصویری به اتاق من بپیوندید", + "leave_a_message": "یک پیام بگذارید", + "livechat_connected": "Livechat وصل شد.", + "livechat_is_not_connected": "Livechat وصل نشد.", + "media_types_not_accepted": "این نوع فایل قابل قبول نیست.", + "message": "پیام", + "messages": "پیام ها", + "minimize_chat": "کوچک کردن گفتگو", + "name": "نام", + "need_help": "نیاز به کمک دارید?", + "new_chat": "گفتگوی جدید", + "no": "خیر", + "no_available_agents_to_transfer": "هیچ پشتیبانی برای انتقال در دسترس نیست", + "ok": "باشد", + "options": "گزینه ها", + "please_tell_us_some_information_to_start_the_chat": "لطفاً برای شروع گفتگو اطلاعاتی را به ما بدهید", + "please_wait_for_the_next_available_agent": "لطفا تا در دسترس قرار گرفتن پشتیبان متنظر بمانید..", + "powered_by_rocket_chat": "قدرت گرفته از Rocket.Chat", + "restore_chat": "بازگردانی گفتگو", + "room_name_changed": "نام اتاق عوض شد", + "send": "ارسال", + "sound_is_off": "صدا قطع شد", + "sound_is_on": "صدا وصل شد", + "start_chat": "آغاز گفتگو", + "thanks_for_talking_with_us": "متشکر از تماس شما با ما", + "the_chat_was_moved_back_to_queue": "گفتگو به صف برگشت", + "the_chat_was_moved_back_to_queue_due_to_unanswered": "گفتگو از آنجایی که برای {{duration}} ثانیه بی پاسخ بود، به صف برگشت", + "the_chat_was_transferred_to_another_agent": "گفتگو به پشتیبان دیگری منتقل شد", + "the_chat_was_transferred_to_another_agent_due_to_unanswered": "گفتگو از آنجایی که برای {{duration}} ثانیه بی پاسخ بود به پشتیبان دیگری منتقل شد", + "the_controller_of_your_personal_data_is_company_na": "کنترل اطلاعات شما در دست شرکت [Company Name], به آدرس [Company Address] است. برای شروع گفتگو لازم از مقررات عمومی حفاظت از داده اتحادیه اروپا (GDPR) را تایید کنید.", + "transcript_success": "رونوشت ارسال شد", + "type_your_message_here": "پیام خود را اینجا تایپ کنید", + "unread_messages_count_one": "{{count}} پیام خوانده نشده", + "unread_messages": "پیام های خوانده نشده", + "user_added_by": "کاربر اضافه شد، توسط", + "user_joined": "کابر ملحق شد", + "user_left": "کاربر خارج شد", + "user_removed_by": "کاربر حذف شد، توسط", + "waiting_queue": "صف انتظار ...", + "we_are_not_online_right_now_please_leave_a_message": "ما در حال حاضر آنلاین نیستیم. لطفا پیام بگذارید", + "welcome": "خوش آمدید", + "write_your_message": "پیام خود را بنویسید ...", + "yes": "بله", + "you_browser_doesn_t_support_audio_element": "مرورگر شما صوت را پشتیبانی نمی کند", + "you_browser_doesn_t_support_video_element": "مرورگر شما ویدئو را پشتیبانی نمی کند", + "your_spot_is_spot": "نوبت شما #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "نوبت شما #{{spot}} است (مدت زمان تخمین زده شده: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/fi.json b/packages/livechat/src/i18n/fi.json index 002d5f5caa80f..a909b0c69495f 100644 --- a/packages/livechat/src/i18n/fi.json +++ b/packages/livechat/src/i18n/fi.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Peruuta", - "conversation_finished": "Keskustelu päättynyt", - "department_switched": "Osasto vaihdettu", - "no": "Ei", - "options": "Valinnat", - "send": "Lähetä", - "user_joined": "Käyttäjä liittyi", - "user_left": "Käyttäjä poistui", - "we_are_not_online_right_now_please_leave_a_message": "Emme ole verkossa juuri nyt. Jätä viesti.", - "yes": "Kyllä" - } -} + "translation": { + "cancel": "Peruuta", + "conversation_finished": "Keskustelu päättynyt", + "department_switched": "Osasto vaihdettu", + "no": "Ei", + "options": "Valinnat", + "send": "Lähetä", + "user_joined": "Käyttäjä liittyi", + "user_left": "Käyttäjä poistui", + "we_are_not_online_right_now_please_leave_a_message": "Emme ole verkossa juuri nyt. Jätä viesti.", + "yes": "Kyllä" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/fr.json b/packages/livechat/src/i18n/fr.json index 35a0555e0036a..9d40b5eaf7478 100644 --- a/packages/livechat/src/i18n/fr.json +++ b/packages/livechat/src/i18n/fr.json @@ -1,77 +1,77 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Voulez-vous vraiment terminer cette conversation ?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Voulez-vous vraiment supprimer toutes vos données personnelles ?", - "are_you_sure_you_want_to_switch_the_department": "Êtes-vous sûr de vouloir changer de département ?", - "cancel": "Annuler", - "change_department": "Changer de département", - "change_department_1": "Changer Département", - "chat_finished": "Chat Terminé", - "chat_started": "Chat démarré", - "choose_a_department": "Choisir un département...", - "choose_a_department_1": "Choisir un département", - "choose_an_option": "Choisir une option...", - "conversation_finished": "Conversation terminée", - "count_new_messages_since_since_one": "Un nouveau message depuis {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} nouveaux messages depuis {{val, datetime}}", - "department_switched": "Changement de département effectué", - "departments": "Départements", - "disable_notifications": "Désactiver les notifications", - "dismiss_this_alert": "Effacer cette alerte", - "drop_here_to_upload_a_file": "Déposer ici pour envoyer un fichier", - "enable_notifications": "Activer les notifications", - "error_closing_chat": "Erreur lors de la fermeture de la conversation.", - "error_removing_user_data": "Erreur lors de la suppression des données utilisateur.", - "error_starting_a_new_conversation_reason": "Erreur lors de la création d'une nouvelle conversation : {{reason}}", - "expand_chat": "Agrandir le chat", - "field_required": "Champ requis", - "file_exceeds_allowed_size_of_size": "Le fichier dépasse la taille autorisée de {{size}}.", - "fileupload_error": "Erreur d'envoi", - "finish_this_chat": "Terminer cette conversation", - "forget_remove_my_data": "Oublier/Supprimer mes données personnelles", - "gdpr": "RGPD", - "go_to_menu_options_forget_remove_my_personal_data": "Ouvrir <1>menu options → Oublier/Supprimer mes données personnelles pour demander la suppression immédiate de vos données personnelles.", - "i_agree": "J'accepte", - "i_need_help_with": "J'ai besoin d'aide pour...", - "if_you_have_any_other_questions_just_press_the_but": "Si vous avez une autre question, cliquez sur le bouton ci-dessous pour démarrer une nouvelle conversation.", - "insert_your_field_here": "Entrez votre {{field}} ici...", - "invalid_email": "Email invalide", - "invalid_value": "Valeur invalide", - "leave_a_message": "Laissez un message", - "livechat_connected": "Livechat connecté.", - "livechat_is_not_connected": "Le livechat n'est pas connecté.", - "media_types_not_accepted": "Type de fichier non autorisé.", - "minimize_chat": "Réduire le chat", - "name": "Nom", - "need_help": "Besoin d'aide ?", - "new_chat": "Nouvelle Conversation", - "no": "Non", - "no_available_agents_to_transfer": "Aucun agent disponible pour un transfert", - "please_tell_us_some_information_to_start_the_chat": "Veuillez nous donner quelques informations pour démarrer la conversation", - "please_wait_for_the_next_available_agent": "Veuillez patienter, attente d'un agent disponible...", - "powered_by_rocket_chat": "Propulsé par Rocket.Chat", - "restore_chat": "Restaurer conversation", - "room_name_changed": "Nom du salon modifié", - "send": "Envoyer", - "sound_is_off": "Le son est désactivé", - "sound_is_on": "Le son est activé", - "start_chat": "Démarrer le chat", - "thanks_for_talking_with_us": "Merci d'avoir conversé avec nous", - "the_controller_of_your_personal_data_is_company_na": "L'opérateur de vos données personnelles est [Company Name], dont l'adresse est [Company Address]. Pour débuter le chat vous acceptez que vos données personnelles soient utilisées et transmises conformément au règlement général sur la protection des données (RGPD).", - "type_your_message_here": "Tapez votre message ici", - "unread_messages": "messages non lus", - "user_added_by": "Utilisateur ajouté par", - "user_joined": "L'utilisateur a rejoint", - "user_left": "L'utilisateur est parti", - "user_removed_by": "Utilisateur supprimé par", - "waiting_queue": "File d'attente...", - "we_are_not_online_right_now_please_leave_a_message": "Nous ne sommes pas en ligne en ce moment. Merci de laisser un message.", - "welcome": "Bienvenue", - "write_your_message": "Ecrivez votre message...", - "yes": "Oui", - "you_browser_doesn_t_support_audio_element": "Votre navigateur ne supporte pas les éléments audio", - "you_browser_doesn_t_support_video_element": "Votre navigateur ne supporte pas les éléments vidéo", - "your_spot_is_spot": "Votre rang est #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Votre rang est #{{spot}} (Temps d'attente estimé: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Voulez-vous vraiment terminer cette conversation ?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Voulez-vous vraiment supprimer toutes vos données personnelles ?", + "are_you_sure_you_want_to_switch_the_department": "Êtes-vous sûr de vouloir changer de département ?", + "cancel": "Annuler", + "change_department": "Changer de département", + "change_department_1": "Changer Département", + "chat_finished": "Chat Terminé", + "chat_started": "Chat démarré", + "choose_a_department": "Choisir un département...", + "choose_a_department_1": "Choisir un département", + "choose_an_option": "Choisir une option...", + "conversation_finished": "Conversation terminée", + "count_new_messages_since_since_one": "Un nouveau message depuis {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} nouveaux messages depuis {{val, datetime}}", + "department_switched": "Changement de département effectué", + "departments": "Départements", + "disable_notifications": "Désactiver les notifications", + "dismiss_this_alert": "Effacer cette alerte", + "drop_here_to_upload_a_file": "Déposer ici pour envoyer un fichier", + "enable_notifications": "Activer les notifications", + "error_closing_chat": "Erreur lors de la fermeture de la conversation.", + "error_removing_user_data": "Erreur lors de la suppression des données utilisateur.", + "error_starting_a_new_conversation_reason": "Erreur lors de la création d'une nouvelle conversation : {{reason}}", + "expand_chat": "Agrandir le chat", + "field_required": "Champ requis", + "file_exceeds_allowed_size_of_size": "Le fichier dépasse la taille autorisée de {{size}}.", + "fileupload_error": "Erreur d'envoi", + "finish_this_chat": "Terminer cette conversation", + "forget_remove_my_data": "Oublier/Supprimer mes données personnelles", + "gdpr": "RGPD", + "go_to_menu_options_forget_remove_my_personal_data": "Ouvrir <1>menu options → Oublier/Supprimer mes données personnelles pour demander la suppression immédiate de vos données personnelles.", + "i_agree": "J'accepte", + "i_need_help_with": "J'ai besoin d'aide pour...", + "if_you_have_any_other_questions_just_press_the_but": "Si vous avez une autre question, cliquez sur le bouton ci-dessous pour démarrer une nouvelle conversation.", + "insert_your_field_here": "Entrez votre {{field}} ici...", + "invalid_email": "Email invalide", + "invalid_value": "Valeur invalide", + "leave_a_message": "Laissez un message", + "livechat_connected": "Livechat connecté.", + "livechat_is_not_connected": "Le livechat n'est pas connecté.", + "media_types_not_accepted": "Type de fichier non autorisé.", + "minimize_chat": "Réduire le chat", + "name": "Nom", + "need_help": "Besoin d'aide ?", + "new_chat": "Nouvelle Conversation", + "no": "Non", + "no_available_agents_to_transfer": "Aucun agent disponible pour un transfert", + "please_tell_us_some_information_to_start_the_chat": "Veuillez nous donner quelques informations pour démarrer la conversation", + "please_wait_for_the_next_available_agent": "Veuillez patienter, attente d'un agent disponible...", + "powered_by_rocket_chat": "Propulsé par Rocket.Chat", + "restore_chat": "Restaurer conversation", + "room_name_changed": "Nom du salon modifié", + "send": "Envoyer", + "sound_is_off": "Le son est désactivé", + "sound_is_on": "Le son est activé", + "start_chat": "Démarrer le chat", + "thanks_for_talking_with_us": "Merci d'avoir conversé avec nous", + "the_controller_of_your_personal_data_is_company_na": "L'opérateur de vos données personnelles est [Company Name], dont l'adresse est [Company Address]. Pour débuter le chat vous acceptez que vos données personnelles soient utilisées et transmises conformément au règlement général sur la protection des données (RGPD).", + "type_your_message_here": "Tapez votre message ici", + "unread_messages": "messages non lus", + "user_added_by": "Utilisateur ajouté par", + "user_joined": "L'utilisateur a rejoint", + "user_left": "L'utilisateur est parti", + "user_removed_by": "Utilisateur supprimé par", + "waiting_queue": "File d'attente...", + "we_are_not_online_right_now_please_leave_a_message": "Nous ne sommes pas en ligne en ce moment. Merci de laisser un message.", + "welcome": "Bienvenue", + "write_your_message": "Ecrivez votre message...", + "yes": "Oui", + "you_browser_doesn_t_support_audio_element": "Votre navigateur ne supporte pas les éléments audio", + "you_browser_doesn_t_support_video_element": "Votre navigateur ne supporte pas les éléments vidéo", + "your_spot_is_spot": "Votre rang est #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Votre rang est #{{spot}} (Temps d'attente estimé: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/he.json b/packages/livechat/src/i18n/he.json index 60c6707a92603..2b71feb4b1ad0 100644 --- a/packages/livechat/src/i18n/he.json +++ b/packages/livechat/src/i18n/he.json @@ -1,68 +1,68 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "אתה בטוח שברצונך לסיים את השיחה?", - "are_you_sure_you_want_to_remove_all_of_your_person": "אתה בטוח שברצונך להסיר את כל המידע האישי?", - "are_you_sure_you_want_to_switch_the_department": "האם אתה בטוח שברצונך להחליף מחלקה?", - "cancel": "ביטול", - "change_department": "החלף מחלקה", - "change_department_1": "החלף מחלקה", - "chat_finished": "הצ'אט הסתיים", - "choose_a_department": "בחר מחלקה...", - "choose_a_department_1": "בחר מחלקה", - "choose_an_option": "בחר אפשרות...", - "conversation_finished": "נגמרה השיחה", - "count_new_messages_since_since_one": "הודעה אחת חדשה מאז {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} הודעות חדשות מאז {{val, datetime}}", - "department_switched": "החלף מחלקה", - "departments": "מחלקות", - "disable_notifications": "בטל התראות", - "dismiss_this_alert": "הסר אזהרה", - "drop_here_to_upload_a_file": "זרוק כאן את הקובץ", - "enable_notifications": "הפעל התראות", - "error_closing_chat": "שגיאה בסגירת הצ'אט.", - "error_removing_user_data": "שגיאה בהסרת המידע.", - "error_starting_a_new_conversation_reason": "לא הצלחנו ליצור שיחה חדשה: {{reason}}", - "expand_chat": "הרחב צ'אט", - "file_exceeds_allowed_size_of_size": "הקובץ חורג מגודל {{size}}.", - "fileupload_error": "שגיאה בהעלאת הקובץ", - "finish_this_chat": "סיים צ'אט זה", - "i_agree": "אני מסכים", - "i_need_help_with": "אני צריך עזרה עם...", - "if_you_have_any_other_questions_just_press_the_but": "אם יש לך שאלות כלשהם, לחץ על הכפתור למטה בכדי להתחיל צ'אט.", - "leave_a_message": "השאר הודעה", - "livechat_connected": "צ'אט לייב מחובר.", - "livechat_is_not_connected": "צ'אט לייב לא מחובר.", - "media_types_not_accepted": "סוג המדיה אינו מאושר.", - "message": "הודעה", - "minimize_chat": "מזער צ'אט", - "name": "שם", - "need_help": "צריך עזרה?", - "new_chat": "צ'אט חדש", - "no": "לא", - "no_available_agents_to_transfer": "אין סוכנים פנויים בכדי להעביר", - "ok": "אוקיי", - "options": "אפשרויות", - "please_tell_us_some_information_to_start_the_chat": "אנא שלחו לנו מידע בכדי להתחיל בצ'אט.", - "please_wait_for_the_next_available_agent": "אנא המתן לסוכן הבא הפנוי.", - "restore_chat": "שחזר צ'אט", - "room_name_changed": "שם החדר השתנה", - "send": "שליחה", - "sound_is_off": "סאונד מושתק", - "sound_is_on": "סאונד דולק", - "start_chat": "התחל צ'אט", - "thanks_for_talking_with_us": "תודה שדיברתם איתנו", - "type_your_message_here": "כתוב את ההודעה כאן", - "unread_messages": "הודעות שלא נקראו", - "user_joined": "המשתמש הצטרף", - "user_left": "המשתמש עזב", - "waiting_queue": "ממתין בתור...", - "we_are_not_online_right_now_please_leave_a_message": "אנחנו לא מחוברים כרגע, אנא השאירו הודעה", - "welcome": "ברוכים הבאים", - "write_your_message": "כתוב את ההודעה שלך", - "yes": "כן", - "you_browser_doesn_t_support_audio_element": "הדפדפן שלך לא תומך בסאונד", - "you_browser_doesn_t_support_video_element": "הדפדפן שלך לא תומך בוידאו", - "your_spot_is_spot": "מיקומך הוא #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "מיקומך הוא #{{spot}} זמן מוערך {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "אתה בטוח שברצונך לסיים את השיחה?", + "are_you_sure_you_want_to_remove_all_of_your_person": "אתה בטוח שברצונך להסיר את כל המידע האישי?", + "are_you_sure_you_want_to_switch_the_department": "האם אתה בטוח שברצונך להחליף מחלקה?", + "cancel": "ביטול", + "change_department": "החלף מחלקה", + "change_department_1": "החלף מחלקה", + "chat_finished": "הצ'אט הסתיים", + "choose_a_department": "בחר מחלקה...", + "choose_a_department_1": "בחר מחלקה", + "choose_an_option": "בחר אפשרות...", + "conversation_finished": "נגמרה השיחה", + "count_new_messages_since_since_one": "הודעה אחת חדשה מאז {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} הודעות חדשות מאז {{val, datetime}}", + "department_switched": "החלף מחלקה", + "departments": "מחלקות", + "disable_notifications": "בטל התראות", + "dismiss_this_alert": "הסר אזהרה", + "drop_here_to_upload_a_file": "זרוק כאן את הקובץ", + "enable_notifications": "הפעל התראות", + "error_closing_chat": "שגיאה בסגירת הצ'אט.", + "error_removing_user_data": "שגיאה בהסרת המידע.", + "error_starting_a_new_conversation_reason": "לא הצלחנו ליצור שיחה חדשה: {{reason}}", + "expand_chat": "הרחב צ'אט", + "file_exceeds_allowed_size_of_size": "הקובץ חורג מגודל {{size}}.", + "fileupload_error": "שגיאה בהעלאת הקובץ", + "finish_this_chat": "סיים צ'אט זה", + "i_agree": "אני מסכים", + "i_need_help_with": "אני צריך עזרה עם...", + "if_you_have_any_other_questions_just_press_the_but": "אם יש לך שאלות כלשהם, לחץ על הכפתור למטה בכדי להתחיל צ'אט.", + "leave_a_message": "השאר הודעה", + "livechat_connected": "צ'אט לייב מחובר.", + "livechat_is_not_connected": "צ'אט לייב לא מחובר.", + "media_types_not_accepted": "סוג המדיה אינו מאושר.", + "message": "הודעה", + "minimize_chat": "מזער צ'אט", + "name": "שם", + "need_help": "צריך עזרה?", + "new_chat": "צ'אט חדש", + "no": "לא", + "no_available_agents_to_transfer": "אין סוכנים פנויים בכדי להעביר", + "ok": "אוקיי", + "options": "אפשרויות", + "please_tell_us_some_information_to_start_the_chat": "אנא שלחו לנו מידע בכדי להתחיל בצ'אט.", + "please_wait_for_the_next_available_agent": "אנא המתן לסוכן הבא הפנוי.", + "restore_chat": "שחזר צ'אט", + "room_name_changed": "שם החדר השתנה", + "send": "שליחה", + "sound_is_off": "סאונד מושתק", + "sound_is_on": "סאונד דולק", + "start_chat": "התחל צ'אט", + "thanks_for_talking_with_us": "תודה שדיברתם איתנו", + "type_your_message_here": "כתוב את ההודעה כאן", + "unread_messages": "הודעות שלא נקראו", + "user_joined": "המשתמש הצטרף", + "user_left": "המשתמש עזב", + "waiting_queue": "ממתין בתור...", + "we_are_not_online_right_now_please_leave_a_message": "אנחנו לא מחוברים כרגע, אנא השאירו הודעה", + "welcome": "ברוכים הבאים", + "write_your_message": "כתוב את ההודעה שלך", + "yes": "כן", + "you_browser_doesn_t_support_audio_element": "הדפדפן שלך לא תומך בסאונד", + "you_browser_doesn_t_support_video_element": "הדפדפן שלך לא תומך בוידאו", + "your_spot_is_spot": "מיקומך הוא #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "מיקומך הוא #{{spot}} זמן מוערך {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/hr.json b/packages/livechat/src/i18n/hr.json index ff11d1a4c5c29..e37b4d78e4d3d 100644 --- a/packages/livechat/src/i18n/hr.json +++ b/packages/livechat/src/i18n/hr.json @@ -1,15 +1,15 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "Jeste li sigurni da želite prebaciti odjel?", - "cancel": "Otkaži", - "conversation_finished": "Razgovor je završio", - "department_switched": "Odjel je prebacio", - "no": "Ne", - "options": "Opcije", - "send": "Pošalji", - "user_joined": "Korisnik se pridružio", - "user_left": "Korisnik napustio razgovor", - "we_are_not_online_right_now_please_leave_a_message": "Trenutačno nismo na mreži. Molim vas ostavite poruku.", - "yes": "Da" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "Jeste li sigurni da želite prebaciti odjel?", + "cancel": "Otkaži", + "conversation_finished": "Razgovor je završio", + "department_switched": "Odjel je prebacio", + "no": "Ne", + "options": "Opcije", + "send": "Pošalji", + "user_joined": "Korisnik se pridružio", + "user_left": "Korisnik napustio razgovor", + "we_are_not_online_right_now_please_leave_a_message": "Trenutačno nismo na mreži. Molim vas ostavite poruku.", + "yes": "Da" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/hu.json b/packages/livechat/src/i18n/hu.json index f2a3adf523372..7a97b669f6f8c 100644 --- a/packages/livechat/src/i18n/hu.json +++ b/packages/livechat/src/i18n/hu.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Mégse", - "conversation_finished": "Beszélgetés befejeződött", - "department_switched": "Részleg lecserélve", - "no": "Nem", - "options": "Beállítások", - "send": "Elküld", - "user_joined": "Felhasználó belépett", - "user_left": "Felhasználó kilépett", - "we_are_not_online_right_now_please_leave_a_message": "Jelenleg nem vagyunk online. Kérlek hagyj üzenetet.", - "yes": "Igen" - } -} + "translation": { + "cancel": "Mégse", + "conversation_finished": "Beszélgetés befejeződött", + "department_switched": "Részleg lecserélve", + "no": "Nem", + "options": "Beállítások", + "send": "Elküld", + "user_joined": "Felhasználó belépett", + "user_left": "Felhasználó kilépett", + "we_are_not_online_right_now_please_leave_a_message": "Jelenleg nem vagyunk online. Kérlek hagyj üzenetet.", + "yes": "Igen" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/id.json b/packages/livechat/src/i18n/id.json index 26edcbd57dc07..bc5705bf97f09 100644 --- a/packages/livechat/src/i18n/id.json +++ b/packages/livechat/src/i18n/id.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Membatalkan", - "conversation_finished": "percakapan selesai", - "department_switched": "Departemen beralih", - "no": "Tidak", - "options": "Pilihan", - "send": "Kirim", - "user_joined": "pengguna bergabung", - "user_left": "kiri pengguna", - "we_are_not_online_right_now_please_leave_a_message": "Kami sedang tidak online sekarang. Tolong, tinggalkan pesan.", - "yes": "iya nih" - } -} + "translation": { + "cancel": "Membatalkan", + "conversation_finished": "percakapan selesai", + "department_switched": "Departemen beralih", + "no": "Tidak", + "options": "Pilihan", + "send": "Kirim", + "user_joined": "pengguna bergabung", + "user_left": "kiri pengguna", + "we_are_not_online_right_now_please_leave_a_message": "Kami sedang tidak online sekarang. Tolong, tinggalkan pesan.", + "yes": "iya nih" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/it.json b/packages/livechat/src/i18n/it.json index aac08d2bfa9cc..a85e64481b78a 100644 --- a/packages/livechat/src/i18n/it.json +++ b/packages/livechat/src/i18n/it.json @@ -1,71 +1,71 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Sei sicuro di voler terminare questa chat?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Sei sicuro di voler rimuovere tutti i tuoi dati personali?", - "are_you_sure_you_want_to_switch_the_department": "Sei sicuro di voler cambiare dipartimento?", - "cancel": "Annulla", - "change_department": "Cambia dipartimento", - "change_department_1": "Cambia Dipartimento", - "chat_finished": "Chat Conclusa", - "choose_a_department": "Scegli un dipartimento...", - "choose_a_department_1": "Scegli un dipartimento", - "choose_an_option": "Scegli un opzione...", - "conversation_finished": "Conversazione terminata", - "count_new_messages_since_since_one": "Un nuovo messaggio da {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} nuovi messaggi da {{val, datetime}}", - "department_switched": "Dipartimento cambiato", - "departments": "Dipartimenti", - "disable_notifications": "Disabilita notifiche", - "dismiss_this_alert": "Rimuovi questo avviso", - "drop_here_to_upload_a_file": "Rilascia qui per caricare un file", - "enable_notifications": "Abilita notifiche", - "error_closing_chat": "Errore durante la chiusura della chat.", - "error_removing_user_data": "Errore durante la rimozione dei dati personali.", - "error_starting_a_new_conversation_reason": "Errore durante la creazione di una nuova conversazione: {{reason}}", - "expand_chat": "Espandi chat", - "file_exceeds_allowed_size_of_size": "Il file supera la dimensione massima consentita di {{size}}.", - "fileupload_error": "FileUpload Errore", - "finish_this_chat": "Termina questa chat", - "forget_remove_my_data": "Dimentica/Rimuovi i miei dati", - "go_to_menu_options_forget_remove_my_personal_data": "Vai su <1>menu opzioni → Dimentica/Rimuovi i miei dati personali per richiedere l'immediata cancellazione dei tuoi dati.", - "i_agree": "Sono Daccordo", - "i_need_help_with": "Ho bisogno di aiuto con...", - "if_you_have_any_other_questions_just_press_the_but": "Se hai altre domande ti basta premere il tasto sotto per iniziare una nuova chat.", - "leave_a_message": "Lascia un messaggio", - "livechat_connected": "Livechat connesso.", - "livechat_is_not_connected": "Livechat non è connesso.", - "media_types_not_accepted": "Formato Media Non Accettato.", - "message": "Messaggio", - "minimize_chat": "Rimpicciolisci chat", - "name": "Nome", - "need_help": "Hai bisogno di aiuto?", - "new_chat": "Nuova Chat", - "no_available_agents_to_transfer": "Nessun agente disponibile per il trasferimento", - "options": "Opzioni", - "please_tell_us_some_information_to_start_the_chat": "Per favore, forniscici alcune informazioni per cominciare la chat", - "please_wait_for_the_next_available_agent": "Per favore, attendi il prossimo agente disponibile..", - "restore_chat": "Ripristina chat", - "room_name_changed": "Nome della stanza cambiato", - "send": "Invia", - "sound_is_off": "Il suono è spento", - "sound_is_on": "Il suono è acceso", - "start_chat": "Comincia la chat", - "thanks_for_talking_with_us": "Grazie per aver parlato con noi", - "the_controller_of_your_personal_data_is_company_na": "Il titolare del trattamento dei tuoi dati personali è [Nome Compagnia], con sede in [Indirizzo Compagnia]. Per cominciare la chat è necessario che tu accetta che i tuoi dati personali vengano processati e/o trasmessi in accordo con il General Data Protection Regulation (GDPR).", - "type_your_message_here": "Scrivi il tuo messaggio qui", - "unread_messages": "messaggi non letti", - "user_added_by": "Utente aggiunto da", - "user_joined": "L'utente si è iscritto", - "user_left": "L'utente ha abbandonato", - "user_removed_by": "Utente rimosso da", - "waiting_queue": "Coda di attesa...", - "we_are_not_online_right_now_please_leave_a_message": "Non siamo online al momento. Lasciare un messaggio.", - "welcome": "Benvenuto", - "write_your_message": "Scrivi il tuo messaggio...", - "yes": "Sì", - "you_browser_doesn_t_support_audio_element": "Il tuo browser non supporta l'elemento audio", - "you_browser_doesn_t_support_video_element": "Il tuo browser non supporta l'elemento video", - "your_spot_is_spot": "La tua posizione è #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "La tua posizione è #{{spot}} (Tempo di attesa stimato: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Sei sicuro di voler terminare questa chat?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Sei sicuro di voler rimuovere tutti i tuoi dati personali?", + "are_you_sure_you_want_to_switch_the_department": "Sei sicuro di voler cambiare dipartimento?", + "cancel": "Annulla", + "change_department": "Cambia dipartimento", + "change_department_1": "Cambia Dipartimento", + "chat_finished": "Chat Conclusa", + "choose_a_department": "Scegli un dipartimento...", + "choose_a_department_1": "Scegli un dipartimento", + "choose_an_option": "Scegli un opzione...", + "conversation_finished": "Conversazione terminata", + "count_new_messages_since_since_one": "Un nuovo messaggio da {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} nuovi messaggi da {{val, datetime}}", + "department_switched": "Dipartimento cambiato", + "departments": "Dipartimenti", + "disable_notifications": "Disabilita notifiche", + "dismiss_this_alert": "Rimuovi questo avviso", + "drop_here_to_upload_a_file": "Rilascia qui per caricare un file", + "enable_notifications": "Abilita notifiche", + "error_closing_chat": "Errore durante la chiusura della chat.", + "error_removing_user_data": "Errore durante la rimozione dei dati personali.", + "error_starting_a_new_conversation_reason": "Errore durante la creazione di una nuova conversazione: {{reason}}", + "expand_chat": "Espandi chat", + "file_exceeds_allowed_size_of_size": "Il file supera la dimensione massima consentita di {{size}}.", + "fileupload_error": "FileUpload Errore", + "finish_this_chat": "Termina questa chat", + "forget_remove_my_data": "Dimentica/Rimuovi i miei dati", + "go_to_menu_options_forget_remove_my_personal_data": "Vai su <1>menu opzioni → Dimentica/Rimuovi i miei dati personali per richiedere l'immediata cancellazione dei tuoi dati.", + "i_agree": "Sono Daccordo", + "i_need_help_with": "Ho bisogno di aiuto con...", + "if_you_have_any_other_questions_just_press_the_but": "Se hai altre domande ti basta premere il tasto sotto per iniziare una nuova chat.", + "leave_a_message": "Lascia un messaggio", + "livechat_connected": "Livechat connesso.", + "livechat_is_not_connected": "Livechat non è connesso.", + "media_types_not_accepted": "Formato Media Non Accettato.", + "message": "Messaggio", + "minimize_chat": "Rimpicciolisci chat", + "name": "Nome", + "need_help": "Hai bisogno di aiuto?", + "new_chat": "Nuova Chat", + "no_available_agents_to_transfer": "Nessun agente disponibile per il trasferimento", + "options": "Opzioni", + "please_tell_us_some_information_to_start_the_chat": "Per favore, forniscici alcune informazioni per cominciare la chat", + "please_wait_for_the_next_available_agent": "Per favore, attendi il prossimo agente disponibile..", + "restore_chat": "Ripristina chat", + "room_name_changed": "Nome della stanza cambiato", + "send": "Invia", + "sound_is_off": "Il suono è spento", + "sound_is_on": "Il suono è acceso", + "start_chat": "Comincia la chat", + "thanks_for_talking_with_us": "Grazie per aver parlato con noi", + "the_controller_of_your_personal_data_is_company_na": "Il titolare del trattamento dei tuoi dati personali è [Nome Compagnia], con sede in [Indirizzo Compagnia]. Per cominciare la chat è necessario che tu accetta che i tuoi dati personali vengano processati e/o trasmessi in accordo con il General Data Protection Regulation (GDPR).", + "type_your_message_here": "Scrivi il tuo messaggio qui", + "unread_messages": "messaggi non letti", + "user_added_by": "Utente aggiunto da", + "user_joined": "L'utente si è iscritto", + "user_left": "L'utente ha abbandonato", + "user_removed_by": "Utente rimosso da", + "waiting_queue": "Coda di attesa...", + "we_are_not_online_right_now_please_leave_a_message": "Non siamo online al momento. Lasciare un messaggio.", + "welcome": "Benvenuto", + "write_your_message": "Scrivi il tuo messaggio...", + "yes": "Sì", + "you_browser_doesn_t_support_audio_element": "Il tuo browser non supporta l'elemento audio", + "you_browser_doesn_t_support_video_element": "Il tuo browser non supporta l'elemento video", + "your_spot_is_spot": "La tua posizione è #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "La tua posizione è #{{spot}} (Tempo di attesa stimato: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ja.json b/packages/livechat/src/i18n/ja.json index c10bbc48f4995..4bc3467f29c2c 100644 --- a/packages/livechat/src/i18n/ja.json +++ b/packages/livechat/src/i18n/ja.json @@ -1,78 +1,78 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "このチャットを終了してもよろしいですか?", - "are_you_sure_you_want_to_remove_all_of_your_person": "個人データをすべて削除してもよろしいですか?", - "are_you_sure_you_want_to_switch_the_department": "部署を切り替えてもよろしいですか?", - "cancel": "キャンセル", - "change_department": "部署を変更", - "change_department_1": "部署を変更", - "chat_finished": "チャットが終了しました", - "choose_a_department": "選択してください", - "choose_a_department_1": "担当部署を選択してください", - "choose_an_option": "選択してください", - "conversation_finished": "会話が終了しました", - "count_new_messages_since_since_one": "{{val, datetime}}以降の1件の新着メッセージ", - "count_new_messages_since_since_other": "{{val, datetime}}以降の{{count}}件の新着メッセージ", - "department_switched": "部署切り替え", - "departments": "担当部署", - "disable_notifications": "通知を無効にする", - "dismiss_this_alert": "アラートを閉じる", - "drop_here_to_upload_a_file": "ここにドロップしてファイルをアップロードします", - "email": "メールアドレス", - "enable_notifications": "通知を有効にする", - "error_closing_chat": "チャット終了時にエラーが発生しました。", - "error_removing_user_data": "データ削除中にエラーが発生しました。", - "error_starting_a_new_conversation_reason": "チャット開始時にエラーが発生しました: {{reason}}", - "expand_chat": "チャットを最大化", - "field_required": "必須項目", - "file_exceeds_allowed_size_of_size": "ファイルの許容サイズ ({{size}}) を超えています。", - "fileupload_error": "ファイルのアップロードエラー", - "finish_this_chat": "チャットを終了", - "forget_remove_my_data": "データを削除", - "go_to_menu_options_forget_remove_my_personal_data": "<1>オプション → 個人データを削除 に移動してデータの即時削除をリクエストします。", - "i_agree": "同意する", - "i_need_help_with": "担当部署", - "if_you_have_any_other_questions_just_press_the_but": "ほかに質問がある場合は、下のボタンを押して新しいチャットを開始してください。", - "insert_your_field_here": "ここに{{field}}を入力", - "invalid_email": "無効なメールアドレス", - "invalid_value": "無効な値", - "leave_a_message": "メッセージを残す", - "livechat_connected": "ライブチャットに接続しました。", - "livechat_is_not_connected": "ライブチャットに接続していません。", - "media_types_not_accepted": "ファイルの種別が無効です。", - "message": "メッセージ", - "minimize_chat": "チャットを最小化", - "name": "お名前", - "need_help": "助けが必要ですか?", - "new_chat": "新しいチャット", - "no": "いいえ", - "no_available_agents_to_transfer": "対応できる担当者がいません", - "ok": "はい", - "options": "オプション", - "please_tell_us_some_information_to_start_the_chat": "チャットを開始するため次の情報を教えてください", - "please_wait_for_the_next_available_agent": "担当者におつなぎしています。しばらくお待ちください。", - "restore_chat": "チャットを復元", - "room_name_changed": "ルーム名を変更", - "send": "送信", - "sound_is_off": "音量をオフにする", - "sound_is_on": "音量をオンにする", - "start_chat": "チャットを開始", - "thanks_for_talking_with_us": "お問い合わせいただきありがとうございます", - "the_controller_of_your_personal_data_is_company_na": "あなたの個人データの管理者は[会社名]であり、[会社の住所]に登録事務所があります。チャットを開始するには、個人データが一般データ保護規則(GDPR)に従って処理および送信されることに同意するものとします。", - "type_your_message_here": "ここにメッセージを入力", - "unread_messages": "未読メッセージ", - "user_added_by": "により追加されたユーザー", - "user_joined": "ユーザー参加", - "user_left": "ユーザーは退出しました", - "user_removed_by": "により削除されたユーザー", - "waiting_queue": "待機中...", - "we_are_not_online_right_now_please_leave_a_message": "現在オンラインではありません。こちらにメッセージを残してください。", - "welcome": "ようこそ", - "write_your_message": "メッセージを入力してください", - "yes": "はい", - "you_browser_doesn_t_support_audio_element": "お使いのブラウザは audio 要素をサポートしていません", - "you_browser_doesn_t_support_video_element": "お使いのブラウザは video 要素をサポートしていません", - "your_spot_is_spot": "あなたの受付番号は #{{spot}} です", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "あなたの受付番号は #{{spot}} です (推定待ち時間: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "このチャットを終了してもよろしいですか?", + "are_you_sure_you_want_to_remove_all_of_your_person": "個人データをすべて削除してもよろしいですか?", + "are_you_sure_you_want_to_switch_the_department": "部署を切り替えてもよろしいですか?", + "cancel": "キャンセル", + "change_department": "部署を変更", + "change_department_1": "部署を変更", + "chat_finished": "チャットが終了しました", + "choose_a_department": "選択してください", + "choose_a_department_1": "担当部署を選択してください", + "choose_an_option": "選択してください", + "conversation_finished": "会話が終了しました", + "count_new_messages_since_since_one": "{{val, datetime}}以降の1件の新着メッセージ", + "count_new_messages_since_since_other": "{{val, datetime}}以降の{{count}}件の新着メッセージ", + "department_switched": "部署切り替え", + "departments": "担当部署", + "disable_notifications": "通知を無効にする", + "dismiss_this_alert": "アラートを閉じる", + "drop_here_to_upload_a_file": "ここにドロップしてファイルをアップロードします", + "email": "メールアドレス", + "enable_notifications": "通知を有効にする", + "error_closing_chat": "チャット終了時にエラーが発生しました。", + "error_removing_user_data": "データ削除中にエラーが発生しました。", + "error_starting_a_new_conversation_reason": "チャット開始時にエラーが発生しました: {{reason}}", + "expand_chat": "チャットを最大化", + "field_required": "必須項目", + "file_exceeds_allowed_size_of_size": "ファイルの許容サイズ ({{size}}) を超えています。", + "fileupload_error": "ファイルのアップロードエラー", + "finish_this_chat": "チャットを終了", + "forget_remove_my_data": "データを削除", + "go_to_menu_options_forget_remove_my_personal_data": "<1>オプション → 個人データを削除 に移動してデータの即時削除をリクエストします。", + "i_agree": "同意する", + "i_need_help_with": "担当部署", + "if_you_have_any_other_questions_just_press_the_but": "ほかに質問がある場合は、下のボタンを押して新しいチャットを開始してください。", + "insert_your_field_here": "ここに{{field}}を入力", + "invalid_email": "無効なメールアドレス", + "invalid_value": "無効な値", + "leave_a_message": "メッセージを残す", + "livechat_connected": "ライブチャットに接続しました。", + "livechat_is_not_connected": "ライブチャットに接続していません。", + "media_types_not_accepted": "ファイルの種別が無効です。", + "message": "メッセージ", + "minimize_chat": "チャットを最小化", + "name": "お名前", + "need_help": "助けが必要ですか?", + "new_chat": "新しいチャット", + "no": "いいえ", + "no_available_agents_to_transfer": "対応できる担当者がいません", + "ok": "はい", + "options": "オプション", + "please_tell_us_some_information_to_start_the_chat": "チャットを開始するため次の情報を教えてください", + "please_wait_for_the_next_available_agent": "担当者におつなぎしています。しばらくお待ちください。", + "restore_chat": "チャットを復元", + "room_name_changed": "ルーム名を変更", + "send": "送信", + "sound_is_off": "音量をオフにする", + "sound_is_on": "音量をオンにする", + "start_chat": "チャットを開始", + "thanks_for_talking_with_us": "お問い合わせいただきありがとうございます", + "the_controller_of_your_personal_data_is_company_na": "あなたの個人データの管理者は[会社名]であり、[会社の住所]に登録事務所があります。チャットを開始するには、個人データが一般データ保護規則(GDPR)に従って処理および送信されることに同意するものとします。", + "type_your_message_here": "ここにメッセージを入力", + "unread_messages": "未読メッセージ", + "user_added_by": "により追加されたユーザー", + "user_joined": "ユーザー参加", + "user_left": "ユーザーは退出しました", + "user_removed_by": "により削除されたユーザー", + "waiting_queue": "待機中...", + "we_are_not_online_right_now_please_leave_a_message": "現在オンラインではありません。こちらにメッセージを残してください。", + "welcome": "ようこそ", + "write_your_message": "メッセージを入力してください", + "yes": "はい", + "you_browser_doesn_t_support_audio_element": "お使いのブラウザは audio 要素をサポートしていません", + "you_browser_doesn_t_support_video_element": "お使いのブラウザは video 要素をサポートしていません", + "your_spot_is_spot": "あなたの受付番号は #{{spot}} です", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "あなたの受付番号は #{{spot}} です (推定待ち時間: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/km.json b/packages/livechat/src/i18n/km.json index 4d3a0b167c8c9..98927df25da6c 100644 --- a/packages/livechat/src/i18n/km.json +++ b/packages/livechat/src/i18n/km.json @@ -1,15 +1,15 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "តើអ្នកពិតជាចង់ផ្លាស់ប្តូរនាយកដ្ឋានឬ?", - "cancel": "បោះបង់", - "conversation_finished": "សន្ទនាបានបញ្ចប់", - "department_switched": "នាយកដ្ឋានបានប្តូរ", - "no": "ទេ", - "options": "ជម្រើស", - "send": "ផ្ញើ", - "user_joined": "អ្នកប្រ", - "user_left": "អ្នកប្រើបានចាកចេញ", - "we_are_not_online_right_now_please_leave_a_message": "យើងមិននៅលើអ៊ីនធឺរណែតឥឡូវនេះទេ។ សូមទុកសារ។", - "yes": "បាទ" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "តើអ្នកពិតជាចង់ផ្លាស់ប្តូរនាយកដ្ឋានឬ?", + "cancel": "បោះបង់", + "conversation_finished": "សន្ទនាបានបញ្ចប់", + "department_switched": "នាយកដ្ឋានបានប្តូរ", + "no": "ទេ", + "options": "ជម្រើស", + "send": "ផ្ញើ", + "user_joined": "អ្នកប្រ", + "user_left": "អ្នកប្រើបានចាកចេញ", + "we_are_not_online_right_now_please_leave_a_message": "យើងមិននៅលើអ៊ីនធឺរណែតឥឡូវនេះទេ។ សូមទុកសារ។", + "yes": "បាទ" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ko.json b/packages/livechat/src/i18n/ko.json index c0b3e125e24a4..5711d6552dc9b 100644 --- a/packages/livechat/src/i18n/ko.json +++ b/packages/livechat/src/i18n/ko.json @@ -1,15 +1,15 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "부서를 변경하시겠습니까?", - "cancel": "취소", - "conversation_finished": "대화 종료됨", - "department_switched": "부서가 변경되었습니다", - "no": "아니오", - "options": "옵션", - "send": "전송", - "user_joined": "사용자가 참여하였습니다", - "user_left": "사용자가 떠났습니다", - "we_are_not_online_right_now_please_leave_a_message": "온라인 상태가 아닙니다. 메시지를 남겨주세요.", - "yes": "예" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "부서를 변경하시겠습니까?", + "cancel": "취소", + "conversation_finished": "대화 종료됨", + "department_switched": "부서가 변경되었습니다", + "no": "아니오", + "options": "옵션", + "send": "전송", + "user_joined": "사용자가 참여하였습니다", + "user_left": "사용자가 떠났습니다", + "we_are_not_online_right_now_please_leave_a_message": "온라인 상태가 아닙니다. 메시지를 남겨주세요.", + "yes": "예" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ku.json b/packages/livechat/src/i18n/ku.json index 61452cbdf3e5d..bbb1480195e4f 100644 --- a/packages/livechat/src/i18n/ku.json +++ b/packages/livechat/src/i18n/ku.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Bişûndekirin", - "conversation_finished": "conversation qedand", - "department_switched": "Wezaretê veguherîn", - "no": "Na", - "options": "Vebijêrkên", - "send": "Şandin", - "user_joined": "Bikarhêner bûn", - "user_left": "çepê Bikarhêner", - "we_are_not_online_right_now_please_leave_a_message": "Em niha ne tenê ne. Ji kerema xwe, peyamek bistînin.", - "yes": "Erê" - } -} + "translation": { + "cancel": "Bişûndekirin", + "conversation_finished": "conversation qedand", + "department_switched": "Wezaretê veguherîn", + "no": "Na", + "options": "Vebijêrkên", + "send": "Şandin", + "user_joined": "Bikarhêner bûn", + "user_left": "çepê Bikarhêner", + "we_are_not_online_right_now_please_leave_a_message": "Em niha ne tenê ne. Ji kerema xwe, peyamek bistînin.", + "yes": "Erê" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/lo.json b/packages/livechat/src/i18n/lo.json index 55c8c67cdb966..2baa002106f93 100644 --- a/packages/livechat/src/i18n/lo.json +++ b/packages/livechat/src/i18n/lo.json @@ -1,13 +1,13 @@ { - "translation": { - "cancel": "ຍົກເລີກ", - "conversation_finished": "ການສົນທະນາໄດ້ສໍາເລັດ", - "department_switched": "ກົມປ່ຽນແປງ", - "options": "ຕົວເລືອກ", - "send": "ສົ່ງ", - "user_joined": "ຜູ້ໃຊ້ເຂົ້າຮ່ວມ", - "user_left": "ຊ້າຍ User", - "we_are_not_online_right_now_please_leave_a_message": "ພວກເຮົາບໍ່ໄດ້ອອນໄລນ໌ໃນປັດຈຸບັນ. ກະລຸນາອອກຈາກຂໍ້ຄວາມ.", - "yes": "ແມ່ນແລ້ວ" - } -} + "translation": { + "cancel": "ຍົກເລີກ", + "conversation_finished": "ການສົນທະນາໄດ້ສໍາເລັດ", + "department_switched": "ກົມປ່ຽນແປງ", + "options": "ຕົວເລືອກ", + "send": "ສົ່ງ", + "user_joined": "ຜູ້ໃຊ້ເຂົ້າຮ່ວມ", + "user_left": "ຊ້າຍ User", + "we_are_not_online_right_now_please_leave_a_message": "ພວກເຮົາບໍ່ໄດ້ອອນໄລນ໌ໃນປັດຈຸບັນ. ກະລຸນາອອກຈາກຂໍ້ຄວາມ.", + "yes": "ແມ່ນແລ້ວ" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/lt.json b/packages/livechat/src/i18n/lt.json index c545b9432135e..b1693f4b729c9 100644 --- a/packages/livechat/src/i18n/lt.json +++ b/packages/livechat/src/i18n/lt.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Atšaukti", - "conversation_finished": "Pokalbis baigtas", - "department_switched": "Skyrius perjungtas", - "no": "Nėra", - "options": "Galimybės", - "send": "Siųsti", - "user_joined": "Vartotojas prisijungė", - "user_left": "Vartotojas paliko", - "we_are_not_online_right_now_please_leave_a_message": "Šiuo metu mes nesame prisijungę. Prašome palikti pranešimą.", - "yes": "Ne" - } -} + "translation": { + "cancel": "Atšaukti", + "conversation_finished": "Pokalbis baigtas", + "department_switched": "Skyrius perjungtas", + "no": "Nėra", + "options": "Galimybės", + "send": "Siųsti", + "user_joined": "Vartotojas prisijungė", + "user_left": "Vartotojas paliko", + "we_are_not_online_right_now_please_leave_a_message": "Šiuo metu mes nesame prisijungę. Prašome palikti pranešimą.", + "yes": "Ne" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/lv.json b/packages/livechat/src/i18n/lv.json index 870cd66292dc4..ae7185ced2488 100644 --- a/packages/livechat/src/i18n/lv.json +++ b/packages/livechat/src/i18n/lv.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Atcelt", - "conversation_finished": "Saruna pabeigta", - "department_switched": "Departaments ir nomainīts", - "no": "Nr.", - "options": "Iespējas", - "send": "Sūtīt", - "user_joined": "Lietotājs pievienojās", - "user_left": "Lietotājs atvienojās", - "we_are_not_online_right_now_please_leave_a_message": "Mēs šobrīd neesam tiešsaistē. Lūdzu, atstāj ziņu.", - "yes": "jā" - } -} + "translation": { + "cancel": "Atcelt", + "conversation_finished": "Saruna pabeigta", + "department_switched": "Departaments ir nomainīts", + "no": "Nr.", + "options": "Iespējas", + "send": "Sūtīt", + "user_joined": "Lietotājs pievienojās", + "user_left": "Lietotājs atvienojās", + "we_are_not_online_right_now_please_leave_a_message": "Mēs šobrīd neesam tiešsaistē. Lūdzu, atstāj ziņu.", + "yes": "jā" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/mn.json b/packages/livechat/src/i18n/mn.json index 7178dff54d447..386778bfa2242 100644 --- a/packages/livechat/src/i18n/mn.json +++ b/packages/livechat/src/i18n/mn.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Цуцлах", - "conversation_finished": "Харилцаа дууссан", - "department_switched": "Хэлтэс солигдсон", - "no": "Үгүй", - "options": "Сонголтууд", - "send": "Илгээх", - "user_joined": "Хэрэглэгчид нэгдсэн байна", - "user_left": "Хэрэглэгчид үлдсэн", - "we_are_not_online_right_now_please_leave_a_message": "Бид онлайнаар холбогдоогүй байна. Зурвасаа үлдээгээрэй.", - "yes": "Тиймээ" - } -} + "translation": { + "cancel": "Цуцлах", + "conversation_finished": "Харилцаа дууссан", + "department_switched": "Хэлтэс солигдсон", + "no": "Үгүй", + "options": "Сонголтууд", + "send": "Илгээх", + "user_joined": "Хэрэглэгчид нэгдсэн байна", + "user_left": "Хэрэглэгчид үлдсэн", + "we_are_not_online_right_now_please_leave_a_message": "Бид онлайнаар холбогдоогүй байна. Зурвасаа үлдээгээрэй.", + "yes": "Тиймээ" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ms-MY.json b/packages/livechat/src/i18n/ms-MY.json index 18b06fd2ec930..8c6da897bcc44 100644 --- a/packages/livechat/src/i18n/ms-MY.json +++ b/packages/livechat/src/i18n/ms-MY.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Batal", - "conversation_finished": "perbualan selesai", - "department_switched": "Jabatan dihidupkan", - "no": "Tidak", - "options": "Pilihan", - "send": "menghantar", - "user_joined": "pengguna menyertai", - "user_left": "kiri pengguna", - "we_are_not_online_right_now_please_leave_a_message": "Kami tidak berada dalam talian sekarang. Tolong, tinggalkan mesej.", - "yes": "Ya" - } + "translation": { + "cancel": "Batal", + "conversation_finished": "perbualan selesai", + "department_switched": "Jabatan dihidupkan", + "no": "Tidak", + "options": "Pilihan", + "send": "menghantar", + "user_joined": "pengguna menyertai", + "user_left": "kiri pengguna", + "we_are_not_online_right_now_please_leave_a_message": "Kami tidak berada dalam talian sekarang. Tolong, tinggalkan mesej.", + "yes": "Ya" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/nl.json b/packages/livechat/src/i18n/nl.json index 445eb05e90a0c..d8daa6c0d54ad 100644 --- a/packages/livechat/src/i18n/nl.json +++ b/packages/livechat/src/i18n/nl.json @@ -1,81 +1,81 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Weet je zeker dat je deze chat wilt beëindigen?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Weet je zeker dat je al je persoonlijke gegevens wilt verwijderen?", - "are_you_sure_you_want_to_switch_the_department": "Weet je zeker dat je wilt wisselen van afdeling?", - "cancel": "Annuleren", - "change_department": "Afdeling wijzigen", - "change_department_1": "Afdeling wijzigen", - "chat_finished": "Chat afgesloten", - "choose_a_department": "Kies een afdeling...", - "choose_a_department_1": "Kies een afdeling", - "choose_an_option": "Kies een optie...", - "conversation_finished": "Gesprek beëindigd", - "count_new_messages_since_since_one": "Eén nieuw bericht sinds {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} nieuwe berichten sinds {{val, datetime}}", - "department_switched": "Afdeling gewisseld", - "departments": "Afdelingen", - "disable_notifications": "Meldingen uitschakelen", - "dismiss_this_alert": "Deze waarschuwing negeren", - "drop_here_to_upload_a_file": "Sleep je bestand hier naartoe om deze te uploaden", - "email": "E-mailadres", - "enable_notifications": "Notificaties aanzetten", - "error_closing_chat": "Fout bij sluiten van chat.", - "error_removing_user_data": "Fout bij verwijderen van gebruikersgegevens.", - "error_starting_a_new_conversation_reason": "Fout bij het starten van een nieuw gesprek: {{reason}}", - "expand_chat": "Chat uitbreiden", - "field_required": "Dit veld is vereist", - "file_exceeds_allowed_size_of_size": "Het bestand overschrijdt de toegestane grootte van {{size}}.", - "fileupload_error": "Fout bij het uploaden", - "finish_this_chat": "Sluit deze chat af", - "forget_remove_my_data": "Vergeet/verwijder mijn gegevens", - "from_returned_the_chat_to_the_queue": "{{from}} heeft de chat opnieuw in de wachtrij gezet", - "from_transferred_the_chat_to_the_department_to": "{{from}} heeft de chat overgedragen aan afdeling {{to}}", - "from_transferred_the_chat_to_to": "{{from}} heeft de chat overgedragen aan {{to}}", - "gdpr": "AVG", - "go_to_menu_options_forget_remove_my_personal_data": "Ga naar <1>optie menu → Vergeet/verwijder mijn gegevens om een aanvraag te doen om je gegevens te verwijderen.", - "hiddenelementscount_more": "+ {{hiddenElementsCount}} meer", - "i_agree": "Ik ga akkoord", - "i_need_help_with": "Ik heb hulp nodig met...", - "if_you_have_any_other_questions_just_press_the_but": "Als je nog andere vragen hebt, druk dan op de onderstaande knop om een nieuwe chat te starten.", - "insert_your_field_here": "Vul hier je {{field}} in...", - "invalid_email": "Ongeldig E-mailadres", - "invalid_value": "Ongeldige waarde", - "leave_a_message": "Laat een bericht achter", - "livechat_connected": "Laat een bericht achter.", - "livechat_is_not_connected": "Livechat is niet verbonden.", - "media_types_not_accepted": "Mediatypen worden niet geaccepteerd.", - "message": "Bericht", - "minimize_chat": "Chat minimaliseren", - "name": "Naam", - "need_help": "Hulp nodig?", - "new_chat": "Nieuwe chat", - "no": "Nee", - "no_available_agents_to_transfer": "Er zijn geen beschikbare medewerkers om naar over te dragen", - "options": "Opties", - "please_tell_us_some_information_to_start_the_chat": "Vertel ons wat informatie om de chat te starten", - "please_wait_for_the_next_available_agent": "Wacht alstublieft op de volgende beschikbare medewerker..", - "restore_chat": "Chat herstellen", - "room_name_changed": "De naam van de chatroom werd aangepast", - "send": "Versturen", - "sound_is_off": "Geluid is uit", - "sound_is_on": "Geluid is aan", - "thanks_for_talking_with_us": "Bedankt voor je gesprek", - "the_controller_of_your_personal_data_is_company_na": "De beheerder van je persoonlijke gegevens is [Company Name], met maatschappelijke zetel op [Company Address]. Om de chat te starten, gaat je ermee akkoord dat je persoonlijke gegevens worden verwerkt en verzonden in overeenstemming met de Algemene Verordening Gegevensbescherming (AVG).", - "type_your_message_here": "Schrijf hier je bericht", - "unread_messages": "ongelezen berichten", - "user_added_by": "Gebruiker toegevoegd door", - "user_joined": "Gebruiker is toegetreden", - "user_left": "Gebruiker is weggegaan", - "user_removed_by": "Gebruiker is verwijderd door", - "waiting_queue": "Wachtrij...", - "we_are_not_online_right_now_please_leave_a_message": "We zijn nu niet online. Laat alsjeblieft een bericht achter.", - "welcome": "Welkom", - "write_your_message": "Schrijf je bericht...", - "yes": "Ja", - "you_browser_doesn_t_support_audio_element": "Je browser ondersteunt geen audio-element", - "you_browser_doesn_t_support_video_element": "Je browser ondersteunt geen video-element", - "your_spot_is_spot": "Je plaats is #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Je plek is #{{spot}} (geschatte wachttijd: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Weet je zeker dat je deze chat wilt beëindigen?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Weet je zeker dat je al je persoonlijke gegevens wilt verwijderen?", + "are_you_sure_you_want_to_switch_the_department": "Weet je zeker dat je wilt wisselen van afdeling?", + "cancel": "Annuleren", + "change_department": "Afdeling wijzigen", + "change_department_1": "Afdeling wijzigen", + "chat_finished": "Chat afgesloten", + "choose_a_department": "Kies een afdeling...", + "choose_a_department_1": "Kies een afdeling", + "choose_an_option": "Kies een optie...", + "conversation_finished": "Gesprek beëindigd", + "count_new_messages_since_since_one": "Eén nieuw bericht sinds {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} nieuwe berichten sinds {{val, datetime}}", + "department_switched": "Afdeling gewisseld", + "departments": "Afdelingen", + "disable_notifications": "Meldingen uitschakelen", + "dismiss_this_alert": "Deze waarschuwing negeren", + "drop_here_to_upload_a_file": "Sleep je bestand hier naartoe om deze te uploaden", + "email": "E-mailadres", + "enable_notifications": "Notificaties aanzetten", + "error_closing_chat": "Fout bij sluiten van chat.", + "error_removing_user_data": "Fout bij verwijderen van gebruikersgegevens.", + "error_starting_a_new_conversation_reason": "Fout bij het starten van een nieuw gesprek: {{reason}}", + "expand_chat": "Chat uitbreiden", + "field_required": "Dit veld is vereist", + "file_exceeds_allowed_size_of_size": "Het bestand overschrijdt de toegestane grootte van {{size}}.", + "fileupload_error": "Fout bij het uploaden", + "finish_this_chat": "Sluit deze chat af", + "forget_remove_my_data": "Vergeet/verwijder mijn gegevens", + "from_returned_the_chat_to_the_queue": "{{from}} heeft de chat opnieuw in de wachtrij gezet", + "from_transferred_the_chat_to_the_department_to": "{{from}} heeft de chat overgedragen aan afdeling {{to}}", + "from_transferred_the_chat_to_to": "{{from}} heeft de chat overgedragen aan {{to}}", + "gdpr": "AVG", + "go_to_menu_options_forget_remove_my_personal_data": "Ga naar <1>optie menu → Vergeet/verwijder mijn gegevens om een aanvraag te doen om je gegevens te verwijderen.", + "hiddenelementscount_more": "+ {{hiddenElementsCount}} meer", + "i_agree": "Ik ga akkoord", + "i_need_help_with": "Ik heb hulp nodig met...", + "if_you_have_any_other_questions_just_press_the_but": "Als je nog andere vragen hebt, druk dan op de onderstaande knop om een nieuwe chat te starten.", + "insert_your_field_here": "Vul hier je {{field}} in...", + "invalid_email": "Ongeldig E-mailadres", + "invalid_value": "Ongeldige waarde", + "leave_a_message": "Laat een bericht achter", + "livechat_connected": "Laat een bericht achter.", + "livechat_is_not_connected": "Livechat is niet verbonden.", + "media_types_not_accepted": "Mediatypen worden niet geaccepteerd.", + "message": "Bericht", + "minimize_chat": "Chat minimaliseren", + "name": "Naam", + "need_help": "Hulp nodig?", + "new_chat": "Nieuwe chat", + "no": "Nee", + "no_available_agents_to_transfer": "Er zijn geen beschikbare medewerkers om naar over te dragen", + "options": "Opties", + "please_tell_us_some_information_to_start_the_chat": "Vertel ons wat informatie om de chat te starten", + "please_wait_for_the_next_available_agent": "Wacht alstublieft op de volgende beschikbare medewerker..", + "restore_chat": "Chat herstellen", + "room_name_changed": "De naam van de chatroom werd aangepast", + "send": "Versturen", + "sound_is_off": "Geluid is uit", + "sound_is_on": "Geluid is aan", + "thanks_for_talking_with_us": "Bedankt voor je gesprek", + "the_controller_of_your_personal_data_is_company_na": "De beheerder van je persoonlijke gegevens is [Company Name], met maatschappelijke zetel op [Company Address]. Om de chat te starten, gaat je ermee akkoord dat je persoonlijke gegevens worden verwerkt en verzonden in overeenstemming met de Algemene Verordening Gegevensbescherming (AVG).", + "type_your_message_here": "Schrijf hier je bericht", + "unread_messages": "ongelezen berichten", + "user_added_by": "Gebruiker toegevoegd door", + "user_joined": "Gebruiker is toegetreden", + "user_left": "Gebruiker is weggegaan", + "user_removed_by": "Gebruiker is verwijderd door", + "waiting_queue": "Wachtrij...", + "we_are_not_online_right_now_please_leave_a_message": "We zijn nu niet online. Laat alsjeblieft een bericht achter.", + "welcome": "Welkom", + "write_your_message": "Schrijf je bericht...", + "yes": "Ja", + "you_browser_doesn_t_support_audio_element": "Je browser ondersteunt geen audio-element", + "you_browser_doesn_t_support_video_element": "Je browser ondersteunt geen video-element", + "your_spot_is_spot": "Je plaats is #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Je plek is #{{spot}} (geschatte wachttijd: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/no.json b/packages/livechat/src/i18n/no.json index 4aacd344322f7..9264dd1b8d7d6 100644 --- a/packages/livechat/src/i18n/no.json +++ b/packages/livechat/src/i18n/no.json @@ -1,14 +1,14 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "Er du sikker på at du vil bytte avdeling?", - "cancel": "Avbryt", - "conversation_finished": "Samtalen er avsluttet", - "department_switched": "Avdeling skiftet", - "no": "Nei", - "options": "Egenskaper", - "user_joined": "Bruker ble med", - "user_left": "Bruker igjen", - "we_are_not_online_right_now_please_leave_a_message": "Vi er ikke online akkurat nå. Legg igjen en beskjed.", - "yes": "Ja" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "Er du sikker på at du vil bytte avdeling?", + "cancel": "Avbryt", + "conversation_finished": "Samtalen er avsluttet", + "department_switched": "Avdeling skiftet", + "no": "Nei", + "options": "Egenskaper", + "user_joined": "Bruker ble med", + "user_left": "Bruker igjen", + "we_are_not_online_right_now_please_leave_a_message": "Vi er ikke online akkurat nå. Legg igjen en beskjed.", + "yes": "Ja" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/pl.json b/packages/livechat/src/i18n/pl.json index fb070be11ee34..cf9c32e2ba17d 100644 --- a/packages/livechat/src/i18n/pl.json +++ b/packages/livechat/src/i18n/pl.json @@ -1,73 +1,73 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Czy na pewno chcesz zakończyć rozmowę?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Czy na pewno chcesz usunąć wszystkie dane dotyczące rozmowy?", - "are_you_sure_you_want_to_switch_the_department": "Czy na pewno chcesz zmienić dział?", - "cancel": "Anuluj", - "change_department": "Zmień dział", - "change_department_1": "Zmień Dział", - "chat_finished": "Rozmowa Zakończona", - "choose_a_department": "Wybierz dział...", - "choose_a_department_1": "Wybierz dział", - "choose_an_option": "Wybierz opcję...", - "conversation_finished": "Rozmowa zakończona", - "count_new_messages_since_since_one": "Jedna nowa wiadomość od {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} nowych wiadomości od {{val, datetime}}", - "department_switched": "Zmieniono dział", - "departments": "Działy", - "disable_notifications": "Wyłącz powiadomienia", - "dismiss_this_alert": "Odrzuć powiadomienie", - "drop_here_to_upload_a_file": "Upuść tutaj, aby przesłać plik", - "enable_notifications": "Włącz powiadomienia", - "error_closing_chat": "Wystąpił błąd podczas zamykania rozmowy.", - "error_removing_user_data": "Wystąpił błąd podczas usuwania danych.", - "error_starting_a_new_conversation_reason": "Wystąpił błąd podczas tworzenia rozmowy: {{reason}}", - "expand_chat": "Otwórz w nowym oknie", - "file_exceeds_allowed_size_of_size": "Plik przekroczył dopuszczalny rozmiar {{size}}.", - "fileupload_error": "Błąd podczas wysyłania pliku", - "finish_this_chat": "Zakończ rozmowę", - "forget_remove_my_data": "Zapomnij/Usuń moje dane", - "gdpr": "RODO", - "go_to_menu_options_forget_remove_my_personal_data": "Idź do <1>Opcje → Zapomnij/Usuń moje dane, aby usunąć dane dotyczące rozmowy.", - "i_agree": "Zgadzam się", - "i_need_help_with": "Potrzebuję pomocy...", - "if_you_have_any_other_questions_just_press_the_but": "Jeśli masz jeszcze jakieś pytania, naciśnij poniższy przycisk, aby rozpocząć rozmowę.", - "leave_a_message": "Zostaw wiadomość", - "livechat_connected": "Połączono.", - "livechat_is_not_connected": "Nie połączono.", - "media_types_not_accepted": "Format pliku niedozwolony.", - "message": "Wiadomość", - "minimize_chat": "Minimalizuj okno", - "name": "Imię", - "need_help": "Potrzebujesz pomocy?", - "new_chat": "Nowa rozmowa", - "no": "Nie", - "no_available_agents_to_transfer": "Żaden konsultant nie jest dostępny", - "options": "Opcje", - "please_tell_us_some_information_to_start_the_chat": "Wyślij wiadomość, aby rozpocząć rozmowę", - "please_wait_for_the_next_available_agent": "Proszę zaczekać na konsultanta..", - "restore_chat": "Przywróć rozmowę", - "room_name_changed": "Nazwa rozmowy została zmieniona", - "send": "Wyślij", - "sound_is_off": "Wyłącz dźwięk", - "sound_is_on": "Włącz dźwiek", - "start_chat": "Rozpocznij rozmowę", - "thanks_for_talking_with_us": "Dziękujemy za kontakt", - "the_controller_of_your_personal_data_is_company_na": "Administratorem twoich danych osobowych jest [Company Name], z siedzibą przy ulicy [Company Address]. Rozpoczynając rozmowę, wyrażasz zgodę na przetwarzanie i przesyłanie twoich danych osobowych zgodnie z ogólnym rozporządzeniem o ochronie danych (RODO).", - "type_your_message_here": "Wpisz tu swoją wiadomość", - "unread_messages": "nieprzeczytane wiadomości", - "user_added_by": "Użytkownik dodany przez", - "user_joined": "Użytkownik dołączył", - "user_left": "Użytkownik wyszedł", - "user_removed_by": "Użytkownik usunięty przez", - "waiting_queue": "Oczekiwanie w kolejce...", - "we_are_not_online_right_now_please_leave_a_message": "Nie jesteśmy teraz online. Proszę zostawić wiadomość.", - "welcome": "Witamy", - "write_your_message": "Wpisz swoją wiadomość...", - "yes": "Tak", - "you_browser_doesn_t_support_audio_element": "Twoja przeglądarka nie wspiera elementów audio", - "you_browser_doesn_t_support_video_element": "Twoja przeglądarka nie wspiera elementów video", - "your_spot_is_spot": "Twoje miejsce to #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Twoje miejsce to #{{spot}} (Szacowany czas oczekiwania: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Czy na pewno chcesz zakończyć rozmowę?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Czy na pewno chcesz usunąć wszystkie dane dotyczące rozmowy?", + "are_you_sure_you_want_to_switch_the_department": "Czy na pewno chcesz zmienić dział?", + "cancel": "Anuluj", + "change_department": "Zmień dział", + "change_department_1": "Zmień Dział", + "chat_finished": "Rozmowa Zakończona", + "choose_a_department": "Wybierz dział...", + "choose_a_department_1": "Wybierz dział", + "choose_an_option": "Wybierz opcję...", + "conversation_finished": "Rozmowa zakończona", + "count_new_messages_since_since_one": "Jedna nowa wiadomość od {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} nowych wiadomości od {{val, datetime}}", + "department_switched": "Zmieniono dział", + "departments": "Działy", + "disable_notifications": "Wyłącz powiadomienia", + "dismiss_this_alert": "Odrzuć powiadomienie", + "drop_here_to_upload_a_file": "Upuść tutaj, aby przesłać plik", + "enable_notifications": "Włącz powiadomienia", + "error_closing_chat": "Wystąpił błąd podczas zamykania rozmowy.", + "error_removing_user_data": "Wystąpił błąd podczas usuwania danych.", + "error_starting_a_new_conversation_reason": "Wystąpił błąd podczas tworzenia rozmowy: {{reason}}", + "expand_chat": "Otwórz w nowym oknie", + "file_exceeds_allowed_size_of_size": "Plik przekroczył dopuszczalny rozmiar {{size}}.", + "fileupload_error": "Błąd podczas wysyłania pliku", + "finish_this_chat": "Zakończ rozmowę", + "forget_remove_my_data": "Zapomnij/Usuń moje dane", + "gdpr": "RODO", + "go_to_menu_options_forget_remove_my_personal_data": "Idź do <1>Opcje → Zapomnij/Usuń moje dane, aby usunąć dane dotyczące rozmowy.", + "i_agree": "Zgadzam się", + "i_need_help_with": "Potrzebuję pomocy...", + "if_you_have_any_other_questions_just_press_the_but": "Jeśli masz jeszcze jakieś pytania, naciśnij poniższy przycisk, aby rozpocząć rozmowę.", + "leave_a_message": "Zostaw wiadomość", + "livechat_connected": "Połączono.", + "livechat_is_not_connected": "Nie połączono.", + "media_types_not_accepted": "Format pliku niedozwolony.", + "message": "Wiadomość", + "minimize_chat": "Minimalizuj okno", + "name": "Imię", + "need_help": "Potrzebujesz pomocy?", + "new_chat": "Nowa rozmowa", + "no": "Nie", + "no_available_agents_to_transfer": "Żaden konsultant nie jest dostępny", + "options": "Opcje", + "please_tell_us_some_information_to_start_the_chat": "Wyślij wiadomość, aby rozpocząć rozmowę", + "please_wait_for_the_next_available_agent": "Proszę zaczekać na konsultanta..", + "restore_chat": "Przywróć rozmowę", + "room_name_changed": "Nazwa rozmowy została zmieniona", + "send": "Wyślij", + "sound_is_off": "Wyłącz dźwięk", + "sound_is_on": "Włącz dźwiek", + "start_chat": "Rozpocznij rozmowę", + "thanks_for_talking_with_us": "Dziękujemy za kontakt", + "the_controller_of_your_personal_data_is_company_na": "Administratorem twoich danych osobowych jest [Company Name], z siedzibą przy ulicy [Company Address]. Rozpoczynając rozmowę, wyrażasz zgodę na przetwarzanie i przesyłanie twoich danych osobowych zgodnie z ogólnym rozporządzeniem o ochronie danych (RODO).", + "type_your_message_here": "Wpisz tu swoją wiadomość", + "unread_messages": "nieprzeczytane wiadomości", + "user_added_by": "Użytkownik dodany przez", + "user_joined": "Użytkownik dołączył", + "user_left": "Użytkownik wyszedł", + "user_removed_by": "Użytkownik usunięty przez", + "waiting_queue": "Oczekiwanie w kolejce...", + "we_are_not_online_right_now_please_leave_a_message": "Nie jesteśmy teraz online. Proszę zostawić wiadomość.", + "welcome": "Witamy", + "write_your_message": "Wpisz swoją wiadomość...", + "yes": "Tak", + "you_browser_doesn_t_support_audio_element": "Twoja przeglądarka nie wspiera elementów audio", + "you_browser_doesn_t_support_video_element": "Twoja przeglądarka nie wspiera elementów video", + "your_spot_is_spot": "Twoje miejsce to #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Twoje miejsce to #{{spot}} (Szacowany czas oczekiwania: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/pt-BR.json b/packages/livechat/src/i18n/pt-BR.json index 214d1865895f8..d47eb054e79b4 100644 --- a/packages/livechat/src/i18n/pt-BR.json +++ b/packages/livechat/src/i18n/pt-BR.json @@ -1,86 +1,86 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Tem certeza de que deseja encerrar este chat?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Tem certeza de que deseja remover todos os seus dados pessoais?", - "are_you_sure_you_want_to_switch_the_department": "Tem certeza de que deseja trocar de departamento?", - "cancel": "Cancelar", - "change_department": "Trocar departamento", - "change_department_1": "Trocar Departamento", - "chat_finished": "Chat Terminado", - "chat_now": "Converse agora", - "chat_started": "Bate-papo iniciado", - "choose_a_department": "Escolha um departamento...", - "choose_a_department_1": "Escolha um departamento", - "choose_an_option": "Escolha uma opção...", - "conversation_finished": "Conversa Encerrada", - "count_new_messages_since_since_one": "Uma nova mensagem desde {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} novas mensagens desde {{val, datetime}}", - "department_switched": "Departamento trocado", - "departments": "Departamentos", - "disable_notifications": "Disabilitar notificações", - "dismiss_this_alert": "Ignorar este alerta", - "drop_here_to_upload_a_file": "Arraste e solte um aquivo para fazer upload", - "email": "E-mail", - "enable_notifications": "Habilitar notificações", - "error_closing_chat": "Erro ao fechar o chat.", - "error_removing_user_data": "Erro ao remover os dados do usuário.", - "error_starting_a_new_conversation_reason": "Erro ao iniciar nova conversa: {{reason}}", - "expand_chat": "Expandir chat", - "field_required": "Campo obrigatório", - "file_exceeds_allowed_size_of_size": "Arquivo excede o tamanho permitido de {{size}}.", - "fileupload_error": "Erro no upload do arquivo", - "finish_this_chat": "Encerrar este chat", - "forget_remove_my_data": "Esquecer/remover meus dados pessoais", - "from_returned_the_chat_to_the_queue": "{{from}} retornou a conversa para a fila", - "from_transferred_the_chat_to_the_department_to": "{{from}} transferiu a conversa para o departamento {{to}}", - "from_transferred_the_chat_to_to": "{{from}} transferiu a conversa para {{to}}", - "go_to_menu_options_forget_remove_my_personal_data": "Vá para o menu <1>opções → Esquecer/remover meus dados pessoais para solicitar a remoção imediata dos seus dados.", - "hiddenelementscount_more": "+ {{hiddenElementsCount}} mais", - "i_agree": "Concordo", - "i_need_help_with": "Preciso de ajuda com...", - "if_you_have_any_other_questions_just_press_the_but": "Se você tiver qualquer outras dúvidas, basta pressionar o botão abaixo para iniciar um novo chat.", - "insert_your_field_here": "Entre com o seu {{field}} aqui...", - "invalid_email": "E-mail inválido", - "invalid_value": "Valor inválido", - "leave_a_message": "Deixe uma mensagem", - "livechat_connected": "Livechat conectado.", - "livechat_is_not_connected": "Livechat não está conectado ao servidor.", - "media_types_not_accepted": "Tipo de mídia não aceito.", - "message": "Mensagem", - "minimize_chat": "Minimizar chat", - "name": "Nome", - "need_help": "Precisa de ajuda?", - "new_chat": "Novo Chat", - "no": "Não", - "no_available_agents_to_transfer": "Não há agentes disponíveis para transferência", - "options": "Opções", - "please_tell_us_some_information_to_start_the_chat": "Por favor, nos passe algumas informações antes de iniciar o chat", - "please_wait_for_the_next_available_agent": "Por favor, aguarde o próximo agente disponível..", - "powered_by_rocket_chat": "Desenvolvido por Rocket.Chat", - "restore_chat": "Restaurar o chat", - "room_name_changed": "Nome da sala alterado", - "send": "Enviar", - "sound_is_off": "O som está desligado", - "sound_is_on": "O som está ligado", - "start_chat": "Iniciar chat", - "thanks_for_talking_with_us": "Obrigado por falar conosco", - "the_controller_of_your_personal_data_is_company_na": "O controlador dos seus dados pessoais é [Nome da Empresa], com sede em [Company Address]. Para iniciar o chat, você concorda que seus dados pessoais serão processados e transmitidos de acordo com o Regulamento Geral de Proteção de Dados(GDPR).", - "transcript_success": "Transcrição enviada", - "type_your_message_here": "Digite sua mensagem aqui", - "unread_messages": "Mensagens não lidas", - "user_added_by": "Usuário {{user_added}} adicionado à conversa por {{user_by}}.", - "user_joined": "Usuário entrou", - "user_left": "Usuário saiu", - "user_removed_by": "Usuário removido por", - "waiting_queue": "Fila de espera...", - "we_are_not_online_right_now_please_leave_a_message": "Não estamos online agora. Por favor deixe uma mensagem.", - "welcome": "Bem vindo(a)", - "would_you_like_a_copy_of_this_chat_emailed": "Gostaria de uma cópia desta conversa por email?", - "write_your_message": "Escreva sua mensagem...", - "yes": "Sim", - "you_browser_doesn_t_support_audio_element": "Seu navegador não suporta elemento de áudio", - "you_browser_doesn_t_support_video_element": "Seu navegador não suporta elemento de vídeo", - "your_spot_is_spot": "Seu lugar é #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Seu lugar é #{{spot}} (Tempo estimado: {{estimatedWaitTime}})" - } + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Tem certeza de que deseja encerrar este chat?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Tem certeza de que deseja remover todos os seus dados pessoais?", + "are_you_sure_you_want_to_switch_the_department": "Tem certeza de que deseja trocar de departamento?", + "cancel": "Cancelar", + "change_department": "Trocar departamento", + "change_department_1": "Trocar Departamento", + "chat_finished": "Chat Terminado", + "chat_now": "Converse agora", + "chat_started": "Bate-papo iniciado", + "choose_a_department": "Escolha um departamento...", + "choose_a_department_1": "Escolha um departamento", + "choose_an_option": "Escolha uma opção...", + "conversation_finished": "Conversa Encerrada", + "count_new_messages_since_since_one": "Uma nova mensagem desde {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} novas mensagens desde {{val, datetime}}", + "department_switched": "Departamento trocado", + "departments": "Departamentos", + "disable_notifications": "Disabilitar notificações", + "dismiss_this_alert": "Ignorar este alerta", + "drop_here_to_upload_a_file": "Arraste e solte um aquivo para fazer upload", + "email": "E-mail", + "enable_notifications": "Habilitar notificações", + "error_closing_chat": "Erro ao fechar o chat.", + "error_removing_user_data": "Erro ao remover os dados do usuário.", + "error_starting_a_new_conversation_reason": "Erro ao iniciar nova conversa: {{reason}}", + "expand_chat": "Expandir chat", + "field_required": "Campo obrigatório", + "file_exceeds_allowed_size_of_size": "Arquivo excede o tamanho permitido de {{size}}.", + "fileupload_error": "Erro no upload do arquivo", + "finish_this_chat": "Encerrar este chat", + "forget_remove_my_data": "Esquecer/remover meus dados pessoais", + "from_returned_the_chat_to_the_queue": "{{from}} retornou a conversa para a fila", + "from_transferred_the_chat_to_the_department_to": "{{from}} transferiu a conversa para o departamento {{to}}", + "from_transferred_the_chat_to_to": "{{from}} transferiu a conversa para {{to}}", + "go_to_menu_options_forget_remove_my_personal_data": "Vá para o menu <1>opções → Esquecer/remover meus dados pessoais para solicitar a remoção imediata dos seus dados.", + "hiddenelementscount_more": "+ {{hiddenElementsCount}} mais", + "i_agree": "Concordo", + "i_need_help_with": "Preciso de ajuda com...", + "if_you_have_any_other_questions_just_press_the_but": "Se você tiver qualquer outras dúvidas, basta pressionar o botão abaixo para iniciar um novo chat.", + "insert_your_field_here": "Entre com o seu {{field}} aqui...", + "invalid_email": "E-mail inválido", + "invalid_value": "Valor inválido", + "leave_a_message": "Deixe uma mensagem", + "livechat_connected": "Livechat conectado.", + "livechat_is_not_connected": "Livechat não está conectado ao servidor.", + "media_types_not_accepted": "Tipo de mídia não aceito.", + "message": "Mensagem", + "minimize_chat": "Minimizar chat", + "name": "Nome", + "need_help": "Precisa de ajuda?", + "new_chat": "Novo Chat", + "no": "Não", + "no_available_agents_to_transfer": "Não há agentes disponíveis para transferência", + "options": "Opções", + "please_tell_us_some_information_to_start_the_chat": "Por favor, nos passe algumas informações antes de iniciar o chat", + "please_wait_for_the_next_available_agent": "Por favor, aguarde o próximo agente disponível..", + "powered_by_rocket_chat": "Desenvolvido por Rocket.Chat", + "restore_chat": "Restaurar o chat", + "room_name_changed": "Nome da sala alterado", + "send": "Enviar", + "sound_is_off": "O som está desligado", + "sound_is_on": "O som está ligado", + "start_chat": "Iniciar chat", + "thanks_for_talking_with_us": "Obrigado por falar conosco", + "the_controller_of_your_personal_data_is_company_na": "O controlador dos seus dados pessoais é [Nome da Empresa], com sede em [Company Address]. Para iniciar o chat, você concorda que seus dados pessoais serão processados e transmitidos de acordo com o Regulamento Geral de Proteção de Dados(GDPR).", + "transcript_success": "Transcrição enviada", + "type_your_message_here": "Digite sua mensagem aqui", + "unread_messages": "Mensagens não lidas", + "user_added_by": "Usuário {{user_added}} adicionado à conversa por {{user_by}}.", + "user_joined": "Usuário entrou", + "user_left": "Usuário saiu", + "user_removed_by": "Usuário removido por", + "waiting_queue": "Fila de espera...", + "we_are_not_online_right_now_please_leave_a_message": "Não estamos online agora. Por favor deixe uma mensagem.", + "welcome": "Bem vindo(a)", + "would_you_like_a_copy_of_this_chat_emailed": "Gostaria de uma cópia desta conversa por email?", + "write_your_message": "Escreva sua mensagem...", + "yes": "Sim", + "you_browser_doesn_t_support_audio_element": "Seu navegador não suporta elemento de áudio", + "you_browser_doesn_t_support_video_element": "Seu navegador não suporta elemento de vídeo", + "your_spot_is_spot": "Seu lugar é #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Seu lugar é #{{spot}} (Tempo estimado: {{estimatedWaitTime}})" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/pt.json b/packages/livechat/src/i18n/pt.json index e6a6f553102c6..6657e0efd0936 100644 --- a/packages/livechat/src/i18n/pt.json +++ b/packages/livechat/src/i18n/pt.json @@ -1,19 +1,19 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "Tem certeza que deseja trocar de departamento?", - "cancel": "Cancelar", - "conversation_finished": "Chat encerrado", - "count_new_messages_since_since_one": "Uma nova mensagem desde {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} novas mensagens desde {{val, datetime}}", - "department_switched": "Departamento comutado", - "no": "Não", - "options": "Opções", - "send": "Enviar", - "user_joined": "Utilizador entrou", - "user_left": "O utilizador saiu", - "we_are_not_online_right_now_please_leave_a_message": "Não estamos online agora. Por favor deixe uma mensagem.", - "yes": "Sim", - "your_spot_is_spot": "Seu lugar é #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Seu lugar é #{{spot}} (Tempo estimado: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "Tem certeza que deseja trocar de departamento?", + "cancel": "Cancelar", + "conversation_finished": "Chat encerrado", + "count_new_messages_since_since_one": "Uma nova mensagem desde {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} novas mensagens desde {{val, datetime}}", + "department_switched": "Departamento comutado", + "no": "Não", + "options": "Opções", + "send": "Enviar", + "user_joined": "Utilizador entrou", + "user_left": "O utilizador saiu", + "we_are_not_online_right_now_please_leave_a_message": "Não estamos online agora. Por favor deixe uma mensagem.", + "yes": "Sim", + "your_spot_is_spot": "Seu lugar é #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Seu lugar é #{{spot}} (Tempo estimado: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ro.json b/packages/livechat/src/i18n/ro.json index e96059d8b6eff..d4c5bb8b510a7 100644 --- a/packages/livechat/src/i18n/ro.json +++ b/packages/livechat/src/i18n/ro.json @@ -1,18 +1,18 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Sigur doriți să încheiați acest chat?", - "cancel": "Anulează", - "chat_finished": "Chat-ul s-a terminat!", - "choose_a_department": "Alegeți un departament...", - "choose_a_department_1": "Alegeți un departament", - "conversation_finished": "conversație terminat", - "department_switched": "Departamentul a fost schimbat", - "no": "Nu", - "options": "Opțiuni", - "send": "Trimite", - "user_joined": "utilizator s-a alăturat", - "user_left": "stânga utilizator", - "we_are_not_online_right_now_please_leave_a_message": "Nu suntem online chiar acum. Te rog lasa un mesaj.", - "yes": "Da" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Sigur doriți să încheiați acest chat?", + "cancel": "Anulează", + "chat_finished": "Chat-ul s-a terminat!", + "choose_a_department": "Alegeți un departament...", + "choose_a_department_1": "Alegeți un departament", + "conversation_finished": "conversație terminat", + "department_switched": "Departamentul a fost schimbat", + "no": "Nu", + "options": "Opțiuni", + "send": "Trimite", + "user_joined": "utilizator s-a alăturat", + "user_left": "stânga utilizator", + "we_are_not_online_right_now_please_leave_a_message": "Nu suntem online chiar acum. Te rog lasa un mesaj.", + "yes": "Da" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ru.json b/packages/livechat/src/i18n/ru.json index 5be1069f13968..de242247a7d11 100644 --- a/packages/livechat/src/i18n/ru.json +++ b/packages/livechat/src/i18n/ru.json @@ -1,77 +1,77 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Вы уверены, что хотите закончить разговор?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Вы уверены, что хотите удалить все ваши персональные данные?", - "are_you_sure_you_want_to_switch_the_department": "Вы уверены, что хотите сменить отдел?", - "cancel": "Отмена", - "change_department": "Сменить отдел", - "change_department_1": "Сменить Отдел", - "chat_finished": "Разговор Закончен", - "choose_a_department": "Выберите отдел...", - "choose_a_department_1": "Выберите отдел", - "choose_an_option": "Выберите опцию...", - "conversation_finished": "Разговор окончен", - "count_new_messages_since_since_one": "Одно новое сообщение с {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} новых сообщений с {{val, datetime}}", - "department_switched": "Отдел сменeн", - "departments": "Отделы", - "disable_notifications": "Выключить оповещение", - "dismiss_this_alert": "Пропустить данное предупреждение", - "drop_here_to_upload_a_file": "Бросить сюда файл для загрузки", - "enable_notifications": "Включить оповещения", - "error_closing_chat": "Ошибка закрытия чата.", - "error_removing_user_data": "Ошибка удаления пользовательских данных.", - "error_starting_a_new_conversation_reason": "Ошибка при запуске нового диалога: {{reason}}", - "expand_chat": "Развернуть окно чата", - "field_required": "Поле обязательно", - "file_exceeds_allowed_size_of_size": "Файл превышает разрешенный размер в {{size}}.", - "fileupload_error": "Ошибка загрузки файла", - "finish_this_chat": "Завершить этот чат", - "forget_remove_my_data": "Забыть/удалить мои данные", - "from_transferred_the_chat_to_to": "Перенаправлен от {{from}} на {{to}}", - "go_to_menu_options_forget_remove_my_personal_data": "Перейти <1>меню опции → Забыть/удалить мои персональные данные, чтобы запросить немедленное удаление ваших данных.", - "i_agree": "Я согласен", - "i_need_help_with": "Мне требуется помощь с...", - "if_you_have_any_other_questions_just_press_the_but": "Если у вас есть еще вопросы, нажмите на кнопку ниже, чтобы начать новый чат.", - "insert_your_field_here": "Введите {{field}} ...", - "invalid_email": "Неверный эмайл", - "invalid_value": "Неверное значение", - "leave_a_message": "Оставить сообщение", - "livechat_connected": "Livechat подключен.", - "livechat_is_not_connected": "Livechat не подключен.", - "media_types_not_accepted": "Данный тип медиа не поддерживается.", - "message": "Сообщение", - "minimize_chat": "Свернуть окно чата", - "name": "Имя", - "need_help": "Требуется помощь?", - "new_chat": "Новый чат", - "no": "Нет", - "no_available_agents_to_transfer": "Нет доступных операторов для передачи", - "options": "Параметры", - "please_tell_us_some_information_to_start_the_chat": "Пожалуйста, расскажите о себе прежде чем, начать чат", - "please_wait_for_the_next_available_agent": "Пожалуйста, подождите пока освободится следующий оператор...", - "powered_by_rocket_chat": "Работает на Rocket.Chat", - "restore_chat": "Восстановить чат", - "room_name_changed": "Имя комнаты изменено", - "send": "Отправить", - "sound_is_off": "Звук отключен", - "sound_is_on": "Звук включен", - "start_chat": "Начать чат", - "thanks_for_talking_with_us": "Спасибо, что обратились к нам", - "type_your_message_here": "Напечатайте ваше сообщение", - "unread_messages": "непрочитанные сообщения", - "user_added_by": "Пользователь добавлен пользователем", - "user_joined": "Пользователь присоединился", - "user_left": "Пользователь вышел", - "user_removed_by": "Пользователь удален пользователем", - "waiting_queue": "Ожидание очереди...", - "we_are_not_online_right_now_please_leave_a_message": "Мы сейчас не в сети. Пожалуйста, оставьте сообщение.", - "welcome": "Добро пожаловать", - "write_your_message": "Напишите ваше сообщение...", - "yes": "Да", - "you_browser_doesn_t_support_audio_element": "Ваш браузер не поддерживает аудио", - "you_browser_doesn_t_support_video_element": "Ваш браузер не поддерживает видео", - "your_spot_is_spot": "Ваше место в очереди: #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Ваше место в очереди: #{{spot}} (Предполагаемое время ожидания: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Вы уверены, что хотите закончить разговор?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Вы уверены, что хотите удалить все ваши персональные данные?", + "are_you_sure_you_want_to_switch_the_department": "Вы уверены, что хотите сменить отдел?", + "cancel": "Отмена", + "change_department": "Сменить отдел", + "change_department_1": "Сменить Отдел", + "chat_finished": "Разговор Закончен", + "choose_a_department": "Выберите отдел...", + "choose_a_department_1": "Выберите отдел", + "choose_an_option": "Выберите опцию...", + "conversation_finished": "Разговор окончен", + "count_new_messages_since_since_one": "Одно новое сообщение с {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} новых сообщений с {{val, datetime}}", + "department_switched": "Отдел сменeн", + "departments": "Отделы", + "disable_notifications": "Выключить оповещение", + "dismiss_this_alert": "Пропустить данное предупреждение", + "drop_here_to_upload_a_file": "Бросить сюда файл для загрузки", + "enable_notifications": "Включить оповещения", + "error_closing_chat": "Ошибка закрытия чата.", + "error_removing_user_data": "Ошибка удаления пользовательских данных.", + "error_starting_a_new_conversation_reason": "Ошибка при запуске нового диалога: {{reason}}", + "expand_chat": "Развернуть окно чата", + "field_required": "Поле обязательно", + "file_exceeds_allowed_size_of_size": "Файл превышает разрешенный размер в {{size}}.", + "fileupload_error": "Ошибка загрузки файла", + "finish_this_chat": "Завершить этот чат", + "forget_remove_my_data": "Забыть/удалить мои данные", + "from_transferred_the_chat_to_to": "Перенаправлен от {{from}} на {{to}}", + "go_to_menu_options_forget_remove_my_personal_data": "Перейти <1>меню опции → Забыть/удалить мои персональные данные, чтобы запросить немедленное удаление ваших данных.", + "i_agree": "Я согласен", + "i_need_help_with": "Мне требуется помощь с...", + "if_you_have_any_other_questions_just_press_the_but": "Если у вас есть еще вопросы, нажмите на кнопку ниже, чтобы начать новый чат.", + "insert_your_field_here": "Введите {{field}} ...", + "invalid_email": "Неверный эмайл", + "invalid_value": "Неверное значение", + "leave_a_message": "Оставить сообщение", + "livechat_connected": "Livechat подключен.", + "livechat_is_not_connected": "Livechat не подключен.", + "media_types_not_accepted": "Данный тип медиа не поддерживается.", + "message": "Сообщение", + "minimize_chat": "Свернуть окно чата", + "name": "Имя", + "need_help": "Требуется помощь?", + "new_chat": "Новый чат", + "no": "Нет", + "no_available_agents_to_transfer": "Нет доступных операторов для передачи", + "options": "Параметры", + "please_tell_us_some_information_to_start_the_chat": "Пожалуйста, расскажите о себе прежде чем, начать чат", + "please_wait_for_the_next_available_agent": "Пожалуйста, подождите пока освободится следующий оператор...", + "powered_by_rocket_chat": "Работает на Rocket.Chat", + "restore_chat": "Восстановить чат", + "room_name_changed": "Имя комнаты изменено", + "send": "Отправить", + "sound_is_off": "Звук отключен", + "sound_is_on": "Звук включен", + "start_chat": "Начать чат", + "thanks_for_talking_with_us": "Спасибо, что обратились к нам", + "type_your_message_here": "Напечатайте ваше сообщение", + "unread_messages": "непрочитанные сообщения", + "user_added_by": "Пользователь добавлен пользователем", + "user_joined": "Пользователь присоединился", + "user_left": "Пользователь вышел", + "user_removed_by": "Пользователь удален пользователем", + "waiting_queue": "Ожидание очереди...", + "we_are_not_online_right_now_please_leave_a_message": "Мы сейчас не в сети. Пожалуйста, оставьте сообщение.", + "welcome": "Добро пожаловать", + "write_your_message": "Напишите ваше сообщение...", + "yes": "Да", + "you_browser_doesn_t_support_audio_element": "Ваш браузер не поддерживает аудио", + "you_browser_doesn_t_support_video_element": "Ваш браузер не поддерживает видео", + "your_spot_is_spot": "Ваше место в очереди: #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Ваше место в очереди: #{{spot}} (Предполагаемое время ожидания: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/sk-SK.json b/packages/livechat/src/i18n/sk-SK.json index 133c03844b291..b0ae2f6bcd75d 100644 --- a/packages/livechat/src/i18n/sk-SK.json +++ b/packages/livechat/src/i18n/sk-SK.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Zrušiť", - "conversation_finished": "Konverzácia bola ukončená", - "department_switched": "Oddelenie bolo prepnuté", - "no": "Žiadny", - "options": "Možnosti", - "send": "Odoslať", - "user_joined": "Používateľ sa pripojil", - "user_left": "Používateľ odišiel", - "we_are_not_online_right_now_please_leave_a_message": "Momentálne nie sme online. Prosíme, zanechajte správu.", - "yes": "Áno" - } + "translation": { + "cancel": "Zrušiť", + "conversation_finished": "Konverzácia bola ukončená", + "department_switched": "Oddelenie bolo prepnuté", + "no": "Žiadny", + "options": "Možnosti", + "send": "Odoslať", + "user_joined": "Používateľ sa pripojil", + "user_left": "Používateľ odišiel", + "we_are_not_online_right_now_please_leave_a_message": "Momentálne nie sme online. Prosíme, zanechajte správu.", + "yes": "Áno" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/sl-SI.json b/packages/livechat/src/i18n/sl-SI.json index bb6735a6601d2..172e77fafeafb 100644 --- a/packages/livechat/src/i18n/sl-SI.json +++ b/packages/livechat/src/i18n/sl-SI.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Prekliči", - "conversation_finished": "Pogovor končan", - "department_switched": "Oddelek zamenjan", - "no": "Ne", - "options": "Možnosti", - "send": "Pošlji", - "user_joined": "Uporabnik se je pridružil", - "user_left": "Uporabnik je odšel", - "we_are_not_online_right_now_please_leave_a_message": "Trenutno nismo na spletu. Prosim pustite sporočilo.", - "yes": "Da" - } + "translation": { + "cancel": "Prekliči", + "conversation_finished": "Pogovor končan", + "department_switched": "Oddelek zamenjan", + "no": "Ne", + "options": "Možnosti", + "send": "Pošlji", + "user_joined": "Uporabnik se je pridružil", + "user_left": "Uporabnik je odšel", + "we_are_not_online_right_now_please_leave_a_message": "Trenutno nismo na spletu. Prosim pustite sporočilo.", + "yes": "Da" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/sq.json b/packages/livechat/src/i18n/sq.json index 05aa44a4d20d7..a15c115927215 100644 --- a/packages/livechat/src/i18n/sq.json +++ b/packages/livechat/src/i18n/sq.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Anuloj", - "conversation_finished": "biseda përfunduar", - "department_switched": "Departamenti kaloi", - "no": "jo", - "options": "Opsione", - "send": "dërgoj", - "user_joined": "User bashkua", - "user_left": "majtë User", - "we_are_not_online_right_now_please_leave_a_message": "Ne nuk jemi në linjë tani. Lëreni një mesazh.", - "yes": "po" - } -} + "translation": { + "cancel": "Anuloj", + "conversation_finished": "biseda përfunduar", + "department_switched": "Departamenti kaloi", + "no": "jo", + "options": "Opsione", + "send": "dërgoj", + "user_joined": "User bashkua", + "user_left": "majtë User", + "we_are_not_online_right_now_please_leave_a_message": "Ne nuk jemi në linjë tani. Lëreni një mesazh.", + "yes": "po" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/sr.json b/packages/livechat/src/i18n/sr.json index ed23c3e4b9d14..f3683b89be76a 100644 --- a/packages/livechat/src/i18n/sr.json +++ b/packages/livechat/src/i18n/sr.json @@ -1,75 +1,75 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "Желите ли да завршите овај разговор?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Желите ли да уклонимо све Ваше податке?", - "are_you_sure_you_want_to_switch_the_department": "Желите ли да променити одељење?", - "cancel": "Отказати", - "change_department": "Промени одељење", - "change_department_1": "Промени одељење", - "chat_finished": "Разговор завршен", - "choose_a_department": "Изабери одељење...", - "choose_a_department_1": "Изабери одељење", - "choose_an_option": "Изабери опцију...", - "conversation_finished": "Разговор завршен", - "count_new_messages_since_since_one": "Једна нова порука од {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} порукe/a од {{val, datetime}}", - "department_switched": "Одељење је промењено", - "departments": "Одељења", - "disable_notifications": "Искључи обавештења", - "dismiss_this_alert": "Одбаци ово обавештење", - "drop_here_to_upload_a_file": "Превуци овде за слање датотеке", - "email": "E-пошта", - "enable_notifications": "Омогући обавештења", - "error_closing_chat": "Грешка приликом завршетка разговора.", - "error_removing_user_data": "Грешка приликом уклањања корисничких података.", - "error_starting_a_new_conversation_reason": "Грешка приликом започињања новог разговора: {{reason}}", - "expand_chat": "Прошири прозор разговора", - "file_exceeds_allowed_size_of_size": "Датотека превазилази дозвољену величину од {{size}}.", - "fileupload_error": "Греша пирликом слања датотеке", - "finish_this_chat": "Заврши овај разговор", - "forget_remove_my_data": "Уклони моје податке", - "go_to_menu_options_forget_remove_my_personal_data": "Идите на <1>menu options → Forget/Remove my personal data да захтевате уклањање Ваших података.", - "i_agree": "Слажем се", - "i_need_help_with": "Потребна ми је помоћ са...", - "if_you_have_any_other_questions_just_press_the_but": "Уколико имате других питања, само притисните дугме испод да започенете нови разговор.", - "leave_a_message": "Оставите поруку", - "livechat_connected": "Разговор уживо укљичен.", - "livechat_is_not_connected": "Разговор уживо није повезан.", - "media_types_not_accepted": "Тип датотеке није прихватљив.", - "message": "Порука", - "minimize_chat": "Смањи прозор за разговор", - "name": "Име", - "need_help": "Потребна Вам је помоћ?", - "new_chat": "Нови разговор", - "no": "Ne", - "no_available_agents_to_transfer": "Тренутно нема доступних оператера", - "ok": "У реду", - "options": "Опције", - "please_tell_us_some_information_to_start_the_chat": "Молим Вас, унесите следеће информације за почетак разговора", - "please_wait_for_the_next_available_agent": "Молим Вас, сачекајте првог слободног оператера...", - "powered_by_rocket_chat": "омогућио RocketChat", - "restore_chat": "Наставите разговор", - "room_name_changed": "Промена назива собе", - "send": "Послати", - "sound_is_off": "Звук је искључен", - "sound_is_on": "Звук је укљичен", - "start_chat": "Започни разговор", - "thanks_for_talking_with_us": "Захваљујемо на разговору!", - "the_controller_of_your_personal_data_is_company_na": "Вашим приватним подацима управља [Company Name], са седиштем на адреси [Company Address]. Када започнете разговор, прихватате да ће Ваши приватни подаци бити процесуирани и складиштени у складу са General Data Protection Regulation (GDPR).", - "type_your_message_here": "Укуцајте Вашу поруку овде", - "unread_messages": "Непрочитане поруке", - "user_added_by": "Корисник додат од стране", - "user_joined": "Корисник се придружио", - "user_left": "Корисник отишао", - "user_removed_by": "Корисник уклоњен од стране", - "waiting_queue": "Чекање у реду...", - "we_are_not_online_right_now_please_leave_a_message": "Тренутно нисмо на мрежи. Молимо оставите поруку.", - "welcome": "Добро дошли!", - "write_your_message": "Укуцајте Вашу поруку...", - "yes": "Да", - "you_browser_doesn_t_support_audio_element": "Ваш претраживач не подржава звучне елементе", - "you_browser_doesn_t_support_video_element": "Ваш претраживач не подржава видео елементе", - "your_spot_is_spot": "Ваше место је #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Ваше место је #{{spot}} (Очекивано време чекања: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "Желите ли да завршите овај разговор?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Желите ли да уклонимо све Ваше податке?", + "are_you_sure_you_want_to_switch_the_department": "Желите ли да променити одељење?", + "cancel": "Отказати", + "change_department": "Промени одељење", + "change_department_1": "Промени одељење", + "chat_finished": "Разговор завршен", + "choose_a_department": "Изабери одељење...", + "choose_a_department_1": "Изабери одељење", + "choose_an_option": "Изабери опцију...", + "conversation_finished": "Разговор завршен", + "count_new_messages_since_since_one": "Једна нова порука од {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} порукe/a од {{val, datetime}}", + "department_switched": "Одељење је промењено", + "departments": "Одељења", + "disable_notifications": "Искључи обавештења", + "dismiss_this_alert": "Одбаци ово обавештење", + "drop_here_to_upload_a_file": "Превуци овде за слање датотеке", + "email": "E-пошта", + "enable_notifications": "Омогући обавештења", + "error_closing_chat": "Грешка приликом завршетка разговора.", + "error_removing_user_data": "Грешка приликом уклањања корисничких података.", + "error_starting_a_new_conversation_reason": "Грешка приликом започињања новог разговора: {{reason}}", + "expand_chat": "Прошири прозор разговора", + "file_exceeds_allowed_size_of_size": "Датотека превазилази дозвољену величину од {{size}}.", + "fileupload_error": "Греша пирликом слања датотеке", + "finish_this_chat": "Заврши овај разговор", + "forget_remove_my_data": "Уклони моје податке", + "go_to_menu_options_forget_remove_my_personal_data": "Идите на <1>menu options → Forget/Remove my personal data да захтевате уклањање Ваших података.", + "i_agree": "Слажем се", + "i_need_help_with": "Потребна ми је помоћ са...", + "if_you_have_any_other_questions_just_press_the_but": "Уколико имате других питања, само притисните дугме испод да започенете нови разговор.", + "leave_a_message": "Оставите поруку", + "livechat_connected": "Разговор уживо укљичен.", + "livechat_is_not_connected": "Разговор уживо није повезан.", + "media_types_not_accepted": "Тип датотеке није прихватљив.", + "message": "Порука", + "minimize_chat": "Смањи прозор за разговор", + "name": "Име", + "need_help": "Потребна Вам је помоћ?", + "new_chat": "Нови разговор", + "no": "Ne", + "no_available_agents_to_transfer": "Тренутно нема доступних оператера", + "ok": "У реду", + "options": "Опције", + "please_tell_us_some_information_to_start_the_chat": "Молим Вас, унесите следеће информације за почетак разговора", + "please_wait_for_the_next_available_agent": "Молим Вас, сачекајте првог слободног оператера...", + "powered_by_rocket_chat": "омогућио RocketChat", + "restore_chat": "Наставите разговор", + "room_name_changed": "Промена назива собе", + "send": "Послати", + "sound_is_off": "Звук је искључен", + "sound_is_on": "Звук је укљичен", + "start_chat": "Започни разговор", + "thanks_for_talking_with_us": "Захваљујемо на разговору!", + "the_controller_of_your_personal_data_is_company_na": "Вашим приватним подацима управља [Company Name], са седиштем на адреси [Company Address]. Када започнете разговор, прихватате да ће Ваши приватни подаци бити процесуирани и складиштени у складу са General Data Protection Regulation (GDPR).", + "type_your_message_here": "Укуцајте Вашу поруку овде", + "unread_messages": "Непрочитане поруке", + "user_added_by": "Корисник додат од стране", + "user_joined": "Корисник се придружио", + "user_left": "Корисник отишао", + "user_removed_by": "Корисник уклоњен од стране", + "waiting_queue": "Чекање у реду...", + "we_are_not_online_right_now_please_leave_a_message": "Тренутно нисмо на мрежи. Молимо оставите поруку.", + "welcome": "Добро дошли!", + "write_your_message": "Укуцајте Вашу поруку...", + "yes": "Да", + "you_browser_doesn_t_support_audio_element": "Ваш претраживач не подржава звучне елементе", + "you_browser_doesn_t_support_video_element": "Ваш претраживач не подржава видео елементе", + "your_spot_is_spot": "Ваше место је #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Ваше место је #{{spot}} (Очекивано време чекања: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/sv.json b/packages/livechat/src/i18n/sv.json index 3810b9a010719..d468b428f23ce 100644 --- a/packages/livechat/src/i18n/sv.json +++ b/packages/livechat/src/i18n/sv.json @@ -1,101 +1,101 @@ { - "translation": { - "accept": "Acceptera", - "are_you_sure_you_want_to_finish_this_chat": "Är du säker på att du vill avsluta denna chatten?", - "are_you_sure_you_want_to_remove_all_of_your_person": "Är du säker på att du vill ta bort all din personliga data?", - "are_you_sure_you_want_to_switch_the_department": "Är du säker på att du vill byta avdelning?", - "call_end_time": "Samtal avslutades {{time, datetime}} - Varade {{callDuration, datetime}}", - "cancel": "Avbryt", - "change_department": "Byt avdelning", - "change_department_1": "Byt avdelning", - "chat_finished": "Chat avslutad", - "chat_now": "Chatta nu", - "chat_started": "Chat startad", - "choose_a_department": "Välj avdelning...", - "choose_a_department_1": "Välj avdelning", - "choose_an_option": "Välj ett alternativ", - "conversation_finished": "Konversation avslutad", - "count_new_messages_since_since_one": "Ett nytt meddelande sedan {{val, datetime}}", - "count_new_messages_since_since_other": "{{count}} nya meddelande sedan {{val, datetime}}", - "decline": "Neka", - "department_switched": "Avdelning bytt", - "departments": "Avdelningar", - "disable_notifications": "Inaktivera aviseringar", - "dismiss_this_alert": "Avvisa denna varning", - "drop_here_to_upload_a_file": "Släpp fil här för att ladda upp", - "email": "Email", - "enable_notifications": "Aktivera aviseringar", - "error_closing_chat": "Fel vid avslutande av chat.", - "error_getting_call_alert": "Fel vid samtalsavisering.", - "error_removing_user_data": "Fel vid borttagning av användardata.", - "error_starting_a_new_conversation_reason": "Fel vid start av konversation: {{reason}}", - "expand_chat": "Expandera chat", - "field_required": "Obligatoriskt fält", - "file_exceeds_allowed_size_of_size": "Filen överskrider tillåten storlek på {{size}}.", - "fileupload_error": "Fel vid uppladdning", - "finish_this_chat": "Avsluta chat", - "forget_remove_my_data": "Ta bort min data", - "from_returned_the_chat_to_the_queue": "{{from}} skickade tillbaka chatten till kön", - "the_agent_transferred_the_chat_to_the_department_to": "Agenten flyttade chatten till avdelning {{to}}", - "from_transferred_the_chat_to_the_department_to": "{{from}} flyttade chatten till avdelning {{to}}", - "from_transferred_the_chat_to_to": "{{from}} flyttade chatten till {{to}}", - "gdpr": "GDPR", - "go_to_menu_options_forget_remove_my_personal_data": "Gå till <1>meny inställningar → Ta bort min data för att begära omedelbar borttagning av din data.", - "hiddenelementscount_more": "+ {{hiddenElementsCount}} mer", - "i_agree": "Jag accepterar", - "i_need_help_with": "Jag behöver hjälp med...", - "if_you_have_any_other_questions_just_press_the_but": "Om du har fler frågor, tryck på knappen nedan för att starta en ny chat.", - "incoming_video_call": "Inkommande videosamtal", - "insert_your_field_here": "Infoga ditt {{field}} här...", - "invalid_email": "Ogiltig e-post", - "invalid_value": "Ogiltigt värde", - "join_call": "Anslut till samtal", - "join_my_room_to_start_the_video_call": "Anslut till mitt rum för att starta videosamtal.", - "leave_a_message": "Lämna ett meddelande", - "livechat_connected": "Livechat ansluten.", - "livechat_is_not_connected": "Livechat ej ansluten.", - "media_types_not_accepted": "Mediatypen accepteras inte.", - "message": "Meddelande", - "messages": "Meddelanden", - "message_separator_date": "{{val, datetime}}", - "message_time": "{{val, datetime}}", - "minimize_chat": "Minimera chat", - "name": "Namn", - "need_help": "Behöver du hjälp?", - "new_chat": "Ny chat", - "no": "Nej", - "no_available_agents_to_transfer": "Inga agenter tillgängliga för överföring.", - "ok": "OK", - "options": "Inställningar", - "please_tell_us_some_information_to_start_the_chat": "Vänligen ange information för att starta chat", - "please_wait_for_the_next_available_agent": "Vänligen vänta på nästa tillgängliga agent..", - "powered_by_rocket_chat": "Powered by Rocket.Chat", - "restore_chat": "Återställ chat", - "room_name_changed": "Rumsnamn ändrades", - "send": "Skicka", - "sound_is_off": "Ljud inaktiverat", - "sound_is_on": "Ljud aktiverat", - "start_chat": "Starta chat", - "thanks_for_talking_with_us": "Tack för att du kontaktar oss", - "the_chat_was_moved_back_to_queue": "Chatten flyttades tillbaka till kön", - "the_chat_was_transferred_to_another_agent": "Chatten flyttades till annan agent", - "the_controller_of_your_personal_data_is_company_na": "Den personuppgiftsansvarige för dina personuppgifter är [Företagsnamn], med säte på [Företagsadress]. För att starta chatten samtycker du till att dina personuppgifter behandlas och överförs i enlighet med den allmänna dataskyddsförordningen (GDPR).", - "transcript_success": "Transkription skickad", - "type_your_message_here": "Meddelande", - "unread_messages": "olästa meddelande", - "user_added_by": "Användare tillagd av", - "user_joined": "Användare ansluten", - "user_left": "Användare lämnade", - "user_removed_by": "Användare borttagen av", - "waiting_queue": "Kö...", - "we_are_not_online_right_now_please_leave_a_message": "Vi är inte online just nu. Lämna gärna ett medelande.", - "welcome": "Välkommen", - "would_you_like_a_copy_of_this_chat_emailed":"Vill du ha en kopia av chatten till din e-post?", - "write_your_message": "Skriv meddelande", - "yes": "Ja", - "you_browser_doesn_t_support_audio_element": "Din webbläsare stödjer inte ljudelement", - "you_browser_doesn_t_support_video_element": "Din webbläsare stödjer inte videoelement", - "your_spot_is_spot": "Din plats i kön är #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "Din plats i kön är #{{spot}} (Återstående kötid: {{estimatedWaitTime}})" - } -} + "translation": { + "accept": "Acceptera", + "are_you_sure_you_want_to_finish_this_chat": "Är du säker på att du vill avsluta denna chatten?", + "are_you_sure_you_want_to_remove_all_of_your_person": "Är du säker på att du vill ta bort all din personliga data?", + "are_you_sure_you_want_to_switch_the_department": "Är du säker på att du vill byta avdelning?", + "call_end_time": "Samtal avslutades {{time, datetime}} - Varade {{callDuration, datetime}}", + "cancel": "Avbryt", + "change_department": "Byt avdelning", + "change_department_1": "Byt avdelning", + "chat_finished": "Chat avslutad", + "chat_now": "Chatta nu", + "chat_started": "Chat startad", + "choose_a_department": "Välj avdelning...", + "choose_a_department_1": "Välj avdelning", + "choose_an_option": "Välj ett alternativ", + "conversation_finished": "Konversation avslutad", + "count_new_messages_since_since_one": "Ett nytt meddelande sedan {{val, datetime}}", + "count_new_messages_since_since_other": "{{count}} nya meddelande sedan {{val, datetime}}", + "decline": "Neka", + "department_switched": "Avdelning bytt", + "departments": "Avdelningar", + "disable_notifications": "Inaktivera aviseringar", + "dismiss_this_alert": "Avvisa denna varning", + "drop_here_to_upload_a_file": "Släpp fil här för att ladda upp", + "email": "Email", + "enable_notifications": "Aktivera aviseringar", + "error_closing_chat": "Fel vid avslutande av chat.", + "error_getting_call_alert": "Fel vid samtalsavisering.", + "error_removing_user_data": "Fel vid borttagning av användardata.", + "error_starting_a_new_conversation_reason": "Fel vid start av konversation: {{reason}}", + "expand_chat": "Expandera chat", + "field_required": "Obligatoriskt fält", + "file_exceeds_allowed_size_of_size": "Filen överskrider tillåten storlek på {{size}}.", + "fileupload_error": "Fel vid uppladdning", + "finish_this_chat": "Avsluta chat", + "forget_remove_my_data": "Ta bort min data", + "from_returned_the_chat_to_the_queue": "{{from}} skickade tillbaka chatten till kön", + "the_agent_transferred_the_chat_to_the_department_to": "Agenten flyttade chatten till avdelning {{to}}", + "from_transferred_the_chat_to_the_department_to": "{{from}} flyttade chatten till avdelning {{to}}", + "from_transferred_the_chat_to_to": "{{from}} flyttade chatten till {{to}}", + "gdpr": "GDPR", + "go_to_menu_options_forget_remove_my_personal_data": "Gå till <1>meny inställningar → Ta bort min data för att begära omedelbar borttagning av din data.", + "hiddenelementscount_more": "+ {{hiddenElementsCount}} mer", + "i_agree": "Jag accepterar", + "i_need_help_with": "Jag behöver hjälp med...", + "if_you_have_any_other_questions_just_press_the_but": "Om du har fler frågor, tryck på knappen nedan för att starta en ny chat.", + "incoming_video_call": "Inkommande videosamtal", + "insert_your_field_here": "Infoga ditt {{field}} här...", + "invalid_email": "Ogiltig e-post", + "invalid_value": "Ogiltigt värde", + "join_call": "Anslut till samtal", + "join_my_room_to_start_the_video_call": "Anslut till mitt rum för att starta videosamtal.", + "leave_a_message": "Lämna ett meddelande", + "livechat_connected": "Livechat ansluten.", + "livechat_is_not_connected": "Livechat ej ansluten.", + "media_types_not_accepted": "Mediatypen accepteras inte.", + "message": "Meddelande", + "messages": "Meddelanden", + "message_separator_date": "{{val, datetime}}", + "message_time": "{{val, datetime}}", + "minimize_chat": "Minimera chat", + "name": "Namn", + "need_help": "Behöver du hjälp?", + "new_chat": "Ny chat", + "no": "Nej", + "no_available_agents_to_transfer": "Inga agenter tillgängliga för överföring.", + "ok": "OK", + "options": "Inställningar", + "please_tell_us_some_information_to_start_the_chat": "Vänligen ange information för att starta chat", + "please_wait_for_the_next_available_agent": "Vänligen vänta på nästa tillgängliga agent..", + "powered_by_rocket_chat": "Powered by Rocket.Chat", + "restore_chat": "Återställ chat", + "room_name_changed": "Rumsnamn ändrades", + "send": "Skicka", + "sound_is_off": "Ljud inaktiverat", + "sound_is_on": "Ljud aktiverat", + "start_chat": "Starta chat", + "thanks_for_talking_with_us": "Tack för att du kontaktar oss", + "the_chat_was_moved_back_to_queue": "Chatten flyttades tillbaka till kön", + "the_chat_was_transferred_to_another_agent": "Chatten flyttades till annan agent", + "the_controller_of_your_personal_data_is_company_na": "Den personuppgiftsansvarige för dina personuppgifter är [Företagsnamn], med säte på [Företagsadress]. För att starta chatten samtycker du till att dina personuppgifter behandlas och överförs i enlighet med den allmänna dataskyddsförordningen (GDPR).", + "transcript_success": "Transkription skickad", + "type_your_message_here": "Meddelande", + "unread_messages": "olästa meddelande", + "user_added_by": "Användare tillagd av", + "user_joined": "Användare ansluten", + "user_left": "Användare lämnade", + "user_removed_by": "Användare borttagen av", + "waiting_queue": "Kö...", + "we_are_not_online_right_now_please_leave_a_message": "Vi är inte online just nu. Lämna gärna ett medelande.", + "welcome": "Välkommen", + "would_you_like_a_copy_of_this_chat_emailed": "Vill du ha en kopia av chatten till din e-post?", + "write_your_message": "Skriv meddelande", + "yes": "Ja", + "you_browser_doesn_t_support_audio_element": "Din webbläsare stödjer inte ljudelement", + "you_browser_doesn_t_support_video_element": "Din webbläsare stödjer inte videoelement", + "your_spot_is_spot": "Din plats i kön är #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "Din plats i kön är #{{spot}} (Återstående kötid: {{estimatedWaitTime}})" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ta-IN.json b/packages/livechat/src/i18n/ta-IN.json index 0b76e70237bc8..494101e3a9d06 100644 --- a/packages/livechat/src/i18n/ta-IN.json +++ b/packages/livechat/src/i18n/ta-IN.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "ரத்து", - "conversation_finished": "உரையாடலை முடித்தேன்", - "department_switched": "திணைக்களம் மாறியது", - "no": "இல்லை", - "options": "விருப்பங்கள்", - "send": "அனுப்பு", - "user_joined": "பயனர் சேர்ந்தார்", - "user_left": "பயனர் இடது", - "we_are_not_online_right_now_please_leave_a_message": "இப்போது நாங்கள் ஆன்லைனில் இல்லை. தயவுசெய்து, ஒரு செய்தியை விடு.", - "yes": "ஆமாம்" - } + "translation": { + "cancel": "ரத்து", + "conversation_finished": "உரையாடலை முடித்தேன்", + "department_switched": "திணைக்களம் மாறியது", + "no": "இல்லை", + "options": "விருப்பங்கள்", + "send": "அனுப்பு", + "user_joined": "பயனர் சேர்ந்தார்", + "user_left": "பயனர் இடது", + "we_are_not_online_right_now_please_leave_a_message": "இப்போது நாங்கள் ஆன்லைனில் இல்லை. தயவுசெய்து, ஒரு செய்தியை விடு.", + "yes": "ஆமாம்" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/th-TH.json b/packages/livechat/src/i18n/th-TH.json index d7beceac1bc66..76860dbef9aba 100644 --- a/packages/livechat/src/i18n/th-TH.json +++ b/packages/livechat/src/i18n/th-TH.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "ยกเลิก", - "conversation_finished": "สนทนาเสร็จแล้ว", - "department_switched": "แผนกเปลี่ยนแล้ว", - "no": "ไม่", - "options": "ตัวเลือก", - "send": "ส่ง", - "user_joined": "ผู้ใช้เข้าร่วม", - "user_left": "เหลือผู้ใช้แล้ว", - "we_are_not_online_right_now_please_leave_a_message": "เรายังไม่ออนไลน์ในขณะนี้ กรุณาฝากข้อความไว้", - "yes": "ใช่" - } + "translation": { + "cancel": "ยกเลิก", + "conversation_finished": "สนทนาเสร็จแล้ว", + "department_switched": "แผนกเปลี่ยนแล้ว", + "no": "ไม่", + "options": "ตัวเลือก", + "send": "ส่ง", + "user_joined": "ผู้ใช้เข้าร่วม", + "user_left": "เหลือผู้ใช้แล้ว", + "we_are_not_online_right_now_please_leave_a_message": "เรายังไม่ออนไลน์ในขณะนี้ กรุณาฝากข้อความไว้", + "yes": "ใช่" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/tr.json b/packages/livechat/src/i18n/tr.json index ac40533a2fc14..c7e786e18e672 100644 --- a/packages/livechat/src/i18n/tr.json +++ b/packages/livechat/src/i18n/tr.json @@ -1,15 +1,15 @@ { - "translation": { - "are_you_sure_you_want_to_switch_the_department": "Departmanı değiştirmek istediğinden emin misin?", - "cancel": "Vazgeç", - "conversation_finished": "Konuşma bitti", - "department_switched": "Bölüm değiştirildi", - "no": "Hayır", - "options": "Seçenekler", - "send": "Gönder", - "user_joined": "Kullanıcı katıldı", - "user_left": "Kullanıcı ayrıldı", - "we_are_not_online_right_now_please_leave_a_message": "Şu anda çevrimiçi değiliz. Lütfen mesaj bırakın.", - "yes": "Evet" - } -} + "translation": { + "are_you_sure_you_want_to_switch_the_department": "Departmanı değiştirmek istediğinden emin misin?", + "cancel": "Vazgeç", + "conversation_finished": "Konuşma bitti", + "department_switched": "Bölüm değiştirildi", + "no": "Hayır", + "options": "Seçenekler", + "send": "Gönder", + "user_joined": "Kullanıcı katıldı", + "user_left": "Kullanıcı ayrıldı", + "we_are_not_online_right_now_please_leave_a_message": "Şu anda çevrimiçi değiliz. Lütfen mesaj bırakın.", + "yes": "Evet" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/ug.json b/packages/livechat/src/i18n/ug.json index 73fe02da920d2..839e7552ef6a1 100644 --- a/packages/livechat/src/i18n/ug.json +++ b/packages/livechat/src/i18n/ug.json @@ -1,8 +1,8 @@ { - "translation": { - "conversation_finished": "سۆھبەتلىشىش ئاخىرلاشتى", - "send": "يوللاش", - "user_joined": "ئەزا ئاللىبۇرۇن قېتىلدى", - "user_left": "ئەزا ئاللىبۇرۇن ئايرىلدى" - } -} + "translation": { + "conversation_finished": "سۆھبەتلىشىش ئاخىرلاشتى", + "send": "يوللاش", + "user_joined": "ئەزا ئاللىبۇرۇن قېتىلدى", + "user_left": "ئەزا ئاللىبۇرۇن ئايرىلدى" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/uk.json b/packages/livechat/src/i18n/uk.json index 03e268cdd2394..f78a67f57271a 100644 --- a/packages/livechat/src/i18n/uk.json +++ b/packages/livechat/src/i18n/uk.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "Скасувати", - "conversation_finished": "Розмову закінчено", - "department_switched": "Відділ змінено", - "no": "Ні", - "options": "Параметри", - "send": "Надіслати", - "user_joined": "Користувач приєднався", - "user_left": "Користувач вийшов", - "we_are_not_online_right_now_please_leave_a_message": "Ми зараз не в мережі. Будь ласка, залиште повідомлення.", - "yes": "Так" - } -} + "translation": { + "cancel": "Скасувати", + "conversation_finished": "Розмову закінчено", + "department_switched": "Відділ змінено", + "no": "Ні", + "options": "Параметри", + "send": "Надіслати", + "user_joined": "Користувач приєднався", + "user_left": "Користувач вийшов", + "we_are_not_online_right_now_please_leave_a_message": "Ми зараз не в мережі. Будь ласка, залиште повідомлення.", + "yes": "Так" + } +} \ No newline at end of file diff --git a/packages/livechat/src/i18n/vi-VN.json b/packages/livechat/src/i18n/vi-VN.json index e14935eaa866d..24d1b70da3f21 100644 --- a/packages/livechat/src/i18n/vi-VN.json +++ b/packages/livechat/src/i18n/vi-VN.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "hủy bỏ", - "conversation_finished": "Trò chuyện kết thúc", - "department_switched": "Sở chuyển", - "no": "Không", - "options": "Tùy chọn", - "send": "Gửi", - "user_joined": "Người dùng tham gia", - "user_left": "Người dùng còn lại", - "we_are_not_online_right_now_please_leave_a_message": "Chúng tôi không trực tuyến ngay bây giờ. Xin vui lòng, để lại tin nhắn.", - "yes": "Vâng" - } + "translation": { + "cancel": "hủy bỏ", + "conversation_finished": "Trò chuyện kết thúc", + "department_switched": "Sở chuyển", + "no": "Không", + "options": "Tùy chọn", + "send": "Gửi", + "user_joined": "Người dùng tham gia", + "user_left": "Người dùng còn lại", + "we_are_not_online_right_now_please_leave_a_message": "Chúng tôi không trực tuyến ngay bây giờ. Xin vui lòng, để lại tin nhắn.", + "yes": "Vâng" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/zh-HK.json b/packages/livechat/src/i18n/zh-HK.json index 25bc37b1d7866..1e632d6b1927b 100644 --- a/packages/livechat/src/i18n/zh-HK.json +++ b/packages/livechat/src/i18n/zh-HK.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "取消", - "conversation_finished": "對話已結束", - "department_switched": "部门切换", - "no": "否", - "options": "選項", - "send": "傳送", - "user_joined": "用户加入", - "user_left": "用户离开了", - "we_are_not_online_right_now_please_leave_a_message": "我们现在不在线。请留言。", - "yes": "对" - } + "translation": { + "cancel": "取消", + "conversation_finished": "對話已結束", + "department_switched": "部门切换", + "no": "否", + "options": "選項", + "send": "傳送", + "user_joined": "用户加入", + "user_left": "用户离开了", + "we_are_not_online_right_now_please_leave_a_message": "我们现在不在线。请留言。", + "yes": "对" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/zh-TW.json b/packages/livechat/src/i18n/zh-TW.json index 3d83df1253d41..368868a897e46 100644 --- a/packages/livechat/src/i18n/zh-TW.json +++ b/packages/livechat/src/i18n/zh-TW.json @@ -1,14 +1,14 @@ { - "translation": { - "cancel": "取消", - "conversation_finished": "對話已結束", - "department_switched": "部門已更換", - "no": "否", - "options": "選項", - "send": "傳送", - "user_joined": "使用者已加入", - "user_left": "使用者已離開", - "we_are_not_online_right_now_please_leave_a_message": "我們現在不在線。請留言。", - "yes": "是" - } + "translation": { + "cancel": "取消", + "conversation_finished": "對話已結束", + "department_switched": "部門已更換", + "no": "否", + "options": "選項", + "send": "傳送", + "user_joined": "使用者已加入", + "user_left": "使用者已離開", + "we_are_not_online_right_now_please_leave_a_message": "我們現在不在線。請留言。", + "yes": "是" + } } \ No newline at end of file diff --git a/packages/livechat/src/i18n/zh.json b/packages/livechat/src/i18n/zh.json index c7cec13048386..0ce60b9cfbbe9 100644 --- a/packages/livechat/src/i18n/zh.json +++ b/packages/livechat/src/i18n/zh.json @@ -1,78 +1,78 @@ { - "translation": { - "are_you_sure_you_want_to_finish_this_chat": "您确定要离开聊天吗?", - "are_you_sure_you_want_to_remove_all_of_your_person": "您确定要删除所有个人资料吗?", - "are_you_sure_you_want_to_switch_the_department": "你确定要切换部门吗?", - "cancel": "取消", - "change_department": "变更部门", - "change_department_1": "变更部门", - "chat_finished": "聊天结束", - "choose_a_department": "选择部门...", - "choose_a_department_1": "选择部门", - "choose_an_option": "请选择...", - "conversation_finished": "会话已结束", - "count_new_messages_since_since_one": "有一个来自 {{val, datetime}} 的新信息 ", - "count_new_messages_since_since_other": "{{count}} 个来自 {{val, datetime}} 的新信息", - "department_switched": "部门切换", - "departments": "部门", - "disable_notifications": "关闭通知", - "dismiss_this_alert": "取消此提醒", - "drop_here_to_upload_a_file": "拽文件到这里上传", - "email": "电子邮件", - "enable_notifications": "开启通知", - "error_closing_chat": "关闭聊天窗口错误.", - "error_removing_user_data": "移除用户资料错误.", - "error_starting_a_new_conversation_reason": "开始新对话时错误: {{reason}}", - "expand_chat": "展开聊天窗口", - "field_required": "此字段必填", - "file_exceeds_allowed_size_of_size": "文件大小超过允许的限制 {{size}}.", - "fileupload_error": "文件上传错误", - "finish_this_chat": "结束聊天", - "forget_remove_my_data": "移除我的资料", - "go_to_menu_options_forget_remove_my_personal_data": "前往 <1>选项 → 移除我的资料 请求立即删除您的数据.", - "hiddenelementscount_more": "+ {{hiddenElementsCount}} 更多", - "i_agree": "我同意", - "i_need_help_with": "我需要帮助...", - "if_you_have_any_other_questions_just_press_the_but": "如有其他疑问,请按下面的按钮开始新的聊天.", - "insert_your_field_here": "请在此输入 {{field}} ...", - "invalid_email": "无效的电子邮件", - "invalid_value": "无效的内容", - "leave_a_message": "留言", - "livechat_connected": "聊天已连线", - "livechat_is_not_connected": "聊天未连线", - "media_types_not_accepted": "不允许的挡案类型", - "message": "信息", - "minimize_chat": "最小化聊天窗口", - "name": "名字", - "need_help": "需要帮忙吗?", - "new_chat": "开启新聊天", - "no": "否", - "no_available_agents_to_transfer": "目前没有其他客服在线上,请稍等", - "ok": "好", - "options": "选项", - "please_tell_us_some_information_to_start_the_chat": "请输入信息来开启聊天", - "please_wait_for_the_next_available_agent": "请稍等其他客服..", - "restore_chat": "恢复聊天", - "room_name_changed": "聊天房间名称改变", - "send": "发送", - "sound_is_off": "声音关闭", - "sound_is_on": "声音开启", - "start_chat": "开始聊天", - "thanks_for_talking_with_us": "谢谢与我们联系", - "the_controller_of_your_personal_data_is_company_na": "您的个人数据的由 [Company Name] 使用, 注册办公室位于 [Company Address]. 要开始聊天,您同意应按照通用数据保护条例(GDPR)处理和传输您的个人数据.", - "type_your_message_here": "请在此输入您的信息", - "unread_messages": "未读信息", - "user_joined": "用户已加入", - "user_left": "用户已离开", - "user_removed_by": "用户已被移除", - "waiting_queue": "等待中", - "we_are_not_online_right_now_please_leave_a_message": "我们现在不在线。请留言。", - "welcome": "欢迎", - "write_your_message": "请输入您的信息...", - "yes": "是", - "you_browser_doesn_t_support_audio_element": "您的浏览器不支援音频", - "you_browser_doesn_t_support_video_element": "您的浏览器不支援视频", - "your_spot_is_spot": "您的等待位置是 #{{spot}}", - "your_spot_is_spot_estimated_wait_time_estimatedwai": "您的等待位置是 #{{spot}} (预估等待时间: {{estimatedWaitTime}})" - } -} + "translation": { + "are_you_sure_you_want_to_finish_this_chat": "您确定要离开聊天吗?", + "are_you_sure_you_want_to_remove_all_of_your_person": "您确定要删除所有个人资料吗?", + "are_you_sure_you_want_to_switch_the_department": "你确定要切换部门吗?", + "cancel": "取消", + "change_department": "变更部门", + "change_department_1": "变更部门", + "chat_finished": "聊天结束", + "choose_a_department": "选择部门...", + "choose_a_department_1": "选择部门", + "choose_an_option": "请选择...", + "conversation_finished": "会话已结束", + "count_new_messages_since_since_one": "有一个来自 {{val, datetime}} 的新信息 ", + "count_new_messages_since_since_other": "{{count}} 个来自 {{val, datetime}} 的新信息", + "department_switched": "部门切换", + "departments": "部门", + "disable_notifications": "关闭通知", + "dismiss_this_alert": "取消此提醒", + "drop_here_to_upload_a_file": "拽文件到这里上传", + "email": "电子邮件", + "enable_notifications": "开启通知", + "error_closing_chat": "关闭聊天窗口错误.", + "error_removing_user_data": "移除用户资料错误.", + "error_starting_a_new_conversation_reason": "开始新对话时错误: {{reason}}", + "expand_chat": "展开聊天窗口", + "field_required": "此字段必填", + "file_exceeds_allowed_size_of_size": "文件大小超过允许的限制 {{size}}.", + "fileupload_error": "文件上传错误", + "finish_this_chat": "结束聊天", + "forget_remove_my_data": "移除我的资料", + "go_to_menu_options_forget_remove_my_personal_data": "前往 <1>选项 → 移除我的资料 请求立即删除您的数据.", + "hiddenelementscount_more": "+ {{hiddenElementsCount}} 更多", + "i_agree": "我同意", + "i_need_help_with": "我需要帮助...", + "if_you_have_any_other_questions_just_press_the_but": "如有其他疑问,请按下面的按钮开始新的聊天.", + "insert_your_field_here": "请在此输入 {{field}} ...", + "invalid_email": "无效的电子邮件", + "invalid_value": "无效的内容", + "leave_a_message": "留言", + "livechat_connected": "聊天已连线", + "livechat_is_not_connected": "聊天未连线", + "media_types_not_accepted": "不允许的挡案类型", + "message": "信息", + "minimize_chat": "最小化聊天窗口", + "name": "名字", + "need_help": "需要帮忙吗?", + "new_chat": "开启新聊天", + "no": "否", + "no_available_agents_to_transfer": "目前没有其他客服在线上,请稍等", + "ok": "好", + "options": "选项", + "please_tell_us_some_information_to_start_the_chat": "请输入信息来开启聊天", + "please_wait_for_the_next_available_agent": "请稍等其他客服..", + "restore_chat": "恢复聊天", + "room_name_changed": "聊天房间名称改变", + "send": "发送", + "sound_is_off": "声音关闭", + "sound_is_on": "声音开启", + "start_chat": "开始聊天", + "thanks_for_talking_with_us": "谢谢与我们联系", + "the_controller_of_your_personal_data_is_company_na": "您的个人数据的由 [Company Name] 使用, 注册办公室位于 [Company Address]. 要开始聊天,您同意应按照通用数据保护条例(GDPR)处理和传输您的个人数据.", + "type_your_message_here": "请在此输入您的信息", + "unread_messages": "未读信息", + "user_joined": "用户已加入", + "user_left": "用户已离开", + "user_removed_by": "用户已被移除", + "waiting_queue": "等待中", + "we_are_not_online_right_now_please_leave_a_message": "我们现在不在线。请留言。", + "welcome": "欢迎", + "write_your_message": "请输入您的信息...", + "yes": "是", + "you_browser_doesn_t_support_audio_element": "您的浏览器不支援音频", + "you_browser_doesn_t_support_video_element": "您的浏览器不支援视频", + "your_spot_is_spot": "您的等待位置是 #{{spot}}", + "your_spot_is_spot_estimated_wait_time_estimatedwai": "您的等待位置是 #{{spot}} (预估等待时间: {{estimatedWaitTime}})" + } +} \ No newline at end of file From d92c0c7fab70536e8d2af12cd0719e24db46478f Mon Sep 17 00:00:00 2001 From: Martin Schoeler Date: Thu, 29 Feb 2024 10:13:13 -0300 Subject: [PATCH 05/23] chore: Refactor & Improve Livechat Widget API (#30924) --- .changeset/orange-dragons-fly.md | 6 + packages/livechat/.storybook/helpers.tsx | 5 +- packages/livechat/src/components/App/App.tsx | 128 +---- .../src/components/Screen/ScreenProvider.tsx | 142 +++++ .../livechat/src/components/Screen/index.js | 143 +++-- packages/livechat/src/definitions/agents.d.ts | 2 + packages/livechat/src/definitions/global.d.ts | 42 ++ packages/livechat/src/definitions/guest.d.ts | 6 + .../livechat/src/helpers/canRenderMessage.ts | 5 +- packages/livechat/src/helpers/formatAgent.ts | 32 ++ packages/livechat/src/helpers/isDefined.ts | 3 + .../livechat/src/lib/{hooks.js => hooks.ts} | 130 +++-- packages/livechat/src/lib/parentCall.ts | 6 +- packages/livechat/src/lib/room.js | 10 +- packages/livechat/src/lib/triggers.js | 2 +- .../livechat/src/routes/Chat/connector.tsx | 89 +-- .../livechat/src/routes/Chat/container.js | 119 +--- packages/livechat/src/routes/Chat/stories.tsx | 3 +- .../src/routes/ChatFinished/component.js | 38 -- .../src/routes/ChatFinished/component.tsx | 42 ++ .../src/routes/ChatFinished/container.js | 38 -- .../src/routes/ChatFinished/container.tsx | 24 + .../src/routes/ChatFinished/stories.tsx | 3 +- .../{component.js => component.tsx} | 26 +- .../src/routes/GDPRAgreement/container.js | 41 -- .../src/routes/GDPRAgreement/container.tsx | 21 + .../src/routes/GDPRAgreement/stories.tsx | 3 +- .../src/routes/LeaveMessage/index.tsx | 17 +- .../livechat/src/routes/Register/index.tsx | 29 +- .../livechat/src/routes/Register/stories.tsx | 5 +- .../src/routes/SwitchDepartment/index.tsx | 14 +- .../src/routes/SwitchDepartment/stories.tsx | 3 +- .../{component.js => component.tsx} | 32 +- .../src/routes/TriggerMessage/container.js | 67 --- .../src/routes/TriggerMessage/container.tsx | 39 ++ .../src/routes/TriggerMessage/index.ts | 2 +- .../src/routes/TriggerMessage/stories.tsx | 3 +- .../src/routes/TriggerMessage/styles.scss | 2 +- packages/livechat/src/store/index.tsx | 73 ++- .../livechat/src/{widget.js => widget.ts} | 526 +++++++++++------- packages/livechat/webpack.config.ts | 2 +- 41 files changed, 1016 insertions(+), 907 deletions(-) create mode 100644 .changeset/orange-dragons-fly.md create mode 100644 packages/livechat/src/components/Screen/ScreenProvider.tsx create mode 100644 packages/livechat/src/definitions/guest.d.ts create mode 100644 packages/livechat/src/helpers/formatAgent.ts create mode 100644 packages/livechat/src/helpers/isDefined.ts rename packages/livechat/src/lib/{hooks.js => hooks.ts} (56%) delete mode 100644 packages/livechat/src/routes/ChatFinished/component.js create mode 100644 packages/livechat/src/routes/ChatFinished/component.tsx delete mode 100644 packages/livechat/src/routes/ChatFinished/container.js create mode 100644 packages/livechat/src/routes/ChatFinished/container.tsx rename packages/livechat/src/routes/GDPRAgreement/{component.js => component.tsx} (80%) delete mode 100644 packages/livechat/src/routes/GDPRAgreement/container.js create mode 100644 packages/livechat/src/routes/GDPRAgreement/container.tsx rename packages/livechat/src/routes/TriggerMessage/{component.js => component.tsx} (55%) delete mode 100644 packages/livechat/src/routes/TriggerMessage/container.js create mode 100644 packages/livechat/src/routes/TriggerMessage/container.tsx rename packages/livechat/src/{widget.js => widget.ts} (53%) diff --git a/.changeset/orange-dragons-fly.md b/.changeset/orange-dragons-fly.md new file mode 100644 index 0000000000000..a1ca0faa90b69 --- /dev/null +++ b/.changeset/orange-dragons-fly.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/livechat": minor +--- + +chore: Refactor & Improve Livechat Widget API +Refactors and adds better error handling to the widget's API calls diff --git a/packages/livechat/.storybook/helpers.tsx b/packages/livechat/.storybook/helpers.tsx index 12c896dccf55c..82d6c5bf74fa5 100644 --- a/packages/livechat/.storybook/helpers.tsx +++ b/packages/livechat/.storybook/helpers.tsx @@ -3,12 +3,15 @@ import { type DecoratorFunction } from '@storybook/csf'; import type { Args, PreactFramework } from '@storybook/preact'; import { loremIpsum as originalLoremIpsum } from 'lorem-ipsum'; +import { ScreenContext } from '../src/components/Screen/ScreenProvider'; import gazzoAvatar from './assets/gazzo.jpg'; import martinAvatar from './assets/martin.jpg'; import tassoAvatar from './assets/tasso.jpg'; export const screenDecorator: DecoratorFunction = (storyFn) => ( -
{storyFn()}
+
+ {storyFn()} +
); export const screenProps = () => ({ diff --git a/packages/livechat/src/components/App/App.tsx b/packages/livechat/src/components/App/App.tsx index cfaa52b94999d..685b781cb3e38 100644 --- a/packages/livechat/src/components/App/App.tsx +++ b/packages/livechat/src/components/App/App.tsx @@ -2,12 +2,10 @@ import type { ILivechatTrigger } from '@rocket.chat/core-typings'; import i18next from 'i18next'; import { Component } from 'preact'; import Router, { route } from 'preact-router'; -import { parse } from 'query-string'; import { withTranslation } from 'react-i18next'; import type { Department } from '../../definitions/departments'; import { setInitCookies } from '../../helpers/cookies'; -import { isActiveSession } from '../../helpers/isActiveSession'; import { isRTL } from '../../helpers/isRTL'; import { visibility } from '../../helpers/visibility'; import history from '../../history'; @@ -25,7 +23,7 @@ import Register from '../../routes/Register'; import SwitchDepartment from '../../routes/SwitchDepartment'; import TriggerMessage from '../../routes/TriggerMessage'; import type { Dispatch } from '../../store'; -import store from '../../store'; +import { ScreenProvider } from '../Screen/ScreenProvider'; type AppProps = { config: { @@ -75,26 +73,6 @@ type AppState = { poppedOut: boolean; }; -export type ScreenPropsType = { - notificationsEnabled: boolean; - minimized: boolean; - expanded: boolean; - windowed: boolean; - sound: unknown; - alerts: unknown; - modal: unknown; - nameDefault: string; - emailDefault: string; - departmentDefault: string; - onEnableNotifications: () => unknown; - onDisableNotifications: () => unknown; - onMinimize: () => unknown; - onRestore: () => unknown; - onOpenWindow: () => unknown; - onDismissAlert: () => unknown; - dismissNotification: () => void; -}; - export class App extends Component { state = { initialized: false, @@ -150,49 +128,6 @@ export class App extends Component { Triggers.processTriggers(); } - protected handleEnableNotifications = () => { - const { dispatch, sound = {} } = this.props; - dispatch({ sound: { ...sound, enabled: true } }); - }; - - protected handleDisableNotifications = () => { - const { dispatch, sound = {} } = this.props; - dispatch({ sound: { ...sound, enabled: false } }); - }; - - protected handleMinimize = () => { - parentCall('minimizeWindow'); - const { dispatch } = this.props; - dispatch({ minimized: true }); - }; - - protected handleRestore = () => { - parentCall('restoreWindow'); - const { dispatch, undocked } = this.props; - const dispatchRestore = () => dispatch({ minimized: false, undocked: false }); - const dispatchEvent = () => { - dispatchRestore(); - store.off('storageSynced', dispatchEvent); - }; - if (undocked) { - store.on('storageSynced', dispatchEvent); - } else { - dispatchRestore(); - } - Triggers.callbacks?.emit('chat-opened-by-visitor'); - }; - - protected handleOpenWindow = () => { - parentCall('openPopout'); - const { dispatch } = this.props; - dispatch({ undocked: true, minimized: false }); - }; - - protected handleDismissAlert = (id: string) => { - const { dispatch, alerts = [] } = this.props; - dispatch({ alerts: alerts.filter((alert) => alert.id !== id) }); - }; - protected handleVisibilityChange = async () => { const { dispatch } = this.props; dispatch({ visible: !visibility.hidden }); @@ -202,19 +137,20 @@ export class App extends Component { this.forceUpdate(); }; - protected dismissNotification = () => !isActiveSession(); - protected initWidget() { const { minimized, iframe: { visible }, dispatch, } = this.props; + parentCall(minimized ? 'minimizeWindow' : 'restoreWindow'); parentCall(visible ? 'showWidget' : 'hideWidget'); visibility.addListener(this.handleVisibilityChange); + this.handleVisibilityChange(); + window.addEventListener('beforeunload', () => { visibility.removeListener(this.handleVisibilityChange); dispatch({ minimized: true, undocked: false }); @@ -223,16 +159,6 @@ export class App extends Component { i18next.on('languageChanged', this.handleLanguageChange); } - protected checkPoppedOutWindow() { - // Checking if the window is poppedOut and setting parent minimized if yes for the restore purpose - const { dispatch } = this.props; - const poppedOut = parse(window.location.search).mode === 'popout'; - this.setState({ poppedOut }); - if (poppedOut) { - dispatch({ minimized: false }); - } - } - protected async initialize() { // TODO: split these behaviors into composable components await Connection.init(); @@ -241,7 +167,6 @@ export class App extends Component { Hooks.init(); this.handleTriggers(); this.initWidget(); - this.checkPoppedOutWindow(); this.setState({ initialized: true }); parentCall('ready'); } @@ -268,44 +193,23 @@ export class App extends Component { } } - render = ({ sound, undocked, minimized, expanded, alerts, modal, iframe }: AppProps, { initialized, poppedOut }: AppState) => { + render = (_: AppProps, { initialized }: AppState) => { if (!initialized) { return null; } - const { department, name, email } = iframe.guest || {}; - - const screenProps = { - notificationsEnabled: sound?.enabled, - minimized: !poppedOut && (minimized || undocked), - expanded: !minimized && expanded, - windowed: !minimized && poppedOut, - sound, - alerts, - modal, - nameDefault: name, - emailDefault: email, - departmentDefault: department, - onEnableNotifications: this.handleEnableNotifications, - onDisableNotifications: this.handleDisableNotifications, - onMinimize: this.handleMinimize, - onRestore: this.handleRestore, - onOpenWindow: this.handleOpenWindow, - onDismissAlert: this.handleDismissAlert, - dismissNotification: this.dismissNotification, - }; - return ( - - - - - {/* TODO: Find a better way to avoid prop drilling with that amout of props (perhaps create a screen context/provider) */} - - - - - + + + + + + + + + + + ); }; } diff --git a/packages/livechat/src/components/Screen/ScreenProvider.tsx b/packages/livechat/src/components/Screen/ScreenProvider.tsx new file mode 100644 index 0000000000000..8243879f2549d --- /dev/null +++ b/packages/livechat/src/components/Screen/ScreenProvider.tsx @@ -0,0 +1,142 @@ +import type { FunctionalComponent } from 'preact'; +import { createContext } from 'preact'; +import { useCallback, useContext, useEffect, useState } from 'preact/hooks'; +import { parse } from 'query-string'; + +import { isActiveSession } from '../../helpers/isActiveSession'; +import { parentCall } from '../../lib/parentCall'; +import Triggers from '../../lib/triggers'; +import store, { StoreContext } from '../../store'; + +export type ScreenContextValue = { + notificationsEnabled: boolean; + minimized: boolean; + expanded: boolean; + windowed: boolean; + sound: unknown; + alerts: unknown; + modal: unknown; + nameDefault: string; + emailDefault: string; + departmentDefault: string; + onEnableNotifications: () => unknown; + onDisableNotifications: () => unknown; + onMinimize: () => unknown; + onRestore: () => unknown; + onOpenWindow: () => unknown; + onDismissAlert: () => unknown; + dismissNotification: () => void; + theme?: { + color: string; + fontColor: string; + iconColor: string; + }; +}; + +export const ScreenContext = createContext({ + theme: { + color: '', + fontColor: '', + iconColor: '', + }, + notificationsEnabled: true, + minimized: true, + windowed: false, + onEnableNotifications: () => undefined, + onDisableNotifications: () => undefined, + onMinimize: () => undefined, + onRestore: () => undefined, + onOpenWindow: () => undefined, +} as ScreenContextValue); + +export const ScreenProvider: FunctionalComponent = ({ children }) => { + const { dispatch, config, sound, minimized = true, undocked, expanded = false, alerts, modal, iframe } = useContext(StoreContext); + const { department, name, email } = iframe.guest || {}; + const { color } = config.theme || {}; + const { color: customColor, fontColor: customFontColor, iconColor: customIconColor } = iframe.theme || {}; + + const [poppedOut, setPopedOut] = useState(false); + + const handleEnableNotifications = () => { + dispatch({ sound: { ...sound, enabled: true } }); + }; + + const handleDisableNotifications = () => { + dispatch({ sound: { ...sound, enabled: false } }); + }; + + const handleMinimize = () => { + parentCall('minimizeWindow'); + dispatch({ minimized: true }); + }; + + const handleRestore = () => { + parentCall('restoreWindow'); + const dispatchRestore = () => dispatch({ minimized: false, undocked: false }); + + const dispatchEvent = () => { + dispatchRestore(); + store.off('storageSynced', dispatchEvent); + }; + + if (undocked) { + store.on('storageSynced', dispatchEvent); + } else { + dispatchRestore(); + } + + Triggers.callbacks?.emit('chat-opened-by-visitor'); + }; + + const handleOpenWindow = () => { + parentCall('openPopout'); + dispatch({ undocked: true, minimized: false }); + }; + + const handleDismissAlert = (id: string) => { + dispatch({ alerts: alerts.filter((alert) => alert.id !== id) }); + }; + + const dismissNotification = () => !isActiveSession(); + + const checkPoppedOutWindow = useCallback(() => { + // Checking if the window is poppedOut and setting parent minimized if yes for the restore purpose + const poppedOut = parse(window.location.search).mode === 'popout'; + setPopedOut(poppedOut); + + if (poppedOut) { + dispatch({ minimized: false }); + } + }, [dispatch]); + + useEffect(() => { + checkPoppedOutWindow(); + }, [checkPoppedOutWindow]); + + const screenProps = { + theme: { + color: customColor || color, + fontColor: customFontColor, + iconColor: customIconColor, + }, + notificationsEnabled: sound?.enabled, + minimized: !poppedOut && (minimized || undocked), + expanded: !minimized && expanded, + windowed: !minimized && poppedOut, + sound, + alerts, + modal, + nameDefault: name, + emailDefault: email, + departmentDefault: department, + onEnableNotifications: handleEnableNotifications, + onDisableNotifications: handleDisableNotifications, + onMinimize: handleMinimize, + onRestore: handleRestore, + onOpenWindow: handleOpenWindow, + onDismissAlert: handleDismissAlert, + dismissNotification, + }; + + return {children}; +}; diff --git a/packages/livechat/src/components/Screen/index.js b/packages/livechat/src/components/Screen/index.js index e4f4aff1ea4c1..aaf5c826f0119 100644 --- a/packages/livechat/src/components/Screen/index.js +++ b/packages/livechat/src/components/Screen/index.js @@ -1,4 +1,4 @@ -import { useEffect } from 'preact/hooks'; +import { useContext, useEffect } from 'preact/hooks'; import { createClassName } from '../../helpers/createClassName'; import ChatIcon from '../../icons/chat.svg'; @@ -8,6 +8,7 @@ import { Footer, FooterContent, PoweredBy } from '../Footer'; import { PopoverContainer } from '../Popover'; import { Sound } from '../Sound'; import ScreenHeader from './Header'; +import { ScreenContext } from './ScreenProvider'; import styles from './styles.scss'; export const ScreenContent = ({ children, nopadding, triggered = false, full = false }) => ( @@ -74,81 +75,77 @@ const CssVar = ({ theme }) => { }; /** @type {{ (props: any) => JSX.Element; Content: (props: any) => JSX.Element; Footer: (props: any) => JSX.Element }} */ -export const Screen = ({ - theme = {}, - agent, - title, - notificationsEnabled, - minimized = false, - expanded = false, - windowed = false, - children, - className, - alerts, - modal, - unread, - sound, - onDismissAlert, - onEnableNotifications, - onDisableNotifications, - onMinimize, - onRestore, - onOpenWindow, - onSoundStop, - queueInfo, - dismissNotification, - triggered = false, -}) => ( -
- - {triggered && ( - - )} -
- - {!triggered && ( - - )} +export const Screen = ({ title, agent, children, className, unread, triggered = false, queueInfo, onSoundStop }) => { + const { + theme = {}, + notificationsEnabled, + minimized = false, + expanded = false, + windowed = false, + alerts, + modal, + sound, + onDismissAlert, + onEnableNotifications, + onDisableNotifications, + onMinimize, + onRestore, + onOpenWindow, + dismissNotification, + } = useContext(ScreenContext); - {modal} - {children} - -
+ return ( +
+ + {triggered && ( + + )} +
+ + {!triggered && ( + + )} - + {modal} + {children} + +
- {sound && } -
-); + + + {sound && } +
+ ); +}; Screen.Content = ScreenContent; Screen.Footer = ScreenFooter; diff --git a/packages/livechat/src/definitions/agents.d.ts b/packages/livechat/src/definitions/agents.d.ts index da1b812425742..fc8316bfa7704 100644 --- a/packages/livechat/src/definitions/agents.d.ts +++ b/packages/livechat/src/definitions/agents.d.ts @@ -1,5 +1,7 @@ // TODO: Fully type agents in livechat export type Agent = { + _id: string; + username: string; name?: string; status?: string; email?: string; diff --git a/packages/livechat/src/definitions/global.d.ts b/packages/livechat/src/definitions/global.d.ts index d765a7018adbd..f1663de172810 100644 --- a/packages/livechat/src/definitions/global.d.ts +++ b/packages/livechat/src/definitions/global.d.ts @@ -7,6 +7,48 @@ declare global { SERVER_URL: string; handleIframeClose?: () => void; expandCall?: () => void; + RocketChat: { + // TODO: Discover what the hell does "_" do + _: any; + url?: string; + // TODO: Type this + livechat: { + pageVisited; + setCustomField; + initialize; + setTheme; + setDepartment; + clearDepartment; + setGuestToken; + setGuestName; + setGuestEmail; + setAgent; + registerGuest; + setLanguage; + showWidget; + hideWidget; + maximizeWidget; + minimizeWidget; + setBusinessUnit; + clearBusinessUnit; + setParentUrl; + + // callbacks + onChatMaximized; + onChatMinimized; + onChatStarted; + onChatEnded; + onPrechatFormSubmit; + onOfflineFormSubmit; + onWidgetShown; + onWidgetHidden; + onAssignAgent; + onAgentStatusChange; + onQueuePositionChange; + onServiceOffline; + }; + }; + initRocket?: string[]; } interface Document { diff --git a/packages/livechat/src/definitions/guest.d.ts b/packages/livechat/src/definitions/guest.d.ts new file mode 100644 index 0000000000000..afccca145e742 --- /dev/null +++ b/packages/livechat/src/definitions/guest.d.ts @@ -0,0 +1,6 @@ +export type Guest = { + token: string; + name?: string; + email?: string; + [key: string]: unknown; +}; diff --git a/packages/livechat/src/helpers/canRenderMessage.ts b/packages/livechat/src/helpers/canRenderMessage.ts index ea09408936943..75ab8604caf94 100644 --- a/packages/livechat/src/helpers/canRenderMessage.ts +++ b/packages/livechat/src/helpers/canRenderMessage.ts @@ -26,5 +26,6 @@ const msgTypesNotRendered = [ export const canRenderMessage = ({ t }: { t: string }) => !msgTypesNotRendered.includes(t); -export const canRenderTriggerMessage = (user: { token: string }) => (message: { trigger?: boolean; triggerAfterRegistration?: boolean }) => - !message.trigger || (!user && !message.triggerAfterRegistration) || (user && message.triggerAfterRegistration); +export const canRenderTriggerMessage = + (user: { token: string } | undefined) => (message: { trigger?: boolean; triggerAfterRegistration?: boolean }) => + !message.trigger || (!user && !message.triggerAfterRegistration) || (user && message.triggerAfterRegistration); diff --git a/packages/livechat/src/helpers/formatAgent.ts b/packages/livechat/src/helpers/formatAgent.ts new file mode 100644 index 0000000000000..249733b12c647 --- /dev/null +++ b/packages/livechat/src/helpers/formatAgent.ts @@ -0,0 +1,32 @@ +import { getAvatarUrl } from './baseUrl'; + +type AgentType = { + _id: string; + name: string; + status: string; + emails: [{ address: string }]; + username: string; + phone: [{ phoneNumber: string }]; + customFields: { phone: string }; +}; + +export const formatAgent = (agent: AgentType) => { + if (!agent) { + return; + } + + return { + _id: agent._id, + name: agent.name, + status: agent.status, + email: agent.emails?.[0]?.address, + username: agent.username, + phone: agent.phone?.[0]?.phoneNumber || agent.customFields?.phone, + avatar: agent.username + ? { + description: agent.username, + src: getAvatarUrl(agent.username), + } + : undefined, + }; +}; diff --git a/packages/livechat/src/helpers/isDefined.ts b/packages/livechat/src/helpers/isDefined.ts new file mode 100644 index 0000000000000..d4884b460e097 --- /dev/null +++ b/packages/livechat/src/helpers/isDefined.ts @@ -0,0 +1,3 @@ +export function isDefined(val: T | undefined | null): val is T { + return val !== undefined && val !== null; +} diff --git a/packages/livechat/src/lib/hooks.js b/packages/livechat/src/lib/hooks.ts similarity index 56% rename from packages/livechat/src/lib/hooks.js rename to packages/livechat/src/lib/hooks.ts index 311cf0b2a00bc..163e319733c6c 100644 --- a/packages/livechat/src/lib/hooks.js +++ b/packages/livechat/src/lib/hooks.ts @@ -1,7 +1,9 @@ import i18next from 'i18next'; import { Livechat } from '../api'; -import { store } from '../store'; +import type { StoreState } from '../store'; +import { initialState, store } from '../store'; +import type { LivechatMessageEventData } from '../widget'; import CustomFields from './customFields'; import { loadConfig, updateBusinessUnit } from './main'; import { parentCall } from './parentCall'; @@ -9,24 +11,34 @@ import { createToken } from './random'; import { loadMessages } from './room'; import Triggers from './triggers'; -const createOrUpdateGuest = async (guest) => { +const createOrUpdateGuest = async (guest: StoreState['guest']) => { + if (!guest) { + return; + } const { token } = guest; token && (await store.setState({ token })); const { visitor: user } = await Livechat.grantVisitor({ visitor: { ...guest } }); - store.setState({ user }); + + if (!user) { + return; + } + store.setState({ user } as Omit); await loadConfig(); }; -const updateIframeGuestData = (data) => { +const updateIframeGuestData = (data: Partial) => { const { iframe, iframe: { guest }, - user: _id, + user, token, } = store.state; - store.setState({ iframe: { ...iframe, guest: { ...guest, ...data } } }); - if (!_id) { + const iframeGuest = { ...guest, ...data } as StoreState['guest']; + + store.setState({ iframe: { ...iframe, guest: iframeGuest } }); + + if (!user) { return; } @@ -34,8 +46,10 @@ const updateIframeGuestData = (data) => { createOrUpdateGuest(guestData); }; +export type HooksWidgetAPI = typeof api; + const api = { - pageVisited(info) { + pageVisited: (info: { change: string; title: string; location: { href: string } }) => { if (info.change === 'url') { Triggers.processRequest(info); } @@ -52,31 +66,27 @@ const api = { Livechat.sendVisitorNavigation({ token, rid, pageInfo: { change, title, location: { href } } }); }, - setCustomField(key, value, overwrite = true) { + setCustomField: (key: string, value = '', overwrite = true) => { CustomFields.setCustomField(key, value, overwrite); }, - setTheme({ color, fontColor, iconColor, title, offlineTitle } = {}) { + setTheme: (theme: StoreState['iframe']['theme']) => { const { iframe, - iframe: { theme }, + iframe: { theme: currentTheme }, } = store.state; store.setState({ iframe: { ...iframe, theme: { + ...currentTheme, ...theme, - color, - fontColor, - iconColor, - title, - offlineTitle, }, }, }); }, - async setDepartment(value) { + setDepartment: async (value: string) => { const { user, config: { departments = [] }, @@ -90,7 +100,7 @@ const api = { updateIframeGuestData({ department }); if (defaultAgent && defaultAgent.department !== department) { - store.setState({ defaultAgent: null }); + store.setState({ defaultAgent: undefined }); } if (department !== existingDepartment) { @@ -99,8 +109,8 @@ const api = { } }, - async setBusinessUnit(newBusinessUnit) { - if (!newBusinessUnit || !newBusinessUnit.trim().length) { + setBusinessUnit: async (newBusinessUnit: string) => { + if (!newBusinessUnit?.trim().length) { throw new Error('Error! Invalid business ids'); } @@ -109,16 +119,27 @@ const api = { return existingBusinessUnit !== newBusinessUnit && updateBusinessUnit(newBusinessUnit); }, - async clearBusinessUnit() { + clearBusinessUnit: async () => { const { businessUnit } = store.state; return businessUnit && updateBusinessUnit(); }, - clearDepartment() { + clearDepartment: () => { updateIframeGuestData({ department: '' }); }, - setAgent({ _id, username, ...props } = {}) { + clearWidgetData: async () => { + const { minimized, visible, undocked, expanded, businessUnit, ...initial } = initialState(); + await store.setState(initial); + }, + + setAgent: (agent: StoreState['defaultAgent']) => { + if (!agent) { + return; + } + + const { _id, username, ...props } = agent; + if (!_id || !username) { return console.warn('The fields _id and username are mandatory.'); } @@ -133,11 +154,11 @@ const api = { }); }, - setExpanded(expanded) { + setExpanded: (expanded: StoreState['expanded']) => { store.setState({ expanded }); }, - async setGuestToken(token) { + setGuestToken: async (token: string) => { const { token: localToken } = store.state; if (token === localToken) { return; @@ -145,16 +166,16 @@ const api = { await createOrUpdateGuest({ token }); }, - setGuestName(name) { + setGuestName: (name: string) => { updateIframeGuestData({ name }); }, - setGuestEmail(email) { + setGuestEmail: (email: string) => { updateIframeGuestData({ email }); }, - async registerGuest(data) { - if (!data || typeof data !== 'object') { + registerGuest: async (data: StoreState['guest']) => { + if (typeof data !== 'object') { return; } @@ -171,59 +192,72 @@ const api = { await createOrUpdateGuest(data); }, - async setLanguage(language) { + setLanguage: async (language: StoreState['iframe']['language']) => { const { iframe } = store.state; await store.setState({ iframe: { ...iframe, language } }); i18next.changeLanguage(language); }, - showWidget() { + showWidget: () => { const { iframe } = store.state; store.setState({ iframe: { ...iframe, visible: true } }); parentCall('showWidget'); }, - hideWidget() { + hideWidget: () => { const { iframe } = store.state; store.setState({ iframe: { ...iframe, visible: false } }); parentCall('hideWidget'); }, - minimizeWidget() { + minimizeWidget: () => { store.setState({ minimized: true }); parentCall('closeWidget'); }, - maximizeWidget() { + maximizeWidget: () => { store.setState({ minimized: false }); parentCall('openWidget'); }, - setParentUrl(parentUrl) { + + setParentUrl: (parentUrl: StoreState['parentUrl']) => { store.setState({ parentUrl }); }, }; -const onNewMessage = (event) => { +function onNewMessageHandler(event: MessageEvent>) { if (event.source === event.target) { return; } - if (typeof event.data === 'object' && event.data.src !== undefined && event.data.src === 'rocketchat') { - if (api[event.data.fn] !== undefined && typeof api[event.data.fn] === 'function') { - const args = [].concat(event.data.args || []); - api[event.data.fn].apply(null, args); - } + if (!event.data || typeof event.data !== 'object') { + return; } -}; + + if (!event.data.src || event.data.src !== 'rocketchat') { + return; + } + + const { fn, args } = event.data; + + if (!api.hasOwnProperty(fn)) { + return; + } + + // There is an existing issue with overload resolution with type union arguments please see https://github.com/microsoft/TypeScript/issues/14107 + // @ts-expect-error: A spread argument must either have a tuple type or be passed to a rest parameter + api[fn](...args); +} class Hooks { + private _started: boolean; + constructor() { - if (!Hooks.instance) { - this._started = false; - Hooks.instance = this; + if (instance) { + throw new Error('Hooks already has an instance.'); } - return Hooks.instance; + this._started = false; } init() { @@ -232,12 +266,12 @@ class Hooks { } this._started = true; - window.addEventListener('message', onNewMessage, false); + window.addEventListener('message', onNewMessageHandler, false); } reset() { this._started = false; - window.removeEventListener('message', onNewMessage, false); + window.removeEventListener('message', onNewMessageHandler, false); } } diff --git a/packages/livechat/src/lib/parentCall.ts b/packages/livechat/src/lib/parentCall.ts index 5c2b63ac3487c..4b03e22927a51 100644 --- a/packages/livechat/src/lib/parentCall.ts +++ b/packages/livechat/src/lib/parentCall.ts @@ -1,6 +1,6 @@ -import { validCallbacks } from '../widget'; +import { VALID_CALLBACKS } from '../widget'; -export const parentCall = (method: string, args: any = []) => { +export const parentCall = (method: string, ...args: any[]) => { const data = { src: 'rocketchat', fn: method, @@ -12,4 +12,4 @@ export const parentCall = (method: string, args: any = []) => { }; export const runCallbackEventEmitter = (callbackName: string, data: unknown) => - validCallbacks.includes(callbackName) && parentCall('callback', [callbackName, data]); + VALID_CALLBACKS.includes(callbackName) && parentCall('callback', callbackName, data); diff --git a/packages/livechat/src/lib/room.js b/packages/livechat/src/lib/room.js index 1e4f975f18861..af69cd8c4c18a 100644 --- a/packages/livechat/src/lib/room.js +++ b/packages/livechat/src/lib/room.js @@ -141,28 +141,28 @@ export const initRoom = async () => { if (servedBy) { roomAgent = await Livechat.agent(rid); await store.setState({ agent: roomAgent, queueInfo: null }); - parentCall('callback', ['assign-agent', normalizeAgent(roomAgent)]); + parentCall('callback', 'assign-agent', normalizeAgent(roomAgent)); } } if (queueInfo) { - parentCall('callback', ['queue-position-change', queueInfo]); + parentCall('callback', 'queue-position-change', queueInfo); } Livechat.onAgentChange(rid, async (agent) => { await store.setState({ agent, queueInfo: null }); - parentCall('callback', ['assign-agent', normalizeAgent(agent)]); + parentCall('callback', 'assign-agent', normalizeAgent(agent)); }); Livechat.onAgentStatusChange(rid, (status) => { const { agent } = store.state; agent && store.setState({ agent: { ...agent, status } }); - parentCall('callback', ['agent-status-change', normalizeAgent(agent)]); + parentCall('callback', 'agent-status-change', normalizeAgent(agent)); }); Livechat.onQueuePositionChange(rid, async (queueInfo) => { await store.setState({ queueInfo }); - parentCall('callback', ['queue-position-change', queueInfo]); + parentCall('callback', 'queue-position-change', queueInfo); }); setCookies(rid, token); diff --git a/packages/livechat/src/lib/triggers.js b/packages/livechat/src/lib/triggers.js index efa9e9bdc65d6..cf73a74f20bec 100644 --- a/packages/livechat/src/lib/triggers.js +++ b/packages/livechat/src/lib/triggers.js @@ -157,7 +157,7 @@ class Triggers { if (agent && agent._id) { await store.setState({ agent }); - parentCall('callback', ['assign-agent', normalizeAgent(agent)]); + parentCall('callback', 'assign-agent', normalizeAgent(agent)); } const foundCondition = trigger.conditions.find((c) => ['chat-opened-by-visitor', 'after-guest-registration'].includes(c.name)); diff --git a/packages/livechat/src/routes/Chat/connector.tsx b/packages/livechat/src/routes/Chat/connector.tsx index 9493133f44b30..a0897964ddb79 100644 --- a/packages/livechat/src/routes/Chat/connector.tsx +++ b/packages/livechat/src/routes/Chat/connector.tsx @@ -1,47 +1,13 @@ -import type { ComponentProps } from 'preact'; +import type { TFunction } from 'i18next'; +import type { FunctionalComponent } from 'preact'; import { withTranslation } from 'react-i18next'; import { ChatContainer } from '.'; -import { getAvatarUrl } from '../../helpers/baseUrl'; -import { canRenderMessage } from '../../helpers/canRenderMessage'; +import { canRenderMessage, canRenderTriggerMessage } from '../../helpers/canRenderMessage'; +import { formatAgent } from '../../helpers/formatAgent'; import { Consumer } from '../../store'; -type ChatConnectorProps = Omit< - ComponentProps, - | 'theme' - | 'title' - | 'sound' - | 'token' - | 'user' - | 'agent' - | 'room' - | 'messages' - | 'noMoreMessages' - | 'emoji' - | 'uploads' - | 'typingUsernames' - | 'loading' - | 'showConnecting' - | 'connecting' - | 'dispatch' - | 'departments' - | 'allowSwitchingDepartments' - | 'conversationFinishedMessage' - | 'allowRemoveUserData' - | 'alerts' - | 'visible' - | 'unread' - | 'lastReadMessageId' - | 'guest' - | 'triggerAgent' - | 'queueInfo' - | 'registrationFormEnabled' - | 'nameFieldRegistrationForm' - | 'emailFieldRegistrationForm' - | 'limitTextLength' ->; - -const ChatConnector = ({ ref, ...props }: ChatConnectorProps) => ( +export const ChatConnector: FunctionalComponent<{ path: string; default: boolean; t: TFunction }> = ({ ref, t }) => ( {({ config: { @@ -56,13 +22,10 @@ const ChatConnector = ({ ref, ...props }: ChatConnectorProps) => ( limitTextLength, } = {}, messages: { conversationFinishedMessage } = {}, - theme: { color, title } = {}, + theme: { title } = {}, departments = {}, }, - iframe: { - theme: { color: customColor, fontColor: customFontColor, iconColor: customIconColor, title: customTitle } = {}, - guest, - } = {}, + iframe: { theme: { title: customTitle } = {}, guest } = {}, token, agent, sound, @@ -79,40 +42,19 @@ const ChatConnector = ({ ref, ...props }: ChatConnectorProps) => ( lastReadMessageId, triggerAgent, queueInfo, + incomingCallAlert, + ongoingCall, + messageListPosition, }) => ( ( dispatch={dispatch} departments={departments} allowSwitchingDepartments={allowSwitchingDepartments} - conversationFinishedMessage={conversationFinishedMessage || props.t('conversation_finished')} + conversationFinishedMessage={conversationFinishedMessage || t('conversation_finished')} allowRemoveUserData={allowRemoveUserData} alerts={alerts} visible={visible} @@ -144,6 +86,9 @@ const ChatConnector = ({ ref, ...props }: ChatConnectorProps) => ( nameFieldRegistrationForm={nameFieldRegistrationForm} emailFieldRegistrationForm={emailFieldRegistrationForm} limitTextLength={limitTextLength} + incomingCallAlert={incomingCallAlert} + ongoingCall={ongoingCall} + messageListPosition={messageListPosition} /> )} diff --git a/packages/livechat/src/routes/Chat/container.js b/packages/livechat/src/routes/Chat/container.js index 2d23645fb49ec..a6a9ba8451c2c 100644 --- a/packages/livechat/src/routes/Chat/container.js +++ b/packages/livechat/src/routes/Chat/container.js @@ -5,7 +5,7 @@ import { withTranslation } from 'react-i18next'; import { Livechat } from '../../api'; import { ModalManager } from '../../components/Modal'; import { getAvatarUrl } from '../../helpers/baseUrl'; -import { canRenderMessage, canRenderTriggerMessage } from '../../helpers/canRenderMessage'; +import { canRenderMessage } from '../../helpers/canRenderMessage'; import { debounce } from '../../helpers/debounce'; import { throttle } from '../../helpers/throttle'; import { upsert } from '../../helpers/upsert'; @@ -15,7 +15,6 @@ import { getLastReadMessage, loadConfig, processUnread, shouldMarkAsUnread } fro import { parentCall, runCallbackEventEmitter } from '../../lib/parentCall'; import { createToken } from '../../lib/random'; import { initRoom, closeChat, loadMessages, loadMoreMessages, defaultRoomParams, getGreetingMessages } from '../../lib/room'; -import { Consumer } from '../../store'; import Chat from './component'; class ChatContainer extends Component { @@ -373,118 +372,4 @@ class ChatContainer extends Component { ); } -export const ChatConnector = ({ ref, t, ...props }) => ( - - {({ - config: { - settings: { - fileUpload: uploads, - allowSwitchingDepartments, - forceAcceptDataProcessingConsent: allowRemoveUserData, - showConnecting, - registrationForm, - nameFieldRegistrationForm, - emailFieldRegistrationForm, - limitTextLength, - } = {}, - messages: { conversationFinishedMessage } = {}, - theme: { color, title } = {}, - departments = {}, - }, - iframe: { - theme: { color: customColor, fontColor: customFontColor, iconColor: customIconColor, title: customTitle } = {}, - guest, - } = {}, - token, - agent, - sound, - user, - room, - messages, - noMoreMessages, - typing, - loading, - dispatch, - alerts, - visible, - unread, - lastReadMessageId, - triggerAgent, - queueInfo, - incomingCallAlert, - ongoingCall, - messageListPosition, - }) => ( - - )} - -); - -export default withTranslation()(ChatConnector); +export default withTranslation()(ChatContainer); diff --git a/packages/livechat/src/routes/Chat/stories.tsx b/packages/livechat/src/routes/Chat/stories.tsx index 2c91e6b5c1320..c2adcce878cd7 100644 --- a/packages/livechat/src/routes/Chat/stories.tsx +++ b/packages/livechat/src/routes/Chat/stories.tsx @@ -2,7 +2,7 @@ import { action } from '@storybook/addon-actions'; import type { Meta, Story } from '@storybook/preact'; import type { ComponentProps } from 'preact'; -import { screenProps, avatarResolver, beepAudio, screenDecorator } from '../../../.storybook/helpers'; +import { avatarResolver, beepAudio, screenDecorator } from '../../../.storybook/helpers'; import Chat from './component'; const now = new Date(Date.parse('2021-01-01T00:00:00.000Z')); @@ -53,7 +53,6 @@ export default { onBottom: action('bottom'), onUpload: action('upload'), onSubmit: action('submit'), - ...screenProps(), }, decorators: [screenDecorator], parameters: { diff --git a/packages/livechat/src/routes/ChatFinished/component.js b/packages/livechat/src/routes/ChatFinished/component.js deleted file mode 100644 index 8873bd56fa0f9..0000000000000 --- a/packages/livechat/src/routes/ChatFinished/component.js +++ /dev/null @@ -1,38 +0,0 @@ -import { Component } from 'preact'; -import { withTranslation } from 'react-i18next'; - -import { Button } from '../../components/Button'; -import { ButtonGroup } from '../../components/ButtonGroup'; -import Screen from '../../components/Screen'; -import { createClassName } from '../../helpers/createClassName'; -import styles from './styles.scss'; - -class ChatFinished extends Component { - handleClick = () => { - const { onRedirectChat } = this.props; - onRedirectChat && onRedirectChat(); - }; - - render = ({ color, title, greeting, message, onRedirectChat, t, ...props }) => { - const defaultGreeting = t('thanks_for_talking_with_us'); - const defaultMessage = t('if_you_have_any_other_questions_just_press_the_but'); - - return ( - - -

{greeting || defaultGreeting}

-

{message || defaultMessage}

- - - - -
- -
- ); - }; -} - -export default withTranslation()(ChatFinished); diff --git a/packages/livechat/src/routes/ChatFinished/component.tsx b/packages/livechat/src/routes/ChatFinished/component.tsx new file mode 100644 index 0000000000000..3b13f1407cd0f --- /dev/null +++ b/packages/livechat/src/routes/ChatFinished/component.tsx @@ -0,0 +1,42 @@ +import { withTranslation } from 'react-i18next'; + +import { Button } from '../../components/Button'; +import { ButtonGroup } from '../../components/ButtonGroup'; +import Screen from '../../components/Screen'; +import { createClassName } from '../../helpers/createClassName'; +import styles from './styles.scss'; + +type ChatFinishedProps = { + title: string; + greeting?: string; + message?: string; + onRedirectChat?: () => void; + t: (s: string) => string; +}; + +const ChatFinished = ({ title, greeting, message, onRedirectChat, t }: ChatFinishedProps) => { + const handleClick = () => { + onRedirectChat?.(); + }; + + const defaultGreeting = t('thanks_for_talking_with_us'); + const defaultMessage = t('if_you_have_any_other_questions_just_press_the_but'); + + return ( + + +

{greeting || defaultGreeting}

+

{message || defaultMessage}

+ + + + +
+ +
+ ); +}; + +export default withTranslation()(ChatFinished); diff --git a/packages/livechat/src/routes/ChatFinished/container.js b/packages/livechat/src/routes/ChatFinished/container.js deleted file mode 100644 index 601bfe48e8572..0000000000000 --- a/packages/livechat/src/routes/ChatFinished/container.js +++ /dev/null @@ -1,38 +0,0 @@ -import { Component } from 'preact'; -import { route } from 'preact-router'; -import { withTranslation } from 'react-i18next'; - -import { Consumer } from '../../store'; -import ChatFinished from './component'; - -class ChatFinishedContainer extends Component { - handleRedirect = () => { - route('/'); - }; - - render = (props) => ; -} - -const ChatFinishedConnector = ({ ref, t, ...props }) => ( - - {({ - config: { messages: { conversationFinishedMessage: greeting, conversationFinishedText: message } = {}, theme: { color } = {} } = {}, - iframe: { theme: { color: customColor, fontColor: customFontColor, iconColor: customIconColor } = {} } = {}, - }) => ( - - )} - -); - -export default withTranslation()(ChatFinishedConnector); diff --git a/packages/livechat/src/routes/ChatFinished/container.tsx b/packages/livechat/src/routes/ChatFinished/container.tsx new file mode 100644 index 0000000000000..b19481fb221d4 --- /dev/null +++ b/packages/livechat/src/routes/ChatFinished/container.tsx @@ -0,0 +1,24 @@ +import type { TFunction } from 'i18next'; +import type { FunctionalComponent } from 'preact'; +import { route } from 'preact-router'; +import { useContext } from 'preact/hooks'; +import { withTranslation } from 'react-i18next'; + +import { StoreContext } from '../../store'; +import ChatFinished from './component'; + +const ChatFinishedContainer: FunctionalComponent<{ path: string; t: TFunction }> = ({ ref, t }) => { + const { + config: { + messages: { conversationFinishedMessage: greeting, conversationFinishedText: message }, + }, + } = useContext(StoreContext); + + const handleRedirect = () => { + route('/'); + }; + + return ; +}; + +export default withTranslation()(ChatFinishedContainer); diff --git a/packages/livechat/src/routes/ChatFinished/stories.tsx b/packages/livechat/src/routes/ChatFinished/stories.tsx index 6a4cc0f2b259b..18c4c88ab41cd 100644 --- a/packages/livechat/src/routes/ChatFinished/stories.tsx +++ b/packages/livechat/src/routes/ChatFinished/stories.tsx @@ -2,7 +2,7 @@ import { action } from '@storybook/addon-actions'; import type { Meta, Story } from '@storybook/preact'; import type { ComponentProps } from 'preact'; -import { screenProps, loremIpsum, screenDecorator } from '../../../.storybook/helpers'; +import { loremIpsum, screenDecorator } from '../../../.storybook/helpers'; import ChatFinished from './component'; export default { @@ -13,7 +13,6 @@ export default { greeting: '', message: '', onRedirectChat: action('redirectChat'), - ...screenProps(), }, decorators: [screenDecorator], parameters: { diff --git a/packages/livechat/src/routes/GDPRAgreement/component.js b/packages/livechat/src/routes/GDPRAgreement/component.tsx similarity index 80% rename from packages/livechat/src/routes/GDPRAgreement/component.js rename to packages/livechat/src/routes/GDPRAgreement/component.tsx index b9333cc6bf5f4..b18988baafd52 100644 --- a/packages/livechat/src/routes/GDPRAgreement/component.js +++ b/packages/livechat/src/routes/GDPRAgreement/component.tsx @@ -1,3 +1,4 @@ +import type { TFunction } from 'i18next'; import { Component } from 'preact'; import { Trans, withTranslation } from 'react-i18next'; @@ -8,23 +9,22 @@ import Screen from '../../components/Screen'; import { createClassName } from '../../helpers/createClassName'; import styles from './styles.scss'; -class GDPR extends Component { +type GDPRProps = { + title: string; + consentText: string; + instructions: string; + onAgree: () => void; + t: TFunction; +}; + +class GDPR extends Component { handleClick = () => { const { onAgree } = this.props; - onAgree && onAgree(); + onAgree?.(); }; - render = ({ - color, - title, - consentText, - instructions, - // eslint-disable-next-line no-unused-vars - onAgree, - t, - ...props - }) => ( - + render = ({ title, consentText, instructions, t }: GDPRProps) => ( + {consentText ? (

diff --git a/packages/livechat/src/routes/GDPRAgreement/container.js b/packages/livechat/src/routes/GDPRAgreement/container.js deleted file mode 100644 index 82c290eb55e9c..0000000000000 --- a/packages/livechat/src/routes/GDPRAgreement/container.js +++ /dev/null @@ -1,41 +0,0 @@ -import { Component } from 'preact'; -import { route } from 'preact-router'; -import { withTranslation } from 'react-i18next'; - -import { Consumer } from '../../store'; -import GDPRAgreement from './component'; - -class GDPRContainer extends Component { - handleAgree = async () => { - const { dispatch } = this.props; - await dispatch({ gdpr: { accepted: true } }); - route('/'); - }; - - render = (props) => ; -} - -const GDPRConnector = ({ ref, t, ...props }) => ( - - {({ - config: { theme: { color } = {}, messages: { dataProcessingConsentText: consentText } = {} } = {}, - iframe: { theme: { color: customColor, fontColor: customFontColor, iconColor: customIconColor } = {} } = {}, - dispatch, - }) => ( - - )} - -); - -export default withTranslation()(GDPRConnector); diff --git a/packages/livechat/src/routes/GDPRAgreement/container.tsx b/packages/livechat/src/routes/GDPRAgreement/container.tsx new file mode 100644 index 0000000000000..8dcbb83009b23 --- /dev/null +++ b/packages/livechat/src/routes/GDPRAgreement/container.tsx @@ -0,0 +1,21 @@ +import type { TFunction } from 'i18next'; +import type { FunctionalComponent } from 'preact'; +import { route } from 'preact-router'; +import { useContext } from 'preact/hooks'; +import { withTranslation } from 'react-i18next'; + +import { StoreContext } from '../../store'; +import GDPRAgreement from './component'; + +const GDPRContainer: FunctionalComponent<{ t: TFunction }> = ({ ref, t }) => { + const { config: { messages: { dataProcessingConsentText: consentText = '' } = {} } = {}, dispatch } = useContext(StoreContext); + + const handleAgree = async () => { + await dispatch({ gdpr: { accepted: true } }); + route('/'); + }; + + return ; +}; + +export default withTranslation()(GDPRContainer); diff --git a/packages/livechat/src/routes/GDPRAgreement/stories.tsx b/packages/livechat/src/routes/GDPRAgreement/stories.tsx index fb0139cd2e53e..95de5492be73a 100644 --- a/packages/livechat/src/routes/GDPRAgreement/stories.tsx +++ b/packages/livechat/src/routes/GDPRAgreement/stories.tsx @@ -2,7 +2,7 @@ import { action } from '@storybook/addon-actions'; import type { Meta, Story } from '@storybook/preact'; import type { ComponentProps } from 'preact'; -import { screenDecorator, screenProps } from '../../../.storybook/helpers'; +import { screenDecorator } from '../../../.storybook/helpers'; import GDPRAgreement from './component'; export default { @@ -13,7 +13,6 @@ export default { consentText: '', instructions: '', onAgree: action('agree'), - ...screenProps(), }, decorators: [screenDecorator], parameters: { diff --git a/packages/livechat/src/routes/LeaveMessage/index.tsx b/packages/livechat/src/routes/LeaveMessage/index.tsx index 8f209de029db7..7a8cdab0d0e2c 100644 --- a/packages/livechat/src/routes/LeaveMessage/index.tsx +++ b/packages/livechat/src/routes/LeaveMessage/index.tsx @@ -1,3 +1,4 @@ +import type { FunctionalComponent } from 'preact'; import { useContext, useRef } from 'preact/hooks'; import type { JSXInternal } from 'preact/src/jsx'; import type { FieldValues, SubmitHandler } from 'react-hook-form'; @@ -21,12 +22,12 @@ import { createToken } from '../../lib/random'; import { StoreContext } from '../../store'; import styles from './styles.scss'; -const LeaveMessage = ({ screenProps }: { screenProps: { [key: string]: unknown }; path: string }) => { +const LeaveMessage: FunctionalComponent<{ path: string }> = () => { const { config: { departments = [], messages: { offlineMessage, offlineSuccessMessage, offlineUnavailableMessage }, - theme: { offlineTitle: title, offlineColor: color }, + theme: { offlineTitle: title }, settings: { displayOfflineForm }, }, iframe, @@ -56,7 +57,9 @@ const LeaveMessage = ({ screenProps }: { screenProps: { [key: string]: unknown } ...(department && { department }), message, }; + await dispatch({ loading: true }); + try { // TODO: Remove intersection after ts refactor of parseOfflineMessage const payload = parseOfflineMessage(fields) as FormValues & { host: string }; @@ -64,7 +67,7 @@ const LeaveMessage = ({ screenProps }: { screenProps: { [key: string]: unknown } await ModalManager.alert({ text: offlineSuccessMessage || text, }); - parentCall('callback', ['offline-form-submit', fields]); + parentCall('callback', 'offline-form-submit', fields); return true; } catch (error: unknown) { const errorMessage = (error as { error: string })?.error; @@ -82,13 +85,7 @@ const LeaveMessage = ({ screenProps }: { screenProps: { [key: string]: unknown } const defaultUnavailableMessage = ''; // TODO return ( - +

diff --git a/packages/livechat/src/routes/Register/index.tsx b/packages/livechat/src/routes/Register/index.tsx index d9df7a5a3d4a8..8582bde03d04b 100644 --- a/packages/livechat/src/routes/Register/index.tsx +++ b/packages/livechat/src/routes/Register/index.tsx @@ -1,3 +1,4 @@ +import type { FunctionalComponent } from 'preact'; import { route } from 'preact-router'; import { useContext, useEffect, useRef } from 'preact/hooks'; import type { JSXInternal } from 'preact/src/jsx'; @@ -16,12 +17,13 @@ import CustomFields from '../../lib/customFields'; import { validateEmail } from '../../lib/email'; import { parentCall } from '../../lib/parentCall'; import { StoreContext } from '../../store'; +import type { StoreState } from '../../store'; import styles from './styles.scss'; // Custom field as in the form payload type FormPayloadCustomField = { [key: string]: string }; -export const Register = ({ screenProps }: { screenProps: { [key: string]: unknown }; path: string }) => { +export const Register: FunctionalComponent<{ path: string }> = () => { const { t } = useTranslation(); const topRef = useRef(null); @@ -38,13 +40,10 @@ export const Register = ({ screenProps }: { screenProps: { [key: string]: unknow departments = [], messages: { registrationFormMessage: message }, settings: { nameFieldRegistrationForm: hasNameField, emailFieldRegistrationForm: hasEmailField }, - theme: { title, color }, + theme: { title }, customFields = [], }, - iframe: { - guest: { department: guestDepartment, name: guestName, email: guestEmail }, - theme: { color: customColor, fontColor: customFontColor, iconColor: customIconColor, title: customTitle }, - }, + iframe: { guest: { department: guestDepartment = undefined, name: guestName = undefined, email: guestEmail = undefined } = {} }, loading = false, token, dispatch, @@ -82,10 +81,12 @@ export const Register = ({ screenProps }: { screenProps: { [key: string]: unknow }; dispatch({ loading: true, department }); + try { const { visitor: user } = await Livechat.grantVisitor({ visitor: { ...fields, token } }); - dispatch({ user }); - parentCall('callback', ['pre-chat-form-submit', fields]); + await dispatch({ user } as Omit); + + parentCall('callback', 'pre-chat-form-submit', fields); registerCustomFields(customFields); } finally { dispatch({ loading: false }); @@ -107,17 +108,7 @@ export const Register = ({ screenProps }: { screenProps: { [key: string]: unknow }, [user?._id]); return ( - +
{ +const SwitchDepartment: FunctionalComponent<{ path: string }> = () => { const { t } = useTranslation(); const { config: { messages: { switchDepartmentMessage }, departments: deps = [], - theme: { color }, }, iframe: { guest }, iframe, @@ -60,7 +61,10 @@ const SwitchDepartment = ({ screenProps }: { screenProps: { [key: string]: unkno if (!room) { const { visitor: user } = await Livechat.grantVisitor({ visitor: { department, token } }); - await dispatch({ user, alerts: (alerts.push({ id: createToken(), children: t('department_switched'), success: true }), alerts) }); + await dispatch({ + user: user as StoreState['user'], + alerts: (alerts.push({ id: createToken(), children: t('department_switched'), success: true }), alerts), + }); return route('/'); } @@ -84,7 +88,7 @@ const SwitchDepartment = ({ screenProps }: { screenProps: { [key: string]: unkno throw t('no_available_agents_to_transfer'); } - await dispatch({ iframe: { ...iframe, guest: { ...guest, department } }, loading: false }); + await dispatch({ iframe: { ...iframe, guest: { ...guest, department } }, loading: false } as Pick); await loadConfig(); await ModalManager.alert({ @@ -110,7 +114,7 @@ const SwitchDepartment = ({ screenProps }: { screenProps: { [key: string]: unkno const defaultMessage = t('choose_a_department_1'); return ( - +

{switchDepartmentMessage || defaultMessage}

diff --git a/packages/livechat/src/routes/SwitchDepartment/stories.tsx b/packages/livechat/src/routes/SwitchDepartment/stories.tsx index 37405c97bbc7f..c7409bc89695e 100644 --- a/packages/livechat/src/routes/SwitchDepartment/stories.tsx +++ b/packages/livechat/src/routes/SwitchDepartment/stories.tsx @@ -2,7 +2,7 @@ import { action } from '@storybook/addon-actions'; import type { Meta, Story } from '@storybook/preact'; import type { ComponentProps } from 'preact'; -import { screenDecorator, screenProps } from '../../../.storybook/helpers'; +import { screenDecorator } from '../../../.storybook/helpers'; import SwitchDepartment from './index'; export default { @@ -28,7 +28,6 @@ export default { loading: false, onSubmit: action('submit'), onCancel: action('cancel'), - ...screenProps(), }, decorators: [screenDecorator], parameters: { diff --git a/packages/livechat/src/routes/TriggerMessage/component.js b/packages/livechat/src/routes/TriggerMessage/component.tsx similarity index 55% rename from packages/livechat/src/routes/TriggerMessage/component.js rename to packages/livechat/src/routes/TriggerMessage/component.tsx index d31ccb506f8f2..86e65f1d11e09 100644 --- a/packages/livechat/src/routes/TriggerMessage/component.js +++ b/packages/livechat/src/routes/TriggerMessage/component.tsx @@ -1,15 +1,29 @@ +import type { TFunction } from 'i18next'; +import type { RefObject } from 'preact'; import { Component, createRef } from 'preact'; import { withTranslation } from 'react-i18next'; import Screen from '../../components/Screen'; +import type { ScreenContextValue } from '../../components/Screen/ScreenProvider'; import { createClassName } from '../../helpers/createClassName'; import { parentCall } from '../../lib/parentCall'; +import type { StoreState } from '../../store'; import styles from './styles.scss'; -class TriggerMessage extends Component { +type TriggerMessageProps = { + title: string; + messages: StoreState['messages']; + onStartChat: () => void; + t: TFunction; + theme: ScreenContextValue['theme']; +}; + +class TriggerMessage extends Component { state = {}; - constructor(props) { + ref: RefObject; + + constructor(props: TriggerMessageProps) { super(props); this.ref = createRef(); } @@ -24,16 +38,14 @@ class TriggerMessage extends Component { parentCall('resizeWidget', height); } - render({ title, messages, loading, onStartChat = () => {}, departments, t, ...props }) { + render = ({ title, messages, onStartChat = () => undefined, t }: TriggerMessageProps) => { const defaultTitle = t('messages'); - const { - theme: { color }, - } = props; + const { theme: { color } = {} } = this.props; + return ( - + - {messages && - messages.map((message) => message.msg &&

{message.msg}

)} + {messages?.map((message) => message.msg &&

{message.msg}

)}

@@ -43,7 +55,7 @@ class TriggerMessage extends Component {
); - } + }; } export default withTranslation()(TriggerMessage); diff --git a/packages/livechat/src/routes/TriggerMessage/container.js b/packages/livechat/src/routes/TriggerMessage/container.js deleted file mode 100644 index 655279d11ea8f..0000000000000 --- a/packages/livechat/src/routes/TriggerMessage/container.js +++ /dev/null @@ -1,67 +0,0 @@ -import { Component } from 'preact'; -import { route } from 'preact-router'; - -import { getAvatarUrl } from '../../helpers/baseUrl'; -import { canRenderMessage } from '../../helpers/canRenderMessage'; -import { parentCall } from '../../lib/parentCall'; -import { Consumer } from '../../store'; -import TriggerMessage from './component'; - -export class TriggerMessageContainer extends Component { - handleStart(props) { - parentCall('setFullScreenDocumentMobile'); - parentCall('openWidget'); - props.onRestore(); - route('/'); - } - - render = (props) => { - parentCall('resetDocumentStyle'); - return this.handleStart(props)} {...props} />; - }; -} - -/** @type {function({ ref?: any; path?: string }): any} */ -export const TriggerMessageConnector = ({ ref, ...props }) => ( - - {({ - config: { theme: { color } = {} } = {}, - iframe: { theme: { color: customColor, fontColor: customFontColor, iconColor: customIconColor } = {} } = {}, - messages, - agent, - unread, - }) => ( - - )} - -); - -export default TriggerMessageConnector; diff --git a/packages/livechat/src/routes/TriggerMessage/container.tsx b/packages/livechat/src/routes/TriggerMessage/container.tsx new file mode 100644 index 0000000000000..62a3a1927a0ec --- /dev/null +++ b/packages/livechat/src/routes/TriggerMessage/container.tsx @@ -0,0 +1,39 @@ +import type { FunctionalComponent } from 'preact'; +import { route } from 'preact-router'; +import { useContext, useEffect } from 'preact/hooks'; + +import { ScreenContext } from '../../components/Screen/ScreenProvider'; +import { canRenderMessage } from '../../helpers/canRenderMessage'; +import { formatAgent } from '../../helpers/formatAgent'; +import { parentCall } from '../../lib/parentCall'; +import { StoreContext } from '../../store'; +import TriggerMessage from './component'; + +export const TriggerMessageContainer: FunctionalComponent<{ path: string }> = ({ ref }) => { + const { messages, agent, unread } = useContext(StoreContext); + const { theme, onRestore } = useContext(ScreenContext); + + const handleStart = () => { + parentCall('setFullScreenDocumentMobile'); + parentCall('openWidget'); + onRestore(); + route('/'); + }; + + useEffect(() => { + parentCall('resetDocumentStyle'); + }, []); + + return ( + handleStart()} + /> + ); +}; + +export default TriggerMessageContainer; diff --git a/packages/livechat/src/routes/TriggerMessage/index.ts b/packages/livechat/src/routes/TriggerMessage/index.ts index 71a0794e88cca..fad21836af806 100644 --- a/packages/livechat/src/routes/TriggerMessage/index.ts +++ b/packages/livechat/src/routes/TriggerMessage/index.ts @@ -1,3 +1,3 @@ export { default as TriggerMessage } from './component'; -export { TriggerMessageContainer, TriggerMessageConnector } from './container'; +export { TriggerMessageContainer } from './container'; export { default } from './container'; diff --git a/packages/livechat/src/routes/TriggerMessage/stories.tsx b/packages/livechat/src/routes/TriggerMessage/stories.tsx index 8ee5291e8e44b..dedf0abca764c 100644 --- a/packages/livechat/src/routes/TriggerMessage/stories.tsx +++ b/packages/livechat/src/routes/TriggerMessage/stories.tsx @@ -2,7 +2,7 @@ import { action } from '@storybook/addon-actions'; import type { Meta, Story } from '@storybook/preact'; import type { ComponentProps } from 'preact'; -import { screenDecorator, screenProps } from '../../../.storybook/helpers'; +import { screenDecorator } from '../../../.storybook/helpers'; import TriggerMessage from './component'; const now = new Date(Date.parse('2021-01-01T00:00:00.000Z')); @@ -28,7 +28,6 @@ export default { title: '', onSubmit: action('submit'), onCancel: action('cancel'), - ...screenProps(), }, decorators: [screenDecorator], parameters: { diff --git a/packages/livechat/src/routes/TriggerMessage/styles.scss b/packages/livechat/src/routes/TriggerMessage/styles.scss index e55ae2fe1a478..3f6ad59169535 100644 --- a/packages/livechat/src/routes/TriggerMessage/styles.scss +++ b/packages/livechat/src/routes/TriggerMessage/styles.scss @@ -34,7 +34,7 @@ cursor: pointer; text-decoration: none; - color: $color-blue; + color: var(--color, $color-blue); border: 0; background: none; diff --git a/packages/livechat/src/store/index.tsx b/packages/livechat/src/store/index.tsx index 48e3e1df3dddc..7f31ba739e046 100644 --- a/packages/livechat/src/store/index.tsx +++ b/packages/livechat/src/store/index.tsx @@ -1,18 +1,37 @@ +import type { ILivechatVisitor, ILivechatVisitorDTO, Serialized } from '@rocket.chat/core-typings'; import type { ComponentChildren } from 'preact'; import { Component, createContext } from 'preact'; import type { CustomField } from '../components/Form/CustomFields'; +import type { Agent } from '../definitions/agents'; import type { Department } from '../definitions/departments'; import { parentCall } from '../lib/parentCall'; import { createToken } from '../lib/random'; import Store from './Store'; -type StoreState = { +export type StoreState = { token: string; typing: string[]; config: { messages: any; - theme: any; + theme: { + title?: string; + color?: string; + offlineTitle?: string; + offlineColor?: string; + actionLinks?: { + webrtc: { + actionLinksAlignment: string; + i18nLabel: string; + label: string; + method_id: string; + }[]; + jitsi: { + icon: string; + i18nLabel: string; + }[]; + }; + }; triggers: any[]; resources: any; settings: { @@ -32,16 +51,25 @@ type StoreState = { enabled?: boolean; }; messages: any[]; - user: any; + user?: Serialized; + guest?: Serialized; sound: { src?: string; play?: boolean; enabled: boolean; }; iframe: { - guest: any; - theme: any; - visible: boolean; + guest?: Serialized; + theme: { + title?: string; + color?: string; + fontColor?: string; + iconColor?: string; + offlineTitle?: string; + }; + visible?: boolean; + department?: string; + language?: string; }; gdpr: { accepted: boolean; @@ -66,7 +94,10 @@ type StoreState = { lastReadMessageId?: any; triggerAgent?: any; queueInfo?: any; + defaultAgent?: Agent; + parentUrl?: string; connecting?: boolean; + messageListPosition?: 'top' | 'bottom' | 'free'; }; export const initialState = (): StoreState => ({ @@ -81,14 +112,14 @@ export const initialState = (): StoreState => ({ resources: {}, }, messages: [], - user: null, + user: undefined, sound: { src: '', enabled: true, play: false, }, iframe: { - guest: {}, + guest: undefined, theme: {}, visible: true, }, @@ -145,16 +176,30 @@ if (process.env.NODE_ENV === 'development') { }); } -export type Dispatch = (partialState: Partial) => void; +export type Dispatch = typeof store.setState; -type StoreContextValue = StoreState & { dispatch: Dispatch }; +type StoreContextValue = StoreState & { + dispatch: Dispatch; + on: typeof store.on; + off: typeof store.off; +}; -export const StoreContext = createContext({ ...store.state, dispatch: store.setState.bind(store) }); +export const StoreContext = createContext({ + ...store.state, + dispatch: store.setState.bind(store), + on: store.on.bind(store), + off: store.off.bind(store), +}); export class Provider extends Component { static displayName = 'StoreProvider'; - state = { ...store.state, dispatch: store.setState.bind(store) }; + state = { + ...store.state, + dispatch: store.setState.bind(store), + on: store.on.bind(store), + off: store.off.bind(store), + }; handleStoreChange = () => { this.setState({ ...store.state }); @@ -168,7 +213,9 @@ export class Provider extends Component { store.off('change', this.handleStoreChange); } - render = ({ children }: { children: ComponentChildren }) => {children}; + render = ({ children }: { children: ComponentChildren }) => { + return {children}; + }; } export const { Consumer } = StoreContext; diff --git a/packages/livechat/src/widget.js b/packages/livechat/src/widget.ts similarity index 53% rename from packages/livechat/src/widget.js rename to packages/livechat/src/widget.ts index 46781644ec361..e43bd39438445 100644 --- a/packages/livechat/src/widget.js +++ b/packages/livechat/src/widget.ts @@ -1,9 +1,47 @@ +import type { UserStatus } from '@rocket.chat/core-typings'; +import type { LivechatRoomEvents } from '@rocket.chat/ddp-client/dist/livechat/types/LivechatSDK'; import mitt from 'mitt'; -const log = - process.env.NODE_ENV === 'development' - ? (...args) => window.console.log('%cwidget%c', 'color: red', 'color: initial', ...args) - : () => {}; +import { isDefined } from './helpers/isDefined'; +import type { HooksWidgetAPI } from './lib/hooks'; +import type { StoreState } from './store'; + +type InternalWidgetAPI = { + popup: Window | null; + ready: () => void; + minimizeWindow: () => void; + restoreWindow: () => void; + openPopout: () => void; + openWidget: () => void; + resizeWidget: (height: number) => void; + removeWidget: () => void; + callback: (eventName: string, data?: unknown) => void; + showWidget: () => void; + hideWidget: () => void; + resetDocumentStyle: () => void; + setFullScreenDocumentMobile: () => void; +}; + +export type LivechatMessageEventData> = { + src?: string; + fn: keyof ApiType; + args: Parameters; +}; + +type InitializeParams = { + customField: [key: string, value: string, overwrite?: boolean]; + setCustomFields: [key: string, value: string, overwrite?: boolean][]; + theme: StoreState['iframe']['theme']; + department: string; + businessUnit: string; + guestToken: string; + guestName: string; + guestEmail: string; + registerGuest: StoreState['guest']; + language: string; + agent: StoreState['defaultAgent']; + parentUrl: string; +}; const WIDGET_OPEN_WIDTH = 365; const WIDGET_OPEN_HEIGHT = 525; @@ -12,16 +50,16 @@ const WIDGET_MINIMIZED_HEIGHT = 54; const WIDGET_MARGIN = 16; window.RocketChat = window.RocketChat || { _: [] }; -const config = {}; -let widget; -let iframe; -let hookQueue = []; +const config: { url?: string } = {}; +let widget: HTMLDivElement | null; +let iframe: HTMLIFrameElement | null; +let hookQueue: [keyof HooksWidgetAPI, Parameters][] = []; let ready = false; let smallScreen = false; -let scrollPosition; -let widget_height; +let scrollPosition: number; +let widgetHeight: number; -export const validCallbacks = [ +export const VALID_CALLBACKS = [ 'chat-maximized', 'chat-minimized', 'chat-started', @@ -38,15 +76,15 @@ export const validCallbacks = [ const callbacks = mitt(); -function registerCallback(eventName, fn) { - if (validCallbacks.indexOf(eventName) === -1) { +function registerCallback(eventName: string, fn: () => unknown) { + if (VALID_CALLBACKS.indexOf(eventName) === -1) { return false; } return callbacks.on(eventName, fn); } -function emitCallback(eventName, data) { +function emitCallback(eventName: string, data?: unknown) { if (typeof data !== 'undefined') { callbacks.emit(eventName, data); } else { @@ -59,19 +97,41 @@ function clearAllCallbacks() { } // hooks -function callHook(action, params) { +function callHook(action: keyof HooksWidgetAPI, ...params: Parameters) { if (!ready) { return hookQueue.push([action, params]); } + + if (!iframe?.contentWindow) { + throw new Error('Widget is not initialized'); + } + const data = { src: 'rocketchat', fn: action, args: params, }; - iframe.contentWindow.postMessage(data, '*'); + + iframe.contentWindow?.postMessage(data, '*'); +} + +function processHookQueue() { + if (!hookQueue.length) { + return; + } + + hookQueue.forEach(([action, params = []]) => { + callHook(action, ...params); + }); + + hookQueue = []; } -const updateWidgetStyle = (isOpened) => { +const updateWidgetStyle = (isOpened: boolean) => { + if (!iframe || !widget) { + throw new Error('Widget is not initialized'); + } + const isFullscreen = smallScreen && widget.dataset.state !== 'triggered'; if (smallScreen && isOpened) { @@ -95,7 +155,7 @@ const updateWidgetStyle = (isOpened) => { * for widget.style.width */ - widget.style.height = isFullscreen ? '100%' : `${WIDGET_MARGIN + widget_height + WIDGET_MARGIN + WIDGET_MINIMIZED_HEIGHT}px`; + widget.style.height = isFullscreen ? '100%' : `${WIDGET_MARGIN + widgetHeight + WIDGET_MARGIN + WIDGET_MINIMIZED_HEIGHT}px`; widget.style.width = isFullscreen ? '100%' : `${WIDGET_MARGIN + WIDGET_OPEN_WIDTH + WIDGET_MARGIN}px`; } else { widget.style.left = 'auto'; @@ -104,7 +164,7 @@ const updateWidgetStyle = (isOpened) => { } }; -const createWidget = (url) => { +const createWidget = (url: string) => { widget = document.createElement('div'); widget.className = 'rocketchat-widget'; widget.style.position = 'fixed'; @@ -123,7 +183,6 @@ const createWidget = (url) => { iframe = document.createElement('iframe'); iframe.id = 'rocketchat-iframe'; - iframe.allowTransparency = 'true'; iframe.src = url; iframe.style.width = '100%'; iframe.style.height = '100%'; @@ -134,7 +193,7 @@ const createWidget = (url) => { widget.appendChild(container); document.body.appendChild(widget); - const handleMediaQueryTest = ({ matches }) => { + const handleMediaQueryTest = ({ matches }: { matches: boolean }) => { if (!widget) { return; } @@ -151,24 +210,35 @@ const createWidget = (url) => { }; const openWidget = () => { + if (!iframe || !widget) { + throw new Error('Widget is not initialized'); + } + if (widget.dataset.state === 'opened') { return; } - widget_height = WIDGET_OPEN_HEIGHT; + widgetHeight = WIDGET_OPEN_HEIGHT; widget.dataset.state = 'opened'; updateWidgetStyle(true); iframe.focus(); emitCallback('chat-maximized'); }; -const resizeWidget = (height) => { - widget_height = height; +const resizeWidget = (height: number) => { + if (!widget) { + throw new Error('Widget is not initialized'); + } + widgetHeight = height; widget.dataset.state = 'triggered'; updateWidgetStyle(true); }; function closeWidget() { + if (!iframe || !widget) { + throw new Error('Widget is not initialized'); + } + if (widget.dataset.state === 'closed') { return; } @@ -178,77 +248,7 @@ function closeWidget() { emitCallback('chat-minimized'); } -const api = { - popup: null, - - ready() { - ready = true; - if (hookQueue.length > 0) { - hookQueue.forEach(function (hookParams) { - callHook.apply(this, hookParams); - }); - hookQueue = []; - } - }, - - minimizeWindow() { - closeWidget(); - }, - - restoreWindow() { - if (api.popup && api.popup.closed !== true) { - api.popup.close(); - api.popup = null; - } - openWidget(); - }, - - openPopout() { - closeWidget(); - api.popup = window.open( - `${config.url}${config.url.lastIndexOf('?') > -1 ? '&' : '?'}mode=popout`, - 'livechat-popout', - `width=${WIDGET_OPEN_WIDTH}, height=${widget_height}, toolbars=no`, - ); - api.popup.focus(); - }, - - openWidget() { - openWidget(); - }, - - resizeWidget(height) { - resizeWidget(height); - }, - - removeWidget() { - document.body.removeChild(widget); - }, - - callback(eventName, data) { - emitCallback(eventName, data); - }, - - showWidget() { - iframe.style.display = 'initial'; - emitCallback('show-widget'); - }, - - hideWidget() { - iframe.style.display = 'none'; - emitCallback('hide-widget'); - }, - - resetDocumentStyle() { - document.body.classList.remove('rc-livechat-mobile-full-screen'); - }, - - setFullScreenDocumentMobile() { - smallScreen && document.body.classList.add('rc-livechat-mobile-full-screen'); - }, -}; - -function pageVisited(change) { +function pageVisited(change: string) { callHook('pageVisited', { change, location: JSON.parse(JSON.stringify(document.location)), @@ -256,22 +256,37 @@ function pageVisited(change) { }); } -function setCustomField(key, value, overwrite) { +function setCustomField(key: string, value = '', overwrite = true) { if (typeof overwrite === 'undefined') { overwrite = true; } - callHook('setCustomField', [key, value, overwrite]); + if (!key) { + return; + } + + callHook('setCustomField', key, value, overwrite); } -function setTheme(theme) { +function setCustomFields(fields: [key: string, value: string, overwrite?: boolean][]) { + if (!Array.isArray(fields)) { + console.log('Error: Invalid parameters. Value must be an array of objects'); + return; + } + + fields.forEach(([key, value, overwrite = true]) => { + setCustomField(key, value, overwrite); + }); +} + +function setTheme(theme: StoreState['iframe']['theme']) { callHook('setTheme', theme); } -function setDepartment(department) { +function setDepartment(department: string) { callHook('setDepartment', department); } -function setBusinessUnit(businessUnit) { +function setBusinessUnit(businessUnit: string) { callHook('setBusinessUnit', businessUnit); } @@ -279,19 +294,19 @@ function clearBusinessUnit() { callHook('clearBusinessUnit'); } -function setGuestToken(token) { +function setGuestToken(token: string) { callHook('setGuestToken', token); } -function setGuestName(name) { +function setGuestName(name: string) { callHook('setGuestName', name); } -function setGuestEmail(email) { +function setGuestEmail(email: string) { callHook('setGuestEmail', email); } -function registerGuest(guest) { +function registerGuest(guest: StoreState['guest']) { callHook('registerGuest', guest); } @@ -299,12 +314,12 @@ function clearDepartment() { callHook('clearDepartment'); } -function setAgent(agent) { +function setAgent(agent: StoreState['defaultAgent']) { callHook('setAgent', agent); } -function setLanguage(language) { - callHook('setLanguage', language); +function setLanguage(lang: string) { + callHook('setLanguage', lang); } function showWidget() { @@ -327,61 +342,58 @@ function minimizeWidget() { emitCallback('chat-minimized'); } -function setParentUrl(url) { +function setParentUrl(url: string) { callHook('setParentUrl', url); } -function initialize(params) { - for (const method in params) { - if (!params.hasOwnProperty(method)) { +function initialize(initParams: Partial) { + for (const initKey in initParams) { + if (!initParams.hasOwnProperty(initKey)) { + continue; + } + + const params = initParams[initKey as keyof InitializeParams]; + + if (!isDefined(params)) { continue; } - switch (method) { + switch (initKey) { case 'customField': - const { key, value, overwrite } = params[method]; - setCustomField(key, value, overwrite); + setCustomField(...(params as InitializeParams['customField'])); continue; case 'setCustomFields': - if (!Array.isArray(params[method])) { - console.log('Error: Invalid parameters. Value must be an array of objects'); - continue; - } - params[method].forEach((data) => { - const { key, value, overwrite } = data; - setCustomField(key, value, overwrite); - }); + setCustomFields(params as InitializeParams['setCustomFields']); continue; case 'theme': - setTheme(params[method]); + setTheme(params as InitializeParams['theme']); continue; case 'department': - setDepartment(params[method]); + setDepartment(params as InitializeParams['department']); continue; - case 'businessUnit': { - setBusinessUnit(params[method]); + case 'businessUnit': + setBusinessUnit(params as InitializeParams['businessUnit']); continue; - } case 'guestToken': - setGuestToken(params[method]); + setGuestToken(params as InitializeParams['guestToken']); continue; case 'guestName': - setGuestName(params[method]); + setGuestName(params as InitializeParams['guestName']); continue; case 'guestEmail': - setGuestEmail(params[method]); + setGuestEmail(params as InitializeParams['guestEmail']); continue; case 'registerGuest': - registerGuest(params[method]); + registerGuest(params as InitializeParams['registerGuest']); continue; case 'language': - setLanguage(params[method]); + setLanguage(params as InitializeParams['language']); continue; case 'agent': - setAgent(params[method]); + setAgent(params as InitializeParams['agent']); continue; case 'parentUrl': - setParentUrl(params[method]); + setParentUrl(params as InitializeParams['parentUrl']); continue; default: continue; @@ -389,76 +401,81 @@ function initialize(params) { } } -const currentPage = { - href: null, - title: null, -}; +const api: InternalWidgetAPI = { + popup: null, -const attachMessageListener = () => { - window.addEventListener( - 'message', - (msg) => { - if (typeof msg.data === 'object' && msg.data.src !== undefined && msg.data.src === 'rocketchat') { - if (api[msg.data.fn] !== undefined && typeof api[msg.data.fn] === 'function') { - const args = [].concat(msg.data.args || []); - log(`api.${msg.data.fn}`, ...args); - api[msg.data.fn].apply(null, args); - } - } - }, - false, - ); -}; + openWidget, -const trackNavigation = () => { - setInterval(() => { - if (document.location.href !== currentPage.href) { - pageVisited('url'); - currentPage.href = document.location.href; - } + resizeWidget, - if (document.title !== currentPage.title) { - pageVisited('title'); - currentPage.title = document.title; + ready() { + ready = true; + processHookQueue(); + }, + + minimizeWindow() { + closeWidget(); + }, + + restoreWindow() { + if (api.popup && api.popup.closed !== true) { + api.popup.close(); + api.popup = null; } - }, 800); -}; + openWidget(); + }, -const init = (url) => { - const trimmedUrl = url.trim(); - if (!trimmedUrl) { - return; - } + openPopout() { + closeWidget(); + if (!config.url) { + throw new Error('Config.url is not set!'); + } + api.popup = window.open( + `${config.url}${config.url.lastIndexOf('?') > -1 ? '&' : '?'}mode=popout`, + 'livechat-popout', + `width=${WIDGET_OPEN_WIDTH}, height=${widgetHeight}, toolbars=no`, + ); + api.popup?.focus(); + }, - config.url = trimmedUrl; + removeWidget() { + document.body.removeChild(widget as Node); + }, - createWidget(trimmedUrl); - attachMessageListener(); - trackNavigation(); -}; + callback(eventName, data) { + emitCallback(eventName, data); + }, -if (typeof window.initRocket !== 'undefined') { - console.warn('initRocket is now deprecated. Please update the livechat code.'); - init(window.initRocket[0]); -} + showWidget() { + if (!iframe) { + throw new Error('Widget is not initialized'); + } + iframe.style.display = 'initial'; + emitCallback('show-widget'); + }, -if (typeof window.RocketChat.url !== 'undefined') { - init(window.RocketChat.url); -} + hideWidget() { + if (!iframe) { + throw new Error('Widget is not initialized'); + } + iframe.style.display = 'none'; + emitCallback('hide-widget'); + }, -const queue = window.RocketChat._; + resetDocumentStyle() { + document.body.classList.remove('rc-livechat-mobile-full-screen'); + }, -window.RocketChat._.push = function (c) { - c.call(window.RocketChat.livechat); + setFullScreenDocumentMobile() { + smallScreen && document.body.classList.add('rc-livechat-mobile-full-screen'); + }, }; -window.RocketChat = window.RocketChat._.push; -// exports -window.RocketChat.livechat = { - // methods +const livechatWidgetAPI = { + // initParams + initialize, pageVisited, setCustomField, - initialize, setTheme, setDepartment, clearDepartment, @@ -478,45 +495,150 @@ window.RocketChat.livechat = { clearAllCallbacks, // callbacks - onChatMaximized(fn) { + onChatMaximized(fn: () => void) { registerCallback('chat-maximized', fn); }, - onChatMinimized(fn) { + onChatMinimized(fn: () => void) { registerCallback('chat-minimized', fn); }, - onChatStarted(fn) { + onChatStarted(fn: () => void) { registerCallback('chat-started', fn); }, - onChatEnded(fn) { + onChatEnded(fn: () => void) { registerCallback('chat-ended', fn); }, - onPrechatFormSubmit(fn) { + onPrechatFormSubmit( + fn: () => { + name: string; + email: string; + department?: string; + }, + ) { registerCallback('pre-chat-form-submit', fn); }, - onOfflineFormSubmit(fn) { + onOfflineFormSubmit( + fn: () => { + name: string; + email: string; + department?: string; + message: string; + }, + ) { registerCallback('offline-form-submit', fn); }, - onWidgetShown(fn) { + onWidgetShown(fn: () => void) { registerCallback('show-widget', fn); }, - onWidgetHidden(fn) { + onWidgetHidden(fn: () => void) { registerCallback('hide-widget', fn); }, - onAssignAgent(fn) { + onAssignAgent( + fn: () => { + name: string | undefined; + username: string | undefined; + status: UserStatus | undefined; + }, + ) { registerCallback('assign-agent', fn); }, - onAgentStatusChange(fn) { + onAgentStatusChange( + fn: () => { + name: string | undefined; + username: string | undefined; + status: UserStatus | undefined; + }, + ) { registerCallback('agent-status-change', fn); }, - onQueuePositionChange(fn) { + onQueuePositionChange(fn: () => LivechatRoomEvents<'queueData' | 'agentData'>) { registerCallback('queue-position-change', fn); }, - onServiceOffline(fn) { + onServiceOffline(fn: () => void) { registerCallback('no-agent-online', fn); }, }; +const currentPage: { href: string | null; title: string | null } = { + href: null, + title: null, +}; + +function onNewMessage(event: MessageEvent>>) { + if (event.source === event.target) { + return; + } + + if (!event.data || typeof event.data !== 'object') { + return; + } + + if (!event.data.src || event.data.src !== 'rocketchat') { + return; + } + + const { fn, args } = event.data; + + if (!api.hasOwnProperty(fn)) { + return; + } + + // There is an existing issue with overload resolution with type union arguments please see https://github.com/microsoft/TypeScript/issues/14107 + // @ts-expect-error: A spread argument must either have a tuple type or be passed to a rest parameter + api[fn](...args); +} + +const attachMessageListener = () => { + window.addEventListener('message', onNewMessage, false); +}; + +const trackNavigation = () => { + setInterval(() => { + if (document.location.href !== currentPage.href) { + pageVisited('url'); + currentPage.href = document.location.href; + } + + if (document.title !== currentPage.title) { + pageVisited('title'); + currentPage.title = document.title; + } + }, 800); +}; + +const init = (url: string) => { + const trimmedUrl = url.trim(); + if (!trimmedUrl) { + return; + } + + config.url = trimmedUrl; + + createWidget(trimmedUrl); + attachMessageListener(); + trackNavigation(); +}; + +if (typeof window.initRocket !== 'undefined') { + console.warn('initRocket is now deprecated. Please update the livechat code.'); + init(window.initRocket[0]); +} + +if (typeof window.RocketChat.url !== 'undefined') { + init(window.RocketChat.url); +} + +const queue = window.RocketChat._; + +window.RocketChat._.push = function (c: () => void) { + c.call(window.RocketChat.livechat); +}; + +window.RocketChat = window.RocketChat._.push; + +// exports +window.RocketChat.livechat = livechatWidgetAPI; + // proccess queue -queue.forEach((c) => { +queue.forEach((c: () => void) => { c.call(window.RocketChat.livechat); }); diff --git a/packages/livechat/webpack.config.ts b/packages/livechat/webpack.config.ts index 24bd213a43866..a33660198e878 100644 --- a/packages/livechat/webpack.config.ts +++ b/packages/livechat/webpack.config.ts @@ -162,7 +162,7 @@ const config = (_env: any, args: webpack.WebpackOptionsNormalized): webpack.Conf { ...common(args), entry: { - 'rocketchat-livechat.min': _('./src/widget.js'), + 'rocketchat-livechat.min': _('./src/widget.ts'), } as webpack.Entry, output: { path: _('./dist'), From 8a59f100573f01ec85f4b7e67c6da5ee5f8559f3 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Thu, 29 Feb 2024 15:03:09 -0300 Subject: [PATCH 06/23] chore: Upgrade `react-virtuoso` (#31843) --- .../CustomScrollbars.tsx} | 42 +++++++--------- .../CustomScrollbars/VirtuosoScrollbars.tsx | 23 +++++++++ .../components/CustomScrollbars/index.ts | 3 ++ .../components/GenericTable/GenericTable.tsx | 6 +-- .../components/Page/PageScrollableContent.tsx | 8 +-- .../client/components/Sidebar/Content.tsx | 6 +-- .../client/sidebar/RoomList/RoomList.tsx | 4 +- .../RoomList/ScrollerWithCustomProps.tsx | 21 -------- .../FederatedRoomList.tsx | 4 +- .../search/ScrollerWithCustomProps.tsx | 17 ------- .../client/sidebar/search/SearchList.tsx | 4 +- .../history/OutgoingWebhookHistoryPage.tsx | 6 +-- .../composer/EmojiPicker/CategoriesResult.tsx | 6 +-- .../composer/EmojiPicker/SearchingResult.tsx | 4 +- .../contactHistory/ContactHistoryList.tsx | 4 +- .../ContactHistoryMessagesList.tsx | 4 +- .../OutlookEventsList/OutlookEventsList.tsx | 4 +- .../client/views/room/body/RoomBody.tsx | 6 +-- .../Discussions/DiscussionsList.tsx | 4 +- .../room/contextualBar/MessageListTab.tsx | 4 +- .../components/MessageSearch.tsx | 4 +- .../contextualBar/RoomFiles/RoomFiles.tsx | 4 +- .../contextualBar/RoomMembers/RoomMembers.tsx | 4 +- .../room/contextualBar/Threads/ThreadList.tsx | 4 +- .../Threads/components/ThreadMessageList.tsx | 10 ++-- .../VideoConfList/VideoConfList.tsx | 4 +- .../channels/BaseTeamsChannels.tsx | 4 +- .../CannedResponse/CannedResponseList.tsx | 4 +- apps/meteor/package.json | 2 +- packages/uikit-playground/package.json | 2 +- yarn.lock | 50 +++---------------- 31 files changed, 106 insertions(+), 166 deletions(-) rename apps/meteor/client/components/{ScrollableContentWrapper.tsx => CustomScrollbars/CustomScrollbars.tsx} (57%) create mode 100644 apps/meteor/client/components/CustomScrollbars/VirtuosoScrollbars.tsx create mode 100644 apps/meteor/client/components/CustomScrollbars/index.ts delete mode 100644 apps/meteor/client/sidebar/RoomList/ScrollerWithCustomProps.tsx delete mode 100644 apps/meteor/client/sidebar/search/ScrollerWithCustomProps.tsx diff --git a/apps/meteor/client/components/ScrollableContentWrapper.tsx b/apps/meteor/client/components/CustomScrollbars/CustomScrollbars.tsx similarity index 57% rename from apps/meteor/client/components/ScrollableContentWrapper.tsx rename to apps/meteor/client/components/CustomScrollbars/CustomScrollbars.tsx index 16964e07426dd..c98dcb0d7e652 100644 --- a/apps/meteor/client/components/ScrollableContentWrapper.tsx +++ b/apps/meteor/client/components/CustomScrollbars/CustomScrollbars.tsx @@ -1,15 +1,7 @@ import type { ScrollValues } from 'rc-scrollbars'; import { Scrollbars } from 'rc-scrollbars'; import type { MutableRefObject, CSSProperties, ReactNode, ReactElement } from 'react'; -import React, { useMemo, memo, forwardRef } from 'react'; - -const styleDefault: CSSProperties = { - width: '100%', - height: '100%', - flexGrow: 1, - willChange: 'transform', - overflowY: 'hidden', -}; +import React, { memo, forwardRef, useCallback } from 'react'; export type CustomScrollbarsProps = { overflowX?: boolean; @@ -21,11 +13,23 @@ export type CustomScrollbarsProps = { autoHide?: boolean; }; -const ScrollableContentWrapper = forwardRef(function ScrollableContentWrapper( - { children, style, onScroll, overflowX, renderView, ...props }, +const CustomScrollbars = forwardRef(function CustomScrollbars( + { children, onScroll, overflowX, renderView, ...props }, ref, ) { - const scrollbarsStyle = useMemo((): CSSProperties => ({ ...style, ...styleDefault }), [style]); + const refSetter = useCallback( + (scrollbarRef) => { + if (ref && scrollbarRef) { + if (typeof ref === 'function') { + ref(scrollbarRef.view ?? null); + return; + } + + (ref as MutableRefObject).current = scrollbarRef.view; + } + }, + [ref], + ); return ( ( autoHide autoHideTimeout={2000} autoHideDuration={500} - style={scrollbarsStyle} onScrollFrame={onScroll} renderView={renderView} renderTrackHorizontal={ @@ -43,18 +46,9 @@ const ScrollableContentWrapper = forwardRef(
)} children={children} - ref={(sRef): void => { - if (ref && sRef) { - if (typeof ref === 'function') { - ref(sRef.view ?? null); - return; - } - - (ref as MutableRefObject).current = sRef.view; - } - }} + ref={refSetter} /> ); }); -export default memo(ScrollableContentWrapper); +export default memo(CustomScrollbars); diff --git a/apps/meteor/client/components/CustomScrollbars/VirtuosoScrollbars.tsx b/apps/meteor/client/components/CustomScrollbars/VirtuosoScrollbars.tsx new file mode 100644 index 0000000000000..a7d0371e4ab8b --- /dev/null +++ b/apps/meteor/client/components/CustomScrollbars/VirtuosoScrollbars.tsx @@ -0,0 +1,23 @@ +import type { ComponentProps, ReactElement, Ref } from 'react'; +import React, { forwardRef } from 'react'; + +import CustomScrollbars from './CustomScrollbars'; + +type VirtuosoScrollbarsProps = ComponentProps; + +const VirtuosoScrollbars = forwardRef(function VirtuosoScrollbars( + { style, children, ...props }: VirtuosoScrollbarsProps, + ref: Ref, +): ReactElement { + return ( +
} + > + {children} + + ); +}); + +export default VirtuosoScrollbars; diff --git a/apps/meteor/client/components/CustomScrollbars/index.ts b/apps/meteor/client/components/CustomScrollbars/index.ts new file mode 100644 index 0000000000000..176bb6f81657f --- /dev/null +++ b/apps/meteor/client/components/CustomScrollbars/index.ts @@ -0,0 +1,3 @@ +export { default as CustomScrollbars } from './CustomScrollbars'; +export { default as VirtuosoScrollbars } from './VirtuosoScrollbars'; +export * from './CustomScrollbars'; diff --git a/apps/meteor/client/components/GenericTable/GenericTable.tsx b/apps/meteor/client/components/GenericTable/GenericTable.tsx index 6fa3f247aa29b..05173fbe7004b 100644 --- a/apps/meteor/client/components/GenericTable/GenericTable.tsx +++ b/apps/meteor/client/components/GenericTable/GenericTable.tsx @@ -2,7 +2,7 @@ import { Box, Table } from '@rocket.chat/fuselage'; import type { ComponentProps } from 'react'; import React, { type ForwardedRef, type ReactNode, forwardRef } from 'react'; -import ScrollableContentWrapper from '../ScrollableContentWrapper'; +import { CustomScrollbars } from '../CustomScrollbars'; type GenericTableProps = { fixed?: boolean; @@ -15,11 +15,11 @@ export const GenericTable = forwardRef(function GenericTable( ) { return ( - + {children}
-
+
); }); diff --git a/apps/meteor/client/components/Page/PageScrollableContent.tsx b/apps/meteor/client/components/Page/PageScrollableContent.tsx index 0bd954864d23d..b1731f4eb0f6e 100644 --- a/apps/meteor/client/components/Page/PageScrollableContent.tsx +++ b/apps/meteor/client/components/Page/PageScrollableContent.tsx @@ -3,8 +3,8 @@ import { Box } from '@rocket.chat/fuselage'; import type { ComponentProps } from 'react'; import React, { forwardRef } from 'react'; -import type { CustomScrollbarsProps } from '../ScrollableContentWrapper'; -import ScrollableContentWrapper from '../ScrollableContentWrapper'; +import type { CustomScrollbarsProps } from '../CustomScrollbars'; +import { CustomScrollbars } from '../CustomScrollbars'; type PageScrollableContentProps = { onScrollContent?: ComponentProps['onScrollContent']; @@ -24,9 +24,9 @@ const PageScrollableContent = forwardRef - + - + ); }); diff --git a/apps/meteor/client/components/Sidebar/Content.tsx b/apps/meteor/client/components/Sidebar/Content.tsx index 1057e00fe9fe6..bccdec01b7d9e 100644 --- a/apps/meteor/client/components/Sidebar/Content.tsx +++ b/apps/meteor/client/components/Sidebar/Content.tsx @@ -2,15 +2,15 @@ import { Box } from '@rocket.chat/fuselage'; import type { FC } from 'react'; import React from 'react'; -import ScrollableContentWrapper from '../ScrollableContentWrapper'; +import { CustomScrollbars } from '../CustomScrollbars'; const Content: FC = ({ children, ...props }) => ( - + {children} - + ); diff --git a/apps/meteor/client/sidebar/RoomList/RoomList.tsx b/apps/meteor/client/sidebar/RoomList/RoomList.tsx index 42c096c8a1755..8dc44dcb73adb 100644 --- a/apps/meteor/client/sidebar/RoomList/RoomList.tsx +++ b/apps/meteor/client/sidebar/RoomList/RoomList.tsx @@ -7,6 +7,7 @@ import type { ReactElement } from 'react'; import React, { useMemo } from 'react'; import { Virtuoso } from 'react-virtuoso'; +import { VirtuosoScrollbars } from '../../components/CustomScrollbars'; import { useOpenedRoom } from '../../lib/RoomManager'; import { useAvatarTemplate } from '../hooks/useAvatarTemplate'; import { usePreventDefault } from '../hooks/usePreventDefault'; @@ -14,7 +15,6 @@ import { useRoomList } from '../hooks/useRoomList'; import { useShortcutOpenMenu } from '../hooks/useShortcutOpenMenu'; import { useTemplateByViewMode } from '../hooks/useTemplateByViewMode'; import RoomListRow from './RoomListRow'; -import ScrollerWithCustomProps from './ScrollerWithCustomProps'; const computeItemKey = (index: number, room: IRoom): IRoom['_id'] | number => room._id || index; @@ -121,7 +121,7 @@ const RoomList = (): ReactElement => { } /> diff --git a/apps/meteor/client/sidebar/RoomList/ScrollerWithCustomProps.tsx b/apps/meteor/client/sidebar/RoomList/ScrollerWithCustomProps.tsx deleted file mode 100644 index 20fc675378e40..0000000000000 --- a/apps/meteor/client/sidebar/RoomList/ScrollerWithCustomProps.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { ComponentProps, ReactElement, Ref } from 'react'; -import React, { forwardRef } from 'react'; - -import ScrollableContentWrapper from '../../components/ScrollableContentWrapper'; - -type ScrollerWithCustomPropsProps = ComponentProps; - -export default forwardRef(function ScrollerWithCustomProps( - { style, ...props }: ScrollerWithCustomPropsProps, - ref: Ref, -): ReactElement { - return ( -
} - renderTrackHorizontal={(props): ReactElement =>
} - /> - ); -}); diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomList.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomList.tsx index 7584733a70229..61984030429dc 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomList.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomList.tsx @@ -6,7 +6,7 @@ import type { VFC } from 'react'; import React from 'react'; import { Virtuoso } from 'react-virtuoso'; -import ScrollableContentWrapper from '../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../components/CustomScrollbars'; import { roomCoordinator } from '../../../lib/rooms/roomCoordinator'; import FederatedRoomListEmptyPlaceholder from './FederatedRoomListEmptyPlaceholder'; import FederatedRoomListItem from './FederatedRoomListItem'; @@ -68,7 +68,7 @@ const FederatedRoomList: VFC = ({ serverName, roomName, components={{ // eslint-disable-next-line react/no-multi-comp Footer: () => (isFetchingNextPage ? : null), - Scroller: ScrollableContentWrapper, + Scroller: VirtuosoScrollbars, EmptyPlaceholder: FederatedRoomListEmptyPlaceholder, }} endReached={isLoading || isFetchingNextPage ? () => undefined : () => fetchNextPage()} diff --git a/apps/meteor/client/sidebar/search/ScrollerWithCustomProps.tsx b/apps/meteor/client/sidebar/search/ScrollerWithCustomProps.tsx deleted file mode 100644 index 176eed7c4f1f9..0000000000000 --- a/apps/meteor/client/sidebar/search/ScrollerWithCustomProps.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import type { ReactElement } from 'react'; -import React, { forwardRef } from 'react'; - -import ScrollableContentWrapper from '../../components/ScrollableContentWrapper'; - -const ScrollerWithCustomProps = forwardRef(function ScrollerWithCustomProps(props, ref: React.Ref) { - return ( -
} - renderTrackHorizontal={(props): ReactElement =>
} - /> - ); -}); - -export default ScrollerWithCustomProps; diff --git a/apps/meteor/client/sidebar/search/SearchList.tsx b/apps/meteor/client/sidebar/search/SearchList.tsx index 82d6d12c62138..ceb89d3d7092a 100644 --- a/apps/meteor/client/sidebar/search/SearchList.tsx +++ b/apps/meteor/client/sidebar/search/SearchList.tsx @@ -12,12 +12,12 @@ import type { VirtuosoHandle } from 'react-virtuoso'; import { Virtuoso } from 'react-virtuoso'; import tinykeys from 'tinykeys'; +import { VirtuosoScrollbars } from '../../components/CustomScrollbars'; import { getConfig } from '../../lib/utils/getConfig'; import { useAvatarTemplate } from '../hooks/useAvatarTemplate'; import { usePreventDefault } from '../hooks/usePreventDefault'; import { useTemplateByViewMode } from '../hooks/useTemplateByViewMode'; import Row from './Row'; -import ScrollerWithCustomProps from './ScrollerWithCustomProps'; const mobileCheck = function () { let check = false; @@ -366,7 +366,7 @@ const SearchList = forwardRef(function SearchList({ onClose }: SearchListProps, style={{ height: '100%', width: '100%' }} totalCount={items.length} data={items} - components={{ Scroller: ScrollerWithCustomProps }} + components={{ Scroller: VirtuosoScrollbars }} computeItemKey={(_, room) => room._id} itemContent={(_, data): ReactElement => } ref={listRef} diff --git a/apps/meteor/client/views/admin/integrations/outgoing/history/OutgoingWebhookHistoryPage.tsx b/apps/meteor/client/views/admin/integrations/outgoing/history/OutgoingWebhookHistoryPage.tsx index 8b7b96d711f89..ac05b3bf0ddd7 100644 --- a/apps/meteor/client/views/admin/integrations/outgoing/history/OutgoingWebhookHistoryPage.tsx +++ b/apps/meteor/client/views/admin/integrations/outgoing/history/OutgoingWebhookHistoryPage.tsx @@ -5,9 +5,9 @@ import type { ComponentProps } from 'react'; import React, { useMemo, useState, useEffect } from 'react'; import { sdk } from '../../../../../../app/utils/client/lib/SDKClient'; +import { CustomScrollbars } from '../../../../../components/CustomScrollbars'; import { usePagination } from '../../../../../components/GenericTable/hooks/usePagination'; import { Page, PageHeader, PageContent } from '../../../../../components/Page'; -import ScrollableContentWrapper from '../../../../../components/ScrollableContentWrapper'; import HistoryContent from './HistoryContent'; const OutgoingWebhookHistoryPage = (props: ComponentProps) => { @@ -117,9 +117,9 @@ const OutgoingWebhookHistoryPage = (props: ComponentProps) => { - + - + void; handleSelectEmoji: (event: MouseEvent) => void; - handleScroll: UIEventHandler<'div'>; + handleScroll: UIEventHandler; }; const CategoriesResult = forwardRef(function CategoriesResult( @@ -39,7 +39,7 @@ const CategoriesResult = forwardRef(funct totalCount={emojiListByCategory.length} data={emojiListByCategory} onScroll={handleScroll} - components={{ Scroller: ScrollableContentWrapper }} + components={{ Scroller: VirtuosoScrollbars }} isScrolling={(isScrolling: boolean) => { if (!wrapper.current) { return; diff --git a/apps/meteor/client/views/composer/EmojiPicker/SearchingResult.tsx b/apps/meteor/client/views/composer/EmojiPicker/SearchingResult.tsx index a229ab2717e4f..a42e1b0580b34 100644 --- a/apps/meteor/client/views/composer/EmojiPicker/SearchingResult.tsx +++ b/apps/meteor/client/views/composer/EmojiPicker/SearchingResult.tsx @@ -6,7 +6,7 @@ import type { VirtuosoGridHandle } from 'react-virtuoso'; import { VirtuosoGrid } from 'react-virtuoso'; import type { EmojiItem } from '../../../../app/emoji/client'; -import ScrollableContentWrapper from '../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../components/CustomScrollbars'; import EmojiElement from './EmojiElement'; import SearchingResultWrapper from './SearchingResultWrapper'; @@ -33,7 +33,7 @@ const SearchingResult = ({ searchResults, handleSelectEmoji }: SearchingResultPr ref={ref} totalCount={searchResults.length} components={{ - Scroller: ScrollableContentWrapper, + Scroller: VirtuosoScrollbars, List: SearchingResultWrapper, }} itemContent={(index) => { diff --git a/apps/meteor/client/views/omnichannel/contactHistory/ContactHistoryList.tsx b/apps/meteor/client/views/omnichannel/contactHistory/ContactHistoryList.tsx index 3281e4ff2f28f..ba25d511e1a87 100644 --- a/apps/meteor/client/views/omnichannel/contactHistory/ContactHistoryList.tsx +++ b/apps/meteor/client/views/omnichannel/contactHistory/ContactHistoryList.tsx @@ -12,7 +12,7 @@ import { ContextualbarClose, ContextualbarEmptyContent, } from '../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../components/CustomScrollbars'; import { useRecordList } from '../../../hooks/lists/useRecordList'; import { AsyncStatePhase } from '../../../lib/asyncState'; import { useOmnichannelRoom } from '../../room/contexts/RoomContext'; @@ -86,7 +86,7 @@ const ContactHistoryList = ({ setChatId, close }: { setChatId: Dispatch } /> )} diff --git a/apps/meteor/client/views/omnichannel/contactHistory/MessageList/ContactHistoryMessagesList.tsx b/apps/meteor/client/views/omnichannel/contactHistory/MessageList/ContactHistoryMessagesList.tsx index 80e042273a06c..3bf6385a19a0f 100644 --- a/apps/meteor/client/views/omnichannel/contactHistory/MessageList/ContactHistoryMessagesList.tsx +++ b/apps/meteor/client/views/omnichannel/contactHistory/MessageList/ContactHistoryMessagesList.tsx @@ -13,7 +13,7 @@ import { ContextualbarContent, ContextualbarEmptyContent, } from '../../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../../components/CustomScrollbars'; import { useRecordList } from '../../../../hooks/lists/useRecordList'; import { AsyncStatePhase } from '../../../../lib/asyncState'; import { isMessageNewDay } from '../../../room/MessageList/lib/isMessageNewDay'; @@ -98,7 +98,7 @@ const ContactHistoryMessagesList = ({ } overscan={25} data={messages} - components={{ Scroller: ScrollableContentWrapper as any }} + components={{ Scroller: VirtuosoScrollbars }} itemContent={(index, data): ReactElement => { const lastMessage = messages[index - 1]; const isSequential = isMessageSequential(data, lastMessage, messageGroupingPeriod); diff --git a/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx b/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx index 47d2d77668cd3..286028e0059d7 100644 --- a/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx +++ b/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx @@ -14,7 +14,7 @@ import { ContextualbarFooter, ContextualbarSkeleton, } from '../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../components/CustomScrollbars'; import { getErrorMessage } from '../../../lib/errorHandling'; import { useOutlookAuthentication } from '../hooks/useOutlookAuthentication'; import { useMutationOutlookCalendarSync, useOutlookCalendarListForToday } from '../hooks/useOutlookCalendarList'; @@ -108,7 +108,7 @@ const OutlookEventsList = ({ onClose, changeRoute }: OutlookEventsListProps): Re totalCount={total} overscan={25} data={calendarEvents} - components={{ Scroller: ScrollableContentWrapper }} + components={{ Scroller: VirtuosoScrollbars }} itemContent={(_index, calendarData): ReactElement => } /> diff --git a/apps/meteor/client/views/room/body/RoomBody.tsx b/apps/meteor/client/views/room/body/RoomBody.tsx index 983695b1fa70c..5dd6d9e6bb671 100644 --- a/apps/meteor/client/views/room/body/RoomBody.tsx +++ b/apps/meteor/client/views/room/body/RoomBody.tsx @@ -20,7 +20,7 @@ import { isAtBottom } from '../../../../app/ui/client/views/app/lib/scrolling'; import { callbacks } from '../../../../lib/callbacks'; import { isTruthy } from '../../../../lib/isTruthy'; import { withDebouncing, withThrottling } from '../../../../lib/utils/highOrderFunctions'; -import ScrollableContentWrapper from '../../../components/ScrollableContentWrapper'; +import { CustomScrollbars } from '../../../components/CustomScrollbars'; import { useEmbeddedLayout } from '../../../hooks/useEmbeddedLayout'; import { useReactiveQuery } from '../../../hooks/useReactiveQuery'; import { RoomManager } from '../../../lib/RoomManager'; @@ -604,7 +604,7 @@ const RoomBody = (): ReactElement => { .join(' ')} > - +
    {
  • {isLoadingMoreMessages ? : null}
  • ) : null}
-
+
diff --git a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx index bad42d57dce4c..e521a263372b8 100644 --- a/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx +++ b/apps/meteor/client/views/room/contextualBar/Discussions/DiscussionsList.tsx @@ -13,7 +13,7 @@ import { ContextualbarClose, ContextualbarEmptyContent, } from '../../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../../components/CustomScrollbars'; import { goToRoomById } from '../../../../lib/utils/goToRoomById'; import DiscussionsListRow from './DiscussionsListRow'; @@ -106,7 +106,7 @@ function DiscussionsList({ endReached={loading ? () => undefined : (start) => loadMoreItems(start, Math.min(50, total - start))} overscan={25} data={discussions} - components={{ Scroller: ScrollableContentWrapper }} + components={{ Scroller: VirtuosoScrollbars }} itemContent={(_, data) => ( )} diff --git a/apps/meteor/client/views/room/contextualBar/MessageListTab.tsx b/apps/meteor/client/views/room/contextualBar/MessageListTab.tsx index 2cac2a84c1cbe..bd6c8da508aff 100644 --- a/apps/meteor/client/views/room/contextualBar/MessageListTab.tsx +++ b/apps/meteor/client/views/room/contextualBar/MessageListTab.tsx @@ -17,7 +17,7 @@ import { ContextualbarClose, ContextualbarEmptyContent, } from '../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../components/CustomScrollbars'; import RoomMessage from '../../../components/message/variants/RoomMessage'; import SystemMessage from '../../../components/message/variants/SystemMessage'; import { useFormatDate } from '../../../hooks/useFormatDate'; @@ -71,7 +71,7 @@ const MessageListTab = ({ iconName, title, emptyResultMessage, context, queryRes totalCount={queryResult.data.length} overscan={25} data={queryResult.data} - components={{ Scroller: ScrollableContentWrapper }} + components={{ Scroller: VirtuosoScrollbars }} itemContent={(index, message) => { const previous = queryResult.data[index - 1]; diff --git a/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearch.tsx b/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearch.tsx index e3c8753a22822..576502fa357df 100644 --- a/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearch.tsx +++ b/apps/meteor/client/views/room/contextualBar/MessageSearchTab/components/MessageSearch.tsx @@ -6,7 +6,7 @@ import { Virtuoso } from 'react-virtuoso'; import { MessageTypes } from '../../../../../../app/ui-utils/client'; import { ContextualbarEmptyContent } from '../../../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../../../components/CustomScrollbars'; import RoomMessage from '../../../../../components/message/variants/RoomMessage'; import SystemMessage from '../../../../../components/message/variants/SystemMessage'; import { useFormatDate } from '../../../../../hooks/useFormatDate'; @@ -45,7 +45,7 @@ const MessageSearch = ({ searchText, globalSearch }: MessageSearchProps): ReactE totalCount={messageSearchQuery.data.length} overscan={25} data={messageSearchQuery.data} - components={{ Scroller: ScrollableContentWrapper }} + components={{ Scroller: VirtuosoScrollbars }} itemContent={(index, message) => { const previous = messageSearchQuery.data[index - 1]; diff --git a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.tsx b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.tsx index a04c4f71dc3ec..b18fc41e41dac 100644 --- a/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.tsx +++ b/apps/meteor/client/views/room/contextualBar/RoomFiles/RoomFiles.tsx @@ -14,7 +14,7 @@ import { ContextualbarContent, ContextualbarEmptyContent, } from '../../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../../components/CustomScrollbars'; import FileItem from './components/FileItem'; type RoomFilesProps = { @@ -97,7 +97,7 @@ const RoomFiles = ({ endReached={(start) => loadMoreItems(start, Math.min(50, total - start))} overscan={50} data={filesItems} - components={{ Scroller: ScrollableContentWrapper }} + components={{ Scroller: VirtuosoScrollbars }} itemContent={(_, data) => } /> diff --git a/apps/meteor/client/views/room/contextualBar/RoomMembers/RoomMembers.tsx b/apps/meteor/client/views/room/contextualBar/RoomMembers/RoomMembers.tsx index 816bab42a192c..cdbd8329eaa12 100644 --- a/apps/meteor/client/views/room/contextualBar/RoomMembers/RoomMembers.tsx +++ b/apps/meteor/client/views/room/contextualBar/RoomMembers/RoomMembers.tsx @@ -16,8 +16,8 @@ import { ContextualbarFooter, ContextualbarEmptyContent, } from '../../../../components/Contextualbar'; +import { VirtuosoScrollbars } from '../../../../components/CustomScrollbars'; import InfiniteListAnchor from '../../../../components/InfiniteListAnchor'; -import ScrollableContentWrapper from '../../../../components/ScrollableContentWrapper'; import RoomMembersRow from './RoomMembersRow'; type RoomMemberUser = Pick; @@ -138,7 +138,7 @@ const RoomMembers = ({ overscan={50} data={members} // eslint-disable-next-line react/no-multi-comp - components={{ Scroller: ScrollableContentWrapper, Footer: () => }} + components={{ Scroller: VirtuosoScrollbars, Footer: () => }} itemContent={(index, data): ReactElement => ( )} diff --git a/apps/meteor/client/views/room/contextualBar/Threads/ThreadList.tsx b/apps/meteor/client/views/room/contextualBar/Threads/ThreadList.tsx index 063cb8cc47684..575aefbda14b4 100644 --- a/apps/meteor/client/views/room/contextualBar/Threads/ThreadList.tsx +++ b/apps/meteor/client/views/room/contextualBar/Threads/ThreadList.tsx @@ -14,7 +14,7 @@ import { ContextualbarTitle, ContextualbarEmptyContent, } from '../../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../../components/CustomScrollbars'; import { useRecordList } from '../../../../hooks/lists/useRecordList'; import { AsyncStatePhase } from '../../../../lib/asyncState'; import type { ThreadsListOptions } from '../../../../lib/lists/ThreadsList'; @@ -181,7 +181,7 @@ const ThreadList: VFC = () => { } overscan={25} data={items} - components={{ Scroller: ScrollableContentWrapper }} + components={{ Scroller: VirtuosoScrollbars }} itemContent={(_index, data: IMessage): ReactElement => ( - +
    {loading ? (
  • @@ -121,7 +117,7 @@ const ThreadMessageList = ({ mainMessage }: ThreadMessageListProps): ReactElemen )}
-
+
); }; diff --git a/apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfList.tsx b/apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfList.tsx index 132a3a0d58574..33f60b24752df 100644 --- a/apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfList.tsx +++ b/apps/meteor/client/views/room/contextualBar/VideoConference/VideoConfList/VideoConfList.tsx @@ -15,7 +15,7 @@ import { ContextualbarContent, ContextualbarEmptyContent, } from '../../../../../components/Contextualbar'; -import ScrollableContentWrapper from '../../../../../components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../../../components/CustomScrollbars'; import { getErrorMessage } from '../../../../../lib/errorHandling'; import VideoConfListItem from './VideoConfListItem'; @@ -78,7 +78,7 @@ const VideoConfList = ({ onClose, total, videoConfs, loading, error, reload, loa endReached={(start): unknown => loadMoreItems(start, Math.min(50, total - start))} overscan={25} data={videoConfs} - components={{ Scroller: ScrollableContentWrapper as any }} + components={{ Scroller: VirtuosoScrollbars }} itemContent={(_index, data): ReactElement => } /> diff --git a/apps/meteor/client/views/teams/contextualBar/channels/BaseTeamsChannels.tsx b/apps/meteor/client/views/teams/contextualBar/channels/BaseTeamsChannels.tsx index e94b2ac9a2fbc..ed0a83d39fce3 100644 --- a/apps/meteor/client/views/teams/contextualBar/channels/BaseTeamsChannels.tsx +++ b/apps/meteor/client/views/teams/contextualBar/channels/BaseTeamsChannels.tsx @@ -16,8 +16,8 @@ import { ContextualbarFooter, ContextualbarEmptyContent, } from '../../../../components/Contextualbar'; +import { VirtuosoScrollbars } from '../../../../components/CustomScrollbars'; import InfiniteListAnchor from '../../../../components/InfiniteListAnchor'; -import ScrollableContentWrapper from '../../../../components/ScrollableContentWrapper'; import Row from './Row'; type BaseTeamsChannelsProps = { @@ -125,7 +125,7 @@ const BaseTeamsChannels = ({ totalCount={total} data={channels} // eslint-disable-next-line react/no-multi-comp - components={{ Scroller: ScrollableContentWrapper, Footer: () => }} + components={{ Scroller: VirtuosoScrollbars, Footer: () => }} itemContent={(index, data) => } /> diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.tsx index dd8b078c82da6..b9d3e57e31de1 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/contextualBar/CannedResponse/CannedResponseList.tsx @@ -14,7 +14,7 @@ import { ContextualbarInnerContent, ContextualbarFooter, } from '../../../../../../client/components/Contextualbar'; -import ScrollableContentWrapper from '../../../../../../client/components/ScrollableContentWrapper'; +import { VirtuosoScrollbars } from '../../../../../../client/components/CustomScrollbars'; import { useRoomToolbox } from '../../../../../../client/views/room/contexts/RoomToolboxContext'; import Item from './Item'; import WrapCannedResponse from './WrapCannedResponse'; @@ -97,7 +97,7 @@ const CannedResponseList: FC<{ overscan={25} data={cannedItems} components={{ - Scroller: ScrollableContentWrapper, + Scroller: VirtuosoScrollbars, }} itemContent={(_index, data): ReactElement => ( =16" - checksum: 173e91c21f6a8cd506ad3b72af10656897fe1951124ed9eeb1fd85575534993bea2f97cba3f81c08ae1e88a2613df348e2c80d0ceecb3021f8c8c8fe0e053ee2 - languageName: node - linkType: hard - -"@virtuoso.dev/urx@npm:^0.2.13, @virtuoso.dev/urx@npm:^0.2.5": - version: 0.2.13 - resolution: "@virtuoso.dev/urx@npm:0.2.13" - checksum: 682a99cf40ccc429241268dd37495cd1ed4695ae58b5a1169c75df1630d5dc3fd8eb3aaa655f71c37f39ba9c23c0aaf4401b76d8a986986d1a38a422d596a6ba - languageName: node - linkType: hard - "@vitejs/plugin-react@npm:^4.0.0": version: 4.0.0 resolution: "@vitejs/plugin-react@npm:4.0.0" @@ -35125,26 +35107,13 @@ __metadata: languageName: node linkType: hard -"react-virtuoso@npm:^1.11.1": - version: 1.11.1 - resolution: "react-virtuoso@npm:1.11.1" - dependencies: - "@virtuoso.dev/react-urx": ^0.2.5 - "@virtuoso.dev/urx": ^0.2.5 - resize-observer-polyfill: ^1.5.1 - peerDependencies: - react: ">=16" - checksum: 05c66c8c543c029de94df92904aa7fb86f4beb3354348e03a7c3a109ea01de35b5861df1a7d58b29819daf81df10c9f88b45c88313ecbf872bb7db5503cf4bf8 - languageName: node - linkType: hard - -"react-virtuoso@npm:^4.3.10": - version: 4.3.10 - resolution: "react-virtuoso@npm:4.3.10" +"react-virtuoso@npm:^4.7.1": + version: 4.7.1 + resolution: "react-virtuoso@npm:4.7.1" peerDependencies: react: ">=16 || >=17 || >= 18" react-dom: ">=16 || >=17 || >= 18" - checksum: 1a2747d4b5abcba114ad9a27db4a4057464219c84cef4ae032460ab44f304073e4a115f56f93658844a4e3f76feb8175536618555ecf201bfd61e627a3e8cfb4 + checksum: c864095bd875825c2ce25b69f165fe29ad7bea2d54c31b407b3b99347f6b68311a6928566369f45641cd2f5a6e8540fbafca87d808c0495c12196cb1665145d5 languageName: node linkType: hard @@ -35919,13 +35888,6 @@ __metadata: languageName: node linkType: hard -"resize-observer-polyfill@npm:^1.5.1": - version: 1.5.1 - resolution: "resize-observer-polyfill@npm:1.5.1" - checksum: 57e7f79489867b00ba43c9c051524a5c8f162a61d5547e99333549afc23e15c44fd43f2f318ea0261ea98c0eb3158cca261e6f48d66e1ed1cd1f340a43977094 - languageName: node - linkType: hard - "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" From 8b10c6cf0f48153a1c685bd1c00ac42b1c219166 Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Thu, 29 Feb 2024 16:08:22 -0300 Subject: [PATCH 07/23] fix: Login page breaking when handling not expected errors (#31804) --- .changeset/quick-cheetahs-help.md | 5 +++ .../web-ui-registration/src/LoginForm.tsx | 36 ++++++++++++------- .../web-ui-registration/src/LoginServices.tsx | 4 +-- .../src/LoginServicesButton.tsx | 8 ++--- 4 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 .changeset/quick-cheetahs-help.md diff --git a/.changeset/quick-cheetahs-help.md b/.changeset/quick-cheetahs-help.md new file mode 100644 index 0000000000000..12005d73ec1aa --- /dev/null +++ b/.changeset/quick-cheetahs-help.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/web-ui-registration": patch +--- + +fixed the login page crashing when receiving unexpected errors diff --git a/packages/web-ui-registration/src/LoginForm.tsx b/packages/web-ui-registration/src/LoginForm.tsx index 3290b9f161918..d63886091fa0e 100644 --- a/packages/web-ui-registration/src/LoginForm.tsx +++ b/packages/web-ui-registration/src/LoginForm.tsx @@ -56,7 +56,9 @@ const LOGIN_SUBMIT_ERRORS = { }, } as const; -export type LoginErrors = keyof typeof LOGIN_SUBMIT_ERRORS | 'totp-canceled'; +export type LoginErrors = keyof typeof LOGIN_SUBMIT_ERRORS | 'totp-canceled' | string; + +export type LoginErrorState = [error: LoginErrors, message?: string] | undefined; export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRouter }): ReactElement => { const { @@ -72,7 +74,7 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute const { t } = useTranslation(); const formLabelId = useUniqueId(); - const [errorOnSubmit, setErrorOnSubmit] = useState(undefined); + const [errorOnSubmit, setErrorOnSubmit] = useState(undefined); const isResetPasswordAllowed = useSetting('Accounts_PasswordReset'); const login = useLoginWithPassword(); const showFormLogin = useSetting('Accounts_ShowFormLogin'); @@ -92,11 +94,11 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute } if ('error' in error && error.error !== 403) { - setErrorOnSubmit(error.error); + setErrorOnSubmit([error.error, error.reason]); return; } - setErrorOnSubmit('user-not-found'); + setErrorOnSubmit(['user-not-found']); }, }); @@ -110,18 +112,28 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute } }, [errorOnSubmit]); - const renderErrorOnSubmit = (error: LoginErrors) => { + const renderErrorOnSubmit = ([error, message]: Exclude) => { + if (error in LOGIN_SUBMIT_ERRORS) { + const { type, i18n } = LOGIN_SUBMIT_ERRORS[error as Exclude]; + return ( + + {t(i18n)} + + ); + } + if (error === 'totp-canceled') { return null; } - const { type, i18n } = LOGIN_SUBMIT_ERRORS[error]; - - return ( - - {t(i18n)} - - ); + if (message) { + return ( + + {message} + + ); + } + return null; }; if (errors.usernameOrEmail?.type === 'invalid-email') { diff --git a/packages/web-ui-registration/src/LoginServices.tsx b/packages/web-ui-registration/src/LoginServices.tsx index 530dce7e9438b..a5068fbaac3fc 100644 --- a/packages/web-ui-registration/src/LoginServices.tsx +++ b/packages/web-ui-registration/src/LoginServices.tsx @@ -3,7 +3,7 @@ import { useLoginServices, useSetting } from '@rocket.chat/ui-contexts'; import type { Dispatch, ReactElement, SetStateAction } from 'react'; import { useTranslation } from 'react-i18next'; -import type { LoginErrors } from './LoginForm'; +import type { LoginErrorState } from './LoginForm'; import LoginServicesButton from './LoginServicesButton'; const LoginServices = ({ @@ -11,7 +11,7 @@ const LoginServices = ({ setError, }: { disabled?: boolean; - setError: Dispatch>; + setError: Dispatch>; }): ReactElement | null => { const { t } = useTranslation(); const services = useLoginServices(); diff --git a/packages/web-ui-registration/src/LoginServicesButton.tsx b/packages/web-ui-registration/src/LoginServicesButton.tsx index cdba5e26474e9..d9f43b0e484ca 100644 --- a/packages/web-ui-registration/src/LoginServicesButton.tsx +++ b/packages/web-ui-registration/src/LoginServicesButton.tsx @@ -5,7 +5,7 @@ import { useLoginWithService, useTranslation } from '@rocket.chat/ui-contexts'; import type { ReactElement, SetStateAction, Dispatch } from 'react'; import { useCallback } from 'react'; -import type { LoginErrors } from './LoginForm'; +import type { LoginErrorState, LoginErrors } from './LoginForm'; const LoginServicesButton = ({ buttonLabelText, @@ -19,17 +19,17 @@ const LoginServicesButton = ({ }: T & { className?: string; disabled?: boolean; - setError?: Dispatch>; + setError?: Dispatch>; }): ReactElement => { const t = useTranslation(); const handler = useLoginWithService({ service, buttonLabelText, ...props }); const handleOnClick = useCallback(() => { - handler().catch((e: { error?: LoginErrors }) => { + handler().catch((e: { error?: LoginErrors; reason?: string }) => { if (!e.error || typeof e.error !== 'string') { return; } - setError?.(e.error); + setError?.([e.error, e.reason]); }); }, [handler, setError]); From 86296724a1bf8fdbe354fb9112e4a6d6a32a2d81 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Thu, 29 Feb 2024 18:08:00 -0300 Subject: [PATCH 08/23] chore: `RoomHeader` keyboard navigability (#31837) --- .../client/views/room/Header/ParentRoom.tsx | 9 ++- .../client/views/room/Header/ParentTeam.tsx | 12 ++- .../client/views/room/Header/RoomTitle.tsx | 48 ++++++++--- .../views/room/Header/icons/Favorite.tsx | 28 ++++--- .../client/views/room/body/LeaderBar.tsx | 2 +- .../tests/e2e/channel-management.spec.ts | 79 +++++++++++++++---- apps/meteor/tests/e2e/messaging.spec.ts | 5 +- .../page-objects/fragments/home-content.ts | 2 +- apps/meteor/tests/e2e/team-management.spec.ts | 10 +++ .../components/Header/HeaderTag/HeaderTag.tsx | 2 +- .../components/Header/HeaderTitleButton.tsx | 25 ++++++ .../ui-client/src/components/Header/index.ts | 1 + 12 files changed, 177 insertions(+), 46 deletions(-) create mode 100644 packages/ui-client/src/components/Header/HeaderTitleButton.tsx diff --git a/apps/meteor/client/views/room/Header/ParentRoom.tsx b/apps/meteor/client/views/room/Header/ParentRoom.tsx index 00b181f47df58..3d598cce4c268 100644 --- a/apps/meteor/client/views/room/Header/ParentRoom.tsx +++ b/apps/meteor/client/views/room/Header/ParentRoom.tsx @@ -13,10 +13,15 @@ type ParentRoomProps = { const ParentRoom = ({ room }: ParentRoomProps): ReactElement => { const icon = useRoomIcon(room); - const handleClick = (): void => roomCoordinator.openRouteLink(room.t, { rid: room._id, ...room }); + const handleRedirect = (): void => roomCoordinator.openRouteLink(room.t, { rid: room._id, ...room }); return ( - + (e.code === 'Space' || e.code === 'Enter') && handleRedirect()} + onClick={handleRedirect} + > {roomCoordinator.getRoomName(room.t, room)} diff --git a/apps/meteor/client/views/room/Header/ParentTeam.tsx b/apps/meteor/client/views/room/Header/ParentTeam.tsx index 2f1f15327c79d..33ef98bbe81b2 100644 --- a/apps/meteor/client/views/room/Header/ParentTeam.tsx +++ b/apps/meteor/client/views/room/Header/ParentTeam.tsx @@ -41,11 +41,14 @@ const ParentTeam = ({ room }: { room: IRoom }): ReactElement | null => { const redirectToMainRoom = (): void => { const rid = teamInfoData?.teamInfo.roomId; - if (!rid) { return; } + if (!(isTeamPublic || userBelongsToTeam)) { + return; + } + goToRoomById(rid); }; @@ -58,7 +61,12 @@ const ParentTeam = ({ room }: { room: IRoom }): ReactElement | null => { } return ( - + (e.code === 'Space' || e.code === 'Enter') && redirectToMainRoom()} + onClick={redirectToMainRoom} + > {teamInfoData?.teamInfo.name} diff --git a/apps/meteor/client/views/room/Header/RoomTitle.tsx b/apps/meteor/client/views/room/Header/RoomTitle.tsx index 13b628ab38234..4d81d077c1542 100644 --- a/apps/meteor/client/views/room/Header/RoomTitle.tsx +++ b/apps/meteor/client/views/room/Header/RoomTitle.tsx @@ -1,22 +1,50 @@ -import type { IRoom } from '@rocket.chat/core-typings'; -import { HeaderTitle, useDocumentTitle } from '@rocket.chat/ui-client'; -import type { ReactElement } from 'react'; +import { isTeamRoom, type IRoom } from '@rocket.chat/core-typings'; +import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; +import { HeaderTitle, HeaderTitleButton, useDocumentTitle } from '@rocket.chat/ui-client'; +import type { KeyboardEvent, ReactElement } from 'react'; import React from 'react'; +import { useRoomToolbox } from '../contexts/RoomToolboxContext'; import HeaderIconWithRoom from './HeaderIconWithRoom'; -type RoomTitleProps = { - room: IRoom; -}; - -const RoomTitle = ({ room }: RoomTitleProps): ReactElement => { +const RoomTitle = ({ room }: { room: IRoom }): ReactElement => { useDocumentTitle(room.name, false); + const { openTab } = useRoomToolbox(); + + const handleOpenRoomInfo = useEffectEvent(() => { + if (isTeamRoom(room)) { + return openTab('team-info'); + } + + switch (room.t) { + case 'l': + openTab('room-info'); + break; + + case 'v': + openTab('voip-room-info'); + break; + + case 'd': + (room.uids?.length ?? 0) > 2 ? openTab('user-info-group') : openTab('user-info'); + break; + + default: + openTab('channel-settings'); + break; + } + }); return ( - <> + (e.code === 'Enter' || e.code === 'Space') && handleOpenRoomInfo()} + onClick={() => handleOpenRoomInfo()} + tabIndex={0} + role='button' + > {room.name} - + ); }; diff --git a/apps/meteor/client/views/room/Header/icons/Favorite.tsx b/apps/meteor/client/views/room/Header/icons/Favorite.tsx index f66af3443ed89..4a99a7a0411e2 100644 --- a/apps/meteor/client/views/room/Header/icons/Favorite.tsx +++ b/apps/meteor/client/views/room/Header/icons/Favorite.tsx @@ -1,39 +1,41 @@ import type { IRoom, ISubscription } from '@rocket.chat/core-typings'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { HeaderState } from '@rocket.chat/ui-client'; import { useSetting, useMethod, useTranslation } from '@rocket.chat/ui-contexts'; import React, { memo } from 'react'; import { useUserIsSubscribed } from '../../contexts/RoomContext'; -const Favorite = ({ room: { _id, f: favorite = false, t: type } }: { room: IRoom & { f?: ISubscription['f'] } }) => { +const Favorite = ({ room: { _id, f: favorite = false, t: type, name } }: { room: IRoom & { f?: ISubscription['f'] } }) => { const t = useTranslation(); const subscribed = useUserIsSubscribed(); const isFavoritesEnabled = useSetting('Favorite_Rooms') && ['c', 'p', 'd', 't'].includes(type); const toggleFavorite = useMethod('toggleFavorite'); - const handleFavoriteClick = useMutableCallback(() => { + + const handleFavoriteClick = useEffectEvent(() => { if (!isFavoritesEnabled) { return; } + toggleFavorite(_id, !favorite); }); - const favoriteLabel = favorite ? t('Unfavorite') : t('Favorite'); + + const favoriteLabel = favorite ? `${t('Unfavorite')} ${name}` : `${t('Favorite')} ${name}`; if (!subscribed || !isFavoritesEnabled) { return null; } return ( - isFavoritesEnabled && ( - - ) + ); }; diff --git a/apps/meteor/client/views/room/body/LeaderBar.tsx b/apps/meteor/client/views/room/body/LeaderBar.tsx index 4cf5266b89d8b..bb0ba305633ac 100644 --- a/apps/meteor/client/views/room/body/LeaderBar.tsx +++ b/apps/meteor/client/views/room/body/LeaderBar.tsx @@ -66,7 +66,7 @@ const LeaderBar = ({ _id, name, username, visible, onAvatarClick, triggerProps } className={[roomLeaderStyle, 'room-leader', !visible && 'animated-hidden'].filter(isTruthy)} > - + diff --git a/apps/meteor/tests/e2e/channel-management.spec.ts b/apps/meteor/tests/e2e/channel-management.spec.ts index 96d50bae61514..f767520857710 100644 --- a/apps/meteor/tests/e2e/channel-management.spec.ts +++ b/apps/meteor/tests/e2e/channel-management.spec.ts @@ -11,6 +11,7 @@ test.use({ storageState: Users.admin.state }); test.describe.serial('channel-management', () => { let poHomeChannel: HomeChannel; let targetChannel: string; + let discussionName: string; test.beforeAll(async ({ api }) => { targetChannel = await createTargetChannel(api); @@ -56,7 +57,8 @@ test.describe.serial('channel-management', () => { await expect(page.getByRole('button', { name: 'Start call' })).toBeFocused(); }); - test('expect add "user1" to "targetChannel"', async () => { + // FIXME: bad assertion + test('should add "user1" to "targetChannel"', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnTabMembers.click(); await poHomeChannel.tabs.members.showAllUsers(); @@ -65,7 +67,8 @@ test.describe.serial('channel-management', () => { await expect(poHomeChannel.toastSuccess).toBeVisible(); }); - test('expect create invite to the room', async () => { + // FIXME: bad assertion + test('should create invite to the room', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnTabMembers.click(); await poHomeChannel.tabs.members.inviteUser(); @@ -73,28 +76,29 @@ test.describe.serial('channel-management', () => { await expect(poHomeChannel.toastSuccess).toBeVisible(); }); - test('expect mute "user1"', async () => { + test.fixme('should mute "user1"', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnTabMembers.click(); await poHomeChannel.tabs.members.showAllUsers(); await poHomeChannel.tabs.members.muteUser('user1'); }); - test('expect set "user1" as owner', async () => { + test.fixme('should set "user1" as owner', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnTabMembers.click(); await poHomeChannel.tabs.members.showAllUsers(); await poHomeChannel.tabs.members.setUserAsOwner('user1'); }); - test('expect set "user1" as moderator', async () => { + + test.fixme('should set "user1" as moderator', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnTabMembers.click(); await poHomeChannel.tabs.members.showAllUsers(); await poHomeChannel.tabs.members.setUserAsModerator('user1'); }); - test('expect edit topic of "targetChannel"', async () => { + test.fixme('should edit topic of "targetChannel"', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnRoomInfo.click(); await poHomeChannel.tabs.room.btnEdit.click(); @@ -102,7 +106,7 @@ test.describe.serial('channel-management', () => { await poHomeChannel.tabs.room.btnSave.click(); }); - test('expect edit announcement of "targetChannel"', async () => { + test.fixme('should edit announcement of "targetChannel"', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnRoomInfo.click(); await poHomeChannel.tabs.room.btnEdit.click(); @@ -110,7 +114,7 @@ test.describe.serial('channel-management', () => { await poHomeChannel.tabs.room.btnSave.click(); }); - test('expect edit description of "targetChannel"', async () => { + test.fixme('should edit description of "targetChannel"', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnRoomInfo.click(); await poHomeChannel.tabs.room.btnEdit.click(); @@ -118,18 +122,65 @@ test.describe.serial('channel-management', () => { await poHomeChannel.tabs.room.btnSave.click(); }); - test('expect edit name of "targetChannel"', async ({ page }) => { + test('should edit name of "targetChannel"', async ({ page }) => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnRoomInfo.click(); await poHomeChannel.tabs.room.btnEdit.click(); await poHomeChannel.tabs.room.inputName.fill(`NAME-EDITED-${targetChannel}`); await poHomeChannel.tabs.room.btnSave.click(); - await poHomeChannel.sidenav.openChat(`NAME-EDITED-${targetChannel}`); - await expect(page).toHaveURL(`/channel/NAME-EDITED-${targetChannel}`); + targetChannel = `NAME-EDITED-${targetChannel}`; + await poHomeChannel.sidenav.openChat(targetChannel); + + await expect(page).toHaveURL(`/channel/${targetChannel}`); + }); + + test('should truncate the room name for small screens', async ({ page }) => { + const hugeName = faker.string.alpha(100); + await poHomeChannel.sidenav.openChat(targetChannel); + await poHomeChannel.tabs.btnRoomInfo.click(); + await poHomeChannel.tabs.room.btnEdit.click(); + await poHomeChannel.tabs.room.inputName.fill(hugeName); + await poHomeChannel.tabs.room.btnSave.click(); + targetChannel = hugeName; + + await page.setViewportSize({ width: 640, height: 460 }); + await expect(page.getByRole('heading', { name: hugeName })).toHaveCSS('width', '423px'); + }); + + test('should info contextualbar when clicking on roomName', async ({ page }) => { + await poHomeChannel.sidenav.openChat(targetChannel); + await page.getByRole('button', { name: targetChannel }).first().focus(); + await page.keyboard.press('Space'); + await page.getByRole('complementary').waitFor(); + + await expect(page.getByRole('complementary')).toBeVisible(); + }); + + test('should create a discussion using the message composer', async ({ page }) => { + discussionName = faker.string.uuid(); + await poHomeChannel.sidenav.openChat(targetChannel); + await poHomeChannel.content.btnMenuMoreActions.click(); + await page.getByRole('menuitem', { name: 'Discussion' }).click(); + await page.getByRole('textbox', { name: 'Discussion name' }).fill(discussionName); + await page.getByRole('button', { name: 'Create' }).click(); + + await expect(page.getByRole('heading', { name: discussionName })).toBeVisible(); + }); + + test('should access targetTeam through discussion header', async ({ page }) => { + await poHomeChannel.sidenav.openChat(targetChannel); + await page.locator('[data-qa-type="message"]', { hasText: discussionName }).locator('button').first().click(); + await page.getByRole('button', { name: discussionName }).first().focus(); + await page.keyboard.press('Tab'); + await page.keyboard.press('Tab'); + await page.keyboard.press('Space'); + + await expect(page).toHaveURL(`/channel/${targetChannel}`); }); - test.skip('expect edit notification preferences of "targetChannel"', async () => { + // FIXME: bad assertion + test.fixme('should edit notification preferences of "targetChannel"', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.kebab.click({ force: true }); await poHomeChannel.tabs.btnNotificationPreferences.click({ force: true }); @@ -140,7 +191,7 @@ test.describe.serial('channel-management', () => { }); let regularUserPage: Page; - test('expect "readOnlyChannel" to show join button', async ({ browser }) => { + test('should "readOnlyChannel" show join button', async ({ browser }) => { const channelName = faker.string.uuid(); await poHomeChannel.sidenav.openNewByLabel('Channel'); @@ -160,7 +211,7 @@ test.describe.serial('channel-management', () => { await regularUserPage.close(); }); - test.skip('expect all notification preferences of "targetChannel" to be "Mentions"', async () => { + test.fixme('should all notification preferences of "targetChannel" to be "Mentions"', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.kebab.click({ force: true }); await poHomeChannel.tabs.btnNotificationPreferences.click({ force: true }); diff --git a/apps/meteor/tests/e2e/messaging.spec.ts b/apps/meteor/tests/e2e/messaging.spec.ts index 4fa248e72183e..ab31dcba27299 100644 --- a/apps/meteor/tests/e2e/messaging.spec.ts +++ b/apps/meteor/tests/e2e/messaging.spec.ts @@ -38,13 +38,14 @@ test.describe.serial('Messaging', () => { await page.keyboard.press('ArrowDown'); await expect(page.locator('[data-qa-type="message"]:has-text("msg1")')).toBeFocused(); - // move focus to the favorite icon + // move focus to the room title await page.keyboard.press('Shift+Tab'); - await expect(poHomeChannel.roomHeaderFavoriteBtn).toBeFocused(); + await expect(page.getByRole('button', { name: targetChannel }).first()).toBeFocused(); // refocus on the first typed message await page.keyboard.press('Tab'); await page.keyboard.press('Tab'); + await page.keyboard.press('Tab'); await expect(page.locator('[data-qa-type="message"]:has-text("msg1")')).toBeFocused(); // move focus to the message toolbar diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts index 2c739ae6667de..5435985fedb34 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts @@ -153,7 +153,7 @@ export class HomeContent { } get btnMenuMoreActions() { - return this.page.locator('[data-qa-id="menu-more-actions"]'); + return this.page.getByRole('button', { name: 'More actions' }); } get userCard(): Locator { diff --git a/apps/meteor/tests/e2e/team-management.spec.ts b/apps/meteor/tests/e2e/team-management.spec.ts index 338f5c5eb0ef4..11609ec51ed60 100644 --- a/apps/meteor/tests/e2e/team-management.spec.ts +++ b/apps/meteor/tests/e2e/team-management.spec.ts @@ -89,4 +89,14 @@ test.describe.serial('teams-management', () => { await poHomeTeam.tabs.channels.btnAdd.click(); await expect(page.locator('//main//aside >> li')).toContainText(targetChannel); }); + + test('should access team channel through "targetTeam" header', async ({ page }) => { + await poHomeTeam.sidenav.openChat(targetChannel); + await page.getByRole('button', { name: targetChannel }).first().focus(); + await page.keyboard.press('Tab'); + await page.keyboard.press('Tab'); + await page.keyboard.press('Space'); + + await expect(page).toHaveURL(`/group/${targetTeam}`); + }); }); diff --git a/packages/ui-client/src/components/Header/HeaderTag/HeaderTag.tsx b/packages/ui-client/src/components/Header/HeaderTag/HeaderTag.tsx index c921f2b93525b..44661229707c4 100644 --- a/packages/ui-client/src/components/Header/HeaderTag/HeaderTag.tsx +++ b/packages/ui-client/src/components/Header/HeaderTag/HeaderTag.tsx @@ -2,7 +2,7 @@ import { Box, Tag } from '@rocket.chat/fuselage'; import type { ComponentProps, FC } from 'react'; const HeaderTag: FC> = ({ children, ...props }) => ( - + {children} diff --git a/packages/ui-client/src/components/Header/HeaderTitleButton.tsx b/packages/ui-client/src/components/Header/HeaderTitleButton.tsx new file mode 100644 index 0000000000000..c27f20ac9e095 --- /dev/null +++ b/packages/ui-client/src/components/Header/HeaderTitleButton.tsx @@ -0,0 +1,25 @@ +import { css } from '@rocket.chat/css-in-js'; +import { Box, Palette } from '@rocket.chat/fuselage'; +import type { ComponentProps } from 'react'; + +const HeaderTitleButton = ({ className, ...props }: { className?: string } & ComponentProps) => { + const customClass = css` + border-width: 1px; + border-style: solid; + border-color: transparent; + + &:hover { + cursor: pointer; + background-color: ${Palette.surface['surface-hover']}; + } + &:focus.focus-visible { + outline: 0; + box-shadow: 0 0 0 2px ${Palette.stroke['stroke-extra-light-highlight']}; + border-color: ${Palette.stroke['stroke-highlight']}; + } + `; + + return ; +}; + +export default HeaderTitleButton; diff --git a/packages/ui-client/src/components/Header/index.ts b/packages/ui-client/src/components/Header/index.ts index b8d62fb777f9a..00e2c0ab17dc1 100644 --- a/packages/ui-client/src/components/Header/index.ts +++ b/packages/ui-client/src/components/Header/index.ts @@ -8,4 +8,5 @@ export { default as HeaderState } from './HeaderState'; export { default as HeaderSubtitle } from './HeaderSubtitle'; export * from './HeaderTag'; export { default as HeaderTitle } from './HeaderTitle'; +export { default as HeaderTitleButton } from './HeaderTitleButton'; export * from './HeaderToolbar'; From 299aa15dc551d8fa343fae7cd8df49d3755b9e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Thu, 29 Feb 2024 20:39:42 -0300 Subject: [PATCH 09/23] feat: show date on message's scroll (#31572) Co-authored-by: Guilherme Gazzo <5263975+ggazzo@users.noreply.github.com> --- .changeset/nine-ads-hide.md | 5 + .../views/room/MessageList/MessageList.tsx | 76 +++---------- .../room/MessageList/MessageListItem.tsx | 92 +++++++++++++++ apps/meteor/client/views/room/Room.tsx | 59 +++++----- .../client/views/room/body/RoomBody.tsx | 27 ++++- .../room/body/RoomForeword/RoomForeword.tsx | 4 +- .../Threads/components/ThreadChat.tsx | 69 ++++++------ .../Threads/components/ThreadMessageItem.tsx | 67 +++++++++++ .../Threads/components/ThreadMessageList.tsx | 78 +++++++------ .../client/views/room/hooks/useDateScroll.ts | 105 ++++++++++++++++++ .../views/room/hooks/useScrollMessageList.ts | 4 +- .../views/room/providers/DateListProvider.tsx | 46 ++++++++ 12 files changed, 470 insertions(+), 162 deletions(-) create mode 100644 .changeset/nine-ads-hide.md create mode 100644 apps/meteor/client/views/room/MessageList/MessageListItem.tsx create mode 100644 apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageItem.tsx create mode 100644 apps/meteor/client/views/room/hooks/useDateScroll.ts create mode 100644 apps/meteor/client/views/room/providers/DateListProvider.tsx diff --git a/.changeset/nine-ads-hide.md b/.changeset/nine-ads-hide.md new file mode 100644 index 0000000000000..b09886787279c --- /dev/null +++ b/.changeset/nine-ads-hide.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": minor +--- + +feat: show date on message's scroll diff --git a/apps/meteor/client/views/room/MessageList/MessageList.tsx b/apps/meteor/client/views/room/MessageList/MessageList.tsx index 5a3a267b73dc5..b39981d44bb76 100644 --- a/apps/meteor/client/views/room/MessageList/MessageList.tsx +++ b/apps/meteor/client/views/room/MessageList/MessageList.tsx @@ -1,20 +1,15 @@ import type { IRoom } from '@rocket.chat/core-typings'; import { isThreadMessage } from '@rocket.chat/core-typings'; -import { MessageDivider } from '@rocket.chat/fuselage'; -import { useSetting, useTranslation, useUserPreference } from '@rocket.chat/ui-contexts'; -import type { ReactElement, ComponentProps } from 'react'; -import React, { Fragment, memo } from 'react'; +import { useSetting, useUserPreference } from '@rocket.chat/ui-contexts'; +import type { ComponentProps } from 'react'; +import React, { Fragment, forwardRef } from 'react'; import { MessageTypes } from '../../../../app/ui-utils/client'; -import RoomMessage from '../../../components/message/variants/RoomMessage'; -import SystemMessage from '../../../components/message/variants/SystemMessage'; -import ThreadMessagePreview from '../../../components/message/variants/ThreadMessagePreview'; -import { useFormatDate } from '../../../hooks/useFormatDate'; import { useRoomSubscription } from '../contexts/RoomContext'; import { useFirstUnreadMessageId } from '../hooks/useFirstUnreadMessageId'; import { SelectedMessagesProvider } from '../providers/SelectedMessagesProvider'; +import { MessageListItem } from './MessageListItem'; import { useMessages } from './hooks/useMessages'; -import { isMessageNewDay } from './lib/isMessageNewDay'; import { isMessageSequential } from './lib/isMessageSequential'; import MessageListProvider from './providers/MessageListProvider'; @@ -23,14 +18,11 @@ type MessageListProps = { scrollMessageList: ComponentProps['scrollMessageList']; }; -export const MessageList = ({ rid, scrollMessageList }: MessageListProps): ReactElement => { - const t = useTranslation(); +export const MessageList = forwardRef(function MessageList({ rid, scrollMessageList }: MessageListProps) { const messages = useMessages({ rid }); const subscription = useRoomSubscription(); const showUserAvatar = !!useUserPreference('displayAvatars'); const messageGroupingPeriod = Number(useSetting('Message_GroupingPeriod')); - const formatDate = useFormatDate(); - const firstUnreadMessageId = useFirstUnreadMessageId(); return ( @@ -38,62 +30,26 @@ export const MessageList = ({ rid, scrollMessageList }: MessageListProps): React {messages.map((message, index, { [index - 1]: previous }) => { const sequential = isMessageSequential(message, previous, messageGroupingPeriod); - - const newDay = isMessageNewDay(message, previous); - const showUnreadDivider = firstUnreadMessageId === message._id; - - const showDivider = newDay || showUnreadDivider; - - const shouldShowAsSequential = sequential && !newDay; - const system = MessageTypes.isSystemMessage(message); const visible = !isThreadMessage(message) && !system; - const unread = Boolean(subscription?.tunread?.includes(message._id)); - const mention = Boolean(subscription?.tunreadUser?.includes(message._id)); - const all = Boolean(subscription?.tunreadGroup?.includes(message._id)); - const ignoredUser = Boolean(subscription?.ignored?.includes(message.u._id)); - return ( - {showDivider && ( - - {newDay && formatDate(message.ts)} - - )} - - {visible && ( - - )} - - {isThreadMessage(message) && ( - - )} - - {system && } + ); })} ); -}; - -export default memo(MessageList); +}); diff --git a/apps/meteor/client/views/room/MessageList/MessageListItem.tsx b/apps/meteor/client/views/room/MessageList/MessageListItem.tsx new file mode 100644 index 0000000000000..538290c8a7ad1 --- /dev/null +++ b/apps/meteor/client/views/room/MessageList/MessageListItem.tsx @@ -0,0 +1,92 @@ +import { isThreadMessage, type IMessage, type ISubscription } from '@rocket.chat/core-typings'; +import { Box, Bubble, MessageDivider } from '@rocket.chat/fuselage'; +import { useTranslation } from '@rocket.chat/ui-contexts'; +import React from 'react'; + +import RoomMessage from '../../../components/message/variants/RoomMessage'; +import SystemMessage from '../../../components/message/variants/SystemMessage'; +import ThreadMessagePreview from '../../../components/message/variants/ThreadMessagePreview'; +import { useFormatDate } from '../../../hooks/useFormatDate'; +import { useDateRef } from '../providers/DateListProvider'; +import { isMessageNewDay } from './lib/isMessageNewDay'; + +type MessageListItemProps = { + message: IMessage; + previous?: IMessage; + showUnreadDivider: boolean; + + sequential: boolean; + showUserAvatar: boolean; + visible: boolean; + subscription: ISubscription | undefined; + system: boolean; +}; +export const MessageListItem = ({ + message, + previous, + showUnreadDivider, + sequential, + showUserAvatar, + visible, + subscription, + system, +}: MessageListItemProps) => { + const t = useTranslation(); + const formatDate = useFormatDate(); + + const ref = useDateRef(); + + const newDay = isMessageNewDay(message, previous); + const showDivider = newDay || showUnreadDivider; + const unread = Boolean(subscription?.tunread?.includes(message._id)); + const mention = Boolean(subscription?.tunreadUser?.includes(message._id)); + const all = Boolean(subscription?.tunreadGroup?.includes(message._id)); + const ignoredUser = Boolean(subscription?.ignored?.includes(message.u._id)); + const shouldShowAsSequential = sequential && !newDay; + + return ( + <> + {showDivider && ( + + + {newDay && ( + + {formatDate(message.ts)} + + )} + + + )} + {visible && ( + + )} + {isThreadMessage(message) && ( + + )} + {system && } + + ); +}; diff --git a/apps/meteor/client/views/room/Room.tsx b/apps/meteor/client/views/room/Room.tsx index 4d6d7d56f9d5b..8dcc76a20e576 100644 --- a/apps/meteor/client/views/room/Room.tsx +++ b/apps/meteor/client/views/room/Room.tsx @@ -13,6 +13,7 @@ import { useRoomToolbox } from './contexts/RoomToolboxContext'; import { useAppsContextualBar } from './hooks/useAppsContextualBar'; import RoomLayout from './layout/RoomLayout'; import ChatProvider from './providers/ChatProvider'; +import { DateListProvider } from './providers/DateListProvider'; import { SelectedMessagesProvider } from './providers/SelectedMessagesProvider'; const UiKitContextualBar = lazy(() => import('./contextualBar/uikit/UiKitContextualBar')); @@ -27,34 +28,36 @@ const Room = (): ReactElement => { - } - body={} - aside={ - (toolbox.tab?.tabComponent && ( - - - }>{createElement(toolbox.tab.tabComponent)} - - - )) || - (contextualBarView && ( - - - }> - - - - - )) - } - /> + + } + body={} + aside={ + (toolbox.tab?.tabComponent && ( + + + }>{createElement(toolbox.tab.tabComponent)} + + + )) || + (contextualBarView && ( + + + }> + + + + + )) + } + /> + diff --git a/apps/meteor/client/views/room/body/RoomBody.tsx b/apps/meteor/client/views/room/body/RoomBody.tsx index 5dd6d9e6bb671..83cbf184b1bd8 100644 --- a/apps/meteor/client/views/room/body/RoomBody.tsx +++ b/apps/meteor/client/views/room/body/RoomBody.tsx @@ -1,5 +1,6 @@ import type { IMessage, IUser } from '@rocket.chat/core-typings'; import { isEditedMessage } from '@rocket.chat/core-typings'; +import { Box, Bubble } from '@rocket.chat/fuselage'; import { usePermission, useRole, @@ -22,13 +23,14 @@ import { isTruthy } from '../../../../lib/isTruthy'; import { withDebouncing, withThrottling } from '../../../../lib/utils/highOrderFunctions'; import { CustomScrollbars } from '../../../components/CustomScrollbars'; import { useEmbeddedLayout } from '../../../hooks/useEmbeddedLayout'; +import { useFormatDate } from '../../../hooks/useFormatDate'; import { useReactiveQuery } from '../../../hooks/useReactiveQuery'; import { RoomManager } from '../../../lib/RoomManager'; import type { Upload } from '../../../lib/chats/Upload'; import { roomCoordinator } from '../../../lib/rooms/roomCoordinator'; import { setMessageJumpQueryStringParameter } from '../../../lib/utils/setMessageJumpQueryStringParameter'; import Announcement from '../Announcement'; -import { MessageList } from '../MessageList/MessageList'; +import { MessageList } from '../MessageList'; import MessageListErrorBoundary from '../MessageList/MessageListErrorBoundary'; import ComposerContainer from '../composer/ComposerContainer'; import RoomComposer from '../composer/RoomComposer/RoomComposer'; @@ -36,8 +38,10 @@ import { useChat } from '../contexts/ChatContext'; import { useRoom, useRoomSubscription, useRoomMessages } from '../contexts/RoomContext'; import { useRoomToolbox } from '../contexts/RoomToolboxContext'; import { useUserCard } from '../contexts/UserCardContext'; +import { useDateScroll } from '../hooks/useDateScroll'; import { useMessageListNavigation } from '../hooks/useMessageListNavigation'; import { useScrollMessageList } from '../hooks/useScrollMessageList'; +import { useDateListController } from '../providers/DateListProvider'; import DropTargetOverlay from './DropTargetOverlay'; import JumpToRecentMessageButton from './JumpToRecentMessageButton'; import LeaderBar from './LeaderBar'; @@ -53,7 +57,10 @@ import { useRestoreScrollPosition } from './hooks/useRestoreScrollPosition'; import { useRetentionPolicy } from './hooks/useRetentionPolicy'; import { useUnreadMessages } from './hooks/useUnreadMessages'; +const BUBBLE_OFFSET = 8; + const RoomBody = (): ReactElement => { + const formatDate = useFormatDate(); const t = useTranslation(); const isLayoutEmbedded = useEmbeddedLayout(); const room = useRoom(); @@ -62,6 +69,9 @@ const RoomBody = (): ReactElement => { const admin = useRole('admin'); const subscription = useRoomSubscription(); + const { list } = useDateListController(); + const { listStyle, bubbleDate, onScroll: handleDateOnScroll, showBubble, style: bubbleDateStyle } = useDateScroll(BUBBLE_OFFSET); + const [lastMessageDate, setLastMessageDate] = useState(); const [hideLeaderHeader, setHideLeaderHeader] = useState(false); const [hasNewMessages, setHasNewMessages] = useState(false); @@ -380,12 +390,14 @@ const RoomBody = (): ReactElement => { wrapper.addEventListener('scroll', updateUnreadCount); wrapper.addEventListener('scroll', handleWrapperScroll); + wrapper.addEventListener('scroll', () => handleDateOnScroll(list)); return () => { wrapper.removeEventListener('scroll', updateUnreadCount); wrapper.removeEventListener('scroll', handleWrapperScroll); + wrapper.removeEventListener('scroll', () => handleDateOnScroll(list)); }; - }, [_isAtBottom, room._id, setUnreadCount]); + }, [_isAtBottom, handleDateOnScroll, list, room._id, setUnreadCount]); useEffect(() => { const wrapper = wrapperRef.current; @@ -540,7 +552,7 @@ const RoomBody = (): ReactElement => { return ( <> {!isLayoutEmbedded && room.announcement && } -
+
{ /> ))}
+ {bubbleDate && ( + + + {formatDate(bubbleDate)} + + + )} {unread && ( {
-
+ ); }; diff --git a/apps/meteor/client/views/room/body/RoomForeword/RoomForeword.tsx b/apps/meteor/client/views/room/body/RoomForeword/RoomForeword.tsx index 63ba8f895e6cf..a765407ad6d49 100644 --- a/apps/meteor/client/views/room/body/RoomForeword/RoomForeword.tsx +++ b/apps/meteor/client/views/room/body/RoomForeword/RoomForeword.tsx @@ -20,7 +20,7 @@ const RoomForeword = ({ user, room }: RoomForewordProps): ReactElement | null => if (!isDirectMessageRoom(room)) { return ( - + {t('Start_of_conversation')} ); @@ -33,7 +33,7 @@ const RoomForeword = ({ user, room }: RoomForewordProps): ReactElement | null => } return ( - + {usernames.map((username, index) => ( diff --git a/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadChat.tsx b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadChat.tsx index 510d4f3e80177..52c16308206af 100644 --- a/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadChat.tsx +++ b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadChat.tsx @@ -15,6 +15,7 @@ import RoomComposer from '../../../composer/RoomComposer/RoomComposer'; import { useChat } from '../../../contexts/ChatContext'; import { useRoom, useRoomSubscription } from '../../../contexts/RoomContext'; import { useRoomToolbox } from '../../../contexts/RoomToolboxContext'; +import { DateListProvider } from '../../../providers/DateListProvider'; import ThreadMessageList from './ThreadMessageList'; type ThreadChatProps = { @@ -93,39 +94,41 @@ const ThreadChat = ({ mainMessage }: ThreadChatProps) => { return ( - - - - - - - - - - - setSendToChannel((checked) => !checked)} - name='alsoSendThreadToChannel' - /> - - {t('Also_send_to_channel')} - - - - - - + + + + + + + + + + + + setSendToChannel((checked) => !checked)} + name='alsoSendThreadToChannel' + /> + + {t('Also_send_to_channel')} + + + + + + + ); }; diff --git a/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageItem.tsx b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageItem.tsx new file mode 100644 index 0000000000000..1a7da3e0ea63a --- /dev/null +++ b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageItem.tsx @@ -0,0 +1,67 @@ +import type { IThreadMainMessage, IThreadMessage } from '@rocket.chat/core-typings'; +import { Box, Bubble, MessageDivider } from '@rocket.chat/fuselage'; +import { useTranslation } from '@rocket.chat/ui-contexts'; +import React from 'react'; + +import SystemMessage from '../../../../../components/message/variants/SystemMessage'; +import ThreadMessage from '../../../../../components/message/variants/ThreadMessage'; +import { useFormatDate } from '../../../../../hooks/useFormatDate'; +import { isMessageNewDay } from '../../../MessageList/lib/isMessageNewDay'; +import { useDateRef } from '../../../providers/DateListProvider'; + +type ThreadMessageProps = { + message: IThreadMessage | IThreadMainMessage; + previous: IThreadMessage | IThreadMainMessage; + sequential: boolean; + shouldShowAsSequential: boolean; + showUserAvatar: boolean; + firstUnread: boolean; + system: boolean; +}; + +export const ThreadMessageItem = ({ + message, + previous, + shouldShowAsSequential, + showUserAvatar, + firstUnread, + system, +}: ThreadMessageProps) => { + const t = useTranslation(); + const formatDate = useFormatDate(); + const ref = useDateRef(); + + const newDay = isMessageNewDay(message, previous); + + const showDivider = newDay || firstUnread; + + return ( + <> + {showDivider && ( + + + {newDay && ( + + {formatDate(message.ts)} + + )} + + + )} +
  • + {system ? ( + + ) : ( + + )} +
  • + + ); +}; diff --git a/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.tsx b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.tsx index 48b764d51816e..249a71ec4f549 100644 --- a/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.tsx +++ b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.tsx @@ -1,7 +1,7 @@ import type { IMessage, IThreadMainMessage } from '@rocket.chat/core-typings'; -import { MessageDivider } from '@rocket.chat/fuselage'; +import { Box, Bubble } from '@rocket.chat/fuselage'; import { useMergedRefs } from '@rocket.chat/fuselage-hooks'; -import { useSetting, useTranslation, useUserPreference } from '@rocket.chat/ui-contexts'; +import { useSetting, useUserPreference } from '@rocket.chat/ui-contexts'; import { differenceInSeconds } from 'date-fns'; import type { ReactElement } from 'react'; import React, { Fragment } from 'react'; @@ -9,18 +9,21 @@ import React, { Fragment } from 'react'; import { MessageTypes } from '../../../../../../app/ui-utils/client'; import { isTruthy } from '../../../../../../lib/isTruthy'; import { CustomScrollbars } from '../../../../../components/CustomScrollbars'; -import SystemMessage from '../../../../../components/message/variants/SystemMessage'; -import ThreadMessage from '../../../../../components/message/variants/ThreadMessage'; import { useFormatDate } from '../../../../../hooks/useFormatDate'; import { isMessageNewDay } from '../../../MessageList/lib/isMessageNewDay'; import MessageListProvider from '../../../MessageList/providers/MessageListProvider'; import LoadingMessagesIndicator from '../../../body/LoadingMessagesIndicator'; +import { useDateScroll } from '../../../hooks/useDateScroll'; import { useFirstUnreadMessageId } from '../../../hooks/useFirstUnreadMessageId'; import { useMessageListNavigation } from '../../../hooks/useMessageListNavigation'; import { useScrollMessageList } from '../../../hooks/useScrollMessageList'; +import { useDateListController } from '../../../providers/DateListProvider'; import { useLegacyThreadMessageJump } from '../hooks/useLegacyThreadMessageJump'; import { useLegacyThreadMessageListScrolling } from '../hooks/useLegacyThreadMessageListScrolling'; import { useLegacyThreadMessages } from '../hooks/useLegacyThreadMessages'; +import { ThreadMessageItem } from './ThreadMessageItem'; + +const BUBBLE_OFFSET = 64; const isMessageSequential = (current: IMessage, previous: IMessage | undefined, groupingRange: number): boolean => { if (!previous) { @@ -50,6 +53,10 @@ type ThreadMessageListProps = { }; const ThreadMessageList = ({ mainMessage }: ThreadMessageListProps): ReactElement => { + const formatDate = useFormatDate(); + const { list } = useDateListController(); + const { listStyle, bubbleDate, onScroll: handleDateOnScroll, showBubble, style: bubbleDateStyle } = useDateScroll(BUBBLE_OFFSET); + const { messages, loading } = useLegacyThreadMessages(mainMessage._id); const { listWrapperRef: listWrapperScrollRef, @@ -60,22 +67,37 @@ const ThreadMessageList = ({ mainMessage }: ThreadMessageListProps): ReactElemen const hideUsernames = useUserPreference('hideUsernames'); const showUserAvatar = !!useUserPreference('displayAvatars'); - - const formatDate = useFormatDate(); - const t = useTranslation(); + const firstUnreadMessageId = useFirstUnreadMessageId(); const messageGroupingPeriod = Number(useSetting('Message_GroupingPeriod')); const scrollMessageList = useScrollMessageList(listWrapperScrollRef); - - const firstUnreadMessageId = useFirstUnreadMessageId(); const { messageListRef, messageListProps } = useMessageListNavigation(); - const listRef = useMergedRefs(listScrollRef, listJumpRef, messageListRef); return (
    - -
      + {bubbleDate && ( + + + {formatDate(bubbleDate)} + + + )} + { + handleScroll(args); + handleDateOnScroll(list); + }} + style={{ scrollBehavior: 'smooth', overflowX: 'hidden' }} + > + {loading ? (
    • @@ -85,38 +107,28 @@ const ThreadMessageList = ({ mainMessage }: ThreadMessageListProps): ReactElemen {[mainMessage, ...messages].map((message, index, { [index - 1]: previous }) => { const sequential = isMessageSequential(message, previous, messageGroupingPeriod); const newDay = isMessageNewDay(message, previous); - const firstUnread = firstUnreadMessageId === message._id; - const showDivider = newDay || firstUnread; - const shouldShowAsSequential = sequential && !newDay; + const firstUnread = firstUnreadMessageId === message._id; const system = MessageTypes.isSystemMessage(message); return ( - {showDivider && ( - - {newDay && formatDate(message.ts)} - - )} -
    • - {system ? ( - - ) : ( - - )} -
    • + ); })} )} -
    +
    ); diff --git a/apps/meteor/client/views/room/hooks/useDateScroll.ts b/apps/meteor/client/views/room/hooks/useDateScroll.ts new file mode 100644 index 0000000000000..62e69f10b6b0b --- /dev/null +++ b/apps/meteor/client/views/room/hooks/useDateScroll.ts @@ -0,0 +1,105 @@ +import { css } from '@rocket.chat/css-in-js'; +import { useSafely } from '@rocket.chat/fuselage-hooks'; +import { useCallback, useState } from 'react'; + +import { withThrottling } from '../../../../lib/utils/highOrderFunctions'; + +type useDateScrollReturn = { + bubbleDate: string | undefined; + onScroll: (list: Set) => void; + style: ReturnType; + showBubble: boolean; + listStyle?: ReturnType; +}; + +export const useDateScroll = (offset = 0): useDateScrollReturn => { + const [bubbleDate, setBubbleDate] = useSafely( + useState<{ + date: string; + show: boolean; + }>({ + date: '', + show: false, + }), + ); + + const onScroll = useCallback( + withThrottling({ wait: 30 })( + (() => { + let timeout: ReturnType; + return (elements: Set) => { + clearTimeout(timeout); + + const bubbleOffset = offset + 56; + // Gets the first non visible message date and sets the bubble date to it + const [date, message] = [...elements].reduce((ret, message) => { + // Sanitize elements + if (!message.dataset.id) { + return ret; + } + + const { top } = message.getBoundingClientRect(); + const { id } = message.dataset; + + if (top < bubbleOffset) { + // Remove T - . : from the date + return [new Date(id).toISOString(), message]; + } + return ret; + }, [] as [string, HTMLElement] | []); + + // We always keep the previous date if we don't have a new one, so when the bubble disappears it doesn't flicker + setBubbleDate(() => ({ + date: '', + ...(date && { date }), + show: Boolean(date), + })); + + if (message) { + const { top } = message.getBoundingClientRect(); + + if (top - offset > 0) { + return; + } + } + + timeout = setTimeout( + () => + setBubbleDate((current) => ({ + ...current, + show: false, + })), + 1000, + ); + }; + })(), + ), + [offset], + ); + + const dateBubbleStyle = css` + position: absolute; + top: ${offset}px; + left: 50%; + translate: -50%; + z-index: 1; + + opacity: 0; + transition: opacity 0.6s; + + &.bubble-visible { + opacity: 1; + } + `; + + const listStyle = + bubbleDate.show && bubbleDate.date + ? css` + & [data-time='${bubbleDate.date.replaceAll(/[-T:.]/g, '').substring(0, 8)}'] { + opacity: 0; + } + ` + : undefined; + + return { listStyle, bubbleDate: bubbleDate.date, onScroll, style: dateBubbleStyle, showBubble: Boolean(bubbleDate.show) }; +}; diff --git a/apps/meteor/client/views/room/hooks/useScrollMessageList.ts b/apps/meteor/client/views/room/hooks/useScrollMessageList.ts index 489ecbced48e7..4b324dbcb0fa3 100644 --- a/apps/meteor/client/views/room/hooks/useScrollMessageList.ts +++ b/apps/meteor/client/views/room/hooks/useScrollMessageList.ts @@ -1,11 +1,11 @@ import type { ComponentProps, RefObject } from 'react'; import { useCallback } from 'react'; -import type { MessageList } from '../MessageList'; +import type MessageListProvider from '../MessageList/providers/MessageListProvider'; export const useScrollMessageList = ( wrapperRef: RefObject, -): Exclude['scrollMessageList'], undefined> => { +): Exclude['scrollMessageList'], undefined> => { // Passing a callback instead of the values so that the wrapper is exposed return useCallback( (callback) => { diff --git a/apps/meteor/client/views/room/providers/DateListProvider.tsx b/apps/meteor/client/views/room/providers/DateListProvider.tsx new file mode 100644 index 0000000000000..43fd70943b456 --- /dev/null +++ b/apps/meteor/client/views/room/providers/DateListProvider.tsx @@ -0,0 +1,46 @@ +import React, { createContext, useContext, useMemo, useState } from 'react'; + +type DateListContextValue = { + list: Set; + dateRef: () => (ref: HTMLElement | null) => void; +}; + +const DateListContext = createContext(undefined); + +const useDateRef = () => { + const context = useDateListController(); + return useMemo(() => context.dateRef(), [context]); +}; + +const DateListProvider = ({ children }: { children: React.ReactNode }) => { + const [list] = useState>(new Set()); + + const addToList = (value: HTMLElement) => { + list.add(value); + return () => { + list.delete(value); + }; + }; + + const dateRef = () => { + let remove: () => void; + return (ref: HTMLElement | null) => { + if (remove) remove(); + + if (!ref) return; + remove = addToList(ref); + }; + }; + + return {children}; +}; + +const useDateListController = () => { + const context = useContext(DateListContext); + if (!context) { + throw new Error('useDateController must be used within an DateScrollProvider'); + } + return context; +}; + +export { DateListProvider, useDateListController, useDateRef }; From 48d041048c006615b46f9a8485cc40d8fabf5511 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Fri, 1 Mar 2024 00:31:32 -0300 Subject: [PATCH 10/23] chore: remove hardcoded position for message date (#31866) --- .../client/views/room/body/RoomBody.tsx | 15 ++-- .../Threads/components/ThreadChat.tsx | 11 ++- .../Threads/components/ThreadMessageList.tsx | 11 +-- .../client/views/room/hooks/useDateScroll.ts | 73 +++++++++++-------- 4 files changed, 65 insertions(+), 45 deletions(-) diff --git a/apps/meteor/client/views/room/body/RoomBody.tsx b/apps/meteor/client/views/room/body/RoomBody.tsx index 83cbf184b1bd8..d6fb6e8cbfe1b 100644 --- a/apps/meteor/client/views/room/body/RoomBody.tsx +++ b/apps/meteor/client/views/room/body/RoomBody.tsx @@ -1,6 +1,7 @@ import type { IMessage, IUser } from '@rocket.chat/core-typings'; import { isEditedMessage } from '@rocket.chat/core-typings'; import { Box, Bubble } from '@rocket.chat/fuselage'; +import { useMergedRefs } from '@rocket.chat/fuselage-hooks'; import { usePermission, useRole, @@ -57,8 +58,6 @@ import { useRestoreScrollPosition } from './hooks/useRestoreScrollPosition'; import { useRetentionPolicy } from './hooks/useRetentionPolicy'; import { useUnreadMessages } from './hooks/useUnreadMessages'; -const BUBBLE_OFFSET = 8; - const RoomBody = (): ReactElement => { const formatDate = useFormatDate(); const t = useTranslation(); @@ -70,7 +69,7 @@ const RoomBody = (): ReactElement => { const subscription = useRoomSubscription(); const { list } = useDateListController(); - const { listStyle, bubbleDate, onScroll: handleDateOnScroll, showBubble, style: bubbleDateStyle } = useDateScroll(BUBBLE_OFFSET); + const { callbackRef, listStyle, bubbleDate, showBubble, style: bubbleDateStyle } = useDateScroll(); const [lastMessageDate, setLastMessageDate] = useState(); const [hideLeaderHeader, setHideLeaderHeader] = useState(false); @@ -390,14 +389,12 @@ const RoomBody = (): ReactElement => { wrapper.addEventListener('scroll', updateUnreadCount); wrapper.addEventListener('scroll', handleWrapperScroll); - wrapper.addEventListener('scroll', () => handleDateOnScroll(list)); return () => { wrapper.removeEventListener('scroll', updateUnreadCount); wrapper.removeEventListener('scroll', handleWrapperScroll); - wrapper.removeEventListener('scroll', () => handleDateOnScroll(list)); }; - }, [_isAtBottom, handleDateOnScroll, list, room._id, setUnreadCount]); + }, [_isAtBottom, list, room._id, setUnreadCount]); useEffect(() => { const wrapper = wrapperRef.current; @@ -549,6 +546,8 @@ const RoomBody = (): ReactElement => { const { messageListRef, messageListProps } = useMessageListNavigation(); + const ref = useMergedRefs(callbackRef, wrapperRef); + return ( <> {!isLayoutEmbedded && room.announcement && } @@ -559,7 +558,7 @@ const RoomBody = (): ReactElement => { onClick={hideFlexTab && handleCloseFlexTab} >
    -
    +
    {uploads.map((upload) => ( @@ -623,7 +622,7 @@ const RoomBody = (): ReactElement => { .join(' ')} > - +
      { - + diff --git a/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.tsx b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.tsx index 249a71ec4f549..77c2854cd7ce8 100644 --- a/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.tsx +++ b/apps/meteor/client/views/room/contextualBar/Threads/components/ThreadMessageList.tsx @@ -17,14 +17,11 @@ import { useDateScroll } from '../../../hooks/useDateScroll'; import { useFirstUnreadMessageId } from '../../../hooks/useFirstUnreadMessageId'; import { useMessageListNavigation } from '../../../hooks/useMessageListNavigation'; import { useScrollMessageList } from '../../../hooks/useScrollMessageList'; -import { useDateListController } from '../../../providers/DateListProvider'; import { useLegacyThreadMessageJump } from '../hooks/useLegacyThreadMessageJump'; import { useLegacyThreadMessageListScrolling } from '../hooks/useLegacyThreadMessageListScrolling'; import { useLegacyThreadMessages } from '../hooks/useLegacyThreadMessages'; import { ThreadMessageItem } from './ThreadMessageItem'; -const BUBBLE_OFFSET = 64; - const isMessageSequential = (current: IMessage, previous: IMessage | undefined, groupingRange: number): boolean => { if (!previous) { return false; @@ -54,8 +51,7 @@ type ThreadMessageListProps = { const ThreadMessageList = ({ mainMessage }: ThreadMessageListProps): ReactElement => { const formatDate = useFormatDate(); - const { list } = useDateListController(); - const { listStyle, bubbleDate, onScroll: handleDateOnScroll, showBubble, style: bubbleDateStyle } = useDateScroll(BUBBLE_OFFSET); + const { callbackRef, listStyle, bubbleDate, showBubble, style: bubbleDateStyle } = useDateScroll(); const { messages, loading } = useLegacyThreadMessages(mainMessage._id); const { @@ -74,6 +70,8 @@ const ThreadMessageList = ({ mainMessage }: ThreadMessageListProps): ReactElemen const { messageListRef, messageListProps } = useMessageListNavigation(); const listRef = useMergedRefs(listScrollRef, listJumpRef, messageListRef); + const scrollRef = useMergedRefs(callbackRef, listWrapperScrollRef); + return (
      {bubbleDate && ( @@ -84,10 +82,9 @@ const ThreadMessageList = ({ mainMessage }: ThreadMessageListProps): ReactElemen )} { handleScroll(args); - handleDateOnScroll(list); }} style={{ scrollBehavior: 'smooth', overflowX: 'hidden' }} > diff --git a/apps/meteor/client/views/room/hooks/useDateScroll.ts b/apps/meteor/client/views/room/hooks/useDateScroll.ts index 62e69f10b6b0b..c10aa3bf96409 100644 --- a/apps/meteor/client/views/room/hooks/useDateScroll.ts +++ b/apps/meteor/client/views/room/hooks/useDateScroll.ts @@ -3,34 +3,43 @@ import { useSafely } from '@rocket.chat/fuselage-hooks'; import { useCallback, useState } from 'react'; import { withThrottling } from '../../../../lib/utils/highOrderFunctions'; +import { useDateListController } from '../providers/DateListProvider'; type useDateScrollReturn = { bubbleDate: string | undefined; - onScroll: (list: Set) => void; - style: ReturnType; + callbackRef: (node: HTMLElement | null) => void; + style?: ReturnType; showBubble: boolean; listStyle?: ReturnType; }; -export const useDateScroll = (offset = 0): useDateScrollReturn => { +export const useDateScroll = (margin = 8): useDateScrollReturn => { const [bubbleDate, setBubbleDate] = useSafely( useState<{ date: string; show: boolean; + style?: ReturnType; }>({ date: '', show: false, + style: undefined, }), ); - const onScroll = useCallback( - withThrottling({ wait: 30 })( - (() => { + const { list } = useDateListController(); + + const callbackRef = useCallback( + (node: HTMLElement | null) => { + if (!node) { + return; + } + const onScroll = (() => { let timeout: ReturnType; - return (elements: Set) => { + return (elements: Set, offset: number) => { clearTimeout(timeout); - const bubbleOffset = offset + 56; + const bubbleOffset = offset; + // Gets the first non visible message date and sets the bubble date to it const [date, message] = [...elements].reduce((ret, message) => { // Sanitize elements @@ -49,16 +58,30 @@ export const useDateScroll = (offset = 0): useDateScrollReturn => { }, [] as [string, HTMLElement] | []); // We always keep the previous date if we don't have a new one, so when the bubble disappears it doesn't flicker + setBubbleDate(() => ({ date: '', ...(date && { date }), show: Boolean(date), + style: css` + position: absolute; + top: ${margin}px; + left: 50%; + translate: -50%; + z-index: 1; + + opacity: 0; + transition: opacity 0.6s; + + &.bubble-visible { + opacity: 1; + } + `, })); if (message) { const { top } = message.getBoundingClientRect(); - - if (top - offset > 0) { + if (top < offset && top > 0) { return; } } @@ -72,34 +95,26 @@ export const useDateScroll = (offset = 0): useDateScrollReturn => { 1000, ); }; - })(), - ), - [offset], + })(); + const fn = withThrottling({ wait: 30 })(() => { + const offset = node.getBoundingClientRect().top; + onScroll(list, offset); + }); + + node.addEventListener('scroll', fn, { passive: true }); + }, + [list, margin, setBubbleDate], ); - const dateBubbleStyle = css` - position: absolute; - top: ${offset}px; - left: 50%; - translate: -50%; - z-index: 1; - - opacity: 0; - transition: opacity 0.6s; - - &.bubble-visible { - opacity: 1; - } - `; - const listStyle = bubbleDate.show && bubbleDate.date ? css` + position: relative; & [data-time='${bubbleDate.date.replaceAll(/[-T:.]/g, '').substring(0, 8)}'] { opacity: 0; } ` : undefined; - return { listStyle, bubbleDate: bubbleDate.date, onScroll, style: dateBubbleStyle, showBubble: Boolean(bubbleDate.show) }; + return { callbackRef, listStyle, bubbleDate: bubbleDate.date, style: bubbleDate.style, showBubble: Boolean(bubbleDate.show) }; }; From 000f601e473e861a0e2c77c75812d0e8a32fa6ae Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Fri, 1 Mar 2024 18:15:51 -0300 Subject: [PATCH 11/23] fix: message parser emphasis black hole (#31868) Co-authored-by: Guilherme Gazzo <5263975+ggazzo@users.noreply.github.com> --- packages/message-parser/src/grammar.pegjs | 4 +-- packages/message-parser/src/utils.ts | 27 ++++++++++--------- .../message-parser/tests/emphasis.test.ts | 16 +++++++++++ packages/message-parser/tsconfig.json | 1 + 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/packages/message-parser/src/grammar.pegjs b/packages/message-parser/src/grammar.pegjs index 3445f8e18231e..138ff482d2087 100644 --- a/packages/message-parser/src/grammar.pegjs +++ b/packages/message-parser/src/grammar.pegjs @@ -359,10 +359,10 @@ EmphasisForReferences = BoldForReferences / ItalicForReferences / StrikethroughF Italic = value:$([a-zA-Z0-9]+ [\x5F] [\x5F]?) { return plain(value); } / [\x5F] [\x5F] i:ItalicContentItems [\x5F] [\x5F] t:$[a-zA-Z0-9]+ { - return reducePlainTexts([plain('__'), ...i, plain('__'), plain(t)])[0]; + return reducePlainTexts([plain('__'), ...i, plain('__'), plain(t)]); } / [\x5F] i:ItalicContentItems [\x5F] t:$[a-zA-Z]+ { - return reducePlainTexts([plain('_'), ...i, plain('_'), plain(t)])[0]; + return reducePlainTexts([plain('_'), ...i, plain('_'), plain(t)]); } / [\x5F] [\x5F] @ItalicContent [\x5F] [\x5F] / [\x5F] @ItalicContent [\x5F] diff --git a/packages/message-parser/src/utils.ts b/packages/message-parser/src/utils.ts index 5902d8e33e7d6..44527529b4a6f 100644 --- a/packages/message-parser/src/utils.ts +++ b/packages/message-parser/src/utils.ts @@ -197,20 +197,21 @@ const joinEmoji = ( export const reducePlainTexts = ( values: Paragraph['value'] ): Paragraph['value'] => - values.reduce((result, item, index) => { - const next = values[index + 1]; - const current = joinEmoji(item, values[index - 1], next); - const previous: Inlines = result[result.length - 1]; - - if (previous) { - if (current.type === 'PLAIN_TEXT' && current.type === previous.type) { - previous.value += current.value; - return result; + values + .flatMap((item) => item) + .reduce((result, item, index, values) => { + const next = values[index + 1]; + const current = joinEmoji(item, values[index - 1], next); + const previous: Inlines = result[result.length - 1]; + + if (previous) { + if (current.type === 'PLAIN_TEXT' && current.type === previous.type) { + previous.value += current.value; + return result; + } } - } - - return [...result, current]; - }, [] as Paragraph['value']); + return [...result, current]; + }, [] as Paragraph['value']); export const lineBreak = (): LineBreak => ({ type: 'LINE_BREAK', value: undefined, diff --git a/packages/message-parser/tests/emphasis.test.ts b/packages/message-parser/tests/emphasis.test.ts index bae05be7d1589..e8e72a5882f1a 100644 --- a/packages/message-parser/tests/emphasis.test.ts +++ b/packages/message-parser/tests/emphasis.test.ts @@ -11,6 +11,7 @@ import { emojiUnicode, mentionChannel, mentionUser, + inlineCode, } from '../src/utils'; test.each([ @@ -169,6 +170,21 @@ test.each([ ]), ], ], + ['_ouch_ouch', [paragraph([plain('_ouch_ouch')])]], + [ + `_@mention _gone`, + [paragraph([plain('_'), mentionUser('mention'), plain(' _gone')])], + ], + [ + '_nothing `should` be _gone', + [ + paragraph([ + plain('_nothing '), + inlineCode(plain('should')), + plain(' be _gone'), + ]), + ], + ], ])('parses %p', (input, output) => { expect(parse(input)).toMatchObject(output); }); diff --git a/packages/message-parser/tsconfig.json b/packages/message-parser/tsconfig.json index 3e59aeae898f2..619475cd79148 100644 --- a/packages/message-parser/tsconfig.json +++ b/packages/message-parser/tsconfig.json @@ -6,6 +6,7 @@ "declaration": true, "declarationMap": true, "sourceMap": true, + "lib": ["es2019"], "outDir": "./dist", "strict": true, "esModuleInterop": true, From 09ee4fd2d9c672e80550c7bb67af7fe820fcf1e2 Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:07:46 -0300 Subject: [PATCH 12/23] fix: Room import doesn't honor the specified owner (#31803) --- .changeset/funny-cooks-sneeze.md | 5 + .../server/classes/ImportDataConverter.ts | 6 +- .../client/views/admin/rooms/EditRoom.tsx | 2 +- .../tests/e2e/fixtures/files/csv_import.zip | Bin 0 -> 991 bytes .../e2e/fixtures/files/csv_import_rooms.csv | 4 + .../e2e/fixtures/files/csv_import_users.csv | 2 + .../tests/e2e/fixtures/files/dm_messages.csv | 2 + apps/meteor/tests/e2e/imports.spec.ts | 136 ++++++++++++++++-- apps/meteor/tests/e2e/page-objects/admin.ts | 8 ++ 9 files changed, 152 insertions(+), 13 deletions(-) create mode 100644 .changeset/funny-cooks-sneeze.md create mode 100644 apps/meteor/tests/e2e/fixtures/files/csv_import.zip create mode 100644 apps/meteor/tests/e2e/fixtures/files/csv_import_rooms.csv create mode 100644 apps/meteor/tests/e2e/fixtures/files/csv_import_users.csv create mode 100644 apps/meteor/tests/e2e/fixtures/files/dm_messages.csv diff --git a/.changeset/funny-cooks-sneeze.md b/.changeset/funny-cooks-sneeze.md new file mode 100644 index 0000000000000..c7b019a3d92b6 --- /dev/null +++ b/.changeset/funny-cooks-sneeze.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed room owner specified on room import not being inserted as a room member or owner. diff --git a/apps/meteor/app/importer/server/classes/ImportDataConverter.ts b/apps/meteor/app/importer/server/classes/ImportDataConverter.ts index 1ce40b9415e5c..f5315b4f1e6cd 100644 --- a/apps/meteor/app/importer/server/classes/ImportDataConverter.ts +++ b/apps/meteor/app/importer/server/classes/ImportDataConverter.ts @@ -1020,13 +1020,13 @@ export class ImportDataConverter { return; } if (roomData.t === 'p') { - const user = await Users.findOneById(startedByUserId); + const user = await Users.findOneById(creatorId); if (!user) { throw new Error('importer-channel-invalid-creator'); } - roomInfo = await createPrivateGroupMethod(user, roomData.name, members, false, {}, {}, true); + roomInfo = await createPrivateGroupMethod(user, roomData.name, members, false, {}, {}); } else { - roomInfo = await createChannelMethod(startedByUserId, roomData.name, members, false, {}, {}, true); + roomInfo = await createChannelMethod(creatorId, roomData.name, members, false, {}, {}); } } diff --git a/apps/meteor/client/views/admin/rooms/EditRoom.tsx b/apps/meteor/client/views/admin/rooms/EditRoom.tsx index 18edd8cc815aa..1522f4694160e 100644 --- a/apps/meteor/client/views/admin/rooms/EditRoom.tsx +++ b/apps/meteor/client/views/admin/rooms/EditRoom.tsx @@ -182,7 +182,7 @@ const EditRoom = ({ room, onChange, onDelete }: EditRoomProps) => { {t('Owner')} - + )} diff --git a/apps/meteor/tests/e2e/fixtures/files/csv_import.zip b/apps/meteor/tests/e2e/fixtures/files/csv_import.zip new file mode 100644 index 0000000000000000000000000000000000000000..19415a7cd142c71c4b8dcbda71b72d8c3ffd7ecd GIT binary patch literal 991 zcmWIWW@Zs#-~hrYRiP0KQ1A;#^DrndBxfY%<)!8n>m?VLg@*7lu>Y{TmI}gWIvCoi1!J?rbGtEHA89CJnL(5X}YN3*3E zrze>5F$8$Cb66MJorwdw4CJ~1u)9Idl_(2?yBoyk2f8~YvnVyWBsaCVI59o7SRd?k z#?I@htUwH+(VPx33={~+hD`<W%;tMd>z!181(V+-%tM zXHw4L|_6?h7;)a(&E%2MC?`YT}uUFEV1Ve zi>FJ09!-X_LE1va+(kiOCw(q16`A93h|BM%Cs&+nRg8dZFH&B!z2OcQOU|>t*L7+`UM__ { - fs.createReadStream(slackCsvDir) - .pipe(parse({ delimiter: ',', from_line: 2 })) - .on('data', (rows) => { - rowUserName.push(rows[0]); - }); +// These files have the same content from users.csv, channels.csv and messages1.csv from the zip file +// They have been extracted just so that we don't need to do that on the fly +const usersCsvDir = path.resolve(__dirname, 'fixtures', 'files', 'csv_import_users.csv'); +const roomsCsvDir = path.resolve(__dirname, 'fixtures', 'files', 'csv_import_rooms.csv'); +const dmMessagesCsvDir = path.resolve(__dirname, 'fixtures', 'files', 'dm_messages.csv'); + +const usersCsvsToJson = async (): Promise => { + await new Promise((resolve) => + fs.createReadStream(slackCsvDir) + .pipe(parse({ delimiter: ',', from_line: 2 })) + .on('data', (rows) => { + rowUserName.push(rows[0]); + }) + .on('end', resolve) + ); + + await new Promise((resolve) => + fs.createReadStream(usersCsvDir) + .pipe(parse({ delimiter: ',' })) + .on('data', (rows) => { + rowUserName.push(rows[0]); + csvImportedUsernames.push(rows[0]); + }) + .on('end', resolve) + ); }; +const countDmMessages = (): Promise => ( + new Promise((resolve) => + fs.createReadStream(dmMessagesCsvDir) + .pipe(parse({ delimiter: ',' })) + .on('data', (rows) => { + dmMessages.push(rows[3]); + }) + .on('end', resolve) + ) +); + +const roomsCsvToJson = (): Promise => ( + new Promise((resolve) => + fs.createReadStream(roomsCsvDir) + .pipe(parse({ delimiter: ',' })) + .on('data', (rows) => { + importedRooms.push({ + name: rows[0], + ownerUsername: rows[1], + visibility: rows[2], + members: rows[3], + }); + }) + .on('end', resolve) + ) +); + test.describe.serial('imports', () => { - test.beforeAll(() => { - csvToJson(); + test.beforeAll(async () => { + await usersCsvsToJson(); + await roomsCsvToJson(); + await countDmMessages(); }); test('expect import users data from slack', async ({ page }) => { @@ -43,11 +102,70 @@ test.describe.serial('imports', () => { }); }); - test('expect to all users imported are actually listed as users', async ({ page }) => { + test('expect import users data from zipped CSV files', async ({ page }) => { + const poAdmin: Admin = new Admin(page); + await page.goto('/admin/import'); + + await poAdmin.btnImportNewFile.click(); + + await (await poAdmin.getOptionFileType('CSV')).click(); + + await poAdmin.inputFile.setInputFiles(zipCsvImportDir); + await poAdmin.btnImport.click(); + + await poAdmin.btnStartImport.click(); + + await expect(poAdmin.importStatusTableFirstRowCell).toBeVisible({ + timeout: 30_000, + }); + }); + + test('expect all imported users to be actually listed as users', async ({ page }) => { await page.goto('/admin/users'); for (const user of rowUserName) { expect(page.locator(`tbody tr td:first-child >> text="${user}"`)); } }); + + test('expect all imported rooms to be actually listed as rooms with correct members count', async ({ page }) => { + const poAdmin: Admin = new Admin(page); + await page.goto('/admin/rooms'); + + for await (const room of importedRooms) { + await poAdmin.inputSearchRooms.fill(room.name); + + const expectedMembersCount = room.members.split(';').filter((username) => username !== room.ownerUsername).length + 1; + expect(page.locator(`tbody tr td:nth-child(2) >> text="${ expectedMembersCount }"`)); + } + }); + + test('expect all imported rooms to have correct room type and owner', async ({ page }) => { + const poAdmin: Admin = new Admin(page); + await page.goto('/admin/rooms'); + + for await (const room of importedRooms) { + await poAdmin.inputSearchRooms.fill(room.name); + await poAdmin.getRoomRow(room.name).click(); + + room.visibility === 'private' ? await expect(poAdmin.privateInput).toBeChecked() : await expect(poAdmin.privateInput).not.toBeChecked(); + await expect(poAdmin.roomOwnerInput).toHaveValue(room.ownerUsername); + } + }); + + test('expect imported DM to be actually listed as a room with correct members and messages count', async ({ page }) => { + const poAdmin: Admin = new Admin(page); + await page.goto('/admin/rooms'); + + for await (const user of csvImportedUsernames) { + await poAdmin.inputSearchRooms.fill(user); + expect(page.locator(`tbody tr td:first-child >> text="${user}"`)); + + const expectedMembersCount = 2; + expect(page.locator(`tbody tr td:nth-child(2) >> text="${ expectedMembersCount }"`)); + + const expectedMessagesCount = dmMessages.length; + expect(page.locator(`tbody tr td:nth-child(3) >> text="${ expectedMessagesCount }"`)); + } + }); }); diff --git a/apps/meteor/tests/e2e/page-objects/admin.ts b/apps/meteor/tests/e2e/page-objects/admin.ts index 30b58cd29becf..519b15f0cc0c9 100644 --- a/apps/meteor/tests/e2e/page-objects/admin.ts +++ b/apps/meteor/tests/e2e/page-objects/admin.ts @@ -28,10 +28,18 @@ export class Admin { return this.page.locator(`label >> text=Private`); } + get privateInput(): Locator { + return this.page.locator('input[name="roomType"]'); + } + get roomNameInput(): Locator { return this.page.locator('input[name="roomName"]'); } + get roomOwnerInput(): Locator { + return this.page.locator('input[name="roomOwner"]'); + } + get archivedLabel(): Locator { return this.page.locator('label >> text=Archived'); } From f09953b196d4bb1699598a72e7dfa1fd6aa5b585 Mon Sep 17 00:00:00 2001 From: Pierre Lehnen <55164754+pierre-lehnen-rc@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:30:55 -0300 Subject: [PATCH 13/23] chore: Remove references to EE code from the app bridges (#31757) --- .../app/apps/server/bridges/activation.ts | 6 +-- apps/meteor/app/apps/server/bridges/api.ts | 5 +- apps/meteor/app/apps/server/bridges/cloud.ts | 4 +- .../app/apps/server/bridges/commands.ts | 46 +++++++++++------- .../meteor/app/apps/server/bridges/details.ts | 11 +++-- .../app/apps/server/bridges/environmental.ts | 5 +- apps/meteor/app/apps/server/bridges/http.ts | 5 +- .../app/apps/server/bridges/internal.ts | 17 ++++--- .../app/apps/server/bridges/livechat.ts | 48 +++++++++++-------- .../app/apps/server/bridges/messages.ts | 43 +++++++++-------- .../app/apps/server/bridges/moderation.ts | 4 +- .../app/apps/server/bridges/oauthApps.ts | 5 +- .../app/apps/server/bridges/persistence.ts | 13 +++-- apps/meteor/app/apps/server/bridges/roles.ts | 21 ++++---- apps/meteor/app/apps/server/bridges/rooms.ts | 30 +++++++----- .../app/apps/server/bridges/scheduler.ts | 5 +- .../app/apps/server/bridges/settings.ts | 5 +- apps/meteor/app/apps/server/bridges/thread.ts | 5 +- .../app/apps/server/bridges/uiInteraction.ts | 5 +- .../meteor/app/apps/server/bridges/uploads.ts | 8 ++-- apps/meteor/app/apps/server/bridges/users.ts | 28 +++++++---- .../apps/server/bridges/videoConferences.ts | 8 ++-- .../app/apps/server/converters/departments.js | 2 +- .../app/apps/server/converters/messages.js | 2 +- .../app/apps/server/converters/roles.ts | 9 ++-- .../app/apps/server/converters/rooms.js | 2 +- .../app/apps/server/converters/threads.ts | 43 ++++++++++------- .../server/converters/transformMappedData.ts} | 35 ++++++++++---- .../app/apps/server/converters/uploads.js | 2 +- .../server/converters/videoConferences.ts | 22 +++++---- .../app/apps/server/converters/visitors.js | 2 +- apps/meteor/package.json | 2 + packages/apps/.eslintrc.json | 4 ++ packages/apps/package.json | 29 +++++++++++ packages/apps/src/AppsEngine.ts | 20 ++++++++ packages/apps/src/IAppServerNotifier.ts | 14 ++++++ packages/apps/src/IAppServerOrchestrator.ts | 17 +++++++ .../apps/src/converters/IAppConvertersMap.ts | 27 +++++++++++ .../converters/IAppDepartmentsConverter.ts | 13 +++++ .../src/converters/IAppMessagesConverter.ts | 13 +++++ .../apps/src/converters/IAppRolesConverter.ts | 8 ++++ .../apps/src/converters/IAppRoomsConverter.ts | 14 ++++++ .../src/converters/IAppSettingsConverter.ts | 8 ++++ .../src/converters/IAppThreadsConverter.ts | 14 ++++++ .../src/converters/IAppUploadsConverter.ts | 13 +++++ .../apps/src/converters/IAppUsersConverter.ts | 14 ++++++ .../IAppVideoConferencesConverter.ts | 11 +++++ .../src/converters/IAppVisitorsConverter.ts | 14 ++++++ packages/apps/src/converters/index.ts | 11 +++++ packages/apps/src/index.ts | 4 ++ packages/apps/tsconfig.json | 9 ++++ yarn.lock | 28 ++++++++++- 52 files changed, 545 insertions(+), 188 deletions(-) rename apps/meteor/{ee/lib/misc/transformMappedData.js => app/apps/server/converters/transformMappedData.ts} (73%) create mode 100644 packages/apps/.eslintrc.json create mode 100644 packages/apps/package.json create mode 100644 packages/apps/src/AppsEngine.ts create mode 100644 packages/apps/src/IAppServerNotifier.ts create mode 100644 packages/apps/src/IAppServerOrchestrator.ts create mode 100644 packages/apps/src/converters/IAppConvertersMap.ts create mode 100644 packages/apps/src/converters/IAppDepartmentsConverter.ts create mode 100644 packages/apps/src/converters/IAppMessagesConverter.ts create mode 100644 packages/apps/src/converters/IAppRolesConverter.ts create mode 100644 packages/apps/src/converters/IAppRoomsConverter.ts create mode 100644 packages/apps/src/converters/IAppSettingsConverter.ts create mode 100644 packages/apps/src/converters/IAppThreadsConverter.ts create mode 100644 packages/apps/src/converters/IAppUploadsConverter.ts create mode 100644 packages/apps/src/converters/IAppUsersConverter.ts create mode 100644 packages/apps/src/converters/IAppVideoConferencesConverter.ts create mode 100644 packages/apps/src/converters/IAppVisitorsConverter.ts create mode 100644 packages/apps/src/converters/index.ts create mode 100644 packages/apps/src/index.ts create mode 100644 packages/apps/tsconfig.json diff --git a/apps/meteor/app/apps/server/bridges/activation.ts b/apps/meteor/app/apps/server/bridges/activation.ts index 72a5b882b18ab..dc5a0f57e0035 100644 --- a/apps/meteor/app/apps/server/bridges/activation.ts +++ b/apps/meteor/app/apps/server/bridges/activation.ts @@ -1,13 +1,11 @@ -import type { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; +import type { IAppServerOrchestrator, AppStatus } from '@rocket.chat/apps'; import type { ProxiedApp } from '@rocket.chat/apps-engine/server/ProxiedApp'; import { AppActivationBridge as ActivationBridge } from '@rocket.chat/apps-engine/server/bridges/AppActivationBridge'; import { Users } from '@rocket.chat/models'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - export class AppActivationBridge extends ActivationBridge { // eslint-disable-next-line no-empty-function - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/api.ts b/apps/meteor/app/apps/server/bridges/api.ts index a5767f11b9771..46bb70e3339a3 100644 --- a/apps/meteor/app/apps/server/bridges/api.ts +++ b/apps/meteor/app/apps/server/bridges/api.ts @@ -1,3 +1,4 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { RequestMethod } from '@rocket.chat/apps-engine/definition/accessors'; import type { IApiRequest, IApiEndpoint, IApi } from '@rocket.chat/apps-engine/definition/api'; import { ApiBridge } from '@rocket.chat/apps-engine/server/bridges/ApiBridge'; @@ -7,7 +8,6 @@ import express from 'express'; import { Meteor } from 'meteor/meteor'; import { WebApp } from 'meteor/webapp'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { authenticationMiddleware } from '../../../api/server/middlewares/authentication'; const apiServer = express(); @@ -24,8 +24,7 @@ interface IRequestWithPrivateHash extends Request { export class AppApisBridge extends ApiBridge { appRouters: Map; - // eslint-disable-next-line no-empty-function - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); this.appRouters = new Map(); diff --git a/apps/meteor/app/apps/server/bridges/cloud.ts b/apps/meteor/app/apps/server/bridges/cloud.ts index a0675c115f01e..30ca897240f81 100644 --- a/apps/meteor/app/apps/server/bridges/cloud.ts +++ b/apps/meteor/app/apps/server/bridges/cloud.ts @@ -1,11 +1,11 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IWorkspaceToken } from '@rocket.chat/apps-engine/definition/cloud/IWorkspaceToken'; import { CloudWorkspaceBridge } from '@rocket.chat/apps-engine/server/bridges/CloudWorkspaceBridge'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { getWorkspaceAccessTokenWithScope } from '../../../cloud/server'; export class AppCloudBridge extends CloudWorkspaceBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/commands.ts b/apps/meteor/app/apps/server/bridges/commands.ts index ee7e73e16eb5f..5e018c51de897 100644 --- a/apps/meteor/app/apps/server/bridges/commands.ts +++ b/apps/meteor/app/apps/server/bridges/commands.ts @@ -1,3 +1,4 @@ +import type { IAppServerOrchestrator, IAppsRoom, IAppsUser } from '@rocket.chat/apps'; import type { ISlashCommand, ISlashCommandPreview, ISlashCommandPreviewItem } from '@rocket.chat/apps-engine/definition/slashcommands'; import { SlashCommandContext } from '@rocket.chat/apps-engine/definition/slashcommands'; import { CommandBridge } from '@rocket.chat/apps-engine/server/bridges/CommandBridge'; @@ -5,14 +6,13 @@ import type { IMessage, RequiredField, SlashCommand, SlashCommandCallbackParams import { Meteor } from 'meteor/meteor'; import { Utilities } from '../../../../ee/lib/misc/Utilities'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { parseParameters } from '../../../../lib/utils/parseParameters'; import { slashCommands } from '../../../utils/server/slashCommand'; export class AppCommandsBridge extends CommandBridge { disabledCommands: Map; - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); this.disabledCommands = new Map(); } @@ -44,7 +44,7 @@ export class AppCommandsBridge extends CommandBridge { slashCommands.commands[cmd] = this.disabledCommands.get(cmd) as (typeof slashCommands.commands)[string]; this.disabledCommands.delete(cmd); - this.orch.getNotifier().commandUpdated(cmd); + void this.orch.getNotifier().commandUpdated(cmd); } protected async disableCommand(command: string, appId: string): Promise { @@ -69,7 +69,7 @@ export class AppCommandsBridge extends CommandBridge { this.disabledCommands.set(cmd, commandObj); delete slashCommands.commands[cmd]; - this.orch.getNotifier().commandDisabled(cmd); + void this.orch.getNotifier().commandDisabled(cmd); } // command: { command, paramsExample, i18nDescription, executor: function } @@ -95,7 +95,7 @@ export class AppCommandsBridge extends CommandBridge { ) as (typeof slashCommands.commands)[string]['previewCallback']; slashCommands.commands[cmd] = item; - this.orch.getNotifier().commandUpdated(cmd); + void this.orch.getNotifier().commandUpdated(cmd); } protected async registerCommand(command: ISlashCommand, appId: string): Promise { @@ -118,7 +118,7 @@ export class AppCommandsBridge extends CommandBridge { } as SlashCommand; slashCommands.commands[command.command.toLowerCase()] = item; - this.orch.getNotifier().commandAdded(command.command.toLowerCase()); + void this.orch.getNotifier().commandAdded(command.command.toLowerCase()); } protected async unregisterCommand(command: string, appId: string): Promise { @@ -132,7 +132,7 @@ export class AppCommandsBridge extends CommandBridge { this.disabledCommands.delete(cmd); delete slashCommands.commands[cmd]; - this.orch.getNotifier().commandRemoved(cmd); + void this.orch.getNotifier().commandRemoved(cmd); } private _verifyCommand(command: ISlashCommand): void { @@ -162,14 +162,15 @@ export class AppCommandsBridge extends CommandBridge { } private async _appCommandExecutor({ command, message, params, triggerId, userId }: SlashCommandCallbackParams): Promise { - const user = await this.orch.getConverters()?.get('users').convertById(userId); - const room = await this.orch.getConverters()?.get('rooms').convertById(message.rid); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const user: IAppsUser | undefined = await this.orch.getConverters()?.get('users').convertById(userId); + const room: IAppsRoom | undefined = await this.orch.getConverters()?.get('rooms').convertById(message.rid); const threadId = message.tmid; const parameters = parseParameters(params); const context = new SlashCommandContext( - Object.freeze(user), - Object.freeze(room), + Object.freeze(user as IAppsUser), + Object.freeze(room as IAppsRoom), Object.freeze(parameters) as string[], threadId, triggerId, @@ -183,12 +184,19 @@ export class AppCommandsBridge extends CommandBridge { parameters: any, message: RequiredField, 'rid'>, ): Promise { - const user = await this.orch.getConverters()?.get('users').convertById(Meteor.userId()); - const room = await this.orch.getConverters()?.get('rooms').convertById(message.rid); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const uid = Meteor.userId() as string; + const user: IAppsUser | undefined = await this.orch.getConverters()?.get('users').convertById(uid); + const room: IAppsRoom | undefined = await this.orch.getConverters()?.get('rooms').convertById(message.rid); const threadId = message.tmid; const params = parseParameters(parameters); - const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params) as string[], threadId); + const context = new SlashCommandContext( + Object.freeze(user as IAppsUser), + Object.freeze(room as IAppsRoom), + Object.freeze(params) as string[], + threadId, + ); return this.orch.getManager()?.getCommandManager().getPreviews(command, context); } @@ -199,14 +207,16 @@ export class AppCommandsBridge extends CommandBridge { preview: ISlashCommandPreviewItem, triggerId: string, ): Promise { - const user = await this.orch.getConverters()?.get('users').convertById(Meteor.userId()); - const room = await this.orch.getConverters()?.get('rooms').convertById(message.rid); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const uid = Meteor.userId() as string; + const user: IAppsUser | undefined = await this.orch.getConverters()?.get('users').convertById(uid); + const room: IAppsRoom | undefined = await this.orch.getConverters()?.get('rooms').convertById(message.rid); const threadId = message.tmid; const params = parseParameters(parameters); const context = new SlashCommandContext( - Object.freeze(user), - Object.freeze(room), + Object.freeze(user as IAppsUser), + Object.freeze(room as IAppsRoom), Object.freeze(params) as string[], threadId, triggerId, diff --git a/apps/meteor/app/apps/server/bridges/details.ts b/apps/meteor/app/apps/server/bridges/details.ts index 50709917183a5..3930cdd451cc7 100644 --- a/apps/meteor/app/apps/server/bridges/details.ts +++ b/apps/meteor/app/apps/server/bridges/details.ts @@ -1,18 +1,19 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; import { AppDetailChangesBridge as DetailChangesBridge } from '@rocket.chat/apps-engine/server/bridges/AppDetailChangesBridge'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - export class AppDetailChangesBridge extends DetailChangesBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } protected onAppSettingsChange(appId: string, setting: ISetting): void { + const logFailure = () => console.warn('failed to notify about the setting change.', appId); + try { - this.orch.getNotifier().appSettingsChange(appId, setting); + this.orch.getNotifier().appSettingsChange(appId, setting).catch(logFailure); } catch (e) { - console.warn('failed to notify about the setting change.', appId); + logFailure(); } } } diff --git a/apps/meteor/app/apps/server/bridges/environmental.ts b/apps/meteor/app/apps/server/bridges/environmental.ts index 43b34674e95fc..705a27186dee7 100644 --- a/apps/meteor/app/apps/server/bridges/environmental.ts +++ b/apps/meteor/app/apps/server/bridges/environmental.ts @@ -1,11 +1,10 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import { EnvironmentalVariableBridge } from '@rocket.chat/apps-engine/server/bridges/EnvironmentalVariableBridge'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - export class AppEnvironmentalVariableBridge extends EnvironmentalVariableBridge { allowed: Array; - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); this.allowed = ['NODE_ENV', 'ROOT_URL', 'INSTANCE_IP']; } diff --git a/apps/meteor/app/apps/server/bridges/http.ts b/apps/meteor/app/apps/server/bridges/http.ts index a4b09e848c90f..1535a18823c54 100644 --- a/apps/meteor/app/apps/server/bridges/http.ts +++ b/apps/meteor/app/apps/server/bridges/http.ts @@ -1,10 +1,9 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IHttpResponse } from '@rocket.chat/apps-engine/definition/accessors'; import type { IHttpBridgeRequestInfo } from '@rocket.chat/apps-engine/server/bridges'; import { HttpBridge } from '@rocket.chat/apps-engine/server/bridges/HttpBridge'; import { serverFetch as fetch } from '@rocket.chat/server-fetch'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - const isGetOrHead = (method: string): boolean => ['GET', 'HEAD'].includes(method.toUpperCase()); // Previously, there was no timeout for HTTP requests. @@ -13,7 +12,7 @@ const isGetOrHead = (method: string): boolean => ['GET', 'HEAD'].includes(method const DEFAULT_TIMEOUT = 3 * 60 * 1000; export class AppHttpBridge extends HttpBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/internal.ts b/apps/meteor/app/apps/server/bridges/internal.ts index b41ffbb2889eb..c5cd9a3f1a601 100644 --- a/apps/meteor/app/apps/server/bridges/internal.ts +++ b/apps/meteor/app/apps/server/bridges/internal.ts @@ -1,14 +1,13 @@ -import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; +import type { IAppServerOrchestrator, IAppsSetting } from '@rocket.chat/apps'; import { InternalBridge } from '@rocket.chat/apps-engine/server/bridges/InternalBridge'; -import type { ISubscription } from '@rocket.chat/core-typings'; +import type { ISetting, ISubscription } from '@rocket.chat/core-typings'; import { Settings, Subscriptions } from '@rocket.chat/models'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { isTruthy } from '../../../../lib/isTruthy'; import { deasyncPromise } from '../../../../server/deasync/deasync'; export class AppInternalBridge extends InternalBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } @@ -37,9 +36,13 @@ export class AppInternalBridge extends InternalBridge { return records.map((s: ISubscription) => s.u.username).filter(isTruthy); } - protected async getWorkspacePublicKey(): Promise { - const publicKeySetting = await Settings.findOneById('Cloud_Workspace_PublicKey'); + protected async getWorkspacePublicKey(): Promise { + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const publicKeySetting: ISetting | null = await Settings.findOneById('Cloud_Workspace_PublicKey'); - return this.orch.getConverters()?.get('settings').convertToApp(publicKeySetting); + return this.orch + .getConverters() + ?.get('settings') + .convertToApp(publicKeySetting as ISetting); } } diff --git a/apps/meteor/app/apps/server/bridges/livechat.ts b/apps/meteor/app/apps/server/bridges/livechat.ts index 2c5eaa841cdd8..bf175d1d14267 100644 --- a/apps/meteor/app/apps/server/bridges/livechat.ts +++ b/apps/meteor/app/apps/server/bridges/livechat.ts @@ -1,28 +1,22 @@ +import type { IAppServerOrchestrator, IAppsLivechatMessage } from '@rocket.chat/apps'; import type { IExtraRoomParams } from '@rocket.chat/apps-engine/definition/accessors/ILivechatCreator'; -import type { - ILivechatMessage, - IVisitor, - ILivechatRoom, - ILivechatTransferData, - IDepartment, -} from '@rocket.chat/apps-engine/definition/livechat'; +import type { IVisitor, ILivechatRoom, ILivechatTransferData, IDepartment } from '@rocket.chat/apps-engine/definition/livechat'; import type { IMessage as IAppsEngineMesage } from '@rocket.chat/apps-engine/definition/messages'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; import { LivechatBridge } from '@rocket.chat/apps-engine/server/bridges/LivechatBridge'; -import type { SelectedAgent } from '@rocket.chat/core-typings'; +import type { ILivechatDepartment, IOmnichannelRoom, SelectedAgent, IMessage, ILivechatVisitor } from '@rocket.chat/core-typings'; import { OmnichannelSourceType } from '@rocket.chat/core-typings'; import { LivechatVisitors, LivechatRooms, LivechatDepartment, Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { callbacks } from '../../../../lib/callbacks'; import { deasyncPromise } from '../../../../server/deasync/deasync'; import { getRoom } from '../../../livechat/server/api/lib/livechat'; -import { Livechat as LivechatTyped } from '../../../livechat/server/lib/LivechatTyped'; +import { type ILivechatMessage, Livechat as LivechatTyped } from '../../../livechat/server/lib/LivechatTyped'; import { settings } from '../../../settings/server'; export class AppLivechatBridge extends LivechatBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } @@ -36,16 +30,21 @@ export class AppLivechatBridge extends LivechatBridge { return LivechatTyped.online(departmentId); } - protected async createMessage(message: ILivechatMessage, appId: string): Promise { + protected async createMessage(message: IAppsLivechatMessage, appId: string): Promise { this.orch.debugLog(`The App ${appId} is creating a new message.`); if (!message.token) { throw new Error('Invalid token for livechat message'); } + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const guest = this.orch.getConverters().get('visitors').convertAppVisitor(message.visitor); + const appMessage = (await this.orch.getConverters().get('messages').convertAppMessage(message)) as IMessage | undefined; + const livechatMessage = appMessage as ILivechatMessage | undefined; + const msg = await LivechatTyped.sendMessage({ - guest: this.orch.getConverters()?.get('visitors').convertAppVisitor(message.visitor), - message: await this.orch.getConverters()?.get('messages').convertAppMessage(message), + guest: guest as ILivechatVisitor, + message: livechatMessage as ILivechatMessage, agent: undefined, roomInfo: { source: { @@ -59,13 +58,16 @@ export class AppLivechatBridge extends LivechatBridge { return msg._id; } - protected async getMessageById(messageId: string, appId: string): Promise { + protected async getMessageById(messageId: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the message: "${messageId}"`); - return this.orch.getConverters()?.get('messages').convertById(messageId); + const message = await this.orch.getConverters().get('messages').convertById(messageId); + + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + return message as IAppsLivechatMessage; } - protected async updateMessage(message: ILivechatMessage, appId: string): Promise { + protected async updateMessage(message: IAppsLivechatMessage, appId: string): Promise { this.orch.debugLog(`The App ${appId} is updating a message.`); const data = { @@ -114,7 +116,8 @@ export class AppLivechatBridge extends LivechatBridge { extraParams: undefined, }); - return this.orch.getConverters()?.get('rooms').convertRoom(result.room); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + return this.orch.getConverters()?.get('rooms').convertRoom(result.room) as Promise; } protected async closeRoom(room: ILivechatRoom, comment: string, closer: IUser | undefined, appId: string): Promise { @@ -152,7 +155,8 @@ export class AppLivechatBridge extends LivechatBridge { result = await LivechatRooms.findOpenByVisitorToken(visitor.token, {}, extraQuery).toArray(); } - return Promise.all((result as unknown as ILivechatRoom[]).map((room) => this.orch.getConverters()?.get('rooms').convertRoom(room))); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + return Promise.all(result.map((room) => this.orch.getConverters()?.get('rooms').convertRoom(room) as Promise)); } protected async createVisitor(visitor: IVisitor, appId: string): Promise { @@ -208,8 +212,9 @@ export class AppLivechatBridge extends LivechatBridge { userId = transferredTo._id; } + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. return LivechatTyped.transfer( - await this.orch.getConverters()?.get('rooms').convertAppRoom(currentRoom), + (await this.orch.getConverters()?.get('rooms').convertAppRoom(currentRoom)) as IOmnichannelRoom, this.orch.getConverters()?.get('visitors').convertAppVisitor(visitor), { userId, departmentId, transferredBy, transferredTo }, ); @@ -275,7 +280,8 @@ export class AppLivechatBridge extends LivechatBridge { this.orch.debugLog(`The App ${appId} is looking for livechat departments.`); const converter = this.orch.getConverters()?.get('departments'); - const boundConverter = converter.convertDepartment.bind(converter); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const boundConverter = converter.convertDepartment.bind(converter) as (_: ILivechatDepartment) => Promise; return Promise.all((await LivechatDepartment.findEnabledWithAgents().toArray()).map(boundConverter)); } diff --git a/apps/meteor/app/apps/server/bridges/messages.ts b/apps/meteor/app/apps/server/bridges/messages.ts index 311e3aaca1e1b..18a68220998fa 100644 --- a/apps/meteor/app/apps/server/bridges/messages.ts +++ b/apps/meteor/app/apps/server/bridges/messages.ts @@ -1,39 +1,41 @@ -import type { IMessage } from '@rocket.chat/apps-engine/definition/messages'; +import type { IAppServerOrchestrator, IAppsMessage, IAppsUser } from '@rocket.chat/apps'; import type { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; -import type { IUser } from '@rocket.chat/apps-engine/definition/users'; import type { ITypingDescriptor } from '@rocket.chat/apps-engine/server/bridges/MessageBridge'; import { MessageBridge } from '@rocket.chat/apps-engine/server/bridges/MessageBridge'; import { api } from '@rocket.chat/core-services'; +import type { IMessage } from '@rocket.chat/core-typings'; import { Users, Subscriptions, Messages } from '@rocket.chat/models'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { deleteMessage } from '../../../lib/server/functions/deleteMessage'; import { updateMessage } from '../../../lib/server/functions/updateMessage'; import { executeSendMessage } from '../../../lib/server/methods/sendMessage'; import notifications from '../../../notifications/server/lib/Notifications'; export class AppMessageBridge extends MessageBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } - protected async create(message: IMessage, appId: string): Promise { + protected async create(message: IAppsMessage, appId: string): Promise { this.orch.debugLog(`The App ${appId} is creating a new message.`); - const convertedMessage = await this.orch.getConverters()?.get('messages').convertAppMessage(message); - - const sentMessage = await executeSendMessage(convertedMessage.u._id, convertedMessage); + const convertedMessage: IMessage | undefined = await this.orch.getConverters()?.get('messages').convertAppMessage(message); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const definedMessage = convertedMessage as IMessage; + const sentMessage = await executeSendMessage(definedMessage.u._id, definedMessage); return sentMessage._id; } - protected async getById(messageId: string, appId: string): Promise { + protected async getById(messageId: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the message: "${messageId}"`); - return this.orch.getConverters()?.get('messages').convertById(messageId); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const message: IAppsMessage | undefined = await this.orch.getConverters()?.get('messages').convertById(messageId); + return message as IAppsMessage; } - protected async update(message: IMessage, appId: string): Promise { + protected async update(message: IAppsMessage, appId: string): Promise { this.orch.debugLog(`The App ${appId} is updating a message.`); if (!message.editor) { @@ -44,17 +46,18 @@ export class AppMessageBridge extends MessageBridge { throw new Error('A message must exist to update.'); } - const msg = await this.orch.getConverters()?.get('messages').convertAppMessage(message); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const msg: IMessage | undefined = await this.orch.getConverters()?.get('messages').convertAppMessage(message); const editor = await Users.findOneById(message.editor.id); if (!editor) { throw new Error('Invalid editor assigned to the message for the update.'); } - await updateMessage(msg, editor); + await updateMessage(msg as IMessage, editor); } - protected async delete(message: IMessage, user: IUser, appId: string): Promise { + protected async delete(message: IAppsMessage, user: IAppsUser, appId: string): Promise { this.orch.debugLog(`The App ${appId} is deleting a message.`); if (!message.id) { @@ -64,10 +67,10 @@ export class AppMessageBridge extends MessageBridge { const convertedMsg = await this.orch.getConverters()?.get('messages').convertAppMessage(message); const convertedUser = (await Users.findOneById(user.id)) || this.orch.getConverters()?.get('users').convertToRocketChat(user); - await deleteMessage(convertedMsg, convertedUser); + await deleteMessage(convertedMsg as IMessage, convertedUser); } - protected async notifyUser(user: IUser, message: IMessage, appId: string): Promise { + protected async notifyUser(user: IAppsUser, message: IAppsMessage, appId: string): Promise { this.orch.debugLog(`The App ${appId} is notifying a user.`); const msg = await this.orch.getConverters()?.get('messages').convertAppMessage(message); @@ -81,21 +84,23 @@ export class AppMessageBridge extends MessageBridge { }); } - protected async notifyRoom(room: IRoom, message: IMessage, appId: string): Promise { + protected async notifyRoom(room: IRoom, message: IAppsMessage, appId: string): Promise { this.orch.debugLog(`The App ${appId} is notifying a room's users.`); if (!room?.id) { return; } - const msg = await this.orch.getConverters()?.get('messages').convertAppMessage(message); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const msg: IMessage | undefined = await this.orch.getConverters()?.get('messages').convertAppMessage(message); + const convertedMessage = msg as IMessage; const users = (await Subscriptions.findByRoomIdWhenUserIdExists(room.id, { projection: { 'u._id': 1 } }).toArray()).map((s) => s.u._id); await Users.findByIds(users, { projection: { _id: 1 } }).forEach( ({ _id }: { _id: string }) => void api.broadcast('notify.ephemeralMessage', _id, room.id, { - ...msg, + ...convertedMessage, }), ); } diff --git a/apps/meteor/app/apps/server/bridges/moderation.ts b/apps/meteor/app/apps/server/bridges/moderation.ts index 4581f9a6ac6bd..0f1e56bbdec35 100644 --- a/apps/meteor/app/apps/server/bridges/moderation.ts +++ b/apps/meteor/app/apps/server/bridges/moderation.ts @@ -1,13 +1,13 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IMessage } from '@rocket.chat/apps-engine/definition/messages'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; import { ModerationBridge } from '@rocket.chat/apps-engine/server/bridges/ModerationBridge'; import { ModerationReports } from '@rocket.chat/models'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { reportMessage } from '../../../../server/lib/moderation/reportMessage'; export class AppModerationBridge extends ModerationBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/oauthApps.ts b/apps/meteor/app/apps/server/bridges/oauthApps.ts index 943c082ba85aa..ba8ed81246904 100644 --- a/apps/meteor/app/apps/server/bridges/oauthApps.ts +++ b/apps/meteor/app/apps/server/bridges/oauthApps.ts @@ -1,3 +1,4 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IOAuthApp, IOAuthAppParams } from '@rocket.chat/apps-engine/definition/accessors/IOAuthApp'; import { OAuthAppsBridge } from '@rocket.chat/apps-engine/server/bridges/OAuthAppsBridge'; import type { IOAuthApps } from '@rocket.chat/core-typings'; @@ -5,10 +6,8 @@ import { OAuthApps, Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; import { v4 as uuidv4 } from 'uuid'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - export class AppOAuthAppsBridge extends OAuthAppsBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/persistence.ts b/apps/meteor/app/apps/server/bridges/persistence.ts index 3810ed367e990..857f6a561ed6f 100644 --- a/apps/meteor/app/apps/server/bridges/persistence.ts +++ b/apps/meteor/app/apps/server/bridges/persistence.ts @@ -1,11 +1,10 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { RocketChatAssociationRecord } from '@rocket.chat/apps-engine/definition/metadata'; import { PersistenceBridge } from '@rocket.chat/apps-engine/server/bridges/PersistenceBridge'; -import type { InsertOneResult, UpdateResult } from 'mongodb'; - -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; +import type { InsertOneResult } from 'mongodb'; export class AppPersistenceBridge extends PersistenceBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } @@ -25,7 +24,7 @@ export class AppPersistenceBridge extends PersistenceBridge { return this.orch .getPersistenceModel() .insertOne({ appId, data }) - .then(({ insertedId }: InsertOneResult) => insertedId || ''); + .then(({ insertedId }: InsertOneResult) => (insertedId as unknown as string) || ''); } protected async createWithAssociations(data: object, associations: Array, appId: string): Promise { @@ -42,7 +41,7 @@ export class AppPersistenceBridge extends PersistenceBridge { return this.orch .getPersistenceModel() .insertOne({ appId, associations, data }) - .then(({ insertedId }: InsertOneResult) => insertedId || ''); + .then(({ insertedId }: InsertOneResult) => (insertedId as unknown as string) || ''); } protected async readById(id: string, appId: string): Promise { @@ -135,6 +134,6 @@ export class AppPersistenceBridge extends PersistenceBridge { return this.orch .getPersistenceModel() .update(query, { $set: { data } }, { upsert }) - .then(({ upsertedId }: UpdateResult) => upsertedId || ''); + .then(({ upsertedId }: any) => upsertedId || ''); } } diff --git a/apps/meteor/app/apps/server/bridges/roles.ts b/apps/meteor/app/apps/server/bridges/roles.ts index f973b7f49ed2a..aa0fcdc7b80b7 100644 --- a/apps/meteor/app/apps/server/bridges/roles.ts +++ b/apps/meteor/app/apps/server/bridges/roles.ts @@ -1,27 +1,30 @@ -import type { IRole } from '@rocket.chat/apps-engine/definition/roles'; +import type { IAppServerOrchestrator, IAppsRole } from '@rocket.chat/apps'; import { RoleBridge } from '@rocket.chat/apps-engine/server/bridges'; +import type { IRole } from '@rocket.chat/core-typings'; import { Roles } from '@rocket.chat/models'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - export class AppRoleBridge extends RoleBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } - protected async getOneByIdOrName(idOrName: IRole['id'] | IRole['name'], appId: string): Promise { + protected async getOneByIdOrName(idOrName: IAppsRole['id'] | IAppsRole['name'], appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the roleByIdOrName: "${idOrName}"`); - const role = await Roles.findOneByIdOrName(idOrName); - return this.orch.getConverters()?.get('roles').convertRole(role); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const role: IRole | null = await Roles.findOneByIdOrName(idOrName); + return this.orch + .getConverters() + ?.get('roles') + .convertRole(role as IRole); } - protected async getCustomRoles(appId: string): Promise> { + protected async getCustomRoles(appId: string): Promise> { this.orch.debugLog(`The App ${appId} is getting the custom roles`); const cursor = Roles.findCustomRoles(); - const roles: IRole[] = []; + const roles: IAppsRole[] = []; for await (const role of cursor) { const convRole = await this.orch.getConverters()?.get('roles').convertRole(role); diff --git a/apps/meteor/app/apps/server/bridges/rooms.ts b/apps/meteor/app/apps/server/bridges/rooms.ts index 91b0049513f0e..bbd24152716f0 100644 --- a/apps/meteor/app/apps/server/bridges/rooms.ts +++ b/apps/meteor/app/apps/server/bridges/rooms.ts @@ -1,3 +1,4 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IMessage } from '@rocket.chat/apps-engine/definition/messages'; import type { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; @@ -6,7 +7,6 @@ import { RoomBridge } from '@rocket.chat/apps-engine/server/bridges/RoomBridge'; import type { ISubscription, IUser as ICoreUser, IRoom as ICoreRoom } from '@rocket.chat/core-typings'; import { Subscriptions, Users, Rooms } from '@rocket.chat/models'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { createDirectMessage } from '../../../../server/methods/createDirectMessage'; import { createDiscussion } from '../../../discussion/server/methods/createDiscussion'; import { addUserToRoom } from '../../../lib/server/functions/addUserToRoom'; @@ -15,7 +15,7 @@ import { createChannelMethod } from '../../../lib/server/methods/createChannel'; import { createPrivateGroupMethod } from '../../../lib/server/methods/createPrivateGroup'; export class AppRoomBridge extends RoomBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } @@ -65,13 +65,17 @@ export class AppRoomBridge extends RoomBridge { protected async getById(roomId: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the roomById: "${roomId}"`); - return this.orch.getConverters()?.get('rooms').convertById(roomId); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const promise: Promise = this.orch.getConverters()?.get('rooms').convertById(roomId); + return promise as Promise; } protected async getByName(roomName: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the roomByName: "${roomName}"`); - return this.orch.getConverters()?.get('rooms').convertByName(roomName); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const promise: Promise = this.orch.getConverters()?.get('rooms').convertByName(roomName); + return promise as Promise; } protected async getCreatorById(roomId: string, appId: string): Promise { @@ -79,7 +83,7 @@ export class AppRoomBridge extends RoomBridge { const room = await Rooms.findOneById(roomId); - if (!room || !room.u || !room.u._id) { + if (!room?.u?._id) { return undefined; } @@ -91,7 +95,7 @@ export class AppRoomBridge extends RoomBridge { const room = await Rooms.findOneByName(roomName, {}); - if (!room || !room.u || !room.u._id) { + if (!room?.u?._id) { return undefined; } @@ -101,9 +105,12 @@ export class AppRoomBridge extends RoomBridge { protected async getMembers(roomId: string, appId: string): Promise> { this.orch.debugLog(`The App ${appId} is getting the room's members by room id: "${roomId}"`); const subscriptions = await Subscriptions.findByRoomId(roomId, {}); - return Promise.all( + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const promises: Promise<(IUser | undefined)[]> = Promise.all( (await subscriptions.toArray()).map((sub: ISubscription) => this.orch.getConverters()?.get('users').convertById(sub.u?._id)), ); + + return promises as Promise; } protected async getDirectByUsernames(usernames: Array, appId: string): Promise { @@ -124,7 +131,7 @@ export class AppRoomBridge extends RoomBridge { const rm = await this.orch.getConverters()?.get('rooms').convertAppRoom(room); - await Rooms.updateOne({ _id: rm._id }, { $set: rm }); + await Rooms.updateOne({ _id: rm._id }, { $set: rm as Partial }); for await (const username of members) { const member = await Users.findOneByUsername(username, {}); @@ -162,9 +169,10 @@ export class AppRoomBridge extends RoomBridge { throw new Error('There must be a parent room to create a discussion.'); } + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. const discussion = { prid: rcRoom.prid, - t_name: rcRoom.fname, + t_name: rcRoom.fname as string, pmid: rcMessage ? rcMessage._id : undefined, reply: reply && reply.trim() !== '' ? reply : undefined, users: members.length > 0 ? members : [], @@ -198,7 +206,7 @@ export class AppRoomBridge extends RoomBridge { }[]; // Was this a bug? const users = await Users.findByIds(subs.map((user: { uid: string }) => user.uid)).toArray(); - const userConverter = this.orch.getConverters()!.get('users'); - return users.map((user: ICoreUser) => userConverter!.convertToApp(user)); + const userConverter = this.orch.getConverters().get('users'); + return users.map((user: ICoreUser) => userConverter.convertToApp(user)); } } diff --git a/apps/meteor/app/apps/server/bridges/scheduler.ts b/apps/meteor/app/apps/server/bridges/scheduler.ts index 0b2995166e630..2f4799c79d70c 100644 --- a/apps/meteor/app/apps/server/bridges/scheduler.ts +++ b/apps/meteor/app/apps/server/bridges/scheduler.ts @@ -1,13 +1,12 @@ import type { Job } from '@rocket.chat/agenda'; import { Agenda } from '@rocket.chat/agenda'; +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IProcessor, IOnetimeSchedule, IRecurringSchedule, IJobContext } from '@rocket.chat/apps-engine/definition/scheduler'; import { StartupType } from '@rocket.chat/apps-engine/definition/scheduler'; import { SchedulerBridge } from '@rocket.chat/apps-engine/server/bridges/SchedulerBridge'; import { ObjectID } from 'bson'; import { MongoInternals } from 'meteor/mongo'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - function _callProcessor(processor: IProcessor['processor']): (job: Job) => Promise { return (job) => { const data = job?.attrs?.data || {}; @@ -36,7 +35,7 @@ export class AppSchedulerBridge extends SchedulerBridge { private scheduler: Agenda; - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); this.scheduler = new Agenda({ mongo: (MongoInternals.defaultRemoteCollectionDriver().mongo as any).client.db(), diff --git a/apps/meteor/app/apps/server/bridges/settings.ts b/apps/meteor/app/apps/server/bridges/settings.ts index d61de9e8eca5e..e90171813df85 100644 --- a/apps/meteor/app/apps/server/bridges/settings.ts +++ b/apps/meteor/app/apps/server/bridges/settings.ts @@ -1,11 +1,10 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; import { ServerSettingBridge } from '@rocket.chat/apps-engine/server/bridges/ServerSettingBridge'; import { Settings } from '@rocket.chat/models'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - export class AppSettingBridge extends ServerSettingBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/thread.ts b/apps/meteor/app/apps/server/bridges/thread.ts index 313f60ecc4ac9..099fe9184e004 100644 --- a/apps/meteor/app/apps/server/bridges/thread.ts +++ b/apps/meteor/app/apps/server/bridges/thread.ts @@ -1,10 +1,9 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IMessage } from '@rocket.chat/apps-engine/definition/messages'; import { ThreadBridge } from '@rocket.chat/apps-engine/server/bridges/ThreadBridge'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - export class AppThreadBridge extends ThreadBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/uiInteraction.ts b/apps/meteor/app/apps/server/bridges/uiInteraction.ts index 5783ac2b4eb3a..fc68e4e30d3ff 100644 --- a/apps/meteor/app/apps/server/bridges/uiInteraction.ts +++ b/apps/meteor/app/apps/server/bridges/uiInteraction.ts @@ -1,13 +1,12 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IUIKitInteraction } from '@rocket.chat/apps-engine/definition/uikit'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; import { UiInteractionBridge as AppsEngineUiInteractionBridge } from '@rocket.chat/apps-engine/server/bridges/UiInteractionBridge'; import { api } from '@rocket.chat/core-services'; import type * as UiKit from '@rocket.chat/ui-kit'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; - export class UiInteractionBridge extends AppsEngineUiInteractionBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } diff --git a/apps/meteor/app/apps/server/bridges/uploads.ts b/apps/meteor/app/apps/server/bridges/uploads.ts index df16704a31963..b9d0ff67de58e 100644 --- a/apps/meteor/app/apps/server/bridges/uploads.ts +++ b/apps/meteor/app/apps/server/bridges/uploads.ts @@ -1,9 +1,9 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IUpload } from '@rocket.chat/apps-engine/definition/uploads'; import type { IUploadDetails } from '@rocket.chat/apps-engine/definition/uploads/IUploadDetails'; import { UploadBridge } from '@rocket.chat/apps-engine/server/bridges/UploadBridge'; import { determineFileType } from '../../../../ee/lib/misc/determineFileType'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { FileUpload } from '../../../file-upload/server'; import { sendFileMessage } from '../../../file-upload/server/methods/sendFileMessage'; import { sendFileLivechatMessage } from '../../../livechat/server/methods/sendFileLivechatMessage'; @@ -16,14 +16,16 @@ const getUploadDetails = (details: IUploadDetails): Partial => { return details; }; export class AppUploadBridge extends UploadBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } protected async getById(id: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the upload: "${id}"`); - return this.orch.getConverters()?.get('uploads').convertById(id); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const promise: Promise = this.orch.getConverters()?.get('uploads').convertById(id); + return promise as Promise; } protected async getBuffer(upload: IUpload, appId: string): Promise { diff --git a/apps/meteor/app/apps/server/bridges/users.ts b/apps/meteor/app/apps/server/bridges/users.ts index d3c7dbc2a3d20..b0dfedd6273bc 100644 --- a/apps/meteor/app/apps/server/bridges/users.ts +++ b/apps/meteor/app/apps/server/bridges/users.ts @@ -1,3 +1,4 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IUserCreationOptions, IUser, UserType } from '@rocket.chat/apps-engine/definition/users'; import { UserBridge } from '@rocket.chat/apps-engine/server/bridges/UserBridge'; import { Presence } from '@rocket.chat/core-services'; @@ -5,7 +6,6 @@ import type { UserStatus } from '@rocket.chat/core-typings'; import { Subscriptions, Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { checkUsernameAvailability } from '../../../lib/server/functions/checkUsernameAvailability'; import { deleteUser } from '../../../lib/server/functions/deleteUser'; import { getUserCreatedByApp } from '../../../lib/server/functions/getUserCreatedByApp'; @@ -13,20 +13,23 @@ import { setUserActiveStatus } from '../../../lib/server/functions/setUserActive import { setUserAvatar } from '../../../lib/server/functions/setUserAvatar'; export class AppUserBridge extends UserBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } protected async getById(userId: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the userId: "${userId}"`); - - return this.orch.getConverters()?.get('users').convertById(userId); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const promise: Promise = this.orch.getConverters()?.get('users').convertById(userId); + return promise as Promise; } protected async getByUsername(username: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the username: "${username}"`); - return this.orch.getConverters()?.get('users').convertByUsername(username); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const promise: Promise = this.orch.getConverters()?.get('users').convertByUsername(username); + return promise as Promise; } protected async getAppUser(appId?: string): Promise { @@ -61,7 +64,11 @@ export class AppUserBridge extends UserBridge { protected async create(userDescriptor: Partial, appId: string, options?: IUserCreationOptions): Promise { this.orch.debugLog(`The App ${appId} is requesting to create a new user.`); - const user = this.orch.getConverters()?.get('users').convertToRocketChat(userDescriptor); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const user = this.orch + .getConverters() + ?.get('users') + .convertToRocketChat(userDescriptor as IUser); if (!user._id) { user._id = Random.id(); @@ -74,7 +81,7 @@ export class AppUserBridge extends UserBridge { switch (user.type) { case 'bot': case 'app': - if (!(await checkUsernameAvailability(user.username))) { + if (!(await checkUsernameAvailability(user.username as string))) { throw new Error(`The username "${user.username}" is already being used. Rename or remove the user using it to install this App`); } @@ -139,9 +146,12 @@ export class AppUserBridge extends UserBridge { if (!userId) { throw new Error('Invalid user id'); } - const convertedUser = await this.orch.getConverters()?.get('users').convertById(userId); - await setUserActiveStatus(convertedUser.id, false, confirmRelinquish); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const convertedUser: IUser | undefined = await this.orch.getConverters()?.get('users').convertById(userId); + const { id: uid } = convertedUser as IUser; + + await setUserActiveStatus(uid, false, confirmRelinquish); return true; } diff --git a/apps/meteor/app/apps/server/bridges/videoConferences.ts b/apps/meteor/app/apps/server/bridges/videoConferences.ts index c70f7f562fab8..bebcb25a6f516 100644 --- a/apps/meteor/app/apps/server/bridges/videoConferences.ts +++ b/apps/meteor/app/apps/server/bridges/videoConferences.ts @@ -1,21 +1,23 @@ +import type { IAppServerOrchestrator } from '@rocket.chat/apps'; import type { IVideoConfProvider } from '@rocket.chat/apps-engine/definition/videoConfProviders'; import type { AppVideoConference, VideoConference } from '@rocket.chat/apps-engine/definition/videoConferences'; import { VideoConferenceBridge } from '@rocket.chat/apps-engine/server/bridges/VideoConferenceBridge'; import { VideoConf } from '@rocket.chat/core-services'; -import type { AppServerOrchestrator } from '../../../../ee/server/apps/orchestrator'; import { videoConfProviders } from '../../../../server/lib/videoConfProviders'; import type { AppVideoConferencesConverter } from '../converters/videoConferences'; export class AppVideoConferenceBridge extends VideoConferenceBridge { - constructor(private readonly orch: AppServerOrchestrator) { + constructor(private readonly orch: IAppServerOrchestrator) { super(); } protected async getById(callId: string, appId: string): Promise { this.orch.debugLog(`The App ${appId} is getting the video conference byId: "${callId}"`); - return this.orch.getConverters()?.get('videoConferences').convertById(callId); + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const promise: Promise = this.orch.getConverters()?.get('videoConferences').convertById(callId); + return promise as Promise; } protected async create(call: AppVideoConference, appId: string): Promise { diff --git a/apps/meteor/app/apps/server/converters/departments.js b/apps/meteor/app/apps/server/converters/departments.js index 087d1956ca6bd..3fbfd07e9e99b 100644 --- a/apps/meteor/app/apps/server/converters/departments.js +++ b/apps/meteor/app/apps/server/converters/departments.js @@ -1,6 +1,6 @@ import { LivechatDepartment } from '@rocket.chat/models'; -import { transformMappedData } from '../../../../ee/lib/misc/transformMappedData'; +import { transformMappedData } from './transformMappedData'; export class AppDepartmentsConverter { constructor(orch) { diff --git a/apps/meteor/app/apps/server/converters/messages.js b/apps/meteor/app/apps/server/converters/messages.js index 6243bd2c603ea..187a6519339a4 100644 --- a/apps/meteor/app/apps/server/converters/messages.js +++ b/apps/meteor/app/apps/server/converters/messages.js @@ -1,7 +1,7 @@ import { Messages, Rooms, Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import { transformMappedData } from '../../../../ee/lib/misc/transformMappedData'; +import { transformMappedData } from './transformMappedData'; export class AppMessagesConverter { constructor(orch) { diff --git a/apps/meteor/app/apps/server/converters/roles.ts b/apps/meteor/app/apps/server/converters/roles.ts index 4ac1f39564207..10841a038c933 100644 --- a/apps/meteor/app/apps/server/converters/roles.ts +++ b/apps/meteor/app/apps/server/converters/roles.ts @@ -1,10 +1,11 @@ +import type { IAppRolesConverter } from '@rocket.chat/apps'; import type { IRole as AppsEngineRole } from '@rocket.chat/apps-engine/definition/roles'; import type { IRole } from '@rocket.chat/core-typings'; import { Roles } from '@rocket.chat/models'; -import { transformMappedData } from '../../../../ee/lib/misc/transformMappedData'; +import { transformMappedData } from './transformMappedData'; -export class AppRolesConverter { +export class AppRolesConverter implements IAppRolesConverter { async convertById(roleId: string): Promise { const role = await Roles.findOneById(roleId); @@ -22,8 +23,8 @@ export class AppRolesConverter { mandatory2fa: 'mandatory2fa', protected: 'protected', scope: 'scope', - }; + } as const; - return (await transformMappedData(role, map)) as unknown as AppsEngineRole; + return transformMappedData(role, map); } } diff --git a/apps/meteor/app/apps/server/converters/rooms.js b/apps/meteor/app/apps/server/converters/rooms.js index 9055342128362..670c1a248a0f0 100644 --- a/apps/meteor/app/apps/server/converters/rooms.js +++ b/apps/meteor/app/apps/server/converters/rooms.js @@ -1,7 +1,7 @@ import { RoomType } from '@rocket.chat/apps-engine/definition/rooms'; import { LivechatVisitors, Rooms, LivechatDepartment, Users } from '@rocket.chat/models'; -import { transformMappedData } from '../../../../ee/lib/misc/transformMappedData'; +import { transformMappedData } from './transformMappedData'; export class AppRoomsConverter { constructor(orch) { diff --git a/apps/meteor/app/apps/server/converters/threads.ts b/apps/meteor/app/apps/server/converters/threads.ts index 19d3b4aeae6d9..840f4f1613ebb 100644 --- a/apps/meteor/app/apps/server/converters/threads.ts +++ b/apps/meteor/app/apps/server/converters/threads.ts @@ -1,18 +1,20 @@ -import type { IMessage as AppsEngineMessage } from '@rocket.chat/apps-engine/definition/messages'; +import type { IAppRoomsConverter, IAppThreadsConverter, IAppUsersConverter, IAppsMessage, IAppsUser } from '@rocket.chat/apps'; +import type { IMessage as AppsEngineMessage, IMessageAttachment } from '@rocket.chat/apps-engine/definition/messages'; import type { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; +import type { IUser } from '@rocket.chat/core-typings'; import { isEditedMessage, type IMessage } from '@rocket.chat/core-typings'; import { Messages } from '@rocket.chat/models'; -import { transformMappedData } from '../../../../ee/lib/misc/transformMappedData'; +import { transformMappedData } from './transformMappedData'; // eslint-disable-next-line @typescript-eslint/naming-convention interface Orchestrator { rooms: () => { - convertById(id: string): Promise; + convertById: IAppRoomsConverter['convertById']; }; users: () => { - convertById(id: string): Promise; - convertToApp(user: unknown): Promise; + convertById: IAppUsersConverter['convertById']; + convertToApp: IAppUsersConverter['convertToApp']; }; } @@ -34,7 +36,7 @@ const cachedFunction = any>(fn: F) => { }) as F; }; -export class AppThreadsConverter { +export class AppThreadsConverter implements IAppThreadsConverter { constructor( private readonly orch: { getConverters: () => { @@ -111,7 +113,7 @@ export class AppThreadsConverter { return convertUserById(editedBy._id); }, - attachments: async (message: IMessage) => { + attachments: async (message: IMessage): Promise => { if (!message.attachments) { return undefined; } @@ -119,26 +121,33 @@ export class AppThreadsConverter { delete message.attachments; return result; }, - sender: async (message: IMessage) => { + sender: async (message: IMessage): Promise => { + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. if (!message.u?._id) { - return undefined; + return undefined as unknown as IAppsUser; } - let user = await convertUserById(message.u._id); + let user: IAppsUser | undefined = await convertUserById(message.u._id); // When the sender of the message is a Guest (livechat) and not a user if (!user) { - user = await convertToApp(message.u); + user = await convertToApp(message.u as unknown as IUser); } - return user; + return user as IAppsUser; }, - }; + } as const; - return (await transformMappedData(msgObj, map)) as unknown as AppsEngineMessage; + // #TODO: #AppsEngineTypes - Remove explicit types and typecasts once the apps-engine definition/implementation mismatch is fixed. + const msgData = { + ...msgObj, + reactions: msgObj.reactions as unknown as AppsEngineMessage['reactions'], + } as IMessage & { reactions?: AppsEngineMessage['reactions'] }; + + return transformMappedData(msgData, map); } - async _convertAttachmentsToApp(attachments: NonNullable) { + async _convertAttachmentsToApp(attachments: NonNullable): Promise> { const map = { collapsed: 'collapsed', color: 'color', @@ -161,7 +170,7 @@ export class AppThreadsConverter { actions: 'actions', type: 'type', description: 'description', - author: (attachment: NonNullable[number]) => { + author: (attachment: NonNullable[number]): IMessageAttachment['author'] => { if (!('author_name' in attachment)) { return; } @@ -188,7 +197,7 @@ export class AppThreadsConverter { delete attachment.ts; return result; }, - }; + } as const; return Promise.all(attachments.map(async (attachment) => transformMappedData(attachment, map))); } diff --git a/apps/meteor/ee/lib/misc/transformMappedData.js b/apps/meteor/app/apps/server/converters/transformMappedData.ts similarity index 73% rename from apps/meteor/ee/lib/misc/transformMappedData.js rename to apps/meteor/app/apps/server/converters/transformMappedData.ts index 963f98cb6cf59..df2f16138d731 100644 --- a/apps/meteor/ee/lib/misc/transformMappedData.js +++ b/apps/meteor/app/apps/server/converters/transformMappedData.ts @@ -12,7 +12,7 @@ import cloneDeep from 'lodash.clonedeep'; * * ```javascript * const data = { _id: 'abcde123456', size: 10 }; - * const map = { id: '_id' } + * const map = Object.freeze({ id: '_id' }); * * transformMappedData(data, map); * // { id: 'abcde123456', _unmappedProperties_: { size: 10 } } @@ -43,14 +43,14 @@ import cloneDeep from 'lodash.clonedeep'; * // { id: 'abcde123456', newSize: 20, _unmappedProperties_: { size: 10 } } * * // You need to explicitly remove it from the original `data` - * const map = { + * const map = Object.freeze({ * id: '_id', * newSize: (data) => { * const result = data.size + 10; * delete data.size; * return result; * } - * }; + * }); * * transformMappedData(data, map); * // { id: 'abcde123456', newSize: 20, _unmappedProperties_: {} } @@ -62,9 +62,25 @@ import cloneDeep from 'lodash.clonedeep'; * @returns Object The data after transformations have been applied */ -export const transformMappedData = async (data, map) => { - const originalData = cloneDeep(data); - const transformedData = {}; +export const transformMappedData = async < + ResultType extends { + -readonly [p in keyof MapType]: MapType[p] extends keyof DataType + ? DataType[MapType[p]] + : MapType[p] extends (...args: any[]) => any + ? Awaited> + : never; + }, + DataType extends Record, + MapType extends { [p in string]: string | ((data: DataType) => Promise) | ((data: DataType) => unknown) }, + UnmappedProperties extends { + [p in keyof DataType as Exclude]: DataType[p]; + }, +>( + data: DataType, + map: MapType, +): Promise => { + const originalData: DataType = cloneDeep(data); + const transformedData: Record = {}; for await (const [to, from] of Object.entries(map)) { if (typeof from === 'function') { @@ -81,7 +97,8 @@ export const transformMappedData = async (data, map) => { } } - transformedData._unmappedProperties_ = originalData; - - return transformedData; + return { + ...(transformedData as ResultType), + _unmappedProperties_: originalData as unknown as UnmappedProperties, + }; }; diff --git a/apps/meteor/app/apps/server/converters/uploads.js b/apps/meteor/app/apps/server/converters/uploads.js index b6531854aa38a..60f85a8aa72f1 100644 --- a/apps/meteor/app/apps/server/converters/uploads.js +++ b/apps/meteor/app/apps/server/converters/uploads.js @@ -1,6 +1,6 @@ import { Uploads } from '@rocket.chat/models'; -import { transformMappedData } from '../../../../ee/lib/misc/transformMappedData'; +import { transformMappedData } from './transformMappedData'; export class AppUploadsConverter { constructor(orch) { diff --git a/apps/meteor/app/apps/server/converters/videoConferences.ts b/apps/meteor/app/apps/server/converters/videoConferences.ts index 00eb4e9151379..7a9120bf8508a 100644 --- a/apps/meteor/app/apps/server/converters/videoConferences.ts +++ b/apps/meteor/app/apps/server/converters/videoConferences.ts @@ -1,27 +1,33 @@ -import type { VideoConference } from '@rocket.chat/apps-engine/definition/videoConferences'; +import type { IAppVideoConferencesConverter, AppsVideoConference } from '@rocket.chat/apps'; import { VideoConf } from '@rocket.chat/core-services'; -import type { IVideoConference } from '@rocket.chat/core-typings'; +import type { VideoConference } from '@rocket.chat/core-typings'; -export class AppVideoConferencesConverter { - async convertById(callId: string): Promise { +export class AppVideoConferencesConverter implements IAppVideoConferencesConverter { + async convertById(callId: string): Promise { const call = await VideoConf.getUnfiltered(callId); return this.convertVideoConference(call); } - convertVideoConference(call: IVideoConference | null): VideoConference | undefined { + convertVideoConference(call: undefined | null): undefined; + + convertVideoConference(call: VideoConference): AppsVideoConference; + + convertVideoConference(call: VideoConference | undefined | null): AppsVideoConference | undefined; + + convertVideoConference(call: VideoConference | undefined | null): AppsVideoConference | undefined { if (!call) { return; } return { ...call, - } as VideoConference; + } as AppsVideoConference; } - convertAppVideoConference(call: VideoConference): IVideoConference { + convertAppVideoConference(call: AppsVideoConference): VideoConference { return { ...call, - } as IVideoConference; + } as VideoConference; } } diff --git a/apps/meteor/app/apps/server/converters/visitors.js b/apps/meteor/app/apps/server/converters/visitors.js index a9f5d450efad6..c8fb0b7c4a21c 100644 --- a/apps/meteor/app/apps/server/converters/visitors.js +++ b/apps/meteor/app/apps/server/converters/visitors.js @@ -1,6 +1,6 @@ import { LivechatVisitors } from '@rocket.chat/models'; -import { transformMappedData } from '../../../../ee/lib/misc/transformMappedData'; +import { transformMappedData } from './transformMappedData'; // TODO: check if functions from this converter can be async export class AppVisitorsConverter { diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 26dc53518ce34..5315be345652d 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -122,6 +122,7 @@ "@types/later": "^1.2.8", "@types/ldapjs": "^2.2.5", "@types/less": "~3.0.5", + "@types/lodash.clonedeep": "^4.5.9", "@types/lodash.get": "^4.4.8", "@types/mailparser": "^3.4.3", "@types/marked": "^4.0.8", @@ -229,6 +230,7 @@ "@rocket.chat/account-utils": "workspace:^", "@rocket.chat/agenda": "workspace:^", "@rocket.chat/api-client": "workspace:^", + "@rocket.chat/apps": "workspace:^", "@rocket.chat/apps-engine": "1.41.0", "@rocket.chat/base64": "workspace:^", "@rocket.chat/cas-validate": "workspace:^", diff --git a/packages/apps/.eslintrc.json b/packages/apps/.eslintrc.json new file mode 100644 index 0000000000000..a83aeda48e66d --- /dev/null +++ b/packages/apps/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": ["@rocket.chat/eslint-config"], + "ignorePatterns": ["**/dist"] +} diff --git a/packages/apps/package.json b/packages/apps/package.json new file mode 100644 index 0000000000000..ab37d0d388b04 --- /dev/null +++ b/packages/apps/package.json @@ -0,0 +1,29 @@ +{ + "name": "@rocket.chat/apps", + "version": "0.0.1", + "private": true, + "devDependencies": { + "@types/jest": "~29.5.7", + "eslint": "~8.45.0", + "jest": "~29.6.4", + "ts-jest": "~29.1.1", + "typescript": "~5.3.2" + }, + "scripts": { + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", + "test": "jest", + "build": "rm -rf dist && tsc -p tsconfig.json", + "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" + }, + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "files": [ + "/dist" + ], + "dependencies": { + "@rocket.chat/apps-engine": "^1.41.0", + "@rocket.chat/core-typings": "workspace:^", + "@rocket.chat/model-typings": "workspace:^" + } +} diff --git a/packages/apps/src/AppsEngine.ts b/packages/apps/src/AppsEngine.ts new file mode 100644 index 0000000000000..117e93c0ec2f7 --- /dev/null +++ b/packages/apps/src/AppsEngine.ts @@ -0,0 +1,20 @@ +export type { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; +export type { + IDepartment as IAppsDepartment, + ILivechatMessage as IAppsLivechatMessage, + ILivechatRoom as IAppsLivechatRoom, + IVisitor as IAppsVisitor, + IVisitorEmail as IAppsVisitorEmail, + IVisitorPhone as IAppsVisitorPhone, +} from '@rocket.chat/apps-engine/definition/livechat'; +export type { IMessage as IAppsMessage } from '@rocket.chat/apps-engine/definition/messages'; +export type { IUser as IAppsUser } from '@rocket.chat/apps-engine/definition/users'; +export type { IRole as IAppsRole } from '@rocket.chat/apps-engine/definition/roles'; +export type { IRoom as IAppsRoom } from '@rocket.chat/apps-engine/definition/rooms'; +export type { ISetting as IAppsSetting } from '@rocket.chat/apps-engine/definition/settings'; +export type { IUpload as IAppsUpload } from '@rocket.chat/apps-engine/definition/uploads'; +export type { + IVideoConference as IAppsVideoConference, + VideoConference as AppsVideoConference, +} from '@rocket.chat/apps-engine/definition/videoConferences'; +export { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; diff --git a/packages/apps/src/IAppServerNotifier.ts b/packages/apps/src/IAppServerNotifier.ts new file mode 100644 index 0000000000000..954f4a2ba5df4 --- /dev/null +++ b/packages/apps/src/IAppServerNotifier.ts @@ -0,0 +1,14 @@ +import type { AppStatus, IAppsSetting } from './AppsEngine'; + +export interface IAppServerNotifier { + appAdded(appId: string): Promise; + appRemoved(appId: string): Promise; + appUpdated(appId: string): Promise; + appStatusUpdated(appId: string, status: AppStatus): Promise; + appSettingsChange(appId: string, setting: IAppsSetting): Promise; + commandAdded(command: string): Promise; + commandDisabled(command: string): Promise; + commandUpdated(command: string): Promise; + commandRemoved(command: string): Promise; + actionsChanged(): Promise; +} diff --git a/packages/apps/src/IAppServerOrchestrator.ts b/packages/apps/src/IAppServerOrchestrator.ts new file mode 100644 index 0000000000000..dbfc5aee7a20d --- /dev/null +++ b/packages/apps/src/IAppServerOrchestrator.ts @@ -0,0 +1,17 @@ +import type { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; +import type { Logger } from '@rocket.chat/logger'; +import type { IAppsPersistenceModel } from '@rocket.chat/model-typings'; + +import type { IAppServerNotifier } from './IAppServerNotifier'; +import type { IAppConvertersMap } from './converters'; + +export interface IAppServerOrchestrator { + initialize(): void; + getNotifier(): IAppServerNotifier; + isDebugging(): boolean; + debugLog(...args: any[]): void; + getManager(): AppManager; + getConverters(): IAppConvertersMap; + getPersistenceModel(): IAppsPersistenceModel; + getRocketChatLogger(): Logger; +} diff --git a/packages/apps/src/converters/IAppConvertersMap.ts b/packages/apps/src/converters/IAppConvertersMap.ts new file mode 100644 index 0000000000000..63c94d44cb75b --- /dev/null +++ b/packages/apps/src/converters/IAppConvertersMap.ts @@ -0,0 +1,27 @@ +import type { IAppDepartmentsConverter } from './IAppDepartmentsConverter'; +import type { IAppMessagesConverter } from './IAppMessagesConverter'; +import type { IAppRolesConverter } from './IAppRolesConverter'; +import type { IAppRoomsConverter } from './IAppRoomsConverter'; +import type { IAppSettingsConverter } from './IAppSettingsConverter'; +import type { IAppThreadsConverter } from './IAppThreadsConverter'; +import type { IAppUploadsConverter } from './IAppUploadsConverter'; +import type { IAppUsersConverter } from './IAppUsersConverter'; +import type { IAppVideoConferencesConverter } from './IAppVideoConferencesConverter'; +import type { IAppVisitorsConverter } from './IAppVisitorsConverter'; + +type AppConverters = { + departments: IAppDepartmentsConverter; + messages: IAppMessagesConverter; + rooms: IAppRoomsConverter; + roles: IAppRolesConverter; + settings: IAppSettingsConverter; + threads: IAppThreadsConverter; + uploads: IAppUploadsConverter; + users: IAppUsersConverter; + visitors: IAppVisitorsConverter; + videoConferences: IAppVideoConferencesConverter; +}; + +export interface IAppConvertersMap extends Map { + get(key: T): AppConverters[T]; +} diff --git a/packages/apps/src/converters/IAppDepartmentsConverter.ts b/packages/apps/src/converters/IAppDepartmentsConverter.ts new file mode 100644 index 0000000000000..8dee30caa38c2 --- /dev/null +++ b/packages/apps/src/converters/IAppDepartmentsConverter.ts @@ -0,0 +1,13 @@ +import type { ILivechatDepartment } from '@rocket.chat/core-typings'; + +import type { IAppsDepartment } from '../AppsEngine'; + +export interface IAppDepartmentsConverter { + convertById(departmentId: ILivechatDepartment['_id']): Promise; + convertDepartment(department: undefined | null): Promise; + convertDepartment(department: ILivechatDepartment): Promise; + convertDepartment(department: ILivechatDepartment | undefined | null): Promise; + convertAppDepartment(department: undefined | null): undefined; + convertAppDepartment(department: IAppsDepartment): ILivechatDepartment; + convertAppDepartment(department: IAppsDepartment | undefined | null): ILivechatDepartment | undefined; +} diff --git a/packages/apps/src/converters/IAppMessagesConverter.ts b/packages/apps/src/converters/IAppMessagesConverter.ts new file mode 100644 index 0000000000000..185e247895de2 --- /dev/null +++ b/packages/apps/src/converters/IAppMessagesConverter.ts @@ -0,0 +1,13 @@ +import type { IMessage } from '@rocket.chat/core-typings'; + +import type { IAppsMessage } from '../AppsEngine'; + +export interface IAppMessagesConverter { + convertById(messageId: IMessage['_id']): Promise; + convertMessage(message: undefined | null): Promise; + convertMessage(message: IMessage): Promise; + convertMessage(message: IMessage | undefined | null): Promise; + convertAppMessage(message: undefined | null): Promise; + convertAppMessage(message: IAppsMessage): Promise; + convertAppMessage(message: IAppsMessage | undefined | null): Promise; +} diff --git a/packages/apps/src/converters/IAppRolesConverter.ts b/packages/apps/src/converters/IAppRolesConverter.ts new file mode 100644 index 0000000000000..07ed84232ade4 --- /dev/null +++ b/packages/apps/src/converters/IAppRolesConverter.ts @@ -0,0 +1,8 @@ +import type { IRole } from '@rocket.chat/core-typings'; + +import type { IAppsRole } from '../AppsEngine'; + +export interface IAppRolesConverter { + convertById(roleId: IRole['_id']): Promise; + convertRole(role: IRole): Promise; +} diff --git a/packages/apps/src/converters/IAppRoomsConverter.ts b/packages/apps/src/converters/IAppRoomsConverter.ts new file mode 100644 index 0000000000000..9408b3f9b63ca --- /dev/null +++ b/packages/apps/src/converters/IAppRoomsConverter.ts @@ -0,0 +1,14 @@ +import type { IRoom } from '@rocket.chat/core-typings'; + +import type { IAppsRoom, IAppsLivechatRoom } from '../AppsEngine'; + +export interface IAppRoomsConverter { + convertById(roomId: IRoom['_id']): Promise; + convertByName(roomName: IRoom['name']): Promise; + convertRoom(room: undefined | null): Promise; + convertRoom(room: IRoom): Promise; + convertRoom(room: IRoom | undefined | null): Promise; + convertAppRoom(room: undefined | null): Promise; + convertAppRoom(room: IAppsRoom): Promise; + convertAppRoom(room: IAppsRoom | undefined | null): Promise; +} diff --git a/packages/apps/src/converters/IAppSettingsConverter.ts b/packages/apps/src/converters/IAppSettingsConverter.ts new file mode 100644 index 0000000000000..32db63e06c704 --- /dev/null +++ b/packages/apps/src/converters/IAppSettingsConverter.ts @@ -0,0 +1,8 @@ +import type { ISetting } from '@rocket.chat/core-typings'; + +import type { IAppsSetting } from '../AppsEngine'; + +export interface IAppSettingsConverter { + convertById(settingId: ISetting['_id']): Promise; + convertToApp(setting: ISetting): IAppsSetting; +} diff --git a/packages/apps/src/converters/IAppThreadsConverter.ts b/packages/apps/src/converters/IAppThreadsConverter.ts new file mode 100644 index 0000000000000..5253651c2683e --- /dev/null +++ b/packages/apps/src/converters/IAppThreadsConverter.ts @@ -0,0 +1,14 @@ +import type { IMessage } from '@rocket.chat/core-typings'; + +import type { IAppsMessage, IAppsRoom } from '../AppsEngine'; +import type { IAppUsersConverter } from './IAppUsersConverter'; + +export interface IAppThreadsConverter { + convertById(threadId: string): Promise; + convertMessage( + msgObj: IMessage, + room: IAppsRoom, + convertUserById: IAppUsersConverter['convertById'], + convertToApp: IAppUsersConverter['convertToApp'], + ): Promise; +} diff --git a/packages/apps/src/converters/IAppUploadsConverter.ts b/packages/apps/src/converters/IAppUploadsConverter.ts new file mode 100644 index 0000000000000..4c7e4c2855c9a --- /dev/null +++ b/packages/apps/src/converters/IAppUploadsConverter.ts @@ -0,0 +1,13 @@ +import type { IUpload } from '@rocket.chat/core-typings'; + +import type { IAppsUpload } from '../AppsEngine'; + +export interface IAppUploadsConverter { + convertById(uploadId: string): Promise; + convertToApp(upload: undefined | null): Promise; + convertToApp(upload: IUpload): Promise; + convertToApp(upload: IUpload | undefined | null): Promise; + convertToRocketChat(upload: undefined | null): undefined; + convertToRocketChat(upload: IAppsUpload): IUpload; + convertToRocketChat(upload: IAppsUpload | undefined | null): IUpload | undefined; +} diff --git a/packages/apps/src/converters/IAppUsersConverter.ts b/packages/apps/src/converters/IAppUsersConverter.ts new file mode 100644 index 0000000000000..8d67cb9e5240d --- /dev/null +++ b/packages/apps/src/converters/IAppUsersConverter.ts @@ -0,0 +1,14 @@ +import type { IUser } from '@rocket.chat/core-typings'; + +import type { IAppsUser } from '../AppsEngine'; + +export interface IAppUsersConverter { + convertById(userId: IUser['_id']): Promise; + convertByUsername(username: IUser['username']): Promise; + convertToApp(user: undefined | null): undefined; + convertToApp(user: IUser): IAppsUser; + convertToApp(user: IUser | undefined | null): IAppsUser | undefined; + convertToRocketChat(user: undefined | null): undefined; + convertToRocketChat(user: IAppsUser): IUser; + convertToRocketChat(user: IAppsUser | undefined | null): IUser | undefined; +} diff --git a/packages/apps/src/converters/IAppVideoConferencesConverter.ts b/packages/apps/src/converters/IAppVideoConferencesConverter.ts new file mode 100644 index 0000000000000..b599c29e38641 --- /dev/null +++ b/packages/apps/src/converters/IAppVideoConferencesConverter.ts @@ -0,0 +1,11 @@ +import type { VideoConference } from '@rocket.chat/core-typings'; + +import type { AppsVideoConference } from '../AppsEngine'; + +export interface IAppVideoConferencesConverter { + convertById(videoConferenceId: VideoConference['_id']): Promise; + convertVideoConference(videoConference: undefined | null): undefined; + convertVideoConference(videoConference: VideoConference): AppsVideoConference; + convertVideoConference(videoConference: VideoConference | undefined | null): AppsVideoConference | undefined; + convertAppVideoConference(videoConference: AppsVideoConference): VideoConference; +} diff --git a/packages/apps/src/converters/IAppVisitorsConverter.ts b/packages/apps/src/converters/IAppVisitorsConverter.ts new file mode 100644 index 0000000000000..575845b57c105 --- /dev/null +++ b/packages/apps/src/converters/IAppVisitorsConverter.ts @@ -0,0 +1,14 @@ +import type { ILivechatVisitor } from '@rocket.chat/core-typings'; + +import type { IAppsVisitor } from '../AppsEngine'; + +export interface IAppVisitorsConverter { + convertById(visitorId: ILivechatVisitor['_id']): Promise; + convertByToken(token: string): Promise; + convertVisitor(visitor: undefined | null): Promise; + convertVisitor(visitor: ILivechatVisitor): Promise; + convertVisitor(visitor: ILivechatVisitor | undefined | null): Promise; + convertAppVisitor(visitor: undefined | null): undefined; + convertAppVisitor(visitor: IAppsVisitor): ILivechatVisitor; + convertAppVisitor(visitor: IAppsVisitor | undefined | null): ILivechatVisitor | undefined; +} diff --git a/packages/apps/src/converters/index.ts b/packages/apps/src/converters/index.ts new file mode 100644 index 0000000000000..61560afb5a4e4 --- /dev/null +++ b/packages/apps/src/converters/index.ts @@ -0,0 +1,11 @@ +export * from './IAppConvertersMap'; +export * from './IAppDepartmentsConverter'; +export * from './IAppMessagesConverter'; +export * from './IAppRolesConverter'; +export * from './IAppRoomsConverter'; +export * from './IAppSettingsConverter'; +export * from './IAppThreadsConverter'; +export * from './IAppUploadsConverter'; +export * from './IAppUsersConverter'; +export * from './IAppVideoConferencesConverter'; +export * from './IAppVisitorsConverter'; diff --git a/packages/apps/src/index.ts b/packages/apps/src/index.ts new file mode 100644 index 0000000000000..e137fa3cf0078 --- /dev/null +++ b/packages/apps/src/index.ts @@ -0,0 +1,4 @@ +export * from './converters'; +export * from './AppsEngine'; +export * from './IAppServerNotifier'; +export * from './IAppServerOrchestrator'; diff --git a/packages/apps/tsconfig.json b/packages/apps/tsconfig.json new file mode 100644 index 0000000000000..52e9dd8c4976b --- /dev/null +++ b/packages/apps/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.server.json", + "compilerOptions": { + "declaration": true, + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["./src/**/*"] +} diff --git a/yarn.lock b/yarn.lock index 5a9c7311afaa5..431dee85f2b0e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8331,7 +8331,7 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/apps-engine@npm:1.41.0": +"@rocket.chat/apps-engine@npm:1.41.0, @rocket.chat/apps-engine@npm:^1.41.0": version: 1.41.0 resolution: "@rocket.chat/apps-engine@npm:1.41.0" dependencies: @@ -8349,6 +8349,21 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/apps@workspace:^, @rocket.chat/apps@workspace:packages/apps": + version: 0.0.0-use.local + resolution: "@rocket.chat/apps@workspace:packages/apps" + dependencies: + "@rocket.chat/apps-engine": ^1.41.0 + "@rocket.chat/core-typings": "workspace:^" + "@rocket.chat/model-typings": "workspace:^" + "@types/jest": ~29.5.7 + eslint: ~8.45.0 + jest: ~29.6.4 + ts-jest: ~29.1.1 + typescript: ~5.3.2 + languageName: unknown + linkType: soft + "@rocket.chat/authorization-service@workspace:ee/apps/authorization-service": version: 0.0.0-use.local resolution: "@rocket.chat/authorization-service@workspace:ee/apps/authorization-service" @@ -9146,6 +9161,7 @@ __metadata: "@rocket.chat/account-utils": "workspace:^" "@rocket.chat/agenda": "workspace:^" "@rocket.chat/api-client": "workspace:^" + "@rocket.chat/apps": "workspace:^" "@rocket.chat/apps-engine": 1.41.0 "@rocket.chat/base64": "workspace:^" "@rocket.chat/cas-validate": "workspace:^" @@ -9253,6 +9269,7 @@ __metadata: "@types/ldapjs": ^2.2.5 "@types/less": ~3.0.5 "@types/lodash": ^4.14.200 + "@types/lodash.clonedeep": ^4.5.9 "@types/lodash.debounce": ^4.0.8 "@types/lodash.get": ^4.4.8 "@types/mailparser": ^3.4.3 @@ -13615,6 +13632,15 @@ __metadata: languageName: node linkType: hard +"@types/lodash.clonedeep@npm:^4.5.9": + version: 4.5.9 + resolution: "@types/lodash.clonedeep@npm:4.5.9" + dependencies: + "@types/lodash": "*" + checksum: ef85512b7dce7a4f981a818ae44d11982907e1f26b5b26bedf0957c35e8591eb8e1d24fa31ca851d4b40e0a1ee88563853d762412691fe5f357e8335cead2325 + languageName: node + linkType: hard + "@types/lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "@types/lodash.debounce@npm:4.0.8" From efb77c09e2b0a5492492de7a87dc0d69297a6888 Mon Sep 17 00:00:00 2001 From: Pierre Lehnen <55164754+pierre-lehnen-rc@users.noreply.github.com> Date: Mon, 4 Mar 2024 14:36:31 -0300 Subject: [PATCH 14/23] chore: move utilitary functions out of ee folder (#31207) --- apps/meteor/client/components/voip/room/VoipRoomForeword.tsx | 2 +- .../meteor/{ee => }/client/lib/voip/parseOutboundPhoneNumber.ts | 0 apps/meteor/client/providers/CallProvider/CallProvider.tsx | 2 +- .../sidebar/footer/voip/hooks/useOmnichannelContactLabel.ts | 2 +- .../client/views/omnichannel/directory/calls/CallTableRow.tsx | 2 +- .../omnichannel/directory/calls/contextualBar/VoipInfo.tsx | 2 +- .../views/omnichannel/directory/contacts/ContactTable.tsx | 2 +- .../directory/contacts/contextualBar/ContactInfo.tsx | 2 +- .../client/views/room/Header/Omnichannel/VoipRoomHeader.tsx | 2 +- 9 files changed, 8 insertions(+), 8 deletions(-) rename apps/meteor/{ee => }/client/lib/voip/parseOutboundPhoneNumber.ts (100%) diff --git a/apps/meteor/client/components/voip/room/VoipRoomForeword.tsx b/apps/meteor/client/components/voip/room/VoipRoomForeword.tsx index 983c5cdc2c4a3..615fee8714aa9 100644 --- a/apps/meteor/client/components/voip/room/VoipRoomForeword.tsx +++ b/apps/meteor/client/components/voip/room/VoipRoomForeword.tsx @@ -5,7 +5,7 @@ import type { ReactElement } from 'react'; import React from 'react'; import { getUserAvatarURL } from '../../../../app/utils/client'; -import { parseOutboundPhoneNumber } from '../../../../ee/client/lib/voip/parseOutboundPhoneNumber'; +import { parseOutboundPhoneNumber } from '../../../lib/voip/parseOutboundPhoneNumber'; export const VoipRoomForeword = ({ room }: { room: IVoipRoom }): ReactElement => { const t = useTranslation(); diff --git a/apps/meteor/ee/client/lib/voip/parseOutboundPhoneNumber.ts b/apps/meteor/client/lib/voip/parseOutboundPhoneNumber.ts similarity index 100% rename from apps/meteor/ee/client/lib/voip/parseOutboundPhoneNumber.ts rename to apps/meteor/client/lib/voip/parseOutboundPhoneNumber.ts diff --git a/apps/meteor/client/providers/CallProvider/CallProvider.tsx b/apps/meteor/client/providers/CallProvider/CallProvider.tsx index 0de0a3fda0c32..ce0d9385dc646 100644 --- a/apps/meteor/client/providers/CallProvider/CallProvider.tsx +++ b/apps/meteor/client/providers/CallProvider/CallProvider.tsx @@ -29,13 +29,13 @@ import { createPortal } from 'react-dom'; import type { OutgoingByeRequest } from 'sip.js/lib/core'; import { isOutboundClient, useVoipClient } from '../../../ee/client/hooks/useVoipClient'; -import { parseOutboundPhoneNumber } from '../../../ee/client/lib/voip/parseOutboundPhoneNumber'; import { WrapUpCallModal } from '../../../ee/client/voip/components/modals/WrapUpCallModal'; import type { CallContextValue } from '../../contexts/CallContext'; import { CallContext, useIsVoipEnterprise } from '../../contexts/CallContext'; import { useDialModal } from '../../hooks/useDialModal'; import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; import type { QueueAggregator } from '../../lib/voip/QueueAggregator'; +import { parseOutboundPhoneNumber } from '../../lib/voip/parseOutboundPhoneNumber'; import { useVoipSounds } from './hooks/useVoipSounds'; type NetworkState = 'online' | 'offline'; diff --git a/apps/meteor/client/sidebar/footer/voip/hooks/useOmnichannelContactLabel.ts b/apps/meteor/client/sidebar/footer/voip/hooks/useOmnichannelContactLabel.ts index e905f6cf38e62..6b3d59830d1e1 100644 --- a/apps/meteor/client/sidebar/footer/voip/hooks/useOmnichannelContactLabel.ts +++ b/apps/meteor/client/sidebar/footer/voip/hooks/useOmnichannelContactLabel.ts @@ -2,7 +2,7 @@ import type { ICallerInfo } from '@rocket.chat/core-typings'; import { useEndpoint } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; -import { parseOutboundPhoneNumber } from '../../../../../ee/client/lib/voip/parseOutboundPhoneNumber'; +import { parseOutboundPhoneNumber } from '../../../../lib/voip/parseOutboundPhoneNumber'; export const useOmnichannelContactLabel = (caller: ICallerInfo): string => { const getContactBy = useEndpoint('GET', '/v1/omnichannel/contact.search'); diff --git a/apps/meteor/client/views/omnichannel/directory/calls/CallTableRow.tsx b/apps/meteor/client/views/omnichannel/directory/calls/CallTableRow.tsx index 403f4312772ff..616baee2b5317 100644 --- a/apps/meteor/client/views/omnichannel/directory/calls/CallTableRow.tsx +++ b/apps/meteor/client/views/omnichannel/directory/calls/CallTableRow.tsx @@ -4,9 +4,9 @@ import moment from 'moment'; import type { ReactElement } from 'react'; import React, { useCallback } from 'react'; -import { parseOutboundPhoneNumber } from '../../../../../ee/client/lib/voip/parseOutboundPhoneNumber'; import { GenericTableRow, GenericTableCell } from '../../../../components/GenericTable'; import { useIsCallReady } from '../../../../contexts/CallContext'; +import { parseOutboundPhoneNumber } from '../../../../lib/voip/parseOutboundPhoneNumber'; import { CallDialpadButton } from '../components/CallDialpadButton'; type CallTableRowProps = { diff --git a/apps/meteor/client/views/omnichannel/directory/calls/contextualBar/VoipInfo.tsx b/apps/meteor/client/views/omnichannel/directory/calls/contextualBar/VoipInfo.tsx index 65792b6d73e22..ebfa98273e303 100644 --- a/apps/meteor/client/views/omnichannel/directory/calls/contextualBar/VoipInfo.tsx +++ b/apps/meteor/client/views/omnichannel/directory/calls/contextualBar/VoipInfo.tsx @@ -6,7 +6,6 @@ import moment from 'moment'; import type { ReactElement } from 'react'; import React, { useMemo } from 'react'; -import { parseOutboundPhoneNumber } from '../../../../../../ee/client/lib/voip/parseOutboundPhoneNumber'; import { ContextualbarIcon, ContextualbarHeader, @@ -18,6 +17,7 @@ import { import InfoPanel from '../../../../../components/InfoPanel'; import { UserStatus } from '../../../../../components/UserStatus'; import { useIsCallReady } from '../../../../../contexts/CallContext'; +import { parseOutboundPhoneNumber } from '../../../../../lib/voip/parseOutboundPhoneNumber'; import AgentInfoDetails from '../../../components/AgentInfoDetails'; import AgentField from '../../components/AgentField'; import { InfoField } from './InfoField'; diff --git a/apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx b/apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx index a6516e082e880..1238732edf664 100644 --- a/apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx +++ b/apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx @@ -5,7 +5,6 @@ import { hashQueryKey } from '@tanstack/react-query'; import type { ReactElement } from 'react'; import React, { useMemo, useState } from 'react'; -import { parseOutboundPhoneNumber } from '../../../../../ee/client/lib/voip/parseOutboundPhoneNumber'; import FilterByText from '../../../../components/FilterByText'; import GenericNoResults from '../../../../components/GenericNoResults'; import { @@ -21,6 +20,7 @@ import { usePagination } from '../../../../components/GenericTable/hooks/usePagi import { useSort } from '../../../../components/GenericTable/hooks/useSort'; import { useIsCallReady } from '../../../../contexts/CallContext'; import { useFormatDate } from '../../../../hooks/useFormatDate'; +import { parseOutboundPhoneNumber } from '../../../../lib/voip/parseOutboundPhoneNumber'; import { CallDialpadButton } from '../components/CallDialpadButton'; import { useCurrentContacts } from './hooks/useCurrentContacts'; diff --git a/apps/meteor/client/views/omnichannel/directory/contacts/contextualBar/ContactInfo.tsx b/apps/meteor/client/views/omnichannel/directory/contacts/contextualBar/ContactInfo.tsx index 9578c6a07b834..f16f70c764466 100644 --- a/apps/meteor/client/views/omnichannel/directory/contacts/contextualBar/ContactInfo.tsx +++ b/apps/meteor/client/views/omnichannel/directory/contacts/contextualBar/ContactInfo.tsx @@ -7,12 +7,12 @@ import { useQuery } from '@tanstack/react-query'; import React, { useCallback } from 'react'; import { useSyncExternalStore } from 'use-sync-external-store/shim'; -import { parseOutboundPhoneNumber } from '../../../../../../ee/client/lib/voip/parseOutboundPhoneNumber'; import ContactManagerInfo from '../../../../../../ee/client/omnichannel/ContactManagerInfo'; import { ContextualbarScrollableContent, ContextualbarFooter } from '../../../../../components/Contextualbar'; import { UserStatus } from '../../../../../components/UserStatus'; import { useIsCallReady } from '../../../../../contexts/CallContext'; import { useFormatDate } from '../../../../../hooks/useFormatDate'; +import { parseOutboundPhoneNumber } from '../../../../../lib/voip/parseOutboundPhoneNumber'; import AgentInfoDetails from '../../../components/AgentInfoDetails'; import CustomField from '../../../components/CustomField'; import Field from '../../../components/Field'; diff --git a/apps/meteor/client/views/room/Header/Omnichannel/VoipRoomHeader.tsx b/apps/meteor/client/views/room/Header/Omnichannel/VoipRoomHeader.tsx index c4c5a63a00c18..042379b9fde68 100644 --- a/apps/meteor/client/views/room/Header/Omnichannel/VoipRoomHeader.tsx +++ b/apps/meteor/client/views/room/Header/Omnichannel/VoipRoomHeader.tsx @@ -5,8 +5,8 @@ import type { FC } from 'react'; import React, { useCallback, useMemo } from 'react'; import { useSyncExternalStore } from 'use-sync-external-store/shim'; -import { parseOutboundPhoneNumber } from '../../../../../ee/client/lib/voip/parseOutboundPhoneNumber'; import BurgerMenu from '../../../../components/BurgerMenu'; +import { parseOutboundPhoneNumber } from '../../../../lib/voip/parseOutboundPhoneNumber'; import type { RoomHeaderProps } from '../RoomHeader'; import RoomHeader from '../RoomHeader'; import { BackButton } from './BackButton'; From cac5c26afcc482f2b0719b6ed8a6cc448f4ee126 Mon Sep 17 00:00:00 2001 From: Pierre Lehnen <55164754+pierre-lehnen-rc@users.noreply.github.com> Date: Mon, 4 Mar 2024 17:09:51 -0300 Subject: [PATCH 15/23] chore: update ts version on recently merged package (#31885) --- packages/apps/package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/apps/package.json b/packages/apps/package.json index ab37d0d388b04..33c46a314d216 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -7,7 +7,7 @@ "eslint": "~8.45.0", "jest": "~29.6.4", "ts-jest": "~29.1.1", - "typescript": "~5.3.2" + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/yarn.lock b/yarn.lock index 431dee85f2b0e..1a88f52feaff4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8360,7 +8360,7 @@ __metadata: eslint: ~8.45.0 jest: ~29.6.4 ts-jest: ~29.1.1 - typescript: ~5.3.2 + typescript: ~5.3.3 languageName: unknown linkType: soft From a0117345a964c9e8cdb4df13f0bba5e56eeb6674 Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Tue, 5 Mar 2024 09:41:57 -0300 Subject: [PATCH 16/23] chore: Deprecate `insertOrUpdateUser` method (#31884) --- .changeset/cuddly-rocks-fix.md | 5 +++++ apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 .changeset/cuddly-rocks-fix.md diff --git a/.changeset/cuddly-rocks-fix.md b/.changeset/cuddly-rocks-fix.md new file mode 100644 index 0000000000000..ced0904df59b0 --- /dev/null +++ b/.changeset/cuddly-rocks-fix.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": minor +--- + +Deprecate `insertOrUpdateUser` Meteor method diff --git a/apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts b/apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts index d00f6d30b314f..5a8b1c8d1a584 100644 --- a/apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts +++ b/apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts @@ -4,6 +4,7 @@ import { Meteor } from 'meteor/meteor'; import { twoFactorRequired } from '../../../2fa/server/twoFactorRequired'; import { saveUser } from '../functions/saveUser'; +import { methodDeprecationLogger } from '../lib/deprecationWarningLogger'; declare module '@rocket.chat/ui-contexts' { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -14,6 +15,8 @@ declare module '@rocket.chat/ui-contexts' { Meteor.methods({ insertOrUpdateUser: twoFactorRequired(async (userData) => { + methodDeprecationLogger.method('insertOrUpdateUser', '8.0.0'); + check(userData, Object); if (!Meteor.userId()) { From b0aace714711a68f30b93067726324d3e18d13ee Mon Sep 17 00:00:00 2001 From: Abhinav Kumar Date: Tue, 5 Mar 2024 19:02:35 +0530 Subject: [PATCH 17/23] fix: livechat agent status set to available after reactivation (#31651) --- .changeset/nice-ducks-shout.md | 5 ++ .../livechat/server/hooks/afterUserActions.ts | 2 +- .../app/livechat/server/lib/LivechatTyped.ts | 8 +++ apps/meteor/tests/data/livechat/users.ts | 9 ++- apps/meteor/tests/end-to-end/api/01-users.js | 56 +++++++++++++++++++ 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 .changeset/nice-ducks-shout.md diff --git a/.changeset/nice-ducks-shout.md b/.changeset/nice-ducks-shout.md new file mode 100644 index 0000000000000..fc8ce46dcaced --- /dev/null +++ b/.changeset/nice-ducks-shout.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed auto-availability of reactivated livechat agents; they now stay 'Not Available' until manually set to 'Available' diff --git a/apps/meteor/app/livechat/server/hooks/afterUserActions.ts b/apps/meteor/app/livechat/server/hooks/afterUserActions.ts index 6fe7f1db74795..2d0120c93c821 100644 --- a/apps/meteor/app/livechat/server/hooks/afterUserActions.ts +++ b/apps/meteor/app/livechat/server/hooks/afterUserActions.ts @@ -39,7 +39,7 @@ const handleDeactivateUser = async (user: IUser) => { const handleActivateUser = async (user: IUser) => { if (isAgent(user) && user.username) { - await LivechatTyped.addAgent(user.username); + await LivechatTyped.afterAgentUserActivated(user); } }; diff --git a/apps/meteor/app/livechat/server/lib/LivechatTyped.ts b/apps/meteor/app/livechat/server/lib/LivechatTyped.ts index 79d225626ea1d..fb1098db4272d 100644 --- a/apps/meteor/app/livechat/server/lib/LivechatTyped.ts +++ b/apps/meteor/app/livechat/server/lib/LivechatTyped.ts @@ -1682,6 +1682,14 @@ class LivechatClass { return false; } + async afterAgentUserActivated(user: IUser) { + if (!user.roles.includes('livechat-agent')) { + throw new Error('invalid-user-role'); + } + await Users.setOperator(user._id, true); + callbacks.runAsync('livechat.onNewAgentCreated', user._id); + } + async addManager(username: string) { check(username, String); diff --git a/apps/meteor/tests/data/livechat/users.ts b/apps/meteor/tests/data/livechat/users.ts index 38fb176faaa48..3a21cbee923ca 100644 --- a/apps/meteor/tests/data/livechat/users.ts +++ b/apps/meteor/tests/data/livechat/users.ts @@ -1,5 +1,5 @@ import { faker } from "@faker-js/faker"; -import type { IUser } from "@rocket.chat/core-typings"; +import type { ILivechatAgent, IUser } from "@rocket.chat/core-typings"; import { IUserCredentialsHeader, password } from "../user"; import { createUser, login } from "../users.helper"; import { createAgent, makeAgentAvailable } from "./rooms"; @@ -24,6 +24,13 @@ export const createBotAgent = async (): Promise<{ export const getRandomVisitorToken = (): string => faker.string.alphanumeric(17); +export const getAgent = async (userId: string): Promise => { + const { body } = await request.get(api(`livechat/users/agent/${userId}`)) + .set(credentials) + .expect(200); + return body.user; +} + export const removeAgent = async (userId: string): Promise => { await request.delete(api(`livechat/users/agent/${userId}`)) .set(credentials) diff --git a/apps/meteor/tests/end-to-end/api/01-users.js b/apps/meteor/tests/end-to-end/api/01-users.js index eaafc97527a33..1aa30d3322bb3 100644 --- a/apps/meteor/tests/end-to-end/api/01-users.js +++ b/apps/meteor/tests/end-to-end/api/01-users.js @@ -9,6 +9,8 @@ import { getCredentials, api, request, credentials, apiEmail, apiUsername, log, import { MAX_BIO_LENGTH, MAX_NICKNAME_LENGTH } from '../../data/constants.ts'; import { customFieldText, clearCustomFields, setCustomFields } from '../../data/custom-fields.js'; import { imgURL } from '../../data/interactions'; +import { createAgent, makeAgentAvailable } from '../../data/livechat/rooms'; +import { removeAgent, getAgent } from '../../data/livechat/users'; import { updatePermission, updateSetting } from '../../data/permissions.helper'; import { createRoom, deleteRoom } from '../../data/rooms.helper'; import { adminEmail, preferences, password, adminUsername } from '../../data/user'; @@ -3114,6 +3116,21 @@ describe('[Users]', function () { describe('[/users.setActiveStatus]', () => { let user; + let agent; + let agentUser; + + before(async () => { + agentUser = await createUser(); + const agentUserCredentials = await login(agentUser.username, password); + await createAgent(agentUser.username); + await makeAgentAvailable(agentUserCredentials); + + agent = { + user: agentUser, + credentials: agentUserCredentials, + }; + }); + before((done) => { const username = `user.test.${Date.now()}`; const email = `${username}@rocket.chat`; @@ -3156,6 +3173,12 @@ describe('[Users]', function () { .end(() => updatePermission('edit-other-user-active-status', ['admin']).then(done)); user = undefined; }); + + after(async () => { + await removeAgent(agent.user._id); + await deleteUser(agent.user); + }); + it('should set other user active status to false when the logged user has the necessary permission(edit-other-user-active-status)', (done) => { request .post(api('users.setActiveStatus')) @@ -3484,6 +3507,39 @@ describe('[Users]', function () { await deleteUser(testUser); }); + it('should make agents not-available when the user is deactivated', async () => { + await makeAgentAvailable(agent.credentials); + await request + .post(api('users.setActiveStatus')) + .set(credentials) + .send({ + activeStatus: false, + userId: agent.user._id, + }) + .expect('Content-Type', 'application/json') + .expect(200); + + const agentInfo = await getAgent(agent.user._id); + expect(agentInfo).to.have.property('statusLivechat', 'not-available'); + }); + + it('should not make agents available when the user is activated', async () => { + let agentInfo = await getAgent(agent.user._id); + expect(agentInfo).to.have.property('statusLivechat', 'not-available'); + + await request + .post(api('users.setActiveStatus')) + .set(credentials) + .send({ + activeStatus: true, + userId: agent.user._id, + }) + .expect('Content-Type', 'application/json') + .expect(200); + + agentInfo = await getAgent(agent.user._id); + expect(agentInfo).to.have.property('statusLivechat', 'not-available'); + }); }); describe('[/users.deactivateIdle]', () => { From 0f0d63150c283ab3353232abf252cca5a08de5f6 Mon Sep 17 00:00:00 2001 From: Gustavo Reis Bauer Date: Tue, 5 Mar 2024 14:09:42 -0300 Subject: [PATCH 18/23] fix: New users are not automatically inserted in auto-join rooms inside default teams (#31720) Co-authored-by: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> --- .changeset/calm-penguins-do.md | 5 + .../functions/addUserToDefaultChannels.ts | 8 +- .../server/functions/getDefaultChannels.ts | 25 +++ apps/meteor/tests/data/rooms.helper.js | 17 +- apps/meteor/tests/data/uploads.helper.ts | 1 + apps/meteor/tests/end-to-end/api/01-users.js | 159 +++++++++++++++++- .../end-to-end/apps/05-video-conferences.ts | 1 + 7 files changed, 210 insertions(+), 6 deletions(-) create mode 100644 .changeset/calm-penguins-do.md create mode 100644 apps/meteor/app/lib/server/functions/getDefaultChannels.ts diff --git a/.changeset/calm-penguins-do.md b/.changeset/calm-penguins-do.md new file mode 100644 index 0000000000000..6a83fae9030d8 --- /dev/null +++ b/.changeset/calm-penguins-do.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Now we are considering channels with auto-join inside teams on user creation diff --git a/apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts b/apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts index 835f59419ad58..563022ea5a6af 100644 --- a/apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts +++ b/apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts @@ -1,15 +1,15 @@ import { Message } from '@rocket.chat/core-services'; import type { IUser } from '@rocket.chat/core-typings'; -import { Subscriptions, Rooms } from '@rocket.chat/models'; +import { Subscriptions } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; import { getSubscriptionAutotranslateDefaultConfig } from '../../../../server/lib/getSubscriptionAutotranslateDefaultConfig'; +import { getDefaultChannels } from './getDefaultChannels'; export const addUserToDefaultChannels = async function (user: IUser, silenced?: boolean): Promise { await callbacks.run('beforeJoinDefaultChannels', user); - const defaultRooms = await Rooms.findByDefaultAndTypes(true, ['c', 'p'], { - projection: { usernames: 0 }, - }).toArray(); + const defaultRooms = await getDefaultChannels(); + for await (const room of defaultRooms) { if (!(await Subscriptions.findOneByRoomIdAndUserId(room._id, user._id, { projection: { _id: 1 } }))) { const autoTranslateConfig = getSubscriptionAutotranslateDefaultConfig(user); diff --git a/apps/meteor/app/lib/server/functions/getDefaultChannels.ts b/apps/meteor/app/lib/server/functions/getDefaultChannels.ts new file mode 100644 index 0000000000000..e47518dd604f5 --- /dev/null +++ b/apps/meteor/app/lib/server/functions/getDefaultChannels.ts @@ -0,0 +1,25 @@ +import type { IRoom } from '@rocket.chat/core-typings'; +import { Rooms } from '@rocket.chat/models'; + +export async function getDefaultChannels(): Promise { + const defaultRooms = await Rooms.findByDefaultAndTypes(true, ['c', 'p'], { + projection: { usernames: 0 }, + }).toArray(); + const roomsThatAreGoingToBeJoined = new Set(defaultRooms.map((room) => room._id)); + + // If any of those are teams, we need to get all the channels that have the auto-join flag as well + const teamRooms = defaultRooms.filter((room) => room.teamMain && room.teamId); + if (teamRooms.length > 0) { + for await (const teamRoom of teamRooms) { + const defaultTeamRooms = await Rooms.findDefaultRoomsForTeam(teamRoom.teamId).toArray(); + + const defaultTeamRoomsThatWereNotAlreadyAdded = defaultTeamRooms.filter((channel) => !roomsThatAreGoingToBeJoined.has(channel._id)); + + defaultTeamRoomsThatWereNotAlreadyAdded.forEach((channel) => roomsThatAreGoingToBeJoined.add(channel._id)); + // Add the channels to the defaultRooms list + defaultRooms.push(...defaultTeamRoomsThatWereNotAlreadyAdded); + } + } + + return defaultRooms; +} diff --git a/apps/meteor/tests/data/rooms.helper.js b/apps/meteor/tests/data/rooms.helper.js index 78e07f1100393..c28f763c00f97 100644 --- a/apps/meteor/tests/data/rooms.helper.js +++ b/apps/meteor/tests/data/rooms.helper.js @@ -1,6 +1,6 @@ import { api, credentials, request } from './api-data'; -export const createRoom = ({ name, type, username, token, agentId, members, credentials: customCredentials, voipCallDirection = 'inbound' }) => { +export const createRoom = ({ name, type, username, token, agentId, members, credentials: customCredentials, extraData, voipCallDirection = 'inbound' }) => { if (!type) { throw new Error('"type" is required in "createRoom.ts" test helper'); } @@ -31,6 +31,7 @@ export const createRoom = ({ name, type, username, token, agentId, members, cred .send({ ...params, ...(members && { members }), + ...(extraData && { extraData }), }); }; @@ -65,3 +66,17 @@ function actionRoom({ action, type, roomId }) { export const deleteRoom = ({ type, roomId }) => actionRoom({ action: 'delete', type, roomId }); export const closeRoom = ({ type, roomId }) => actionRoom({ action: 'close', type, roomId }); + +export const setRoomConfig = ({ roomId, favorite, isDefault }) => { + return request + .post(api('rooms.saveRoomSettings')) + .set(credentials) + .send({ + rid: roomId, + default: isDefault, + favorite: favorite ? { + defaultValue: true, + favorite: false + } : undefined + }); +}; diff --git a/apps/meteor/tests/data/uploads.helper.ts b/apps/meteor/tests/data/uploads.helper.ts index 8eb1e79319650..eabd49e11a3b1 100644 --- a/apps/meteor/tests/data/uploads.helper.ts +++ b/apps/meteor/tests/data/uploads.helper.ts @@ -45,6 +45,7 @@ export async function testFileUploads(filesEndpoint: 'channels.files' | 'groups. name: null, username: null, members: null, + extraData: null, }); return roomResponse.body.room; diff --git a/apps/meteor/tests/end-to-end/api/01-users.js b/apps/meteor/tests/end-to-end/api/01-users.js index 1aa30d3322bb3..204d1413155f1 100644 --- a/apps/meteor/tests/end-to-end/api/01-users.js +++ b/apps/meteor/tests/end-to-end/api/01-users.js @@ -12,7 +12,8 @@ import { imgURL } from '../../data/interactions'; import { createAgent, makeAgentAvailable } from '../../data/livechat/rooms'; import { removeAgent, getAgent } from '../../data/livechat/users'; import { updatePermission, updateSetting } from '../../data/permissions.helper'; -import { createRoom, deleteRoom } from '../../data/rooms.helper'; +import { createRoom, deleteRoom, setRoomConfig } from '../../data/rooms.helper'; +import { createTeam, deleteTeam } from '../../data/teams.helper'; import { adminEmail, preferences, password, adminUsername } from '../../data/user'; import { createUser, login, deleteUser, getUserStatus, getUserByUsername } from '../../data/users.helper.js'; @@ -279,6 +280,162 @@ describe('[Users]', function () { .end(done); }); }); + + describe('auto join default channels', () => { + let defaultTeamRoomId; + let defaultTeamId; + let group; + let user; + let userCredentials; + let user2; + let user3; + let userNoDefault; + const teamName = `defaultTeam_${Date.now()}`; + + before(async () => { + const defaultTeam = await createTeam(credentials, teamName, 0); + defaultTeamRoomId = defaultTeam.roomId; + defaultTeamId = defaultTeam._id; + }); + + before(async () => { + const { body } = await createRoom({ + name: `defaultGroup_${Date.now()}`, + type: 'p', + credentials, + extraData: { + broadcast: false, + encrypted: false, + teamId: defaultTeamId, + topic: '', + }, + }); + group = body.group; + }); + + after(() => + Promise.all([ + deleteRoom({ roomId: group._id, type: 'p' }), + deleteTeam(credentials, teamName), + deleteUser(user), + deleteUser(user2), + deleteUser(user3), + deleteUser(userNoDefault), + ]), + ); + + it('should not create subscriptions to non default teams or rooms even if joinDefaultChannels is true', async () => { + userNoDefault = await createUser({ joinDefaultChannels: true }); + const noDefaultUserCredentials = await login(userNoDefault.username, password); + await request + .get(api('subscriptions.getOne')) + .set(noDefaultUserCredentials) + .query({ roomId: defaultTeamRoomId }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('subscription').that.is.null; + }); + + await request + .get(api('subscriptions.getOne')) + .set(noDefaultUserCredentials) + .query({ roomId: group._id }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('subscription').that.is.null; + }); + }); + + it('should create a subscription for a default team room if joinDefaultChannels is true', async () => { + await setRoomConfig({ roomId: defaultTeamRoomId, favorite: true, isDefault: true }); + + user = await createUser({ joinDefaultChannels: true }); + userCredentials = await login(user.username, password); + await request + .get(api('subscriptions.getOne')) + .set(userCredentials) + .query({ roomId: defaultTeamRoomId }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('subscription'); + expect(res.body.subscription).to.have.property('rid', defaultTeamRoomId); + }); + }); + + it('should NOT create a subscription for non auto-join rooms inside a default team', async () => { + await request + .get(api('subscriptions.getOne')) + .set(userCredentials) + .query({ roomId: group._id }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('subscription').that.is.null; + }); + }); + + it('should create a subscription for the user in all the auto join rooms of the team', async () => { + await request.post(api('teams.updateRoom')).set(credentials).send({ + roomId: group._id, + isDefault: true, + }); + + user2 = await createUser({ joinDefaultChannels: true }); + const user2Credentials = await login(user2.username, password); + + await request + .get(api('subscriptions.getOne')) + .set(user2Credentials) + .query({ roomId: group._id }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('subscription'); + expect(res.body.subscription).to.have.property('rid', group._id); + }); + }); + + it('should create a subscription for a default room inside a non default team', async () => { + await setRoomConfig({ roomId: defaultTeamRoomId, isDefault: false }); + await setRoomConfig({ roomId: group._id, favorite: true, isDefault: true }); + + user3 = await createUser({ joinDefaultChannels: true }); + const user3Credentials = await login(user3.username, password); + + // New user should be subscribed to the default room inside a team + await request + .get(api('subscriptions.getOne')) + .set(user3Credentials) + .query({ roomId: group._id }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('subscription'); + expect(res.body.subscription).to.have.property('rid', group._id); + }); + + // New user should not be subscribed to the parent team + await request + .get(api('subscriptions.getOne')) + .set(user3Credentials) + .query({ roomId: defaultTeamRoomId }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('subscription').that.is.null; + }); + }); + }); }); describe('[/users.register]', () => { diff --git a/apps/meteor/tests/end-to-end/apps/05-video-conferences.ts b/apps/meteor/tests/end-to-end/apps/05-video-conferences.ts index 579e9894ab7bd..fb7f42ccdabdb 100644 --- a/apps/meteor/tests/end-to-end/apps/05-video-conferences.ts +++ b/apps/meteor/tests/end-to-end/apps/05-video-conferences.ts @@ -25,6 +25,7 @@ describe('Apps - Video Conferences', function () { agentId: undefined, members: undefined, credentials: undefined, + extraData: undefined, }); roomId = res.body.group._id; From 6c772a4a0b480f54ea4e9468b56a51900152a488 Mon Sep 17 00:00:00 2001 From: Aleksander Nicacio da Silva Date: Tue, 5 Mar 2024 13:26:52 -0300 Subject: [PATCH 19/23] refactor: moved guest metadata to its own property --- packages/livechat/src/lib/hooks.ts | 5 +++-- packages/livechat/src/lib/triggerActions.ts | 2 +- packages/livechat/src/store/index.tsx | 1 + packages/livechat/src/widget.ts | 7 ++++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/livechat/src/lib/hooks.ts b/packages/livechat/src/lib/hooks.ts index 7e5ca5304628c..330e967b38e09 100644 --- a/packages/livechat/src/lib/hooks.ts +++ b/packages/livechat/src/lib/hooks.ts @@ -220,8 +220,9 @@ const api = { setParentUrl: (parentUrl: StoreState['parentUrl']) => { store.setState({ parentUrl }); }, - setGuestMetadata(metadata) { - updateIframeGuestData({ metadata }); + setGuestMetadata(metadata: StoreState['iframe']['guestMetadata']) { + const { iframe } = store.state; + store.setState({ iframe: { ...iframe, guestMetadata: metadata } }); }, }; diff --git a/packages/livechat/src/lib/triggerActions.ts b/packages/livechat/src/lib/triggerActions.ts index f23a0420fd0e6..251584d39354e 100644 --- a/packages/livechat/src/lib/triggerActions.ts +++ b/packages/livechat/src/lib/triggerActions.ts @@ -42,7 +42,7 @@ export const sendMessageExternalServiceAction = async ( condition: ILivechatTriggerCondition, ) => { const { token, minimized, typing, iframe } = store.state; - const { metadata = {} } = iframe.guest || {}; + const metadata = iframe.guestMetadata || {}; const agent = await getAgent(action); if (agent?.username) { diff --git a/packages/livechat/src/store/index.tsx b/packages/livechat/src/store/index.tsx index 7f31ba739e046..43351b51140f1 100644 --- a/packages/livechat/src/store/index.tsx +++ b/packages/livechat/src/store/index.tsx @@ -60,6 +60,7 @@ export type StoreState = { }; iframe: { guest?: Serialized; + guestMetadata?: Record; theme: { title?: string; color?: string; diff --git a/packages/livechat/src/widget.ts b/packages/livechat/src/widget.ts index a0298f8664988..2f1e8f4ea318d 100644 --- a/packages/livechat/src/widget.ts +++ b/packages/livechat/src/widget.ts @@ -41,6 +41,7 @@ type InitializeParams = { language: string; agent: StoreState['defaultAgent']; parentUrl: string; + setGuestMetadata: StoreState['iframe']['guestMetadata']; }; const WIDGET_OPEN_WIDTH = 365; @@ -346,9 +347,9 @@ function setParentUrl(url: string) { callHook('setParentUrl', url); } -function setGuestMetadata(metadata) { +function setGuestMetadata(metadata: StoreState['iframe']['guestMetadata']) { if (typeof metadata !== 'object') { - return; + throw new Error('Invalid metadata'); } callHook('setGuestMetadata', metadata); @@ -404,7 +405,7 @@ function initialize(initParams: Partial) { setParentUrl(params as InitializeParams['parentUrl']); continue; case 'setGuestMetadata': - setGuestMetadata(params[method]); + setGuestMetadata(params as InitializeParams['setGuestMetadata']); continue; default: continue; From 4b2f73bc580cd210fa346dfb476b6b58af959fdb Mon Sep 17 00:00:00 2001 From: Aleksander Nicacio da Silva Date: Tue, 5 Mar 2024 13:49:17 -0300 Subject: [PATCH 20/23] fix: restored assign agent --- packages/livechat/src/definitions/agents.d.ts | 1 + packages/livechat/src/lib/api.ts | 4 ++-- packages/livechat/src/lib/hooks.ts | 2 +- packages/livechat/src/lib/triggerActions.ts | 12 ++++++++++++ packages/livechat/src/lib/triggerUtils.ts | 7 +++---- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/livechat/src/definitions/agents.d.ts b/packages/livechat/src/definitions/agents.d.ts index fc8316bfa7704..7bf4e6278d20b 100644 --- a/packages/livechat/src/definitions/agents.d.ts +++ b/packages/livechat/src/definitions/agents.d.ts @@ -11,5 +11,6 @@ export type Agent = { description: string; src: string; }; + ts: number; [key: string]: unknown; }; diff --git a/packages/livechat/src/lib/api.ts b/packages/livechat/src/lib/api.ts index 84cf63a97ce36..1346bc06bd510 100644 --- a/packages/livechat/src/lib/api.ts +++ b/packages/livechat/src/lib/api.ts @@ -1,9 +1,9 @@ -import type { IOmnichannelAgent } from '@rocket.chat/core-typings'; +import type { IOmnichannelAgent, Serialized } from '@rocket.chat/core-typings'; import i18next from 'i18next'; import { getDateFnsLocale } from './locale'; -export const normalizeAgent = (agentData: IOmnichannelAgent) => +export const normalizeAgent = (agentData: Serialized) => agentData && { name: agentData.name, username: agentData.username, status: agentData.status }; export const normalizeQueueAlert = async (queueInfo: any) => { diff --git a/packages/livechat/src/lib/hooks.ts b/packages/livechat/src/lib/hooks.ts index 330e967b38e09..e7c972959a064 100644 --- a/packages/livechat/src/lib/hooks.ts +++ b/packages/livechat/src/lib/hooks.ts @@ -143,10 +143,10 @@ const api = { store.setState({ defaultAgent: { + ...props, _id, username, ts: Date.now(), - ...props, }, }); }, diff --git a/packages/livechat/src/lib/triggerActions.ts b/packages/livechat/src/lib/triggerActions.ts index 251584d39354e..ce71efe2ee814 100644 --- a/packages/livechat/src/lib/triggerActions.ts +++ b/packages/livechat/src/lib/triggerActions.ts @@ -2,6 +2,8 @@ import type { ILivechatSendMessageAction, ILivechatTriggerCondition, ILivechatUs import { route } from 'preact-router'; import store from '../store'; +import { normalizeAgent } from './api'; +import { parentCall } from './parentCall'; import { createToken } from './random'; import { getAgent, removeMessage, requestTriggerMessages, upsertMessage } from './triggerUtils'; import Triggers from './triggers'; @@ -21,6 +23,11 @@ export const sendMessageAction = async (_: string, action: ILivechatSendMessageA await upsertMessage(message); + if (agent && '_id' in agent) { + await store.setState({ agent }); + parentCall('callback', 'assign-agent', normalizeAgent(agent)); + } + if (minimized) { route('/trigger-messages'); store.setState({ minimized: false }); @@ -69,6 +76,11 @@ export const sendMessageExternalServiceAction = async ( await Promise.all(messages.map((message) => upsertMessage(message))); + if (agent && '_id' in agent) { + await store.setState({ agent }); + parentCall('callback', 'assign-agent', normalizeAgent(agent)); + } + if (minimized) { route('/trigger-messages'); store.setState({ minimized: false }); diff --git a/packages/livechat/src/lib/triggerUtils.ts b/packages/livechat/src/lib/triggerUtils.ts index 466d41cf85c1b..f9863e02d0286 100644 --- a/packages/livechat/src/lib/triggerUtils.ts +++ b/packages/livechat/src/lib/triggerUtils.ts @@ -1,6 +1,7 @@ import type { ILivechatAgent, ILivechatTrigger, ILivechatTriggerAction, ILivechatTriggerType, Serialized } from '@rocket.chat/core-typings'; import { Livechat } from '../api'; +import type { Agent } from '../definitions/agents'; import { upsert } from '../helpers/upsert'; import store from '../store'; import { processUnread } from './main'; @@ -16,9 +17,7 @@ const isAgentWithInfo = (agent: any): agent is Serialized => !ag const getNextAgentFromQueue = async () => { const { defaultAgent, - iframe: { - guest: { department }, - }, + iframe: { guest: { department } = {} }, } = store.state; if (defaultAgent?.ts && Date.now() - defaultAgent.ts < agentCacheExpiry) { @@ -36,7 +35,7 @@ const getNextAgentFromQueue = async () => { return Promise.reject(error); } - store.setState({ defaultAgent: { ...agent, department, ts: Date.now() } }); + store.setState({ defaultAgent: { ...agent, department, ts: Date.now() } as Agent }); return agent; }; From 16f891b71b1e1fc881e6fac7b8f6c949363cfabf Mon Sep 17 00:00:00 2001 From: Aleksander Nicacio da Silva Date: Wed, 6 Mar 2024 10:13:20 -0300 Subject: [PATCH 21/23] refactor: changed to not depend on endpoint for fallback message --- packages/livechat/src/lib/triggerActions.ts | 2 ++ packages/livechat/src/lib/triggerUtils.ts | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/livechat/src/lib/triggerActions.ts b/packages/livechat/src/lib/triggerActions.ts index ce71efe2ee814..2ac9587aa84ee 100644 --- a/packages/livechat/src/lib/triggerActions.ts +++ b/packages/livechat/src/lib/triggerActions.ts @@ -57,10 +57,12 @@ export const sendMessageExternalServiceAction = async ( } try { + const { serviceFallbackMessage: fallbackMessage } = action.params || {}; const triggerMessages = await requestTriggerMessages({ token, triggerId, metadata, + fallbackMessage, }); const messages = triggerMessages diff --git a/packages/livechat/src/lib/triggerUtils.ts b/packages/livechat/src/lib/triggerUtils.ts index f9863e02d0286..9984f947b5d59 100644 --- a/packages/livechat/src/lib/triggerUtils.ts +++ b/packages/livechat/src/lib/triggerUtils.ts @@ -100,10 +100,12 @@ export const requestTriggerMessages = async ({ triggerId, token, metadata = {}, + fallbackMessage, }: { triggerId: string; token: string; metadata: Record; + fallbackMessage?: string; }) => { try { const extraData = Object.entries(metadata).reduce<{ key: string; value: string }[]>( @@ -113,12 +115,11 @@ export const requestTriggerMessages = async ({ const { response } = await Livechat.rest.post(`/v1/livechat/triggers/${triggerId}/external-service/call`, { extraData, token }); return response.contents; - } catch (e) { - const error = e as { fallbackMessage?: string }; - if (!error.fallbackMessage) { + } catch (_) { + if (!fallbackMessage) { throw Error('Unable to fetch message from external service.'); } - return [{ msg: error.fallbackMessage, order: 0 }]; + return [{ msg: fallbackMessage, order: 0 }]; } }; From 7336bc773545ecdb21569687207b1cab17cc879b Mon Sep 17 00:00:00 2001 From: Aleksander Nicacio da Silva Date: Wed, 6 Mar 2024 11:51:48 -0300 Subject: [PATCH 22/23] fix: increased rate limiter to 10 requests/sec --- apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts b/apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts index 48988ff1d6aa9..e8e06dbdd8b96 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts @@ -64,7 +64,7 @@ API.v1.addRoute( { authRequired: false, rateLimiterOptions: { - numRequestsAllowed: 1, + numRequestsAllowed: 10, intervalTimeInMS: 60000, }, validateParams: isLivechatTriggerWebhookCallParams, From 107422464b854609a5c5c6867f5e32321088b40d Mon Sep 17 00:00:00 2001 From: Aleksander Nicacio da Silva Date: Wed, 6 Mar 2024 13:06:41 -0300 Subject: [PATCH 23/23] fix: increased rate limiter for test endpoint to 15 requests/sec --- apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts b/apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts index e8e06dbdd8b96..1b066da0fa54b 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/api/triggers.ts @@ -13,7 +13,7 @@ API.v1.addRoute( authRequired: true, permissionsRequired: ['view-livechat-manager'], validateParams: isLivechatTriggerWebhookTestParams, - rateLimiterOptions: { numRequestsAllowed: 5, intervalTimeInMS: 60000 }, + rateLimiterOptions: { numRequestsAllowed: 15, intervalTimeInMS: 60000 }, }, { async post() {