diff --git a/.changeset/afraid-guests-jog.md b/.changeset/afraid-guests-jog.md deleted file mode 100644 index 420b9bb5d329..000000000000 --- a/.changeset/afraid-guests-jog.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@rocket.chat/meteor": minor -"@rocket.chat/livechat": minor ---- - -Created a `transferChat` Livechat API endpoint for transferring chats programmatically, the endpoint has all the limitations & permissions required that transferring via UI has diff --git a/.changeset/brown-crabs-chew.md b/.changeset/brown-crabs-chew.md new file mode 100644 index 000000000000..3291f18bf225 --- /dev/null +++ b/.changeset/brown-crabs-chew.md @@ -0,0 +1,13 @@ +--- +'@rocket.chat/uikit-playground': patch +'@rocket.chat/fuselage-ui-kit': patch +'@rocket.chat/ui-theming': patch +'@rocket.chat/ui-video-conf': patch +'@rocket.chat/ui-composer': patch +'@rocket.chat/gazzodown': patch +'@rocket.chat/ui-avatar': patch +'@rocket.chat/ui-client': patch +'@rocket.chat/meteor': patch +--- + +Bumped @rocket.chat/fuselage that fixes the Menu onPointerUp event behavior diff --git a/.changeset/calm-tigers-peel.md b/.changeset/calm-tigers-peel.md new file mode 100644 index 000000000000..32feed6f7107 --- /dev/null +++ b/.changeset/calm-tigers-peel.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/ui-kit": patch +--- + +fix UiKit error message: Failed to resolve module: @rocket.chat/icons diff --git a/.changeset/chilly-papayas-march.md b/.changeset/chilly-papayas-march.md deleted file mode 100644 index a7724b126695..000000000000 --- a/.changeset/chilly-papayas-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed SAML users' full names being updated on login regardless of the "Overwrite user fullname (use idp attribute)" setting diff --git a/.changeset/cuddly-ravens-swim.md b/.changeset/cuddly-ravens-swim.md deleted file mode 100644 index 5774ef48202d..000000000000 --- a/.changeset/cuddly-ravens-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed an issue where adding `OVERWRITE_SETTING_` for any setting wasn't immediately taking effect sometimes, and needed a server restart to reflect. diff --git a/.changeset/empty-readers-teach.md b/.changeset/empty-readers-teach.md deleted file mode 100644 index b4bd075ef654..000000000000 --- a/.changeset/empty-readers-teach.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/tools": patch -"@rocket.chat/account-service": patch ---- - -Fixed an inconsistent evaluation of the `Accounts_LoginExpiration` setting over the codebase. In some places, it was being used as milliseconds while in others as days. Invalid values produced different results. A helper function was created to centralize the setting validation and the proper value being returned to avoid edge cases. -Negative values may be saved on the settings UI panel but the code will interpret any negative, NaN or 0 value to the default expiration which is 90 days. diff --git a/.changeset/empty-toys-smell.md b/.changeset/empty-toys-smell.md new file mode 100644 index 000000000000..043d9c19567d --- /dev/null +++ b/.changeset/empty-toys-smell.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Federated users can no longer be deleted. diff --git a/.changeset/fast-buttons-shake.md b/.changeset/fast-buttons-shake.md deleted file mode 100644 index 6281fc9941ec..000000000000 --- a/.changeset/fast-buttons-shake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': minor ---- - -Fixed an issue where FCM actions did not respect environment's proxy settings diff --git a/.changeset/fast-lobsters-turn.md b/.changeset/fast-lobsters-turn.md new file mode 100644 index 000000000000..ff1d97ea7289 --- /dev/null +++ b/.changeset/fast-lobsters-turn.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed an issue due to an endpoint pagination that was causing that when an agent have assigned more than 50 departments, the departments have a blank space instead of the name. diff --git a/.changeset/fifty-mails-admire.md b/.changeset/fifty-mails-admire.md deleted file mode 100644 index b87fd11d47ee..000000000000 --- a/.changeset/fifty-mails-admire.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@rocket.chat/web-ui-registration': patch -"@rocket.chat/meteor": minor ---- - -Login services button was not respecting the button color and text color settings. Implemented a fix to respect these settings and change the button colors accordingly. - -Added a warning on all settings which allow admins to change OAuth button colors, so that they can be alerted about WCAG (Web Content Accessibility Guidelines) compliance. diff --git a/.changeset/funny-boats-guess.md b/.changeset/funny-boats-guess.md new file mode 100644 index 000000000000..076acff98329 --- /dev/null +++ b/.changeset/funny-boats-guess.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": minor +"@rocket.chat/i18n": minor +--- + +Added a new Audit endpoint `audit/rooms.members` that allows users with `view-members-list-all-rooms` to fetch a list of the members of any room even if the user is not part of it. diff --git a/.changeset/funny-snails-promise.md b/.changeset/funny-snails-promise.md deleted file mode 100644 index bdd74a60b1e9..000000000000 --- a/.changeset/funny-snails-promise.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/livechat": patch ---- - -livechat `setDepartment` livechat api fixes: -- Changing department didn't reflect on the registration form in real time -- Changing the department mid conversation didn't transfer the chat -- Depending on the state of the department, it couldn't be set as default - diff --git a/.changeset/gentle-bugs-think.md b/.changeset/gentle-bugs-think.md new file mode 100644 index 000000000000..fc4738f3043a --- /dev/null +++ b/.changeset/gentle-bugs-think.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Prevent `processRoomAbandonment` callback from erroring out when a room was inactive during a day Business Hours was not configured for. diff --git a/.changeset/gentle-news-wonder.md b/.changeset/gentle-news-wonder.md new file mode 100644 index 000000000000..dd3218003d7a --- /dev/null +++ b/.changeset/gentle-news-wonder.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": minor +--- + +Added a new 'Deactivated' tab to the users page, this tab lists users who have logged in for the first time but have been deactivated for any reason. Also added the UI code for the Active tab; diff --git a/.changeset/gorgeous-hotels-attend.md b/.changeset/gorgeous-hotels-attend.md new file mode 100644 index 000000000000..fd858d7ace86 --- /dev/null +++ b/.changeset/gorgeous-hotels-attend.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Stopped non channel members from dragging and dropping files in a channel they do not belong diff --git a/.changeset/grumpy-worms-appear.md b/.changeset/grumpy-worms-appear.md deleted file mode 100644 index fb9fab77b24c..000000000000 --- a/.changeset/grumpy-worms-appear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/i18n": patch ---- - -Fixed wrong wording on a federation setting diff --git a/.changeset/happy-peaches-nail.md b/.changeset/happy-peaches-nail.md deleted file mode 100644 index 2dfb2151ced0..000000000000 --- a/.changeset/happy-peaches-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed issue with livechat agents not being able to leave omnichannel rooms if joining after a room has been closed by the visitor (due to race conditions) diff --git a/.changeset/hip-queens-taste.md b/.changeset/hip-queens-taste.md deleted file mode 100644 index f1d7bb6f3f0e..000000000000 --- a/.changeset/hip-queens-taste.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": minor ---- - -Added the possibility for apps to remove users from a room diff --git a/.changeset/large-geese-ring.md b/.changeset/large-geese-ring.md new file mode 100644 index 000000000000..9b36edf1c02d --- /dev/null +++ b/.changeset/large-geese-ring.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': minor +--- + +Replaces an outdated banner with the Bubble component in order to display retention policy warning diff --git a/.changeset/lemon-steaks-provide.md b/.changeset/lemon-steaks-provide.md new file mode 100644 index 000000000000..29f0289419a0 --- /dev/null +++ b/.changeset/lemon-steaks-provide.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/i18n': minor +'@rocket.chat/meteor': minor +--- + +Added an accordion for advanced settings on Create teams and channels diff --git a/.changeset/lucky-beds-glow.md b/.changeset/lucky-beds-glow.md deleted file mode 100644 index 3e23797025e1..000000000000 --- a/.changeset/lucky-beds-glow.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rocket.chat/ui-client': minor -'@rocket.chat/i18n': minor -'@rocket.chat/meteor': minor ---- - -Feature Preview: New Navigation - `Header` and `Contextualbar` size improvements consistent with the new global `NavBar` diff --git a/.changeset/lucky-countries-look.md b/.changeset/lucky-countries-look.md deleted file mode 100644 index 79deda53edfc..000000000000 --- a/.changeset/lucky-countries-look.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fixed the disappearance of some settings after navigation under network latency. diff --git a/.changeset/nervous-rockets-impress.md b/.changeset/nervous-rockets-impress.md deleted file mode 100644 index 26e9276193de..000000000000 --- a/.changeset/nervous-rockets-impress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixes Missing line breaks on Omnichannel Room Info Panel diff --git a/.changeset/popular-bottles-visit.md b/.changeset/popular-bottles-visit.md new file mode 100644 index 000000000000..9e44e9dd7144 --- /dev/null +++ b/.changeset/popular-bottles-visit.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed an issue that caused UI to show an error when the call to get the Business Hour type from settings returned `undefined`. diff --git a/.changeset/proud-years-buy.md b/.changeset/proud-years-buy.md new file mode 100644 index 000000000000..94f4ab0df736 --- /dev/null +++ b/.changeset/proud-years-buy.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/i18n': patch +--- + +Fixes a typo in german translation and fixes the broken hyperlink for Resend and Change Email diff --git a/.changeset/rare-penguins-hope.md b/.changeset/rare-penguins-hope.md deleted file mode 100644 index 187bd9d09ddc..000000000000 --- a/.changeset/rare-penguins-hope.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/core-typings": patch ---- - -Allow customFields on livechat creation bridge diff --git a/.changeset/rotten-eggs-end.md b/.changeset/rotten-eggs-end.md deleted file mode 100644 index 7d0ad6ee5047..000000000000 --- a/.changeset/rotten-eggs-end.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@rocket.chat/meteor": minor -"@rocket.chat/i18n": patch -"@rocket.chat/ui-client": patch ---- - -Implemented a new tab to the users page called 'Active', this tab lists all users who have logged in for the first time and are active. diff --git a/.changeset/rude-dogs-burn.md b/.changeset/rude-dogs-burn.md new file mode 100644 index 000000000000..e81f00782083 --- /dev/null +++ b/.changeset/rude-dogs-burn.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed a behavior when updating messages that prevented the `customFields` prop from being updated if there were no changes to the `msg` property. Now, `customFields` will be always updated on message update even if `msg` doesn't change diff --git a/.changeset/selfish-emus-sing.md b/.changeset/selfish-emus-sing.md deleted file mode 100644 index 315d674a1857..000000000000 --- a/.changeset/selfish-emus-sing.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@rocket.chat/meteor": minor -"@rocket.chat/i18n": minor ---- - -Added account setting `Accounts_Default_User_Preferences_sidebarSectionsOrder` to allow users to reorganize sidebar sections diff --git a/.changeset/sour-forks-breathe.md b/.changeset/sour-forks-breathe.md deleted file mode 100644 index 2d1076845fa9..000000000000 --- a/.changeset/sour-forks-breathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": minor ---- - -Extended apps-engine events for users leaving a room to also fire when being removed by another user. Also added the triggering user's information to the event's context payload. diff --git a/.changeset/strong-swans-double.md b/.changeset/strong-swans-double.md new file mode 100644 index 000000000000..db521aeeef0f --- /dev/null +++ b/.changeset/strong-swans-double.md @@ -0,0 +1,6 @@ +--- +'@rocket.chat/uikit-playground': minor +'@rocket.chat/meteor': minor +--- + +Upgrades fuselage-toastbar version in order to add pause on hover functionality diff --git a/.changeset/swift-maps-tickle.md b/.changeset/swift-maps-tickle.md new file mode 100644 index 000000000000..076ead1cea4c --- /dev/null +++ b/.changeset/swift-maps-tickle.md @@ -0,0 +1,9 @@ +--- +'@rocket.chat/core-services': minor +'@rocket.chat/model-typings': minor +'@rocket.chat/core-typings': minor +'@rocket.chat/rest-typings': minor +'@rocket.chat/meteor': minor +--- + +Added `sidepanel` field to `teams.create` and `rooms.saveRoomSettings` endpoints diff --git a/.changeset/thin-windows-reply.md b/.changeset/thin-windows-reply.md deleted file mode 100644 index 1a32e1ddebfb..000000000000 --- a/.changeset/thin-windows-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fixes an issue not displaying all groups in settings list diff --git a/.changeset/thirty-dryers-help.md b/.changeset/thirty-dryers-help.md new file mode 100644 index 000000000000..6d9a7dc205ae --- /dev/null +++ b/.changeset/thirty-dryers-help.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/livechat": patch +--- + +Fixed issue where `after-registration-triggers` would show up in a page when the user was not yet registered diff --git a/.changeset/twelve-windows-train.md b/.changeset/twelve-windows-train.md new file mode 100644 index 000000000000..4c6ef548e650 --- /dev/null +++ b/.changeset/twelve-windows-train.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed: Custom fields in extraData now correctly added to extraRoomInfo by livechat.beforeRoom callback during livechat room creation. diff --git a/.changeset/witty-bats-develop.md b/.changeset/witty-bats-develop.md deleted file mode 100644 index 42c9409d9ef3..000000000000 --- a/.changeset/witty-bats-develop.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/apps": patch -"@rocket.chat/core-services": patch -"@rocket.chat/core-typings": patch -"@rocket.chat/fuselage-ui-kit": patch -"@rocket.chat/rest-typings": patch -"@rocket.chat/ddp-streamer": patch -"@rocket.chat/presence": patch -"rocketchat-services": patch ---- - -Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. diff --git a/.github/actions/build-docker/action.yml b/.github/actions/build-docker/action.yml index 364957ecdf01..6f8250d2acd4 100644 --- a/.github/actions/build-docker/action.yml +++ b/.github/actions/build-docker/action.yml @@ -17,13 +17,25 @@ inputs: required: false description: 'Containers to build along with Rocket.Chat' type: string + turbo-cache: + required: false + description: 'Enable turbo cache' + default: 'true' + publish-image: + required: false + description: 'Publish image' + default: 'true' + setup: + required: false + description: 'Setup node.js' + default: 'true' runs: using: composite steps: - name: Login to GitHub Container Registry - if: (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') + if: inputs.publish-image == 'true' &&(github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') uses: docker/login-action@v2 with: registry: ghcr.io @@ -31,7 +43,7 @@ runs: password: ${{ inputs.CR_PAT }} - name: Restore build - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build path: /tmp/build @@ -42,17 +54,20 @@ runs: cd /tmp/build tar xzf Rocket.Chat.tar.gz rm Rocket.Chat.tar.gz - - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + - uses: rharkor/caching-for-turbo@v1.5 + # if we are testing a PR from a fork, we already called the turbo cache at this point, so it should be false + if: inputs.turbo-cache == 'true' - name: Setup NodeJS uses: ./.github/actions/setup-node + if: inputs.setup == 'true' with: node-version: ${{ inputs.node-version }} cache-modules: true install: true - run: yarn build + if: inputs.setup == 'true' shell: bash - name: Build Docker images @@ -63,9 +78,14 @@ runs: docker compose -f docker-compose-ci.yml build "${args[@]}" - name: Publish Docker images to GitHub Container Registry - if: (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') + if: inputs.publish-image == 'true' && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') shell: bash run: | args=(rocketchat ${{ inputs.build-containers }}) docker compose -f docker-compose-ci.yml push "${args[@]}" + + - name: Clean up temporary files + shell: bash + run: | + sudo rm -rf /tmp/bundle diff --git a/.github/actions/meteor-build/action.yml b/.github/actions/meteor-build/action.yml index d261000ceb87..dfbc1cef4150 100644 --- a/.github/actions/meteor-build/action.yml +++ b/.github/actions/meteor-build/action.yml @@ -91,7 +91,7 @@ runs: meteor node -v git version - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + - uses: rharkor/caching-for-turbo@v1.5 - name: Translation check shell: bash @@ -124,7 +124,8 @@ runs: tar czf /tmp/Rocket.Chat.tar.gz bundle - name: Store build - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: build path: /tmp/Rocket.Chat.tar.gz + overwrite: true diff --git a/.github/actions/setup-node/action.yml b/.github/actions/setup-node/action.yml index caa3c63e00f0..60d54ab896dd 100644 --- a/.github/actions/setup-node/action.yml +++ b/.github/actions/setup-node/action.yml @@ -32,6 +32,7 @@ runs: uses: actions/cache@v3 with: path: | + .turbo/cache node_modules ${{ env.DENO_DIR }} apps/meteor/node_modules diff --git a/.github/workflows/ci-code-check.yml b/.github/workflows/ci-code-check.yml index 75deb399d2f2..fd214bc39488 100644 --- a/.github/workflows/ci-code-check.yml +++ b/.github/workflows/ci-code-check.yml @@ -42,7 +42,7 @@ jobs: # docker rmi $(docker image ls -aq) # df -h - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + - uses: rharkor/caching-for-turbo@v1.5 - name: Cache TypeCheck uses: actions/cache@v3 diff --git a/.github/workflows/ci-test-e2e.yml b/.github/workflows/ci-test-e2e.yml index 920aea0aa308..31a8bc2ea2b6 100644 --- a/.github/workflows/ci-test-e2e.yml +++ b/.github/workflows/ci-test-e2e.yml @@ -99,6 +99,15 @@ jobs: job_summary: true comment_on_pr: false + - name: Setup kernel limits + run: | + sudo sysctl -w net.ipv4.ip_local_port_range="500 65535" + sudo sysctl -w net.ipv4.tcp_mem="383865 511820 2303190" + + echo fs.file-max=20000500 | sudo tee -a /etc/sysctl.conf + echo fs.nr_open=20000500 | sudo tee -a /etc/sysctl.conf + sudo sysctl -p + - name: Login to GitHub Container Registry if: (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop') uses: docker/login-action@v2 @@ -121,16 +130,21 @@ jobs: node-version: ${{ inputs.node-version }} cache-modules: true install: true + - uses: rharkor/caching-for-turbo@v1.5 + - run: yarn build # if we are testing a PR from a fork, we need to build the docker image at this point - uses: ./.github/actions/build-docker - if: github.event.pull_request.head.repo.full_name != github.repository + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository with: CR_USER: ${{ secrets.CR_USER }} CR_PAT: ${{ secrets.CR_PAT }} node-version: ${{ inputs.node-version }} - - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + # we already called the turbo cache at this point, so it should be false + turbo-cache: false + # the same reason we need to rebuild the docker image at this point is the reason we dont want to publish it + publish-image: false + setup: false - name: Start httpbin container and wait for it to be ready if: inputs.type == 'api' @@ -150,8 +164,6 @@ jobs: exit 1 fi - - run: yarn build - - name: Prepare code coverage directory if: inputs.release == 'ee' run: | @@ -212,6 +224,8 @@ jobs: sleep 10 done; + - name: Remove unused Docker images + run: docker system prune -af - name: E2E Test API if: inputs.type == 'api' working-directory: ./apps/meteor @@ -272,9 +286,9 @@ jobs: - name: Store playwright test trace if: inputs.type == 'ui' && always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: playwright-test-trace${{ inputs.release }} + name: playwright-test-trace-${{ matrix.mongodb-version }}-${{ matrix.shard }} path: ./apps/meteor/tests/e2e/.playwright* - name: Show server logs if E2E test failed @@ -305,14 +319,14 @@ jobs: - name: Store e2e-api-ee-coverage if: inputs.type == 'api' && inputs.release == 'ee' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: e2e-api-ee-coverage + name: e2e-api-ee-coverage-${{ matrix.mongodb-version }}-${{ matrix.shard }} path: /tmp/coverage - name: Store e2e-ee-coverage if: inputs.type == 'ui' && inputs.release == 'ee' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: e2e-ee-coverage + name: e2e-ee-coverage-${{ matrix.mongodb-version }}-${{ matrix.shard }} path: ./apps/meteor/coverage* diff --git a/.github/workflows/ci-test-unit.yml b/.github/workflows/ci-test-unit.yml index bfb22ffa4e73..a32c1e575b8f 100644 --- a/.github/workflows/ci-test-unit.yml +++ b/.github/workflows/ci-test-unit.yml @@ -40,7 +40,7 @@ jobs: cache-modules: true install: true - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + - uses: rharkor/caching-for-turbo@v1.5 - name: Unit Test run: yarn testunit diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 411aa2cc5b1a..246c34423bb1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -161,7 +161,7 @@ jobs: restore-keys: | vite-local-cache-${{ runner.os }}- - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + - uses: rharkor/caching-for-turbo@v1.5 - name: Build Rocket.Chat Packages run: yarn build @@ -492,7 +492,7 @@ jobs: ref: ${{ github.ref }} - name: Restore build - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build path: /tmp/build @@ -540,7 +540,7 @@ jobs: - uses: actions/checkout@v4 - name: Restore build - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build path: /tmp/build @@ -576,13 +576,13 @@ jobs: steps: - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ secrets.CR_USER }} @@ -683,13 +683,13 @@ jobs: steps: - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_PASS }} - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ secrets.CR_USER }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 483b404a6dc8..202a02dd7785 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -26,7 +26,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 # Override language selection by uncommenting this and choosing your languages with: languages: javascript @@ -34,7 +34,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -48,4 +48,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/new-release.yml b/.github/workflows/new-release.yml index f10578d5879f..5ef8027b1467 100644 --- a/.github/workflows/new-release.yml +++ b/.github/workflows/new-release.yml @@ -38,7 +38,7 @@ jobs: cache-modules: true install: true - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + - uses: rharkor/caching-for-turbo@v1.5 - name: Build packages run: yarn build diff --git a/.github/workflows/pr-title-checker.yml b/.github/workflows/pr-title-checker.yml index bc9d1f042d58..d8f6db97c455 100644 --- a/.github/workflows/pr-title-checker.yml +++ b/.github/workflows/pr-title-checker.yml @@ -12,6 +12,6 @@ jobs: check: runs-on: ubuntu-latest steps: - - uses: thehanimo/pr-title-checker@v1.4.1 + - uses: thehanimo/pr-title-checker@v1.4.2 with: GITHUB_TOKEN: ${{ secrets.RC_TITLE_CHECKER }} diff --git a/.github/workflows/pr-update-description.yml b/.github/workflows/pr-update-description.yml index 71b4ffeda801..e792127eac9d 100644 --- a/.github/workflows/pr-update-description.yml +++ b/.github/workflows/pr-update-description.yml @@ -25,7 +25,7 @@ jobs: cache-modules: true install: true - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + - uses: rharkor/caching-for-turbo@v1.5 - name: Build packages run: yarn build @@ -36,4 +36,3 @@ jobs: action: update-pr-description env: GITHUB_TOKEN: ${{ secrets.CI_PAT }} - diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index e133a3153722..ccc3408e194e 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -28,7 +28,7 @@ jobs: cache-modules: true install: true - - uses: dtinth/setup-github-actions-caching-for-turbo@v1 + - uses: rharkor/caching-for-turbo@v1.5 - name: Build packages run: yarn build diff --git a/.github/workflows/update-version-durability.yml b/.github/workflows/update-version-durability.yml index e52b4870b369..90c835577dc1 100644 --- a/.github/workflows/update-version-durability.yml +++ b/.github/workflows/update-version-durability.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3.7.0 + uses: actions/setup-node@v4.0.3 with: node-version: '20.15.1' diff --git a/README.md b/README.md index 64dec811e1ca..56e38c111e97 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,10 @@ yarn dsv # run only meteor (front and back) with pre-built packages After initialized, you can access the server at http://localhost:3000 +More details at: [Developer Docs](https://developer.rocket.chat/v1/docs/server-environment-setup) +PS: For Windows you MUST use WSL2 and have +12Gb RAM + + # Gitpod Setup 1. Click the button below to open this project in Gitpod. diff --git a/_templates/package/new/jest.config.ts.t b/_templates/package/new/jest.config.ts.t new file mode 100644 index 000000000000..c18c8ae02465 --- /dev/null +++ b/_templates/package/new/jest.config.ts.t @@ -0,0 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + +export default { + preset: server.preset, +} satisfies Config; diff --git a/_templates/package/new/package.json.ejs.t b/_templates/package/new/package.json.ejs.t index 950e5cb2bf62..6bee52f55927 100644 --- a/_templates/package/new/package.json.ejs.t +++ b/_templates/package/new/package.json.ejs.t @@ -7,11 +7,11 @@ to: packages/<%= name %>/package.json "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.3", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "eslint": "~8.45.0", - "jest": "~29.6.1", - "ts-jest": "~29.0.5", - "typescript": "~5.1.6" + "jest": "~29.7.0", + "typescript": "~5.3.3" }, "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", diff --git a/_templates/package/new/tsconfig.json.ejs.t b/_templates/package/new/tsconfig.json.ejs.t index 3e192c674d1b..399544502ed0 100644 --- a/_templates/package/new/tsconfig.json.ejs.t +++ b/_templates/package/new/tsconfig.json.ejs.t @@ -2,10 +2,10 @@ to: packages/<%= name %>/tsconfig.json --- { - "extends": "../../tsconfig.base.client.json", + "extends": "../../tsconfig.base.server.json", "compilerOptions": { "rootDir": "./src", "outDir": "./dist" }, - "include": ["./src/**/*"] + "include": ["./src/**/*"], } diff --git a/apps/meteor/.meteorMocks/index.ts b/apps/meteor/.meteorMocks/index.ts deleted file mode 100644 index e70ffa7f7c46..000000000000 --- a/apps/meteor/.meteorMocks/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import sinon from 'sinon'; - -export const Meteor = { - loginWithSamlToken: sinon.stub(), -}; diff --git a/apps/meteor/.mocharc.client.js b/apps/meteor/.mocharc.client.js deleted file mode 100644 index cf339a420378..000000000000 --- a/apps/meteor/.mocharc.client.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -/** - * Mocha configuration for client-side unit and integration tests. - */ - -const base = require('./.mocharc.base.json'); - -/** - * Mocha will run `ts-node` without doing type checking to speed-up the tests. It should be fine as `npm run typecheck` - * covers test files too. - */ - -Object.assign( - process.env, - { - TS_NODE_FILES: true, - TS_NODE_TRANSPILE_ONLY: true, - }, - process.env, -); - -module.exports = { - ...base, // see https://github.com/mochajs/mocha/issues/3916 - require: [ - ...base.require, - './tests/setup/registerWebApiMocks.ts', - './tests/setup/hoistedReact.ts', - './tests/setup/cleanupTestingLibrary.ts', - ], - reporter: 'dot', - timeout: 5000, - exit: false, - slow: 200, - spec: [ - 'tests/unit/client/sidebar/**/*.spec.{ts,tsx}', - 'tests/unit/client/components/**/*.spec.{ts,tsx}', - 'tests/unit/client/lib/**/*.spec.{ts,tsx}', - 'tests/unit/lib/**/*.tests.ts', - 'tests/unit/client/**/*.test.ts', - ], -}; diff --git a/apps/meteor/CHANGELOG.md b/apps/meteor/CHANGELOG.md index a3458db7863b..f466c34da838 100644 --- a/apps/meteor/CHANGELOG.md +++ b/apps/meteor/CHANGELOG.md @@ -1,5 +1,558 @@ # @rocket.chat/meteor +## 6.11.0 + +### Minor Changes + +- ([#32498](https://github.com/RocketChat/Rocket.Chat/pull/32498)) Created a `transferChat` Livechat API endpoint for transferring chats programmatically, the endpoint has all the limitations & permissions required that transferring via UI has + +- ([#32792](https://github.com/RocketChat/Rocket.Chat/pull/32792)) Allows admins to customize the `Subject` field of Omnichannel email transcripts via setting. By passing a value to the setting `Custom email subject for transcript`, system will use it as the `Subject` field, unless a custom subject is passed when requesting a transcript. If there's no custom subject and setting value is empty, the current default value will be used + +- ([#32739](https://github.com/RocketChat/Rocket.Chat/pull/32739)) Fixed an issue where FCM actions did not respect environment's proxy settings + +- ([#32706](https://github.com/RocketChat/Rocket.Chat/pull/32706)) Added the possibility for apps to remove users from a room + +- ([#32517](https://github.com/RocketChat/Rocket.Chat/pull/32517)) Feature Preview: New Navigation - `Header` and `Contextualbar` size improvements consistent with the new global `NavBar` + +- ([#32493](https://github.com/RocketChat/Rocket.Chat/pull/32493)) Fixed Livechat rooms being displayed in the Engagement Dashboard's "Channels" tab + +- ([#32742](https://github.com/RocketChat/Rocket.Chat/pull/32742)) Fixed an issue where adding `OVERWRITE_SETTING_` for any setting wasn't immediately taking effect sometimes, and needed a server restart to reflect. + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. +- ([#32176](https://github.com/RocketChat/Rocket.Chat/pull/32176)) Added a method to the Apps-Engine that allows apps to read multiple messages from a room + +- ([#32493](https://github.com/RocketChat/Rocket.Chat/pull/32493)) Improved Engagement Dashboard's "Channels" tab performance by not returning rooms that had no activity in the analyzed period + +- ([#32024](https://github.com/RocketChat/Rocket.Chat/pull/32024)) Implemented a new tab to the users page called 'Active', this tab lists all users who have logged in for the first time and are active. + +- ([#32744](https://github.com/RocketChat/Rocket.Chat/pull/32744)) Added account setting `Accounts_Default_User_Preferences_sidebarSectionsOrder` to allow users to reorganize sidebar sections + +- ([#32820](https://github.com/RocketChat/Rocket.Chat/pull/32820)) Added a new setting `Livechat_transcript_send_always` that allows admins to decide if email transcript should be sent all the times when a conversation is closed. This setting bypasses agent's preferences. For this setting to work, `Livechat_enable_transcript` should be off, meaning that visitors will no longer receive the option to decide if they want a transcript or not. + +- ([#32724](https://github.com/RocketChat/Rocket.Chat/pull/32724)) Extended apps-engine events for users leaving a room to also fire when being removed by another user. Also added the triggering user's information to the event's context payload. + +- ([#32777](https://github.com/RocketChat/Rocket.Chat/pull/32777)) Added handling of attachments in Omnichannel email transcripts. Earlier attachments were being skipped and were being shown as empty space, now it should render the image attachments and should show relevant error message for unsupported attachments. + +- ([#32800](https://github.com/RocketChat/Rocket.Chat/pull/32800)) Added the ability to filter chats by `queued` on the Current Chats Omnichannel page + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- ([#32679](https://github.com/RocketChat/Rocket.Chat/pull/32679)) Fix validations from "UiKit" modal component + +- ([#32730](https://github.com/RocketChat/Rocket.Chat/pull/32730)) Fixed issue in Marketplace that caused a subscription app to show incorrect modals when subscribing + +- ([#32628](https://github.com/RocketChat/Rocket.Chat/pull/32628)) Fixed SAML users' full names being updated on login regardless of the "Overwrite user fullname (use idp attribute)" setting + +- ([#32692](https://github.com/RocketChat/Rocket.Chat/pull/32692)) Fixed an issue that caused the widget to set the wrong department when using the setDepartment Livechat api endpoint in conjunction with a Livechat Trigger + +- ([#32527](https://github.com/RocketChat/Rocket.Chat/pull/32527)) Fixed an inconsistent evaluation of the `Accounts_LoginExpiration` setting over the codebase. In some places, it was being used as milliseconds while in others as days. Invalid values produced different results. A helper function was created to centralize the setting validation and the proper value being returned to avoid edge cases. + Negative values may be saved on the settings UI panel but the code will interpret any negative, NaN or 0 value to the default expiration which is 90 days. +- ([#32626](https://github.com/RocketChat/Rocket.Chat/pull/32626)) livechat `setDepartment` livechat api fixes: + - Changing department didn't reflect on the registration form in real time + - Changing the department mid conversation didn't transfer the chat + - Depending on the state of the department, it couldn't be set as default +- ([#32810](https://github.com/RocketChat/Rocket.Chat/pull/32810)) Fixed issue where bad word filtering was not working in the UI for messages + +- ([#32707](https://github.com/RocketChat/Rocket.Chat/pull/32707)) Fixed issue with livechat agents not being able to leave omnichannel rooms if joining after a room has been closed by the visitor (due to race conditions) + +- ([#32837](https://github.com/RocketChat/Rocket.Chat/pull/32837)) Fixed an issue where non-encrypted attachments were not being downloaded + +- ([#32861](https://github.com/RocketChat/Rocket.Chat/pull/32861)) fixed the contextual bar closing when editing thread messages instead of cancelling the message edit + +- ([#32713](https://github.com/RocketChat/Rocket.Chat/pull/32713)) Fixed the disappearance of some settings after navigation under network latency. + +- ([#32592](https://github.com/RocketChat/Rocket.Chat/pull/32592)) Fixes Missing line breaks on Omnichannel Room Info Panel + +- ([#32807](https://github.com/RocketChat/Rocket.Chat/pull/32807)) Fixed web client crashing on Firefox private window. Firefox disables access to service workers inside private windows. Rocket.Chat needs service workers to process E2EE encrypted files on rooms. These types of files won't be available inside private windows, but the rest of E2EE encrypted features should work normally + +- ([#32864](https://github.com/RocketChat/Rocket.Chat/pull/32864)) fixed an issue in the "Create discussion" form, that would have the "Create" action button disabled even though the form is prefilled when opening it from the message action + +- ([#32691](https://github.com/RocketChat/Rocket.Chat/pull/32691)) Removed 'Hide' option in the room menu for Omnichannel conversations. + +- ([#32445](https://github.com/RocketChat/Rocket.Chat/pull/32445)) Fixed LDAP rooms, teams and roles syncs not being triggered on login even when the "Update User Data on Login" setting is enabled + +- ([#32328](https://github.com/RocketChat/Rocket.Chat/pull/32328)) Allow customFields on livechat creation bridge + +- ([#32803](https://github.com/RocketChat/Rocket.Chat/pull/32803)) Fixed "Copy link" message action enabled in Starred and Pinned list for End to End Encrypted channels, this action is disabled now + +- ([#32769](https://github.com/RocketChat/Rocket.Chat/pull/32769)) Fixed issue that caused unintentional clicks when scrolling the channels sidebar on safari/chrome in iOS + +- ([#32857](https://github.com/RocketChat/Rocket.Chat/pull/32857)) Fixed some anomalies related to disabled E2EE rooms. Earlier there are some weird issues with disabled E2EE rooms, this PR fixes these anomalies. + +- ([#32765](https://github.com/RocketChat/Rocket.Chat/pull/32765)) Fixed an issue that prevented the option to start a discussion from being shown on the message actions + +- ([#32671](https://github.com/RocketChat/Rocket.Chat/pull/32671)) Fix show correct user roles after updating user roles on admin edit user panel. + +- ([#32482](https://github.com/RocketChat/Rocket.Chat/pull/32482)) Fixed an issue with blocked login when dismissed 2FA modal by clicking outside of it or pressing the escape key + +- ([#32804](https://github.com/RocketChat/Rocket.Chat/pull/32804)) Fixes an issue not displaying all groups in settings list + +- ([#32815](https://github.com/RocketChat/Rocket.Chat/pull/32815)) Security Hotfix (https://docs.rocket.chat/guides/security/security-updates) + +- ([#32632](https://github.com/RocketChat/Rocket.Chat/pull/32632)) Improving UX by change the position of room info actions buttons and menu order to avoid missclick in destructive actions. + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Reduced time on generation of PDF transcripts. Earlier Rocket.Chat was fetching the required translations everytime a PDF transcript was requested, this process was async and was being unnecessarily being performed on every pdf transcript request. This PR improves this and now the translations are loaded at the start and kept in memory to process further pdf transcripts requests. This reduces the time of asynchronously fetching translations again and again. + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
Updated dependencies [88e5219bd2, b4bbcbfc9a, 8fc6ca8b4e, 25da5280a5, 1b7b1161cf, 439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 3ffe4a2944, 3b4b19cfc5, 4e8aa575a6, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/fuselage-ui-kit@9.0.0 + - @rocket.chat/i18n@0.6.0 + - @rocket.chat/tools@0.2.2 + - @rocket.chat/ui-client@9.0.0 + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/omnichannel-services@0.3.0 + - @rocket.chat/pdf-worker@0.2.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/ui-video-conf@9.0.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/ui-contexts@9.0.0 + - @rocket.chat/models@0.2.0 + - @rocket.chat/ui-kit@0.36.0 + - @rocket.chat/web-ui-registration@9.0.0 + - @rocket.chat/rest-typings@6.11.0 + - @rocket.chat/apps@0.1.3 + - @rocket.chat/presence@0.2.3 + - @rocket.chat/gazzodown@9.0.0 + - @rocket.chat/api-client@0.2.3 + - @rocket.chat/license@0.2.3 + - @rocket.chat/cron@0.1.3 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@5.0.0 + - @rocket.chat/instance-status@0.1.3 + - @rocket.chat/server-cloud-communication@0.0.2 +
+ +## 6.11.0-rc.6 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/api-client@0.2.3-rc.6 + - @rocket.chat/license@0.2.3-rc.6 + - @rocket.chat/omnichannel-services@0.3.0-rc.6 + - @rocket.chat/pdf-worker@0.2.0-rc.6 + - @rocket.chat/presence@0.2.3-rc.6 + - @rocket.chat/apps@0.1.3-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/cron@0.1.3-rc.6 + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.6 + - @rocket.chat/gazzodown@9.0.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/ui-contexts@9.0.0-rc.6 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.2.0-rc.6 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@5.0.0-rc.6 + - @rocket.chat/ui-client@9.0.0-rc.6 + - @rocket.chat/ui-video-conf@9.0.0-rc.6 + - @rocket.chat/web-ui-registration@9.0.0-rc.6 + - @rocket.chat/instance-status@0.1.3-rc.6 +
+ +## 6.11.0-rc.5 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/api-client@0.2.3-rc.5 + - @rocket.chat/license@0.2.3-rc.5 + - @rocket.chat/omnichannel-services@0.3.0-rc.5 + - @rocket.chat/pdf-worker@0.2.0-rc.5 + - @rocket.chat/presence@0.2.3-rc.5 + - @rocket.chat/apps@0.1.3-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/cron@0.1.3-rc.5 + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.5 + - @rocket.chat/gazzodown@9.0.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/ui-contexts@9.0.0-rc.5 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.2.0-rc.5 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@5.0.0-rc.5 + - @rocket.chat/ui-client@9.0.0-rc.5 + - @rocket.chat/ui-video-conf@9.0.0-rc.5 + - @rocket.chat/web-ui-registration@9.0.0-rc.5 + - @rocket.chat/instance-status@0.1.3-rc.5 +
+ +## 6.11.0-rc.4 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/api-client@0.2.3-rc.4 + - @rocket.chat/license@0.2.3-rc.4 + - @rocket.chat/omnichannel-services@0.3.0-rc.4 + - @rocket.chat/pdf-worker@0.2.0-rc.4 + - @rocket.chat/presence@0.2.3-rc.4 + - @rocket.chat/apps@0.1.3-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/cron@0.1.3-rc.4 + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.4 + - @rocket.chat/gazzodown@9.0.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/ui-contexts@9.0.0-rc.4 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.2.0-rc.4 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@5.0.0-rc.4 + - @rocket.chat/ui-client@9.0.0-rc.4 + - @rocket.chat/ui-video-conf@9.0.0-rc.4 + - @rocket.chat/web-ui-registration@9.0.0-rc.4 + - @rocket.chat/instance-status@0.1.3-rc.4 +
+ +## 6.11.0-rc.3 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/api-client@0.2.3-rc.3 + - @rocket.chat/license@0.2.3-rc.3 + - @rocket.chat/omnichannel-services@0.3.0-rc.3 + - @rocket.chat/pdf-worker@0.2.0-rc.3 + - @rocket.chat/presence@0.2.3-rc.3 + - @rocket.chat/apps@0.1.3-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/cron@0.1.3-rc.3 + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.3 + - @rocket.chat/gazzodown@9.0.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/ui-contexts@9.0.0-rc.3 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.2.0-rc.3 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@5.0.0-rc.3 + - @rocket.chat/ui-client@9.0.0-rc.3 + - @rocket.chat/ui-video-conf@9.0.0-rc.3 + - @rocket.chat/web-ui-registration@9.0.0-rc.3 + - @rocket.chat/instance-status@0.1.3-rc.3 +
+ +## 6.11.0-rc.2 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/api-client@0.2.3-rc.2 + - @rocket.chat/license@0.2.3-rc.2 + - @rocket.chat/omnichannel-services@0.3.0-rc.2 + - @rocket.chat/pdf-worker@0.2.0-rc.2 + - @rocket.chat/presence@0.2.3-rc.2 + - @rocket.chat/apps@0.1.3-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/cron@0.1.3-rc.2 + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.2 + - @rocket.chat/gazzodown@9.0.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/ui-contexts@9.0.0-rc.2 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.2.0-rc.2 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@5.0.0-rc.2 + - @rocket.chat/ui-client@9.0.0-rc.2 + - @rocket.chat/ui-video-conf@9.0.0-rc.2 + - @rocket.chat/web-ui-registration@9.0.0-rc.2 + - @rocket.chat/instance-status@0.1.3-rc.2 +
+ +## 6.11.0-rc.1 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/api-client@0.2.2-rc.1 + - @rocket.chat/license@0.2.2-rc.1 + - @rocket.chat/omnichannel-services@0.3.0-rc.1 + - @rocket.chat/pdf-worker@0.2.0-rc.1 + - @rocket.chat/presence@0.2.2-rc.1 + - @rocket.chat/apps@0.1.2-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/cron@0.1.2-rc.1 + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.1 + - @rocket.chat/gazzodown@9.0.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/ui-contexts@9.0.0-rc.1 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.2.0-rc.1 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@5.0.0-rc.1 + - @rocket.chat/ui-client@9.0.0-rc.1 + - @rocket.chat/ui-video-conf@9.0.0-rc.1 + - @rocket.chat/web-ui-registration@9.0.0-rc.1 + - @rocket.chat/instance-status@0.1.2-rc.1 +
+ +## 6.11.0-rc.0 + +### Minor Changes + +- ([#32498](https://github.com/RocketChat/Rocket.Chat/pull/32498)) Created a `transferChat` Livechat API endpoint for transferring chats programmatically, the endpoint has all the limitations & permissions required that transferring via UI has + +- ([#32792](https://github.com/RocketChat/Rocket.Chat/pull/32792)) Allows admins to customize the `Subject` field of Omnichannel email transcripts via setting. By passing a value to the setting `Custom email subject for transcript`, system will use it as the `Subject` field, unless a custom subject is passed when requesting a transcript. If there's no custom subject and setting value is empty, the current default value will be used + +- ([#32739](https://github.com/RocketChat/Rocket.Chat/pull/32739)) Fixed an issue where FCM actions did not respect environment's proxy settings + +- ([#32570](https://github.com/RocketChat/Rocket.Chat/pull/32570)) Login services button was not respecting the button color and text color settings. Implemented a fix to respect these settings and change the button colors accordingly. + + Added a warning on all settings which allow admins to change OAuth button colors, so that they can be alerted about WCAG (Web Content Accessibility Guidelines) compliance. + +- ([#32706](https://github.com/RocketChat/Rocket.Chat/pull/32706)) Added the possibility for apps to remove users from a room + +- ([#32517](https://github.com/RocketChat/Rocket.Chat/pull/32517)) Feature Preview: New Navigation - `Header` and `Contextualbar` size improvements consistent with the new global `NavBar` + +- ([#32493](https://github.com/RocketChat/Rocket.Chat/pull/32493)) Fixed Livechat rooms being displayed in the Engagement Dashboard's "Channels" tab + +- ([#32742](https://github.com/RocketChat/Rocket.Chat/pull/32742)) Fixed an issue where adding `OVERWRITE_SETTING_` for any setting wasn't immediately taking effect sometimes, and needed a server restart to reflect. + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. +- ([#32176](https://github.com/RocketChat/Rocket.Chat/pull/32176)) Added a method to the Apps-Engine that allows apps to read multiple messages from a room + +- ([#32493](https://github.com/RocketChat/Rocket.Chat/pull/32493)) Improved Engagement Dashboard's "Channels" tab performance by not returning rooms that had no activity in the analyzed period + +- ([#32024](https://github.com/RocketChat/Rocket.Chat/pull/32024)) Implemented a new tab to the users page called 'Active', this tab lists all users who have logged in for the first time and are active. + +- ([#32744](https://github.com/RocketChat/Rocket.Chat/pull/32744)) Added account setting `Accounts_Default_User_Preferences_sidebarSectionsOrder` to allow users to reorganize sidebar sections + +- ([#32820](https://github.com/RocketChat/Rocket.Chat/pull/32820)) Added a new setting `Livechat_transcript_send_always` that allows admins to decide if email transcript should be sent all the times when a conversation is closed. This setting bypasses agent's preferences. For this setting to work, `Livechat_enable_transcript` should be off, meaning that visitors will no longer receive the option to decide if they want a transcript or not. + +- ([#32724](https://github.com/RocketChat/Rocket.Chat/pull/32724)) Extended apps-engine events for users leaving a room to also fire when being removed by another user. Also added the triggering user's information to the event's context payload. + +- ([#32777](https://github.com/RocketChat/Rocket.Chat/pull/32777)) Added handling of attachments in Omnichannel email transcripts. Earlier attachments were being skipped and were being shown as empty space, now it should render the image attachments and should show relevant error message for unsupported attachments. + +- ([#32800](https://github.com/RocketChat/Rocket.Chat/pull/32800)) Added the ability to filter chats by `queued` on the Current Chats Omnichannel page + +### Patch Changes + +- ([#32679](https://github.com/RocketChat/Rocket.Chat/pull/32679)) Fix validations from "UiKit" modal component + +- ([#32730](https://github.com/RocketChat/Rocket.Chat/pull/32730)) Fixed issue in Marketplace that caused a subscription app to show incorrect modals when subscribing + +- ([#32628](https://github.com/RocketChat/Rocket.Chat/pull/32628)) Fixed SAML users' full names being updated on login regardless of the "Overwrite user fullname (use idp attribute)" setting + +- ([#32692](https://github.com/RocketChat/Rocket.Chat/pull/32692)) Fixed an issue that caused the widget to set the wrong department when using the setDepartment Livechat api endpoint in conjunction with a Livechat Trigger + +- ([#32527](https://github.com/RocketChat/Rocket.Chat/pull/32527)) Fixed an inconsistent evaluation of the `Accounts_LoginExpiration` setting over the codebase. In some places, it was being used as milliseconds while in others as days. Invalid values produced different results. A helper function was created to centralize the setting validation and the proper value being returned to avoid edge cases. + Negative values may be saved on the settings UI panel but the code will interpret any negative, NaN or 0 value to the default expiration which is 90 days. +- ([#32626](https://github.com/RocketChat/Rocket.Chat/pull/32626)) livechat `setDepartment` livechat api fixes: + - Changing department didn't reflect on the registration form in real time + - Changing the department mid conversation didn't transfer the chat + - Depending on the state of the department, it couldn't be set as default +- ([#32810](https://github.com/RocketChat/Rocket.Chat/pull/32810)) Fixed issue where bad word filtering was not working in the UI for messages + +- ([#32707](https://github.com/RocketChat/Rocket.Chat/pull/32707)) Fixed issue with livechat agents not being able to leave omnichannel rooms if joining after a room has been closed by the visitor (due to race conditions) + +- ([#32837](https://github.com/RocketChat/Rocket.Chat/pull/32837)) Fixed an issue where non-encrypted attachments were not being downloaded + +- ([#32861](https://github.com/RocketChat/Rocket.Chat/pull/32861)) fixed the contextual bar closing when editing thread messages instead of cancelling the message edit + +- ([#32713](https://github.com/RocketChat/Rocket.Chat/pull/32713)) Fixed the disappearance of some settings after navigation under network latency. + +- ([#32592](https://github.com/RocketChat/Rocket.Chat/pull/32592)) Fixes Missing line breaks on Omnichannel Room Info Panel + +- ([#32807](https://github.com/RocketChat/Rocket.Chat/pull/32807)) Fixed web client crashing on Firefox private window. Firefox disables access to service workers inside private windows. Rocket.Chat needs service workers to process E2EE encrypted files on rooms. These types of files won't be available inside private windows, but the rest of E2EE encrypted features should work normally + +- ([#32864](https://github.com/RocketChat/Rocket.Chat/pull/32864)) fixed an issue in the "Create discussion" form, that would have the "Create" action button disabled even though the form is prefilled when opening it from the message action + +- ([#32691](https://github.com/RocketChat/Rocket.Chat/pull/32691)) Removed 'Hide' option in the room menu for Omnichannel conversations. + +- ([#32445](https://github.com/RocketChat/Rocket.Chat/pull/32445)) Fixed LDAP rooms, teams and roles syncs not being triggered on login even when the "Update User Data on Login" setting is enabled + +- ([#32328](https://github.com/RocketChat/Rocket.Chat/pull/32328)) Allow customFields on livechat creation bridge + +- ([#32803](https://github.com/RocketChat/Rocket.Chat/pull/32803)) Fixed "Copy link" message action enabled in Starred and Pinned list for End to End Encrypted channels, this action is disabled now + +- ([#32769](https://github.com/RocketChat/Rocket.Chat/pull/32769)) Fixed issue that caused unintentional clicks when scrolling the channels sidebar on safari/chrome in iOS + +- ([#32857](https://github.com/RocketChat/Rocket.Chat/pull/32857)) Fixed some anomalies related to disabled E2EE rooms. Earlier there are some weird issues with disabled E2EE rooms, this PR fixes these anomalies. + +- ([#32765](https://github.com/RocketChat/Rocket.Chat/pull/32765)) Fixed an issue that prevented the option to start a discussion from being shown on the message actions + +- ([#32671](https://github.com/RocketChat/Rocket.Chat/pull/32671)) Fix show correct user roles after updating user roles on admin edit user panel. + +- ([#32482](https://github.com/RocketChat/Rocket.Chat/pull/32482)) Fixed an issue with blocked login when dismissed 2FA modal by clicking outside of it or pressing the escape key + +- ([#32804](https://github.com/RocketChat/Rocket.Chat/pull/32804)) Fixes an issue not displaying all groups in settings list + +- ([#32815](https://github.com/RocketChat/Rocket.Chat/pull/32815)) Security Hotfix (https://docs.rocket.chat/guides/security/security-updates) + +- ([#32632](https://github.com/RocketChat/Rocket.Chat/pull/32632)) Improving UX by change the position of room info actions buttons and menu order to avoid missclick in destructive actions. + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Reduced time on generation of PDF transcripts. Earlier Rocket.Chat was fetching the required translations everytime a PDF transcript was requested, this process was async and was being unnecessarily being performed on every pdf transcript request. This PR improves this and now the translations are loaded at the start and kept in memory to process further pdf transcripts requests. This reduces the time of asynchronously fetching translations again and again. + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
Updated dependencies [88e5219bd2, b4bbcbfc9a, 8fc6ca8b4e, 15664127be, 25da5280a5, 1b7b1161cf, 439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 3ffe4a2944, 3b4b19cfc5, 4e8aa575a6, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.0 + - @rocket.chat/i18n@0.6.0-rc.0 + - @rocket.chat/tools@0.2.2-rc.0 + - @rocket.chat/web-ui-registration@9.0.0-rc.0 + - @rocket.chat/ui-client@9.0.0-rc.0 + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/omnichannel-services@0.3.0-rc.0 + - @rocket.chat/pdf-worker@0.2.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/ui-video-conf@9.0.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/ui-contexts@9.0.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/ui-kit@0.36.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 + - @rocket.chat/apps@0.1.2-rc.0 + - @rocket.chat/presence@0.2.2-rc.0 + - @rocket.chat/gazzodown@9.0.0-rc.0 + - @rocket.chat/api-client@0.2.2-rc.0 + - @rocket.chat/license@0.2.2-rc.0 + - @rocket.chat/cron@0.1.2-rc.0 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@5.0.0-rc.0 + - @rocket.chat/instance-status@0.1.2-rc.0 + - @rocket.chat/server-cloud-communication@0.0.2 + +## 6.10.2 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32950](https://github.com/RocketChat/Rocket.Chat/pull/32950) by [@dionisio-bot](https://github.com/dionisio-bot)) Fixed a crash on web client due to service workers not being available, this can happen in multiple scenarios like on Firefox's private window or if the connection is not secure (non-HTTPS), [see more details](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts). + + Rocket.Chat needs service workers to process E2EE encrypted files on rooms. These types of files won't be available inside private windows, but the rest of E2EE encrypted features should work normally + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +-
Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/fuselage-ui-kit@8.0.2 + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/presence@0.2.2 + - @rocket.chat/apps@0.1.2 + - @rocket.chat/omnichannel-services@0.2.2 + - @rocket.chat/api-client@0.2.2 + - @rocket.chat/license@0.2.2 + - @rocket.chat/pdf-worker@0.1.2 + - @rocket.chat/cron@0.1.2 + - @rocket.chat/gazzodown@8.0.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/ui-contexts@8.0.2 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.1.2 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@4.0.2 + - @rocket.chat/ui-client@8.0.2 + - @rocket.chat/ui-video-conf@8.0.2 + - @rocket.chat/web-ui-registration@8.0.2 + - @rocket.chat/instance-status@0.1.2 +
+ +## 6.10.1 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- ([#32819](https://github.com/RocketChat/Rocket.Chat/pull/32819) by [@dionisio-bot](https://github.com/dionisio-bot)) Fixed issue with livechat agents not being able to leave omnichannel rooms if joining after a room has been closed by the visitor (due to race conditions) + +- ([#32894](https://github.com/RocketChat/Rocket.Chat/pull/32894)) Security Hotfix (https://docs.rocket.chat/docs/security-fixes-and-updates) + +- ([#32829](https://github.com/RocketChat/Rocket.Chat/pull/32829) by [@dionisio-bot](https://github.com/dionisio-bot)) Fixes an issue not displaying all groups in settings list + +- ([#32836](https://github.com/RocketChat/Rocket.Chat/pull/32836) by [@dionisio-bot](https://github.com/dionisio-bot)) Security Hotfix (https://docs.rocket.chat/guides/security/security-updates) + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/api-client@0.2.1 + - @rocket.chat/license@0.2.1 + - @rocket.chat/omnichannel-services@0.2.1 + - @rocket.chat/pdf-worker@0.1.1 + - @rocket.chat/presence@0.2.1 + - @rocket.chat/apps@0.1.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/cron@0.1.1 + - @rocket.chat/fuselage-ui-kit@8.0.1 + - @rocket.chat/gazzodown@8.0.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/ui-contexts@8.0.1 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.1.1 + - @rocket.chat/ui-theming@0.2.0 + - @rocket.chat/ui-avatar@4.0.1 + - @rocket.chat/ui-client@8.0.1 + - @rocket.chat/ui-video-conf@8.0.1 + - @rocket.chat/web-ui-registration@8.0.1 + - @rocket.chat/instance-status@0.1.1 +
+ ## 6.10.0 ### Minor Changes diff --git a/apps/meteor/app/2fa/server/methods/checkCodesRemaining.ts b/apps/meteor/app/2fa/server/methods/checkCodesRemaining.ts index 219a78483cea..f5f5b0e1f275 100644 --- a/apps/meteor/app/2fa/server/methods/checkCodesRemaining.ts +++ b/apps/meteor/app/2fa/server/methods/checkCodesRemaining.ts @@ -1,7 +1,7 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { '2fa:checkCodesRemaining': () => { remaining: number }; diff --git a/apps/meteor/app/2fa/server/methods/disable.ts b/apps/meteor/app/2fa/server/methods/disable.ts index 0927b3f854ac..d2c71febdc35 100644 --- a/apps/meteor/app/2fa/server/methods/disable.ts +++ b/apps/meteor/app/2fa/server/methods/disable.ts @@ -1,10 +1,10 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { TOTP } from '../lib/totp'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { '2fa:disable': (code: string) => Promise; diff --git a/apps/meteor/app/2fa/server/methods/enable.ts b/apps/meteor/app/2fa/server/methods/enable.ts index 3b9f35dfcd9d..dea859d27b62 100644 --- a/apps/meteor/app/2fa/server/methods/enable.ts +++ b/apps/meteor/app/2fa/server/methods/enable.ts @@ -1,10 +1,10 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { TOTP } from '../lib/totp'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { '2fa:enable': () => Promise<{ secret: string; url: string }>; @@ -34,6 +34,10 @@ Meteor.methods({ }); } + if (user.services?.totp?.enabled) { + throw new Meteor.Error('error-2fa-already-enabled'); + } + const secret = TOTP.generateSecret(); await Users.disable2FAAndSetTempSecretByUserId(userId, secret.base32); diff --git a/apps/meteor/app/2fa/server/methods/regenerateCodes.ts b/apps/meteor/app/2fa/server/methods/regenerateCodes.ts index e0f4cfaa4797..6968abfb93c2 100644 --- a/apps/meteor/app/2fa/server/methods/regenerateCodes.ts +++ b/apps/meteor/app/2fa/server/methods/regenerateCodes.ts @@ -1,10 +1,10 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { TOTP } from '../lib/totp'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { '2fa:regenerateCodes': (userToken: string) => { codes: string[] } | undefined; diff --git a/apps/meteor/app/2fa/server/methods/validateTempToken.ts b/apps/meteor/app/2fa/server/methods/validateTempToken.ts index cc2b44372a04..840fadc8cbf7 100644 --- a/apps/meteor/app/2fa/server/methods/validateTempToken.ts +++ b/apps/meteor/app/2fa/server/methods/validateTempToken.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { notifyOnUserChangeAsync } from '../../../lib/server/lib/notifyListener'; import { TOTP } from '../lib/totp'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { '2fa:validateTempToken': (userToken: string) => { codes: string[] } | undefined; diff --git a/apps/meteor/app/api/server/v1/chat.ts b/apps/meteor/app/api/server/v1/chat.ts index c482e3bb784d..3ccc9caeafa0 100644 --- a/apps/meteor/app/api/server/v1/chat.ts +++ b/apps/meteor/app/api/server/v1/chat.ts @@ -18,6 +18,7 @@ import { executeUpdateMessage } from '../../../lib/server/methods/updateMessage' import { OEmbed } from '../../../oembed/server/server'; import { executeSetReaction } from '../../../reactions/server/setReaction'; import { settings } from '../../../settings/server'; +import { MessageTypes } from '../../../ui-utils/server'; import { normalizeMessagesForUser } from '../../../utils/server/lib/normalizeMessagesForUser'; import { API } from '../api'; import { getPaginationItems } from '../helpers/getPaginationItems'; @@ -217,6 +218,10 @@ API.v1.addRoute( throw new Meteor.Error('error-invalid-params', 'The "message" parameter must be provided.'); } + if (MessageTypes.isSystemMessage(this.bodyParams.message)) { + throw new Error("Cannot send system messages using 'chat.sendMessage'"); + } + const sent = await executeSendMessage(this.userId, this.bodyParams.message as Pick, this.bodyParams.previewUrls); const [message] = await normalizeMessagesForUser([sent], this.userId); diff --git a/apps/meteor/app/api/server/v1/emoji-custom.ts b/apps/meteor/app/api/server/v1/emoji-custom.ts index a61149c5e66e..9cbf202896e1 100644 --- a/apps/meteor/app/api/server/v1/emoji-custom.ts +++ b/apps/meteor/app/api/server/v1/emoji-custom.ts @@ -3,6 +3,8 @@ import { EmojiCustom } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import { SystemLogger } from '../../../../server/lib/logger/system'; +import { insertOrUpdateEmoji } from '../../../emoji-custom/server/lib/insertOrUpdateEmoji'; +import { uploadEmojiCustomWithBuffer } from '../../../emoji-custom/server/lib/uploadEmojiCustom'; import { settings } from '../../../settings/server'; import { API } from '../api'; import { getPaginationItems } from '../helpers/getPaginationItems'; @@ -148,9 +150,19 @@ API.v1.addRoute( fields.extension = emojiToUpdate.extension; } - await Meteor.callAsync('insertOrUpdateEmoji', { ...fields, newFile }); + const emojiData = { + name: fields.name, + _id: fields._id, + aliases: fields.aliases, + extension: fields.extension, + previousName: fields.previousName, + previousExtension: fields.previousExtension, + newFile, + }; + + await insertOrUpdateEmoji(this.userId, emojiData); if (fields.newFile) { - await Meteor.callAsync('uploadEmojiCustom', fileBuffer, mimetype, { ...fields, newFile }); + await uploadEmojiCustomWithBuffer(this.userId, fileBuffer, mimetype, emojiData); } return API.v1.success(); }, diff --git a/apps/meteor/app/api/server/v1/teams.ts b/apps/meteor/app/api/server/v1/teams.ts index 4ea8f2a48f38..f64f8c820575 100644 --- a/apps/meteor/app/api/server/v1/teams.ts +++ b/apps/meteor/app/api/server/v1/teams.ts @@ -1,6 +1,6 @@ import { Team } from '@rocket.chat/core-services'; import type { ITeam, UserStatus } from '@rocket.chat/core-typings'; -import { TEAM_TYPE } from '@rocket.chat/core-typings'; +import { TEAM_TYPE, isValidSidepanel } from '@rocket.chat/core-typings'; import { Users, Rooms } from '@rocket.chat/models'; import { isTeamsConvertToChannelProps, @@ -85,7 +85,11 @@ API.v1.addRoute( }), ); - const { name, type, members, room, owner } = this.bodyParams; + const { name, type, members, room, owner, sidepanel } = this.bodyParams; + + if (sidepanel?.items && !isValidSidepanel(sidepanel)) { + throw new Error('error-invalid-sidepanel'); + } const team = await Team.create(this.userId, { team: { @@ -95,6 +99,7 @@ API.v1.addRoute( room, members, owner, + sidepanel, }); return API.v1.success({ team }); diff --git a/apps/meteor/app/api/server/v1/users.ts b/apps/meteor/app/api/server/v1/users.ts index 041ef0410df0..7ae585b89dfa 100644 --- a/apps/meteor/app/api/server/v1/users.ts +++ b/apps/meteor/app/api/server/v1/users.ts @@ -44,6 +44,7 @@ import { setStatusText } from '../../../lib/server/functions/setStatusText'; import { setUserAvatar } from '../../../lib/server/functions/setUserAvatar'; import { setUsernameWithValidation } from '../../../lib/server/functions/setUsername'; import { validateCustomFields } from '../../../lib/server/functions/validateCustomFields'; +import { validateNameChars } from '../../../lib/server/functions/validateNameChars'; import { notifyOnUserChange, notifyOnUserChangeAsync } from '../../../lib/server/lib/notifyListener'; import { generateAccessToken } from '../../../lib/server/methods/createToken'; import { settings } from '../../../settings/server'; @@ -95,6 +96,10 @@ API.v1.addRoute( async post() { const userData = { _id: this.bodyParams.userId, ...this.bodyParams.data }; + if (userData.name && !validateNameChars(userData.name)) { + return API.v1.failure('Name contains invalid characters'); + } + await saveUser(this.userId, userData); if (this.bodyParams.data.customFields) { @@ -139,6 +144,10 @@ API.v1.addRoute( typedPassword: this.bodyParams.data.currentPassword, }; + if (userData.realname && !validateNameChars(userData.realname)) { + return API.v1.failure('Name contains invalid characters'); + } + // saveUserProfile now uses the default two factor authentication procedures, so we need to provide that const twoFactorOptions = !userData.typedPassword ? null @@ -281,6 +290,10 @@ API.v1.addRoute( this.bodyParams.joinDefaultChannels = true; } + if (this.bodyParams.name && !validateNameChars(this.bodyParams.name)) { + return API.v1.failure('Name contains invalid characters'); + } + if (this.bodyParams.customFields) { validateCustomFields(this.bodyParams.customFields); } @@ -628,16 +641,20 @@ API.v1.addRoute( }, { async post() { + const { secret: secretURL, ...params } = this.bodyParams; + if (this.userId) { return API.v1.failure('Logged in users can not register again.'); } + if (params.name && !validateNameChars(params.name)) { + return API.v1.failure('Name contains invalid characters'); + } + if (!(await checkUsernameAvailability(this.bodyParams.username))) { return API.v1.failure('Username is already in use'); } - const { secret: secretURL, ...params } = this.bodyParams; - if (this.bodyParams.customFields) { try { await validateCustomFields(this.bodyParams.customFields); @@ -1199,7 +1216,7 @@ API.v1.addRoute( throw new Meteor.Error('error-invalid-user-id', 'Invalid user id'); } - void notifyOnUserChange({ clientAction: 'updated', id: this.userId, diff: { 'services.resume.loginTokens': [] } }); + void notifyOnUserChange({ clientAction: 'updated', id: userId, diff: { 'services.resume.loginTokens': [] } }); return API.v1.success({ message: `User ${userId} has been logged out!`, diff --git a/apps/meteor/app/apps/server/bridges/livechat.ts b/apps/meteor/app/apps/server/bridges/livechat.ts index 4e2f8e69acad..4f4794591e02 100644 --- a/apps/meteor/app/apps/server/bridges/livechat.ts +++ b/apps/meteor/app/apps/server/bridges/livechat.ts @@ -1,7 +1,7 @@ -import type { IAppServerOrchestrator, IAppsLivechatMessage } from '@rocket.chat/apps'; +import type { IAppServerOrchestrator, IAppsLivechatMessage, IAppsMessage } from '@rocket.chat/apps'; import type { IExtraRoomParams } from '@rocket.chat/apps-engine/definition/accessors/ILivechatCreator'; 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 { IMessage as IAppsEngineMessage } 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 { ILivechatDepartment, IOmnichannelRoom, SelectedAgent, IMessage, ILivechatVisitor } from '@rocket.chat/core-typings'; @@ -13,6 +13,12 @@ import { deasyncPromise } from '../../../../server/deasync/deasync'; import { type ILivechatMessage, Livechat as LivechatTyped } from '../../../livechat/server/lib/LivechatTyped'; import { settings } from '../../../settings/server'; +declare module '@rocket.chat/apps/dist/converters/IAppMessagesConverter' { + export interface IAppMessagesConverter { + convertMessage(message: IMessage, cacheObj?: object): Promise; + } +} + declare module '@rocket.chat/apps-engine/definition/accessors/ILivechatCreator' { interface IExtraRoomParams { customFields?: Record; @@ -246,7 +252,8 @@ export class AppLivechatBridge extends LivechatBridge { username, name, type, - }; + userType: 'user', + } as const; let userId; let transferredTo; @@ -336,7 +343,7 @@ export class AppLivechatBridge extends LivechatBridge { return Promise.all((await LivechatDepartment.findEnabledWithAgents().toArray()).map(boundConverter)); } - protected async _fetchLivechatRoomMessages(appId: string, roomId: string): Promise> { + protected async _fetchLivechatRoomMessages(appId: string, roomId: string): Promise> { this.orch.debugLog(`The App ${appId} is getting the transcript for livechat room ${roomId}.`); const messageConverter = this.orch.getConverters()?.get('messages'); @@ -345,8 +352,7 @@ export class AppLivechatBridge extends LivechatBridge { } const livechatMessages = await LivechatTyped.getRoomMessages({ rid: roomId }); - - return Promise.all(livechatMessages.map((message) => messageConverter.convertMessage(message) as Promise)); + return Promise.all(await livechatMessages.map((message) => messageConverter.convertMessage(message, livechatMessages)).toArray()); } protected async setCustomFields( diff --git a/apps/meteor/app/apps/server/bridges/rooms.ts b/apps/meteor/app/apps/server/bridges/rooms.ts index 86817c5721e2..344acc74bda4 100644 --- a/apps/meteor/app/apps/server/bridges/rooms.ts +++ b/apps/meteor/app/apps/server/bridges/rooms.ts @@ -1,11 +1,13 @@ import type { IAppServerOrchestrator } from '@rocket.chat/apps'; -import type { IMessage } from '@rocket.chat/apps-engine/definition/messages'; +import type { IMessage, IMessageRaw } 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'; import type { IUser } from '@rocket.chat/apps-engine/definition/users'; +import type { GetMessagesOptions } from '@rocket.chat/apps-engine/server/bridges/RoomBridge'; 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 { ISubscription, IUser as ICoreUser, IRoom as ICoreRoom, IMessage as ICoreMessage } from '@rocket.chat/core-typings'; +import { Subscriptions, Users, Rooms, Messages } from '@rocket.chat/models'; +import type { FindOptions, Sort } from 'mongodb'; import { createDirectMessage } from '../../../../server/methods/createDirectMessage'; import { createDiscussion } from '../../../discussion/server/methods/createDiscussion'; @@ -103,6 +105,38 @@ export class AppRoomBridge extends RoomBridge { return this.orch.getConverters()?.get('users').convertById(room.u._id); } + protected async getMessages(roomId: string, options: GetMessagesOptions, appId: string): Promise { + this.orch.debugLog(`The App ${appId} is getting the messages of the room: "${roomId}" with options:`, options); + + const { limit, skip = 0, sort: _sort } = options; + + const messageConverter = this.orch.getConverters()?.get('messages'); + if (!messageConverter) { + throw new Error('Message converter not found'); + } + + // We support only one field for now + const sort: Sort | undefined = _sort?.createdAt ? { ts: _sort.createdAt } : undefined; + + const messageQueryOptions: FindOptions = { + limit, + skip, + sort, + }; + + const query = { + rid: roomId, + _hidden: { $ne: true }, + t: { $exists: false }, + }; + + const cursor = Messages.find(query, messageQueryOptions); + + const messagePromises: Promise[] = await cursor.map((message) => messageConverter.convertMessageRaw(message)).toArray(); + + return Promise.all(messagePromises); + } + 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, {}); @@ -220,12 +254,4 @@ export class AppRoomBridge extends RoomBridge { const members = await Users.findUsersByUsernames(usernames, { limit: 50 }).toArray(); await Promise.all(members.map((user) => removeUserFromRoom(roomId, user))); } - - protected getMessages( - _roomId: string, - _options: { limit: number; skip?: number; sort?: Record }, - _appId: string, - ): Promise { - throw new Error('Method not implemented.'); - } } diff --git a/apps/meteor/app/apps/server/bridges/videoConferences.ts b/apps/meteor/app/apps/server/bridges/videoConferences.ts index bebcb25a6f51..efab0f201f87 100644 --- a/apps/meteor/app/apps/server/bridges/videoConferences.ts +++ b/apps/meteor/app/apps/server/bridges/videoConferences.ts @@ -59,6 +59,10 @@ export class AppVideoConferenceBridge extends VideoConferenceBridge { if (data.status > oldData.status) { await VideoConf.setStatus(call._id, data.status); } + + if (data.discussionRid !== oldData.discussionRid) { + await VideoConf.assignDiscussionToConference(call._id, data.discussionRid); + } } protected async registerProvider(info: IVideoConfProvider, appId: string): Promise { diff --git a/apps/meteor/app/apps/server/converters/cachedFunction.ts b/apps/meteor/app/apps/server/converters/cachedFunction.ts new file mode 100644 index 000000000000..3310574f0160 --- /dev/null +++ b/apps/meteor/app/apps/server/converters/cachedFunction.ts @@ -0,0 +1,17 @@ +export const cachedFunction = any>(fn: F) => { + const cache = new Map(); + + return ((...args) => { + const cacheKey = JSON.stringify(args); + + if (cache.has(cacheKey)) { + return cache.get(cacheKey) as ReturnType; + } + + const result = fn(...args); + + cache.set(cacheKey, result); + + return result; + }) as F; +}; diff --git a/apps/meteor/app/apps/server/converters/messages.js b/apps/meteor/app/apps/server/converters/messages.js index 187a6519339a..89ef2454d895 100644 --- a/apps/meteor/app/apps/server/converters/messages.js +++ b/apps/meteor/app/apps/server/converters/messages.js @@ -1,9 +1,13 @@ +import { isMessageFromVisitor } from '@rocket.chat/core-typings'; import { Messages, Rooms, Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; +import { cachedFunction } from './cachedFunction'; import { transformMappedData } from './transformMappedData'; export class AppMessagesConverter { + mem = new WeakMap(); + constructor(orch) { this.orch = orch; } @@ -14,11 +18,61 @@ export class AppMessagesConverter { return this.convertMessage(msg); } - async convertMessage(msgObj) { + async convertMessageRaw(msgObj) { + if (!msgObj) { + return undefined; + } + + const { attachments, ...message } = msgObj; + const getAttachments = async () => this._convertAttachmentsToApp(attachments); + + const map = { + id: '_id', + threadId: 'tmid', + reactions: 'reactions', + parseUrls: 'parseUrls', + text: 'msg', + createdAt: 'ts', + updatedAt: '_updatedAt', + editedAt: 'editedAt', + emoji: 'emoji', + avatarUrl: 'avatar', + alias: 'alias', + file: 'file', + customFields: 'customFields', + groupable: 'groupable', + token: 'token', + blocks: 'blocks', + roomId: 'rid', + editor: 'editedBy', + attachments: getAttachments, + sender: 'u', + }; + + return transformMappedData(message, map); + } + + async convertMessage(msgObj, cacheObj = msgObj) { if (!msgObj) { return undefined; } + const cache = + this.mem.get(cacheObj) ?? + new Map([ + ['room', cachedFunction(this.orch.getConverters().get('rooms').convertById.bind(this.orch.getConverters().get('rooms')))], + [ + 'user.convertById', + cachedFunction(this.orch.getConverters().get('users').convertById.bind(this.orch.getConverters().get('users'))), + ], + [ + 'user.convertToApp', + cachedFunction(this.orch.getConverters().get('users').convertToApp.bind(this.orch.getConverters().get('users'))), + ], + ]); + + this.mem.set(cacheObj, cache); + const map = { id: '_id', threadId: 'tmid', @@ -37,7 +91,7 @@ export class AppMessagesConverter { token: 'token', blocks: 'blocks', room: async (message) => { - const result = await this.orch.getConverters().get('rooms').convertById(message.rid); + const result = await cache.get('room')(message.rid); delete message.rid; return result; }, @@ -49,7 +103,7 @@ export class AppMessagesConverter { return undefined; } - return this.orch.getConverters().get('users').convertById(editedBy._id); + return cache.get('user.convertById')(editedBy._id); }, attachments: async (message) => { const result = await this._convertAttachmentsToApp(message.attachments); @@ -61,16 +115,19 @@ export class AppMessagesConverter { return undefined; } - let user = await this.orch.getConverters().get('users').convertById(message.u._id); - - // When the sender of the message is a Guest (livechat) and not a user - if (!user) { - user = this.orch.getConverters().get('users').convertToApp(message.u); - } + // When the message contains token, means the message is from the visitor(omnichannel) + const user = await (isMessageFromVisitor(msgObj) + ? cache.get('user.convertToApp')(message.u) + : cache.get('user.convertById')(message.u._id)); delete message.u; - return user; + /** + * Old System Messages from visitor doesn't have the `token` field, to not return + * `sender` as undefined, so we need to add this fallback here. + */ + + return user || cache.get('user.convertToApp')(message.u); }, }; diff --git a/apps/meteor/app/apps/server/converters/threads.ts b/apps/meteor/app/apps/server/converters/threads.ts index 840f4f1613eb..e31ee094b4d7 100644 --- a/apps/meteor/app/apps/server/converters/threads.ts +++ b/apps/meteor/app/apps/server/converters/threads.ts @@ -5,6 +5,7 @@ import type { IUser } from '@rocket.chat/core-typings'; import { isEditedMessage, type IMessage } from '@rocket.chat/core-typings'; import { Messages } from '@rocket.chat/models'; +import { cachedFunction } from './cachedFunction'; import { transformMappedData } from './transformMappedData'; // eslint-disable-next-line @typescript-eslint/naming-convention @@ -18,24 +19,6 @@ interface Orchestrator { }; } -const cachedFunction = any>(fn: F) => { - const cache = new Map(); - - return ((...args) => { - const cacheKey = JSON.stringify(args); - - if (cache.has(cacheKey)) { - return cache.get(cacheKey) as ReturnType; - } - - const result = fn(...args); - - cache.set(cacheKey, result); - - return result; - }) as F; -}; - export class AppThreadsConverter implements IAppThreadsConverter { constructor( private readonly orch: { diff --git a/apps/meteor/app/assets/server/assets.ts b/apps/meteor/app/assets/server/assets.ts index b9653a2f1b9a..5d627a4b1d29 100644 --- a/apps/meteor/app/assets/server/assets.ts +++ b/apps/meteor/app/assets/server/assets.ts @@ -2,8 +2,8 @@ import crypto from 'crypto'; import type { ServerResponse, IncomingMessage } from 'http'; import type { IRocketChatAssets, IRocketChatAsset, ISetting } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import type { NextHandleFunction } from 'connect'; import sizeOf from 'image-size'; import { Meteor } from 'meteor/meteor'; @@ -406,7 +406,7 @@ Meteor.startup(() => { }, 200); }); -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { refreshClients(): boolean; diff --git a/apps/meteor/app/authorization/server/methods/addPermissionToRole.ts b/apps/meteor/app/authorization/server/methods/addPermissionToRole.ts index 13a114732bd2..9a336478ca3e 100644 --- a/apps/meteor/app/authorization/server/methods/addPermissionToRole.ts +++ b/apps/meteor/app/authorization/server/methods/addPermissionToRole.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Permissions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { notifyOnPermissionChangedById } from '../../../lib/server/lib/notifyListener'; import { CONSTANTS, AuthorizationUtils } from '../../lib'; import { hasPermissionAsync } from '../functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'authorization:addPermissionToRole'(permissionId: string, role: string): void; diff --git a/apps/meteor/app/authorization/server/methods/addUserToRole.ts b/apps/meteor/app/authorization/server/methods/addUserToRole.ts index 02ccc76373f1..81582dd7e9fb 100644 --- a/apps/meteor/app/authorization/server/methods/addUserToRole.ts +++ b/apps/meteor/app/authorization/server/methods/addUserToRole.ts @@ -1,14 +1,14 @@ import { api } from '@rocket.chat/core-services'; import type { IRole, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Roles, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { settings } from '../../../settings/server'; import { hasPermissionAsync } from '../functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'authorization:addUserToRole'(roleId: IRole['_id'], username: IUser['username'], scope: string | undefined): Promise; diff --git a/apps/meteor/app/authorization/server/methods/deleteRole.ts b/apps/meteor/app/authorization/server/methods/deleteRole.ts index 2ff09deadf68..140852e0f1ec 100644 --- a/apps/meteor/app/authorization/server/methods/deleteRole.ts +++ b/apps/meteor/app/authorization/server/methods/deleteRole.ts @@ -1,13 +1,13 @@ import type { IRole } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Roles } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import type { DeleteResult } from 'mongodb'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { hasPermissionAsync } from '../functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'authorization:deleteRole'(roleId: IRole['_id'] | IRole['name']): Promise; diff --git a/apps/meteor/app/authorization/server/methods/removeRoleFromPermission.ts b/apps/meteor/app/authorization/server/methods/removeRoleFromPermission.ts index 91a4df1eddf7..68ca11ef9fb5 100644 --- a/apps/meteor/app/authorization/server/methods/removeRoleFromPermission.ts +++ b/apps/meteor/app/authorization/server/methods/removeRoleFromPermission.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Permissions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { notifyOnPermissionChangedById } from '../../../lib/server/lib/notifyListener'; import { CONSTANTS } from '../../lib'; import { hasPermissionAsync } from '../functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'authorization:removeRoleFromPermission'(permissionId: string, role: string): void; diff --git a/apps/meteor/app/authorization/server/methods/removeUserFromRole.ts b/apps/meteor/app/authorization/server/methods/removeUserFromRole.ts index d5dba40a1e53..56f0c2e307ab 100644 --- a/apps/meteor/app/authorization/server/methods/removeUserFromRole.ts +++ b/apps/meteor/app/authorization/server/methods/removeUserFromRole.ts @@ -1,14 +1,14 @@ import { api } from '@rocket.chat/core-services'; import type { IRole, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Roles, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { settings } from '../../../settings/server'; import { hasPermissionAsync } from '../functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'authorization:removeUserFromRole'(roleId: IRole['_id'], username: IUser['username'], scope?: string): Promise; diff --git a/apps/meteor/app/authorization/server/streamer/permissions/index.ts b/apps/meteor/app/authorization/server/streamer/permissions/index.ts index ff8fd3c93262..e74cf37869fd 100644 --- a/apps/meteor/app/authorization/server/streamer/permissions/index.ts +++ b/apps/meteor/app/authorization/server/streamer/permissions/index.ts @@ -1,11 +1,11 @@ import type { IPermission, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Permissions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check, Match } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { WithId } from 'mongodb'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'permissions/get'( diff --git a/apps/meteor/app/autotranslate/server/autotranslate.ts b/apps/meteor/app/autotranslate/server/autotranslate.ts index 7a9eb8780a2d..f3c6d9e55fdb 100644 --- a/apps/meteor/app/autotranslate/server/autotranslate.ts +++ b/apps/meteor/app/autotranslate/server/autotranslate.ts @@ -15,7 +15,7 @@ import _ from 'underscore'; import { callbacks } from '../../../lib/callbacks'; import { isTruthy } from '../../../lib/isTruthy'; -import { broadcastMessageFromData } from '../../../server/modules/watchers/lib/messages'; +import { notifyOnMessageChange } from '../../lib/server/lib/notifyListener'; import { Markdown } from '../../markdown/server'; import { settings } from '../../settings/server'; @@ -79,7 +79,7 @@ export class TranslationProviderRegistry { return null; } - return provider.translateMessage(message, room, targetLanguage); + return provider.translateMessage(message, { room, targetLanguage }); } static getProviders(): AutoTranslate[] { @@ -290,7 +290,7 @@ export abstract class AutoTranslate { * @param {object} targetLanguage * @returns {object} unmodified message object. */ - async translateMessage(message: IMessage, room: IRoom, targetLanguage?: string): Promise { + async translateMessage(message: IMessage, { room, targetLanguage }: { room: IRoom; targetLanguage?: string }): Promise { let targetLanguages: string[]; if (targetLanguage) { targetLanguages = [targetLanguage]; @@ -332,7 +332,7 @@ export abstract class AutoTranslate { } private notifyTranslatedMessage(messageId: string): void { - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: messageId, }); } diff --git a/apps/meteor/app/autotranslate/server/methods/getProviderUiMetadata.ts b/apps/meteor/app/autotranslate/server/methods/getProviderUiMetadata.ts index 30760e854ed1..1d443c21d210 100644 --- a/apps/meteor/app/autotranslate/server/methods/getProviderUiMetadata.ts +++ b/apps/meteor/app/autotranslate/server/methods/getProviderUiMetadata.ts @@ -1,9 +1,9 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { TranslationProviderRegistry } from '../autotranslate'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'autoTranslate.getProviderUiMetadata'(): Record; diff --git a/apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.ts b/apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.ts index e0118e8d95a4..7b9614da7739 100644 --- a/apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.ts +++ b/apps/meteor/app/autotranslate/server/methods/getSupportedLanguages.ts @@ -1,5 +1,5 @@ import type { ISupportedLanguage } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; @@ -7,7 +7,7 @@ import { TranslationProviderRegistry } from '..'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { settings } from '../../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'autoTranslate.getSupportedLanguages'(targetLanguage: string): ISupportedLanguage[] | undefined; diff --git a/apps/meteor/app/autotranslate/server/methods/saveSettings.ts b/apps/meteor/app/autotranslate/server/methods/saveSettings.ts index e396d78887a9..2f119c948263 100644 --- a/apps/meteor/app/autotranslate/server/methods/saveSettings.ts +++ b/apps/meteor/app/autotranslate/server/methods/saveSettings.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'autoTranslate.saveSettings'(rid: string, field: string, value: string, options: { defaultLanguage: string }): boolean; diff --git a/apps/meteor/app/autotranslate/server/methods/translateMessage.ts b/apps/meteor/app/autotranslate/server/methods/translateMessage.ts index d90cad90ce77..551eba57c005 100644 --- a/apps/meteor/app/autotranslate/server/methods/translateMessage.ts +++ b/apps/meteor/app/autotranslate/server/methods/translateMessage.ts @@ -1,11 +1,11 @@ import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { TranslationProviderRegistry } from '..'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'autoTranslate.translateMessage'(message: IMessage | undefined, targetLanguage: string): Promise; diff --git a/apps/meteor/app/bot-helpers/server/index.ts b/apps/meteor/app/bot-helpers/server/index.ts index 5e19e1652454..6c0984ae483d 100644 --- a/apps/meteor/app/bot-helpers/server/index.ts +++ b/apps/meteor/app/bot-helpers/server/index.ts @@ -1,7 +1,7 @@ import type { IUser } from '@rocket.chat/core-typings'; import { UserStatus } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import type { Filter, FindCursor } from 'mongodb'; @@ -194,7 +194,7 @@ settings.watch('BotHelpers_userFields', (value) => { botHelpers.setupCursors(value); }); -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { botRequest: (prop: keyof BotHelpers, ...params: unknown[]) => Promise; diff --git a/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts b/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts index e17faebea384..44ad253d83ef 100644 --- a/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts +++ b/apps/meteor/app/channel-settings/server/methods/saveRoomSettings.ts @@ -1,8 +1,8 @@ import { Team } from '@rocket.chat/core-services'; import type { IRoom, IRoomWithRetentionPolicy, IUser, MessageTypesValues } from '@rocket.chat/core-typings'; -import { TEAM_TYPE } from '@rocket.chat/core-typings'; +import { TEAM_TYPE, isValidSidepanel } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -49,6 +49,7 @@ type RoomSettings = { favorite: boolean; defaultValue: boolean; }; + sidepanel?: IRoom['sidepanel']; }; type RoomSettingsValidators = { @@ -80,6 +81,24 @@ const validators: RoomSettingsValidators = { }); } }, + async sidepanel({ room, userId, value }) { + if (!room.teamMain) { + throw new Meteor.Error('error-action-not-allowed', 'Invalid room', { + method: 'saveRoomSettings', + }); + } + + if (!(await hasPermissionAsync(userId, 'edit-team', room._id))) { + throw new Meteor.Error('error-action-not-allowed', 'You do not have permission to change sidepanel items', { + method: 'saveRoomSettings', + }); + } + + if (!isValidSidepanel(value)) { + throw new Meteor.Error('error-invalid-sidepanel'); + } + }, + async roomType({ userId, room, value }) { if (value === room.t) { return; @@ -213,6 +232,11 @@ const settingSavers: RoomSettingsSavers = { await saveRoomTopic(rid, value, user); } }, + async sidepanel({ value, rid, room }) { + if (JSON.stringify(value) !== JSON.stringify(room.sidepanel)) { + await Rooms.setSidepanelById(rid, value); + } + }, async roomAnnouncement({ value, room, rid, user }) { if (!value && !room.announcement) { return; @@ -304,7 +328,7 @@ const settingSavers: RoomSettingsSavers = { }, }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { saveRoomSettings(rid: IRoom['_id'], settings: Partial): Promise<{ result: true; rid: IRoom['_id'] }>; @@ -339,6 +363,7 @@ const fields: (keyof RoomSettings)[] = [ 'retentionOverrideGlobal', 'encrypted', 'favorite', + 'sidepanel', ]; const validate = ( diff --git a/apps/meteor/app/cloud/server/methods.ts b/apps/meteor/app/cloud/server/methods.ts index 0e47a8ba8754..29daefe0d58c 100644 --- a/apps/meteor/app/cloud/server/methods.ts +++ b/apps/meteor/app/cloud/server/methods.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -13,7 +13,7 @@ import { startRegisterWorkspace } from './functions/startRegisterWorkspace'; import { syncWorkspace } from './functions/syncWorkspace'; import { userLogout } from './functions/userLogout'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'cloud:checkRegisterStatus': () => { diff --git a/apps/meteor/app/crowd/server/methods.ts b/apps/meteor/app/crowd/server/methods.ts index a621e3c8d027..48faa2fcbcab 100644 --- a/apps/meteor/app/crowd/server/methods.ts +++ b/apps/meteor/app/crowd/server/methods.ts @@ -1,4 +1,5 @@ -import type { ServerMethods, TranslationKey } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; +import type { TranslationKey } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; @@ -6,7 +7,7 @@ import { settings } from '../../settings/server'; import { CROWD } from './crowd'; import { logger } from './logger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { crowd_test_connection(): { message: TranslationKey; params: string[] }; diff --git a/apps/meteor/app/custom-sounds/server/methods/deleteCustomSound.ts b/apps/meteor/app/custom-sounds/server/methods/deleteCustomSound.ts index 5ddf0cc66e52..1c63c7a67d9f 100644 --- a/apps/meteor/app/custom-sounds/server/methods/deleteCustomSound.ts +++ b/apps/meteor/app/custom-sounds/server/methods/deleteCustomSound.ts @@ -1,13 +1,13 @@ import { api } from '@rocket.chat/core-services'; import type { ICustomSound } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { CustomSounds } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { RocketChatFileCustomSoundsInstance } from '../startup/custom-sounds'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteCustomSound(_id: ICustomSound['_id']): Promise; diff --git a/apps/meteor/app/custom-sounds/server/methods/insertOrUpdateSound.ts b/apps/meteor/app/custom-sounds/server/methods/insertOrUpdateSound.ts index 4b48a64dc14c..1b922c6b162e 100644 --- a/apps/meteor/app/custom-sounds/server/methods/insertOrUpdateSound.ts +++ b/apps/meteor/app/custom-sounds/server/methods/insertOrUpdateSound.ts @@ -1,6 +1,6 @@ import { api } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { CustomSounds } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -20,7 +20,7 @@ export type ICustomSoundData = { random?: number; }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { insertOrUpdateSound(soundData: ICustomSoundData): Promise; diff --git a/apps/meteor/app/custom-sounds/server/methods/listCustomSounds.ts b/apps/meteor/app/custom-sounds/server/methods/listCustomSounds.ts index 2c2130fc0d30..eda1325d7733 100644 --- a/apps/meteor/app/custom-sounds/server/methods/listCustomSounds.ts +++ b/apps/meteor/app/custom-sounds/server/methods/listCustomSounds.ts @@ -1,9 +1,9 @@ import type { ICustomSound } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { CustomSounds } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { listCustomSounds(): ICustomSound[]; diff --git a/apps/meteor/app/custom-sounds/server/methods/uploadCustomSound.ts b/apps/meteor/app/custom-sounds/server/methods/uploadCustomSound.ts index eee693634d7d..f955f373ed4d 100644 --- a/apps/meteor/app/custom-sounds/server/methods/uploadCustomSound.ts +++ b/apps/meteor/app/custom-sounds/server/methods/uploadCustomSound.ts @@ -1,6 +1,6 @@ import { api } from '@rocket.chat/core-services'; import type { RequiredField } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; @@ -8,7 +8,7 @@ import { RocketChatFile } from '../../../file/server'; import { RocketChatFileCustomSoundsInstance } from '../startup/custom-sounds'; import type { ICustomSoundData } from './insertOrUpdateSound'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { uploadCustomSound(binaryContent: string, contentType: string, soundData: RequiredField): void; diff --git a/apps/meteor/app/discussion/client/createDiscussionMessageAction.ts b/apps/meteor/app/discussion/client/createDiscussionMessageAction.ts index 3ad61c4c42f0..ecf014248830 100644 --- a/apps/meteor/app/discussion/client/createDiscussionMessageAction.ts +++ b/apps/meteor/app/discussion/client/createDiscussionMessageAction.ts @@ -44,7 +44,7 @@ Meteor.startup(() => { subscription, user, }) { - if (drid || !Number.isNaN(dcount)) { + if (drid || !Number.isNaN(Number(dcount))) { return false; } if (!subscription) { diff --git a/apps/meteor/app/discussion/client/index.ts b/apps/meteor/app/discussion/client/index.ts index 62e11191b493..7c0a6f72e6cc 100644 --- a/apps/meteor/app/discussion/client/index.ts +++ b/apps/meteor/app/discussion/client/index.ts @@ -1,3 +1,2 @@ // Other UI extensions -import './lib/messageTypes/discussionMessage'; import './createDiscussionMessageAction'; diff --git a/apps/meteor/app/discussion/client/lib/messageTypes/discussionMessage.js b/apps/meteor/app/discussion/client/lib/messageTypes/discussionMessage.js deleted file mode 100644 index a7f0ef0a1d97..000000000000 --- a/apps/meteor/app/discussion/client/lib/messageTypes/discussionMessage.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Meteor } from 'meteor/meteor'; - -import { MessageTypes } from '../../../../ui-utils/client'; - -Meteor.startup(() => { - MessageTypes.registerType({ - id: 'discussion-created', - system: false, - message: 'discussion-created', - data(message) { - return { - message: ` ${message.msg}`, - }; - }, - }); -}); diff --git a/apps/meteor/app/discussion/server/hooks/propagateDiscussionMetadata.ts b/apps/meteor/app/discussion/server/hooks/propagateDiscussionMetadata.ts index 0f42f495e962..1ff9ed1dc1ba 100644 --- a/apps/meteor/app/discussion/server/hooks/propagateDiscussionMetadata.ts +++ b/apps/meteor/app/discussion/server/hooks/propagateDiscussionMetadata.ts @@ -1,16 +1,16 @@ import type { IRoom } from '@rocket.chat/core-typings'; -import { Messages, Rooms } from '@rocket.chat/models'; +import { Messages, Rooms, VideoConference } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; -import { broadcastMessageFromData } from '../../../../server/modules/watchers/lib/messages'; import { deleteRoom } from '../../../lib/server/functions/deleteRoom'; +import { notifyOnMessageChange } from '../../../lib/server/lib/notifyListener'; const updateAndNotifyParentRoomWithParentMessage = async (room: IRoom): Promise => { const { value: parentMessage } = await Messages.refreshDiscussionMetadata(room); if (!parentMessage) { return; } - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: parentMessage._id, data: parentMessage, }); @@ -22,7 +22,7 @@ const updateAndNotifyParentRoomWithParentMessage = async (room: IRoom): Promise< */ callbacks.add( 'afterSaveMessage', - async (message, { _id, prid }) => { + async (message, { room: { _id, prid } }) => { if (!prid) { return message; } @@ -108,6 +108,8 @@ callbacks.add( }, }, ); + + await VideoConference.unsetDiscussionRid(drid); return drid; }, callbacks.priority.LOW, diff --git a/apps/meteor/app/discussion/server/methods/createDiscussion.ts b/apps/meteor/app/discussion/server/methods/createDiscussion.ts index 18b42ba1a31f..96e0bd846390 100644 --- a/apps/meteor/app/discussion/server/methods/createDiscussion.ts +++ b/apps/meteor/app/discussion/server/methods/createDiscussion.ts @@ -1,11 +1,10 @@ import { Message } from '@rocket.chat/core-services'; import type { IMessage, IRoom, IUser, MessageAttachmentDefault } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Rooms, Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -import { callbacks } from '../../../../lib/callbacks'; import { i18n } from '../../../../server/lib/i18n'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; import { canSendMessageAsync } from '../../../authorization/server/functions/canSendMessage'; @@ -14,6 +13,7 @@ import { addUserToRoom } from '../../../lib/server/functions/addUserToRoom'; import { attachMessage } from '../../../lib/server/functions/attachMessage'; import { createRoom } from '../../../lib/server/functions/createRoom'; import { sendMessage } from '../../../lib/server/functions/sendMessage'; +import { afterSaveMessageAsync } from '../../../lib/server/lib/afterSaveMessage'; import { settings } from '../../../settings/server'; const getParentRoom = async (rid: IRoom['_id']) => { @@ -27,13 +27,11 @@ async function createDiscussionMessage( drid: IRoom['_id'], msg: IMessage['msg'], messageEmbedded?: MessageAttachmentDefault, -): Promise { - const msgId = await Message.saveSystemMessage('discussion-created', rid, msg, user, { +): Promise { + return Message.saveSystemMessage('discussion-created', rid, msg, user, { drid, ...(messageEmbedded && { attachments: [messageEmbedded] }), }); - - return Messages.findOneById(msgId); } async function mentionMessage( @@ -191,12 +189,13 @@ const create = async ({ } if (discussionMsg) { - callbacks.runAsync('afterSaveMessage', discussionMsg, parentRoom); + afterSaveMessageAsync(discussionMsg, parentRoom); } + return discussion; }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { createDiscussion: typeof create; diff --git a/apps/meteor/app/e2e/client/rocketchat.e2e.ts b/apps/meteor/app/e2e/client/rocketchat.e2e.ts index 0cc344ff5152..bbd6f208f35a 100644 --- a/apps/meteor/app/e2e/client/rocketchat.e2e.ts +++ b/apps/meteor/app/e2e/client/rocketchat.e2e.ts @@ -257,7 +257,7 @@ class E2E extends Emitter { return null; } - if (room.encrypted !== true && !room.e2eKeyId) { + if (!room.encrypted) { return null; } @@ -272,7 +272,7 @@ class E2E extends Emitter { delete this.instancesByRoomId[rid]; } - async persistKeys( + private async persistKeys( { public_key, private_key }: KeyPair, password: string, { force }: { force: boolean } = { force: false }, diff --git a/apps/meteor/app/e2e/server/methods/fetchMyKeys.ts b/apps/meteor/app/e2e/server/methods/fetchMyKeys.ts index 519317cb40fe..df1150cee846 100644 --- a/apps/meteor/app/e2e/server/methods/fetchMyKeys.ts +++ b/apps/meteor/app/e2e/server/methods/fetchMyKeys.ts @@ -1,8 +1,8 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'e2e.fetchMyKeys'(): { public_key?: string; private_key?: string }; diff --git a/apps/meteor/app/e2e/server/methods/getUsersOfRoomWithoutKey.ts b/apps/meteor/app/e2e/server/methods/getUsersOfRoomWithoutKey.ts index cc586676482f..1f1a21262de8 100644 --- a/apps/meteor/app/e2e/server/methods/getUsersOfRoomWithoutKey.ts +++ b/apps/meteor/app/e2e/server/methods/getUsersOfRoomWithoutKey.ts @@ -1,12 +1,12 @@ import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomIdAsync } from '../../../authorization/server/functions/canAccessRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'e2e.getUsersOfRoomWithoutKey'(rid: IRoom['_id']): { users: Pick[] }; diff --git a/apps/meteor/app/e2e/server/methods/requestSubscriptionKeys.ts b/apps/meteor/app/e2e/server/methods/requestSubscriptionKeys.ts index 8c5add77a0bf..cf899a5d64ad 100644 --- a/apps/meteor/app/e2e/server/methods/requestSubscriptionKeys.ts +++ b/apps/meteor/app/e2e/server/methods/requestSubscriptionKeys.ts @@ -1,9 +1,9 @@ import { api } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'e2e.requestSubscriptionKeys'(): boolean; diff --git a/apps/meteor/app/e2e/server/methods/resetOwnE2EKey.ts b/apps/meteor/app/e2e/server/methods/resetOwnE2EKey.ts index 365feb1ac95d..b1d40e48bb5e 100644 --- a/apps/meteor/app/e2e/server/methods/resetOwnE2EKey.ts +++ b/apps/meteor/app/e2e/server/methods/resetOwnE2EKey.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { resetUserE2EEncriptionKey } from '../../../../server/lib/resetUserE2EKey'; import { twoFactorRequired } from '../../../2fa/server/twoFactorRequired'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'e2e.resetOwnE2EKey'(): Promise; diff --git a/apps/meteor/app/e2e/server/methods/setRoomKeyID.ts b/apps/meteor/app/e2e/server/methods/setRoomKeyID.ts index 6b0e685616b5..b52913e4f984 100644 --- a/apps/meteor/app/e2e/server/methods/setRoomKeyID.ts +++ b/apps/meteor/app/e2e/server/methods/setRoomKeyID.ts @@ -1,13 +1,13 @@ import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomIdAsync } from '../../../authorization/server/functions/canAccessRoom'; import { notifyOnRoomChangedById } from '../../../lib/server/lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'e2e.setRoomKeyID'(rid: IRoom['_id'], keyID: string): void; diff --git a/apps/meteor/app/e2e/server/methods/setUserPublicAndPrivateKeys.ts b/apps/meteor/app/e2e/server/methods/setUserPublicAndPrivateKeys.ts index 94d252601bc4..6ef35a063a28 100644 --- a/apps/meteor/app/e2e/server/methods/setUserPublicAndPrivateKeys.ts +++ b/apps/meteor/app/e2e/server/methods/setUserPublicAndPrivateKeys.ts @@ -1,8 +1,8 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'e2e.setUserPublicAndPrivateKeys'({ public_key, private_key }: { public_key: string; private_key: string; force?: boolean }): void; diff --git a/apps/meteor/app/e2e/server/methods/updateGroupKey.ts b/apps/meteor/app/e2e/server/methods/updateGroupKey.ts index c856f8cf708a..5764a021f54c 100644 --- a/apps/meteor/app/e2e/server/methods/updateGroupKey.ts +++ b/apps/meteor/app/e2e/server/methods/updateGroupKey.ts @@ -1,10 +1,10 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'e2e.updateGroupKey'(rid: string, uid: string, key: string): Promise; diff --git a/apps/meteor/app/emoji-custom/server/lib/insertOrUpdateEmoji.ts b/apps/meteor/app/emoji-custom/server/lib/insertOrUpdateEmoji.ts new file mode 100644 index 000000000000..7e838baee9b0 --- /dev/null +++ b/apps/meteor/app/emoji-custom/server/lib/insertOrUpdateEmoji.ts @@ -0,0 +1,148 @@ +import { api } from '@rocket.chat/core-services'; +import { EmojiCustom } from '@rocket.chat/models'; +import limax from 'limax'; +import { Meteor } from 'meteor/meteor'; +import _ from 'underscore'; + +import { trim } from '../../../../lib/utils/stringUtils'; +import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; +import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom'; + +type EmojiData = { + _id?: string; + name: string; + aliases: string; + extension: string; + previousName?: string; + previousExtension?: string; + newFile?: boolean; +}; + +type EmojiDataWithParsedAliases = Omit & { _id: string; aliases: string[] }; + +export async function insertOrUpdateEmoji(userId: string | null, emojiData: EmojiData): Promise { + if (!userId || !(await hasPermissionAsync(userId, 'manage-emoji'))) { + throw new Meteor.Error('not_authorized'); + } + + if (!trim(emojiData.name)) { + throw new Meteor.Error('error-the-field-is-required', 'The field Name is required', { + method: 'insertOrUpdateEmoji', + field: 'Name', + }); + } + + emojiData.name = limax(emojiData.name, { replacement: '_' }); + emojiData.aliases = limax(emojiData.aliases, { replacement: '_' }); + + // allow all characters except colon, whitespace, comma, >, <, &, ", ', /, \, (, ) + // more practical than allowing specific sets of characters; also allows foreign languages + const nameValidation = /[\s,:><&"'\/\\\(\)]/; + const aliasValidation = /[:><&\|"'\/\\\(\)]/; + + // silently strip colon; this allows for uploading :emojiname: as emojiname + emojiData.name = emojiData.name.replace(/:/g, ''); + emojiData.aliases = emojiData.aliases.replace(/:/g, ''); + + if (nameValidation.test(emojiData.name)) { + throw new Meteor.Error('error-input-is-not-a-valid-field', `${emojiData.name} is not a valid name`, { + method: 'insertOrUpdateEmoji', + input: emojiData.name, + field: 'Name', + }); + } + + let aliases: string[] = []; + if (emojiData.aliases) { + if (aliasValidation.test(emojiData.aliases)) { + throw new Meteor.Error('error-input-is-not-a-valid-field', `${emojiData.aliases} is not a valid alias set`, { + method: 'insertOrUpdateEmoji', + input: emojiData.aliases, + field: 'Alias_Set', + }); + } + aliases = _.without(emojiData.aliases.split(/[\s,]/).filter(Boolean), emojiData.name); + } + + emojiData.extension = emojiData.extension === 'svg+xml' ? 'png' : emojiData.extension; + + let matchingResults = []; + + if (emojiData._id) { + matchingResults = await EmojiCustom.findByNameOrAliasExceptID(emojiData.name, emojiData._id).toArray(); + for await (const alias of aliases) { + matchingResults = matchingResults.concat(await EmojiCustom.findByNameOrAliasExceptID(alias, emojiData._id).toArray()); + } + } else { + matchingResults = await EmojiCustom.findByNameOrAlias(emojiData.name).toArray(); + for await (const alias of aliases) { + matchingResults = matchingResults.concat(await EmojiCustom.findByNameOrAlias(alias).toArray()); + } + } + + if (matchingResults.length > 0) { + throw new Meteor.Error('Custom_Emoji_Error_Name_Or_Alias_Already_In_Use', 'The custom emoji or one of its aliases is already in use', { + method: 'insertOrUpdateEmoji', + }); + } + + if (typeof emojiData.extension === 'undefined') { + throw new Meteor.Error('error-the-field-is-required', 'The custom emoji file is required', { + method: 'insertOrUpdateEmoji', + }); + } + + if (!emojiData._id) { + // insert emoji + const createEmoji = { + name: emojiData.name, + aliases, + extension: emojiData.extension, + }; + + const _id = (await EmojiCustom.create(createEmoji)).insertedId; + + void api.broadcast('emoji.updateCustom', createEmoji); + + return { ...emojiData, ...createEmoji, _id }; + } + + // update emoji + if (emojiData.newFile) { + await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`)); + await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.previousExtension}`)); + await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.previousName}.${emojiData.extension}`)); + await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`)); + + await EmojiCustom.setExtension(emojiData._id, emojiData.extension); + } else if (emojiData.name !== emojiData.previousName) { + const rs = await RocketChatFileEmojiCustomInstance.getFileWithReadStream( + encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`), + ); + if (rs !== null) { + await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`)); + const ws = RocketChatFileEmojiCustomInstance.createWriteStream( + encodeURIComponent(`${emojiData.name}.${emojiData.previousExtension}`), + rs.contentType, + ); + ws.on('end', () => + RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`)), + ); + rs.readStream.pipe(ws); + } + } + + if (emojiData.name !== emojiData.previousName) { + await EmojiCustom.setName(emojiData._id, emojiData.name); + } + + if (emojiData.aliases) { + await EmojiCustom.setAliases(emojiData._id, aliases); + } else { + await EmojiCustom.setAliases(emojiData._id, []); + } + + void api.broadcast('emoji.updateCustom', { ...emojiData, aliases }); + + return { ...emojiData, aliases } as EmojiDataWithParsedAliases; +} diff --git a/apps/meteor/app/emoji-custom/server/lib/uploadEmojiCustom.ts b/apps/meteor/app/emoji-custom/server/lib/uploadEmojiCustom.ts new file mode 100644 index 000000000000..07633eaa1a7d --- /dev/null +++ b/apps/meteor/app/emoji-custom/server/lib/uploadEmojiCustom.ts @@ -0,0 +1,77 @@ +import { api, Media } from '@rocket.chat/core-services'; +import limax from 'limax'; +import { Meteor } from 'meteor/meteor'; +import sharp from 'sharp'; + +import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; +import { RocketChatFile } from '../../../file/server'; +import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom'; + +const getFile = async (file: Buffer, extension: string) => { + if (extension !== 'svg+xml') { + return file; + } + + return sharp(file).png().toBuffer(); +}; + +type EmojiData = { + _id?: string; + name: string; + aliases?: string | string[]; + extension: string; + previousName?: string; + previousExtension?: string; + newFile?: boolean; +}; + +export async function uploadEmojiCustom(userId: string | null, binaryContent: string, contentType: string, emojiData: EmojiData) { + return uploadEmojiCustomWithBuffer(userId, Buffer.from(binaryContent, 'binary'), contentType, emojiData); +} + +export async function uploadEmojiCustomWithBuffer( + userId: string | null, + buffer: Buffer, + contentType: string, + emojiData: EmojiData, +): Promise { + // technically, since this method doesnt have any datatype validations, users can + // upload videos as emojis. The FE won't play them, but they will waste space for sure. + if (!userId || !(await hasPermissionAsync(userId, 'manage-emoji'))) { + throw new Meteor.Error('not_authorized'); + } + + emojiData.name = limax(emojiData.name, { replacement: '_' }); + // delete aliases for notification purposes. here, it is a string rather than an array + delete emojiData.aliases; + + const file = await getFile(buffer, emojiData.extension); + emojiData.extension = emojiData.extension === 'svg+xml' ? 'png' : emojiData.extension; + + let fileBuffer; + // sharp doesn't support these formats without imagemagick or libvips installed + // so they will be stored as they are :( + if (['gif', 'x-icon', 'bmp', 'webm'].includes(emojiData.extension)) { + fileBuffer = file; + } else { + // This is to support the idea of having "sticker-like" emojis + const { data: resizedEmojiBuffer } = await Media.resizeFromBuffer(file, 512, 512, true, false, false, 'inside'); + fileBuffer = resizedEmojiBuffer; + } + + const rs = RocketChatFile.bufferToStream(fileBuffer); + await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`)); + + return new Promise((resolve) => { + const ws = RocketChatFileEmojiCustomInstance.createWriteStream( + encodeURIComponent(`${emojiData.name}.${emojiData.extension}`), + contentType, + ); + ws.on('end', () => { + setTimeout(() => api.broadcast('emoji.updateCustom', emojiData), 500); + resolve(); + }); + + rs.pipe(ws); + }); +} diff --git a/apps/meteor/app/emoji-custom/server/methods/deleteEmojiCustom.ts b/apps/meteor/app/emoji-custom/server/methods/deleteEmojiCustom.ts index 555d5544ab33..c16d3b82449b 100644 --- a/apps/meteor/app/emoji-custom/server/methods/deleteEmojiCustom.ts +++ b/apps/meteor/app/emoji-custom/server/methods/deleteEmojiCustom.ts @@ -1,13 +1,13 @@ import { api } from '@rocket.chat/core-services'; import type { ICustomEmojiDescriptor } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { EmojiCustom } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteEmojiCustom(emojiID: ICustomEmojiDescriptor['_id']): boolean; diff --git a/apps/meteor/app/emoji-custom/server/methods/insertOrUpdateEmoji.ts b/apps/meteor/app/emoji-custom/server/methods/insertOrUpdateEmoji.ts index 874180097cb9..1891d1b3ed95 100644 --- a/apps/meteor/app/emoji-custom/server/methods/insertOrUpdateEmoji.ts +++ b/apps/meteor/app/emoji-custom/server/methods/insertOrUpdateEmoji.ts @@ -1,15 +1,9 @@ -import { api } from '@rocket.chat/core-services'; -import { EmojiCustom } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; -import limax from 'limax'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -import _ from 'underscore'; -import { trim } from '../../../../lib/utils/stringUtils'; -import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom'; +import { insertOrUpdateEmoji } from '../lib/insertOrUpdateEmoji'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { insertOrUpdateEmoji(emojiData: { @@ -26,130 +20,12 @@ declare module '@rocket.chat/ui-contexts' { Meteor.methods({ async insertOrUpdateEmoji(emojiData) { - if (!this.userId || !(await hasPermissionAsync(this.userId, 'manage-emoji'))) { - throw new Meteor.Error('not_authorized'); - } - - if (!trim(emojiData.name)) { - throw new Meteor.Error('error-the-field-is-required', 'The field Name is required', { - method: 'insertOrUpdateEmoji', - field: 'Name', - }); - } - - emojiData.name = limax(emojiData.name, { replacement: '_' }); - emojiData.aliases = limax(emojiData.aliases, { replacement: '_' }); - - // allow all characters except colon, whitespace, comma, >, <, &, ", ', /, \, (, ) - // more practical than allowing specific sets of characters; also allows foreign languages - const nameValidation = /[\s,:><&"'\/\\\(\)]/; - const aliasValidation = /[:><&\|"'\/\\\(\)]/; - - // silently strip colon; this allows for uploading :emojiname: as emojiname - emojiData.name = emojiData.name.replace(/:/g, ''); - emojiData.aliases = emojiData.aliases.replace(/:/g, ''); - - if (nameValidation.test(emojiData.name)) { - throw new Meteor.Error('error-input-is-not-a-valid-field', `${emojiData.name} is not a valid name`, { - method: 'insertOrUpdateEmoji', - input: emojiData.name, - field: 'Name', - }); - } - - let aliases: string[] = []; - if (emojiData.aliases) { - if (aliasValidation.test(emojiData.aliases)) { - throw new Meteor.Error('error-input-is-not-a-valid-field', `${emojiData.aliases} is not a valid alias set`, { - method: 'insertOrUpdateEmoji', - input: emojiData.aliases, - field: 'Alias_Set', - }); - } - aliases = _.without(emojiData.aliases.split(/[\s,]/).filter(Boolean), emojiData.name); - } - - emojiData.extension = emojiData.extension === 'svg+xml' ? 'png' : emojiData.extension; - - let matchingResults = []; - - if (emojiData._id) { - matchingResults = await EmojiCustom.findByNameOrAliasExceptID(emojiData.name, emojiData._id).toArray(); - for await (const alias of aliases) { - matchingResults = matchingResults.concat(await EmojiCustom.findByNameOrAliasExceptID(alias, emojiData._id).toArray()); - } - } else { - matchingResults = await EmojiCustom.findByNameOrAlias(emojiData.name).toArray(); - for await (const alias of aliases) { - matchingResults = matchingResults.concat(await EmojiCustom.findByNameOrAlias(alias).toArray()); - } - } - - if (matchingResults.length > 0) { - throw new Meteor.Error( - 'Custom_Emoji_Error_Name_Or_Alias_Already_In_Use', - 'The custom emoji or one of its aliases is already in use', - { method: 'insertOrUpdateEmoji' }, - ); - } - - if (typeof emojiData.extension === 'undefined') { - throw new Meteor.Error('error-the-field-is-required', 'The custom emoji file is required', { - method: 'insertOrUpdateEmoji', - }); - } + const emoji = await insertOrUpdateEmoji(this.userId, emojiData); if (!emojiData._id) { - // insert emoji - const createEmoji = { - name: emojiData.name, - aliases, - extension: emojiData.extension, - }; - - const _id = (await EmojiCustom.create(createEmoji)).insertedId; - - void api.broadcast('emoji.updateCustom', createEmoji); - - return _id; + return emoji._id; } - // update emoji - if (emojiData.newFile) { - await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`)); - await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.previousExtension}`)); - await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.previousName}.${emojiData.extension}`)); - await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`)); - - await EmojiCustom.setExtension(emojiData._id, emojiData.extension); - } else if (emojiData.name !== emojiData.previousName) { - const rs = await RocketChatFileEmojiCustomInstance.getFileWithReadStream( - encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`), - ); - if (rs !== null) { - await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`)); - const ws = RocketChatFileEmojiCustomInstance.createWriteStream( - encodeURIComponent(`${emojiData.name}.${emojiData.previousExtension}`), - rs.contentType, - ); - ws.on('end', () => - RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`)), - ); - rs.readStream.pipe(ws); - } - } - - if (emojiData.name !== emojiData.previousName) { - await EmojiCustom.setName(emojiData._id, emojiData.name); - } - - if (emojiData.aliases) { - await EmojiCustom.setAliases(emojiData._id, aliases); - } else { - await EmojiCustom.setAliases(emojiData._id, []); - } - - void api.broadcast('emoji.updateCustom', emojiData); - return true; + return !!emoji; }, }); diff --git a/apps/meteor/app/emoji-custom/server/methods/listEmojiCustom.ts b/apps/meteor/app/emoji-custom/server/methods/listEmojiCustom.ts index 485737b95f9b..a16d536d92d4 100644 --- a/apps/meteor/app/emoji-custom/server/methods/listEmojiCustom.ts +++ b/apps/meteor/app/emoji-custom/server/methods/listEmojiCustom.ts @@ -1,12 +1,12 @@ import type { IEmojiCustom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { EmojiCustom } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check, Match } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { listEmojiCustom(options?: { name?: string; aliases?: string[] }): IEmojiCustom[]; diff --git a/apps/meteor/app/emoji-custom/server/methods/uploadEmojiCustom.ts b/apps/meteor/app/emoji-custom/server/methods/uploadEmojiCustom.ts index ded98b7f5469..e387888b1311 100644 --- a/apps/meteor/app/emoji-custom/server/methods/uploadEmojiCustom.ts +++ b/apps/meteor/app/emoji-custom/server/methods/uploadEmojiCustom.ts @@ -1,22 +1,9 @@ -import { api, Media } from '@rocket.chat/core-services'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; -import limax from 'limax'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -import sharp from 'sharp'; -import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -import { RocketChatFile } from '../../../file/server'; -import { RocketChatFileEmojiCustomInstance } from '../startup/emoji-custom'; +import { uploadEmojiCustom } from '../lib/uploadEmojiCustom'; -const getFile = async (file: Buffer, extension: string) => { - if (extension !== 'svg+xml') { - return file; - } - - return sharp(file).png().toBuffer(); -}; - -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { uploadEmojiCustom( @@ -33,44 +20,6 @@ declare module '@rocket.chat/ui-contexts' { Meteor.methods({ async uploadEmojiCustom(binaryContent, contentType, emojiData) { - // technically, since this method doesnt have any datatype validations, users can - // upload videos as emojis. The FE won't play them, but they will waste space for sure. - if (!this.userId || !(await hasPermissionAsync(this.userId, 'manage-emoji'))) { - throw new Meteor.Error('not_authorized'); - } - - emojiData.name = limax(emojiData.name, { replacement: '_' }); - // delete aliases for notification purposes. here, it is a string rather than an array - delete emojiData.aliases; - - const file = await getFile(Buffer.from(binaryContent, 'binary'), emojiData.extension); - emojiData.extension = emojiData.extension === 'svg+xml' ? 'png' : emojiData.extension; - - let fileBuffer; - // sharp doesn't support these formats without imagemagick or libvips installed - // so they will be stored as they are :( - if (['gif', 'x-icon', 'bmp', 'webm'].includes(emojiData.extension)) { - fileBuffer = file; - } else { - // This is to support the idea of having "sticker-like" emojis - const { data: resizedEmojiBuffer } = await Media.resizeFromBuffer(file, 512, 512, true, false, false, 'inside'); - fileBuffer = resizedEmojiBuffer; - } - - const rs = RocketChatFile.bufferToStream(fileBuffer); - await RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`)); - - return new Promise((resolve) => { - const ws = RocketChatFileEmojiCustomInstance.createWriteStream( - encodeURIComponent(`${emojiData.name}.${emojiData.extension}`), - contentType, - ); - ws.on('end', () => { - setTimeout(() => api.broadcast('emoji.updateCustom', emojiData), 500); - resolve(); - }); - - rs.pipe(ws); - }); + await uploadEmojiCustom(this.userId, binaryContent, contentType, emojiData); }, }); diff --git a/apps/meteor/app/federation/server/endpoints/dispatch.js b/apps/meteor/app/federation/server/endpoints/dispatch.js index 4cab0b0c41e8..7090f053a22b 100644 --- a/apps/meteor/app/federation/server/endpoints/dispatch.js +++ b/apps/meteor/app/federation/server/endpoints/dispatch.js @@ -3,11 +3,10 @@ import { eventTypes } from '@rocket.chat/core-typings'; import { FederationServers, FederationRoomEvents, Rooms, Messages, Subscriptions, Users, ReadReceipts } from '@rocket.chat/models'; import EJSON from 'ejson'; -import { broadcastMessageFromData } from '../../../../server/modules/watchers/lib/messages'; import { API } from '../../../api/server'; import { FileUpload } from '../../../file-upload/server'; import { deleteRoom } from '../../../lib/server/functions/deleteRoom'; -import { notifyOnRoomChanged, notifyOnRoomChangedById } from '../../../lib/server/lib/notifyListener'; +import { notifyOnMessageChange, notifyOnRoomChanged, notifyOnRoomChangedById } from '../../../lib/server/lib/notifyListener'; import { notifyUsersOnMessage } from '../../../lib/server/lib/notifyUsersOnMessage'; import { sendAllNotifications } from '../../../lib/server/lib/sendNotificationsOnMessage'; import { processThreads } from '../../../threads/server/hooks/aftersavemessage'; @@ -294,8 +293,12 @@ const eventHandlers = { await processThreads(denormalizedMessage, room); - // Notify users - await notifyUsersOnMessage(denormalizedMessage, room); + const roomUpdater = Rooms.getUpdater(); + await notifyUsersOnMessage(denormalizedMessage, room, roomUpdater); + if (roomUpdater.hasChanges()) { + await Rooms.updateFromUpdater({ _id: room._id }, roomUpdater); + } + sendAllNotifications(denormalizedMessage, room); messageForNotification = denormalizedMessage; } catch (err) { @@ -303,7 +306,7 @@ const eventHandlers = { } } if (messageForNotification) { - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: messageForNotification._id, data: messageForNotification, }); @@ -334,7 +337,7 @@ const eventHandlers = { } else { // Update the message await Messages.updateOne({ _id: persistedMessage._id }, { $set: { msg: message.msg, federation: message.federation } }); - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: persistedMessage._id, data: { ...persistedMessage, @@ -404,7 +407,7 @@ const eventHandlers = { // Update the property await Messages.updateOne({ _id: messageId }, { $set: { [`reactions.${reaction}`]: reactionObj } }); - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: persistedMessage._id, data: { ...persistedMessage, @@ -462,7 +465,7 @@ const eventHandlers = { // Otherwise, update the property await Messages.updateOne({ _id: messageId }, { $set: { [`reactions.${reaction}`]: reactionObj } }); } - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: persistedMessage._id, data: { ...persistedMessage, diff --git a/apps/meteor/app/federation/server/hooks/afterSaveMessage.js b/apps/meteor/app/federation/server/hooks/afterSaveMessage.js index 7f67f4770686..20c64f87dda8 100644 --- a/apps/meteor/app/federation/server/hooks/afterSaveMessage.js +++ b/apps/meteor/app/federation/server/hooks/afterSaveMessage.js @@ -6,7 +6,7 @@ import { getFederationDomain } from '../lib/getFederationDomain'; import { clientLogger } from '../lib/logger'; import { normalizers } from '../normalizers'; -async function afterSaveMessage(message, room) { +async function afterSaveMessage(message, { room }) { // If there are not federated users on this room, ignore it if (!hasExternalDomain(room)) { return message; diff --git a/apps/meteor/app/federation/server/methods/dashboard.ts b/apps/meteor/app/federation/server/methods/dashboard.ts index 90a050556893..eacb42b24cbb 100644 --- a/apps/meteor/app/federation/server/methods/dashboard.ts +++ b/apps/meteor/app/federation/server/methods/dashboard.ts @@ -1,10 +1,10 @@ import type { IFederationServer } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { federationGetServers, federationGetOverviewData } from '../functions/dashboard'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'federation:getServers': () => { data: IFederationServer[] }; diff --git a/apps/meteor/app/federation/server/methods/loadContextEvents.ts b/apps/meteor/app/federation/server/methods/loadContextEvents.ts index 9e286bbf913a..e20acb7e37c9 100644 --- a/apps/meteor/app/federation/server/methods/loadContextEvents.ts +++ b/apps/meteor/app/federation/server/methods/loadContextEvents.ts @@ -1,11 +1,11 @@ import type { IFederationEvent } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { FederationRoomEvents } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'federation:loadContextEvents'(latestEventTimestamp: number): IFederationEvent[]; diff --git a/apps/meteor/app/federation/server/methods/testSetup.ts b/apps/meteor/app/federation/server/methods/testSetup.ts index 93e501535474..bc50ef158194 100644 --- a/apps/meteor/app/federation/server/methods/testSetup.ts +++ b/apps/meteor/app/federation/server/methods/testSetup.ts @@ -1,11 +1,11 @@ import { eventTypes } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { dispatchEvent } from '../handler'; import { getFederationDomain } from '../lib/getFederationDomain'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { FEDERATION_Test_Setup(): { message: string }; diff --git a/apps/meteor/app/file-upload/server/methods/getS3FileUrl.ts b/apps/meteor/app/file-upload/server/methods/getS3FileUrl.ts index fdb8d131916d..3e9bcd192674 100644 --- a/apps/meteor/app/file-upload/server/methods/getS3FileUrl.ts +++ b/apps/meteor/app/file-upload/server/methods/getS3FileUrl.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Uploads } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -7,7 +7,7 @@ import { UploadFS } from '../../../../server/ufs'; import { canAccessRoomAsync } from '../../../authorization/server'; import { settings } from '../../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getS3FileUrl(fileId: string): string; diff --git a/apps/meteor/app/file-upload/server/methods/sendFileMessage.ts b/apps/meteor/app/file-upload/server/methods/sendFileMessage.ts index 485528a5e62f..73dfd0216a73 100644 --- a/apps/meteor/app/file-upload/server/methods/sendFileMessage.ts +++ b/apps/meteor/app/file-upload/server/methods/sendFileMessage.ts @@ -7,8 +7,8 @@ import type { FilesAndAttachments, IMessage, } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Uploads, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -141,7 +141,7 @@ export const parseFileIntoMessageAttachments = async ( return { files, attachments }; }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { sendFileMessage: (roomId: string, _store: string, file: Partial, msgData?: Record) => boolean; diff --git a/apps/meteor/app/iframe-login/server/iframe_server.ts b/apps/meteor/app/iframe-login/server/iframe_server.ts index c7e67edf9deb..b3e661cf6ff3 100644 --- a/apps/meteor/app/iframe-login/server/iframe_server.ts +++ b/apps/meteor/app/iframe-login/server/iframe_server.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Accounts } from 'meteor/accounts-base'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -23,7 +23,7 @@ Accounts.registerLoginHandler('iframe', async (result) => { } }); -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'OAuth.retrieveCredential'(credentialToken: string, credentialSecret: string): unknown; diff --git a/apps/meteor/app/importer/server/methods/downloadPublicImportFile.ts b/apps/meteor/app/importer/server/methods/downloadPublicImportFile.ts index 81e06ec8eb0f..d2da85c7cfd4 100644 --- a/apps/meteor/app/importer/server/methods/downloadPublicImportFile.ts +++ b/apps/meteor/app/importer/server/methods/downloadPublicImportFile.ts @@ -4,7 +4,7 @@ import https from 'https'; import { Import } from '@rocket.chat/core-services'; import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { Importers } from '..'; @@ -75,7 +75,7 @@ export const executeDownloadPublicImportFile = async (userId: IUser['_id'], file } }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { downloadPublicImportFile(fileUrl: string, importerKey: string): void; diff --git a/apps/meteor/app/importer/server/methods/getImportFileData.ts b/apps/meteor/app/importer/server/methods/getImportFileData.ts index 03f9a53abe6c..1d36f7fc5a5e 100644 --- a/apps/meteor/app/importer/server/methods/getImportFileData.ts +++ b/apps/meteor/app/importer/server/methods/getImportFileData.ts @@ -2,8 +2,8 @@ import fs from 'fs'; import path from 'path'; import type { IImportProgress, IImporterSelection } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Imports } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { Importers } from '..'; @@ -61,7 +61,7 @@ export const executeGetImportFileData = async (): Promise => { return instance.getProgress(); }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getImportProgress(): IImportProgress; diff --git a/apps/meteor/app/importer/server/methods/getLatestImportOperations.ts b/apps/meteor/app/importer/server/methods/getLatestImportOperations.ts index edf021a19eac..0471cb57955d 100644 --- a/apps/meteor/app/importer/server/methods/getLatestImportOperations.ts +++ b/apps/meteor/app/importer/server/methods/getLatestImportOperations.ts @@ -1,6 +1,6 @@ import type { IImport } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Imports } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; @@ -17,7 +17,7 @@ export const executeGetLatestImportOperations = async () => { return data.toArray(); }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getLatestImportOperations(): IImport[]; diff --git a/apps/meteor/app/importer/server/methods/startImport.ts b/apps/meteor/app/importer/server/methods/startImport.ts index af91295ede29..bbb5ce76ad1c 100644 --- a/apps/meteor/app/importer/server/methods/startImport.ts +++ b/apps/meteor/app/importer/server/methods/startImport.ts @@ -1,7 +1,7 @@ import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Imports } from '@rocket.chat/models'; import type { StartImportParamsPOST } from '@rocket.chat/rest-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { Importers, Selection, SelectionChannel, SelectionUser } from '..'; @@ -32,7 +32,7 @@ export const executeStartImport = async ({ input }: StartImportParamsPOST, start await instance.startImport(selection, startedByUserId); }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { startImport(params: StartImportParamsPOST): void; diff --git a/apps/meteor/app/importer/server/methods/uploadImportFile.ts b/apps/meteor/app/importer/server/methods/uploadImportFile.ts index d6ded455793b..df5d2af883fa 100644 --- a/apps/meteor/app/importer/server/methods/uploadImportFile.ts +++ b/apps/meteor/app/importer/server/methods/uploadImportFile.ts @@ -1,6 +1,6 @@ import { Import } from '@rocket.chat/core-services'; import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { Importers } from '..'; @@ -55,7 +55,7 @@ export const executeUploadImportFile = async ( await instance.updateProgress(ProgressStep.FILE_LOADED); }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { uploadImportFile(binaryContent: string, contentType: string, fileName: string, importerKey: string): void; diff --git a/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts b/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts index 5b8f13ef1a3a..a30bb9b5ee9a 100644 --- a/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts +++ b/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Integrations, IntegrationHistory } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import notifications from '../../../notifications/server/lib/Notifications'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { clearIntegrationHistory(integrationId: string): Promise; diff --git a/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts b/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts index db058bec960b..8f1f1b5dd576 100644 --- a/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/incoming/addIncomingIntegration.ts @@ -1,7 +1,7 @@ import type { INewIncomingIntegration, IIncomingIntegration } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Integrations, Roles, Subscriptions, Users, Rooms } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Babel } from 'meteor/babel-compiler'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -13,7 +13,7 @@ import { validateScriptEngine, isScriptEngineFrozen } from '../../lib/validateSc const validChannelChars = ['@', '#']; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addIncomingIntegration(integration: INewIncomingIntegration): Promise; diff --git a/apps/meteor/app/integrations/server/methods/incoming/deleteIncomingIntegration.ts b/apps/meteor/app/integrations/server/methods/incoming/deleteIncomingIntegration.ts index e73a46bb27db..9a116f51bbaf 100644 --- a/apps/meteor/app/integrations/server/methods/incoming/deleteIncomingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/incoming/deleteIncomingIntegration.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Integrations } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; import { notifyOnIntegrationChangedById } from '../../../../lib/server/lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteIncomingIntegration(integrationId: string): Promise; diff --git a/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts b/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts index 0ea5028130da..c94b7b9fd7a8 100644 --- a/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/incoming/updateIncomingIntegration.ts @@ -1,7 +1,7 @@ import type { IIntegration, INewIncomingIntegration, IUpdateIncomingIntegration } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Integrations, Roles, Subscriptions, Users, Rooms } from '@rocket.chat/models'; import { wrapExceptions } from '@rocket.chat/tools'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Babel } from 'meteor/babel-compiler'; import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; @@ -12,7 +12,7 @@ import { isScriptEngineFrozen, validateScriptEngine } from '../../lib/validateSc const validChannelChars = ['@', '#']; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { updateIncomingIntegration( diff --git a/apps/meteor/app/integrations/server/methods/outgoing/addOutgoingIntegration.ts b/apps/meteor/app/integrations/server/methods/outgoing/addOutgoingIntegration.ts index c8dc31e08446..dc54c76b1897 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/addOutgoingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/outgoing/addOutgoingIntegration.ts @@ -1,6 +1,6 @@ import type { INewOutgoingIntegration, IOutgoingIntegration } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Integrations } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { notifyOnIntegrationChanged } from '../../../../lib/server/lib/notifyLis import { validateOutgoingIntegration } from '../../lib/validateOutgoingIntegration'; import { validateScriptEngine } from '../../lib/validateScriptEngine'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addOutgoingIntegration(integration: INewOutgoingIntegration): Promise; diff --git a/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts b/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts index c9f2211d835b..46d4c65159c0 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Integrations, IntegrationHistory } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; import { notifyOnIntegrationChangedById } from '../../../../lib/server/lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteOutgoingIntegration(integrationId: string): Promise; diff --git a/apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts b/apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts index 417c308ca6cb..83c13f2d981b 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/outgoing/replayOutgoingIntegration.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Integrations, IntegrationHistory } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; import { triggerHandler } from '../../lib/triggerHandler'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { replayOutgoingIntegration(params: { integrationId: string; historyId: string }): Promise; diff --git a/apps/meteor/app/integrations/server/methods/outgoing/updateOutgoingIntegration.ts b/apps/meteor/app/integrations/server/methods/outgoing/updateOutgoingIntegration.ts index 116dbd043039..c9b1f4ed7d64 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/updateOutgoingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/outgoing/updateOutgoingIntegration.ts @@ -1,7 +1,7 @@ import type { IIntegration, INewOutgoingIntegration, IUpdateOutgoingIntegration } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Integrations, Users } from '@rocket.chat/models'; import { wrapExceptions } from '@rocket.chat/tools'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; @@ -9,7 +9,7 @@ import { notifyOnIntegrationChanged } from '../../../../lib/server/lib/notifyLis import { validateOutgoingIntegration } from '../../lib/validateOutgoingIntegration'; import { isScriptEngineFrozen, validateScriptEngine } from '../../lib/validateScriptEngine'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { updateOutgoingIntegration( diff --git a/apps/meteor/app/irc/server/methods/resetIrcConnection.ts b/apps/meteor/app/irc/server/methods/resetIrcConnection.ts index 24eef975d5d5..aaaeef1c06b8 100644 --- a/apps/meteor/app/irc/server/methods/resetIrcConnection.ts +++ b/apps/meteor/app/irc/server/methods/resetIrcConnection.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { notifyOnSettingChangedById } from '../../../lib/server/lib/notifyListener'; import { settings } from '../../../settings/server'; import Bridge from '../irc-bridge'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { resetIrcConnection(): { message: string; params: unknown[] }; diff --git a/apps/meteor/app/lib/client/methods/sendMessage.ts b/apps/meteor/app/lib/client/methods/sendMessage.ts index e824c9e491af..bdaca587493a 100644 --- a/apps/meteor/app/lib/client/methods/sendMessage.ts +++ b/apps/meteor/app/lib/client/methods/sendMessage.ts @@ -1,5 +1,5 @@ import type { IMessage, IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { onClientMessageReceived } from '../../../../client/lib/onClientMessageReceived'; diff --git a/apps/meteor/app/lib/server/functions/addUserToRoom.ts b/apps/meteor/app/lib/server/functions/addUserToRoom.ts index 57ea20f00cb1..b6ffc0ca4629 100644 --- a/apps/meteor/app/lib/server/functions/addUserToRoom.ts +++ b/apps/meteor/app/lib/server/functions/addUserToRoom.ts @@ -15,9 +15,15 @@ import { notifyOnRoomChangedById } from '../lib/notifyListener'; export const addUserToRoom = async function ( rid: string, - user: Pick | string, + user: Pick | string, inviter?: Pick, - silenced?: boolean, + { + skipSystemMessage, + skipAlertSound, + }: { + skipSystemMessage?: boolean; + skipAlertSound?: boolean; + } = {}, ): Promise { const now = new Date(); const room = await Rooms.findOneById(rid); @@ -43,12 +49,12 @@ export const addUserToRoom = async function ( } try { - await callbacks.run('federation.beforeAddUserToARoom', { user, inviter }, room); + await callbacks.run('federation.beforeAddUserToARoom', { user: userToBeAdded, inviter }, room); } catch (error) { throw new Meteor.Error((error as any)?.message); } - await callbacks.run('beforeAddedToRoom', { user: userToBeAdded, inviter: userToBeAdded }); + await callbacks.run('beforeAddedToRoom', { user: userToBeAdded, inviter }); // Check if user is already in room const subscription = await Subscriptions.findOneByRoomIdAndUserId(rid, userToBeAdded._id); @@ -79,7 +85,7 @@ export const addUserToRoom = async function ( await Subscriptions.createWithRoomAndUser(room, userToBeAdded as IUser, { ts: now, open: true, - alert: true, + alert: !skipAlertSound, unread: 1, userMentions: 1, groupMentions: 0, @@ -93,7 +99,7 @@ export const addUserToRoom = async function ( throw new Meteor.Error('error-invalid-user', 'Cannot add an user to a room without a username'); } - if (!silenced) { + if (!skipSystemMessage) { if (inviter) { const extraData = { ts: now, diff --git a/apps/meteor/app/lib/server/functions/checkUrlForSsrf.ts b/apps/meteor/app/lib/server/functions/checkUrlForSsrf.ts new file mode 100644 index 000000000000..c90065d7ad8f --- /dev/null +++ b/apps/meteor/app/lib/server/functions/checkUrlForSsrf.ts @@ -0,0 +1,100 @@ +import { lookup } from 'dns'; + +// https://en.wikipedia.org/wiki/Reserved_IP_addresses + Alibaba Metadata IP +const ranges: string[] = [ + '0.0.0.0/8', + '10.0.0.0/8', + '100.64.0.0/10', + '127.0.0.0/8', + '169.254.0.0/16', + '172.16.0.0/12', + '192.0.0.0/24', + '192.0.2.0/24', + '192.88.99.0/24', + '192.168.0.0/16', + '198.18.0.0/15', + '198.51.100.0/24', + '203.0.113.0/24', + '224.0.0.0/4', + '240.0.0.0/4', + '255.255.255.255', + '100.100.100.200/32', +]; + +export const nslookup = async (hostname: string): Promise => { + return new Promise((resolve, reject) => { + lookup(hostname, (error, address) => { + if (error) { + reject(error); + } else { + resolve(address); + } + }); + }); +}; + +export const ipToLong = (ip: string): number => { + return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0; +}; + +export const isIpInRange = (ip: string, range: string): boolean => { + const [rangeIp, subnet] = range.split('/'); + const ipLong = ipToLong(ip); + const rangeIpLong = ipToLong(rangeIp); + const mask = ~(2 ** (32 - Number(subnet)) - 1); + return (ipLong & mask) === (rangeIpLong & mask); +}; + +export const isIpInAnyRange = (ip: string): boolean => ranges.some((range) => isIpInRange(ip, range)); + +export const isValidIPv4 = (ip: string): boolean => { + const octets = ip.split('.'); + if (octets.length !== 4) return false; + return octets.every((octet) => { + const num = Number(octet); + return num >= 0 && num <= 255 && octet === num.toString(); + }); +}; + +export const isValidDomain = (domain: string): boolean => { + const domainPattern = /^(?!-)(?!.*--)[A-Za-z0-9-]{1,63}(? => { + if (!(url.startsWith('http://') || url.startsWith('https://'))) { + return false; + } + + const [, address] = url.split('://'); + const ipOrDomain = address.includes('/') ? address.split('/')[0] : address; + + if (!(isValidIPv4(ipOrDomain) || isValidDomain(ipOrDomain))) { + return false; + } + + if (isValidIPv4(ipOrDomain) && isIpInAnyRange(ipOrDomain)) { + return false; + } + + if (isValidDomain(ipOrDomain) && /metadata.google.internal/.test(ipOrDomain.toLowerCase())) { + return false; + } + + if (isValidDomain(ipOrDomain)) { + try { + const ipAddress = await nslookup(ipOrDomain); + if (isIpInAnyRange(ipAddress)) { + return false; + } + } catch (error) { + console.log(error); + return false; + } + } + + return true; +}; diff --git a/apps/meteor/app/lib/server/functions/createRoom.ts b/apps/meteor/app/lib/server/functions/createRoom.ts index 19e5fb2f9489..183cb789051f 100644 --- a/apps/meteor/app/lib/server/functions/createRoom.ts +++ b/apps/meteor/app/lib/server/functions/createRoom.ts @@ -112,6 +112,7 @@ export const createRoom = async ( readOnly?: boolean, roomExtraData?: Partial, options?: ICreateRoomParams['options'], + sidepanel?: ICreateRoomParams['sidepanel'], ): Promise< ICreatedRoom & { rid: string; @@ -187,6 +188,7 @@ export const createRoom = async ( }, ts: now, ro: readOnly === true, + sidepanel, }; if (teamId) { diff --git a/apps/meteor/app/lib/server/functions/deleteMessage.ts b/apps/meteor/app/lib/server/functions/deleteMessage.ts index e977874b3454..04542d5f1d27 100644 --- a/apps/meteor/app/lib/server/functions/deleteMessage.ts +++ b/apps/meteor/app/lib/server/functions/deleteMessage.ts @@ -5,11 +5,10 @@ import { Messages, Rooms, Uploads, Users, ReadReceipts } from '@rocket.chat/mode import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; -import { broadcastMessageFromData } from '../../../../server/modules/watchers/lib/messages'; import { canDeleteMessageAsync } from '../../../authorization/server/functions/canDeleteMessage'; import { FileUpload } from '../../../file-upload/server'; import { settings } from '../../../settings/server'; -import { notifyOnRoomChangedById } from '../lib/notifyListener'; +import { notifyOnRoomChangedById, notifyOnMessageChange } from '../lib/notifyListener'; export const deleteMessageValidatingPermission = async (message: AtLeast, userId: IUser['_id']): Promise => { if (!message?._id) { @@ -93,7 +92,7 @@ export async function deleteMessage(message: IMessage, user: IUser): Promise => { if (service === 'url' && typeof dataURI === 'string') { let response: Response; + + const isSsrfSafe = await checkUrlForSsrf(dataURI); + if (!isSsrfSafe) { + throw new Meteor.Error('error-avatar-invalid-url', `Invalid avatar URL: ${encodeURI(dataURI)}`, { + function: 'setUserAvatar', + url: dataURI, + }); + } + try { - response = await fetch(dataURI); + response = await fetch(dataURI, { redirect: 'error' }); } catch (e) { SystemLogger.info(`Not a valid response, from the avatar url: ${encodeURI(dataURI)}`); throw new Meteor.Error('error-avatar-invalid-url', `Invalid avatar URL: ${encodeURI(dataURI)}`, { diff --git a/apps/meteor/app/lib/server/functions/updateMessage.ts b/apps/meteor/app/lib/server/functions/updateMessage.ts index 2954517fb018..96683d40348f 100644 --- a/apps/meteor/app/lib/server/functions/updateMessage.ts +++ b/apps/meteor/app/lib/server/functions/updateMessage.ts @@ -4,15 +4,14 @@ import type { IMessage, IUser, AtLeast } from '@rocket.chat/core-typings'; import { Messages, Rooms } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; -import { callbacks } from '../../../../lib/callbacks'; -import { broadcastMessageFromData } from '../../../../server/modules/watchers/lib/messages'; import { settings } from '../../../settings/server'; -import { notifyOnRoomChangedById } from '../lib/notifyListener'; +import { afterSaveMessage } from '../lib/afterSaveMessage'; +import { notifyOnRoomChangedById, notifyOnMessageChange } from '../lib/notifyListener'; import { validateCustomMessageFields } from '../lib/validateCustomMessageFields'; import { parseUrlsInMessage } from './parseUrlsInMessage'; export const updateMessage = async function ( - message: AtLeast, + message: AtLeast, user: IUser, originalMsg?: IMessage, previewUrls?: string[], @@ -100,11 +99,11 @@ export const updateMessage = async function ( // although this is an "afterSave" kind callback, we know they can extend message's properties // so we wait for it to run before broadcasting - const data = await callbacks.run('afterSaveMessage', msg, room, user._id); + const data = await afterSaveMessage(msg, room, user._id); - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: msg._id, - data: data as any, // TODO move "afterSaveMessage" type definition to specify a return value + data, }); if (room?.lastMessage?._id === msg._id) { diff --git a/apps/meteor/app/lib/server/functions/validateNameChars.ts b/apps/meteor/app/lib/server/functions/validateNameChars.ts new file mode 100644 index 000000000000..07330c66b762 --- /dev/null +++ b/apps/meteor/app/lib/server/functions/validateNameChars.ts @@ -0,0 +1,21 @@ +export const validateNameChars = (name: string | undefined): boolean => { + if (typeof name !== 'string') { + return false; + } + + const invalidChars = /[<>\\/]/; + if (invalidChars.test(name)) { + return false; + } + + try { + const decodedName = decodeURI(name); + if (invalidChars.test(decodedName)) { + return false; + } + } catch (err) { + return false; + } + + return true; +}; diff --git a/apps/meteor/app/lib/server/lib/afterSaveMessage.ts b/apps/meteor/app/lib/server/lib/afterSaveMessage.ts new file mode 100644 index 000000000000..5b6e12b1e185 --- /dev/null +++ b/apps/meteor/app/lib/server/lib/afterSaveMessage.ts @@ -0,0 +1,35 @@ +import type { IMessage, IUser, IRoom } from '@rocket.chat/core-typings'; +import type { Updater } from '@rocket.chat/models'; +import { Rooms } from '@rocket.chat/models'; + +import { callbacks } from '../../../../lib/callbacks'; + +export async function afterSaveMessage( + message: IMessage, + room: IRoom, + uid?: IUser['_id'], + roomUpdater?: Updater, +): Promise { + const updater = roomUpdater ?? Rooms.getUpdater(); + const data = await callbacks.run('afterSaveMessage', message, { room, uid, roomUpdater: updater }); + + if (!roomUpdater && updater.hasChanges()) { + await Rooms.updateFromUpdater({ _id: room._id }, updater); + } + + // TODO: Fix type - callback configuration needs to be updated + return data as unknown as IMessage; +} + +export function afterSaveMessageAsync( + message: IMessage, + room: IRoom, + uid?: IUser['_id'], + roomUpdater: Updater = Rooms.getUpdater(), +): void { + callbacks.runAsync('afterSaveMessage', message, { room, uid, roomUpdater }); + + if (roomUpdater.hasChanges()) { + void Rooms.updateFromUpdater({ _id: room._id }, roomUpdater); + } +} diff --git a/apps/meteor/app/lib/server/lib/notifyListener.ts b/apps/meteor/app/lib/server/lib/notifyListener.ts index 635c236fda27..83ab5774374a 100644 --- a/apps/meteor/app/lib/server/lib/notifyListener.ts +++ b/apps/meteor/app/lib/server/lib/notifyListener.ts @@ -17,6 +17,9 @@ import type { AtLeast, ISettingColor, IUser, + IMessage, + SettingValue, + MessageTypesValues, } from '@rocket.chat/core-typings'; import { Rooms, @@ -30,7 +33,11 @@ import { LivechatInquiry, LivechatDepartmentAgents, Users, + Messages, } from '@rocket.chat/models'; +import mem from 'mem'; + +import { shouldHideSystemMessage } from '../../../../server/lib/systemMessage/hideSystemMessage'; type ClientAction = 'inserted' | 'updated' | 'removed'; @@ -401,3 +408,65 @@ export const notifyOnUserChangeById = withDbWatcherCheck( void notifyOnUserChange({ id, clientAction, data: user }); }, ); + +const getUserNameCached = mem( + async (userId: string): Promise => { + const user = await Users.findOne>(userId, { projection: { name: 1 } }); + return user?.name; + }, + { maxAge: 10000 }, +); + +const getSettingCached = mem(async (setting: string): Promise => Settings.getValueById(setting), { maxAge: 10000 }); + +export async function getMessageToBroadcast({ id, data }: { id: IMessage['_id']; data?: IMessage }): Promise { + const message = data ?? (await Messages.findOneById(id)); + if (!message) { + return; + } + + if (message.t) { + const hiddenSystemMessages = (await getSettingCached('Hide_System_Messages')) as MessageTypesValues[]; + const shouldHide = shouldHideSystemMessage(message.t, hiddenSystemMessages); + + if (shouldHide) { + return; + } + } + + if (message._hidden || message.imported != null) { + return; + } + + const useRealName = (await getSettingCached('UI_Use_Real_Name')) === true; + if (useRealName) { + if (message.u?._id) { + const name = await getUserNameCached(message.u._id); + if (name) { + message.u.name = name; + } + } + + if (message.mentions?.length) { + for await (const mention of message.mentions) { + const name = await getUserNameCached(mention._id); + if (name) { + mention.name = name; + } + } + } + } + + return message; +} + +export const notifyOnMessageChange = withDbWatcherCheck(async ({ id, data }: { id: IMessage['_id']; data?: IMessage }): Promise => { + if (!dbWatchersDisabled) { + return; + } + const message = await getMessageToBroadcast({ id, data }); + if (!message) { + return; + } + void api.broadcast('watch.messages', { message }); +}); diff --git a/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts b/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts index 76a18eba3362..85f2ac52b702 100644 --- a/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts +++ b/apps/meteor/app/lib/server/lib/notifyUsersOnMessage.ts @@ -1,5 +1,6 @@ import type { IMessage, IRoom, IUser, RoomType } from '@rocket.chat/core-typings'; import { isEditedMessage } from '@rocket.chat/core-typings'; +import type { Updater } from '@rocket.chat/models'; import { Subscriptions, Rooms } from '@rocket.chat/models'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import moment from 'moment'; @@ -141,12 +142,14 @@ export async function updateThreadUsersSubscriptions(message: IMessage, replies: await Subscriptions.setLastReplyForRoomIdAndUserIds(message.rid, repliesPlusSender, new Date()); } -export async function notifyUsersOnMessage(message: IMessage, room: IRoom): Promise { +export async function notifyUsersOnMessage(message: IMessage, room: IRoom, roomUpdater: Updater): Promise { + console.log('notifyUsersOnMessage function'); + // Skips this callback if the message was edited and increments it if the edit was way in the past (aka imported) if (isEditedMessage(message)) { if (Math.abs(moment(message.editedAt).diff(Date.now())) > 60000) { // TODO: Review as I am not sure how else to get around this as the incrementing of the msgs count shouldn't be in this callback - await Rooms.incMsgCountById(message.rid, 1); + Rooms.getIncMsgCountUpdateQuery(1, roomUpdater); return message; } @@ -156,25 +159,39 @@ export async function notifyUsersOnMessage(message: IMessage, room: IRoom): Prom (!message.tmid || message.tshow) && (!room.lastMessage || room.lastMessage._id === message._id) ) { - await Rooms.setLastMessageById(message.rid, message); + Rooms.getLastMessageUpdateQuery(message, roomUpdater); } return message; } if (message.ts && Math.abs(moment(message.ts).diff(Date.now())) > 60000) { - await Rooms.incMsgCountById(message.rid, 1); + Rooms.getIncMsgCountUpdateQuery(1, roomUpdater); return message; } // If message sent ONLY on a thread, skips the rest as it is done on a callback specific to threads if (message.tmid && !message.tshow) { - await Rooms.incMsgCountById(message.rid, 1); + Rooms.getIncMsgCountUpdateQuery(1, roomUpdater); return message; } // Update all the room activity tracker fields - await Rooms.incMsgCountAndSetLastMessageById(message.rid, 1, message.ts, settings.get('Store_Last_Message') ? message : undefined); + Rooms.setIncMsgCountAndSetLastMessageUpdateQuery(1, message, !!settings.get('Store_Last_Message'), roomUpdater); + await updateUsersSubscriptions(message, room); + + return message; +} + +export async function notifyUsersOnSystemMessage(message: IMessage, room: IRoom): Promise { + const roomUpdater = Rooms.getUpdater(); + Rooms.setIncMsgCountAndSetLastMessageUpdateQuery(1, message, !!settings.get('Store_Last_Message'), roomUpdater); + + if (roomUpdater.hasChanges()) { + await Rooms.updateFromUpdater({ _id: room._id }, roomUpdater); + } + + // TODO: Rewrite to use just needed calls from the function await updateUsersSubscriptions(message, room); return message; @@ -182,7 +199,15 @@ export async function notifyUsersOnMessage(message: IMessage, room: IRoom): Prom callbacks.add( 'afterSaveMessage', - (message, room) => notifyUsersOnMessage(message, room), + async (message, { room, roomUpdater }) => { + if (!roomUpdater) { + return message; + } + + await notifyUsersOnMessage(message, room, roomUpdater); + + return message; + }, callbacks.priority.MEDIUM, 'notifyUsersOnMessage', ); diff --git a/apps/meteor/app/lib/server/lib/sendNotificationsOnMessage.ts b/apps/meteor/app/lib/server/lib/sendNotificationsOnMessage.ts index 44654428ae8f..94c25f476222 100644 --- a/apps/meteor/app/lib/server/lib/sendNotificationsOnMessage.ts +++ b/apps/meteor/app/lib/server/lib/sendNotificationsOnMessage.ts @@ -266,7 +266,7 @@ export async function sendMessageNotifications(message: IMessage, room: IRoom, u return; } - const sender = await roomCoordinator.getRoomDirectives(room.t).getMsgSender(message.u._id); + const sender = await roomCoordinator.getRoomDirectives(room.t).getMsgSender(message); if (!sender) { return message; } @@ -406,7 +406,7 @@ settings.watch('Troubleshoot_Disable_Notifications', (value) => { callbacks.add( 'afterSaveMessage', - (message, room) => sendAllNotifications(message, room), + (message, { room }) => sendAllNotifications(message, room), callbacks.priority.LOW, 'sendNotificationsOnMessage', ); diff --git a/apps/meteor/app/lib/server/methods/addOAuthService.ts b/apps/meteor/app/lib/server/methods/addOAuthService.ts index 05b0e5a7e4e6..09287bb9bb74 100644 --- a/apps/meteor/app/lib/server/methods/addOAuthService.ts +++ b/apps/meteor/app/lib/server/methods/addOAuthService.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { addOAuthService } from '../../../../server/lib/oauth/addOAuthService'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addOAuthService(name: string): void; diff --git a/apps/meteor/app/lib/server/methods/addUserToRoom.ts b/apps/meteor/app/lib/server/methods/addUserToRoom.ts index 880b413d0618..8100cafc33b0 100644 --- a/apps/meteor/app/lib/server/methods/addUserToRoom.ts +++ b/apps/meteor/app/lib/server/methods/addUserToRoom.ts @@ -1,9 +1,9 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { addUsersToRoomMethod } from './addUsersToRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addUserToRoom(data: { rid: string; username: string }): void; diff --git a/apps/meteor/app/lib/server/methods/addUsersToRoom.ts b/apps/meteor/app/lib/server/methods/addUsersToRoom.ts index 48b7f9db58f5..73fbf6e51a04 100644 --- a/apps/meteor/app/lib/server/methods/addUsersToRoom.ts +++ b/apps/meteor/app/lib/server/methods/addUsersToRoom.ts @@ -1,8 +1,8 @@ import { api } from '@rocket.chat/core-services'; import type { IUser } from '@rocket.chat/core-typings'; import { isRoomFederated } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Users, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -12,7 +12,7 @@ import { Federation } from '../../../../server/services/federation/Federation'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { addUserToRoom } from '../functions/addUserToRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addUsersToRoom(data: { rid: string; users: string[] }): boolean; diff --git a/apps/meteor/app/lib/server/methods/archiveRoom.ts b/apps/meteor/app/lib/server/methods/archiveRoom.ts index c30014f59c11..dfa5a2c55412 100644 --- a/apps/meteor/app/lib/server/methods/archiveRoom.ts +++ b/apps/meteor/app/lib/server/methods/archiveRoom.ts @@ -1,6 +1,6 @@ import { isRegisterUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { archiveRoom } from '../functions/archiveRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { archiveRoom(rid: string): Promise; diff --git a/apps/meteor/app/lib/server/methods/blockUser.ts b/apps/meteor/app/lib/server/methods/blockUser.ts index b65423edf25b..b967e35d7bc1 100644 --- a/apps/meteor/app/lib/server/methods/blockUser.ts +++ b/apps/meteor/app/lib/server/methods/blockUser.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { RoomMemberActions } from '../../../../definition/IRoomTypeConfig'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { blockUser({ rid, blocked }: { rid: string; blocked: string }): boolean; diff --git a/apps/meteor/app/lib/server/methods/checkRegistrationSecretURL.ts b/apps/meteor/app/lib/server/methods/checkRegistrationSecretURL.ts index 3f349a8b43e6..ecba6844da26 100644 --- a/apps/meteor/app/lib/server/methods/checkRegistrationSecretURL.ts +++ b/apps/meteor/app/lib/server/methods/checkRegistrationSecretURL.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; diff --git a/apps/meteor/app/lib/server/methods/checkUsernameAvailability.ts b/apps/meteor/app/lib/server/methods/checkUsernameAvailability.ts index 34ad02ddb2cf..4df2706bb479 100644 --- a/apps/meteor/app/lib/server/methods/checkUsernameAvailability.ts +++ b/apps/meteor/app/lib/server/methods/checkUsernameAvailability.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -6,7 +6,7 @@ import { checkUsernameAvailabilityWithValidation } from '../functions/checkUsern import { RateLimiter } from '../lib'; import { methodDeprecationLogger } from '../lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { checkUsernameAvailability(username: string): boolean; diff --git a/apps/meteor/app/lib/server/methods/cleanRoomHistory.ts b/apps/meteor/app/lib/server/methods/cleanRoomHistory.ts index a724d1b38b2c..d6136eee9131 100644 --- a/apps/meteor/app/lib/server/methods/cleanRoomHistory.ts +++ b/apps/meteor/app/lib/server/methods/cleanRoomHistory.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { cleanRoomHistory } from '../functions/cleanRoomHistory'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { cleanRoomHistory(data: { diff --git a/apps/meteor/app/lib/server/methods/createChannel.ts b/apps/meteor/app/lib/server/methods/createChannel.ts index 98cea517bed4..a490fa1e3c42 100644 --- a/apps/meteor/app/lib/server/methods/createChannel.ts +++ b/apps/meteor/app/lib/server/methods/createChannel.ts @@ -1,13 +1,13 @@ import type { ICreatedRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { createRoom } from '../functions/createRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { createChannel( diff --git a/apps/meteor/app/lib/server/methods/createPrivateGroup.ts b/apps/meteor/app/lib/server/methods/createPrivateGroup.ts index 75097b5c89b8..3b92b2607829 100644 --- a/apps/meteor/app/lib/server/methods/createPrivateGroup.ts +++ b/apps/meteor/app/lib/server/methods/createPrivateGroup.ts @@ -1,13 +1,13 @@ import type { ICreatedRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { createRoom } from '../functions/createRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { createPrivateGroup( diff --git a/apps/meteor/app/lib/server/methods/createToken.ts b/apps/meteor/app/lib/server/methods/createToken.ts index ed665944415a..de60a7e37fe8 100644 --- a/apps/meteor/app/lib/server/methods/createToken.ts +++ b/apps/meteor/app/lib/server/methods/createToken.ts @@ -1,12 +1,12 @@ import { User } from '@rocket.chat/core-services'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Accounts } from 'meteor/accounts-base'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { createToken(userId: string): { userId: string; authToken: string }; diff --git a/apps/meteor/app/lib/server/methods/deleteMessage.ts b/apps/meteor/app/lib/server/methods/deleteMessage.ts index a1b1000c06b8..b0be64c245ef 100644 --- a/apps/meteor/app/lib/server/methods/deleteMessage.ts +++ b/apps/meteor/app/lib/server/methods/deleteMessage.ts @@ -1,11 +1,11 @@ import type { IMessage } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { deleteMessageValidatingPermission } from '../functions/deleteMessage'; import { methodDeprecationLogger } from '../lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteMessage({ _id }: Pick): void; diff --git a/apps/meteor/app/lib/server/methods/deleteUserOwnAccount.ts b/apps/meteor/app/lib/server/methods/deleteUserOwnAccount.ts index 2d651950da19..7b5663185bc5 100644 --- a/apps/meteor/app/lib/server/methods/deleteUserOwnAccount.ts +++ b/apps/meteor/app/lib/server/methods/deleteUserOwnAccount.ts @@ -1,7 +1,7 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; import { SHA256 } from '@rocket.chat/sha256'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Accounts } from 'meteor/accounts-base'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -10,7 +10,7 @@ import { trim } from '../../../../lib/utils/stringUtils'; import { settings } from '../../../settings/server'; import { deleteUser } from '../functions/deleteUser'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteUserOwnAccount(password: string, confirmRelinquish?: boolean): Promise; diff --git a/apps/meteor/app/lib/server/methods/executeSlashCommandPreview.ts b/apps/meteor/app/lib/server/methods/executeSlashCommandPreview.ts index 80b5428efbef..1c116863610d 100644 --- a/apps/meteor/app/lib/server/methods/executeSlashCommandPreview.ts +++ b/apps/meteor/app/lib/server/methods/executeSlashCommandPreview.ts @@ -1,10 +1,10 @@ import type { IMessage, RequiredField, SlashCommandPreviewItem } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { slashCommands } from '../../../utils/server/slashCommand'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { executeSlashCommandPreview( diff --git a/apps/meteor/app/lib/server/methods/getChannelHistory.ts b/apps/meteor/app/lib/server/methods/getChannelHistory.ts index 00ff01639593..8f1f4c586141 100644 --- a/apps/meteor/app/lib/server/methods/getChannelHistory.ts +++ b/apps/meteor/app/lib/server/methods/getChannelHistory.ts @@ -1,6 +1,6 @@ import type { IMessage, MessageTypesValues } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; @@ -11,7 +11,7 @@ import { settings } from '../../../settings/server/cached'; import { normalizeMessagesForUser } from '../../../utils/server/lib/normalizeMessagesForUser'; import { getHiddenSystemMessages } from '../lib/getHiddenSystemMessages'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getChannelHistory(params: { diff --git a/apps/meteor/app/lib/server/methods/getMessages.ts b/apps/meteor/app/lib/server/methods/getMessages.ts index 909e3d0c656b..d8684f82453c 100644 --- a/apps/meteor/app/lib/server/methods/getMessages.ts +++ b/apps/meteor/app/lib/server/methods/getMessages.ts @@ -1,12 +1,12 @@ import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomIdAsync } from '../../../authorization/server/functions/canAccessRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getMessages(messages: IMessage['_id'][]): Promise; diff --git a/apps/meteor/app/lib/server/methods/getRoomJoinCode.ts b/apps/meteor/app/lib/server/methods/getRoomJoinCode.ts index 75e4a4372f57..5ba4b3490722 100644 --- a/apps/meteor/app/lib/server/methods/getRoomJoinCode.ts +++ b/apps/meteor/app/lib/server/methods/getRoomJoinCode.ts @@ -1,12 +1,12 @@ import { isRoomWithJoinCode } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getRoomJoinCode(rid: string): string | false; diff --git a/apps/meteor/app/lib/server/methods/getRoomRoles.ts b/apps/meteor/app/lib/server/methods/getRoomRoles.ts index ac5fcc734d0f..b411ba8fedf5 100644 --- a/apps/meteor/app/lib/server/methods/getRoomRoles.ts +++ b/apps/meteor/app/lib/server/methods/getRoomRoles.ts @@ -1,6 +1,6 @@ import type { IRoom, ISubscription } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -8,7 +8,7 @@ import { getRoomRoles } from '../../../../server/lib/roles/getRoomRoles'; import { canAccessRoomAsync } from '../../../authorization/server'; import { settings } from '../../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getRoomRoles(rid: IRoom['_id']): ISubscription[]; diff --git a/apps/meteor/app/lib/server/methods/getSingleMessage.ts b/apps/meteor/app/lib/server/methods/getSingleMessage.ts index 1aaf2a652257..c4b6f065296b 100644 --- a/apps/meteor/app/lib/server/methods/getSingleMessage.ts +++ b/apps/meteor/app/lib/server/methods/getSingleMessage.ts @@ -1,12 +1,12 @@ import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomIdAsync } from '../../../authorization/server/functions/canAccessRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getSingleMessage(mid: IMessage['_id']): Promise; diff --git a/apps/meteor/app/lib/server/methods/getSlashCommandPreviews.ts b/apps/meteor/app/lib/server/methods/getSlashCommandPreviews.ts index dcb39c466063..965c91cc502f 100644 --- a/apps/meteor/app/lib/server/methods/getSlashCommandPreviews.ts +++ b/apps/meteor/app/lib/server/methods/getSlashCommandPreviews.ts @@ -1,10 +1,10 @@ import type { IMessage, RequiredField, SlashCommandPreviews } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { slashCommands } from '../../../utils/server/slashCommand'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getSlashCommandPreviews(command: { diff --git a/apps/meteor/app/lib/server/methods/getUserRoles.ts b/apps/meteor/app/lib/server/methods/getUserRoles.ts index cc7588276c33..cbd4712930a2 100644 --- a/apps/meteor/app/lib/server/methods/getUserRoles.ts +++ b/apps/meteor/app/lib/server/methods/getUserRoles.ts @@ -1,9 +1,9 @@ import { Authorization } from '@rocket.chat/core-services'; import type { IUser, IRocketChatRecord } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getUserRoles(): (IRocketChatRecord & Pick)[]; diff --git a/apps/meteor/app/lib/server/methods/getUsernameSuggestion.ts b/apps/meteor/app/lib/server/methods/getUsernameSuggestion.ts index 5724449a5790..b42799f24081 100644 --- a/apps/meteor/app/lib/server/methods/getUsernameSuggestion.ts +++ b/apps/meteor/app/lib/server/methods/getUsernameSuggestion.ts @@ -1,9 +1,9 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { generateUsernameSuggestion } from '../functions/getUsernameSuggestion'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getUsernameSuggestion(): Promise; diff --git a/apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts b/apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts index 5a8b1c8d1a58..122b11172d57 100644 --- a/apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts +++ b/apps/meteor/app/lib/server/methods/insertOrUpdateUser.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -6,7 +6,7 @@ import { twoFactorRequired } from '../../../2fa/server/twoFactorRequired'; import { saveUser } from '../functions/saveUser'; import { methodDeprecationLogger } from '../lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { insertOrUpdateUser(userData: Record): Promise; diff --git a/apps/meteor/app/lib/server/methods/joinDefaultChannels.ts b/apps/meteor/app/lib/server/methods/joinDefaultChannels.ts index 309ac4e449be..df654bc4aef0 100644 --- a/apps/meteor/app/lib/server/methods/joinDefaultChannels.ts +++ b/apps/meteor/app/lib/server/methods/joinDefaultChannels.ts @@ -1,11 +1,11 @@ import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { addUserToDefaultChannels } from '../functions/addUserToDefaultChannels'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { joinDefaultChannels(silenced?: boolean): void; diff --git a/apps/meteor/app/lib/server/methods/joinRoom.ts b/apps/meteor/app/lib/server/methods/joinRoom.ts index 0fa3ac0b3c3b..ef3f069ee614 100644 --- a/apps/meteor/app/lib/server/methods/joinRoom.ts +++ b/apps/meteor/app/lib/server/methods/joinRoom.ts @@ -1,11 +1,11 @@ import { Room } from '@rocket.chat/core-services'; import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { joinRoom(rid: IRoom['_id'], code?: string): boolean | undefined; diff --git a/apps/meteor/app/lib/server/methods/leaveRoom.ts b/apps/meteor/app/lib/server/methods/leaveRoom.ts index ec1bb1638a21..4fc85b35fd05 100644 --- a/apps/meteor/app/lib/server/methods/leaveRoom.ts +++ b/apps/meteor/app/lib/server/methods/leaveRoom.ts @@ -1,6 +1,6 @@ import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Roles, Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -10,7 +10,7 @@ import { hasPermissionAsync } from '../../../authorization/server/functions/hasP import { hasRoleAsync } from '../../../authorization/server/functions/hasRole'; import { removeUserFromRoom } from '../functions/removeUserFromRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { leaveRoom(rid: string): Promise; diff --git a/apps/meteor/app/lib/server/methods/refreshOAuthService.ts b/apps/meteor/app/lib/server/methods/refreshOAuthService.ts index e5b1c377a33e..1d547b770361 100644 --- a/apps/meteor/app/lib/server/methods/refreshOAuthService.ts +++ b/apps/meteor/app/lib/server/methods/refreshOAuthService.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { refreshLoginServices } from '../../../../server/lib/refreshLoginServices'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { refreshOAuthService(): Promise; diff --git a/apps/meteor/app/lib/server/methods/removeOAuthService.ts b/apps/meteor/app/lib/server/methods/removeOAuthService.ts index 6e16dc8d2d5b..fee2caa911d2 100644 --- a/apps/meteor/app/lib/server/methods/removeOAuthService.ts +++ b/apps/meteor/app/lib/server/methods/removeOAuthService.ts @@ -1,13 +1,13 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; import { capitalize } from '@rocket.chat/string-helpers'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { notifyOnSettingChangedById } from '../lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { removeOAuthService(name: string): Promise; diff --git a/apps/meteor/app/lib/server/methods/restartServer.ts b/apps/meteor/app/lib/server/methods/restartServer.ts index 206824aebe7e..264ab4d1bee6 100644 --- a/apps/meteor/app/lib/server/methods/restartServer.ts +++ b/apps/meteor/app/lib/server/methods/restartServer.ts @@ -1,9 +1,9 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { restart_server(): { diff --git a/apps/meteor/app/lib/server/methods/saveCustomFields.ts b/apps/meteor/app/lib/server/methods/saveCustomFields.ts index a509c97bdb85..d683e59a905c 100644 --- a/apps/meteor/app/lib/server/methods/saveCustomFields.ts +++ b/apps/meteor/app/lib/server/methods/saveCustomFields.ts @@ -1,11 +1,11 @@ import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { saveCustomFields } from '../functions/saveCustomFields'; import { RateLimiter } from '../lib'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { saveCustomFields: (fields: IUser['customFields']) => Promise; diff --git a/apps/meteor/app/lib/server/methods/saveSetting.ts b/apps/meteor/app/lib/server/methods/saveSetting.ts index 7f900d1751d8..4f4d29b9fa24 100644 --- a/apps/meteor/app/lib/server/methods/saveSetting.ts +++ b/apps/meteor/app/lib/server/methods/saveSetting.ts @@ -1,6 +1,6 @@ import type { SettingValue } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { getSettingPermissionId } from '../../../authorization/lib'; import { hasPermissionAsync, hasAllPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { notifyOnSettingChanged } from '../lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { saveSetting(_id: string, value: SettingValue, editor?: string): Promise; diff --git a/apps/meteor/app/lib/server/methods/saveSettings.ts b/apps/meteor/app/lib/server/methods/saveSettings.ts index 8c4f92cfb88f..dffa986b7217 100644 --- a/apps/meteor/app/lib/server/methods/saveSettings.ts +++ b/apps/meteor/app/lib/server/methods/saveSettings.ts @@ -1,7 +1,7 @@ import type { ISetting } from '@rocket.chat/core-typings'; import { isSettingCode } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -11,7 +11,7 @@ import { hasPermissionAsync } from '../../../authorization/server/functions/hasP import { settings } from '../../../settings/server'; import { notifyOnSettingChangedById } from '../lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { saveSettings( diff --git a/apps/meteor/app/lib/server/methods/sendMessage.ts b/apps/meteor/app/lib/server/methods/sendMessage.ts index a490b5c4c67f..56009f15fede 100644 --- a/apps/meteor/app/lib/server/methods/sendMessage.ts +++ b/apps/meteor/app/lib/server/methods/sendMessage.ts @@ -1,7 +1,7 @@ import { api } from '@rocket.chat/core-services'; import type { AtLeast, IMessage, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import moment from 'moment'; @@ -12,6 +12,7 @@ import { canSendMessageAsync } from '../../../authorization/server/functions/can import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { metrics } from '../../../metrics/server'; import { settings } from '../../../settings/server'; +import { MessageTypes } from '../../../ui-utils/server'; import { sendMessage } from '../functions/sendMessage'; import { RateLimiter } from '../lib'; @@ -78,6 +79,8 @@ export async function executeSendMessage(uid: IUser['_id'], message: AtLeast, previewUrls?: string[]): any; @@ -126,6 +129,10 @@ Meteor.methods({ }); } + if (MessageTypes.isSystemMessage(message)) { + throw new Error("Cannot send system messages using 'sendMessage'"); + } + try { return await executeSendMessage(uid, message, previewUrls); } catch (error: any) { diff --git a/apps/meteor/app/lib/server/methods/sendSMTPTestEmail.ts b/apps/meteor/app/lib/server/methods/sendSMTPTestEmail.ts index 2ede129dd380..5a04032ad82e 100644 --- a/apps/meteor/app/lib/server/methods/sendSMTPTestEmail.ts +++ b/apps/meteor/app/lib/server/methods/sendSMTPTestEmail.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; import * as Mailer from '../../../mailer/server/api'; import { settings } from '../../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { sendSMTPTestEmail(): { diff --git a/apps/meteor/app/lib/server/methods/setAdminStatus.ts b/apps/meteor/app/lib/server/methods/setAdminStatus.ts index 42ffdc91f85e..300aa735b014 100644 --- a/apps/meteor/app/lib/server/methods/setAdminStatus.ts +++ b/apps/meteor/app/lib/server/methods/setAdminStatus.ts @@ -1,12 +1,12 @@ import { isUserFederated } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setAdminStatus(userId: string, admin?: boolean): void; diff --git a/apps/meteor/app/lib/server/methods/setEmail.ts b/apps/meteor/app/lib/server/methods/setEmail.ts index a172eba72555..26540db26b4c 100644 --- a/apps/meteor/app/lib/server/methods/setEmail.ts +++ b/apps/meteor/app/lib/server/methods/setEmail.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -6,7 +6,7 @@ import { settings } from '../../../settings/server'; import { setEmail } from '../functions/setEmail'; import { RateLimiter } from '../lib'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setEmail(email: string): string; diff --git a/apps/meteor/app/lib/server/methods/setRealName.ts b/apps/meteor/app/lib/server/methods/setRealName.ts index 2a55bd102172..f347eef1580e 100644 --- a/apps/meteor/app/lib/server/methods/setRealName.ts +++ b/apps/meteor/app/lib/server/methods/setRealName.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -6,7 +6,7 @@ import { settings } from '../../../settings/server'; import { setRealName } from '../functions/setRealName'; import { RateLimiter } from '../lib'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setRealName(name: string): string; diff --git a/apps/meteor/app/lib/server/methods/setUsername.ts b/apps/meteor/app/lib/server/methods/setUsername.ts index 900848f37783..58fac75ed3bd 100644 --- a/apps/meteor/app/lib/server/methods/setUsername.ts +++ b/apps/meteor/app/lib/server/methods/setUsername.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { setUsernameWithValidation } from '../functions/setUsername'; import { RateLimiter } from '../lib'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setUsername(username: string, param?: { joinDefaultChannelsSilenced?: boolean }): string; diff --git a/apps/meteor/app/lib/server/methods/unarchiveRoom.ts b/apps/meteor/app/lib/server/methods/unarchiveRoom.ts index 0f9349365f4f..74b74c11e54a 100644 --- a/apps/meteor/app/lib/server/methods/unarchiveRoom.ts +++ b/apps/meteor/app/lib/server/methods/unarchiveRoom.ts @@ -1,13 +1,13 @@ import { isRegisterUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { unarchiveRoom } from '../functions/unarchiveRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { unarchiveRoom(rid: string): Promise; diff --git a/apps/meteor/app/lib/server/methods/unblockUser.ts b/apps/meteor/app/lib/server/methods/unblockUser.ts index 6c8a9d486bab..2eec5a082109 100644 --- a/apps/meteor/app/lib/server/methods/unblockUser.ts +++ b/apps/meteor/app/lib/server/methods/unblockUser.ts @@ -1,9 +1,9 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { unblockUser({ rid, blocked }: { rid: string; blocked: string }): boolean; diff --git a/apps/meteor/app/lib/server/methods/updateMessage.ts b/apps/meteor/app/lib/server/methods/updateMessage.ts index 161a168a2cdc..8cebe563cd23 100644 --- a/apps/meteor/app/lib/server/methods/updateMessage.ts +++ b/apps/meteor/app/lib/server/methods/updateMessage.ts @@ -1,6 +1,6 @@ import type { IEditedMessage, IMessage, IUser, AtLeast } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import moment from 'moment'; @@ -12,7 +12,11 @@ import { updateMessage } from '../functions/updateMessage'; const allowedEditedFields = ['tshow', 'alias', 'attachments', 'avatar', 'emoji', 'msg', 'customFields', 'content']; -export async function executeUpdateMessage(uid: IUser['_id'], message: AtLeast, previewUrls?: string[]) { +export async function executeUpdateMessage( + uid: IUser['_id'], + message: AtLeast, + previewUrls?: string[], +) { const originalMessage = await Messages.findOneById(message._id); if (!originalMessage?._id) { return; @@ -26,8 +30,11 @@ export async function executeUpdateMessage(uid: IUser['_id'], message: AtLeast { + async (message, { room }) => { // TODO: check if I need to test this 60 second rule. // If the message was edited, or is older than 60 seconds (imported) // the notifications will be skipped, so we can also skip this validation diff --git a/apps/meteor/app/livechat-enterprise/client/startup.ts b/apps/meteor/app/livechat-enterprise/client/startup.ts index 0535f8926a7d..bdf6c2549816 100644 --- a/apps/meteor/app/livechat-enterprise/client/startup.ts +++ b/apps/meteor/app/livechat-enterprise/client/startup.ts @@ -15,7 +15,7 @@ const businessHours: Record = { Meteor.startup(() => { Tracker.autorun(async () => { const bhType = settings.get('Livechat_business_hour_type'); - if (await hasLicense('livechat-enterprise')) { + if (bhType && (await hasLicense('livechat-enterprise'))) { businessHourManager.registerBusinessHourBehavior(businessHours[bhType.toLowerCase()]); } }); diff --git a/apps/meteor/app/livechat/client/externalFrame/generateNewKey.ts b/apps/meteor/app/livechat/client/externalFrame/generateNewKey.ts index eb0742813c1f..54c6ba4d75f1 100644 --- a/apps/meteor/app/livechat/client/externalFrame/generateNewKey.ts +++ b/apps/meteor/app/livechat/client/externalFrame/generateNewKey.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { sdk } from '../../../utils/client/lib/SDKClient'; diff --git a/apps/meteor/app/livechat/imports/server/rest/rooms.ts b/apps/meteor/app/livechat/imports/server/rest/rooms.ts index f7d5ddb314c9..f80ed61a131e 100644 --- a/apps/meteor/app/livechat/imports/server/rest/rooms.ts +++ b/apps/meteor/app/livechat/imports/server/rest/rooms.ts @@ -30,7 +30,7 @@ API.v1.addRoute( async get() { const { offset, count } = await getPaginationItems(this.queryParams); const { sort, fields } = await this.parseJsonQuery(); - const { agents, departmentId, open, tags, roomName, onhold } = this.queryParams; + const { agents, departmentId, open, tags, roomName, onhold, queued } = this.queryParams; const { createdAt, customFields, closedAt } = this.queryParams; const createdAtParam = validateDateParams('createdAt', createdAt); @@ -69,6 +69,7 @@ API.v1.addRoute( tags, customFields: parsedCf, onhold, + queued, options: { offset, count, sort, fields }, }), ); diff --git a/apps/meteor/app/livechat/imports/server/rest/sms.ts b/apps/meteor/app/livechat/imports/server/rest/sms.ts index b6669b5f0d89..6f8ce64bc635 100644 --- a/apps/meteor/app/livechat/imports/server/rest/sms.ts +++ b/apps/meteor/app/livechat/imports/server/rest/sms.ts @@ -17,6 +17,7 @@ import { Meteor } from 'meteor/meteor'; import { getFileExtension } from '../../../../../lib/utils/getFileExtension'; import { API } from '../../../../api/server'; import { FileUpload } from '../../../../file-upload/server'; +import { checkUrlForSsrf } from '../../../../lib/server/functions/checkUrlForSsrf'; import { settings } from '../../../../settings/server'; import type { ILivechatMessage } from '../../../server/lib/LivechatTyped'; import { Livechat as LivechatTyped } from '../../../server/lib/LivechatTyped'; @@ -24,7 +25,12 @@ import { Livechat as LivechatTyped } from '../../../server/lib/LivechatTyped'; const logger = new Logger('SMS'); const getUploadFile = async (details: Omit, fileUrl: string) => { - const response = await fetch(fileUrl); + const isSsrfSafe = await checkUrlForSsrf(fileUrl); + if (!isSsrfSafe) { + throw new Meteor.Error('error-invalid-url', 'Invalid URL'); + } + + const response = await fetch(fileUrl, { redirect: 'error' }); const content = Buffer.from(await response.arrayBuffer()); diff --git a/apps/meteor/app/livechat/server/api/lib/agents.ts b/apps/meteor/app/livechat/server/api/lib/agents.ts index 3bc5180c2f59..2dbcce8c7e2e 100644 --- a/apps/meteor/app/livechat/server/api/lib/agents.ts +++ b/apps/meteor/app/livechat/server/api/lib/agents.ts @@ -7,14 +7,8 @@ export async function findAgentDepartments({ }: { enabledDepartmentsOnly?: boolean; agentId: string; -}): Promise<{ departments: ILivechatDepartmentAgents[] }> { - if (enabledDepartmentsOnly) { - return { - departments: await LivechatDepartmentAgents.findActiveDepartmentsByAgentId(agentId).toArray(), - }; - } - +}): Promise<{ departments: (ILivechatDepartmentAgents & { departmentName: string })[] }> { return { - departments: await LivechatDepartmentAgents.find({ agentId }).toArray(), + departments: await LivechatDepartmentAgents.findDepartmentsOfAgent(agentId, enabledDepartmentsOnly).toArray(), }; } diff --git a/apps/meteor/app/livechat/server/api/lib/rooms.ts b/apps/meteor/app/livechat/server/api/lib/rooms.ts index b130e5c2c73a..26449dce3963 100644 --- a/apps/meteor/app/livechat/server/api/lib/rooms.ts +++ b/apps/meteor/app/livechat/server/api/lib/rooms.ts @@ -14,6 +14,7 @@ export async function findRooms({ tags, customFields, onhold, + queued, options: { offset, count, fields, sort }, }: { agents?: Array; @@ -31,6 +32,7 @@ export async function findRooms({ tags?: Array; customFields?: Record; onhold?: string | boolean; + queued?: string | boolean; options: { offset: number; count: number; fields: Record; sort: Record }; }): Promise }>> { const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}); @@ -44,6 +46,7 @@ export async function findRooms({ tags, customFields, onhold: ['t', 'true', '1'].includes(`${onhold}`), + queued: ['t', 'true', '1'].includes(`${queued}`), options: { sort: sort || { ts: -1 }, offset, diff --git a/apps/meteor/app/livechat/server/api/v1/pageVisited.ts b/apps/meteor/app/livechat/server/api/v1/pageVisited.ts index e89a3e17f0a1..2688ad673af0 100644 --- a/apps/meteor/app/livechat/server/api/v1/pageVisited.ts +++ b/apps/meteor/app/livechat/server/api/v1/pageVisited.ts @@ -1,5 +1,4 @@ import type { IOmnichannelSystemMessage } from '@rocket.chat/core-typings'; -import { Messages } from '@rocket.chat/models'; import { isPOSTLivechatPageVisitedParams } from '@rocket.chat/rest-typings'; import { API } from '../../../../api/server'; @@ -11,17 +10,13 @@ API.v1.addRoute( { async post() { const { token, rid, pageInfo } = this.bodyParams; - const msgId = await Livechat.savePageHistory(token, rid, pageInfo); - if (!msgId) { - return API.v1.success(); - } - const message = await Messages.findOneById(msgId); + const message = await Livechat.savePageHistory(token, rid, pageInfo); if (!message) { return API.v1.success(); } - const { msg, navigation } = message; + const { msg, navigation } = message as IOmnichannelSystemMessage; return API.v1.success({ page: { msg, navigation } }); }, }, diff --git a/apps/meteor/app/livechat/server/api/v1/room.ts b/apps/meteor/app/livechat/server/api/v1/room.ts index 94674f801ad5..b0f45a63ff87 100644 --- a/apps/meteor/app/livechat/server/api/v1/room.ts +++ b/apps/meteor/app/livechat/server/api/v1/room.ts @@ -293,8 +293,7 @@ API.v1.addRoute( throw new Error('error-invalid-visitor'); } - const transferedBy = this.user satisfies TransferByData; - transferData.transferredBy = normalizeTransferredByData(transferedBy, room); + transferData.transferredBy = normalizeTransferredByData(this.user, room); if (transferData.userId) { const userToTransfer = await Users.findOneById(transferData.userId); if (userToTransfer) { diff --git a/apps/meteor/app/livechat/server/externalFrame/generateNewKey.ts b/apps/meteor/app/livechat/server/externalFrame/generateNewKey.ts index 11463bcf00d4..a8f145f47d39 100644 --- a/apps/meteor/app/livechat/server/externalFrame/generateNewKey.ts +++ b/apps/meteor/app/livechat/server/externalFrame/generateNewKey.ts @@ -1,7 +1,7 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { omnichannelExternalFrameGenerateKey(): unknown; diff --git a/apps/meteor/app/livechat/server/hooks/afterSaveOmnichannelMessage.ts b/apps/meteor/app/livechat/server/hooks/afterSaveOmnichannelMessage.ts new file mode 100644 index 000000000000..311343c4ad01 --- /dev/null +++ b/apps/meteor/app/livechat/server/hooks/afterSaveOmnichannelMessage.ts @@ -0,0 +1,24 @@ +import { isOmnichannelRoom } from '@rocket.chat/core-typings'; +import { LivechatRooms } from '@rocket.chat/models'; + +import { callbacks } from '../../../../lib/callbacks'; + +callbacks.add( + 'afterSaveMessage', + async (message, { room }) => { + if (!isOmnichannelRoom(room)) { + return message; + } + + const updater = LivechatRooms.getUpdater(); + const result = await callbacks.run('afterOmnichannelSaveMessage', message, { room, roomUpdater: updater }); + + if (updater.hasChanges()) { + await LivechatRooms.updateFromUpdater({ _id: room._id }, updater); + } + + return result; + }, + callbacks.priority.MEDIUM, + 'after-omnichannel-save-message', +); diff --git a/apps/meteor/app/livechat/server/hooks/leadCapture.ts b/apps/meteor/app/livechat/server/hooks/leadCapture.ts index 4b987c00c02e..6a3826b8ba11 100644 --- a/apps/meteor/app/livechat/server/hooks/leadCapture.ts +++ b/apps/meteor/app/livechat/server/hooks/leadCapture.ts @@ -1,5 +1,5 @@ import type { IMessage, IOmnichannelRoom } from '@rocket.chat/core-typings'; -import { isEditedMessage, isOmnichannelRoom } from '@rocket.chat/core-typings'; +import { isEditedMessage } from '@rocket.chat/core-typings'; import { LivechatVisitors } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; @@ -31,12 +31,8 @@ function validateMessage(message: IMessage, room: IOmnichannelRoom) { } callbacks.add( - 'afterSaveMessage', - async (message, room) => { - if (!isOmnichannelRoom(room)) { - return message; - } - + 'afterOmnichannelSaveMessage', + async (message, { room }) => { if (!validateMessage(message, room)) { return message; } diff --git a/apps/meteor/app/livechat/server/hooks/markRoomNotResponded.ts b/apps/meteor/app/livechat/server/hooks/markRoomNotResponded.ts index f0bfb8574e6a..01d3014f1c27 100644 --- a/apps/meteor/app/livechat/server/hooks/markRoomNotResponded.ts +++ b/apps/meteor/app/livechat/server/hooks/markRoomNotResponded.ts @@ -1,15 +1,11 @@ -import { isOmnichannelRoom, isEditedMessage } from '@rocket.chat/core-typings'; +import { isEditedMessage } from '@rocket.chat/core-typings'; import { LivechatRooms } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; callbacks.add( - 'afterSaveMessage', - async (message, room) => { - if (!isOmnichannelRoom(room)) { - return message; - } - + 'afterOmnichannelSaveMessage', + (message, { room, roomUpdater }) => { // skips this callback if the message was edited if (!message || isEditedMessage(message)) { return message; @@ -21,11 +17,11 @@ callbacks.add( } // check if room is yet awaiting for response - if (typeof room.t !== 'undefined' && room.t === 'l' && room.waitingResponse) { + if (room.waitingResponse) { return message; } - await LivechatRooms.setNotResponseByRoomId(room._id); + LivechatRooms.getNotResponseByRoomIdUpdateQuery(roomUpdater); return message; }, diff --git a/apps/meteor/app/livechat/server/hooks/markRoomResponded.ts b/apps/meteor/app/livechat/server/hooks/markRoomResponded.ts index 48ec985aa42c..69e9b11c57b9 100644 --- a/apps/meteor/app/livechat/server/hooks/markRoomResponded.ts +++ b/apps/meteor/app/livechat/server/hooks/markRoomResponded.ts @@ -1,78 +1,72 @@ -import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; -import { isOmnichannelRoom, isEditedMessage } from '@rocket.chat/core-typings'; +import type { IOmnichannelRoom, IMessage } from '@rocket.chat/core-typings'; +import { isEditedMessage, isMessageFromVisitor } from '@rocket.chat/core-typings'; +import type { Updater } from '@rocket.chat/models'; import { LivechatRooms, LivechatVisitors, LivechatInquiry } from '@rocket.chat/models'; import moment from 'moment'; import { callbacks } from '../../../../lib/callbacks'; import { notifyOnLivechatInquiryChanged } from '../../../lib/server/lib/notifyListener'; -callbacks.add( - 'afterSaveMessage', - async (message, room) => { - if (!isOmnichannelRoom(room)) { - return message; - } - - // skips this callback if the message was edited - if (!message || isEditedMessage(message)) { - return message; - } +export async function markRoomResponded( + message: IMessage, + room: IOmnichannelRoom, + roomUpdater: Updater, +): Promise { + if (message.t || isEditedMessage(message) || isMessageFromVisitor(message)) { + return; + } - // skips this callback if the message is a system message - if (message.t) { - return message; - } + const monthYear = moment().format('YYYY-MM'); + const isVisitorActive = await LivechatVisitors.isVisitorActiveOnPeriod(room.v._id, monthYear); - // if the message has a token, it was sent by the visitor, so ignore it - if (message.token) { - return message; - } + // Case: agent answers & visitor is not active, we mark visitor as active + if (!isVisitorActive) { + await LivechatVisitors.markVisitorActiveForPeriod(room.v._id, monthYear); + } - // Return YYYY-MM from moment - const monthYear = moment().format('YYYY-MM'); - const isVisitorActive = await LivechatVisitors.isVisitorActiveOnPeriod(room.v._id, monthYear); + if (!room.v?.activity?.includes(monthYear)) { + LivechatRooms.getVisitorActiveForPeriodUpdateQuery(monthYear, roomUpdater); + const livechatInquiry = await LivechatInquiry.markInquiryActiveForPeriod(room._id, monthYear); - // Case: agent answers & visitor is not active, we mark visitor as active - if (!isVisitorActive) { - await LivechatVisitors.markVisitorActiveForPeriod(room.v._id, monthYear); + if (livechatInquiry) { + void notifyOnLivechatInquiryChanged(livechatInquiry, 'updated', { v: livechatInquiry.v }); } + } - if (!room.v?.activity?.includes(monthYear)) { - const [, livechatInquiry] = await Promise.all([ - LivechatRooms.markVisitorActiveForPeriod(room._id, monthYear), - LivechatInquiry.markInquiryActiveForPeriod(room._id, monthYear), - ]); - if (livechatInquiry) { - void notifyOnLivechatInquiryChanged(livechatInquiry, 'updated', { v: livechatInquiry.v }); - } - } + if (room.responseBy) { + LivechatRooms.getAgentLastMessageTsUpdateQuery(roomUpdater); + } + if (!room.waitingResponse) { + // case where agent sends second message or any subsequent message in a room before visitor responds to the first message + // in this case, we just need to update the lastMessageTs of the responseBy object if (room.responseBy) { - await LivechatRooms.setAgentLastMessageTs(room._id); + LivechatRooms.getAgentLastMessageTsUpdateQuery(roomUpdater); } - // check if room is yet awaiting for response from visitor - if (!room.waitingResponse) { - // case where agent sends second message or any subsequent message in a room before visitor responds to the first message - // in this case, we just need to update the lastMessageTs of the responseBy object - if (room.responseBy) { - await LivechatRooms.setAgentLastMessageTs(room._id); - } - return message; - } + return room.responseBy; + } + + const responseBy: IOmnichannelRoom['responseBy'] = room.responseBy || { + _id: message.u._id, + username: message.u.username, + firstResponseTs: new Date(message.ts), + lastMessageTs: new Date(message.ts), + }; - // This is the first message from agent after visitor had last responded - const responseBy: IOmnichannelRoom['responseBy'] = room.responseBy || { - _id: message.u._id, - username: message.u.username, - firstResponseTs: new Date(message.ts), - lastMessageTs: new Date(message.ts), - }; + LivechatRooms.getResponseByRoomIdUpdateQuery(responseBy, roomUpdater); - // this unsets waitingResponse and sets responseBy object - await LivechatRooms.setResponseByRoomId(room._id, responseBy); + return responseBy; +} + +callbacks.add( + 'afterOmnichannelSaveMessage', + async (message, { room, roomUpdater }) => { + if (!message || message.t || isEditedMessage(message) || isMessageFromVisitor(message)) { + return; + } - return message; + await markRoomResponded(message, room, roomUpdater); }, callbacks.priority.HIGH, 'markRoomResponded', diff --git a/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.ts b/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.ts index 8a5a4c280670..8eb53fbb8fa7 100644 --- a/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.ts +++ b/apps/meteor/app/livechat/server/hooks/processRoomAbandonment.ts @@ -43,7 +43,8 @@ const getSecondsSinceLastAgentResponse = async (room: IOmnichannelRoom, agentLas officeDays = (await businessHourManager.getBusinessHour())?.workHours.reduce(parseDays, {}); } - if (!officeDays) { + // Empty object we assume invalid config + if (!officeDays || !Object.keys(officeDays).length) { return getSecondsWhenOfficeHoursIsDisabled(room, agentLastMessage); } @@ -55,6 +56,11 @@ const getSecondsSinceLastAgentResponse = async (room: IOmnichannelRoom, agentLas for (let index = 0; index <= daysOfInactivity; index++) { const today = inactivityDay.clone().format('dddd'); const officeDay = officeDays[today]; + // Config doesnt have data for this day, we skip day + if (!officeDay) { + inactivityDay.add(1, 'days'); + continue; + } const startTodaysOfficeHour = moment(`${officeDay.start.day}:${officeDay.start.time}`, 'dddd:HH:mm').add(index, 'days'); const endTodaysOfficeHour = moment(`${officeDay.finish.day}:${officeDay.finish.time}`, 'dddd:HH:mm').add(index, 'days'); if (officeDays[today].open) { diff --git a/apps/meteor/app/livechat/server/hooks/saveAnalyticsData.ts b/apps/meteor/app/livechat/server/hooks/saveAnalyticsData.ts index e92e6b4d940b..fef6ad0936f8 100644 --- a/apps/meteor/app/livechat/server/hooks/saveAnalyticsData.ts +++ b/apps/meteor/app/livechat/server/hooks/saveAnalyticsData.ts @@ -1,84 +1,78 @@ -import { isEditedMessage, isOmnichannelRoom } from '@rocket.chat/core-typings'; +import { isEditedMessage } from '@rocket.chat/core-typings'; +import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; import { LivechatRooms } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload'; -callbacks.add( - 'afterSaveMessage', - async (message, room) => { - // check if room is livechat - if (!isOmnichannelRoom(room)) { - return message; - } - - // skips this callback if the message was edited - if (!message || isEditedMessage(message)) { - return message; - } - - // if the message has a token, it was sent by the visitor - if (message.token) { - // When visitor sends a mesage, most metrics wont be calculated/served. - // But, v.lq (last query) will be updated to the message time. This has to be done - // As not doing it will cause the metrics to be crazy and not have real values. - await LivechatRooms.saveAnalyticsDataByRoomId(room, message); - return message; - } +const getMetricValue = (metric: T | undefined, defaultValue: T): T => metric ?? defaultValue; +const calculateTimeDifference = (startTime: T, now: Date): number => + (now.getTime() - new Date(startTime).getTime()) / 1000; +const calculateAvgResponseTime = (totalResponseTime: number, newResponseTime: number, responseCount: number) => + (totalResponseTime + newResponseTime) / (responseCount + 1); - if (message.file) { - message = { ...(await normalizeMessageFileUpload(message)), ...{ _updatedAt: message._updatedAt } }; - } +const getFirstResponseAnalytics = ( + visitorLastQuery: Date, + agentJoinTime: Date, + totalResponseTime: number, + responseCount: number, + now: Date, +) => { + const responseTime = calculateTimeDifference(visitorLastQuery, now); + const reactionTime = calculateTimeDifference(agentJoinTime, now); + const avgResponseTime = calculateAvgResponseTime(totalResponseTime, responseTime, responseCount); - const now = new Date(); - let analyticsData; + return { + firstResponseDate: now, + firstResponseTime: responseTime, + responseTime, + avgResponseTime, + firstReactionDate: now, + firstReactionTime: reactionTime, + reactionTime, + }; +}; - const visitorLastQuery = room.metrics?.v ? room.metrics.v.lq : room.ts; - const agentLastReply = room.metrics?.servedBy ? room.metrics.servedBy.lr : room.ts; - const agentJoinTime = room.servedBy?.ts ? room.servedBy.ts : room.ts; +const getSubsequentResponseAnalytics = (visitorLastQuery: Date, totalResponseTime: number, responseCount: number, now: Date) => { + const responseTime = calculateTimeDifference(visitorLastQuery, now); + const avgResponseTime = calculateAvgResponseTime(totalResponseTime, responseTime, responseCount); - const isResponseTt = room.metrics?.response?.tt; - const isResponseTotal = room.metrics?.response?.total; + return { + responseTime, + avgResponseTime, + reactionTime: responseTime, + }; +}; - if (agentLastReply === room.ts) { - // first response - const firstResponseDate = now; - const firstResponseTime = (now.getTime() - new Date(visitorLastQuery).getTime()) / 1000; - const responseTime = (now.getTime() - new Date(visitorLastQuery).getTime()) / 1000; - const avgResponseTime = - ((isResponseTt ? room.metrics?.response?.tt : 0) || 0 + responseTime) / - ((isResponseTotal ? room.metrics?.response?.total : 0) || 0 + 1); +const getAnalyticsData = (room: IOmnichannelRoom, now: Date): Record | undefined => { + const visitorLastQuery = getMetricValue(room.metrics?.v?.lq, room.ts); + const agentLastReply = getMetricValue(room.metrics?.servedBy?.lr, room.ts); + const agentJoinTime = getMetricValue(room.servedBy?.ts, room.ts); + const totalResponseTime = getMetricValue(room.metrics?.response?.tt, 0); + const responseCount = getMetricValue(room.metrics?.response?.total, 0); - const firstReactionDate = now; - const firstReactionTime = (now.getTime() - new Date(agentJoinTime).getTime()) / 1000; - const reactionTime = (now.getTime() - new Date(agentJoinTime).getTime()) / 1000; + if (agentLastReply === room.ts) { + return getFirstResponseAnalytics(visitorLastQuery, agentJoinTime, totalResponseTime, responseCount, now); + } + if (visitorLastQuery > agentLastReply) { + return getSubsequentResponseAnalytics(visitorLastQuery, totalResponseTime, responseCount, now); + } +}; - analyticsData = { - firstResponseDate, - firstResponseTime, - responseTime, - avgResponseTime, - firstReactionDate, - firstReactionTime, - reactionTime, - }; - } else if (visitorLastQuery > agentLastReply) { - // response, not first - const responseTime = (now.getTime() - new Date(visitorLastQuery).getTime()) / 1000; - const avgResponseTime = - ((isResponseTt ? room.metrics?.response?.tt : 0) || 0 + responseTime) / - ((isResponseTotal ? room.metrics?.response?.total : 0) || 0 + 1); +callbacks.add( + 'afterOmnichannelSaveMessage', + async (message, { room, roomUpdater }) => { + if (!message || isEditedMessage(message)) { + return message; + } - const reactionTime = (now.getTime() - new Date(visitorLastQuery).getTime()) / 1000; + if (message.file) { + message = { ...(await normalizeMessageFileUpload(message)), ...{ _updatedAt: message._updatedAt } }; + } - analyticsData = { - responseTime, - avgResponseTime, - reactionTime, - }; - } // ignore, its continuing response + const analyticsData = getAnalyticsData(room, new Date()); + await LivechatRooms.getAnalyticsUpdateQueryByRoomId(room, message, analyticsData, roomUpdater); - await LivechatRooms.saveAnalyticsDataByRoomId(room, message, analyticsData); return message; }, callbacks.priority.LOW, diff --git a/apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts b/apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts index e65f1d99b884..1925e135a562 100644 --- a/apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts +++ b/apps/meteor/app/livechat/server/hooks/saveLastMessageToInquiry.ts @@ -1,4 +1,4 @@ -import { isOmnichannelRoom, isEditedMessage } from '@rocket.chat/core-typings'; +import { isEditedMessage } from '@rocket.chat/core-typings'; import { LivechatInquiry } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; @@ -7,9 +7,9 @@ import { settings } from '../../../settings/server'; import { RoutingManager } from '../lib/RoutingManager'; callbacks.add( - 'afterSaveMessage', - async (message, room) => { - if (!isOmnichannelRoom(room) || isEditedMessage(message) || message.t) { + 'afterOmnichannelSaveMessage', + async (message, { room }) => { + if (isEditedMessage(message) || message.t) { return message; } diff --git a/apps/meteor/app/livechat/server/hooks/saveLastVisitorMessageTs.ts b/apps/meteor/app/livechat/server/hooks/saveLastVisitorMessageTs.ts index 4bc28c3990ba..03dcfdbf81bd 100644 --- a/apps/meteor/app/livechat/server/hooks/saveLastVisitorMessageTs.ts +++ b/apps/meteor/app/livechat/server/hooks/saveLastVisitorMessageTs.ts @@ -1,22 +1,18 @@ -import { isOmnichannelRoom } from '@rocket.chat/core-typings'; +import { isMessageFromVisitor } from '@rocket.chat/core-typings'; import { LivechatRooms } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; callbacks.add( - 'afterSaveMessage', - async (message, room) => { - if (!(isOmnichannelRoom(room) && room.v.token)) { - return message; - } - if (message.t) { - return message; - } - if (!message.token) { + 'afterOmnichannelSaveMessage', + async (message, { roomUpdater }) => { + if (message.t || !isMessageFromVisitor(message)) { return message; } - await LivechatRooms.setVisitorLastMessageTimestampByRoomId(room._id, message.ts); + await LivechatRooms.getVisitorLastMessageTsUpdateQueryByRoomId(message.ts, roomUpdater); + + return message; }, callbacks.priority.HIGH, 'save-last-visitor-message-timestamp', diff --git a/apps/meteor/app/livechat/server/hooks/sendToCRM.ts b/apps/meteor/app/livechat/server/hooks/sendToCRM.ts index 24e1d685a0e6..b3624bd3ecf6 100644 --- a/apps/meteor/app/livechat/server/hooks/sendToCRM.ts +++ b/apps/meteor/app/livechat/server/hooks/sendToCRM.ts @@ -261,13 +261,8 @@ callbacks.add( ); callbacks.add( - 'afterSaveMessage', - async (message, room) => { - // only call webhook if it is a livechat room - if (!isOmnichannelRoom(room) || !room?.v?.token) { - return message; - } - + 'afterOmnichannelSaveMessage', + async (message, { room }) => { // if the message has a token, it was sent from the visitor // if not, it was sent from the agent if (message.token && !settings.get('Livechat_webhook_on_visitor_message')) { diff --git a/apps/meteor/app/livechat/server/index.ts b/apps/meteor/app/livechat/server/index.ts index fc96f2a921a9..9a1f40238df5 100644 --- a/apps/meteor/app/livechat/server/index.ts +++ b/apps/meteor/app/livechat/server/index.ts @@ -16,6 +16,7 @@ import './hooks/saveContactLastChat'; import './hooks/saveLastMessageToInquiry'; import './hooks/afterUserActions'; import './hooks/afterAgentRemoved'; +import './hooks/afterSaveOmnichannelMessage'; import './methods/addAgent'; import './methods/addManager'; import './methods/changeLivechatStatus'; diff --git a/apps/meteor/app/livechat/server/lib/Helper.ts b/apps/meteor/app/livechat/server/lib/Helper.ts index 01bb2ff34e9a..1ef572df3068 100644 --- a/apps/meteor/app/livechat/server/lib/Helper.ts +++ b/apps/meteor/app/livechat/server/lib/Helper.ts @@ -36,7 +36,6 @@ import { validateEmail as validatorFunc } from '../../../../lib/emailValidator'; import { i18n } from '../../../../server/lib/i18n'; import { hasRoleAsync } from '../../../authorization/server/functions/hasRole'; import { sendNotification } from '../../../lib/server'; -import { sendMessage } from '../../../lib/server/functions/sendMessage'; import { notifyOnLivechatDepartmentAgentChanged, notifyOnLivechatDepartmentAgentChangedByAgentsAndDepartmentId, @@ -141,8 +140,7 @@ export const createLivechatRoom = async < } await callbacks.run('livechat.newRoom', room); - - await sendMessage(guest, { t: 'livechat-started', msg: '', groupable: false }, room); + await Message.saveSystemMessageAndNotifyUser('livechat-started', rid, '', { _id, username }, { groupable: false, token: guest.token }); return result.value as IOmnichannelRoom; }; @@ -646,6 +644,7 @@ export const forwardRoomToDepartment = async (room: IOmnichannelRoom, guest: ILi '', { _id, username }, { + ...(transferData.transferredBy.userType === 'visitor' && { token: room.v.token }), transferData: { ...transferData, prevDepartment: transferData.originalDepartmentName, @@ -681,18 +680,23 @@ export const forwardRoomToDepartment = async (room: IOmnichannelRoom, guest: ILi return true; }; -export const normalizeTransferredByData = (transferredBy: TransferByData, room: IOmnichannelRoom) => { +type MakePropertyOptional = Omit & { [P in K]?: T[P] }; + +export const normalizeTransferredByData = ( + transferredBy: MakePropertyOptional, + room: IOmnichannelRoom, +): TransferByData => { if (!transferredBy || !room) { throw new Error('You must provide "transferredBy" and "room" params to "getTransferredByData"'); } const { servedBy: { _id: agentId } = {} } = room; const { _id, username, name, userType: transferType } = transferredBy; - const type = transferType || (_id === agentId ? 'agent' : 'user'); + const userType = transferType || (_id === agentId ? 'agent' : 'user'); return { _id, username, ...(name && { name }), - type, + userType, }; }; diff --git a/apps/meteor/app/livechat/server/lib/LivechatTyped.ts b/apps/meteor/app/livechat/server/lib/LivechatTyped.ts index bb56eb81ceb3..bb8a3fd77ba2 100644 --- a/apps/meteor/app/livechat/server/lib/LivechatTyped.ts +++ b/apps/meteor/app/livechat/server/lib/LivechatTyped.ts @@ -9,7 +9,6 @@ import type { IUser, MessageTypesValues, ILivechatVisitor, - IOmnichannelSystemMessage, SelectedAgent, ILivechatAgent, IMessage, @@ -41,7 +40,6 @@ import { import { serverFetch as fetch } from '@rocket.chat/server-fetch'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -import moment from 'moment-timezone'; import type { Filter, FindCursor } from 'mongodb'; import UAParser from 'ua-parser-js'; @@ -68,12 +66,14 @@ import { import * as Mailer from '../../../mailer/server/api'; import { metrics } from '../../../metrics/server'; import { settings } from '../../../settings/server'; -import { getTimezone } from '../../../utils/server/lib/getTimezone'; import { businessHourManager } from '../business-hour'; import { parseAgentCustomFields, updateDepartmentAgents, validateEmail, normalizeTransferredByData } from './Helper'; import { QueueManager } from './QueueManager'; import { RoutingManager } from './RoutingManager'; import { isDepartmentCreationAvailable } from './isDepartmentCreationAvailable'; +import type { CloseRoomParams, CloseRoomParamsByUser, CloseRoomParamsByVisitor } from './localTypes'; +import { parseTranscriptRequest } from './parseTranscriptRequest'; +import { sendTranscript as sendTranscriptFunc } from './sendTranscript'; type RegisterGuestType = Partial> & { id?: string; @@ -82,36 +82,6 @@ type RegisterGuestType = Partial; - }; - pdfTranscript?: { - requestedBy: string; - }; - }; -}; - -export type CloseRoomParamsByUser = { - user: IUser | null; -} & GenericCloseRoomParams; - -export type CloseRoomParamsByVisitor = { - visitor: ILivechatVisitor; -} & GenericCloseRoomParams; - -export type CloseRoomParams = CloseRoomParamsByUser | CloseRoomParamsByVisitor; - type OfflineMessageData = { message: string; name: string; @@ -282,7 +252,6 @@ class LivechatClass { const isRoomClosedByVisitorParams = (params: CloseRoomParams): params is CloseRoomParamsByVisitor => (params as CloseRoomParamsByVisitor).visitor !== undefined; - let chatCloser: any; if (isRoomClosedByUserParams(params)) { const { user } = params; this.logger.debug(`Closing by user ${user?._id}`); @@ -291,7 +260,6 @@ class LivechatClass { _id: user?._id || '', username: user?.username, }; - chatCloser = user; } else if (isRoomClosedByVisitorParams(params)) { const { visitor } = params; this.logger.debug(`Closing by visitor ${params.visitor._id}`); @@ -300,7 +268,6 @@ class LivechatClass { _id: visitor._id, username: visitor.username, }; - chatCloser = visitor; } else { throw new Error('Error: Please provide details of the user or visitor who closed the room'); } @@ -326,14 +293,6 @@ class LivechatClass { this.logger.debug(`DB updated for room ${room._id}`); - const message = { - t: 'livechat-close', - msg: comment, - groupable: false, - transcriptRequested: !!transcriptRequest, - }; - - // Retrieve the closed room const newRoom = await LivechatRooms.findOneById(rid); if (!newRoom) { @@ -341,11 +300,19 @@ class LivechatClass { } this.logger.debug(`Sending closing message to room ${room._id}`); - await sendMessage(chatCloser, message, newRoom); - await Message.saveSystemMessage('command', rid, 'promptTranscript', closeData.closedBy); + const transcriptRequested = + !!transcriptRequest || (!settings.get('Livechat_enable_transcript') && settings.get('Livechat_transcript_send_always')); - this.logger.debug(`Running callbacks for room ${newRoom._id}`); + await Message.saveSystemMessageAndNotifyUser('livechat-close', rid, comment ?? '', closeData.closedBy, { + groupable: false, + transcriptRequested, + ...(isRoomClosedByVisitorParams(params) && { token: params.visitor.token }), + }); + + if (settings.get('Livechat_enable_transcript') && !settings.get('Livechat_transcript_send_always')) { + await Message.saveSystemMessage('command', rid, 'promptTranscript', closeData.closedBy); + } process.nextTick(() => { /** @@ -355,15 +322,18 @@ class LivechatClass { void Apps.self?.getBridges()?.getListenerBridge().livechatEvent(AppEvents.ILivechatRoomClosedHandler, newRoom); void Apps.self?.getBridges()?.getListenerBridge().livechatEvent(AppEvents.IPostLivechatRoomClosed, newRoom); }); + + const visitor = isRoomClosedByVisitorParams(params) ? params.visitor : undefined; + const opts = await parseTranscriptRequest(params.room, options, visitor); if (process.env.TEST_MODE) { await callbacks.run('livechat.closeRoom', { room: newRoom, - options, + options: opts, }); } else { callbacks.runAsync('livechat.closeRoom', { room: newRoom, - options, + options: opts, }); } @@ -562,127 +532,6 @@ class LivechatClass { } } - async sendTranscript({ - token, - rid, - email, - subject, - user, - }: { - token: string; - rid: string; - email: string; - subject?: string; - user?: Pick | null; - }): Promise { - check(rid, String); - check(email, String); - this.logger.debug(`Sending conversation transcript of room ${rid} to user with token ${token}`); - - const room = await LivechatRooms.findOneById(rid); - - const visitor = await LivechatVisitors.getVisitorByToken(token, { - projection: { _id: 1, token: 1, language: 1, username: 1, name: 1 }, - }); - - if (!visitor) { - throw new Error('error-invalid-token'); - } - - // @ts-expect-error - Visitor typings should include language? - const userLanguage = visitor?.language || settings.get('Language') || 'en'; - const timezone = getTimezone(user); - this.logger.debug(`Transcript will be sent using ${timezone} as timezone`); - - if (!room) { - throw new Error('error-invalid-room'); - } - - // allow to only user to send transcripts from their own chats - if (room.t !== 'l' || !room.v || room.v.token !== token) { - throw new Error('error-invalid-room'); - } - - const showAgentInfo = settings.get('Livechat_show_agent_info'); - const closingMessage = await Messages.findLivechatClosingMessage(rid, { projection: { ts: 1 } }); - const ignoredMessageTypes: MessageTypesValues[] = [ - 'livechat_navigation_history', - 'livechat_transcript_history', - 'command', - 'livechat-close', - 'livechat-started', - 'livechat_video_call', - ]; - const messages = await Messages.findVisibleByRoomIdNotContainingTypesBeforeTs( - rid, - ignoredMessageTypes, - closingMessage?.ts ? new Date(closingMessage.ts) : new Date(), - { - sort: { ts: 1 }, - }, - ); - - let html = '

'; - await messages.forEach((message) => { - let author; - if (message.u._id === visitor._id) { - author = i18n.t('You', { lng: userLanguage }); - } else { - author = showAgentInfo ? message.u.name || message.u.username : i18n.t('Agent', { lng: userLanguage }); - } - - const datetime = moment.tz(message.ts, timezone).locale(userLanguage).format('LLL'); - const singleMessage = ` -

${author} ${datetime}

-

${message.msg}

- `; - html += singleMessage; - }); - - html = `${html}
`; - - const fromEmail = settings.get('From_Email').match(/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b/i); - let emailFromRegexp = ''; - if (fromEmail) { - emailFromRegexp = fromEmail[0]; - } else { - emailFromRegexp = settings.get('From_Email'); - } - - const mailSubject = subject || i18n.t('Transcript_of_your_livechat_conversation', { lng: userLanguage }); - - await this.sendEmail(emailFromRegexp, email, emailFromRegexp, mailSubject, html); - - setImmediate(() => { - void callbacks.run('livechat.sendTranscript', messages, email); - }); - - const requestData: IOmnichannelSystemMessage['requestData'] = { - type: 'user', - visitor, - user, - }; - - if (!user?.username) { - const cat = await Users.findOneById('rocket.cat', { projection: { _id: 1, username: 1, name: 1 } }); - if (cat) { - requestData.user = cat; - requestData.type = 'visitor'; - } - } - - if (!requestData.user) { - this.logger.error('rocket.cat user not found'); - throw new Error('No user provided and rocket.cat not found'); - } - - await Message.saveSystemMessage('livechat_transcript_history', room._id, '', requestData.user, { - requestData, - }); - - return true; - } - async registerGuest({ id, token, @@ -712,7 +561,9 @@ class LivechatClass { visitorDataToUpdate.visitorEmails = [{ address: visitorEmail }]; } - if (department) { + const livechatVisitor = await LivechatVisitors.getVisitorByToken(token, { projection: { _id: 1 } }); + + if (livechatVisitor?.department !== department && department) { Livechat.logger.debug(`Attempt to find a department with id/name ${department}`); const dep = await LivechatDepartment.findOneByIdOrName(department, { projection: { _id: 1 } }); if (!dep) { @@ -723,8 +574,6 @@ class LivechatClass { visitorDataToUpdate.department = dep._id; } - const livechatVisitor = await LivechatVisitors.getVisitorByToken(token, { projection: { _id: 1 } }); - visitorDataToUpdate.token = livechatVisitor?.token || token; let existingUser = null; @@ -1018,7 +867,7 @@ class LivechatClass { return Messages.findVisibleByRoomIdNotContainingTypes(rid, ignoredMessageTypes, { sort: { ts: 1 }, - }).toArray(); + }); } async archiveDepartment(_id: string) { @@ -1267,7 +1116,7 @@ class LivechatClass { if (guest.name) { message.alias = guest.name; } - return Object.assign(await sendMessage(guest, message, room), { + return Object.assign(await sendMessage(guest, { ...message, token: guest.token }, room), { newRoom, showConnecting: this.showConnecting(), }); @@ -1386,7 +1235,7 @@ class LivechatClass { _id: String, username: String, name: Match.Maybe(String), - type: String, + userType: String, }), ); @@ -1394,7 +1243,8 @@ class LivechatClass { const scopeData = scope || (nextDepartment ? 'department' : 'agent'); this.logger.info(`Storing new chat transfer of ${room._id} [Transfered by: ${_id} to ${scopeData}]`); - const transfer = { + const transferMessage = { + ...(transferData.transferredBy.userType === 'visitor' && { token: room.v.token }), transferData: { transferredBy, ts: new Date(), @@ -1406,22 +1256,7 @@ class LivechatClass { }, }; - const type = 'livechat_transfer_history'; - const transferMessage = { - t: type, - rid: room._id, - ts: new Date(), - msg: '', - u: { - _id, - username, - }, - groupable: false, - }; - - Object.assign(transferMessage, transfer); - - await sendMessage(transferredBy, transferMessage, room); + await Message.saveSystemMessageAndNotifyUser('livechat_transfer_history', room._id, '', { _id, username }, transferMessage); } async saveGuest(guestData: Pick & { email?: string; phone?: string }, userId: string) { @@ -1984,6 +1819,23 @@ class LivechatClass { return departmentDB; } + + async sendTranscript({ + token, + rid, + email, + subject, + user, + }: { + token: string; + rid: string; + email: string; + subject?: string; + user?: Pick | null; + }): Promise { + return sendTranscriptFunc({ token, rid, email, subject, user }); + } } export const Livechat = new LivechatClass(); +export * from './localTypes'; diff --git a/apps/meteor/app/livechat/server/lib/QueueManager.ts b/apps/meteor/app/livechat/server/lib/QueueManager.ts index 5ae03e0ee03b..e1ea79d84163 100644 --- a/apps/meteor/app/livechat/server/lib/QueueManager.ts +++ b/apps/meteor/app/livechat/server/lib/QueueManager.ts @@ -15,6 +15,7 @@ import { Random } from '@rocket.chat/random'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; +import { dispatchInquiryPosition } from '../../../../ee/app/livechat-enterprise/server/lib/Helper'; import { callbacks } from '../../../../lib/callbacks'; import { sendNotification } from '../../../lib/server'; import { @@ -27,6 +28,7 @@ import { i18n } from '../../../utils/lib/i18n'; import { createLivechatRoom, createLivechatInquiry, allowAgentSkipQueue } from './Helper'; import { Livechat } from './LivechatTyped'; import { RoutingManager } from './RoutingManager'; +import { getInquirySortMechanismSetting } from './settings'; const logger = new Logger('QueueManager'); @@ -221,7 +223,7 @@ export class QueueManager { const name = (roomInfo?.fname as string) || guest.name || guest.username; - const room = await createLivechatRoom(rid, name, guest, roomInfo, { + const room = await createLivechatRoom(rid, name, { ...guest, ...(department && { department }) }, roomInfo, { ...extraData, ...(Boolean(customFields) && { customFields }), }); @@ -259,6 +261,18 @@ export class QueueManager { throw new Error('room-not-found'); } + if (!newRoom.servedBy && settings.get('Omnichannel_calculate_dispatch_service_queue_statistics')) { + const [inq] = await LivechatInquiry.getCurrentSortedQueueAsync({ + inquiryId: inquiry._id, + department, + queueSortBy: getInquirySortMechanismSetting(), + }); + + if (inq) { + void dispatchInquiryPosition(inq); + } + } + return newRoom; } diff --git a/apps/meteor/app/livechat/server/lib/localTypes.ts b/apps/meteor/app/livechat/server/lib/localTypes.ts new file mode 100644 index 000000000000..c6acbbc5bcbd --- /dev/null +++ b/apps/meteor/app/livechat/server/lib/localTypes.ts @@ -0,0 +1,31 @@ +import type { IOmnichannelRoom, IUser, ILivechatVisitor } from '@rocket.chat/core-typings'; + +export type GenericCloseRoomParams = { + room: IOmnichannelRoom; + comment?: string; + options?: { + clientAction?: boolean; + tags?: string[]; + emailTranscript?: + | { + sendToVisitor: false; + } + | { + sendToVisitor: true; + requestData: NonNullable; + }; + pdfTranscript?: { + requestedBy: string; + }; + }; +}; + +export type CloseRoomParamsByUser = { + user: IUser | null; +} & GenericCloseRoomParams; + +export type CloseRoomParamsByVisitor = { + visitor: ILivechatVisitor; +} & GenericCloseRoomParams; + +export type CloseRoomParams = CloseRoomParamsByUser | CloseRoomParamsByVisitor; diff --git a/apps/meteor/app/livechat/server/lib/parseTranscriptRequest.ts b/apps/meteor/app/livechat/server/lib/parseTranscriptRequest.ts new file mode 100644 index 000000000000..76595a7ff640 --- /dev/null +++ b/apps/meteor/app/livechat/server/lib/parseTranscriptRequest.ts @@ -0,0 +1,61 @@ +import type { ILivechatVisitor, IOmnichannelRoom, IUser } from '@rocket.chat/core-typings'; +import { LivechatVisitors, Users } from '@rocket.chat/models'; + +import { settings } from '../../../settings/server'; +import type { CloseRoomParams } from './localTypes'; + +export const parseTranscriptRequest = async ( + room: IOmnichannelRoom, + options: CloseRoomParams['options'], + visitor?: ILivechatVisitor, + user?: IUser, +): Promise => { + const visitorDecideTranscript = settings.get('Livechat_enable_transcript'); + // visitor decides, no changes + if (visitorDecideTranscript) { + return options; + } + + // send always is disabled, no changes + const sendAlways = settings.get('Livechat_transcript_send_always'); + if (!sendAlways) { + return options; + } + + const visitorData = + visitor || + (await LivechatVisitors.findOneById>(room.v._id, { projection: { visitorEmails: 1 } })); + // no visitor, no changes + if (!visitorData) { + return options; + } + const visitorEmail = visitorData?.visitorEmails?.[0]?.address; + // visitor doesnt have email, no changes + if (!visitorEmail) { + return options; + } + + const defOptions = { projection: { _id: 1, username: 1, name: 1 } }; + const requestedBy = + user || + (room.servedBy && (await Users.findOneById(room.servedBy._id, defOptions))) || + (await Users.findOneById('rocket.cat', defOptions)); + + // no user available for backing request, no changes + if (!requestedBy) { + return options; + } + + return { + ...options, + emailTranscript: { + sendToVisitor: true, + requestData: { + email: visitorEmail, + requestedAt: new Date(), + subject: '', + requestedBy, + }, + }, + }; +}; diff --git a/apps/meteor/app/livechat/server/lib/sendTranscript.ts b/apps/meteor/app/livechat/server/lib/sendTranscript.ts new file mode 100644 index 000000000000..74032121ee50 --- /dev/null +++ b/apps/meteor/app/livechat/server/lib/sendTranscript.ts @@ -0,0 +1,227 @@ +import { Message } from '@rocket.chat/core-services'; +import { + type IUser, + type MessageTypesValues, + type IOmnichannelSystemMessage, + isFileAttachment, + isFileImageAttachment, +} from '@rocket.chat/core-typings'; +import colors from '@rocket.chat/fuselage-tokens/colors'; +import { Logger } from '@rocket.chat/logger'; +import { LivechatRooms, LivechatVisitors, Messages, Uploads, Users } from '@rocket.chat/models'; +import { check } from 'meteor/check'; +import moment from 'moment-timezone'; + +import { callbacks } from '../../../../lib/callbacks'; +import { i18n } from '../../../../server/lib/i18n'; +import { FileUpload } from '../../../file-upload/server'; +import * as Mailer from '../../../mailer/server/api'; +import { settings } from '../../../settings/server'; +import { MessageTypes } from '../../../ui-utils/lib/MessageTypes'; +import { getTimezone } from '../../../utils/server/lib/getTimezone'; + +const logger = new Logger('Livechat-SendTranscript'); + +export async function sendTranscript({ + token, + rid, + email, + subject, + user, +}: { + token: string; + rid: string; + email: string; + subject?: string; + user?: Pick | null; +}): Promise { + check(rid, String); + check(email, String); + logger.debug(`Sending conversation transcript of room ${rid} to user with token ${token}`); + + const room = await LivechatRooms.findOneById(rid); + + const visitor = await LivechatVisitors.getVisitorByToken(token, { + projection: { _id: 1, token: 1, language: 1, username: 1, name: 1 }, + }); + + if (!visitor) { + throw new Error('error-invalid-token'); + } + + // @ts-expect-error - Visitor typings should include language? + const userLanguage = visitor?.language || settings.get('Language') || 'en'; + const timezone = getTimezone(user); + logger.debug(`Transcript will be sent using ${timezone} as timezone`); + + if (!room) { + throw new Error('error-invalid-room'); + } + + // allow to only user to send transcripts from their own chats + if (room.t !== 'l' || !room.v || room.v.token !== token) { + throw new Error('error-invalid-room'); + } + + const showAgentInfo = settings.get('Livechat_show_agent_info'); + const showSystemMessages = settings.get('Livechat_transcript_show_system_messages'); + const closingMessage = await Messages.findLivechatClosingMessage(rid, { projection: { ts: 1 } }); + const ignoredMessageTypes: MessageTypesValues[] = [ + 'livechat_navigation_history', + 'livechat_transcript_history', + 'command', + 'livechat-close', + 'livechat-started', + 'livechat_video_call', + 'omnichannel_priority_change_history', + ]; + const acceptableImageMimeTypes = ['image/jpeg', 'image/png', 'image/jpg']; + const messages = await Messages.findVisibleByRoomIdNotContainingTypesBeforeTs( + rid, + ignoredMessageTypes, + closingMessage?.ts ? new Date(closingMessage.ts) : new Date(), + showSystemMessages, + { + sort: { ts: 1 }, + }, + ); + + let html = '

'; + const InvalidFileMessage = `
${i18n.t( + 'This_attachment_is_not_supported', + { lng: userLanguage }, + )}
`; + + for await (const message of messages) { + let author; + if (message.u._id === visitor._id) { + author = i18n.t('You', { lng: userLanguage }); + } else { + author = showAgentInfo ? message.u.name || message.u.username : i18n.t('Agent', { lng: userLanguage }); + } + + const isSystemMessage = MessageTypes.isSystemMessage(message); + const messageType = isSystemMessage && MessageTypes.getType(message); + + let messageContent = messageType + ? `${i18n.t( + messageType.message, + messageType.data + ? { ...messageType.data(message), interpolation: { escapeValue: false } } + : { interpolation: { escapeValue: false } }, + )}` + : message.msg; + + let filesHTML = ''; + + if (message.attachments && message.attachments?.length > 0) { + messageContent = message.attachments[0].description || ''; + + for await (const attachment of message.attachments) { + if (!isFileAttachment(attachment)) { + // ignore other types of attachments + continue; + } + + if (!isFileImageAttachment(attachment)) { + filesHTML += `
${attachment.title || ''}${InvalidFileMessage}
`; + continue; + } + + if (!attachment.image_type || !acceptableImageMimeTypes.includes(attachment.image_type)) { + filesHTML += `
${attachment.title || ''}${InvalidFileMessage}
`; + continue; + } + + // Image attachment can be rendered in email body + const file = message.files?.find((file) => file.name === attachment.title); + + if (!file) { + filesHTML += `
${attachment.title || ''}${InvalidFileMessage}
`; + continue; + } + + const uploadedFile = await Uploads.findOneById(file._id); + + if (!uploadedFile) { + filesHTML += `
${file.name}${InvalidFileMessage}
`; + continue; + } + + const uploadedFileBuffer = await FileUpload.getBuffer(uploadedFile); + filesHTML += `

${file.name}

`; + } + } + + const datetime = moment.tz(message.ts, timezone).locale(userLanguage).format('LLL'); + const singleMessage = ` +

${author} ${datetime}

+

${messageContent}

+

${filesHTML}

+ `; + html += singleMessage; + } + + html = `${html}
`; + + const fromEmail = settings.get('From_Email').match(/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b/i); + let emailFromRegexp = ''; + if (fromEmail) { + emailFromRegexp = fromEmail[0]; + } else { + emailFromRegexp = settings.get('From_Email'); + } + + // Some endpoints allow the caller to pass a different `subject` via parameter. + // IF subject is passed, we'll use that one and treat it as an override + // IF no subject is passed, we fallback to the setting `Livechat_transcript_email_subject` + // IF that is not configured, we fallback to 'Transcript of your livechat conversation', which is the default value + // As subject and setting value are user input, we don't translate them + const mailSubject = + subject || + settings.get('Livechat_transcript_email_subject') || + i18n.t('Transcript_of_your_livechat_conversation', { lng: userLanguage }); + + await Mailer.send({ + to: email, + from: emailFromRegexp, + replyTo: emailFromRegexp, + subject: mailSubject, + html, + }); + + setImmediate(() => { + void callbacks.run('livechat.sendTranscript', messages, email); + }); + + const requestData: IOmnichannelSystemMessage['requestData'] = { + type: 'user', + visitor, + user, + }; + + if (!user?.username) { + const cat = await Users.findOneById('rocket.cat', { projection: { _id: 1, username: 1, name: 1 } }); + if (cat) { + requestData.user = cat; + requestData.type = 'visitor'; + } + } + + if (!requestData.user) { + logger.error('rocket.cat user not found'); + throw new Error('No user provided and rocket.cat not found'); + } + + await Message.saveSystemMessage('livechat_transcript_history', room._id, '', requestData.user, { + requestData, + }); + + return true; +} diff --git a/apps/meteor/app/livechat/server/methods/addAgent.ts b/apps/meteor/app/livechat/server/methods/addAgent.ts index 6160db590ece..0551e985e18e 100644 --- a/apps/meteor/app/livechat/server/methods/addAgent.ts +++ b/apps/meteor/app/livechat/server/methods/addAgent.ts @@ -1,12 +1,12 @@ import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:addAgent'(username: string): Promise; diff --git a/apps/meteor/app/livechat/server/methods/addManager.ts b/apps/meteor/app/livechat/server/methods/addManager.ts index 347c4f07d63f..a954d8111773 100644 --- a/apps/meteor/app/livechat/server/methods/addManager.ts +++ b/apps/meteor/app/livechat/server/methods/addManager.ts @@ -1,12 +1,12 @@ import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:addManager'(username: string): Promise; diff --git a/apps/meteor/app/livechat/server/methods/changeLivechatStatus.ts b/apps/meteor/app/livechat/server/methods/changeLivechatStatus.ts index 8ccfcd5ec468..f45588cad6d3 100644 --- a/apps/meteor/app/livechat/server/methods/changeLivechatStatus.ts +++ b/apps/meteor/app/livechat/server/methods/changeLivechatStatus.ts @@ -1,13 +1,13 @@ import { ILivechatAgentStatus } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat as LivechatTS } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:changeLivechatStatus'(params?: { status?: ILivechatAgentStatus; agentId?: string }): unknown; diff --git a/apps/meteor/app/livechat/server/methods/closeRoom.ts b/apps/meteor/app/livechat/server/methods/closeRoom.ts index 5fdf9e7d504f..19c8b2709389 100644 --- a/apps/meteor/app/livechat/server/methods/closeRoom.ts +++ b/apps/meteor/app/livechat/server/methods/closeRoom.ts @@ -1,6 +1,6 @@ import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users, LivechatRooms, Subscriptions as SubscriptionRaw } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; @@ -35,7 +35,7 @@ type LivechatCloseRoomOptions = Omit }; }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:closeRoom'(roomId: string, comment?: string, options?: CloseRoomOptions): void; diff --git a/apps/meteor/app/livechat/server/methods/discardTranscript.ts b/apps/meteor/app/livechat/server/methods/discardTranscript.ts index d46c8ffea35f..3265aa9c54d2 100644 --- a/apps/meteor/app/livechat/server/methods/discardTranscript.ts +++ b/apps/meteor/app/livechat/server/methods/discardTranscript.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:discardTranscript'(rid: string): boolean; diff --git a/apps/meteor/app/livechat/server/methods/getAgentData.ts b/apps/meteor/app/livechat/server/methods/getAgentData.ts index d32d24d7f7c1..5fe58560806e 100644 --- a/apps/meteor/app/livechat/server/methods/getAgentData.ts +++ b/apps/meteor/app/livechat/server/methods/getAgentData.ts @@ -1,13 +1,13 @@ import type { ILivechatAgent } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors, LivechatRooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { settings } from '../../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getAgentData'(params: { diff --git a/apps/meteor/app/livechat/server/methods/getAgentOverviewData.ts b/apps/meteor/app/livechat/server/methods/getAgentOverviewData.ts index b5ea8dafe92c..819bac03c5b4 100644 --- a/apps/meteor/app/livechat/server/methods/getAgentOverviewData.ts +++ b/apps/meteor/app/livechat/server/methods/getAgentOverviewData.ts @@ -1,13 +1,13 @@ import type { ConversationData } from '@rocket.chat/core-services'; import { OmnichannelAnalytics } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getAgentOverviewData'(options: { chartOptions: { name: string } }): ConversationData | void; diff --git a/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.ts b/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.ts index 85c8e033b8f5..2ff682c1c39c 100644 --- a/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.ts +++ b/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.ts @@ -1,12 +1,12 @@ import type { ChartDataResult } from '@rocket.chat/core-services'; import { OmnichannelAnalytics } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getAnalyticsChartData'(options: { chartOptions: { name: string } }): ChartDataResult | void; diff --git a/apps/meteor/app/livechat/server/methods/getAnalyticsOverviewData.ts b/apps/meteor/app/livechat/server/methods/getAnalyticsOverviewData.ts index c9bb3d163457..9f56cfa57069 100644 --- a/apps/meteor/app/livechat/server/methods/getAnalyticsOverviewData.ts +++ b/apps/meteor/app/livechat/server/methods/getAnalyticsOverviewData.ts @@ -1,14 +1,14 @@ import type { AnalyticsOverviewDataResult } from '@rocket.chat/core-services'; import { OmnichannelAnalytics } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { settings } from '../../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getAnalyticsOverviewData'(options: { analyticsOptions: { name: string } }): AnalyticsOverviewDataResult[] | void; diff --git a/apps/meteor/app/livechat/server/methods/getCustomFields.ts b/apps/meteor/app/livechat/server/methods/getCustomFields.ts index ec0ac35d6c21..36dca08f0859 100644 --- a/apps/meteor/app/livechat/server/methods/getCustomFields.ts +++ b/apps/meteor/app/livechat/server/methods/getCustomFields.ts @@ -1,11 +1,11 @@ import type { ILivechatCustomField } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatCustomField } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getCustomFields'(): ILivechatCustomField[]; diff --git a/apps/meteor/app/livechat/server/methods/getDepartmentForwardRestrictions.ts b/apps/meteor/app/livechat/server/methods/getDepartmentForwardRestrictions.ts index b26d9706a8cd..2b891514d03e 100644 --- a/apps/meteor/app/livechat/server/methods/getDepartmentForwardRestrictions.ts +++ b/apps/meteor/app/livechat/server/methods/getDepartmentForwardRestrictions.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getDepartmentForwardRestrictions'(departmentId: string): unknown; diff --git a/apps/meteor/app/livechat/server/methods/getFirstRoomMessage.ts b/apps/meteor/app/livechat/server/methods/getFirstRoomMessage.ts index 197898e8d2b2..d8accf7f84f5 100644 --- a/apps/meteor/app/livechat/server/methods/getFirstRoomMessage.ts +++ b/apps/meteor/app/livechat/server/methods/getFirstRoomMessage.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms, Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getFirstRoomMessage'(params: { rid: string }): unknown; diff --git a/apps/meteor/app/livechat/server/methods/getNextAgent.ts b/apps/meteor/app/livechat/server/methods/getNextAgent.ts index 53b8441cad2e..179f1f95dedf 100644 --- a/apps/meteor/app/livechat/server/methods/getNextAgent.ts +++ b/apps/meteor/app/livechat/server/methods/getNextAgent.ts @@ -1,6 +1,6 @@ import type { ILivechatAgent } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarn import { settings } from '../../../settings/server'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getNextAgent'(params: { diff --git a/apps/meteor/app/livechat/server/methods/getRoutingConfig.ts b/apps/meteor/app/livechat/server/methods/getRoutingConfig.ts index 364853a74511..02b2840f41cc 100644 --- a/apps/meteor/app/livechat/server/methods/getRoutingConfig.ts +++ b/apps/meteor/app/livechat/server/methods/getRoutingConfig.ts @@ -1,10 +1,10 @@ import type { OmichannelRoutingConfig } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { RoutingManager } from '../lib/RoutingManager'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getRoutingConfig'(): OmichannelRoutingConfig | undefined; diff --git a/apps/meteor/app/livechat/server/methods/getTagsList.ts b/apps/meteor/app/livechat/server/methods/getTagsList.ts index e9e467d243c8..b3efe5d026a3 100644 --- a/apps/meteor/app/livechat/server/methods/getTagsList.ts +++ b/apps/meteor/app/livechat/server/methods/getTagsList.ts @@ -1,11 +1,11 @@ import type { ILivechatTag } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:getTagsList'(): ILivechatTag[]; diff --git a/apps/meteor/app/livechat/server/methods/loadHistory.ts b/apps/meteor/app/livechat/server/methods/loadHistory.ts index 373ede1a3610..1004f9dd604d 100644 --- a/apps/meteor/app/livechat/server/methods/loadHistory.ts +++ b/apps/meteor/app/livechat/server/methods/loadHistory.ts @@ -1,13 +1,13 @@ import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors, LivechatRooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check, Match } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { loadMessageHistory } from '../../../lib/server/functions/loadMessageHistory'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:loadHistory'(params: { token: string; rid: string; end?: Date; limit?: number; ls: Date }): diff --git a/apps/meteor/app/livechat/server/methods/loginByToken.ts b/apps/meteor/app/livechat/server/methods/loginByToken.ts index cae23e6d16f7..3b82413e038a 100644 --- a/apps/meteor/app/livechat/server/methods/loginByToken.ts +++ b/apps/meteor/app/livechat/server/methods/loginByToken.ts @@ -1,10 +1,10 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:loginByToken'(token: string): { _id: string } | undefined; diff --git a/apps/meteor/app/livechat/server/methods/pageVisited.ts b/apps/meteor/app/livechat/server/methods/pageVisited.ts index c226a91de430..7c0864f27b74 100644 --- a/apps/meteor/app/livechat/server/methods/pageVisited.ts +++ b/apps/meteor/app/livechat/server/methods/pageVisited.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:pageVisited'(token: string, room: string, pageInfo: { title: string; location: { href: string }; change: string }): void; diff --git a/apps/meteor/app/livechat/server/methods/registerGuest.ts b/apps/meteor/app/livechat/server/methods/registerGuest.ts index 4a531d0c89e5..c6a119d91591 100644 --- a/apps/meteor/app/livechat/server/methods/registerGuest.ts +++ b/apps/meteor/app/livechat/server/methods/registerGuest.ts @@ -1,13 +1,13 @@ import type { ILivechatVisitor, IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors, Messages, LivechatRooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat as LivechatTyped } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:registerGuest'({ diff --git a/apps/meteor/app/livechat/server/methods/removeAgent.ts b/apps/meteor/app/livechat/server/methods/removeAgent.ts index 643ae696ada0..ebb57383784f 100644 --- a/apps/meteor/app/livechat/server/methods/removeAgent.ts +++ b/apps/meteor/app/livechat/server/methods/removeAgent.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeAgent'(username: string): boolean; diff --git a/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts b/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts index 9be699ae05ed..ba3939bb8573 100644 --- a/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts +++ b/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts @@ -1,14 +1,14 @@ import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Logger } from '@rocket.chat/logger'; import { LivechatRooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeAllClosedRooms'(departmentIds?: string[]): Promise; diff --git a/apps/meteor/app/livechat/server/methods/removeCustomField.ts b/apps/meteor/app/livechat/server/methods/removeCustomField.ts index 1d3e7c817738..ad02df582337 100644 --- a/apps/meteor/app/livechat/server/methods/removeCustomField.ts +++ b/apps/meteor/app/livechat/server/methods/removeCustomField.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatCustomField } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { DeleteResult } from 'mongodb'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeCustomField'(_id: string): DeleteResult; diff --git a/apps/meteor/app/livechat/server/methods/removeDepartment.ts b/apps/meteor/app/livechat/server/methods/removeDepartment.ts index 3c46f3a424d6..6e4b11c836f6 100644 --- a/apps/meteor/app/livechat/server/methods/removeDepartment.ts +++ b/apps/meteor/app/livechat/server/methods/removeDepartment.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { DeleteResult } from 'mongodb'; @@ -7,7 +7,7 @@ import { hasPermissionAsync } from '../../../authorization/server/functions/hasP import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { DepartmentHelper } from '../lib/Departments'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeDepartment'(_id: string): DeleteResult; diff --git a/apps/meteor/app/livechat/server/methods/removeManager.ts b/apps/meteor/app/livechat/server/methods/removeManager.ts index 4c003ff922bc..85a5f3076c8c 100644 --- a/apps/meteor/app/livechat/server/methods/removeManager.ts +++ b/apps/meteor/app/livechat/server/methods/removeManager.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeManager'(username: string): boolean; diff --git a/apps/meteor/app/livechat/server/methods/removeRoom.ts b/apps/meteor/app/livechat/server/methods/removeRoom.ts index db3fcf2c849f..751d51d4f019 100644 --- a/apps/meteor/app/livechat/server/methods/removeRoom.ts +++ b/apps/meteor/app/livechat/server/methods/removeRoom.ts @@ -1,12 +1,12 @@ import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeRoom'(rid: IRoom['_id']): void; diff --git a/apps/meteor/app/livechat/server/methods/removeTrigger.ts b/apps/meteor/app/livechat/server/methods/removeTrigger.ts index 69f3a4a2d80c..41d79d725176 100644 --- a/apps/meteor/app/livechat/server/methods/removeTrigger.ts +++ b/apps/meteor/app/livechat/server/methods/removeTrigger.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatTrigger } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeTrigger'(triggerId: string): boolean; diff --git a/apps/meteor/app/livechat/server/methods/requestTranscript.ts b/apps/meteor/app/livechat/server/methods/requestTranscript.ts index 5abf6a3b72e3..80cb3a9625fe 100644 --- a/apps/meteor/app/livechat/server/methods/requestTranscript.ts +++ b/apps/meteor/app/livechat/server/methods/requestTranscript.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -7,7 +7,7 @@ import { hasPermissionAsync } from '../../../authorization/server/functions/hasP import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:requestTranscript'(rid: string, email: string, subject: string): Promise; diff --git a/apps/meteor/app/livechat/server/methods/returnAsInquiry.ts b/apps/meteor/app/livechat/server/methods/returnAsInquiry.ts index 38b58b9d2d42..bf76519a5afb 100644 --- a/apps/meteor/app/livechat/server/methods/returnAsInquiry.ts +++ b/apps/meteor/app/livechat/server/methods/returnAsInquiry.ts @@ -1,13 +1,13 @@ import { Omnichannel } from '@rocket.chat/core-services'; import type { ILivechatDepartment, IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:returnAsInquiry'(rid: IRoom['_id'], departmentID?: ILivechatDepartment['_id']): boolean; diff --git a/apps/meteor/app/livechat/server/methods/saveAgentInfo.ts b/apps/meteor/app/livechat/server/methods/saveAgentInfo.ts index 90d9815d4cf1..fe542b67156e 100644 --- a/apps/meteor/app/livechat/server/methods/saveAgentInfo.ts +++ b/apps/meteor/app/livechat/server/methods/saveAgentInfo.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { hasRoleAsync } from '../../../authorization/server/functions/hasRole'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveAgentInfo'(_id: string, agentData: Record, agentDepartments: string[]): unknown; diff --git a/apps/meteor/app/livechat/server/methods/saveAppearance.ts b/apps/meteor/app/livechat/server/methods/saveAppearance.ts index cac5d34264d2..619dae147708 100644 --- a/apps/meteor/app/livechat/server/methods/saveAppearance.ts +++ b/apps/meteor/app/livechat/server/methods/saveAppearance.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { notifyOnSettingChangedById } from '../../../lib/server/lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveAppearance'(settings: { _id: string; value: any }[]): Promise; diff --git a/apps/meteor/app/livechat/server/methods/saveBusinessHour.ts b/apps/meteor/app/livechat/server/methods/saveBusinessHour.ts index 2e3e64365649..9bf32697fae9 100644 --- a/apps/meteor/app/livechat/server/methods/saveBusinessHour.ts +++ b/apps/meteor/app/livechat/server/methods/saveBusinessHour.ts @@ -1,10 +1,10 @@ import type { ILivechatBusinessHour } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { businessHourManager } from '../business-hour'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveBusinessHour'(businessHourData: ILivechatBusinessHour): void; diff --git a/apps/meteor/app/livechat/server/methods/saveCustomField.ts b/apps/meteor/app/livechat/server/methods/saveCustomField.ts index 8a0435560dd5..c83148ba8d29 100644 --- a/apps/meteor/app/livechat/server/methods/saveCustomField.ts +++ b/apps/meteor/app/livechat/server/methods/saveCustomField.ts @@ -1,12 +1,12 @@ import type { ILivechatCustomField } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatCustomField } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveCustomField'( diff --git a/apps/meteor/app/livechat/server/methods/saveDepartment.ts b/apps/meteor/app/livechat/server/methods/saveDepartment.ts index 971c2189f9a7..b4833523ab3f 100644 --- a/apps/meteor/app/livechat/server/methods/saveDepartment.ts +++ b/apps/meteor/app/livechat/server/methods/saveDepartment.ts @@ -1,11 +1,11 @@ import type { ILivechatDepartment } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveDepartment': ( diff --git a/apps/meteor/app/livechat/server/methods/saveDepartmentAgents.ts b/apps/meteor/app/livechat/server/methods/saveDepartmentAgents.ts index 73a471869926..42ee521713c0 100644 --- a/apps/meteor/app/livechat/server/methods/saveDepartmentAgents.ts +++ b/apps/meteor/app/livechat/server/methods/saveDepartmentAgents.ts @@ -1,12 +1,12 @@ import type { ILivechatDepartmentAgents } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveDepartmentAgents'( diff --git a/apps/meteor/app/livechat/server/methods/saveInfo.ts b/apps/meteor/app/livechat/server/methods/saveInfo.ts index a057706fdc23..bb22c127effa 100644 --- a/apps/meteor/app/livechat/server/methods/saveInfo.ts +++ b/apps/meteor/app/livechat/server/methods/saveInfo.ts @@ -1,6 +1,6 @@ import { isOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { hasPermissionAsync } from '../../../authorization/server/functions/hasP import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat as LivechatTyped } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveInfo'( diff --git a/apps/meteor/app/livechat/server/methods/saveIntegration.ts b/apps/meteor/app/livechat/server/methods/saveIntegration.ts index de7461d08e10..0a4d82cfbcc1 100644 --- a/apps/meteor/app/livechat/server/methods/saveIntegration.ts +++ b/apps/meteor/app/livechat/server/methods/saveIntegration.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { trim } from '../../../../lib/utils/stringUtils'; @@ -7,7 +7,7 @@ import { hasPermissionAsync } from '../../../authorization/server/functions/hasP import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { notifyOnSettingChangedById } from '../../../lib/server/lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveIntegration'(values: Record): void; diff --git a/apps/meteor/app/livechat/server/methods/saveSurveyFeedback.ts b/apps/meteor/app/livechat/server/methods/saveSurveyFeedback.ts index 48dea8175ea8..36fc3f775b9f 100644 --- a/apps/meteor/app/livechat/server/methods/saveSurveyFeedback.ts +++ b/apps/meteor/app/livechat/server/methods/saveSurveyFeedback.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms, LivechatVisitors } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { UpdateResult } from 'mongodb'; @@ -7,7 +7,7 @@ import _ from 'underscore'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveSurveyFeedback'( diff --git a/apps/meteor/app/livechat/server/methods/saveTrigger.ts b/apps/meteor/app/livechat/server/methods/saveTrigger.ts index 37f78d081203..850dead9a589 100644 --- a/apps/meteor/app/livechat/server/methods/saveTrigger.ts +++ b/apps/meteor/app/livechat/server/methods/saveTrigger.ts @@ -1,13 +1,13 @@ import type { ILivechatTrigger } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatTrigger } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveTrigger'(trigger: ILivechatTrigger): boolean; diff --git a/apps/meteor/app/livechat/server/methods/searchAgent.ts b/apps/meteor/app/livechat/server/methods/searchAgent.ts index 2a69679f2a07..932eb51e89d6 100644 --- a/apps/meteor/app/livechat/server/methods/searchAgent.ts +++ b/apps/meteor/app/livechat/server/methods/searchAgent.ts @@ -1,12 +1,12 @@ import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:searchAgent'(username: string): { _id: string; username?: string } | undefined; diff --git a/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.ts b/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.ts index 15577abd76e3..0268207b2f6c 100644 --- a/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.ts +++ b/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.ts @@ -5,9 +5,9 @@ import type { VideoAttachmentProps, IUpload, } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors, LivechatRooms } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -21,7 +21,7 @@ interface ISendFileLivechatMessage { msgData?: { avatar?: string; emoji?: string; alias?: string; groupable?: boolean; msg?: string }; } -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { sendFileLivechatMessage( diff --git a/apps/meteor/app/livechat/server/methods/sendMessageLivechat.ts b/apps/meteor/app/livechat/server/methods/sendMessageLivechat.ts index ad16dea23e4f..6fac80397906 100644 --- a/apps/meteor/app/livechat/server/methods/sendMessageLivechat.ts +++ b/apps/meteor/app/livechat/server/methods/sendMessageLivechat.ts @@ -1,6 +1,6 @@ import { OmnichannelSourceType } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -18,7 +18,7 @@ interface ISendMessageLivechat { agent?: ILivechatMessageAgent; } -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { sendMessageLivechat(message: ILivechatMessage, agent: ILivechatMessageAgent): boolean; diff --git a/apps/meteor/app/livechat/server/methods/sendOfflineMessage.ts b/apps/meteor/app/livechat/server/methods/sendOfflineMessage.ts index c3b5537f31be..b620aa434100 100644 --- a/apps/meteor/app/livechat/server/methods/sendOfflineMessage.ts +++ b/apps/meteor/app/livechat/server/methods/sendOfflineMessage.ts @@ -1,4 +1,4 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; @@ -6,7 +6,7 @@ import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:sendOfflineMessage'(data: { name: string; email: string; message: string }): Promise; diff --git a/apps/meteor/app/livechat/server/methods/sendTranscript.ts b/apps/meteor/app/livechat/server/methods/sendTranscript.ts index 366a73c8bb0a..4891f579926a 100644 --- a/apps/meteor/app/livechat/server/methods/sendTranscript.ts +++ b/apps/meteor/app/livechat/server/methods/sendTranscript.ts @@ -1,6 +1,6 @@ import { Omnichannel } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -8,7 +8,7 @@ import { hasPermissionAsync } from '../../../authorization/server/functions/hasP import { RateLimiter } from '../../../lib/server'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:sendTranscript'(token: string, rid: string, email: string, subject: string): boolean; diff --git a/apps/meteor/app/livechat/server/methods/setCustomField.ts b/apps/meteor/app/livechat/server/methods/setCustomField.ts index fb07c2b29a4e..6d3a2384cdd7 100644 --- a/apps/meteor/app/livechat/server/methods/setCustomField.ts +++ b/apps/meteor/app/livechat/server/methods/setCustomField.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors, LivechatCustomField, LivechatRooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import type { UpdateResult, Document } from 'mongodb'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:setCustomField'(token: string, key: string, value: string, overwrite?: boolean): Promise; diff --git a/apps/meteor/app/livechat/server/methods/setDepartmentForVisitor.ts b/apps/meteor/app/livechat/server/methods/setDepartmentForVisitor.ts index a14933ed8d47..385f2d989015 100644 --- a/apps/meteor/app/livechat/server/methods/setDepartmentForVisitor.ts +++ b/apps/meteor/app/livechat/server/methods/setDepartmentForVisitor.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors, Messages, LivechatRooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -7,7 +7,7 @@ import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarn import { normalizeTransferredByData } from '../lib/Helper'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:setDepartmentForVisitor'({ diff --git a/apps/meteor/app/livechat/server/methods/setUpConnection.ts b/apps/meteor/app/livechat/server/methods/setUpConnection.ts index 788b2384c4d3..21ce09acaa22 100644 --- a/apps/meteor/app/livechat/server/methods/setUpConnection.ts +++ b/apps/meteor/app/livechat/server/methods/setUpConnection.ts @@ -1,11 +1,11 @@ import { UserStatus } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:setUpConnection'(data: { token: string }): void; diff --git a/apps/meteor/app/livechat/server/methods/takeInquiry.ts b/apps/meteor/app/livechat/server/methods/takeInquiry.ts index 30a5dabb5717..733cbd995208 100644 --- a/apps/meteor/app/livechat/server/methods/takeInquiry.ts +++ b/apps/meteor/app/livechat/server/methods/takeInquiry.ts @@ -1,13 +1,13 @@ import { Omnichannel } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatInquiry, LivechatRooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { settings } from '../../../settings/server'; import { RoutingManager } from '../lib/RoutingManager'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:takeInquiry'( diff --git a/apps/meteor/app/livechat/server/methods/transfer.ts b/apps/meteor/app/livechat/server/methods/transfer.ts index 64a32c24638c..e0516fa27981 100644 --- a/apps/meteor/app/livechat/server/methods/transfer.ts +++ b/apps/meteor/app/livechat/server/methods/transfer.ts @@ -1,7 +1,7 @@ import { Omnichannel } from '@rocket.chat/core-services'; import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors, LivechatRooms, Subscriptions, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -10,7 +10,7 @@ import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarn import { normalizeTransferredByData } from '../lib/Helper'; import { Livechat } from '../lib/LivechatTyped'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:transfer'(transferData: { diff --git a/apps/meteor/app/livechat/server/methods/webhookTest.ts b/apps/meteor/app/livechat/server/methods/webhookTest.ts index 12a4711d75b4..68800e1a0616 100644 --- a/apps/meteor/app/livechat/server/methods/webhookTest.ts +++ b/apps/meteor/app/livechat/server/methods/webhookTest.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { serverFetch as fetch } from '@rocket.chat/server-fetch'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { SystemLogger } from '../../../../server/lib/logger/system'; @@ -14,7 +14,7 @@ const postCatchError = async function (url: string, options?: Record; diff --git a/apps/meteor/app/livechat/server/sendMessageBySMS.ts b/apps/meteor/app/livechat/server/sendMessageBySMS.ts index 2557fcdeb83d..c7f88646158b 100644 --- a/apps/meteor/app/livechat/server/sendMessageBySMS.ts +++ b/apps/meteor/app/livechat/server/sendMessageBySMS.ts @@ -1,5 +1,5 @@ import { OmnichannelIntegration } from '@rocket.chat/core-services'; -import { isEditedMessage, isOmnichannelRoom } from '@rocket.chat/core-typings'; +import { isEditedMessage } from '@rocket.chat/core-typings'; import { LivechatVisitors } from '@rocket.chat/models'; import { callbacks } from '../../../lib/callbacks'; @@ -8,8 +8,8 @@ import { normalizeMessageFileUpload } from '../../utils/server/functions/normali import { callbackLogger } from './lib/logger'; callbacks.add( - 'afterSaveMessage', - async (message, room) => { + 'afterOmnichannelSaveMessage', + async (message, { room }) => { // skips this callback if the message was edited if (isEditedMessage(message)) { return message; @@ -20,7 +20,7 @@ callbacks.add( } // only send the sms by SMS if it is a livechat room with SMS set to true - if (!(isOmnichannelRoom(room) && room.sms && room.v && room.v.token)) { + if (!(room.sms && room.v && room.v.token)) { return message; } diff --git a/apps/meteor/app/livechat/server/startup.ts b/apps/meteor/app/livechat/server/startup.ts index b61c85c4001e..32cf01d2e640 100644 --- a/apps/meteor/app/livechat/server/startup.ts +++ b/apps/meteor/app/livechat/server/startup.ts @@ -87,7 +87,7 @@ Meteor.startup(async () => { }); // Remove when accounts.onLogout is async - Accounts.onLogout(({ user }: { user: IUser }) => { + Accounts.onLogout(({ user }: { user?: IUser }) => { if (!user?.roles?.includes('livechat-agent') || user?.roles?.includes('bot')) { return; } diff --git a/apps/meteor/app/mail-messages/server/methods/sendMail.ts b/apps/meteor/app/mail-messages/server/methods/sendMail.ts index 158d271d5379..cc6469544df8 100644 --- a/apps/meteor/app/mail-messages/server/methods/sendMail.ts +++ b/apps/meteor/app/mail-messages/server/methods/sendMail.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Mailer } from '../lib/Mailer'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'Mailer.sendMail'(from: string, subject: string, body: string, dryrun?: boolean, query?: string): any; diff --git a/apps/meteor/app/mail-messages/server/methods/unsubscribe.ts b/apps/meteor/app/mail-messages/server/methods/unsubscribe.ts index 24243cc98c2d..e52677b5ee1a 100644 --- a/apps/meteor/app/mail-messages/server/methods/unsubscribe.ts +++ b/apps/meteor/app/mail-messages/server/methods/unsubscribe.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { Mailer } from '../lib/Mailer'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'Mailer:unsubscribe'(_id: string, createdAt: string): Promise; diff --git a/apps/meteor/app/mentions/server/methods/getUserMentionsByChannel.ts b/apps/meteor/app/mentions/server/methods/getUserMentionsByChannel.ts index 948187d089ae..6d9a16539704 100644 --- a/apps/meteor/app/mentions/server/methods/getUserMentionsByChannel.ts +++ b/apps/meteor/app/mentions/server/methods/getUserMentionsByChannel.ts @@ -1,12 +1,12 @@ import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Users, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomAsync } from '../../../authorization/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getUserMentionsByChannel(params: { roomId: string; options: { limit: number; sort: { ts: -1 | 1 } } }): IMessage[]; diff --git a/apps/meteor/app/message-mark-as-unread/server/unreadMessages.ts b/apps/meteor/app/message-mark-as-unread/server/unreadMessages.ts index 2ba0224a0c70..6ef1f5567a20 100644 --- a/apps/meteor/app/message-mark-as-unread/server/unreadMessages.ts +++ b/apps/meteor/app/message-mark-as-unread/server/unreadMessages.ts @@ -1,11 +1,11 @@ import type { IMessage, IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import logger from './logger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { unreadMessages(firstUnreadMessage?: IMessage, room?: IRoom['_id']): void; diff --git a/apps/meteor/app/message-pin/server/pinMessage.ts b/apps/meteor/app/message-pin/server/pinMessage.ts index b0eab3f929d6..9f3dd44cc16d 100644 --- a/apps/meteor/app/message-pin/server/pinMessage.ts +++ b/apps/meteor/app/message-pin/server/pinMessage.ts @@ -2,17 +2,16 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import { Message } from '@rocket.chat/core-services'; import { isQuoteAttachment, isRegisterUser } from '@rocket.chat/core-typings'; import type { IMessage, MessageAttachment, MessageQuoteAttachment } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Rooms, Subscriptions, Users, ReadReceipts } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { isTruthy } from '../../../lib/isTruthy'; -import { broadcastMessageFromData } from '../../../server/modules/watchers/lib/messages'; import { canAccessRoomAsync, roomAccessAttributes } from '../../authorization/server'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { isTheLastMessage } from '../../lib/server/functions/isTheLastMessage'; -import { notifyOnRoomChangedById } from '../../lib/server/lib/notifyListener'; +import { notifyOnRoomChangedById, notifyOnMessageChange } from '../../lib/server/lib/notifyListener'; import { settings } from '../../settings/server'; import { getUserAvatarURL } from '../../utils/server/getUserAvatarURL'; @@ -36,7 +35,7 @@ const recursiveRemove = (msg: MessageAttachment, deep = 1) => { const shouldAdd = (attachments: MessageAttachment[], attachment: MessageQuoteAttachment) => !attachments.some((_attachment) => isQuoteAttachment(_attachment) && _attachment.message_link === attachment.message_link); -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { pinMessage(message: IMessage, pinnedAt?: Date): IMessage | null; @@ -135,7 +134,7 @@ Meteor.methods({ const pinMessageType = originalMessage.t === 'e2e' ? 'message_pinned_e2e' : 'message_pinned'; - const msgId = await Message.saveSystemMessage(pinMessageType, originalMessage.rid, '', me, { + return Message.saveSystemMessage(pinMessageType, originalMessage.rid, '', me, { attachments: [ { text: originalMessage.msg, @@ -146,8 +145,6 @@ Meteor.methods({ }, ], }); - - return Messages.findOneById(msgId); }, async unpinMessage(message) { check(message._id, String); @@ -227,7 +224,7 @@ Meteor.methods({ if (settings.get('Message_Read_Receipt_Store_Users')) { await ReadReceipts.setPinnedByMessageId(originalMessage._id, originalMessage.pinned); } - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: message._id, }); diff --git a/apps/meteor/app/message-star/server/starMessage.ts b/apps/meteor/app/message-star/server/starMessage.ts index 4529efb63f6f..36c67c1f4020 100644 --- a/apps/meteor/app/message-star/server/starMessage.ts +++ b/apps/meteor/app/message-star/server/starMessage.ts @@ -1,16 +1,15 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -import { broadcastMessageFromData } from '../../../server/modules/watchers/lib/messages'; import { canAccessRoomAsync, roomAccessAttributes } from '../../authorization/server'; import { isTheLastMessage } from '../../lib/server/functions/isTheLastMessage'; -import { notifyOnRoomChangedById } from '../../lib/server/lib/notifyListener'; +import { notifyOnRoomChangedById, notifyOnMessageChange } from '../../lib/server/lib/notifyListener'; import { settings } from '../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { starMessage(message: Omit & { starred: boolean }): boolean; @@ -63,7 +62,7 @@ Meteor.methods({ await Messages.updateUserStarById(message._id, uid, message.starred); - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: message._id, }); diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts index 5c16716720b0..bb9567260337 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/settings.ts @@ -230,12 +230,10 @@ export const addSettings = async function (name: string): Promise { await this.add(`SAML_Custom_${name}_button_label_color`, '#FFFFFF', { type: 'string', i18nLabel: 'Accounts_OAuth_Custom_Button_Label_Color', - alert: 'OAuth_button_colors_alert', }); await this.add(`SAML_Custom_${name}_button_color`, '#1d74f5', { type: 'string', i18nLabel: 'Accounts_OAuth_Custom_Button_Color', - alert: 'OAuth_button_colors_alert', }); }); diff --git a/apps/meteor/app/meteor-accounts-saml/server/methods/addSamlService.ts b/apps/meteor/app/meteor-accounts-saml/server/methods/addSamlService.ts index f952ce3b3fe3..0b6b5a6c8f6e 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/methods/addSamlService.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/methods/addSamlService.ts @@ -1,9 +1,9 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { addSamlService } from '../lib/settings'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addSamlService(name: string): void; diff --git a/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts b/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts index 956426082d40..a7f9e87a93de 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/methods/samlLogout.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import type { IServiceProviderOptions } from '../definition/IServiceProviderOptions'; @@ -25,7 +25,7 @@ function getSamlServiceProviderOptions(provider: string): IServiceProviderOption return providers.filter(samlProvider)[0]; } -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { samlLogout(provider: string): string | undefined; diff --git a/apps/meteor/app/models/client/models/Users.ts b/apps/meteor/app/models/client/models/Users.ts index 089486f3a20c..26d333cc8bb1 100644 --- a/apps/meteor/app/models/client/models/Users.ts +++ b/apps/meteor/app/models/client/models/Users.ts @@ -30,5 +30,13 @@ class UsersCollection extends Mongo.Collection { } } +Object.assign(Meteor.users, { + _connection: undefined, + findOneById: UsersCollection.prototype.findOneById, + isUserInRole: UsersCollection.prototype.isUserInRole, + findUsersInRoles: UsersCollection.prototype.findUsersInRoles, + remove: UsersCollection.prototype.remove, +}); + /** @deprecated */ -export const Users = new UsersCollection(); +export const Users = Meteor.users as UsersCollection; diff --git a/apps/meteor/app/notifications/server/lib/Notifications.ts b/apps/meteor/app/notifications/server/lib/Notifications.ts index ed4985777414..3ddb611d76bd 100644 --- a/apps/meteor/app/notifications/server/lib/Notifications.ts +++ b/apps/meteor/app/notifications/server/lib/Notifications.ts @@ -1,5 +1,5 @@ import { api } from '@rocket.chat/core-services'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { DDPCommon } from 'meteor/ddp-common'; import { Meteor } from 'meteor/meteor'; diff --git a/apps/meteor/app/notifications/server/lib/Presence.ts b/apps/meteor/app/notifications/server/lib/Presence.ts index 9955b687701f..17f35a9d39ff 100644 --- a/apps/meteor/app/notifications/server/lib/Presence.ts +++ b/apps/meteor/app/notifications/server/lib/Presence.ts @@ -1,6 +1,6 @@ import type { IUser } from '@rocket.chat/core-typings'; +import type { StreamerEvents } from '@rocket.chat/ddp-client'; import { Emitter } from '@rocket.chat/emitter'; -import type { StreamerEvents } from '@rocket.chat/ui-contexts'; import type { IPublication, IStreamerConstructor, Connection, IStreamer } from 'meteor/rocketchat:streamer'; type UserPresenceStreamProps = { diff --git a/apps/meteor/app/oauth2-server-config/server/admin/methods/addOAuthApp.ts b/apps/meteor/app/oauth2-server-config/server/admin/methods/addOAuthApp.ts index 4556a5be7d9f..3f41b1b01bea 100644 --- a/apps/meteor/app/oauth2-server-config/server/admin/methods/addOAuthApp.ts +++ b/apps/meteor/app/oauth2-server-config/server/admin/methods/addOAuthApp.ts @@ -1,12 +1,12 @@ import type { IOAuthApps } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import type { OauthAppsAddParams } from '@rocket.chat/rest-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../../lib/server/lib/deprecationWarningLogger'; import { addOAuthApp } from '../functions/addOAuthApp'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addOAuthApp(application: OauthAppsAddParams): IOAuthApps; diff --git a/apps/meteor/app/oauth2-server-config/server/admin/methods/deleteOAuthApp.ts b/apps/meteor/app/oauth2-server-config/server/admin/methods/deleteOAuthApp.ts index 0209f9d453b5..9c5cbf6fd9ae 100644 --- a/apps/meteor/app/oauth2-server-config/server/admin/methods/deleteOAuthApp.ts +++ b/apps/meteor/app/oauth2-server-config/server/admin/methods/deleteOAuthApp.ts @@ -1,11 +1,11 @@ import type { IOAuthApps } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { OAuthAccessTokens, OAuthApps, OAuthAuthCodes } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteOAuthApp(applicationId: IOAuthApps['_id']): boolean; diff --git a/apps/meteor/app/oauth2-server-config/server/admin/methods/updateOAuthApp.ts b/apps/meteor/app/oauth2-server-config/server/admin/methods/updateOAuthApp.ts index 525d0fa2d124..f2daca1885c9 100644 --- a/apps/meteor/app/oauth2-server-config/server/admin/methods/updateOAuthApp.ts +++ b/apps/meteor/app/oauth2-server-config/server/admin/methods/updateOAuthApp.ts @@ -1,12 +1,12 @@ import type { IOAuthApps } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { OAuthApps, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; import { parseUriList } from '../functions/parseUriList'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { updateOAuthApp( diff --git a/apps/meteor/app/otr/server/methods/deleteOldOTRMessages.ts b/apps/meteor/app/otr/server/methods/deleteOldOTRMessages.ts index a994b19dd1a4..1b57c65b4bb7 100644 --- a/apps/meteor/app/otr/server/methods/deleteOldOTRMessages.ts +++ b/apps/meteor/app/otr/server/methods/deleteOldOTRMessages.ts @@ -1,9 +1,9 @@ import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Subscriptions, ReadReceipts } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteOldOTRMessages(roomId: IRoom['_id']): Promise; diff --git a/apps/meteor/app/otr/server/methods/sendSystemMessages.ts b/apps/meteor/app/otr/server/methods/sendSystemMessages.ts index a2abf0938b9e..13abbd7511af 100644 --- a/apps/meteor/app/otr/server/methods/sendSystemMessages.ts +++ b/apps/meteor/app/otr/server/methods/sendSystemMessages.ts @@ -1,7 +1,7 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { sendSystemMessages(rid: string, user: string | undefined, id: string): void; diff --git a/apps/meteor/app/otr/server/methods/updateOTRAck.ts b/apps/meteor/app/otr/server/methods/updateOTRAck.ts index a5a502ddf1a2..4fbd182e9d27 100644 --- a/apps/meteor/app/otr/server/methods/updateOTRAck.ts +++ b/apps/meteor/app/otr/server/methods/updateOTRAck.ts @@ -1,9 +1,9 @@ import { api } from '@rocket.chat/core-services'; import type { IOTRMessage } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { updateOTRAck({ message, ack }: { message: IOTRMessage; ack: string }): void; diff --git a/apps/meteor/app/push-notifications/server/methods/saveNotificationSettings.ts b/apps/meteor/app/push-notifications/server/methods/saveNotificationSettings.ts index a4376c709275..a86ded6f24e5 100644 --- a/apps/meteor/app/push-notifications/server/methods/saveNotificationSettings.ts +++ b/apps/meteor/app/push-notifications/server/methods/saveNotificationSettings.ts @@ -1,6 +1,6 @@ import type { ISubscription } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { getUserNotificationPreference } from '../../../utils/server/getUserNoti const saveAudioNotificationValue = (subId: ISubscription['_id'], value: string) => value === 'default' ? Subscriptions.clearAudioNotificationValueById(subId) : Subscriptions.updateAudioNotificationValueById(subId, value); -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { saveNotificationSettings( diff --git a/apps/meteor/app/push/server/methods.ts b/apps/meteor/app/push/server/methods.ts index 364a16cbdb5e..1f1e261eccae 100644 --- a/apps/meteor/app/push/server/methods.ts +++ b/apps/meteor/app/push/server/methods.ts @@ -1,7 +1,7 @@ import type { IAppsTokens } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { AppsTokens } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Accounts } from 'meteor/accounts-base'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { Meteor } from 'meteor/meteor'; import { logger } from './logger'; import { _matchToken } from './push'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'raix:push-update'(options: { diff --git a/apps/meteor/app/reactions/client/methods/setReaction.ts b/apps/meteor/app/reactions/client/methods/setReaction.ts index a38e6c156790..ed15cda9ab8e 100644 --- a/apps/meteor/app/reactions/client/methods/setReaction.ts +++ b/apps/meteor/app/reactions/client/methods/setReaction.ts @@ -1,5 +1,5 @@ import type { IMessage, IRoom } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { roomCoordinator } from '../../../../client/lib/rooms/roomCoordinator'; diff --git a/apps/meteor/app/reactions/server/setReaction.ts b/apps/meteor/app/reactions/server/setReaction.ts index 896e5041bd61..e35103e9d333 100644 --- a/apps/meteor/app/reactions/server/setReaction.ts +++ b/apps/meteor/app/reactions/server/setReaction.ts @@ -1,19 +1,18 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import { api } from '@rocket.chat/core-services'; import type { IMessage, IRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, EmojiCustom, Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; import { callbacks } from '../../../lib/callbacks'; import { i18n } from '../../../server/lib/i18n'; -import { broadcastMessageFromData } from '../../../server/modules/watchers/lib/messages'; import { canAccessRoomAsync } from '../../authorization/server'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { emoji } from '../../emoji/server'; import { isTheLastMessage } from '../../lib/server/functions/isTheLastMessage'; -import { notifyOnRoomChangedById } from '../../lib/server/lib/notifyListener'; +import { notifyOnRoomChangedById, notifyOnMessageChange } from '../../lib/server/lib/notifyListener'; const removeUserReaction = (message: IMessage, reaction: string, username: string) => { if (!message.reactions) { @@ -111,7 +110,7 @@ async function setReaction(room: IRoom, user: IUser, message: IMessage, reaction await Apps.self?.triggerEvent(AppEvents.IPostMessageReacted, message, user, reaction, isReacted); - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: message._id, }); } @@ -140,7 +139,7 @@ export async function executeSetReaction(userId: string, reaction: string, messa return setReaction(room, user, message, reaction, shouldReact); } -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setReaction(reaction: string, messageId: IMessage['_id'], shouldReact?: boolean): boolean | undefined; diff --git a/apps/meteor/app/retention-policy/server/cronPruneMessages.ts b/apps/meteor/app/retention-policy/server/cronPruneMessages.ts index 337691bfbe57..640aa517a679 100644 --- a/apps/meteor/app/retention-policy/server/cronPruneMessages.ts +++ b/apps/meteor/app/retention-policy/server/cronPruneMessages.ts @@ -6,13 +6,20 @@ import { getCronAdvancedTimerFromPrecisionSetting } from '../../../lib/getCronAd import { cleanRoomHistory } from '../../lib/server/functions/cleanRoomHistory'; import { settings } from '../../settings/server'; -const maxTimes = { - c: 0, - p: 0, - d: 0, +type RetentionRoomTypes = 'c' | 'p' | 'd'; + +const getMaxAgeSettingIdByRoomType = (type: RetentionRoomTypes) => { + switch (type) { + case 'c': + return settings.get('RetentionPolicy_TTL_Channels'); + case 'p': + return settings.get('RetentionPolicy_TTL_Groups'); + case 'd': + return settings.get('RetentionPolicy_TTL_DMs'); + } }; -let types: (keyof typeof maxTimes)[] = []; +let types: RetentionRoomTypes[] = []; const oldest = new Date('0001-01-01T00:00:00Z'); @@ -29,7 +36,7 @@ async function job(): Promise { // get all rooms with default values for await (const type of types) { - const maxAge = maxTimes[type] || 0; + const maxAge = getMaxAgeSettingIdByRoomType(type) || 0; const latest = new Date(now.getTime() - maxAge); const rooms = await Rooms.find( @@ -95,9 +102,6 @@ settings.watchMultiple( 'RetentionPolicy_AppliesToChannels', 'RetentionPolicy_AppliesToGroups', 'RetentionPolicy_AppliesToDMs', - 'RetentionPolicy_TTL_Channels', - 'RetentionPolicy_TTL_Groups', - 'RetentionPolicy_TTL_DMs', 'RetentionPolicy_Advanced_Precision', 'RetentionPolicy_Advanced_Precision_Cron', 'RetentionPolicy_Precision', @@ -120,10 +124,6 @@ settings.watchMultiple( types.push('d'); } - maxTimes.c = settings.get('RetentionPolicy_TTL_Channels'); - maxTimes.p = settings.get('RetentionPolicy_TTL_Groups'); - maxTimes.d = settings.get('RetentionPolicy_TTL_DMs'); - const precision = (settings.get('RetentionPolicy_Advanced_Precision') && settings.get('RetentionPolicy_Advanced_Precision_Cron')) || getCronAdvancedTimerFromPrecisionSetting(settings.get('RetentionPolicy_Precision')); diff --git a/apps/meteor/app/search/server/methods.ts b/apps/meteor/app/search/server/methods.ts index 686b5b429e96..cdb3b4180f7a 100644 --- a/apps/meteor/app/search/server/methods.ts +++ b/apps/meteor/app/search/server/methods.ts @@ -1,12 +1,12 @@ import type { IMessageSearchProvider, IMessageSearchSuggestion, IRoom, IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { SearchLogger } from './logger/logger'; import type { IRawSearchResult, ISearchResult } from './model/ISearchResult'; import { searchProviderService, validationService } from './service'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'rocketchatSearch.getProvider'(): IMessageSearchProvider | undefined; diff --git a/apps/meteor/app/settings/server/SettingsRegistry.ts b/apps/meteor/app/settings/server/SettingsRegistry.ts index 443e38ce5d63..d7d2fa0a79f8 100644 --- a/apps/meteor/app/settings/server/SettingsRegistry.ts +++ b/apps/meteor/app/settings/server/SettingsRegistry.ts @@ -73,7 +73,7 @@ const compareSettingsIgnoringKeys = .filter((key) => !keys.includes(key as keyof ISetting)) .every((key) => isEqual(a[key as keyof ISetting], b[key as keyof ISetting])); -const compareSettings = compareSettingsIgnoringKeys([ +export const compareSettings = compareSettingsIgnoringKeys([ 'value', 'ts', 'createdAt', @@ -138,22 +138,18 @@ export class SettingsRegistry { const settingFromCodeOverwritten = overwriteSetting(settingFromCode); - const settingOverwrittenDefault = overrideSetting(settingFromCode); - const settingStored = this.store.getSetting(_id); const settingStoredOverwritten = settingStored && overwriteSetting(settingStored); - const isOverwritten = settingFromCode !== settingFromCodeOverwritten || (settingStored && settingStored !== settingStoredOverwritten); - - const updatedSettingAfterApplyingOverwrite = isOverwritten ? settingFromCodeOverwritten : settingOverwrittenDefault; - try { validateSetting(settingFromCode._id, settingFromCode.type, settingFromCode.value); } catch (e) { IS_DEVELOPMENT && SystemLogger.error(`Invalid setting code ${_id}: ${(e as Error).message}`); } + const isOverwritten = settingFromCode !== settingFromCodeOverwritten || (settingStored && settingStored !== settingStoredOverwritten); + const { _id: _, ...settingProps } = settingFromCodeOverwritten; if (settingStored && !compareSettings(settingStored, settingFromCodeOverwritten)) { @@ -171,8 +167,9 @@ export class SettingsRegistry { })(); await this.saveUpdatedSetting(_id, updatedProps, removedKeys); - - this.store.set(updatedSettingAfterApplyingOverwrite); + if ('value' in updatedProps) { + this.store.set(updatedProps as ISetting); + } return; } @@ -183,8 +180,7 @@ export class SettingsRegistry { const removedKeys = Object.keys(settingStored).filter((key) => !['_updatedAt'].includes(key) && !overwrittenKeys.includes(key)); await this.saveUpdatedSetting(_id, settingProps, removedKeys); - - this.store.set(updatedSettingAfterApplyingOverwrite); + this.store.set(settingFromCodeOverwritten); } return; } @@ -198,9 +194,13 @@ export class SettingsRegistry { return; } - await this.model.insertOne(updatedSettingAfterApplyingOverwrite); // no need to emit unless we remove the oplog + const settingOverwrittenDefault = overrideSetting(settingFromCode); + + const setting = isOverwritten ? settingFromCodeOverwritten : settingOverwrittenDefault; + + await this.model.insertOne(setting); // no need to emit unless we remove the oplog - this.store.set(updatedSettingAfterApplyingOverwrite); + this.store.set(setting); } /* diff --git a/apps/meteor/app/settings/server/functions/settings.mocks.ts b/apps/meteor/app/settings/server/functions/settings.mocks.ts index 9cd409ba0b83..fb31c3021b1b 100644 --- a/apps/meteor/app/settings/server/functions/settings.mocks.ts +++ b/apps/meteor/app/settings/server/functions/settings.mocks.ts @@ -9,6 +9,12 @@ type Dictionary = { class SettingsClass { settings: ICachedSettings; + private delay = 0; + + setDelay(delay: number): void { + this.delay = delay; + } + find(): any[] { return []; } @@ -65,22 +71,41 @@ class SettingsClass { throw new Error('Invalid upsert'); } - // console.log(query, data); - this.data.set(query._id, data); - - // Can't import before the mock command on end of this file! - // eslint-disable-next-line @typescript-eslint/no-var-requires - this.settings.set(data); + if (this.delay) { + setTimeout(() => { + // console.log(query, data); + this.data.set(query._id, data); + + // Can't import before the mock command on end of this file! + // eslint-disable-next-line @typescript-eslint/no-var-requires + this.settings.set(data); + }, this.delay); + } else { + this.data.set(query._id, data); + // Can't import before the mock command on end of this file! + // eslint-disable-next-line @typescript-eslint/no-var-requires + this.settings.set(data); + } this.upsertCalls++; } + findOneAndUpdate({ _id }: { _id: string }, value: any, options?: any) { + this.updateOne({ _id }, value, options); + return { value: this.findOne({ _id }) }; + } + updateValueById(id: string, value: any): void { this.data.set(id, { ...this.data.get(id), value }); - // Can't import before the mock command on end of this file! // eslint-disable-next-line @typescript-eslint/no-var-requires - this.settings.set(this.data.get(id) as ISetting); + if (this.delay) { + setTimeout(() => { + this.settings.set(this.data.get(id) as ISetting); + }, this.delay); + } else { + this.settings.set(this.data.get(id) as ISetting); + } } } diff --git a/apps/meteor/app/slackbridge/client/slackbridge_import.client.js b/apps/meteor/app/slackbridge/client/slackbridge_import.client.js index 6aeffb7bef45..eebc07ddb72d 100644 --- a/apps/meteor/app/slackbridge/client/slackbridge_import.client.js +++ b/apps/meteor/app/slackbridge/client/slackbridge_import.client.js @@ -1,5 +1,5 @@ import { settings } from '../../settings/client'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; settings.onload('SlackBridge_Enabled', (key, value) => { if (value) { diff --git a/apps/meteor/app/slackbridge/server/SlackAdapter.js b/apps/meteor/app/slackbridge/server/SlackAdapter.js index 78d48deb4993..0263d5369a4c 100644 --- a/apps/meteor/app/slackbridge/server/SlackAdapter.js +++ b/apps/meteor/app/slackbridge/server/SlackAdapter.js @@ -1341,7 +1341,7 @@ export default class SlackAdapter { const user = (await this.rocket.findUser(member)) || (await this.rocket.addUser(member)); if (user) { slackLogger.debug('Adding user to room', user.username, rid); - await addUserToRoom(rid, user, null, true); + await addUserToRoom(rid, user, null, { skipSystemMessage: true }); } } } diff --git a/apps/meteor/app/slackbridge/server/removeChannelLinks.ts b/apps/meteor/app/slackbridge/server/removeChannelLinks.ts index 1a4e6f6a0096..2c89e71f9635 100644 --- a/apps/meteor/app/slackbridge/server/removeChannelLinks.ts +++ b/apps/meteor/app/slackbridge/server/removeChannelLinks.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { settings } from '../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { removeSlackBridgeChannelLinks(): { message: string; params: unknown[] }; diff --git a/apps/meteor/app/slashcommand-asciiarts/client/gimme.ts b/apps/meteor/app/slashcommand-asciiarts/client/gimme.ts index 4c9d6a4e40c8..7cd5edb6bb87 100644 --- a/apps/meteor/app/slashcommand-asciiarts/client/gimme.ts +++ b/apps/meteor/app/slashcommand-asciiarts/client/gimme.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { sdk } from '../../utils/client/lib/SDKClient'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; /* * Gimme is a named function that will replace /gimme commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/client/lenny.ts b/apps/meteor/app/slashcommand-asciiarts/client/lenny.ts index 99eaa03b9e59..0e3cc55f6b86 100644 --- a/apps/meteor/app/slashcommand-asciiarts/client/lenny.ts +++ b/apps/meteor/app/slashcommand-asciiarts/client/lenny.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { sdk } from '../../utils/client/lib/SDKClient'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; /* * Lenny is a named function that will replace /lenny commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/client/shrug.ts b/apps/meteor/app/slashcommand-asciiarts/client/shrug.ts index bc0fb300789e..c4bdec8f1a8c 100644 --- a/apps/meteor/app/slashcommand-asciiarts/client/shrug.ts +++ b/apps/meteor/app/slashcommand-asciiarts/client/shrug.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { sdk } from '../../utils/client/lib/SDKClient'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; /* * Shrug is a named function that will replace /shrug commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/client/tableflip.ts b/apps/meteor/app/slashcommand-asciiarts/client/tableflip.ts index 0d709760fe84..8820b81f7c4a 100644 --- a/apps/meteor/app/slashcommand-asciiarts/client/tableflip.ts +++ b/apps/meteor/app/slashcommand-asciiarts/client/tableflip.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { sdk } from '../../utils/client/lib/SDKClient'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; /* * Tableflip is a named function that will replace /Tableflip commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/client/unflip.ts b/apps/meteor/app/slashcommand-asciiarts/client/unflip.ts index a7dc0d257e78..6c02fa196052 100644 --- a/apps/meteor/app/slashcommand-asciiarts/client/unflip.ts +++ b/apps/meteor/app/slashcommand-asciiarts/client/unflip.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { sdk } from '../../utils/client/lib/SDKClient'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; /* * Unflip is a named function that will replace /unflip commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/server/gimme.ts b/apps/meteor/app/slashcommand-asciiarts/server/gimme.ts index f426d6cf85c0..f902d75f33d1 100644 --- a/apps/meteor/app/slashcommand-asciiarts/server/gimme.ts +++ b/apps/meteor/app/slashcommand-asciiarts/server/gimme.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { executeSendMessage } from '../../lib/server/methods/sendMessage'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Gimme is a named function that will replace /gimme commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/server/lenny.ts b/apps/meteor/app/slashcommand-asciiarts/server/lenny.ts index 878a10e356d4..e760b5a1169e 100644 --- a/apps/meteor/app/slashcommand-asciiarts/server/lenny.ts +++ b/apps/meteor/app/slashcommand-asciiarts/server/lenny.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { executeSendMessage } from '../../lib/server/methods/sendMessage'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Lenny is a named function that will replace /lenny commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/server/shrug.ts b/apps/meteor/app/slashcommand-asciiarts/server/shrug.ts index 1240027bb38f..c2e5d166bfd8 100644 --- a/apps/meteor/app/slashcommand-asciiarts/server/shrug.ts +++ b/apps/meteor/app/slashcommand-asciiarts/server/shrug.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { executeSendMessage } from '../../lib/server/methods/sendMessage'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Shrug is a named function that will replace /shrug commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/server/tableflip.ts b/apps/meteor/app/slashcommand-asciiarts/server/tableflip.ts index 34acef9805e2..ac3f599dff1d 100644 --- a/apps/meteor/app/slashcommand-asciiarts/server/tableflip.ts +++ b/apps/meteor/app/slashcommand-asciiarts/server/tableflip.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { executeSendMessage } from '../../lib/server/methods/sendMessage'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Tableflip is a named function that will replace /Tableflip commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommand-asciiarts/server/unflip.ts b/apps/meteor/app/slashcommand-asciiarts/server/unflip.ts index 689e7262eac0..b905ed567447 100644 --- a/apps/meteor/app/slashcommand-asciiarts/server/unflip.ts +++ b/apps/meteor/app/slashcommand-asciiarts/server/unflip.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { executeSendMessage } from '../../lib/server/methods/sendMessage'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Unflip is a named function that will replace /unflip commands * @param {Object} message - The message object diff --git a/apps/meteor/app/slashcommands-archiveroom/client/client.ts b/apps/meteor/app/slashcommands-archiveroom/client/client.ts index c24763106684..f5154fb32a5b 100644 --- a/apps/meteor/app/slashcommands-archiveroom/client/client.ts +++ b/apps/meteor/app/slashcommands-archiveroom/client/client.ts @@ -1,4 +1,4 @@ -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'archive', diff --git a/apps/meteor/app/slashcommands-archiveroom/server/server.ts b/apps/meteor/app/slashcommands-archiveroom/server/server.ts index 99bcec2cd7b3..f1b33c1022bb 100644 --- a/apps/meteor/app/slashcommands-archiveroom/server/server.ts +++ b/apps/meteor/app/slashcommands-archiveroom/server/server.ts @@ -10,7 +10,7 @@ import { roomCoordinator } from '../../../server/lib/rooms/roomCoordinator'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { archiveRoom } from '../../lib/server/functions/archiveRoom'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; slashCommands.add({ command: 'archive', diff --git a/apps/meteor/app/slashcommands-create/client/client.ts b/apps/meteor/app/slashcommands-create/client/client.ts index 299db606db9c..7e8ba831dbd8 100644 --- a/apps/meteor/app/slashcommands-create/client/client.ts +++ b/apps/meteor/app/slashcommands-create/client/client.ts @@ -1,4 +1,4 @@ -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'create', diff --git a/apps/meteor/app/slashcommands-create/server/server.ts b/apps/meteor/app/slashcommands-create/server/server.ts index 104d50c56926..6abee71c56fd 100644 --- a/apps/meteor/app/slashcommands-create/server/server.ts +++ b/apps/meteor/app/slashcommands-create/server/server.ts @@ -6,7 +6,7 @@ import { i18n } from '../../../server/lib/i18n'; import { createChannelMethod } from '../../lib/server/methods/createChannel'; import { createPrivateGroupMethod } from '../../lib/server/methods/createPrivateGroup'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; slashCommands.add({ command: 'create', diff --git a/apps/meteor/app/slashcommands-help/server/server.ts b/apps/meteor/app/slashcommands-help/server/server.ts index c24bfb22c6fe..80efaffeb852 100644 --- a/apps/meteor/app/slashcommands-help/server/server.ts +++ b/apps/meteor/app/slashcommands-help/server/server.ts @@ -4,7 +4,7 @@ import { Users } from '@rocket.chat/models'; import { i18n } from '../../../server/lib/i18n'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Help is a named function that will replace /help commands diff --git a/apps/meteor/app/slashcommands-hide/client/hide.ts b/apps/meteor/app/slashcommands-hide/client/hide.ts index 99c1eaea7049..c6486053ecc2 100644 --- a/apps/meteor/app/slashcommands-hide/client/hide.ts +++ b/apps/meteor/app/slashcommands-hide/client/hide.ts @@ -1,4 +1,4 @@ -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'hide', diff --git a/apps/meteor/app/slashcommands-invite/client/client.ts b/apps/meteor/app/slashcommands-invite/client/client.ts index 729073b785d8..7c8af755d64d 100644 --- a/apps/meteor/app/slashcommands-invite/client/client.ts +++ b/apps/meteor/app/slashcommands-invite/client/client.ts @@ -1,4 +1,4 @@ -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'invite', diff --git a/apps/meteor/app/slashcommands-invite/server/server.ts b/apps/meteor/app/slashcommands-invite/server/server.ts index de525d8c6fc6..06a85301540c 100644 --- a/apps/meteor/app/slashcommands-invite/server/server.ts +++ b/apps/meteor/app/slashcommands-invite/server/server.ts @@ -6,7 +6,7 @@ import { Meteor } from 'meteor/meteor'; import { i18n } from '../../../server/lib/i18n'; import { addUsersToRoomMethod } from '../../lib/server/methods/addUsersToRoom'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Invite is a named function that will replace /invite commands diff --git a/apps/meteor/app/slashcommands-inviteall/client/client.ts b/apps/meteor/app/slashcommands-inviteall/client/client.ts index f8ab40953d27..5083cd4a83ab 100644 --- a/apps/meteor/app/slashcommands-inviteall/client/client.ts +++ b/apps/meteor/app/slashcommands-inviteall/client/client.ts @@ -1,4 +1,4 @@ -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'invite-all-to', diff --git a/apps/meteor/app/slashcommands-inviteall/server/server.ts b/apps/meteor/app/slashcommands-inviteall/server/server.ts index bac4349ec72c..e74bb89899c2 100644 --- a/apps/meteor/app/slashcommands-inviteall/server/server.ts +++ b/apps/meteor/app/slashcommands-inviteall/server/server.ts @@ -15,7 +15,7 @@ import { addUsersToRoomMethod } from '../../lib/server/methods/addUsersToRoom'; import { createChannelMethod } from '../../lib/server/methods/createChannel'; import { createPrivateGroupMethod } from '../../lib/server/methods/createPrivateGroup'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; function inviteAll(type: T): SlashCommand['callback'] { return async function inviteAll({ command, params, message, userId }: SlashCommandCallbackParams): Promise { diff --git a/apps/meteor/app/slashcommands-join/client/client.ts b/apps/meteor/app/slashcommands-join/client/client.ts index 417fe1e5cd47..bc8d589f51ac 100644 --- a/apps/meteor/app/slashcommands-join/client/client.ts +++ b/apps/meteor/app/slashcommands-join/client/client.ts @@ -1,6 +1,6 @@ import type { Meteor } from 'meteor/meteor'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'join', diff --git a/apps/meteor/app/slashcommands-join/server/server.ts b/apps/meteor/app/slashcommands-join/server/server.ts index 33d0278f81a3..6497324ae9e0 100644 --- a/apps/meteor/app/slashcommands-join/server/server.ts +++ b/apps/meteor/app/slashcommands-join/server/server.ts @@ -5,7 +5,7 @@ import { Meteor } from 'meteor/meteor'; import { i18n } from '../../../server/lib/i18n'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; slashCommands.add({ command: 'join', diff --git a/apps/meteor/app/slashcommands-kick/client/client.ts b/apps/meteor/app/slashcommands-kick/client/client.ts index 475346216f1e..7fc167e17c88 100644 --- a/apps/meteor/app/slashcommands-kick/client/client.ts +++ b/apps/meteor/app/slashcommands-kick/client/client.ts @@ -1,6 +1,6 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'kick', diff --git a/apps/meteor/app/slashcommands-kick/server/server.ts b/apps/meteor/app/slashcommands-kick/server/server.ts index 5ca6b45ec835..fdde07b897bf 100644 --- a/apps/meteor/app/slashcommands-kick/server/server.ts +++ b/apps/meteor/app/slashcommands-kick/server/server.ts @@ -6,7 +6,7 @@ import { Users } from '@rocket.chat/models'; import { i18n } from '../../../server/lib/i18n'; import { removeUserFromRoomMethod } from '../../../server/methods/removeUserFromRoom'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; slashCommands.add({ command: 'kick', diff --git a/apps/meteor/app/slashcommands-leave/server/leave.ts b/apps/meteor/app/slashcommands-leave/server/leave.ts index 42dad0807246..fa108fe18c72 100644 --- a/apps/meteor/app/slashcommands-leave/server/leave.ts +++ b/apps/meteor/app/slashcommands-leave/server/leave.ts @@ -5,7 +5,7 @@ import { Users } from '@rocket.chat/models'; import { i18n } from '../../../server/lib/i18n'; import { leaveRoomMethod } from '../../lib/server/methods/leaveRoom'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Leave is a named function that will replace /leave commands diff --git a/apps/meteor/app/slashcommands-me/server/me.ts b/apps/meteor/app/slashcommands-me/server/me.ts index ba6a9f8c82cc..b8b4a593cb73 100644 --- a/apps/meteor/app/slashcommands-me/server/me.ts +++ b/apps/meteor/app/slashcommands-me/server/me.ts @@ -1,7 +1,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { executeSendMessage } from '../../lib/server/methods/sendMessage'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Me is a named function that will replace /me commands diff --git a/apps/meteor/app/slashcommands-msg/server/server.ts b/apps/meteor/app/slashcommands-msg/server/server.ts index c6a244b80207..e757938106eb 100644 --- a/apps/meteor/app/slashcommands-msg/server/server.ts +++ b/apps/meteor/app/slashcommands-msg/server/server.ts @@ -7,7 +7,7 @@ import { i18n } from '../../../server/lib/i18n'; import { createDirectMessage } from '../../../server/methods/createDirectMessage'; import { executeSendMessage } from '../../lib/server/methods/sendMessage'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Msg is a named function that will replace /msg commands diff --git a/apps/meteor/app/slashcommands-mute/server/mute.ts b/apps/meteor/app/slashcommands-mute/server/mute.ts index 03ce960496da..da20ff4fed47 100644 --- a/apps/meteor/app/slashcommands-mute/server/mute.ts +++ b/apps/meteor/app/slashcommands-mute/server/mute.ts @@ -5,7 +5,7 @@ import { Users } from '@rocket.chat/models'; import { i18n } from '../../../server/lib/i18n'; import { muteUserInRoom } from '../../../server/methods/muteUserInRoom'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Mute is a named function that will replace /mute commands diff --git a/apps/meteor/app/slashcommands-mute/server/unmute.ts b/apps/meteor/app/slashcommands-mute/server/unmute.ts index 25c0956d49e3..4dc683f4ca93 100644 --- a/apps/meteor/app/slashcommands-mute/server/unmute.ts +++ b/apps/meteor/app/slashcommands-mute/server/unmute.ts @@ -5,7 +5,7 @@ import { Users } from '@rocket.chat/models'; import { i18n } from '../../../server/lib/i18n'; import { unmuteUserInRoom } from '../../../server/methods/unmuteUserInRoom'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; /* * Unmute is a named function that will replace /unmute commands diff --git a/apps/meteor/app/slashcommands-open/client/client.ts b/apps/meteor/app/slashcommands-open/client/client.ts index 987df9599761..99438a24eeb0 100644 --- a/apps/meteor/app/slashcommands-open/client/client.ts +++ b/apps/meteor/app/slashcommands-open/client/client.ts @@ -5,7 +5,7 @@ import { roomCoordinator } from '../../../client/lib/rooms/roomCoordinator'; import { router } from '../../../client/providers/RouterProvider'; import { Subscriptions, ChatSubscription } from '../../models/client'; import { sdk } from '../../utils/client/lib/SDKClient'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'open', diff --git a/apps/meteor/app/slashcommands-status/client/status.ts b/apps/meteor/app/slashcommands-status/client/status.ts index 9136ef8f586f..3698b5fda4cb 100644 --- a/apps/meteor/app/slashcommands-status/client/status.ts +++ b/apps/meteor/app/slashcommands-status/client/status.ts @@ -2,7 +2,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { dispatchToastMessage } from '../../../client/lib/toast'; import { sdk } from '../../utils/client/lib/SDKClient'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'status', diff --git a/apps/meteor/app/slashcommands-status/server/status.ts b/apps/meteor/app/slashcommands-status/server/status.ts index 72d92afaf3f2..a2ff6483d398 100644 --- a/apps/meteor/app/slashcommands-status/server/status.ts +++ b/apps/meteor/app/slashcommands-status/server/status.ts @@ -5,7 +5,7 @@ import { Users } from '@rocket.chat/models'; import { i18n } from '../../../server/lib/i18n'; import { settings } from '../../settings/server'; import { setUserStatusMethod } from '../../user-status/server/methods/setUserStatus'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; slashCommands.add({ command: 'status', diff --git a/apps/meteor/app/slashcommands-topic/client/topic.ts b/apps/meteor/app/slashcommands-topic/client/topic.ts index f5f5ed58bb0f..f7e47c334b5a 100644 --- a/apps/meteor/app/slashcommands-topic/client/topic.ts +++ b/apps/meteor/app/slashcommands-topic/client/topic.ts @@ -5,7 +5,7 @@ import { callbacks } from '../../../lib/callbacks'; import { hasPermission } from '../../authorization/client'; import { ChatRoom } from '../../models/client/models/ChatRoom'; import { sdk } from '../../utils/client/lib/SDKClient'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'topic', diff --git a/apps/meteor/app/slashcommands-topic/server/topic.ts b/apps/meteor/app/slashcommands-topic/server/topic.ts index 24fd51d5f509..c1fa6ea283b7 100644 --- a/apps/meteor/app/slashcommands-topic/server/topic.ts +++ b/apps/meteor/app/slashcommands-topic/server/topic.ts @@ -2,7 +2,7 @@ import type { SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { saveRoomSettings } from '../../channel-settings/server/methods/saveRoomSettings'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; slashCommands.add({ command: 'topic', diff --git a/apps/meteor/app/slashcommands-unarchiveroom/client/client.ts b/apps/meteor/app/slashcommands-unarchiveroom/client/client.ts index 2fed1e1c7802..7b65fc067031 100644 --- a/apps/meteor/app/slashcommands-unarchiveroom/client/client.ts +++ b/apps/meteor/app/slashcommands-unarchiveroom/client/client.ts @@ -1,4 +1,4 @@ -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/client/slashCommand'; slashCommands.add({ command: 'unarchive', diff --git a/apps/meteor/app/slashcommands-unarchiveroom/server/server.ts b/apps/meteor/app/slashcommands-unarchiveroom/server/server.ts index d87981bd65a2..4c0c44269d2f 100644 --- a/apps/meteor/app/slashcommands-unarchiveroom/server/server.ts +++ b/apps/meteor/app/slashcommands-unarchiveroom/server/server.ts @@ -10,7 +10,7 @@ import { roomCoordinator } from '../../../server/lib/rooms/roomCoordinator'; import { hasPermissionAsync } from '../../authorization/server/functions/hasPermission'; import { unarchiveRoom } from '../../lib/server/functions/unarchiveRoom'; import { settings } from '../../settings/server'; -import { slashCommands } from '../../utils/lib/slashCommand'; +import { slashCommands } from '../../utils/server/slashCommand'; slashCommands.add({ command: 'unarchive', diff --git a/apps/meteor/app/statistics/server/methods/getStatistics.ts b/apps/meteor/app/statistics/server/methods/getStatistics.ts index c7eb79b5b985..a804ef83584e 100644 --- a/apps/meteor/app/statistics/server/methods/getStatistics.ts +++ b/apps/meteor/app/statistics/server/methods/getStatistics.ts @@ -1,10 +1,10 @@ import type { IStats } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { getLastStatistics } from '../functions/getLastStatistics'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getStatistics(refresh?: boolean): IStats; diff --git a/apps/meteor/app/theme/client/imports/general/base_old.css b/apps/meteor/app/theme/client/imports/general/base_old.css index 20b023cc61aa..3120d9c05ff0 100644 --- a/apps/meteor/app/theme/client/imports/general/base_old.css +++ b/apps/meteor/app/theme/client/imports/general/base_old.css @@ -776,21 +776,6 @@ padding: 21px 0 10px; } - & .start { - margin-top: 44px; - - text-align: center; - - & .start__purge-warning { - margin-top: -33px; - margin-bottom: 0.5rem; - padding: 1rem; - - border-width: 1px 0 0; - background: linear-gradient(to bottom, var(--rc-color-alert-message-warning-background) 0%, rgba(255, 255, 255, 0) 100%); - } - } - & .editing .body { border-radius: var(--border-radius); } diff --git a/apps/meteor/app/threads/server/hooks/aftersavemessage.ts b/apps/meteor/app/threads/server/hooks/aftersavemessage.ts index ab1fa182599b..a938dadddb27 100644 --- a/apps/meteor/app/threads/server/hooks/aftersavemessage.ts +++ b/apps/meteor/app/threads/server/hooks/aftersavemessage.ts @@ -4,7 +4,7 @@ import { Messages } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; -import { broadcastMessageFromData } from '../../../../server/modules/watchers/lib/messages'; +import { notifyOnMessageChange } from '../../../lib/server/lib/notifyListener'; import { updateThreadUsersSubscriptions, getMentions } from '../../../lib/server/lib/notifyUsersOnMessage'; import { sendMessageNotifications } from '../../../lib/server/lib/sendNotificationsOnMessage'; import { settings } from '../../../settings/server'; @@ -62,7 +62,7 @@ export async function processThreads(message: IMessage, room: IRoom) { await notifyUsersOnReply(message, replies); await metaData(message, parentMessage, replies); await notification(message, room, replies); - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: message.tmid, }); @@ -77,7 +77,7 @@ Meteor.startup(() => { } callbacks.add( 'afterSaveMessage', - async (message, room) => { + async (message, { room }) => { return processThreads(message, room); }, callbacks.priority.LOW, diff --git a/apps/meteor/app/threads/server/methods/followMessage.ts b/apps/meteor/app/threads/server/methods/followMessage.ts index 05650d0ad2ef..1790e0607a62 100644 --- a/apps/meteor/app/threads/server/methods/followMessage.ts +++ b/apps/meteor/app/threads/server/methods/followMessage.ts @@ -1,7 +1,7 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -10,7 +10,7 @@ import { RateLimiter } from '../../../lib/server'; import { settings } from '../../../settings/server'; import { follow } from '../functions'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { followMessage(message: { mid: IMessage['_id'] }): false | undefined; diff --git a/apps/meteor/app/threads/server/methods/getThreadMessages.ts b/apps/meteor/app/threads/server/methods/getThreadMessages.ts index d6c2d65ff4d4..8ae31130df1b 100644 --- a/apps/meteor/app/threads/server/methods/getThreadMessages.ts +++ b/apps/meteor/app/threads/server/methods/getThreadMessages.ts @@ -1,6 +1,6 @@ import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../lib/callbacks'; @@ -8,7 +8,7 @@ import { canAccessRoomAsync } from '../../../authorization/server'; import { settings } from '../../../settings/server'; import { readThread } from '../functions'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getThreadMessages(params: { tmid: IMessage['_id']; limit?: number; skip?: number }): Promise; diff --git a/apps/meteor/app/threads/server/methods/getThreadsList.ts b/apps/meteor/app/threads/server/methods/getThreadsList.ts index 5a33dc16280b..c51449ff2d4d 100644 --- a/apps/meteor/app/threads/server/methods/getThreadsList.ts +++ b/apps/meteor/app/threads/server/methods/getThreadsList.ts @@ -1,6 +1,6 @@ import type { IMessage, IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomAsync } from '../../../authorization/server'; @@ -8,7 +8,7 @@ import { settings } from '../../../settings/server'; const MAX_LIMIT = 100; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getThreadsList(params: { rid: IRoom['_id']; limit?: number; skip?: number }): IMessage[]; diff --git a/apps/meteor/app/threads/server/methods/unfollowMessage.ts b/apps/meteor/app/threads/server/methods/unfollowMessage.ts index afc9206b038f..6371f40af6cb 100644 --- a/apps/meteor/app/threads/server/methods/unfollowMessage.ts +++ b/apps/meteor/app/threads/server/methods/unfollowMessage.ts @@ -1,7 +1,7 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -10,7 +10,7 @@ import { RateLimiter } from '../../../lib/server'; import { settings } from '../../../settings/server'; import { unfollow } from '../functions'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { unfollowMessage(message: { mid: IMessage['_id'] }): false | undefined; diff --git a/apps/meteor/app/ui-cached-collection/client/models/CachedCollection.ts b/apps/meteor/app/ui-cached-collection/client/models/CachedCollection.ts index 545e1e73342d..602a0eddb8ce 100644 --- a/apps/meteor/app/ui-cached-collection/client/models/CachedCollection.ts +++ b/apps/meteor/app/ui-cached-collection/client/models/CachedCollection.ts @@ -1,5 +1,5 @@ +import type { StreamNames } from '@rocket.chat/ddp-client'; import { Emitter } from '@rocket.chat/emitter'; -import type { StreamNames } from '@rocket.chat/ui-contexts'; import localforage from 'localforage'; import { Accounts } from 'meteor/accounts-base'; import { Meteor } from 'meteor/meteor'; diff --git a/apps/meteor/app/ui-cached-collection/client/models/CachedCollectionManager.ts b/apps/meteor/app/ui-cached-collection/client/models/CachedCollectionManager.ts index 845731e2450a..b03115105841 100644 --- a/apps/meteor/app/ui-cached-collection/client/models/CachedCollectionManager.ts +++ b/apps/meteor/app/ui-cached-collection/client/models/CachedCollectionManager.ts @@ -41,12 +41,12 @@ class CachedCollectionManager extends Emitter<{ reconnect: void; login: string | } }); + Accounts.onLogin(() => { + this.emit('login', Meteor.userId()); + }); Tracker.autorun(() => { const uid = Meteor.userId(); this.logged = uid !== null; - if (this.logged) { - this.emit('login', uid); - } }); } diff --git a/apps/meteor/app/ui-utils/lib/MessageTypes.ts b/apps/meteor/app/ui-utils/lib/MessageTypes.ts index a4f77d10cbf7..c108fe55f168 100644 --- a/apps/meteor/app/ui-utils/lib/MessageTypes.ts +++ b/apps/meteor/app/ui-utils/lib/MessageTypes.ts @@ -5,8 +5,6 @@ export type MessageType = { id: MessageTypesValues; system?: boolean; /* deprecated */ - render?: (message: IMessage) => string; - /* deprecated */ template?: (message: IMessage) => unknown; message: TranslationKey; data?: (message: IMessage) => Record; diff --git a/apps/meteor/app/ui-utils/server/Message.ts b/apps/meteor/app/ui-utils/server/Message.ts index 18cf842b1993..06ae59238b42 100644 --- a/apps/meteor/app/ui-utils/server/Message.ts +++ b/apps/meteor/app/ui-utils/server/Message.ts @@ -11,9 +11,6 @@ export const Message = { parse(msg: IMessage, language: string) { const messageType = MessageTypes.getType(msg); if (messageType) { - if (messageType.render) { - return messageType.render(msg); - } if (messageType.template) { // Render message return; diff --git a/apps/meteor/app/user-status/server/methods/deleteCustomUserStatus.ts b/apps/meteor/app/user-status/server/methods/deleteCustomUserStatus.ts index f58fa9551f4c..416bc6f678ed 100644 --- a/apps/meteor/app/user-status/server/methods/deleteCustomUserStatus.ts +++ b/apps/meteor/app/user-status/server/methods/deleteCustomUserStatus.ts @@ -1,11 +1,11 @@ import { api } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { CustomUserStatus } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteCustomUserStatus(userStatusID: string): Promise; diff --git a/apps/meteor/app/user-status/server/methods/getUserStatusText.ts b/apps/meteor/app/user-status/server/methods/getUserStatusText.ts index 5aa80627d562..911a69854b95 100644 --- a/apps/meteor/app/user-status/server/methods/getUserStatusText.ts +++ b/apps/meteor/app/user-status/server/methods/getUserStatusText.ts @@ -1,9 +1,9 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { getStatusText } from '../../../lib/server/functions/getStatusText'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getUserStatusText(userId: string): Promise; diff --git a/apps/meteor/app/user-status/server/methods/insertOrUpdateUserStatus.ts b/apps/meteor/app/user-status/server/methods/insertOrUpdateUserStatus.ts index b6a98895bc2c..6e034f030679 100644 --- a/apps/meteor/app/user-status/server/methods/insertOrUpdateUserStatus.ts +++ b/apps/meteor/app/user-status/server/methods/insertOrUpdateUserStatus.ts @@ -1,14 +1,14 @@ import { api } from '@rocket.chat/core-services'; import type { ICustomUserStatus } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import type { InsertionModel } from '@rocket.chat/model-typings'; import { CustomUserStatus } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { trim } from '../../../../lib/utils/stringUtils'; import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { insertOrUpdateUserStatus(userStatusData: { diff --git a/apps/meteor/app/user-status/server/methods/listCustomUserStatus.ts b/apps/meteor/app/user-status/server/methods/listCustomUserStatus.ts index 3a962121d65c..d9a58f8b8c72 100644 --- a/apps/meteor/app/user-status/server/methods/listCustomUserStatus.ts +++ b/apps/meteor/app/user-status/server/methods/listCustomUserStatus.ts @@ -1,9 +1,9 @@ import type { ICustomUserStatus } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { CustomUserStatus } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { listCustomUserStatus(): ICustomUserStatus[]; diff --git a/apps/meteor/app/user-status/server/methods/setUserStatus.ts b/apps/meteor/app/user-status/server/methods/setUserStatus.ts index 32db93e722fb..0b40e7e37246 100644 --- a/apps/meteor/app/user-status/server/methods/setUserStatus.ts +++ b/apps/meteor/app/user-status/server/methods/setUserStatus.ts @@ -1,6 +1,6 @@ import { Presence } from '@rocket.chat/core-services'; import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -8,7 +8,7 @@ import { RateLimiter } from '../../../lib/server'; import { setStatusText } from '../../../lib/server/functions/setStatusText'; import { settings } from '../../../settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setUserStatus(statusType: IUser['status'], statusText: IUser['statusText']): void; diff --git a/apps/meteor/app/utils/client/index.ts b/apps/meteor/app/utils/client/index.ts index fd03ffc3d720..561a1116141b 100644 --- a/apps/meteor/app/utils/client/index.ts +++ b/apps/meteor/app/utils/client/index.ts @@ -2,6 +2,6 @@ export { Info } from '../rocketchat.info'; export { getUserPreference } from './lib/getUserPreference'; export { fileUploadIsValidContentType } from './restrictions'; export { getUserAvatarURL } from './getUserAvatarURL'; -export { slashCommands } from '../lib/slashCommand'; +export { slashCommands } from './slashCommand'; export { getURL } from './getURL'; export { APIClient } from './lib/RestApiClient'; diff --git a/apps/meteor/app/utils/client/lib/SDKClient.ts b/apps/meteor/app/utils/client/lib/SDKClient.ts index c174f9125f49..3c7e43c85f7c 100644 --- a/apps/meteor/app/utils/client/lib/SDKClient.ts +++ b/apps/meteor/app/utils/client/lib/SDKClient.ts @@ -1,15 +1,12 @@ import type { RestClientInterface } from '@rocket.chat/api-client'; -import type { SDK } from '@rocket.chat/ddp-client/src/DDPSDK'; -import type { ClientStream } from '@rocket.chat/ddp-client/src/types/ClientStream'; -import type { StreamKeys, StreamNames, StreamerCallbackArgs } from '@rocket.chat/ddp-client/src/types/streams'; +import type { SDK, ClientStream, StreamKeys, StreamNames, StreamerCallbackArgs, ServerMethods } from '@rocket.chat/ddp-client'; import { Emitter } from '@rocket.chat/emitter'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { DDPCommon } from 'meteor/ddp-common'; import { Meteor } from 'meteor/meteor'; import { APIClient } from './RestApiClient'; -declare module '@rocket.chat/ddp-client/src/DDPSDK' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface SDK { stream>( @@ -138,6 +135,12 @@ const createStreamManager = () => { const streams = new Map(); + Accounts.onLogout(() => { + streams.forEach((stream) => { + stream.unsubList.forEach((stop) => stop()); + }); + }); + Meteor.connection._stream.on('message', (rawMsg: string) => { const msg = DDPCommon.parseDDP(rawMsg); if (!isChangedCollectionPayload(msg)) { @@ -169,7 +172,6 @@ const createStreamManager = () => { const stop = (): void => { streamProxy.off(eventLiteral, proxyCallback); - // If someone is still listening, don't unsubscribe if (streamProxy.has(eventLiteral)) { return; @@ -182,11 +184,15 @@ const createStreamManager = () => { }; const stream = streams.get(eventLiteral) || createNewMeteorStream(name, key, args); + stream.unsubList.add(stop); if (!streams.has(eventLiteral)) { streams.set(eventLiteral, stream); } - stream.error(() => stop()); + + stream.error(() => { + stream.unsubList.forEach((stop) => stop()); + }); return { id: '', diff --git a/apps/meteor/app/utils/lib/slashCommand.ts b/apps/meteor/app/utils/client/slashCommand.ts similarity index 84% rename from apps/meteor/app/utils/lib/slashCommand.ts rename to apps/meteor/app/utils/client/slashCommand.ts index f4e2cc1b359a..66e793012fac 100644 --- a/apps/meteor/app/utils/lib/slashCommand.ts +++ b/apps/meteor/app/utils/client/slashCommand.ts @@ -6,7 +6,8 @@ import type { SlashCommandPreviewItem, SlashCommandPreviews, } from '@rocket.chat/core-typings'; -import { Meteor } from 'meteor/meteor'; + +import { InvalidCommandUsage, InvalidPreview } from '../../../client/lib/errors'; interface ISlashCommandAddParams { command: string; @@ -69,7 +70,7 @@ export const slashCommands = { } if (!message?.rid) { - throw new Meteor.Error('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + throw new InvalidCommandUsage(); } return cmd.callback({ command, params, message, triggerId, userId }); @@ -85,7 +86,7 @@ export const slashCommands = { } if (!message?.rid) { - throw new Meteor.Error('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + throw new InvalidCommandUsage(); } const previewInfo = await cmd.previewer(command, params, message); @@ -114,19 +115,19 @@ export const slashCommands = { } if (!message?.rid) { - throw new Meteor.Error('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + throw new InvalidCommandUsage(); } // { id, type, value } if (!preview.id || !preview.type || !preview.value) { - throw new Meteor.Error('error-invalid-preview', 'Preview Item must have an id, type, and value.'); + throw new InvalidPreview(); } return cmd.previewCallback(command, params, message, preview, triggerId); }, }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { slashCommand(params: { cmd: string; params: string; msg: IMessage; triggerId: string }): unknown; diff --git a/apps/meteor/app/utils/lib/i18n.ts b/apps/meteor/app/utils/lib/i18n.ts index 9d3fbc59d245..b69fe6b30513 100644 --- a/apps/meteor/app/utils/lib/i18n.ts +++ b/apps/meteor/app/utils/lib/i18n.ts @@ -9,11 +9,11 @@ export const i18n = i18next.use(sprintf); export const addSprinfToI18n = function (t: (typeof i18n)['t']) { return function (key: string, ...replaces: any): string { if (replaces[0] === undefined) { - return t(key, ...replaces); + return t(key); } if (isObject(replaces[0]) && !Array.isArray(replaces[0])) { - return t(key, ...replaces); + return t(key, replaces[0]); } return t(key, { diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info index ef7c8e5717c9..faf0e8f47de6 100644 --- a/apps/meteor/app/utils/rocketchat.info +++ b/apps/meteor/app/utils/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "6.11.0-develop" + "version": "6.12.0-develop" } diff --git a/apps/meteor/app/utils/server/slashCommand.ts b/apps/meteor/app/utils/server/slashCommand.ts index 74f2c5716cc4..27b3c81735f9 100644 --- a/apps/meteor/app/utils/server/slashCommand.ts +++ b/apps/meteor/app/utils/server/slashCommand.ts @@ -1,7 +1,139 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import { MeteorError } from '@rocket.chat/core-services'; +import type { + IMessage, + SlashCommand, + SlashCommandOptions, + RequiredField, + SlashCommandPreviewItem, + SlashCommandPreviews, +} from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -import { slashCommands } from '../lib/slashCommand'; +interface ISlashCommandAddParams { + command: string; + callback?: SlashCommand['callback']; + options?: SlashCommandOptions; + result?: SlashCommand['result']; + providesPreview?: boolean; + previewer?: SlashCommand['previewer']; + previewCallback?: SlashCommand['previewCallback']; + appId?: string; + description?: string; +} + +export const slashCommands = { + commands: {} as Record, + add({ + command, + callback, + options = {}, + result, + providesPreview = false, + previewer, + previewCallback, + appId, + description = '', + }: ISlashCommandAddParams): void { + if (this.commands[command]) { + return; + } + this.commands[command] = { + command, + callback, + params: options.params, + description: options.description || description, + permission: options.permission, + clientOnly: options.clientOnly || false, + result, + providesPreview: Boolean(providesPreview), + previewer, + previewCallback, + appId, + } as SlashCommand; + }, + async run({ + command, + message, + params, + triggerId, + userId, + }: { + command: string; + params: string; + message: RequiredField, 'rid' | '_id'>; + userId: string; + triggerId?: string | undefined; + }): Promise { + const cmd = this.commands[command]; + if (typeof cmd?.callback !== 'function') { + return; + } + + if (!message?.rid) { + throw new MeteorError('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + } + + return cmd.callback({ command, params, message, triggerId, userId }); + }, + async getPreviews( + command: string, + params: string, + message: RequiredField, 'rid'>, + ): Promise { + const cmd = this.commands[command]; + if (typeof cmd?.previewer !== 'function') { + return; + } + + if (!message?.rid) { + throw new MeteorError('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + } + + const previewInfo = await cmd.previewer(command, params, message); + + if (!previewInfo?.items?.length) { + return; + } + + // A limit of ten results, to save time and bandwidth + if (previewInfo.items.length >= 10) { + previewInfo.items = previewInfo.items.slice(0, 10); + } + + return previewInfo; + }, + async executePreview( + command: string, + params: string, + message: Pick & Partial>, + preview: SlashCommandPreviewItem, + triggerId?: string, + ) { + const cmd = this.commands[command]; + if (typeof cmd?.previewCallback !== 'function') { + return; + } + + if (!message?.rid) { + throw new MeteorError('invalid-command-usage', 'Executing a command requires at least a message with a room id.'); + } + + // { id, type, value } + if (!preview.id || !preview.type || !preview.value) { + throw new MeteorError('error-invalid-preview', 'Preview Item must have an id, type, and value.'); + } + + return cmd.previewCallback(command, params, message, preview, triggerId); + }, +}; + +declare module '@rocket.chat/ddp-client' { + // eslint-disable-next-line @typescript-eslint/naming-convention + interface ServerMethods { + slashCommand(params: { cmd: string; params: string; msg: IMessage; triggerId: string }): unknown; + } +} Meteor.methods({ async slashCommand(command) { @@ -27,5 +159,3 @@ Meteor.methods({ }); }, }); - -export { slashCommands }; diff --git a/apps/meteor/app/version-check/server/methods/banner_dismiss.ts b/apps/meteor/app/version-check/server/methods/banner_dismiss.ts index 5ffebcfbbd5a..a3bf337626f9 100644 --- a/apps/meteor/app/version-check/server/methods/banner_dismiss.ts +++ b/apps/meteor/app/version-check/server/methods/banner_dismiss.ts @@ -1,10 +1,10 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { notifyOnUserChange } from '../../../lib/server/lib/notifyListener'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'banner/dismiss'({ id }: { id: string }): void; diff --git a/apps/meteor/app/webdav/server/methods/addWebdavAccount.ts b/apps/meteor/app/webdav/server/methods/addWebdavAccount.ts index e2c9a9ddc324..2c3973649091 100644 --- a/apps/meteor/app/webdav/server/methods/addWebdavAccount.ts +++ b/apps/meteor/app/webdav/server/methods/addWebdavAccount.ts @@ -1,14 +1,14 @@ import { api } from '@rocket.chat/core-services'; import type { IWebdavAccountPayload } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { WebdavAccounts } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { settings } from '../../../settings/server'; import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addWebdavAccount(formData: IWebdavAccountPayload): boolean; diff --git a/apps/meteor/app/webdav/server/methods/getFileFromWebdav.ts b/apps/meteor/app/webdav/server/methods/getFileFromWebdav.ts index 346362935d87..38aeb0442c5c 100644 --- a/apps/meteor/app/webdav/server/methods/getFileFromWebdav.ts +++ b/apps/meteor/app/webdav/server/methods/getFileFromWebdav.ts @@ -1,15 +1,15 @@ import type { IWebdavAccount, IWebdavNode } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { WebdavAccounts } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { settings } from '../../../settings/server'; import { getWebdavCredentials } from '../lib/getWebdavCredentials'; import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention - export interface ServerMethods { + interface ServerMethods { getFileFromWebdav(accountId: IWebdavAccount['_id'], file: IWebdavNode): Promise<{ success: boolean; data: Uint8Array }>; } } diff --git a/apps/meteor/app/webdav/server/methods/getWebdavFileList.ts b/apps/meteor/app/webdav/server/methods/getWebdavFileList.ts index f4d944181928..66e924b719a2 100644 --- a/apps/meteor/app/webdav/server/methods/getWebdavFileList.ts +++ b/apps/meteor/app/webdav/server/methods/getWebdavFileList.ts @@ -1,13 +1,13 @@ import type { IWebdavAccount, IWebdavNode } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { WebdavAccounts } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { settings } from '../../../settings/server'; import { getWebdavCredentials } from '../lib/getWebdavCredentials'; import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getWebdavFileList(accountId: IWebdavAccount['_id'], path: string): { success: boolean; data: IWebdavNode[] }; diff --git a/apps/meteor/app/webdav/server/methods/getWebdavFilePreview.ts b/apps/meteor/app/webdav/server/methods/getWebdavFilePreview.ts index 1e01937a0e52..34077babf276 100644 --- a/apps/meteor/app/webdav/server/methods/getWebdavFilePreview.ts +++ b/apps/meteor/app/webdav/server/methods/getWebdavFilePreview.ts @@ -1,13 +1,13 @@ import type { IWebdavAccount } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { WebdavAccounts } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { createClient } from 'webdav'; import { settings } from '../../../settings/server'; import { getWebdavCredentials } from '../lib/getWebdavCredentials'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getWebdavFilePreview(accountId: IWebdavAccount['_id'], path: string): { success: true; data: ArrayBuffer } | undefined; diff --git a/apps/meteor/app/webdav/server/methods/removeWebdavAccount.ts b/apps/meteor/app/webdav/server/methods/removeWebdavAccount.ts index df6102297cc2..a68a14e29e40 100644 --- a/apps/meteor/app/webdav/server/methods/removeWebdavAccount.ts +++ b/apps/meteor/app/webdav/server/methods/removeWebdavAccount.ts @@ -1,14 +1,14 @@ import { api } from '@rocket.chat/core-services'; import type { IWebdavAccount } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { WebdavAccounts } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { DeleteResult } from 'mongodb'; import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { removeWebdavAccount(accountId: IWebdavAccount['_id']): DeleteResult; diff --git a/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts b/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts index 8a2e1badd27d..97bcf4632216 100644 --- a/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts +++ b/apps/meteor/app/webdav/server/methods/uploadFileToWebdav.ts @@ -1,7 +1,8 @@ import { MeteorError } from '@rocket.chat/core-services'; import type { IWebdavAccount } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Logger } from '@rocket.chat/logger'; -import type { ServerMethods, TranslationKey } from '@rocket.chat/ui-contexts'; +import type { TranslationKey } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { settings } from '../../../settings/server'; @@ -9,7 +10,7 @@ import { uploadFileToWebdav } from '../lib/uploadFileToWebdav'; const logger = new Logger('WebDAV_Upload'); -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { uploadFileToWebdav( diff --git a/apps/meteor/client/NavBarV2/NavBarPagesToolbar/hooks/useAuditMenu.spec.tsx b/apps/meteor/client/NavBarV2/NavBarPagesToolbar/hooks/useAuditMenu.spec.tsx index 11eddf934055..94fdfe25a92d 100644 --- a/apps/meteor/client/NavBarV2/NavBarPagesToolbar/hooks/useAuditMenu.spec.tsx +++ b/apps/meteor/client/NavBarV2/NavBarPagesToolbar/hooks/useAuditMenu.spec.tsx @@ -1,10 +1,11 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import { useAuditMenu } from './useAuditMenu'; it('should return an empty array of items if doesn`t have license', async () => { - const { result, waitFor } = renderHook(() => useAuditMenu(), { + const { result } = renderHook(() => useAuditMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/v1/licenses.info', () => ({ // @ts-expect-error: just for testing @@ -18,13 +19,12 @@ it('should return an empty array of items if doesn`t have license', async () => .build(), }); - await waitFor(() => result.all.length > 1); - - expect(result.current).toEqual([]); + await waitFor(() => expect(result.current).toEqual([])); }); it('should return an empty array of items if have license and not have permissions', async () => { - const { result, waitFor } = renderHook(() => useAuditMenu(), { + const { result } = renderHook(() => useAuditMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/v1/licenses.info', () => ({ license: { @@ -41,13 +41,12 @@ it('should return an empty array of items if have license and not have permissio .build(), }); - await waitFor(() => result.all.length > 1); - - expect(result.current).toEqual([]); + await waitFor(() => expect(result.current).toEqual([])); }); it('should return auditItems if have license and permissions', async () => { - const { result, waitFor } = renderHook(() => useAuditMenu(), { + const { result } = renderHook(() => useAuditMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/v1/licenses.info', () => ({ license: { @@ -65,12 +64,12 @@ it('should return auditItems if have license and permissions', async () => { .build(), }); - await waitFor(() => result.current.length > 0); - - expect(result.current[0].items[0]).toEqual( - expect.objectContaining({ - id: 'messages', - }), + await waitFor(() => + expect(result.current[0]?.items[0]).toEqual( + expect.objectContaining({ + id: 'messages', + }), + ), ); expect(result.current[0].items[1]).toEqual( @@ -81,7 +80,8 @@ it('should return auditItems if have license and permissions', async () => { }); it('should return auditMessages item if have license and can-audit permission', async () => { - const { result, waitFor } = renderHook(() => useAuditMenu(), { + const { result } = renderHook(() => useAuditMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/v1/licenses.info', () => ({ license: { @@ -98,17 +98,18 @@ it('should return auditMessages item if have license and can-audit permission', .build(), }); - await waitFor(() => result.current.length > 0); - - expect(result.current[0].items[0]).toEqual( - expect.objectContaining({ - id: 'messages', - }), + await waitFor(() => + expect(result.current[0]?.items[0]).toEqual( + expect.objectContaining({ + id: 'messages', + }), + ), ); }); it('should return audiLogs item if have license and can-audit-log permission', async () => { - const { result, waitFor } = renderHook(() => useAuditMenu(), { + const { result } = renderHook(() => useAuditMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/v1/licenses.info', () => ({ license: { @@ -125,11 +126,11 @@ it('should return audiLogs item if have license and can-audit-log permission', a .build(), }); - await waitFor(() => result.current.length > 0); - - expect(result.current[0].items[0]).toEqual( - expect.objectContaining({ - id: 'auditLog', - }), + await waitFor(() => + expect(result.current[0]?.items[0]).toEqual( + expect.objectContaining({ + id: 'auditLog', + }), + ), ); }); diff --git a/apps/meteor/client/NavBarV2/NavBarPagesToolbar/hooks/useMarketPlaceMenu.spec.tsx b/apps/meteor/client/NavBarV2/NavBarPagesToolbar/hooks/useMarketPlaceMenu.spec.tsx index 2a3d277e69fe..d2d1e36ca05e 100644 --- a/apps/meteor/client/NavBarV2/NavBarPagesToolbar/hooks/useMarketPlaceMenu.spec.tsx +++ b/apps/meteor/client/NavBarV2/NavBarPagesToolbar/hooks/useMarketPlaceMenu.spec.tsx @@ -1,11 +1,12 @@ import { UIActionButtonContext } from '@rocket.chat/apps-engine/definition/ui'; import { mockAppRoot } from '@rocket.chat/mock-providers'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import { useMarketPlaceMenu } from './useMarketPlaceMenu'; it('should return and empty array if the user does not have `manage-apps` and `access-marketplace` permission', () => { const { result } = renderHook(() => useMarketPlaceMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/apps/actionButtons', () => []) .build(), @@ -16,6 +17,7 @@ it('should return and empty array if the user does not have `manage-apps` and `a it('should return `explore` and `installed` items if the user has `access-marketplace` permission', () => { const { result } = renderHook(() => useMarketPlaceMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/apps/actionButtons', () => []) .withPermission('access-marketplace') @@ -37,6 +39,7 @@ it('should return `explore` and `installed` items if the user has `access-market it('should return `explore`, `installed` and `requested` items if the user has `manage-apps` permission', () => { const { result } = renderHook(() => useMarketPlaceMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/apps/actionButtons', () => []) .withEndpoint('GET', '/apps/app-request/stats', () => ({ @@ -69,7 +72,8 @@ it('should return `explore`, `installed` and `requested` items if the user has ` }); it('should return one action from the server with no conditions', async () => { - const { result, waitForValueToChange } = renderHook(() => useMarketPlaceMenu(), { + const { result } = renderHook(() => useMarketPlaceMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/apps/actionButtons', () => [ { @@ -101,18 +105,19 @@ it('should return one action from the server with no conditions', async () => { }), ); - await waitForValueToChange(() => result.current[0].items[3]); - - expect(result.current[0].items[3]).toEqual( - expect.objectContaining({ - id: 'APP_ID_ACTION_ID', - }), + await waitFor(() => + expect(result.current[0]?.items[3]).toEqual( + expect.objectContaining({ + id: 'APP_ID_ACTION_ID', + }), + ), ); }); describe('Marketplace menu with role conditions', () => { it('should return the action if the user has admin role', async () => { - const { result, waitForValueToChange } = renderHook(() => useMarketPlaceMenu(), { + const { result } = renderHook(() => useMarketPlaceMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/apps/actionButtons', () => [ { @@ -149,17 +154,18 @@ describe('Marketplace menu with role conditions', () => { }), ); - await waitForValueToChange(() => result.current[0].items[3]); - - expect(result.current[0].items[3]).toEqual( - expect.objectContaining({ - id: 'APP_ID_ACTION_ID', - }), + await waitFor(() => + expect(result.current[0]?.items[3]).toEqual( + expect.objectContaining({ + id: 'APP_ID_ACTION_ID', + }), + ), ); }); it('should return filter the action if the user doesn`t have admin role', async () => { const { result } = renderHook(() => useMarketPlaceMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/apps/actionButtons', () => [ { @@ -206,7 +212,8 @@ describe('Marketplace menu with role conditions', () => { describe('Marketplace menu with permission conditions', () => { it('should return the action if the user has manage-apps permission', async () => { - const { result, waitForValueToChange } = renderHook(() => useMarketPlaceMenu(), { + const { result } = renderHook(() => useMarketPlaceMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/apps/actionButtons', () => [ { @@ -241,17 +248,18 @@ describe('Marketplace menu with permission conditions', () => { }), ); - await waitForValueToChange(() => result.current[0].items[3]); - - expect(result.current[0].items[3]).toEqual( - expect.objectContaining({ - id: 'APP_ID_ACTION_ID', - }), + await waitFor(() => + expect(result.current[0].items[3]).toEqual( + expect.objectContaining({ + id: 'APP_ID_ACTION_ID', + }), + ), ); }); it('should return filter the action if the user doesn`t have `any` permission', async () => { const { result } = renderHook(() => useMarketPlaceMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/apps/actionButtons', () => [ { diff --git a/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/UserMenu/UserMenu.tsx b/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/UserMenu/UserMenu.tsx index fd4498f5fb8e..531ff8a74b66 100644 --- a/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/UserMenu/UserMenu.tsx +++ b/apps/meteor/client/NavBarV2/NavBarSettingsToolbar/UserMenu/UserMenu.tsx @@ -1,5 +1,6 @@ import type { IUser } from '@rocket.chat/core-typings'; import { useTranslation } from '@rocket.chat/ui-contexts'; +import type { ComponentProps } from 'react'; import React, { memo, useState } from 'react'; import GenericMenu from '../../../components/GenericMenu/GenericMenu'; @@ -8,9 +9,9 @@ import { useHandleMenuAction } from '../../../components/GenericMenu/hooks/useHa import UserMenuButton from './UserMenuButton'; import { useUserMenu } from './hooks/useUserMenu'; -type UserMenuProps = { user: IUser; className?: string }; +type UserMenuProps = { user: IUser } & Omit, 'sections' | 'items' | 'title'>; -const UserMenu = function UserMenu({ user }: UserMenuProps) { +const UserMenu = function UserMenu({ user, ...props }: UserMenuProps) { const t = useTranslation(); const [isOpen, setIsOpen] = useState(false); @@ -21,6 +22,7 @@ const UserMenu = function UserMenu({ user }: UserMenuProps) { return ( { - const { result, waitFor } = renderHook(() => useAdministrationMenu(), { + const { result } = renderHook(() => useAdministrationMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/v1/licenses.info', () => ({ // @ts-expect-error this is a mock @@ -19,17 +20,18 @@ it('should return omnichannel item if has `view-livechat-manager` permission ', .build(), }); - await waitFor(() => !!result.current.length); - - expect(result.current[0].items[0]).toEqual( - expect.objectContaining({ - id: 'omnichannel', - }), + await waitFor(() => + expect(result.current[0]?.items[0]).toEqual( + expect.objectContaining({ + id: 'omnichannel', + }), + ), ); }); it('should show administration item if has at least one admin permission', async () => { - const { result, waitFor } = renderHook(() => useAdministrationMenu(), { + const { result } = renderHook(() => useAdministrationMenu(), { + legacyRoot: true, wrapper: mockAppRoot() .withEndpoint('GET', '/v1/licenses.info', () => ({ // @ts-expect-error this is a mock @@ -44,11 +46,11 @@ it('should show administration item if has at least one admin permission', async .build(), }); - await waitFor(() => !!result.current.length); - - expect(result.current[0].items[0]).toEqual( - expect.objectContaining({ - id: 'workspace', - }), + await waitFor(() => + expect(result.current[0]?.items[0]).toEqual( + expect.objectContaining({ + id: 'workspace', + }), + ), ); }); diff --git a/apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx b/apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx index e6bce31b0b87..cd39a187cd89 100644 --- a/apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx +++ b/apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx @@ -46,11 +46,10 @@ const CreateDiscussion = ({ onClose, defaultParentRoom, parentMessageId, nameSug const t = useTranslation(); const { - formState: { isDirty, isSubmitting, isValidating, errors }, + formState: { isSubmitting, isValidating, errors }, handleSubmit, control, watch, - register, } = useForm({ mode: 'onBlur', defaultValues: { @@ -175,7 +174,11 @@ const CreateDiscussion = ({ onClose, defaultParentRoom, parentMessageId, nameSug {t('Topic')} - + } + /> {t('Displayed_next_to_name')} @@ -243,7 +246,7 @@ const CreateDiscussion = ({ onClose, defaultParentRoom, parentMessageId, nameSug - diff --git a/apps/meteor/client/components/FilterByText.tsx b/apps/meteor/client/components/FilterByText.tsx index 1aeeb29a0a57..5c5a3d599e2f 100644 --- a/apps/meteor/client/components/FilterByText.tsx +++ b/apps/meteor/client/components/FilterByText.tsx @@ -1,26 +1,13 @@ -import { Box, Icon, TextInput, Button, Margins } from '@rocket.chat/fuselage'; +import { Box, Icon, TextInput, Margins } from '@rocket.chat/fuselage'; import { useAutoFocus, useMergedRefs } from '@rocket.chat/fuselage-hooks'; import { useTranslation } from '@rocket.chat/ui-contexts'; -import type { ReactNode, ChangeEvent, FormEvent } from 'react'; -import React, { forwardRef, memo, useCallback, useEffect, useState } from 'react'; +import type { ChangeEvent, FormEvent, HTMLAttributes } from 'react'; +import React, { forwardRef, memo, useCallback, useState } from 'react'; -type FilterByTextCommonProps = { - children?: ReactNode | undefined; - placeholder?: string; - onChange: (filter: { text: string }) => void; +type FilterByTextProps = { + onChange: (filter: string) => void; shouldAutoFocus?: boolean; -}; - -type FilterByTextPropsWithButton = FilterByTextCommonProps & { - displayButton: true; - textButton: string; - onButtonClick: () => void; -}; - -type FilterByTextProps = FilterByTextCommonProps | FilterByTextPropsWithButton; - -const isFilterByTextPropsWithButton = (props: any): props is FilterByTextPropsWithButton => - 'displayButton' in props && props.displayButton === true; +} & Omit, 'is' | 'onChange'>; const FilterByText = forwardRef(function FilterByText( { placeholder, onChange: setFilter, shouldAutoFocus = false, children, ...props }, @@ -31,13 +18,10 @@ const FilterByText = forwardRef(function Fi const autoFocusRef = useAutoFocus(shouldAutoFocus); const mergedRefs = useMergedRefs(ref, autoFocusRef); - const handleInputChange = useCallback((event: ChangeEvent) => { + const handleInputChange = (event: ChangeEvent) => { setText(event.currentTarget.value); - }, []); - - useEffect(() => { - setFilter({ text }); - }, [setFilter, text]); + setFilter(event.currentTarget.value); + }; const handleFormSubmit = useCallback((event: FormEvent) => { event.preventDefault(); @@ -47,6 +31,7 @@ const FilterByText = forwardRef(function Fi } @@ -57,13 +42,7 @@ const FilterByText = forwardRef(function Fi aria-label={placeholder ?? t('Search')} /> - {isFilterByTextPropsWithButton(props) ? ( - - ) : ( - children && {children} - )} + {children && {children}} ); }); diff --git a/apps/meteor/client/components/GenericMenu/GenericMenu.spec.tsx b/apps/meteor/client/components/GenericMenu/GenericMenu.spec.tsx new file mode 100644 index 000000000000..530bd1404dc7 --- /dev/null +++ b/apps/meteor/client/components/GenericMenu/GenericMenu.spec.tsx @@ -0,0 +1,59 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import React from 'react'; + +import GenericMenu from './GenericMenu'; + +const mockedFunction = jest.fn(); +const regular = { + items: [ + { + id: 'edit', + content: 'Edit', + icon: 'pencil' as const, + onClick: mockedFunction, + }, + ], +}; +const danger = { + items: [ + { + id: 'delete', + content: 'Delete', + icon: 'trash' as const, + onClick: () => null, + variant: 'danger', + }, + ], +}; + +const sections = [regular, danger]; + +describe('Room Actions Menu', () => { + it('should render kebab menu with the list content', async () => { + render(, { legacyRoot: true }); + + await userEvent.click(screen.getByRole('button')); + + expect(await screen.findByText('Edit')).toBeInTheDocument(); + expect(await screen.findByText('Delete')).toBeInTheDocument(); + }); + + it('should have two different sections, regular and danger', async () => { + render(, { legacyRoot: true }); + + await userEvent.click(screen.getByRole('button')); + + expect(screen.getAllByRole('presentation')).toHaveLength(2); + expect(screen.getByRole('separator')).toBeInTheDocument(); + }); + + it('should call the action when item clicked', async () => { + render(, { legacyRoot: true }); + + await userEvent.click(screen.getByRole('button')); + await userEvent.click(screen.getAllByRole('menuitem')[0]); + + expect(mockedFunction).toHaveBeenCalled(); + }); +}); diff --git a/apps/meteor/client/components/GenericMenu/GenericMenuItem.tsx b/apps/meteor/client/components/GenericMenu/GenericMenuItem.tsx index 44feedf86115..c01a64d708a0 100644 --- a/apps/meteor/client/components/GenericMenu/GenericMenuItem.tsx +++ b/apps/meteor/client/components/GenericMenu/GenericMenuItem.tsx @@ -13,6 +13,7 @@ export type GenericMenuItemProps = { description?: ReactNode; gap?: boolean; tooltip?: string; + variant?: string; }; const GenericMenuItem = ({ icon, content, addon, status, gap, tooltip }: GenericMenuItemProps) => ( diff --git a/apps/meteor/client/components/GenericModal/GenericModal.spec.tsx b/apps/meteor/client/components/GenericModal/GenericModal.spec.tsx new file mode 100644 index 000000000000..b47b6abf7b00 --- /dev/null +++ b/apps/meteor/client/components/GenericModal/GenericModal.spec.tsx @@ -0,0 +1,85 @@ +import { useSetModal } from '@rocket.chat/ui-contexts'; +import { act, screen, renderHook } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import React, { Suspense } from 'react'; + +import ModalProviderWithRegion from '../../providers/ModalProvider/ModalProviderWithRegion'; +import GenericModal from './GenericModal'; + +const renderModal = (modalElement: ReactElement) => { + const { + result: { current: setModal }, + } = renderHook(() => useSetModal(), { + legacyRoot: true, + wrapper: ({ children }) => ( + + {children} + + ), + }); + + act(() => { + setModal(modalElement); + }); + + return { setModal }; +}; + +describe('callbacks', () => { + it('should call onClose callback when dismissed', async () => { + const handleClose = jest.fn(); + + renderModal(); + + expect(await screen.findByRole('heading', { name: 'Modal' })).toBeInTheDocument(); + + await userEvent.keyboard('{Escape}'); + + expect(screen.queryByRole('heading', { name: 'Modal' })).not.toBeInTheDocument(); + + expect(handleClose).toHaveBeenCalled(); + }); + + it('should NOT call onClose callback when confirmed', async () => { + const handleConfirm = jest.fn(); + const handleClose = jest.fn(); + + const { setModal } = renderModal(); + + expect(await screen.findByRole('heading', { name: 'Modal' })).toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', { name: 'Ok' })); + + expect(handleConfirm).toHaveBeenCalled(); + + act(() => { + setModal(null); + }); + + expect(screen.queryByRole('heading', { name: 'Modal' })).not.toBeInTheDocument(); + + expect(handleClose).not.toHaveBeenCalled(); + }); + + it('should NOT call onClose callback when cancelled', async () => { + const handleCancel = jest.fn(); + const handleClose = jest.fn(); + + const { setModal } = renderModal(); + + expect(await screen.findByRole('heading', { name: 'Modal' })).toBeInTheDocument(); + + await userEvent.click(screen.getByRole('button', { name: 'Cancel' })); + + expect(handleCancel).toHaveBeenCalled(); + + act(() => { + setModal(null); + }); + + expect(screen.queryByRole('heading', { name: 'Modal' })).not.toBeInTheDocument(); + + expect(handleClose).not.toHaveBeenCalled(); + }); +}); diff --git a/apps/meteor/client/components/GenericModal/GenericModal.tsx b/apps/meteor/client/components/GenericModal/GenericModal.tsx index 914928d4d423..d371e1ff4ef2 100644 --- a/apps/meteor/client/components/GenericModal/GenericModal.tsx +++ b/apps/meteor/client/components/GenericModal/GenericModal.tsx @@ -1,9 +1,9 @@ import { Button, Modal } from '@rocket.chat/fuselage'; -import { useUniqueId } from '@rocket.chat/fuselage-hooks'; +import { useEffectEvent, useUniqueId } from '@rocket.chat/fuselage-hooks'; import type { Keys as IconName } from '@rocket.chat/icons'; import { useTranslation } from '@rocket.chat/ui-contexts'; import type { ComponentProps, ReactElement, ReactNode, ComponentPropsWithoutRef } from 'react'; -import React from 'react'; +import React, { useEffect, useRef } from 'react'; import type { RequiredModalProps } from './withDoNotAskAgain'; import { withDoNotAskAgain } from './withDoNotAskAgain'; @@ -78,6 +78,31 @@ const GenericModal = ({ const t = useTranslation(); const genericModalId = useUniqueId(); + const dismissedRef = useRef(true); + + const handleConfirm = useEffectEvent(() => { + dismissedRef.current = false; + onConfirm?.(); + }); + + const handleCancel = useEffectEvent(() => { + dismissedRef.current = false; + onCancel?.(); + }); + + const handleCloseButtonClick = useEffectEvent(() => { + dismissedRef.current = true; + onClose?.(); + }); + + useEffect( + () => () => { + if (!dismissedRef.current) return; + onClose?.(); + }, + [onClose], + ); + return ( @@ -86,7 +111,7 @@ const GenericModal = ({ {tagline && {tagline}} {title ?? t('Are_you_sure')} - + {children} @@ -94,7 +119,7 @@ const GenericModal = ({ {annotation && !dontAskAgain && {annotation}} {onCancel && ( - )} @@ -104,7 +129,7 @@ const GenericModal = ({ )} {!wrapperFunction && onConfirm && ( - )} diff --git a/apps/meteor/client/components/InfoPanel/RetentionPolicyCallout.spec.tsx b/apps/meteor/client/components/InfoPanel/RetentionPolicyCallout.spec.tsx index 9a2e7eac4c45..8db42e8c649d 100644 --- a/apps/meteor/client/components/InfoPanel/RetentionPolicyCallout.spec.tsx +++ b/apps/meteor/client/components/InfoPanel/RetentionPolicyCallout.spec.tsx @@ -1,26 +1,30 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; -import '@testing-library/jest-dom/extend-expect'; import { createRenteionPolicySettingsMock as createMock } from '../../../tests/mocks/client/mockRetentionPolicySettings'; import { createFakeRoom } from '../../../tests/mocks/data'; -import { setDate } from '../../../tests/mocks/mockDate'; import RetentionPolicyCallout from './RetentionPolicyCallout'; jest.useFakeTimers(); +beforeEach(() => { + jest.setSystemTime(new Date(2024, 5, 1, 0, 0, 0)); +}); + describe('RetentionPolicyCallout', () => { it('Should render callout if settings are valid', () => { - setDate(); const fakeRoom = createFakeRoom({ t: 'c' }); - render(, { wrapper: createMock({ appliesToChannels: true, TTLChannels: 60000 }) }); + render(, { + legacyRoot: true, + wrapper: createMock({ appliesToChannels: true, TTLChannels: 60000 }), + }); expect(screen.getByRole('alert')).toHaveTextContent('a minute June 1, 2024, 12:30 AM'); }); it('Should not render callout if settings are invalid', () => { - setDate(); const fakeRoom = createFakeRoom({ t: 'c' }); render(, { + legacyRoot: true, wrapper: createMock({ appliesToChannels: true, TTLChannels: 60000, advancedPrecisionCron: '* * * 12 *', advancedPrecision: true }), }); expect(screen.queryByRole('alert')).not.toBeInTheDocument(); diff --git a/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx b/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx index 401448ceb396..7c028fb5c876 100644 --- a/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx +++ b/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx @@ -52,6 +52,8 @@ const CloseChatModal = ({ } = useForm(); const commentRequired = useSetting('Livechat_request_comment_when_closing_conversation') as boolean; + const alwaysSendTranscript = useSetting('Livechat_transcript_send_always'); + const customSubject = useSetting('Livechat_transcript_email_subject'); const [tagRequired, setTagRequired] = useState(false); const tags = watch('tags'); @@ -65,7 +67,7 @@ const CloseChatModal = ({ const transcriptPDFPermission = usePermission('request-pdf-transcript'); const transcriptEmailPermission = usePermission('send-omnichannel-chat-transcript'); - const canSendTranscriptEmail = transcriptEmailPermission && visitorEmail; + const canSendTranscriptEmail = transcriptEmailPermission && visitorEmail && !alwaysSendTranscript; const canSendTranscriptPDF = transcriptPDFPermission && hasLicense; const canSendTranscript = canSendTranscriptEmail || canSendTranscriptPDF; @@ -77,7 +79,7 @@ const CloseChatModal = ({ ({ comment, tags, transcriptPDF, transcriptEmail, subject }): void => { const preferences = { omnichannelTranscriptPDF: !!transcriptPDF, - omnichannelTranscriptEmail: !!transcriptEmail, + omnichannelTranscriptEmail: alwaysSendTranscript ? true : !!transcriptEmail, }; const requestData = transcriptEmail && visitorEmail ? { email: visitorEmail, subject } : undefined; @@ -97,7 +99,7 @@ const CloseChatModal = ({ onConfirm(comment, tags, preferences, requestData); } }, - [commentRequired, tagRequired, visitorEmail, errors, setError, t, onConfirm], + [commentRequired, tagRequired, visitorEmail, errors, setError, t, onConfirm, alwaysSendTranscript], ); const cannotSubmit = useMemo(() => { @@ -132,9 +134,9 @@ const CloseChatModal = ({ dispatchToastMessage({ type: 'error', message: t('Customer_without_registered_email') }); return; } - setValue('subject', subject || t('Transcript_of_your_livechat_conversation')); + setValue('subject', subject || customSubject || t('Transcript_of_your_livechat_conversation')); } - }, [transcriptEmail, setValue, visitorEmail, subject, t]); + }, [transcriptEmail, setValue, visitorEmail, subject, t, customSubject]); if (commentRequired || tagRequired || canSendTranscript) { return ( diff --git a/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.spec.tsx b/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.spec.tsx new file mode 100644 index 000000000000..87f7f70fbfbb --- /dev/null +++ b/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.spec.tsx @@ -0,0 +1,48 @@ +import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import React from 'react'; + +import TranscriptModal from './TranscriptModal'; + +const room = { + open: true, + v: { token: '1234567890' }, + transcriptRequest: { + email: 'example@example.com', + subject: 'Transcript of livechat conversation', + }, +} as IOmnichannelRoom; + +const defaultProps = { + room, + email: 'test@example.com', + onRequest: () => null, + onSend: () => null, + onCancel: () => null, + onDiscard: () => null, +}; + +it('should show Undo request button when roomOpen is true and transcriptRequest exist', async () => { + const onDiscardMock = jest.fn(); + render(, { legacyRoot: true }); + + const undoRequestButton = await screen.findByText('Undo_request'); + await userEvent.click(undoRequestButton); + + expect(onDiscardMock).toHaveBeenCalled(); +}); + +it('should show Request button when roomOpen is true and transcriptRequest not exist', async () => { + render(, { legacyRoot: true }); + + const requestBtn = await screen.findByRole('button', { name: 'request-button' }); + expect(requestBtn).toBeInTheDocument(); +}); + +it('should show Send button when roomOpen is false', async () => { + render(, { legacyRoot: true }); + + const sendBtn = await screen.findByRole('button', { name: 'send-button' }); + expect(sendBtn).toBeInTheDocument(); +}); diff --git a/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.tsx b/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.tsx index 95bda1e89107..c06b6a190465 100644 --- a/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.tsx +++ b/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.tsx @@ -21,8 +21,7 @@ const TranscriptModal = ({ email: emailDefault = '', room, onRequest, onSend, on handleSubmit, setValue, setFocus, - watch, - formState: { errors, isValid, isSubmitting }, + formState: { errors, isSubmitting }, } = useForm({ defaultValues: { email: emailDefault || '', subject: t('Transcript_of_your_livechat_conversation') }, }); @@ -56,7 +55,7 @@ const TranscriptModal = ({ email: emailDefault = '', room, onRequest, onSend, on } }, [setValue, transcriptRequest]); - const canSubmit = isValid && Boolean(watch('subject')); + // const canSubmit = isValid && Boolean(watch('subject')); return ( } {...props}> @@ -103,12 +102,12 @@ const TranscriptModal = ({ email: emailDefault = '', room, onRequest, onSend, on )} {roomOpen && !transcriptRequest && ( - )} {!roomOpen && ( - )} diff --git a/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx b/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx index 1f12f29ee13b..3f61f421035c 100644 --- a/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx +++ b/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx @@ -1,4 +1,4 @@ -import { AutoComplete, Option, Box, Chip, Options } from '@rocket.chat/fuselage'; +import { AutoComplete, Option, Box, Chip } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { UserAvatar } from '@rocket.chat/ui-avatar'; import { useEndpoint } from '@rocket.chat/ui-contexts'; @@ -46,7 +46,7 @@ const UserAutoComplete = ({ value, onChange, ...props }: UserAutoCompleteProps): )} renderItem={({ value, label, ...props }): ReactElement => ( - - {((isSuccess && data?.monitors.length > 0) || queryHasChanged) && setText(text)} />} + {((isSuccess && data?.monitors.length > 0) || queryHasChanged) && } {isLoading && ( {headers} diff --git a/apps/meteor/client/omnichannel/slaPolicies/SlaTable.tsx b/apps/meteor/client/omnichannel/slaPolicies/SlaTable.tsx index d550118a5017..01b4bfe90374 100644 --- a/apps/meteor/client/omnichannel/slaPolicies/SlaTable.tsx +++ b/apps/meteor/client/omnichannel/slaPolicies/SlaTable.tsx @@ -84,7 +84,7 @@ const SlaTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { return ( <> - {((isSuccess && data?.sla.length > 0) || queryHasChanged) && setFilter(text)} />} + {((isSuccess && data?.sla.length > 0) || queryHasChanged) && } {isLoading && ( {headers} diff --git a/apps/meteor/client/omnichannel/tags/TagsTable.tsx b/apps/meteor/client/omnichannel/tags/TagsTable.tsx index 3b9757134bed..a4b31cd4755c 100644 --- a/apps/meteor/client/omnichannel/tags/TagsTable.tsx +++ b/apps/meteor/client/omnichannel/tags/TagsTable.tsx @@ -70,7 +70,7 @@ const TagsTable = () => { return ( <> - {((isSuccess && data?.tags.length > 0) || queryHasChanged) && setFilter(text)} />} + {((isSuccess && data?.tags.length > 0) || queryHasChanged) && } {isLoading && ( {headers} diff --git a/apps/meteor/client/omnichannel/units/UnitsTable.tsx b/apps/meteor/client/omnichannel/units/UnitsTable.tsx index fe95bc90d8a2..93734acb8de0 100644 --- a/apps/meteor/client/omnichannel/units/UnitsTable.tsx +++ b/apps/meteor/client/omnichannel/units/UnitsTable.tsx @@ -69,7 +69,7 @@ const UnitsTable = () => { return ( <> - {((isSuccess && data?.units.length > 0) || queryHasChanged) && setFilter(text)} />} + {((isSuccess && data?.units.length > 0) || queryHasChanged) && } {isLoading && ( {headers} diff --git a/apps/meteor/client/polyfills/hoverTouchClick.ts b/apps/meteor/client/polyfills/hoverTouchClick.ts deleted file mode 100644 index 53706a45fb33..000000000000 --- a/apps/meteor/client/polyfills/hoverTouchClick.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as domEvents from '../lib/utils/domEvents'; -import { isIOsDevice } from '../lib/utils/isIOsDevice'; - -((): void => { - if (!isIOsDevice || !window.matchMedia('(hover: none)').matches) { - return; - } - - domEvents.delegate({ - parent: document.body, - eventName: 'touchend', - elementSelector: 'a:hover', - listener: (_, element): void => { - domEvents.triggerClick(element); - }, - }); -})(); diff --git a/apps/meteor/client/polyfills/index.ts b/apps/meteor/client/polyfills/index.ts index bc91265b04ba..be470f261e26 100644 --- a/apps/meteor/client/polyfills/index.ts +++ b/apps/meteor/client/polyfills/index.ts @@ -3,5 +3,4 @@ import 'url-polyfill'; import './childNodeRemove'; import './cssVars'; import './customEventPolyfill'; -import './hoverTouchClick'; import './promiseFinally'; diff --git a/apps/meteor/client/portals/ModalPortal.tsx b/apps/meteor/client/portals/ModalPortal.tsx index d7c9ae9caa2d..6b2210d56926 100644 --- a/apps/meteor/client/portals/ModalPortal.tsx +++ b/apps/meteor/client/portals/ModalPortal.tsx @@ -1,18 +1,32 @@ -import type { ReactElement, ReactNode } from 'react'; -import React, { memo, useEffect, useState } from 'react'; +import type { ReactNode } from 'react'; +import { memo } from 'react'; import { createPortal } from 'react-dom'; -import { createAnchor } from '../lib/utils/createAnchor'; -import { deleteAnchor } from '../lib/utils/deleteAnchor'; +const createModalRoot = (): HTMLElement => { + const id = 'modal-root'; + const existing = document.getElementById(id); + + if (existing) return existing; + + const newOne = document.createElement('div'); + newOne.id = id; + document.body.append(newOne); + + return newOne; +}; + +let modalRoot: HTMLElement | null = null; type ModalPortalProps = { children?: ReactNode; }; -const ModalPortal = ({ children }: ModalPortalProps): ReactElement => { - const [modalRoot] = useState(() => createAnchor('modal-root')); - useEffect(() => (): void => deleteAnchor(modalRoot), [modalRoot]); - return <>{createPortal(children, modalRoot)}; +const ModalPortal = ({ children }: ModalPortalProps) => { + if (!modalRoot) { + modalRoot = createModalRoot(); + } + + return createPortal(children, modalRoot); }; export default memo(ModalPortal); diff --git a/apps/meteor/tests/unit/client/providers/CallProvider/lib/parseStringToIceServers.spec.ts b/apps/meteor/client/providers/CallProvider/lib/parseStringToIceServers.spec.ts similarity index 93% rename from apps/meteor/tests/unit/client/providers/CallProvider/lib/parseStringToIceServers.spec.ts rename to apps/meteor/client/providers/CallProvider/lib/parseStringToIceServers.spec.ts index 1c134f71780c..b24564bfb165 100644 --- a/apps/meteor/tests/unit/client/providers/CallProvider/lib/parseStringToIceServers.spec.ts +++ b/apps/meteor/client/providers/CallProvider/lib/parseStringToIceServers.spec.ts @@ -1,7 +1,4 @@ -import { - parseStringToIceServers, - parseStringToIceServer, -} from '../../../../../../client/providers/CallProvider/lib/parseStringToIceServers'; +import { parseStringToIceServers, parseStringToIceServer } from './parseStringToIceServers'; describe('parseStringToIceServers', () => { describe('parseStringToIceServers', () => { diff --git a/apps/meteor/client/providers/ModalProvider/ModalProvider.spec.tsx b/apps/meteor/client/providers/ModalProvider/ModalProvider.spec.tsx index f77933337456..fd82af587760 100644 --- a/apps/meteor/client/providers/ModalProvider/ModalProvider.spec.tsx +++ b/apps/meteor/client/providers/ModalProvider/ModalProvider.spec.tsx @@ -1,10 +1,7 @@ -// import type { IMessage } from '@rocket.chat/core-typings'; -import { Emitter } from '@rocket.chat/emitter'; import { useSetModal } from '@rocket.chat/ui-contexts'; -import { render, screen } from '@testing-library/react'; -import { expect } from 'chai'; -import type { ReactNode } from 'react'; -import React, { Suspense, createContext, useContext, useEffect } from 'react'; +import { act, render, screen } from '@testing-library/react'; +import type { ForwardedRef, ReactElement } from 'react'; +import React, { Suspense, createContext, createRef, forwardRef, useContext, useImperativeHandle } from 'react'; import GenericModal from '../../components/GenericModal'; import { imperativeModal } from '../../lib/imperativeModal'; @@ -12,104 +9,130 @@ import ModalRegion from '../../views/modal/ModalRegion'; import ModalProvider from './ModalProvider'; import ModalProviderWithRegion from './ModalProviderWithRegion'; -const TestContext = createContext({ title: 'default' }); -const emitter = new Emitter(); +const renderWithSuspense = (ui: ReactElement) => + render(ui, { + legacyRoot: true, + wrapper: ({ children }) => {children}, + }); -const TestModal = ({ emitterEvent, modalFunc }: { emitterEvent: string; modalFunc?: () => ReactNode }) => { - const setModal = useSetModal(); - const { title } = useContext(TestContext); +describe('via useSetModal', () => { + const ModalTitleContext = createContext('default'); - useEffect(() => { - emitter.on(emitterEvent, () => { - setModal(modalFunc || undefined}>); - }); - }, [emitterEvent, setModal, title, modalFunc]); + type ModalOpenerAPI = { open: () => void }; - return <>; -}; + const ModalOpener = forwardRef((_: unknown, ref: ForwardedRef) => { + const setModal = useSetModal(); + const title = useContext(ModalTitleContext); + useImperativeHandle(ref, () => ({ + open: () => { + setModal(); + }, + })); + + return null; + }); -describe('Modal Provider', () => { it('should render a modal', async () => { - render( - + const modalOpenerRef = createRef(); + + renderWithSuspense( + + + , + ); + + act(() => { + modalOpenerRef.current?.open(); + }); + + expect(await screen.findByRole('dialog', { name: 'default' })).toBeInTheDocument(); + }); + + it('should render a modal that consumes a context', async () => { + const modalOpenerRef = createRef(); + + renderWithSuspense( + - + - , + , ); - emitter.emit('open'); - expect(await screen.findByText('default')).to.exist; + act(() => { + modalOpenerRef.current?.open(); + }); + + expect(await screen.findByRole('dialog', { name: 'title from context' })).toBeInTheDocument(); }); - it('should render a modal that is passed as a function', async () => { - render( - + it('should render a modal in another region', async () => { + const modalOpener1Ref = createRef(); + const modalOpener2Ref = createRef(); + + renderWithSuspense( + - undefined} />} /> + - , + + + + + + , ); - emitter.emit('open'); - expect(await screen.findByText('function modal')).to.exist; + + act(() => { + modalOpener1Ref.current?.open(); + }); + + expect(await screen.findByRole('dialog', { name: 'modal1' })).toBeInTheDocument(); + + act(() => { + modalOpener2Ref.current?.open(); + }); + + expect(await screen.findByRole('dialog', { name: 'modal2' })).toBeInTheDocument(); }); +}); + +describe('via imperativeModal', () => { + it('should render a modal through imperative modal', async () => { + renderWithSuspense( + + + , + ); - it('should render a modal through imperative modal', () => { - async () => { - render( - - - - - , - ); - - const { close } = imperativeModal.open({ + act(() => { + imperativeModal.open({ component: GenericModal, - props: { title: 'imperativeModal' }, + props: { title: 'imperativeModal', open: true }, }); + }); - expect(await screen.findByText('imperativeModal')).to.exist; + expect(await screen.findByRole('dialog', { name: 'imperativeModal' })).toBeInTheDocument(); - close(); + act(() => { + imperativeModal.close(); + }); - expect(screen.queryByText('imperativeModal')).to.not.exist; - }; + expect(screen.queryByText('imperativeModal')).not.toBeInTheDocument(); }); it('should not render a modal if no corresponding region exists', async () => { // ModalProviderWithRegion will always have a region identifier set // and imperativeModal will only render modals in the default region (e.g no region identifier) - render( - - - , - ); - - imperativeModal.open({ - component: GenericModal, - props: { title: 'imperativeModal' }, - }); - expect(screen.queryByText('imperativeModal')).to.not.exist; - }); + renderWithSuspense(); - it('should render a modal in another region', () => { - render( - - - - - - - - - - , - ); + act(() => { + imperativeModal.open({ + component: GenericModal, + props: { title: 'imperativeModal', open: true }, + }); + }); - emitter.emit('openModal1'); - expect(screen.getByText('modal1')).to.exist; - emitter.emit('openModal2'); - expect(screen.getByText('modal2')).to.exist; + expect(screen.queryByRole('dialog', { name: 'imperativeModal' })).not.toBeInTheDocument(); }); }); diff --git a/apps/meteor/client/providers/ModalProvider/ModalProvider.tsx b/apps/meteor/client/providers/ModalProvider/ModalProvider.tsx index 6c3f1026bc51..27092ea602b6 100644 --- a/apps/meteor/client/providers/ModalProvider/ModalProvider.tsx +++ b/apps/meteor/client/providers/ModalProvider/ModalProvider.tsx @@ -33,7 +33,7 @@ const ModalProvider = ({ children, region }: ModalProviderProps) => { }, region, }), - [currentModal, region, setModal], + [currentModal?.node, currentModal?.region, region, setModal], ); return ; diff --git a/apps/meteor/client/providers/RouterProvider.tsx b/apps/meteor/client/providers/RouterProvider.tsx index 8ba6e699b2b1..590c5f20da57 100644 --- a/apps/meteor/client/providers/RouterProvider.tsx +++ b/apps/meteor/client/providers/RouterProvider.tsx @@ -1,3 +1,5 @@ +import type { RoomType, RoomRouteData } from '@rocket.chat/core-typings'; +import { RouterContext } from '@rocket.chat/ui-contexts'; import type { RouterContextValue, RouteName, @@ -6,15 +8,15 @@ import type { SearchParameters, To, RouteObject, + LocationSearch, } from '@rocket.chat/ui-contexts'; -import { RouterContext } from '@rocket.chat/ui-contexts'; -import type { LocationSearch } from '@rocket.chat/ui-contexts/src/RouterContext'; import { FlowRouter } from 'meteor/kadira:flow-router'; import { Tracker } from 'meteor/tracker'; import type { ReactNode } from 'react'; import React from 'react'; import { appLayout } from '../lib/appLayout'; +import { roomCoordinator } from '../lib/rooms/roomCoordinator'; import { queueMicrotask } from '../lib/utils/queueMicrotask'; const subscribers = new Set<() => void>(); @@ -195,6 +197,9 @@ export const router: RouterContextValue = { defineRoutes, getRoutes, subscribeToRoutesChange, + getRoomRoute(roomType: RoomType, routeData: RoomRouteData) { + return { path: roomCoordinator.getRouteLink(roomType, routeData) || '/' }; + }, }; type RouterProviderProps = { diff --git a/apps/meteor/client/providers/ServerProvider.tsx b/apps/meteor/client/providers/ServerProvider.tsx index 53ac92287f78..7bf442671f08 100644 --- a/apps/meteor/client/providers/ServerProvider.tsx +++ b/apps/meteor/client/providers/ServerProvider.tsx @@ -1,14 +1,14 @@ import type { Serialized } from '@rocket.chat/core-typings'; -import type { Method, PathFor, OperationParams, OperationResult, UrlParams, PathPattern } from '@rocket.chat/rest-typings'; import type { ServerMethodName, ServerMethodParameters, ServerMethodReturn, StreamerCallbackArgs, - UploadResult, StreamNames, StreamKeys, -} from '@rocket.chat/ui-contexts'; +} from '@rocket.chat/ddp-client'; +import type { Method, PathFor, OperationParams, OperationResult, UrlParams, PathPattern } from '@rocket.chat/rest-typings'; +import type { UploadResult } from '@rocket.chat/ui-contexts'; import { ServerContext } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { compile } from 'path-to-regexp'; diff --git a/apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.tsx b/apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.tsx index f9ec077e9e43..cc7cdfbe7761 100644 --- a/apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.tsx +++ b/apps/meteor/client/sidebar/RoomList/SideBarItemTemplateWithData.tsx @@ -8,6 +8,7 @@ import React, { memo, useMemo } from 'react'; import { RoomIcon } from '../../components/RoomIcon'; import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; +import { isIOsDevice } from '../../lib/utils/isIOsDevice'; import { useOmnichannelPriorities } from '../../omnichannel/hooks/useOmnichannelPriorities'; import RoomMenu from '../RoomMenu'; import { OmnichannelBadges } from '../badges/OmnichannelBadges'; @@ -195,6 +196,7 @@ function SideBarItemTemplateWithData({ avatar={AvatarTemplate && } actions={actions} menu={ + !isIOsDevice && !isAnonymous && (!isQueued || (isQueued && isPriorityEnabled)) && ((): ReactElement => ( diff --git a/apps/meteor/client/sidebar/RoomMenu.tsx b/apps/meteor/client/sidebar/RoomMenu.tsx index 8df55bd5d359..06b1352d2803 100644 --- a/apps/meteor/client/sidebar/RoomMenu.tsx +++ b/apps/meteor/client/sidebar/RoomMenu.tsx @@ -200,10 +200,14 @@ const RoomMenu = ({ const menuOptions = useMemo( () => ({ ...(!hideDefaultOptions && { - hideRoom: { - label: { label: t('Hide'), icon: 'eye-off' }, - action: handleHide, - }, + ...(isOmnichannelRoom + ? {} + : { + hideRoom: { + label: { label: t('Hide'), icon: 'eye-off' }, + action: handleHide, + }, + }), toggleRead: { label: { label: isUnread ? t('Mark_read') : t('Mark_unread'), icon: 'flag' }, action: handleToggleRead, diff --git a/apps/meteor/client/sidebar/footer/SidebarFooterDefault.tsx b/apps/meteor/client/sidebar/footer/SidebarFooterDefault.tsx index fbf987fa78af..3d1c17dcebbe 100644 --- a/apps/meteor/client/sidebar/footer/SidebarFooterDefault.tsx +++ b/apps/meteor/client/sidebar/footer/SidebarFooterDefault.tsx @@ -1,7 +1,7 @@ import { css } from '@rocket.chat/css-in-js'; import { Box, SidebarDivider, Palette, SidebarFooter as Footer } from '@rocket.chat/fuselage'; import { useSetting } from '@rocket.chat/ui-contexts'; -import { useThemeMode } from '@rocket.chat/ui-theming/src/hooks/useThemeMode'; +import { useThemeMode } from '@rocket.chat/ui-theming'; import type { ReactElement } from 'react'; import React from 'react'; diff --git a/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx b/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx index c45d300dc4c7..27ad314b2ab8 100644 --- a/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx +++ b/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx @@ -12,6 +12,8 @@ import { FieldError, FieldHint, FieldDescription, + Accordion, + AccordionItem, } from '@rocket.chat/fuselage'; import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; @@ -210,7 +212,7 @@ const CreateChannelModal = ({ teamId = '', onClose, reload }: CreateChannelModal - + {t('Name')} @@ -276,90 +278,99 @@ const CreateChannelModal = ({ teamId = '', onClose, reload }: CreateChannelModal {isPrivate ? t('People_can_only_join_by_being_invited') : t('Anyone_can_access')} - - - {t('Federation_Matrix_Federated')} - ( - + + + + + {t('Security_and_permissions')} + + + + {t('Federation_Matrix_Federated')} + ( + + )} /> - )} - /> - - {t(getFederationHintKey(federatedModule, federationEnabled))} - - - - {t('Encrypted')} - ( - + {t(getFederationHintKey(federatedModule, federationEnabled))} + + + + {t('Encrypted')} + ( + + )} /> - )} - /> - - {getEncryptedHint({ isPrivate, broadcast, encrypted })} - - - - {t('Read_only')} - ( - + {getEncryptedHint({ isPrivate, broadcast, encrypted })} + + + + {t('Read_only')} + ( + + )} /> - )} - /> - - - {readOnly ? t('Read_only_field_hint_enabled', { roomType: 'channel' }) : t('Anyone_can_send_new_messages')} - - - - - {t('Broadcast')} - ( - + + {readOnly ? t('Read_only_field_hint_enabled', { roomType: 'channel' }) : t('Anyone_can_send_new_messages')} + + + + + {t('Broadcast')} + ( + + )} /> - )} - /> - - {broadcast && {t('Broadcast_hint_enabled', { roomType: 'channel' })}} - - + + {broadcast && {t('Broadcast_hint_enabled', { roomType: 'channel' })}} + + + + diff --git a/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx b/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx index b56bb003aa9e..ad1abdcbf399 100644 --- a/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx +++ b/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx @@ -12,6 +12,8 @@ import { FieldError, FieldDescription, FieldHint, + Accordion, + AccordionItem, } from '@rocket.chat/fuselage'; import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import { @@ -169,7 +171,7 @@ const CreateTeamModal = ({ onClose }: { onClose: () => void }): ReactElement => {t('Teams_new_description')} - + {t('Teams_New_Name_Label')} @@ -229,62 +231,77 @@ const CreateTeamModal = ({ onClose }: { onClose: () => void }): ReactElement => {isPrivate ? t('People_can_only_join_by_being_invited') : t('Anyone_can_access')} - - - {t('Teams_New_Read_only_Label')} - ( - + + + + + {t('Security_and_permissions')} + + + + {t('Teams_New_Encrypted_Label')} + ( + + )} /> - )} - /> - - - {readOnly ? t('Read_only_field_hint_enabled', { roomType: 'team' }) : t('Anyone_can_send_new_messages')} - - - - - {t('Teams_New_Encrypted_Label')} - ( - + {getEncryptedHint({ isPrivate, broadcast, encrypted })} + + + + {t('Teams_New_Read_only_Label')} + ( + + )} /> - )} - /> - - {getEncryptedHint({ isPrivate, broadcast, encrypted })} - - - - {t('Teams_New_Broadcast_Label')} - ( - - )} - /> - - {broadcast && {t('Teams_New_Broadcast_Description')}} - - + + + {readOnly ? t('Read_only_field_hint_enabled', { roomType: 'team' }) : t('Anyone_can_send_new_messages')} + + + + + {t('Teams_New_Broadcast_Label')} + ( + + )} + /> + + {broadcast && {t('Teams_New_Broadcast_Description')}} + + + + diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomList.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomList.tsx index b4ddbf32419d..eae8a91015a8 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomList.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomList.tsx @@ -28,9 +28,8 @@ const FederatedRoomList = ({ serverName, roomName, count }: FederatedRoomListPro const { mutate: onClickJoin, isLoading: isLoadingMutation } = useMutation( ['federation/joinExternalPublicRoom'], - async ({ id, pageToken }: IFederationPublicRooms) => { - return joinExternalPublicRoom({ externalRoomId: id as `!${string}:${string}`, roomName, pageToken }); - }, + async ({ id, pageToken }: IFederationPublicRooms) => + joinExternalPublicRoom({ externalRoomId: id as `!${string}:${string}`, roomName, pageToken }), { onSuccess: (_, data) => { dispatchToastMessage({ diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomListItem.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomListItem.tsx index dfaa79ed44de..01cb22c2e1c5 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomListItem.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomListItem.tsx @@ -1,5 +1,6 @@ import { css } from '@rocket.chat/css-in-js'; import { Box, Button, Icon } from '@rocket.chat/fuselage'; +import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import type { IFederationPublicRooms } from '@rocket.chat/rest-typings'; import { useTranslation } from '@rocket.chat/ui-contexts'; import React from 'react'; @@ -23,11 +24,12 @@ const FederatedRoomListItem = ({ disabled, }: FederatedRoomListItemProps) => { const t = useTranslation(); + const nameId = useUniqueId(); return ( - + - + {name} {canJoin && ( diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationManageServerModal.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationManageServerModal.tsx index e3c953dcb950..6909a2cacae0 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationManageServerModal.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationManageServerModal.tsx @@ -1,4 +1,5 @@ -import { Divider, Modal, ButtonGroup, Button, Field, TextInput, FieldLabel, FieldRow, FieldError, FieldHint } from '@rocket.chat/fuselage'; +import { Divider, Modal, ButtonGroup, Button, Field, FieldLabel, FieldRow, FieldError, FieldHint, TextInput } from '@rocket.chat/fuselage'; +import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; import { useSetModal, useTranslation, useEndpoint, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useMutation, useQueryClient } from '@tanstack/react-query'; @@ -55,17 +56,21 @@ const MatrixFederationAddServerModal = ({ onClickClose }: MatrixFederationAddSer const { data, isLoading: isLoadingServerList } = useMatrixServerList(); + const titleId = useUniqueId(); + const serverNameId = useUniqueId(); + return ( - + - {t('Manage_servers')} + {t('Manage_servers')} - {t('Server_name')} + {t('Server_name')} ) => { @@ -76,7 +81,7 @@ const MatrixFederationAddServerModal = ({ onClickClose }: MatrixFederationAddSer }} mie={4} /> - diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationRemoveServerList.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationRemoveServerList.tsx index 361950cd39c9..88867313a5bc 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationRemoveServerList.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationRemoveServerList.tsx @@ -1,5 +1,5 @@ import { css } from '@rocket.chat/css-in-js'; -import { Box, Option, Icon } from '@rocket.chat/fuselage'; +import { Box, Option, IconButton } from '@rocket.chat/fuselage'; import { useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import React from 'react'; @@ -44,11 +44,13 @@ const MatrixFederationRemoveServerList = ({ servers }: MatrixFederationRemoveSer {servers.map(({ name, default: isDefault }) => ( diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.spec.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.spec.tsx new file mode 100644 index 000000000000..5072a1310228 --- /dev/null +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.spec.tsx @@ -0,0 +1,154 @@ +import { mockAppRoot } from '@rocket.chat/mock-providers'; +import { render, screen, within } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import React from 'react'; +import { VirtuosoMockContext } from 'react-virtuoso'; + +import MatrixFederationSearch from './MatrixFederationSearch'; + +jest.mock('../../../lib/rooms/roomCoordinator', () => ({ + roomCoordinator: {}, +})); + +const renderMatrixFederationSearch = ( + serverList = [ + { name: `server-1`, default: true, local: false }, + { name: `server-2`, default: false, local: false }, + { name: `server-3`, default: false, local: false }, + ], +) => { + return render(<>, { + legacyRoot: true, + wrapper: mockAppRoot() + .withEndpoint('GET', '/v1/federation/listServersByUser', () => ({ + servers: serverList, + })) + .withEndpoint('GET', '/v1/federation/searchPublicRooms', ({ serverName, roomName, count }) => ({ + rooms: Array.from({ length: count || 100 }, (_, index) => ({ + id: `Matrix${index}`, + name: `${roomName || 'Matrix'}${index + 1}`, + canJoin: true, + canonicalAlias: `#${serverName}:matrix.org`, + joinedMembers: 44461, + topic: + 'The Official Matrix HQ - chat about Matrix here! | https://matrix.org | https://spec.matrix.org | To support Matrix.org development: https://patreon.com/matrixdotorg | Code of Conduct: https://matrix.org/legal/code-of-conduct/ | This is an English speaking room | The Official Matrix HQ - chat about Matrix here! | https://matrix.org | https://spec.matrix.org | To support Matrix.org development: https://patreon.com/matrixdotorg | Code of Conduct: https://matrix.org/legal/code-of-conduct/ | This is an English speaking room The Official Matrix HQ - chat about Matrix here! | https://matrix.org | https://spec.matrix.org | To support Matrix.org development: https://patreon.com/matrixdotorg | Code of Conduct: https://matrix.org/legal/code-of-conduct/ | This is an English speaking room | The Official Matrix HQ - chat about Matrix here! | https://matrix.org | https://spec.matrix.org | To support Matrix.org development: https://patreon.com/matrixdotorg | Code of Conduct: https://matrix.org/legal/code-of-conduct/ | This is an English speaking room', + })), + count: 1, + total: 73080, + nextPageToken: 'g6FtzZa3oXK+IUpkemFiTlVQUFh6bENKQWhFbDpmYWJyaWMucHVioWTD', + })) + .withEndpoint('POST', '/v1/federation/joinExternalPublicRoom', () => null) + .withEndpoint('POST', '/v1/federation/addServerByUser', ({ serverName }) => { + serverList.push({ name: serverName, default: false, local: false }); + return null; + }) + .withEndpoint('POST', '/v1/federation/removeServerByUser', ({ serverName }) => { + serverList = serverList.filter((server) => server.name !== serverName); + return null; + }) + .withOpenModal() + .wrap((children) => ( + {children} + )) + .build(), + }); +}; + +const openManageServers = async () => { + const manageServerLink = await screen.findByRole('button', { name: 'Manage_server_list' }); + await userEvent.click(manageServerLink); +}; + +it('should render Federated Room search modal', async () => { + renderMatrixFederationSearch(); + + expect(await screen.findByRole('dialog', { name: 'Federation_Federated_room_search' })).toBeInTheDocument(); + + expect(await screen.findByRole('listitem', { name: 'Matrix1' }, { timeout: 2000 })).toBeInTheDocument(); // TODO: remove flakyness + expect(await screen.findByRole('listitem', { name: 'Matrix2' })).toBeInTheDocument(); +}); + +it('should search for rooms', async () => { + renderMatrixFederationSearch(); + + const input = await screen.findByRole('searchbox', { name: 'Search_rooms' }); + expect(input).toBeInTheDocument(); + await userEvent.type(input, 'NotMatrix'); + + expect(await screen.findByRole('listitem', { name: 'NotMatrix1' }, { timeout: 2000 })).toBeInTheDocument(); // TODO: remove flakyness + expect(await screen.findByRole('listitem', { name: 'NotMatrix2' })).toBeInTheDocument(); +}); + +it('should close the modal when joining a room', async () => { + renderMatrixFederationSearch(); + + const firstListItem = await screen.findByRole('listitem', { name: 'Matrix1' }); + const joinButton = await within(firstListItem).findByRole('button', { name: 'Join' }); + + await userEvent.click(joinButton); + + expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); +}); + +// TODO: should be a unit test for `MatrixFederationAddServerModal` +describe('server management', () => { + it('should open the manage server modal', async () => { + renderMatrixFederationSearch(); + + await openManageServers(); + + expect(await screen.findByRole('dialog', { name: 'Manage_servers' })).toBeInTheDocument(); + + expect(await screen.findByText('server-1')).toBeInTheDocument(); + expect(await screen.findByText('server-2')).toBeInTheDocument(); + expect(await screen.findByText('server-3')).toBeInTheDocument(); + }); + + it('should return to the Search modal when clicking cancel', async () => { + renderMatrixFederationSearch(); + + await openManageServers(); + + const cancelButton = await screen.findByRole('button', { name: 'Cancel' }); + await userEvent.click(cancelButton); + + expect(await screen.findByRole('dialog', { name: 'Federation_Federated_room_search' })).toBeInTheDocument(); + }); + + it('should return to the Search modal with the new server selected', async () => { + renderMatrixFederationSearch(); + + await openManageServers(); + + const input = await screen.findByRole('textbox', { name: 'Server_name' }); + await userEvent.type(input, 'server-4'); + + const addButton = await screen.findByRole('button', { name: 'Add' }); + await userEvent.click(addButton); + + expect(await screen.findByRole('dialog', { name: 'Federation_Federated_room_search' })).toBeInTheDocument(); + expect(await screen.findByRole('button', { name: 'server-4' })).toBeInTheDocument(); + }); + + it('should remove servers from the list', async () => { + renderMatrixFederationSearch([ + { name: `server-1`, default: true, local: false }, + { name: `server-2`, default: false, local: false }, + { name: `server-3`, default: false, local: false }, + { name: `server-4`, default: false, local: false }, + ]); + + await openManageServers(); + + const defaultItem = await screen.findByRole('listitem', { name: 'server-1' }); + await userEvent.hover(defaultItem); + expect(within(defaultItem).queryByRole('button', { name: 'Remove' })).not.toBeInTheDocument(); + + const lastItem = await screen.findByRole('listitem', { name: 'server-4' }); + await userEvent.hover(lastItem); + const removeButton = await within(lastItem).findByRole('button', { name: 'Remove' }); + await userEvent.click(removeButton); + + expect(screen.queryByRole('listitem', { name: 'server-4' })).not.toBeInTheDocument(); + }); +}); diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.tsx index f3dc779d28c1..741eadf7bc7e 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.tsx @@ -1,4 +1,5 @@ import { Modal, Skeleton } from '@rocket.chat/fuselage'; +import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import { useTranslation } from '@rocket.chat/ui-contexts'; import React from 'react'; @@ -13,11 +14,12 @@ type MatrixFederationSearchProps = { const MatrixFederationSearch = ({ onClose, defaultSelectedServer }: MatrixFederationSearchProps) => { const t = useTranslation(); const { data, isLoading } = useMatrixServerList(); + const titleId = useUniqueId(); return ( - + - {t('Federation_Federated_room_search')} + {t('Federation_Federated_room_search')} diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearchModalContent.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearchModalContent.tsx index ec6396a83440..878a019fc059 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearchModalContent.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearchModalContent.tsx @@ -1,5 +1,5 @@ import type { SelectOption } from '@rocket.chat/fuselage'; -import { Box, Select, TextInput } from '@rocket.chat/fuselage'; +import { Box, SearchInput, Select } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { useSetModal, useTranslation } from '@rocket.chat/ui-contexts'; import type { FormEvent } from 'react'; @@ -33,7 +33,7 @@ const MatrixFederationSearchModalContent = ({ defaultSelectedServer, servers }: const t = useTranslation(); - const serverOptions = useMemo>(() => servers.map((server): SelectOption => [server.name, server.name]), [servers]); + const serverOptions = useMemo(() => servers.map((server): SelectOption => [server.name, server.name]), [servers]); const manageServers = useCallback(() => { setModal( @@ -47,7 +47,8 @@ const MatrixFederationSearchModalContent = ({ defaultSelectedServer, servers }: handleSort(value as WebdavSortOptions)} options={options} /> )} diff --git a/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.spec.tsx b/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.spec.tsx index 535ed378cec3..ad7159ab7d8e 100644 --- a/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.spec.tsx +++ b/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.spec.tsx @@ -7,6 +7,7 @@ import { MainLayoutStyleTags } from './MainLayoutStyleTags'; describe('MainLayout style tags', () => { it('should create the Light theme style tag', () => { render(, { + legacyRoot: true, wrapper: mockAppRoot().withUserPreference('themeAppearence', 'light').build(), }); const tagLight = queryByAttribute('id', document.head, 'main-palette-light'); @@ -15,6 +16,7 @@ describe('MainLayout style tags', () => { it('should create the Dark theme style tag', () => { render(, { + legacyRoot: true, wrapper: mockAppRoot().withUserPreference('themeAppearence', 'dark').build(), }); const tagDark = queryByAttribute('id', document.head, 'main-palette-dark'); @@ -23,9 +25,28 @@ describe('MainLayout style tags', () => { it('should create the codeBlock style tag when in dark mode', () => { render(, { + legacyRoot: true, wrapper: mockAppRoot().withUserPreference('themeAppearence', 'dark').build(), }); const style = queryByAttribute('id', document.head, 'codeBlock-palette'); expect(style).not.toBeNull(); }); }); + +it('should create the Dark theme style tag', () => { + render(, { + legacyRoot: true, + wrapper: mockAppRoot().withUserPreference('themeAppearence', 'dark').build(), + }); + const tagDark = queryByAttribute('id', document.head, 'main-palette-dark'); + expect(tagDark).not.toBeNull(); +}); + +it('should create the codeBlock style tag when in dark mode', () => { + render(, { + legacyRoot: true, + wrapper: mockAppRoot().withUserPreference('themeAppearence', 'dark').build(), + }); + const style = queryByAttribute('id', document.head, 'codeBlock-palette'); + expect(style).not.toBeNull(); +}); diff --git a/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.tsx b/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.tsx index 662ee415fa26..c46111c5bcc4 100644 --- a/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.tsx +++ b/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.tsx @@ -1,5 +1,5 @@ import { PaletteStyleTag } from '@rocket.chat/fuselage'; -import { useThemeMode } from '@rocket.chat/ui-theming/src/hooks/useThemeMode'; +import { useThemeMode } from '@rocket.chat/ui-theming'; import React from 'react'; import { codeBlock } from '../lib/codeBlockStyles'; diff --git a/apps/meteor/client/views/root/SAMLLoginRoute.spec.tsx b/apps/meteor/client/views/root/SAMLLoginRoute.spec.tsx new file mode 100644 index 000000000000..e642e7851707 --- /dev/null +++ b/apps/meteor/client/views/root/SAMLLoginRoute.spec.tsx @@ -0,0 +1,107 @@ +import { MockedServerContext, MockedUserContext } from '@rocket.chat/mock-providers'; +import { render } from '@testing-library/react'; +import { Meteor } from 'meteor/meteor'; +import React from 'react'; + +import RouterContextMock from '../../../tests/mocks/client/RouterContextMock'; +import SAMLLoginRoute from './SAMLLoginRoute'; + +const navigateStub = jest.fn(); + +beforeEach(() => { + jest.clearAllMocks(); + navigateStub.mockClear(); + (Meteor.loginWithSamlToken as jest.Mock).mockClear(); +}); + +it('should redirect to /home', async () => { + render( + + + + + + + , + { legacyRoot: true }, + ); + + expect(navigateStub).toHaveBeenCalledTimes(1); + expect(navigateStub).toHaveBeenLastCalledWith(expect.objectContaining({ pathname: '/home' }), expect.anything()); +}); + +it('should redirect to /home when userId is not null', async () => { + render( + + + + + + + , + { legacyRoot: true }, + ); + + expect(navigateStub).toHaveBeenCalledTimes(1); + expect(navigateStub).toHaveBeenLastCalledWith(expect.objectContaining({ pathname: '/home' }), expect.anything()); +}); + +it('should redirect to /home when userId is null and redirectUrl is not within the workspace domain', async () => { + render( + + + + + , + { legacyRoot: true }, + ); + + expect(navigateStub).toHaveBeenCalledTimes(1); + expect(navigateStub).toHaveBeenLastCalledWith(expect.objectContaining({ pathname: '/home' }), expect.anything()); +}); + +it('should redirect to the provided redirectUrl when userId is null and redirectUrl is within the workspace domain', async () => { + render( + + + + + , + { legacyRoot: true }, + ); + + expect(navigateStub).toHaveBeenCalledTimes(1); + expect(navigateStub).toHaveBeenLastCalledWith(expect.objectContaining({ pathname: '/invite/test' }), expect.anything()); +}); + +it('should call loginWithSamlToken when component is mounted', async () => { + render( + + + + + , + { legacyRoot: true }, + ); + + expect(Meteor.loginWithSamlToken).toHaveBeenCalledTimes(1); + expect(Meteor.loginWithSamlToken).toHaveBeenLastCalledWith(undefined, expect.any(Function)); +}); + +it('should call loginWithSamlToken with the token when it is present', async () => { + render( + + + + + , + { legacyRoot: true }, + ); + + expect(Meteor.loginWithSamlToken).toHaveBeenCalledTimes(1); + expect(Meteor.loginWithSamlToken).toHaveBeenLastCalledWith('testToken', expect.any(Function)); +}); diff --git a/apps/meteor/client/views/root/SAMLLoginRoute.tsx b/apps/meteor/client/views/root/SAMLLoginRoute.tsx index 61ceb82a5ee7..2e12b036a4b9 100644 --- a/apps/meteor/client/views/root/SAMLLoginRoute.tsx +++ b/apps/meteor/client/views/root/SAMLLoginRoute.tsx @@ -1,5 +1,5 @@ import type { LocationPathname } from '@rocket.chat/ui-contexts'; -import { useRouter, useToastMessageDispatch, useUserId, useAbsoluteUrl } from '@rocket.chat/ui-contexts'; +import { useRouter, useToastMessageDispatch, useAbsoluteUrl } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { useEffect } from 'react'; @@ -38,20 +38,6 @@ const SAMLLoginRoute = () => { }); }, [dispatchToastMessage, rootUrl, router]); - const userId = useUserId(); - useEffect(() => { - if (!userId) { - return; - } - - router.navigate( - { - pathname: '/home', - }, - { replace: true }, - ); - }, [userId, router]); - return null; }; diff --git a/apps/meteor/client/views/teams/contextualBar/channels/AddExistingModal/RoomsAvailableForTeamsAutoComplete.tsx b/apps/meteor/client/views/teams/contextualBar/channels/AddExistingModal/RoomsAvailableForTeamsAutoComplete.tsx index a172869205de..238e3e5ee1ce 100644 --- a/apps/meteor/client/views/teams/contextualBar/channels/AddExistingModal/RoomsAvailableForTeamsAutoComplete.tsx +++ b/apps/meteor/client/views/teams/contextualBar/channels/AddExistingModal/RoomsAvailableForTeamsAutoComplete.tsx @@ -1,4 +1,4 @@ -import { AutoComplete, Box, Option, Options, Chip } from '@rocket.chat/fuselage'; +import { AutoComplete, Box, Option, Chip } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { RoomAvatar } from '@rocket.chat/ui-avatar'; import { useEndpoint } from '@rocket.chat/ui-contexts'; @@ -58,7 +58,7 @@ const RoomsAvailableForTeamsAutoComplete = ({ value, onChange, ...props }: Rooms key={value} {...props} label={label.name} - avatar={} + avatar={} /> )} options={options} diff --git a/apps/meteor/definition/IRoomTypeConfig.ts b/apps/meteor/definition/IRoomTypeConfig.ts index 8ac27be14caf..12a4bea39f05 100644 --- a/apps/meteor/definition/IRoomTypeConfig.ts +++ b/apps/meteor/definition/IRoomTypeConfig.ts @@ -106,7 +106,7 @@ export interface IRoomTypeServerDirectives { notificationMessage: string, userId: string, ) => Promise<{ title: string | undefined; text: string; name: string | undefined }>; - getMsgSender: (senderId: IUser['_id']) => Promise; + getMsgSender: (message: IMessage) => Promise; includeInRoomSearch: () => boolean; getReadReceiptsExtraData: (message: IMessage) => Partial; includeInDashboard: () => boolean; diff --git a/apps/meteor/definition/externals/meteor/meteor.d.ts b/apps/meteor/definition/externals/meteor/meteor.d.ts index 8aed1992c0cf..992595dc07bb 100644 --- a/apps/meteor/definition/externals/meteor/meteor.d.ts +++ b/apps/meteor/definition/externals/meteor/meteor.d.ts @@ -1,5 +1,5 @@ import 'meteor/meteor'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import type { IStreamerConstructor, IStreamer } from 'meteor/rocketchat:streamer'; type StringifyBuffers = { diff --git a/apps/meteor/ee/app/canned-responses/server/methods/removeCannedResponse.ts b/apps/meteor/ee/app/canned-responses/server/methods/removeCannedResponse.ts index 4185cf6356f5..dc0ab665063c 100644 --- a/apps/meteor/ee/app/canned-responses/server/methods/removeCannedResponse.ts +++ b/apps/meteor/ee/app/canned-responses/server/methods/removeCannedResponse.ts @@ -1,12 +1,12 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { CannedResponse } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import notifications from '../../../../../app/notifications/server/lib/Notifications'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { removeCannedResponse(_id: string): Promise; diff --git a/apps/meteor/ee/app/canned-responses/server/methods/saveCannedResponse.ts b/apps/meteor/ee/app/canned-responses/server/methods/saveCannedResponse.ts index 592ddaaf01da..96012a4367f1 100644 --- a/apps/meteor/ee/app/canned-responses/server/methods/saveCannedResponse.ts +++ b/apps/meteor/ee/app/canned-responses/server/methods/saveCannedResponse.ts @@ -1,13 +1,13 @@ import type { IOmnichannelCannedResponse, ILivechatDepartment } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatDepartment, CannedResponse, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import notifications from '../../../../../app/notifications/server/lib/Notifications'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { saveCannedResponse( diff --git a/apps/meteor/ee/app/license/server/methods.ts b/apps/meteor/ee/app/license/server/methods.ts index dbdfe7aea68c..3e0bcca67eb4 100644 --- a/apps/meteor/ee/app/license/server/methods.ts +++ b/apps/meteor/ee/app/license/server/methods.ts @@ -1,10 +1,10 @@ import { type ILicenseTag, type LicenseModule } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { License } from '@rocket.chat/license'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'license:hasLicense'(feature: string): boolean; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeNewRoom.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeNewRoom.ts index 35219fc6e03b..4b0db6814bf2 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeNewRoom.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/beforeNewRoom.ts @@ -2,6 +2,7 @@ import { OmnichannelServiceLevelAgreements } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import { callbacks } from '../../../../../lib/callbacks'; +import { isPlainObject } from '../../../../../lib/utils/isPlainObject'; callbacks.add( 'livechat.beforeRoom', @@ -10,9 +11,11 @@ callbacks.add( return roomInfo; } - const { sla: searchTerm } = extraData; + const { sla: searchTerm, customFields } = extraData; + const roomInfoWithExtraData = { ...roomInfo, ...(isPlainObject(customFields) && { customFields }) }; + if (!searchTerm) { - return roomInfo; + return roomInfoWithExtraData; } const sla = await OmnichannelServiceLevelAgreements.findOneByIdOrName(searchTerm); @@ -23,7 +26,7 @@ callbacks.add( } const { _id: slaId } = sla; - return { ...roomInfo, slaId }; + return { ...roomInfoWithExtraData, slaId }; }, callbacks.priority.MEDIUM, 'livechat-before-new-room', diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/resumeOnHold.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/resumeOnHold.ts index 8a04166e1b72..249f988c7684 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/resumeOnHold.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/resumeOnHold.ts @@ -1,6 +1,6 @@ import { OmnichannelEEService } from '@rocket.chat/core-services'; -import type { ILivechatVisitor, IMessage, IOmnichannelRoom, IRoom, IUser } from '@rocket.chat/core-typings'; -import { isEditedMessage, isOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ILivechatVisitor, IMessage, IOmnichannelRoom, IUser } from '@rocket.chat/core-typings'; +import { isMessageFromVisitor, isEditedMessage } from '@rocket.chat/core-typings'; import { LivechatRooms, LivechatVisitors, Users } from '@rocket.chat/models'; import { callbackLogger } from '../../../../../app/livechat/server/lib/logger'; @@ -16,7 +16,7 @@ const resumeOnHoldCommentAndUser = async (room: IOmnichannelRoom): Promise<{ com projection: { name: 1, username: 1 }, }); if (!visitor) { - callbackLogger.error(`[afterSaveMessage] Visitor Not found for room ${rid} while trying to resume on hold`); + callbackLogger.error(`[afterOmnichannelSaveMessage] Visitor Not found for room ${rid} while trying to resume on hold`); throw new Error('Visitor not found while trying to resume on hold'); } @@ -26,43 +26,46 @@ const resumeOnHoldCommentAndUser = async (room: IOmnichannelRoom): Promise<{ com const resumedBy = await Users.findOneById('rocket.cat'); if (!resumedBy) { - callbackLogger.error(`[afterSaveMessage] User Not found for room ${rid} while trying to resume on hold`); + callbackLogger.error(`[afterOmnichannelSaveMessage] User Not found for room ${rid} while trying to resume on hold`); throw new Error(`User not found while trying to resume on hold`); } return { comment: resumeChatComment, resumedBy }; }; -const handleAfterSaveMessage = async (message: IMessage, room: IRoom) => { - if (isEditedMessage(message) || message.t || !isOmnichannelRoom(room)) { - return message; - } +callbacks.add( + 'afterOmnichannelSaveMessage', + async (message: IMessage, { room }) => { + if (isEditedMessage(message) || message.t) { + return message; + } - const { _id: rid, v: roomVisitor } = room; + const { _id: rid, v: roomVisitor } = room; - if (!roomVisitor?._id) { - return message; - } - - // Need to read the room every time, the room object is not updated - const updatedRoom = await LivechatRooms.findOneById(rid); - if (!updatedRoom) { - return message; - } - - if (message.token && room.onHold) { - callbackLogger.debug(`[afterSaveMessage] Room ${rid} is on hold, resuming it now since visitor sent a message`); + if (!roomVisitor?._id) { + return message; + } - try { - const { comment: resumeChatComment, resumedBy } = await resumeOnHoldCommentAndUser(updatedRoom); - await OmnichannelEEService.resumeRoomOnHold(updatedRoom, resumeChatComment, resumedBy); - } catch (error) { - callbackLogger.error(`[afterSaveMessage] Error while resuming room ${rid} on hold: Error: `, error); + // Need to read the room every time, the room object is not updated + const updatedRoom = await LivechatRooms.findOneById(rid); + if (!updatedRoom) { return message; } - } - return message; -}; + if (isMessageFromVisitor(message) && room.onHold) { + callbackLogger.debug(`[afterOmnichannelSaveMessage] Room ${rid} is on hold, resuming it now since visitor sent a message`); + + try { + const { comment: resumeChatComment, resumedBy } = await resumeOnHoldCommentAndUser(updatedRoom); + await OmnichannelEEService.resumeRoomOnHold(updatedRoom, resumeChatComment, resumedBy); + } catch (error) { + callbackLogger.error(`[afterOmnichannelSaveMessage] Error while resuming room ${rid} on hold: Error: `, error); + return message; + } + } -callbacks.add('afterSaveMessage', handleAfterSaveMessage, callbacks.priority.HIGH, 'livechat-resume-on-hold'); + return message; + }, + callbacks.priority.HIGH, + 'livechat-resume-on-hold', +); diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/scheduleAutoTransfer.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/scheduleAutoTransfer.ts index fdf980c311ab..c0f4b1b9da1d 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/scheduleAutoTransfer.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/scheduleAutoTransfer.ts @@ -1,5 +1,4 @@ -import type { IMessage, IOmnichannelRoom, IRoom } from '@rocket.chat/core-typings'; -import { isOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { IMessage, IOmnichannelRoom } from '@rocket.chat/core-typings'; import type { CloseRoomParams } from '../../../../../app/livechat/server/lib/LivechatTyped'; import { settings } from '../../../../../app/settings/server'; @@ -14,40 +13,6 @@ type LivechatCloseCallbackParams = { let autoTransferTimeout = 0; -const handleAfterSaveMessage = async (message: IMessage, room: IRoom | undefined): Promise => { - if (!room || !isOmnichannelRoom(room)) { - return message; - } - - const { _id: rid, autoTransferredAt, autoTransferOngoing } = room; - const { token, t: messageType } = message; - - if (messageType) { - // ignore system messages - return message; - } - - if (!autoTransferTimeout || autoTransferTimeout <= 0) { - return message; - } - - if (!message || token) { - // ignore messages from visitors - return message; - } - - if (autoTransferredAt) { - return message; - } - - if (!autoTransferOngoing) { - return message; - } - - await AutoTransferChatScheduler.unscheduleRoom(rid); - return message; -}; - const handleAfterCloseRoom = async (params: LivechatCloseCallbackParams): Promise => { const { room } = params; @@ -73,7 +38,7 @@ settings.watch('Livechat_auto_transfer_chat_timeout', (value) => { autoTransferTimeout = value as number; if (!autoTransferTimeout || autoTransferTimeout === 0) { callbacks.remove('livechat.afterTakeInquiry', 'livechat-auto-transfer-job-inquiry'); - callbacks.remove('afterSaveMessage', 'livechat-cancel-auto-transfer-job-after-message'); + callbacks.remove('afterOmnichannelSaveMessage', 'livechat-cancel-auto-transfer-job-after-message'); callbacks.remove('livechat.closeRoom', 'livechat-cancel-auto-transfer-on-close-room'); return; } @@ -98,6 +63,39 @@ settings.watch('Livechat_auto_transfer_chat_timeout', (value) => { callbacks.priority.MEDIUM, 'livechat-auto-transfer-job-inquiry', ); - callbacks.add('afterSaveMessage', handleAfterSaveMessage, callbacks.priority.HIGH, 'livechat-cancel-auto-transfer-job-after-message'); + callbacks.add( + 'afterOmnichannelSaveMessage', + async (message: IMessage, { room }): Promise => { + const { _id: rid, autoTransferredAt, autoTransferOngoing } = room; + const { token, t: messageType } = message; + + if (messageType) { + // ignore system messages + return message; + } + + if (!autoTransferTimeout || autoTransferTimeout <= 0) { + return message; + } + + if (!message || token) { + // ignore messages from visitors + return message; + } + + if (autoTransferredAt) { + return message; + } + + if (!autoTransferOngoing) { + return message; + } + + await AutoTransferChatScheduler.unscheduleRoom(rid); + return message; + }, + callbacks.priority.HIGH, + 'livechat-cancel-auto-transfer-job-after-message', + ); callbacks.add('livechat.closeRoom', handleAfterCloseRoom, callbacks.priority.HIGH, 'livechat-cancel-auto-transfer-on-close-room'); }); diff --git a/apps/meteor/ee/app/livechat-enterprise/server/hooks/setPredictedVisitorAbandonmentTime.ts b/apps/meteor/ee/app/livechat-enterprise/server/hooks/setPredictedVisitorAbandonmentTime.ts index 38238763e0ca..0fc630b5c260 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/hooks/setPredictedVisitorAbandonmentTime.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/hooks/setPredictedVisitorAbandonmentTime.ts @@ -1,57 +1,46 @@ -import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; -import { isEditedMessage, isOmnichannelRoom } from '@rocket.chat/core-typings'; -import { LivechatRooms } from '@rocket.chat/models'; +import type { IMessage } from '@rocket.chat/core-typings'; +import { isEditedMessage, isMessageFromVisitor } from '@rocket.chat/core-typings'; import moment from 'moment'; +import { markRoomResponded } from '../../../../../app/livechat/server/hooks/markRoomResponded'; import { settings } from '../../../../../app/settings/server'; import { callbacks } from '../../../../../lib/callbacks'; import { setPredictedVisitorAbandonmentTime } from '../lib/Helper'; -callbacks.add( - 'afterSaveMessage', - async (message, room) => { - if (!isOmnichannelRoom(room)) { - return message; - } +function shouldSaveInactivity(message: IMessage): boolean { + if (message.t || isEditedMessage(message) || isMessageFromVisitor(message)) { + return false; + } - if ( - !settings.get('Livechat_abandoned_rooms_action') || - settings.get('Livechat_abandoned_rooms_action') === 'none' || - settings.get('Livechat_visitor_inactivity_timeout') <= 0 - ) { - return message; - } - // skips this callback if the message was edited - if (isEditedMessage(message)) { - return message; - } - // if the message has a type means it is a special message (like the closing comment), so skip it - if (message.t) { - return message; - } - // message from visitor - if (message.token) { - return message; - } + const abandonedRoomsAction = settings.get('Livechat_abandoned_rooms_action'); + const visitorInactivityTimeout = settings.get('Livechat_visitor_inactivity_timeout'); + + if (!abandonedRoomsAction || abandonedRoomsAction === 'none' || visitorInactivityTimeout <= 0) { + return false; + } - const latestRoom = await LivechatRooms.findOneById>(room._id, { - projection: { - _id: 1, - responseBy: 1, - departmentId: 1, - }, - }); + return true; +} - if (!latestRoom?.responseBy) { +callbacks.remove('afterOmnichannelSaveMessage', 'markRoomResponded'); + +callbacks.add( + 'afterOmnichannelSaveMessage', + async (message, { room, roomUpdater }) => { + const responseBy = await markRoomResponded(message, room, roomUpdater); + + if (!shouldSaveInactivity(message)) { return message; } - if (moment(latestRoom.responseBy.firstResponseTs).isSame(moment(message.ts))) { - await setPredictedVisitorAbandonmentTime(latestRoom); + if (!responseBy) { + return; } - return message; + if (moment(responseBy.firstResponseTs).isSame(moment(message.ts))) { + await setPredictedVisitorAbandonmentTime({ ...room, responseBy }, roomUpdater); + } }, callbacks.priority.MEDIUM, 'save-visitor-inactivity', -); // This hook priority should always be less than the priority of hook "markRoomResponded" bcs, the room.responseBy.firstMessage property set there is being used here for determining visitor abandonment +); diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/AutoCloseOnHoldScheduler.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/AutoCloseOnHoldScheduler.ts index a893daa4f787..e8402534e40a 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/AutoCloseOnHoldScheduler.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/AutoCloseOnHoldScheduler.ts @@ -33,7 +33,7 @@ export class AutoCloseOnHoldSchedulerClass { mongo: (MongoInternals.defaultRemoteCollectionDriver().mongo as any).client.db(), db: { collection: SCHEDULER_NAME }, defaultConcurrency: 1, - processEvery: '1 minute', + processEvery: process.env.TEST_MODE === 'true' ? '3 seconds' : '1 minute', }); await this.scheduler.start(); diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/AutoTransferChatScheduler.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/AutoTransferChatScheduler.ts index 80af04df6472..b3df0c322545 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/AutoTransferChatScheduler.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/AutoTransferChatScheduler.ts @@ -35,7 +35,7 @@ class AutoTransferChatSchedulerClass { mongo: (MongoInternals.defaultRemoteCollectionDriver().mongo as any).client.db(), db: { collection: SCHEDULER_NAME }, defaultConcurrency: 1, - processEvery: '1 minute', + processEvery: process.env.TEST_MODE === 'true' ? '3 seconds' : '1 minute', }); await this.scheduler.start(); @@ -116,7 +116,7 @@ class AutoTransferChatSchedulerClass { await forwardRoomToAgent(room, { userId: agent.agentId, - transferredBy, + transferredBy: { ...transferredBy, userType: 'user' }, transferredTo: agent, scope: 'autoTransferUnansweredChatsToAgent', comment: timeoutDuration, diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/Helper.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/Helper.ts index 08ea48910f02..3206fe9f94cc 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/Helper.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/Helper.ts @@ -1,5 +1,6 @@ import { api } from '@rocket.chat/core-services'; import type { IOmnichannelRoom, IOmnichannelServiceLevelAgreements, InquiryWithAgentInfo } from '@rocket.chat/core-typings'; +import type { Updater } from '@rocket.chat/models'; import { Rooms as RoomRaw, LivechatRooms, @@ -107,15 +108,11 @@ export const dispatchInquiryPosition = async (inquiry: Omit) => { + return setTimeout(() => { void api.broadcast('omnichannel.room', inquiry.rid, { type: 'queueData', data, }); - }; - - return setTimeout(() => { - propagateInquiryPosition(inquiry); }, 1000); }; @@ -143,7 +140,10 @@ const dispatchWaitingQueueStatus = async (department?: string) => { // but we don't need to notify _each_ change that takes place, just their final position export const debouncedDispatchWaitingQueueStatus = memoizeDebounce(dispatchWaitingQueueStatus, 1200); -export const setPredictedVisitorAbandonmentTime = async (room: Pick) => { +export const setPredictedVisitorAbandonmentTime = async ( + room: Pick, + roomUpdater?: Updater, +) => { if ( !room.responseBy?.firstResponseTs || !settings.get('Livechat_abandoned_rooms_action') || @@ -164,7 +164,11 @@ export const setPredictedVisitorAbandonmentTime = async (room: Pick { diff --git a/apps/meteor/ee/app/livechat-enterprise/server/lib/QueueInactivityMonitor.ts b/apps/meteor/ee/app/livechat-enterprise/server/lib/QueueInactivityMonitor.ts index a861219d6089..a8ffabc1f9f6 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/lib/QueueInactivityMonitor.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/lib/QueueInactivityMonitor.ts @@ -39,7 +39,7 @@ class OmnichannelQueueInactivityMonitorClass { mongo: (MongoInternals.defaultRemoteCollectionDriver().mongo as any).client.db(), db: { collection: SCHEDULER_NAME }, defaultConcurrency: 1, - processEvery: '1 minute', + processEvery: process.env.TEST_MODE === 'true' ? '3 seconds' : '1 minute', }); this.createIndex(); const language = settings.get('Language') || 'en'; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/addMonitor.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/addMonitor.ts index c4ff577fb326..6e6e5a7423d1 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/addMonitor.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/addMonitor.ts @@ -1,11 +1,11 @@ import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { LivechatEnterprise } from '../lib/LivechatEnterprise'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:addMonitor'(username: string): boolean | IUser; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts index 18ed1b1ea646..d32064fdd96c 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/getUnitsFromUserRoles.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatUnit, LivechatDepartmentAgents } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import mem from 'mem'; import { Meteor } from 'meteor/meteor'; @@ -32,7 +32,7 @@ export const getUnitsFromUser = async (user: string): Promise; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/removeBusinessHour.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/removeBusinessHour.ts index d881fa5c1bcb..b71fd06d769f 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/removeBusinessHour.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/removeBusinessHour.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { businessHourManager } from '../../../../../app/livechat/server/business-hour'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeBusinessHour'(id: string, type: string): void; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts index 972c47f67c3c..12352a47d9cb 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/removeMonitor.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { LivechatEnterprise } from '../lib/LivechatEnterprise'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeMonitor'(username: string): boolean; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/removeTag.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/removeTag.ts index 38af03202361..ca9bc93e97ee 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/removeTag.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/removeTag.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { LivechatEnterprise } from '../lib/LivechatEnterprise'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeTag'(id: string): Promise; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/removeUnit.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/removeUnit.ts index 5ff1fb7f7845..c4c193f4b105 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/removeUnit.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/removeUnit.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { LivechatEnterprise } from '../lib/LivechatEnterprise'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:removeUnit'(id: string): boolean; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/resumeOnHold.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/resumeOnHold.ts index d708f8941269..1831ddc98783 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/resumeOnHold.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/resumeOnHold.ts @@ -1,8 +1,8 @@ import { Message } from '@rocket.chat/core-services'; import type { ILivechatVisitor, IOmnichannelSystemMessage } from '@rocket.chat/core-typings'; import { isOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatVisitors, LivechatInquiry, LivechatRooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../../../../app/lib/server/lib/deprecationWarningLogger'; @@ -31,7 +31,7 @@ async function resolveOnHoldCommentInfo(options: { clientAction: boolean }, room return i18n.t('Omnichannel_on_hold_chat_automatically', { guest }); } -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:resumeOnHold'(roomId: string, options?: { clientAction: boolean }): void; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/saveTag.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/saveTag.ts index 42d7c91da971..094c4a97285a 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/saveTag.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/saveTag.ts @@ -1,11 +1,11 @@ import type { ILivechatTag } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { LivechatEnterprise } from '../lib/LivechatEnterprise'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveTag'(id: string, tagData: any, tagDepartments: any): Promise; diff --git a/apps/meteor/ee/app/livechat-enterprise/server/methods/saveUnit.ts b/apps/meteor/ee/app/livechat-enterprise/server/methods/saveUnit.ts index 426dfaf8f81c..d686315e65df 100644 --- a/apps/meteor/ee/app/livechat-enterprise/server/methods/saveUnit.ts +++ b/apps/meteor/ee/app/livechat-enterprise/server/methods/saveUnit.ts @@ -1,11 +1,11 @@ import type { IOmnichannelBusinessUnit } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { LivechatEnterprise } from '../lib/LivechatEnterprise'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'livechat:saveUnit'(_id: string, unitData: any, unitMonitors: any, unitDepartments: any): Omit; diff --git a/apps/meteor/ee/app/message-read-receipt/server/hooks/afterSaveMessage.ts b/apps/meteor/ee/app/message-read-receipt/server/hooks/afterSaveMessage.ts index 5b7a720ba312..9180632768af 100644 --- a/apps/meteor/ee/app/message-read-receipt/server/hooks/afterSaveMessage.ts +++ b/apps/meteor/ee/app/message-read-receipt/server/hooks/afterSaveMessage.ts @@ -1,4 +1,3 @@ -import type { IRoom, IMessage } from '@rocket.chat/core-typings'; import { isEditedMessage, isOmnichannelRoom } from '@rocket.chat/core-typings'; import { Subscriptions } from '@rocket.chat/models'; @@ -7,7 +6,7 @@ import { ReadReceipt } from '../../../../server/lib/message-read-receipt/ReadRec callbacks.add( 'afterSaveMessage', - async (message: IMessage, room: IRoom) => { + async (message, { room }) => { // skips this callback if the message was edited if (isEditedMessage(message)) { return message; diff --git a/apps/meteor/ee/server/api/audit.ts b/apps/meteor/ee/server/api/audit.ts new file mode 100644 index 000000000000..748368f0d569 --- /dev/null +++ b/apps/meteor/ee/server/api/audit.ts @@ -0,0 +1,95 @@ +import type { IUser, IRoom } from '@rocket.chat/core-typings'; +import { Rooms, AuditLog } from '@rocket.chat/models'; +import type { PaginatedRequest, PaginatedResult } from '@rocket.chat/rest-typings'; +import Ajv from 'ajv'; + +import { API } from '../../../app/api/server/api'; +import { getPaginationItems } from '../../../app/api/server/helpers/getPaginationItems'; +import { findUsersOfRoom } from '../../../server/lib/findUsersOfRoom'; + +const ajv = new Ajv({ + coerceTypes: true, +}); + +type AuditRoomMembersParams = PaginatedRequest<{ + roomId: string; + filter: string; +}>; + +const auditRoomMembersSchema = { + type: 'object', + properties: { + roomId: { type: 'string', minLength: 1 }, + filter: { type: 'string' }, + count: { type: 'number' }, + offset: { type: 'number' }, + sort: { type: 'string' }, + }, + required: ['roomId'], + additionalProperties: false, +}; + +export const isAuditRoomMembersProps = ajv.compile(auditRoomMembersSchema); + +declare module '@rocket.chat/rest-typings' { + // eslint-disable-next-line @typescript-eslint/naming-convention + interface Endpoints { + '/v1/audit/rooms.members': { + GET: ( + params: AuditRoomMembersParams, + ) => PaginatedResult<{ members: Pick[] }>; + }; + } +} + +API.v1.addRoute( + 'audit/rooms.members', + { authRequired: true, permissionsRequired: ['view-members-list-all-rooms'], validateParams: isAuditRoomMembersProps }, + { + async get() { + const { roomId, filter } = this.queryParams; + const { count: limit, offset: skip } = await getPaginationItems(this.queryParams); + const { sort } = await this.parseJsonQuery(); + + const room = await Rooms.findOneById>(roomId, { projection: { _id: 1, name: 1, fname: 1 } }); + if (!room) { + return API.v1.notFound(); + } + + const { cursor, totalCount } = findUsersOfRoom({ + rid: room._id, + filter, + skip, + limit, + ...(sort?.username && { sort: { username: sort.username } }), + }); + + const [members, total] = await Promise.all([cursor.toArray(), totalCount]); + + await AuditLog.insertOne({ + ts: new Date(), + results: total, + u: { + _id: this.user._id, + username: this.user.username, + name: this.user.name, + avatarETag: this.user.avatarETag, + }, + fields: { + msg: 'Room_members_list', + rids: [room._id], + type: 'room_member_list', + room: room.name || room.fname, + filters: filter, + }, + }); + + return API.v1.success({ + members, + count: members.length, + offset: skip, + total, + }); + }, + }, +); diff --git a/apps/meteor/ee/server/api/engagementDashboard/channels.ts b/apps/meteor/ee/server/api/engagementDashboard/channels.ts index b2a655f4a843..0d2d140bd575 100644 --- a/apps/meteor/ee/server/api/engagementDashboard/channels.ts +++ b/apps/meteor/ee/server/api/engagementDashboard/channels.ts @@ -3,14 +3,15 @@ import { check, Match } from 'meteor/check'; import { API } from '../../../../app/api/server'; import { getPaginationItems } from '../../../../app/api/server/helpers/getPaginationItems'; -import { findAllChannelsWithNumberOfMessages } from '../../lib/engagementDashboard/channels'; +import { apiDeprecationLogger } from '../../../../app/lib/server/lib/deprecationWarningLogger'; +import { findChannelsWithNumberOfMessages } from '../../lib/engagementDashboard/channels'; import { isDateISOString, mapDateForAPI } from '../../lib/engagementDashboard/date'; declare module '@rocket.chat/rest-typings' { // eslint-disable-next-line @typescript-eslint/naming-convention interface Endpoints { '/v1/engagement-dashboard/channels/list': { - GET: (params: { start: string; end: string; offset?: number; count?: number }) => { + GET: (params: { start: string; end: string; offset?: number; count?: number; hideRoomsWithNoActivity?: boolean }) => { channels: { room: { _id: IRoom['_id']; @@ -45,17 +46,30 @@ API.v1.addRoute( Match.ObjectIncluding({ start: Match.Where(isDateISOString), end: Match.Where(isDateISOString), + hideRoomsWithNoActivity: Match.Maybe(String), offset: Match.Maybe(String), count: Match.Maybe(String), }), ); - const { start, end } = this.queryParams; + const { start, end, hideRoomsWithNoActivity } = this.queryParams; const { offset, count } = await getPaginationItems(this.queryParams); - const { channels, total } = await findAllChannelsWithNumberOfMessages({ + if (hideRoomsWithNoActivity === undefined) { + apiDeprecationLogger.deprecatedParameterUsage( + this.request.route, + 'hideRoomsWithNoActivity', + '7.0.0', + this.response, + ({ parameter, endpoint, version }) => + `Returning rooms that had no activity in ${endpoint} is deprecated and will be removed on version ${version} along with the \`${parameter}\` param. Set \`${parameter}\` as \`true\` to check how the endpoint will behave starting on ${version}`, + ); + } + + const { channels, total } = await findChannelsWithNumberOfMessages({ start: mapDateForAPI(start), end: mapDateForAPI(end), + hideRoomsWithNoActivity: hideRoomsWithNoActivity === 'true', options: { offset, count }, }); diff --git a/apps/meteor/ee/server/lib/audit/methods.ts b/apps/meteor/ee/server/lib/audit/methods.ts index add64414c6e8..a3d32f0635d8 100644 --- a/apps/meteor/ee/server/lib/audit/methods.ts +++ b/apps/meteor/ee/server/lib/audit/methods.ts @@ -1,7 +1,7 @@ import type { ILivechatAgent, ILivechatVisitor, IMessage, IRoom, IUser, IAuditLog } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { LivechatRooms, Messages, Rooms, Users, AuditLog } from '@rocket.chat/models'; import { escapeRegExp } from '@rocket.chat/string-helpers'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; @@ -57,7 +57,7 @@ const getRoomInfoByAuditParams = async ({ } }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { auditGetAuditions: (params: { startDate: Date; endDate: Date }) => IAuditLog[]; diff --git a/apps/meteor/ee/server/lib/audit/startup.ts b/apps/meteor/ee/server/lib/audit/startup.ts index ba50eb48e244..076336b50fe6 100644 --- a/apps/meteor/ee/server/lib/audit/startup.ts +++ b/apps/meteor/ee/server/lib/audit/startup.ts @@ -6,6 +6,7 @@ export const createPermissions = async () => { const permissions = [ { _id: 'can-audit', roles: ['admin', 'auditor'] }, { _id: 'can-audit-log', roles: ['admin', 'auditor-log'] }, + { _id: 'view-members-list-all-rooms', roles: ['admin', 'auditor'] }, ]; const defaultRoles = [ diff --git a/apps/meteor/ee/server/lib/engagementDashboard/channels.ts b/apps/meteor/ee/server/lib/engagementDashboard/channels.ts index 834284ebb9b7..7d08086ee1e9 100644 --- a/apps/meteor/ee/server/lib/engagementDashboard/channels.ts +++ b/apps/meteor/ee/server/lib/engagementDashboard/channels.ts @@ -1,9 +1,69 @@ import type { IDirectMessageRoom, IRoom } from '@rocket.chat/core-typings'; -import { Rooms } from '@rocket.chat/models'; +import { Analytics, Rooms } from '@rocket.chat/models'; import moment from 'moment'; +import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; import { convertDateToInt, diffBetweenDaysInclusive } from './date'; +export const findChannelsWithNumberOfMessages = async ({ + start, + end, + hideRoomsWithNoActivity, + options = {}, +}: { + start: Date; + end: Date; + hideRoomsWithNoActivity: boolean; + options: { + offset?: number; + count?: number; + }; +}): Promise<{ + channels: { + room: { + _id: IRoom['_id']; + name: IRoom['name'] | IRoom['fname']; + ts: IRoom['ts']; + t: IRoom['t']; + _updatedAt: IRoom['_updatedAt']; + usernames?: IDirectMessageRoom['usernames']; + }; + messages: number; + lastWeekMessages: number; + diffFromLastWeek: number; + }[]; + total: number; +}> => { + if (!hideRoomsWithNoActivity) { + return findAllChannelsWithNumberOfMessages({ start, end, options }); + } + + const daysBetweenDates = diffBetweenDaysInclusive(end, start); + const endOfLastWeek = moment(start).subtract(1, 'days').toDate(); + const startOfLastWeek = moment(endOfLastWeek).subtract(daysBetweenDates, 'days').toDate(); + const roomTypes = roomCoordinator.getTypesToShowOnDashboard() as Array; + + const aggregationResult = await Analytics.findRoomsByTypesWithNumberOfMessagesBetweenDate({ + types: roomTypes, + start: convertDateToInt(start), + end: convertDateToInt(end), + startOfLastWeek: convertDateToInt(startOfLastWeek), + endOfLastWeek: convertDateToInt(endOfLastWeek), + options, + }).toArray(); + + // The aggregation result may be undefined if there are no matching analytics or corresponding rooms in the period + if (!aggregationResult.length) { + return { channels: [], total: 0 }; + } + + const [{ channels, total }] = aggregationResult; + return { + channels, + total, + }; +}; + export const findAllChannelsWithNumberOfMessages = async ({ start, end, @@ -34,8 +94,10 @@ export const findAllChannelsWithNumberOfMessages = async ({ const daysBetweenDates = diffBetweenDaysInclusive(end, start); const endOfLastWeek = moment(start).subtract(1, 'days').toDate(); const startOfLastWeek = moment(endOfLastWeek).subtract(daysBetweenDates, 'days').toDate(); + const roomTypes = roomCoordinator.getTypesToShowOnDashboard() as Array; - const channels = await Rooms.findChannelsWithNumberOfMessagesBetweenDate({ + const channels = await Rooms.findChannelsByTypesWithNumberOfMessagesBetweenDate({ + types: roomTypes, start: convertDateToInt(start), end: convertDateToInt(end), startOfLastWeek: convertDateToInt(startOfLastWeek), @@ -43,15 +105,7 @@ export const findAllChannelsWithNumberOfMessages = async ({ options, }).toArray(); - const total = - ( - await Rooms.countChannelsWithNumberOfMessagesBetweenDate({ - start: convertDateToInt(start), - end: convertDateToInt(end), - startOfLastWeek: convertDateToInt(startOfLastWeek), - endOfLastWeek: convertDateToInt(endOfLastWeek), - }).toArray() - )[0]?.total ?? 0; + const total = await Rooms.countDocuments({ t: { $in: roomTypes } }); return { channels, diff --git a/apps/meteor/ee/server/lib/engagementDashboard/messages.ts b/apps/meteor/ee/server/lib/engagementDashboard/messages.ts index 19939ae6e4e1..2a4bf67c12c5 100644 --- a/apps/meteor/ee/server/lib/engagementDashboard/messages.ts +++ b/apps/meteor/ee/server/lib/engagementDashboard/messages.ts @@ -5,7 +5,7 @@ import moment from 'moment'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; import { convertDateToInt, diffBetweenDaysInclusive, convertIntToDate, getTotalOfWeekItems } from './date'; -export const handleMessagesSent = async (message: IMessage, room?: IRoom): Promise => { +export const handleMessagesSent = async (message: IMessage, { room }: { room?: IRoom }): Promise => { const roomTypesToShow = roomCoordinator.getTypesToShowOnDashboard(); if (!room || !roomTypesToShow.includes(room.t)) { return message; diff --git a/apps/meteor/ee/server/lib/message-read-receipt/ReadReceipt.js b/apps/meteor/ee/server/lib/message-read-receipt/ReadReceipt.js index 66be655a7d09..b1d9f43985ad 100644 --- a/apps/meteor/ee/server/lib/message-read-receipt/ReadReceipt.js +++ b/apps/meteor/ee/server/lib/message-read-receipt/ReadReceipt.js @@ -2,11 +2,10 @@ import { api } from '@rocket.chat/core-services'; import { LivechatVisitors, ReadReceipts, Messages, Rooms, Subscriptions, Users } from '@rocket.chat/models'; import { Random } from '@rocket.chat/random'; -import { notifyOnRoomChangedById } from '../../../../app/lib/server/lib/notifyListener'; +import { notifyOnRoomChangedById, notifyOnMessageChange } from '../../../../app/lib/server/lib/notifyListener'; import { settings } from '../../../../app/settings/server'; import { SystemLogger } from '../../../../server/lib/logger/system'; import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator'; -import { broadcastMessageFromData } from '../../../../server/modules/watchers/lib/messages'; // debounced function by roomId, so multiple calls within 2 seconds to same roomId runs only once const list = {}; @@ -70,7 +69,7 @@ export const ReadReceipt = { if (isUserAlone) { const result = await Messages.setAsReadById(message._id); if (result.modifiedCount > 0) { - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: message._id, }); } diff --git a/apps/meteor/ee/server/methods/getReadReceipts.ts b/apps/meteor/ee/server/methods/getReadReceipts.ts index 78fe8a4d967e..04a6ed1dff35 100644 --- a/apps/meteor/ee/server/methods/getReadReceipts.ts +++ b/apps/meteor/ee/server/methods/getReadReceipts.ts @@ -1,14 +1,14 @@ import type { ReadReceipt as ReadReceiptType, IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { License } from '@rocket.chat/license'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomIdAsync } from '../../../app/authorization/server/functions/canAccessRoom'; import { ReadReceipt } from '../lib/message-read-receipt/ReadReceipt'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getReadReceipts(options: { messageId: IMessage['_id'] }): ReadReceiptType[]; diff --git a/apps/meteor/ee/server/models/raw/LivechatRooms.ts b/apps/meteor/ee/server/models/raw/LivechatRooms.ts index 3295af1b6179..5b89704a522c 100644 --- a/apps/meteor/ee/server/models/raw/LivechatRooms.ts +++ b/apps/meteor/ee/server/models/raw/LivechatRooms.ts @@ -7,6 +7,7 @@ import type { } from '@rocket.chat/core-typings'; import { LivechatPriorityWeight, DEFAULT_SLA_CONFIG } from '@rocket.chat/core-typings'; import type { ILivechatRoomsModel } from '@rocket.chat/model-typings'; +import type { Updater } from '@rocket.chat/models'; import type { FindCursor, UpdateResult, Document, FindOptions, Db, Collection, Filter, AggregationCursor } from 'mongodb'; import { readSecondaryPreferred } from '../../../../server/database/readSecondaryPreferred'; @@ -20,6 +21,7 @@ declare module '@rocket.chat/model-typings' { unsetPredictedVisitorAbandonmentByRoomId(rid: string): Promise; findAbandonedOpenRooms(date: Date, extraQuery?: Filter): FindCursor; setPredictedVisitorAbandonmentByRoomId(roomId: string, date: Date): Promise; + getPredictedVisitorAbandonmentByRoomIdUpdateQuery(date: Date, roomUpdater: Updater): Updater; unsetAllPredictedVisitorAbandonment(): Promise; setOnHoldByRoomId(roomId: string): Promise; unsetOnHoldByRoomId(roomId: string): Promise; @@ -209,6 +211,13 @@ export class LivechatRoomsRawEE extends LivechatRoomsRaw implements ILivechatRoo ); } + getPredictedVisitorAbandonmentByRoomIdUpdateQuery( + date: Date, + roomUpdater: Updater = this.getUpdater(), + ): Updater { + return roomUpdater.set('omnichannel.predictedVisitorAbandonmentAt', date); + } + setPredictedVisitorAbandonmentByRoomId(rid: string, willBeAbandonedAt: Date): Promise { const query = { _id: rid, diff --git a/apps/meteor/ee/server/services/CHANGELOG.md b/apps/meteor/ee/server/services/CHANGELOG.md index 5061db00d075..230250c5ca64 100644 --- a/apps/meteor/ee/server/services/CHANGELOG.md +++ b/apps/meteor/ee/server/services/CHANGELOG.md @@ -1,5 +1,158 @@ # rocketchat-services +## 1.3.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 + - @rocket.chat/ui-kit@0.36.0 + - @rocket.chat/rest-typings@6.11.0 +
+ +## 1.3.0-rc.6 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
+ +## 1.3.0-rc.5 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
+ +## 1.3.0-rc.4 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
+ +## 1.3.0-rc.3 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
+ +## 1.3.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
+ +## 1.3.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
+ +## 1.3.0-rc.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/ui-kit@0.36.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 + +## 1.2.2 + +### Patch Changes + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +-
Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/models@0.1.2 +
+ +## 1.2.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/models@0.1.1 +
+ ## 1.2.0 ### Minor Changes diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index b36f89a01c3e..76a0c59d54e6 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -1,7 +1,7 @@ { "name": "rocketchat-services", "private": true, - "version": "1.2.0", + "version": "1.3.0", "description": "Rocket.Chat Authorization service", "main": "index.js", "scripts": { @@ -18,7 +18,7 @@ "author": "Rocket.Chat", "license": "MIT", "dependencies": { - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.0", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "~0.31.25", diff --git a/apps/meteor/ee/server/settings/video-conference.ts b/apps/meteor/ee/server/settings/video-conference.ts index e32f34fb8dae..358ceb260414 100644 --- a/apps/meteor/ee/server/settings/video-conference.ts +++ b/apps/meteor/ee/server/settings/video-conference.ts @@ -31,6 +31,25 @@ export function addSettings(): Promise { public: true, invalidValue: true, }); + + const discussionsEnabled = { _id: 'Discussion_enabled', value: true }; + + await this.add('VideoConf_Enable_Persistent_Chat', false, { + type: 'boolean', + public: true, + invalidValue: false, + alert: 'VideoConf_Enable_Persistent_Chat_Alert', + enableQuery: [discussionsEnabled], + }); + + const persistentChatEnabled = { _id: 'VideoConf_Enable_Persistent_Chat', value: true }; + + await this.add('VideoConf_Persistent_Chat_Discussion_Name', 'Conference Call Chat History', { + type: 'string', + public: true, + invalidValue: 'Conference Call Chat History', + enableQuery: [discussionsEnabled, persistentChatEnabled], + }); }, ); }); diff --git a/apps/meteor/ee/server/startup/audit.ts b/apps/meteor/ee/server/startup/audit.ts index c38794a7582e..9f8135a16a65 100644 --- a/apps/meteor/ee/server/startup/audit.ts +++ b/apps/meteor/ee/server/startup/audit.ts @@ -4,6 +4,7 @@ import { createPermissions } from '../lib/audit/startup'; await License.onLicense('auditing', async () => { await import('../lib/audit/methods'); + await import('../api/audit'); await createPermissions(); }); diff --git a/apps/meteor/ee/server/startup/presence.ts b/apps/meteor/ee/server/startup/presence.ts index 0e7ba8a2b951..e0756e4b4c59 100644 --- a/apps/meteor/ee/server/startup/presence.ts +++ b/apps/meteor/ee/server/startup/presence.ts @@ -46,8 +46,8 @@ Meteor.startup(() => { })(); }); - Accounts.onLogout((login: any): void => { - void Presence.removeConnection(login.user._id, login.connection.id, nodeId); + Accounts.onLogout((login): void => { + void Presence.removeConnection(login.user?._id, login.connection.id, nodeId); updateConns(); }); diff --git a/apps/meteor/imports/personal-access-tokens/server/api/methods/generateToken.ts b/apps/meteor/imports/personal-access-tokens/server/api/methods/generateToken.ts index a7dfc6ab46f6..7badb659774f 100644 --- a/apps/meteor/imports/personal-access-tokens/server/api/methods/generateToken.ts +++ b/apps/meteor/imports/personal-access-tokens/server/api/methods/generateToken.ts @@ -1,13 +1,13 @@ import { Meteor } from 'meteor/meteor'; import { Random } from '@rocket.chat/random'; import { Accounts } from 'meteor/accounts-base'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { twoFactorRequired } from '../../../../../app/2fa/server/twoFactorRequired'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'personalAccessTokens:generateToken'(params: { tokenName: string; bypassTwoFactor: boolean }): Promise; diff --git a/apps/meteor/imports/personal-access-tokens/server/api/methods/regenerateToken.ts b/apps/meteor/imports/personal-access-tokens/server/api/methods/regenerateToken.ts index 8fa323644283..14629ce4dd9d 100644 --- a/apps/meteor/imports/personal-access-tokens/server/api/methods/regenerateToken.ts +++ b/apps/meteor/imports/personal-access-tokens/server/api/methods/regenerateToken.ts @@ -1,11 +1,11 @@ import { Meteor } from 'meteor/meteor'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { twoFactorRequired } from '../../../../../app/2fa/server/twoFactorRequired'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'personalAccessTokens:regenerateToken'(params: { tokenName: string }): Promise; diff --git a/apps/meteor/imports/personal-access-tokens/server/api/methods/removeToken.ts b/apps/meteor/imports/personal-access-tokens/server/api/methods/removeToken.ts index 7da13fe48eeb..0f03e6087ee2 100644 --- a/apps/meteor/imports/personal-access-tokens/server/api/methods/removeToken.ts +++ b/apps/meteor/imports/personal-access-tokens/server/api/methods/removeToken.ts @@ -1,11 +1,11 @@ import { Meteor } from 'meteor/meteor'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; import { hasPermissionAsync } from '../../../../../app/authorization/server/functions/hasPermission'; import { twoFactorRequired } from '../../../../../app/2fa/server/twoFactorRequired'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'personalAccessTokens:removeToken'(params: { tokenName: string }): Promise; diff --git a/apps/meteor/jest.config.ts b/apps/meteor/jest.config.ts index fb9c6f1247a9..8dc7fa033e03 100644 --- a/apps/meteor/jest.config.ts +++ b/apps/meteor/jest.config.ts @@ -1,33 +1,34 @@ +import client from '@rocket.chat/jest-presets/client'; +import server from '@rocket.chat/jest-presets/server'; import type { Config } from 'jest'; -const config: Config = { +export default { projects: [ { displayName: 'client', - testEnvironment: 'jsdom', + preset: client.preset, + setupFilesAfterEnv: [...client.setupFilesAfterEnv], + testMatch: [ '/client/**/**.spec.[jt]s?(x)', '/tests/unit/client/views/**/*.spec.{ts,tsx}', '/tests/unit/client/providers/**/*.spec.{ts,tsx}', ], - errorOnDeprecated: true, - - modulePathIgnorePatterns: ['/dist/'], - - transform: { - '^.+\\.(t|j)sx?$': '@swc/jest', - }, moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', '^react($|/.+)': '/node_modules/react$1', + '^react-dom/client$': '/node_modules/react-dom$1', + '^react-dom($|/.+)': '/node_modules/react-dom$1', + '^react-i18next($|/.+)': '/node_modules/react-i18next$1', '^@tanstack/(.+)': '/node_modules/@tanstack/$1', - '^meteor/(.*)': '/.meteorMocks/index.ts', + '^meteor/(.*)': '/tests/mocks/client/meteor.ts', }, + + coveragePathIgnorePatterns: ['/tests/'], }, { displayName: 'server', - testEnvironment: 'node', + preset: server.preset, testMatch: [ '/app/livechat/server/business-hour/**/*.spec.ts?(x)', @@ -36,23 +37,6 @@ const config: Config = { '/app/cloud/server/functions/supportedVersionsToken/**.spec.ts', '/app/utils/lib/**.spec.ts', ], - transformIgnorePatterns: ['!/node_modules/jose'], - errorOnDeprecated: true, - - modulePathIgnorePatterns: ['/dist/'], - - transform: { - '^.+\\.(t|j)sx?$': '@swc/jest', - }, - - moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', - '^react($|/.+)': '/node_modules/react$1', - '^@tanstack/(.+)': '/node_modules/@tanstack/$1', - }, }, ], - collectCoverage: true, -}; - -export default config; +} satisfies Config; diff --git a/apps/meteor/lib/callbacks.ts b/apps/meteor/lib/callbacks.ts index 08b16fc1a54a..7eaa9ed7595d 100644 --- a/apps/meteor/lib/callbacks.ts +++ b/apps/meteor/lib/callbacks.ts @@ -23,6 +23,7 @@ import type { MessageMention, OmnichannelSourceType, } from '@rocket.chat/core-typings'; +import type { Updater } from '@rocket.chat/models'; import type { FilterOperators } from 'mongodb'; import type { ILoginAttempt } from '../app/authentication/server/ILoginAttempt'; @@ -49,7 +50,8 @@ interface EventLikeCallbackSignatures { 'afterDeleteUser': (user: IUser) => void; 'afterFileUpload': (params: { user: IUser; room: IRoom; message: IMessage }) => void; 'afterRoomNameChange': (params: { rid: string; name: string; oldName: string }) => void; - 'afterSaveMessage': (message: IMessage, room: IRoom, uid?: string) => void; + 'afterSaveMessage': (message: IMessage, params: { room: IRoom; uid?: string; roomUpdater?: Updater }) => void; + 'afterOmnichannelSaveMessage': (message: IMessage, constant: { room: IOmnichannelRoom; roomUpdater: Updater }) => void; 'livechat.removeAgentDepartment': (params: { departmentId: ILivechatDepartmentRecord['_id']; agentsId: ILivechatAgent['_id'][] }) => void; 'livechat.saveAgentDepartment': (params: { departmentId: ILivechatDepartmentRecord['_id']; agentsId: ILivechatAgent['_id'][] }) => void; 'livechat.closeRoom': (params: { room: IOmnichannelRoom; options: CloseRoomParams['options'] }) => void; @@ -63,7 +65,10 @@ interface EventLikeCallbackSignatures { ) => void; 'livechat.afterAgentRemoved': (params: { agent: Pick }) => void; 'afterAddedToRoom': (params: { user: IUser; inviter?: IUser }, room: IRoom) => void; - 'beforeAddedToRoom': (params: { user: AtLeast; inviter: IUser }) => void; + 'beforeAddedToRoom': (params: { + user: AtLeast; + inviter: AtLeast; + }) => void; 'afterCreateDirectRoom': (params: IRoom, second: { members: IUser[]; creatorId: IUser['_id'] }) => void; 'beforeDeleteRoom': (params: IRoom) => void; 'beforeJoinDefaultChannels': (user: IUser) => void; diff --git a/apps/meteor/lib/rooms/coordinator.ts b/apps/meteor/lib/rooms/coordinator.ts index 9cd12d83f21c..41c4521f4f51 100644 --- a/apps/meteor/lib/rooms/coordinator.ts +++ b/apps/meteor/lib/rooms/coordinator.ts @@ -1,4 +1,5 @@ import type { RoomType } from '@rocket.chat/core-typings'; +import type { LocationPathname } from '@rocket.chat/ui-contexts'; import type { IRoomTypeConfig, @@ -40,7 +41,7 @@ export abstract class RoomCoordinator { return this.roomTypes[identifier].config; } - public getRouteLink(roomType: string, subData: RoomIdentification): string | false { + public getRouteLink(roomType: string, subData: RoomIdentification): LocationPathname | false { const config = this.getRoomTypeConfig(roomType); if (!config?.route) { return false; @@ -76,7 +77,7 @@ export abstract class RoomCoordinator { // but keep the root slash if it's the only one path = path.match(/^\/{1}$/) ? path : path.replace(/\/$/, ''); - return path; + return path as LocationPathname; } protected getRouteData(roomType: string, subData: RoomIdentification): Record | false { diff --git a/apps/meteor/lib/utils/isPlainObject.ts b/apps/meteor/lib/utils/isPlainObject.ts new file mode 100644 index 000000000000..a2bcf15cc590 --- /dev/null +++ b/apps/meteor/lib/utils/isPlainObject.ts @@ -0,0 +1,3 @@ +export function isPlainObject(value: unknown) { + return value !== null && typeof value === 'object' && !Array.isArray(value); +} diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 0a4877dbeede..5addaf756f8a 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/meteor", "description": "The Ultimate Open Source WebChat Platform", - "version": "6.11.0-develop", + "version": "6.12.0-develop", "private": true, "author": { "name": "Rocket.Chat", @@ -31,25 +31,25 @@ "stylelint": "stylelint \"app/**/*.css\" \"client/**/*.css\" \"app/**/*.less\" \"client/**/*.less\" \"ee/**/*.less\"", "stylelint:fix": "stylelint --fix \"app/**/*.css\" \"client/**/*.css\" \"app/**/*.less\" \"client/**/*.less\" \"ee/**/*.less\"", "typecheck": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" tsc -p tsconfig.typecheck.json", - "deploy": "npm run build && pm2 startOrRestart pm2.json", + "deploy": "yarn build && pm2 startOrRestart pm2.json", "coverage": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' nyc -r html mocha --config ./.mocharc.js", "test:e2e": "playwright test", "test:e2e:federation": "playwright test --config=playwright-federation.config.ts", "test:e2e:nyc": "nyc report --reporter=lcov", "testapi": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.api.js", - "testunit": "npm run .testunit:definition && npm run .testunit:client && npm run .testunit:server:cov", + "testunit": "yarn .testunit:definition && yarn .testunit:client && yarn .testunit:server:cov", ".testunit:server": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.js", ".testunit:server:cov": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' nyc -r text -r lcov mocha --config ./.mocharc.js", - ".testunit:client": "jest --silent && TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.client.js --exit", + ".testunit:client": "jest", ".testunit:definition": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.definition.js", "testunit-watch": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --watch --config ./.mocharc.js", - "test": "npm run testapi && npm run testui", + "test": "yarn testunit && yarn testapi", "translation-diff": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' ts-node .scripts/translation-diff.ts", "translation-check": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' ts-node .scripts/translation-check.ts", "translation-fix-order": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' ts-node .scripts/translation-fix-order.ts", "version": "node .scripts/version.js", "set-version": "node .scripts/set-version.js", - "release": "meteor npm run set-version --silent", + "release": "meteor yarn set-version --silent", "storybook": "cross-env NODE_OPTIONS=--max-old-space-size=8192 start-storybook -p 6006 --no-version-updates", "prepare": "node playwright.prepare.mjs", "docker:start": "docker-compose up" @@ -75,6 +75,7 @@ "@faker-js/faker": "~8.0.2", "@playwright/test": "^1.40.1", "@rocket.chat/eslint-config": "workspace:^", + "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/livechat": "workspace:^", "@rocket.chat/mock-providers": "workspace:^", "@settlin/spacebars-loader": "^1.0.9", @@ -85,12 +86,9 @@ "@storybook/addons": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "0.0.13", - "@swc/core": "^1.3.95", - "@swc/jest": "^0.2.29", "@tanstack/react-query-devtools": "^4.19.1", - "@testing-library/react": "~12.1.5", - "@testing-library/react-hooks": "^8.0.1", - "@testing-library/user-event": "~13.5.0", + "@testing-library/react": "~16.0.0", + "@testing-library/user-event": "~14.5.2", "@types/adm-zip": "^0.5.3", "@types/archiver": "^5.3.4", "@types/bad-words": "^3.0.2", @@ -116,6 +114,7 @@ "@types/he": "^1.1.2", "@types/i18next-sprintf-postprocessor": "^0.2.2", "@types/imap": "^0.8.39", + "@types/jest": "~29.5.12", "@types/jsdom": "^16.2.15", "@types/jsdom-global": "^3.0.6", "@types/jsrsasign": "^10.5.11", @@ -181,11 +180,11 @@ "eslint-plugin-prettier": "~4.2.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", - "eslint-plugin-testing-library": "~5.11.1", + "eslint-plugin-testing-library": "~6.2.2", "eslint-plugin-you-dont-need-lodash-underscore": "~6.12.0", "fast-glob": "^3.2.12", "i18next": "~23.4.9", - "jest": "~29.6.4", + "jest": "~29.7.0", "jsdom-global": "^3.0.2", "mocha": "^9.2.2", "nyc": "^15.1.0", @@ -231,7 +230,7 @@ "@rocket.chat/agenda": "workspace:^", "@rocket.chat/api-client": "workspace:^", "@rocket.chat/apps": "workspace:^", - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.0", "@rocket.chat/base64": "workspace:^", "@rocket.chat/cas-validate": "workspace:^", "@rocket.chat/core-services": "workspace:^", @@ -242,10 +241,10 @@ "@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.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", - "@rocket.chat/fuselage-toastbar": "^0.32.0", + "@rocket.chat/fuselage-toastbar": "^0.33.0", "@rocket.chat/fuselage-tokens": "^0.33.1", "@rocket.chat/fuselage-ui-kit": "workspace:^", "@rocket.chat/gazzodown": "workspace:^", diff --git a/apps/meteor/reporters/jira.ts b/apps/meteor/reporters/jira.ts index 706856389003..c9fee4748fe5 100644 --- a/apps/meteor/reporters/jira.ts +++ b/apps/meteor/reporters/jira.ts @@ -68,10 +68,10 @@ class JIRAReporter implements Reporter { console.log(`Sending test result to JIRA: ${JSON.stringify(payload)}`); // first search and check if there is an existing issue - + // replace all ()[]- with nothing const search = await fetch( `${this.url}/rest/api/2/search?${new URLSearchParams({ - jql: `project = FLAKY AND summary ~ '${payload.name}'`, + jql: `project = FLAKY AND summary ~ '${payload.name.replace(/[\(\)\[\]-]/g, '')}'`, })}`, { method: 'GET', @@ -104,6 +104,25 @@ class JIRAReporter implements Reporter { if (existing) { const { location } = test; + if (this.pr === 0) { + await fetch(`${this.url}/rest/api/2/issue/${existing.key}`, { + method: 'PUT', + body: JSON.stringify({ + update: { + labels: [ + { + add: 'flaky_Develop', + }, + ], + }, + }), + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Basic ${this.apiKey}`, + }, + }); + } + await fetch(`${this.url}/rest/api/2/issue/${existing.key}/comment`, { method: 'POST', body: JSON.stringify({ @@ -146,6 +165,7 @@ ${this.run_url} project: { key: 'FLAKY', }, + ...(this.pr === 0 && { labels: ['flaky_Develop'] }), }, }; diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts b/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts index 642d989f85b6..0797d896f22d 100644 --- a/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts +++ b/apps/meteor/server/features/EmailInbox/EmailInbox_Incoming.ts @@ -12,11 +12,11 @@ import type { ParsedMail, Attachment } from 'mailparser'; import stripHtml from 'string-strip-html'; import { FileUpload } from '../../../app/file-upload/server'; +import { notifyOnMessageChange } from '../../../app/lib/server/lib/notifyListener'; import { Livechat as LivechatTyped } from '../../../app/livechat/server/lib/LivechatTyped'; import { QueueManager } from '../../../app/livechat/server/lib/QueueManager'; import { settings } from '../../../app/settings/server'; import { i18n } from '../../lib/i18n'; -import { broadcastMessageFromData } from '../../modules/watchers/lib/messages'; import { logger } from './logger'; type FileAttachment = VideoAttachmentProps & ImageAttachmentProps & AudioAttachmentProps; @@ -234,7 +234,7 @@ export async function onEmailReceived(email: ParsedMail, inbox: string, departme }, ); room && (await LivechatRooms.updateEmailThreadByRoomId(room._id, thread)); - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: msgId, }); }) diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts b/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts index 708d00422b5d..51718e4937d8 100644 --- a/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts +++ b/apps/meteor/server/features/EmailInbox/EmailInbox_Outgoing.ts @@ -1,16 +1,16 @@ import { isIMessageInbox } from '@rocket.chat/core-typings'; -import type { IEmailInbox, IUser, IMessage, IOmnichannelRoom, SlashCommandCallbackParams } from '@rocket.chat/core-typings'; +import type { IEmailInbox, IUser, IOmnichannelRoom, SlashCommandCallbackParams } from '@rocket.chat/core-typings'; import { Messages, Uploads, LivechatRooms, Rooms, Users } from '@rocket.chat/models'; import { Match } from 'meteor/check'; import type Mail from 'nodemailer/lib/mailer'; import { FileUpload } from '../../../app/file-upload/server'; import { sendMessage } from '../../../app/lib/server/functions/sendMessage'; +import { notifyOnMessageChange } from '../../../app/lib/server/lib/notifyListener'; import { settings } from '../../../app/settings/server'; import { slashCommands } from '../../../app/utils/server/slashCommand'; import { callbacks } from '../../../lib/callbacks'; import { i18n } from '../../lib/i18n'; -import { broadcastMessageFromData } from '../../modules/watchers/lib/messages'; import { inboxes } from './EmailInbox'; import type { Inbox } from './EmailInbox'; import { logger } from './logger'; @@ -171,7 +171,7 @@ slashCommands.add({ }, }, ); - void broadcastMessageFromData({ + void notifyOnMessageChange({ id: message._id, }); @@ -190,7 +190,9 @@ slashCommands.add({ callbacks.add( 'afterSaveMessage', - async (message: IMessage, room: any) => { + async (message, { room: omnichannelRoom }) => { + const room = omnichannelRoom as IOmnichannelRoom; + if (!room?.email?.inbox) { return message; } diff --git a/apps/meteor/server/hooks/sauMonitorHooks.ts b/apps/meteor/server/hooks/sauMonitorHooks.ts index 74d45c7ba2de..3137ab41237a 100644 --- a/apps/meteor/server/hooks/sauMonitorHooks.ts +++ b/apps/meteor/server/hooks/sauMonitorHooks.ts @@ -33,9 +33,12 @@ Accounts.onLogin((info: ILoginAttempt) => { deviceManagementEvents.emit('device-login', eventObject); }); -Accounts.onLogout((info: { user: Meteor.User; connection: Meteor.Connection }) => { +Accounts.onLogout((info) => { const { httpHeaders } = info.connection; + if (!info.user) { + return; + } sauEvents.emit('accounts.logout', { userId: info.user._id, connection: { instanceId: InstanceStatus.id(), ...info.connection, httpHeaders: httpHeaders as IncomingHttpHeaders }, diff --git a/apps/meteor/server/lib/ldap/Connection.ts b/apps/meteor/server/lib/ldap/Connection.ts index 167f1b36e508..b753a2baa9dc 100644 --- a/apps/meteor/server/lib/ldap/Connection.ts +++ b/apps/meteor/server/lib/ldap/Connection.ts @@ -660,12 +660,8 @@ export class LDAPConnection { this.client._updateIdle(override); } - protected async maybeBindDN(): Promise { - if (this.usingAuthentication) { - return; - } - - if (!this.options.authentication) { + protected async maybeBindDN({ forceBindAuthenticationUser = false } = {}): Promise { + if (!forceBindAuthenticationUser && (this.usingAuthentication || !this.options.authentication)) { return; } @@ -692,6 +688,10 @@ export class LDAPConnection { return this.maybeBindDN(); } + public async bindAuthenticationUser(): Promise { + return this.maybeBindDN({ forceBindAuthenticationUser: true }); + } + /* Get list of options to initialize a new ldapjs Client */ diff --git a/apps/meteor/server/lib/ldap/Manager.ts b/apps/meteor/server/lib/ldap/Manager.ts index 4a5cdf2df8d6..ab000b142225 100644 --- a/apps/meteor/server/lib/ldap/Manager.ts +++ b/apps/meteor/server/lib/ldap/Manager.ts @@ -44,6 +44,8 @@ export class LDAPManager { const slugifiedUsername = this.slugifyUsername(ldapUser, username); const user = await this.findExistingUser(ldapUser, slugifiedUsername); + // Bind connection to the admin user so that RC has full access to groups in the next steps + await ldap.bindAuthenticationUser(); if (user) { return await this.loginExistingUser(ldap, user, ldapUser, password); } diff --git a/apps/meteor/server/lib/oauth/addOAuthService.ts b/apps/meteor/server/lib/oauth/addOAuthService.ts index db84cb467ffc..2a49a23a1f4e 100644 --- a/apps/meteor/server/lib/oauth/addOAuthService.ts +++ b/apps/meteor/server/lib/oauth/addOAuthService.ts @@ -118,7 +118,6 @@ export async function addOAuthService(name: string, values: { [k: string]: strin section: `Custom OAuth: ${name}`, i18nLabel: 'Accounts_OAuth_Custom_Button_Label_Color', persistent: true, - alert: 'OAuth_button_colors_alert', }); await settingsRegistry.add(`Accounts_OAuth_Custom-${name}-button_color`, values.buttonColor || '#1d74f5', { type: 'string', @@ -126,7 +125,6 @@ export async function addOAuthService(name: string, values: { [k: string]: strin section: `Custom OAuth: ${name}`, i18nLabel: 'Accounts_OAuth_Custom_Button_Color', persistent: true, - alert: 'OAuth_button_colors_alert', }); await settingsRegistry.add(`Accounts_OAuth_Custom-${name}-key_field`, values.keyField || 'username', { type: 'select', diff --git a/apps/meteor/server/lib/pushConfig.ts b/apps/meteor/server/lib/pushConfig.ts index 2cf944bef737..fb2f91c4b868 100644 --- a/apps/meteor/server/lib/pushConfig.ts +++ b/apps/meteor/server/lib/pushConfig.ts @@ -1,6 +1,6 @@ import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { AppsTokens } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; @@ -30,7 +30,7 @@ export const executePushTest = async (userId: IUser['_id'], username: IUser['use return tokens; }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { push_test(): { message: string; params: number[] }; diff --git a/apps/meteor/server/lib/resetUserE2EKey.ts b/apps/meteor/server/lib/resetUserE2EKey.ts index 3f30251dbb11..8535eee9a2cd 100644 --- a/apps/meteor/server/lib/resetUserE2EKey.ts +++ b/apps/meteor/server/lib/resetUserE2EKey.ts @@ -2,6 +2,7 @@ import { api } from '@rocket.chat/core-services'; import { Subscriptions, Users, Rooms } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; +import { notifyOnUserChange } from '../../app/lib/server/lib/notifyListener'; import * as Mailer from '../../app/mailer/server/api'; import { settings } from '../../app/settings/server'; import { i18n } from './i18n'; @@ -76,5 +77,7 @@ export async function resetUserE2EEncriptionKey(uid: string, notifyUser: boolean // Force the user to logout, so that the keys can be generated again await Users.unsetLoginTokens(uid); + void notifyOnUserChange({ clientAction: 'updated', id: uid, diff: { 'services.resume.loginTokens': [] } }); + return true; } diff --git a/apps/meteor/server/lib/rooms/roomCoordinator.ts b/apps/meteor/server/lib/rooms/roomCoordinator.ts index c640b8fec4b8..4f4242f5a34a 100644 --- a/apps/meteor/server/lib/rooms/roomCoordinator.ts +++ b/apps/meteor/server/lib/rooms/roomCoordinator.ts @@ -50,8 +50,8 @@ class RoomCoordinatorServer extends RoomCoordinator { return { title, text, name: room.name }; }, - getMsgSender(senderId: IUser['_id']): Promise { - return Users.findOneById(senderId); + getMsgSender(message: IMessage): Promise { + return Users.findOneById(message.u._id); }, includeInRoomSearch(): boolean { return false; diff --git a/apps/meteor/server/lib/rooms/roomTypes/livechat.ts b/apps/meteor/server/lib/rooms/roomTypes/livechat.ts index a6b870042696..7a00f75796c0 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/livechat.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/livechat.ts @@ -1,4 +1,5 @@ import type { AtLeast, ValueOf } from '@rocket.chat/core-typings'; +import { isMessageFromVisitor } from '@rocket.chat/core-typings'; import { LivechatVisitors, LivechatRooms } from '@rocket.chat/models'; import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig'; @@ -38,8 +39,10 @@ roomCoordinator.add(LivechatRoomType, { return { title, text, name: roomName }; }, - async getMsgSender(senderId) { - return LivechatVisitors.findOneEnabledById(senderId); + async getMsgSender(message) { + if (isMessageFromVisitor(message)) { + return LivechatVisitors.findOneEnabledById(message.u._id); + } }, getReadReceiptsExtraData(message) { diff --git a/apps/meteor/server/lib/rooms/roomTypes/voip.ts b/apps/meteor/server/lib/rooms/roomTypes/voip.ts index 7925cd65e302..c7cb26b476b4 100644 --- a/apps/meteor/server/lib/rooms/roomTypes/voip.ts +++ b/apps/meteor/server/lib/rooms/roomTypes/voip.ts @@ -19,7 +19,7 @@ roomCoordinator.add(VoipRoomType, { return { title, text, name: room.name }; }, - async getMsgSender(senderId) { - return Users.findOneById(senderId); + async getMsgSender(message) { + return Users.findOneById(message.u._id); }, } as AtLeast); diff --git a/apps/meteor/server/methods/OEmbedCacheCleanup.ts b/apps/meteor/server/methods/OEmbedCacheCleanup.ts index 158964125502..80e83959d5b0 100644 --- a/apps/meteor/server/methods/OEmbedCacheCleanup.ts +++ b/apps/meteor/server/methods/OEmbedCacheCleanup.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { OEmbedCache } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { OEmbedCacheCleanup(): { message: string }; diff --git a/apps/meteor/server/methods/addAllUserToRoom.ts b/apps/meteor/server/methods/addAllUserToRoom.ts index 0c4f1532371d..c07bdc48040a 100644 --- a/apps/meteor/server/methods/addAllUserToRoom.ts +++ b/apps/meteor/server/methods/addAllUserToRoom.ts @@ -1,7 +1,7 @@ import { Message } from '@rocket.chat/core-services'; import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -11,7 +11,7 @@ import { getDefaultSubscriptionPref } from '../../app/utils/lib/getDefaultSubscr import { callbacks } from '../../lib/callbacks'; import { getSubscriptionAutotranslateDefaultConfig } from '../lib/getSubscriptionAutotranslateDefaultConfig'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addAllUserToRoom(rid: IRoom['_id'], activeUsersOnly?: boolean): Promise; diff --git a/apps/meteor/server/methods/addRoomLeader.ts b/apps/meteor/server/methods/addRoomLeader.ts index d8c9d1a7351f..b8e09b44065a 100644 --- a/apps/meteor/server/methods/addRoomLeader.ts +++ b/apps/meteor/server/methods/addRoomLeader.ts @@ -1,14 +1,14 @@ import { api, Message, Team } from '@rocket.chat/core-services'; import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addRoomLeader(rid: IRoom['_id'], userId: IUser['_id']): boolean; diff --git a/apps/meteor/server/methods/addRoomModerator.ts b/apps/meteor/server/methods/addRoomModerator.ts index 357629a8155e..ef64ced09423 100644 --- a/apps/meteor/server/methods/addRoomModerator.ts +++ b/apps/meteor/server/methods/addRoomModerator.ts @@ -1,15 +1,15 @@ import { api, Message, Team } from '@rocket.chat/core-services'; import type { IRoom, IUser } from '@rocket.chat/core-typings'; import { isRoomFederated } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addRoomModerator(rid: IRoom['_id'], userId: IUser['_id']): boolean; diff --git a/apps/meteor/server/methods/addRoomOwner.ts b/apps/meteor/server/methods/addRoomOwner.ts index 5ee7a9dd74d2..f64e6699a4cb 100644 --- a/apps/meteor/server/methods/addRoomOwner.ts +++ b/apps/meteor/server/methods/addRoomOwner.ts @@ -1,15 +1,15 @@ import { api, Message, Team } from '@rocket.chat/core-services'; import type { IRoom, IUser } from '@rocket.chat/core-typings'; import { isRoomFederated } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { addRoomOwner(rid: IRoom['_id'], userId: IUser['_id']): boolean; diff --git a/apps/meteor/server/methods/afterVerifyEmail.ts b/apps/meteor/server/methods/afterVerifyEmail.ts index c9c4819ed4f6..06bf389b0a03 100644 --- a/apps/meteor/server/methods/afterVerifyEmail.ts +++ b/apps/meteor/server/methods/afterVerifyEmail.ts @@ -1,11 +1,11 @@ import type { IRole } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Roles, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; const rolesToChangeTo: Map = new Map([['anonymous', ['user']]]); -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { afterVerifyEmail(): void; diff --git a/apps/meteor/server/methods/browseChannels.ts b/apps/meteor/server/methods/browseChannels.ts index 5516b83d184a..965accc83954 100644 --- a/apps/meteor/server/methods/browseChannels.ts +++ b/apps/meteor/server/methods/browseChannels.ts @@ -1,8 +1,8 @@ import { Team } from '@rocket.chat/core-services'; import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Users, Subscriptions } from '@rocket.chat/models'; import { escapeRegExp } from '@rocket.chat/string-helpers'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import mem from 'mem'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; @@ -308,7 +308,7 @@ const getUsers = async ( }; }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { browseChannels: (params: { diff --git a/apps/meteor/server/methods/canAccessRoom.ts b/apps/meteor/server/methods/canAccessRoom.ts index 945dd0e9a14f..eeff599a8585 100644 --- a/apps/meteor/server/methods/canAccessRoom.ts +++ b/apps/meteor/server/methods/canAccessRoom.ts @@ -1,13 +1,13 @@ import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomAsync } from '../../app/authorization/server'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { canAccessRoom(rid: IRoom['_id'], userId: IUser['_id'], extraData?: Record): (IRoom & { username?: string }) | boolean; diff --git a/apps/meteor/server/methods/channelsList.ts b/apps/meteor/server/methods/channelsList.ts index 4a2a154a191a..654c4aa070d6 100644 --- a/apps/meteor/server/methods/channelsList.ts +++ b/apps/meteor/server/methods/channelsList.ts @@ -1,6 +1,6 @@ import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Subscriptions, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { FindOptions } from 'mongodb'; @@ -11,7 +11,7 @@ import { settings } from '../../app/settings/server'; import { getUserPreference } from '../../app/utils/server/lib/getUserPreference'; import { trim } from '../../lib/utils/stringUtils'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { channelsList(filter: string, channelType: string, limit?: number, sort?: string): { channels: IRoom[] }; diff --git a/apps/meteor/server/methods/createDirectMessage.ts b/apps/meteor/server/methods/createDirectMessage.ts index ccbfe8916cae..51847454fe61 100644 --- a/apps/meteor/server/methods/createDirectMessage.ts +++ b/apps/meteor/server/methods/createDirectMessage.ts @@ -1,7 +1,7 @@ import type { ICreateRoomParams } from '@rocket.chat/core-services'; import type { ICreatedRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check, Match } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -119,7 +119,7 @@ export async function createDirectMessage( }; } -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { createDirectMessage(...usernames: Exclude[]): Omit; diff --git a/apps/meteor/server/methods/deleteFileMessage.ts b/apps/meteor/server/methods/deleteFileMessage.ts index 42b52c404301..7fbf8650bd2a 100644 --- a/apps/meteor/server/methods/deleteFileMessage.ts +++ b/apps/meteor/server/methods/deleteFileMessage.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { DeleteResult } from 'mongodb'; @@ -7,7 +7,7 @@ import type { DeleteResult } from 'mongodb'; import { FileUpload } from '../../app/file-upload/server'; import { deleteMessageValidatingPermission } from '../../app/lib/server/functions/deleteMessage'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteFileMessage(fileID: string): Promise; diff --git a/apps/meteor/server/methods/deleteUser.ts b/apps/meteor/server/methods/deleteUser.ts index e8b1f6eeed65..32dc4f8eb313 100644 --- a/apps/meteor/server/methods/deleteUser.ts +++ b/apps/meteor/server/methods/deleteUser.ts @@ -1,14 +1,14 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { deleteUser } from '../../app/lib/server/functions/deleteUser'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { deleteUser(userId: IUser['_id'], confirmRelinquish?: boolean): boolean; diff --git a/apps/meteor/server/methods/eraseRoom.ts b/apps/meteor/server/methods/eraseRoom.ts index b9b4833ad67f..e11c0fe6dcfd 100644 --- a/apps/meteor/server/methods/eraseRoom.ts +++ b/apps/meteor/server/methods/eraseRoom.ts @@ -1,7 +1,7 @@ import { AppEvents, Apps } from '@rocket.chat/apps'; import { Message, Team } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -58,7 +58,7 @@ export async function eraseRoom(rid: string, uid: string): Promise { } } -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { eraseRoom(rid: string): Promise; diff --git a/apps/meteor/server/methods/getAvatarSuggestion.ts b/apps/meteor/server/methods/getAvatarSuggestion.ts index 5cf8cdd2e4b1..f00c1a6563d2 100644 --- a/apps/meteor/server/methods/getAvatarSuggestion.ts +++ b/apps/meteor/server/methods/getAvatarSuggestion.ts @@ -1,11 +1,11 @@ import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; import { getAvatarSuggestionForUser } from '../../app/lib/server/functions/getAvatarSuggestionForUser'; import { methodDeprecationLogger } from '../../app/lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getAvatarSuggestion(): Record< diff --git a/apps/meteor/server/methods/getPasswordPolicy.ts b/apps/meteor/server/methods/getPasswordPolicy.ts index cc35f1cfb514..483938716093 100644 --- a/apps/meteor/server/methods/getPasswordPolicy.ts +++ b/apps/meteor/server/methods/getPasswordPolicy.ts @@ -1,12 +1,13 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods, TranslationKey } from '@rocket.chat/ui-contexts'; +import type { TranslationKey } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { passwordPolicy } from '../../app/lib/server'; import { methodDeprecationLogger } from '../../app/lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getPasswordPolicy(params: { token: string }): { diff --git a/apps/meteor/server/methods/getRoomById.ts b/apps/meteor/server/methods/getRoomById.ts index c14009a59451..ce21f9c9a043 100644 --- a/apps/meteor/server/methods/getRoomById.ts +++ b/apps/meteor/server/methods/getRoomById.ts @@ -1,13 +1,13 @@ import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomAsync } from '../../app/authorization/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getRoomById(rid: IRoom['_id']): IRoom; diff --git a/apps/meteor/server/methods/getRoomIdByNameOrId.ts b/apps/meteor/server/methods/getRoomIdByNameOrId.ts index d660a43d3f6f..91dbf555fe79 100644 --- a/apps/meteor/server/methods/getRoomIdByNameOrId.ts +++ b/apps/meteor/server/methods/getRoomIdByNameOrId.ts @@ -1,12 +1,12 @@ // DEPRECATE +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomAsync } from '../../app/authorization/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getRoomIdByNameOrId(rid: string): string; diff --git a/apps/meteor/server/methods/getRoomNameById.ts b/apps/meteor/server/methods/getRoomNameById.ts index 3aec8ed249aa..ebe0ade89f44 100644 --- a/apps/meteor/server/methods/getRoomNameById.ts +++ b/apps/meteor/server/methods/getRoomNameById.ts @@ -1,12 +1,12 @@ import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getRoomNameById(rid: IRoom['_id']): Promise; diff --git a/apps/meteor/server/methods/getSetupWizardParameters.ts b/apps/meteor/server/methods/getSetupWizardParameters.ts index 808c308611f3..e204b02514f9 100644 --- a/apps/meteor/server/methods/getSetupWizardParameters.ts +++ b/apps/meteor/server/methods/getSetupWizardParameters.ts @@ -1,11 +1,11 @@ import type { ISetting } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getSetupWizardParameters(): Promise<{ diff --git a/apps/meteor/server/methods/getTotalChannels.ts b/apps/meteor/server/methods/getTotalChannels.ts index 45449f104e6b..f1492d85d458 100644 --- a/apps/meteor/server/methods/getTotalChannels.ts +++ b/apps/meteor/server/methods/getTotalChannels.ts @@ -1,8 +1,8 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getTotalChannels(): number; diff --git a/apps/meteor/server/methods/getUsersOfRoom.ts b/apps/meteor/server/methods/getUsersOfRoom.ts index dde359f8e490..d3d69ce93754 100644 --- a/apps/meteor/server/methods/getUsersOfRoom.ts +++ b/apps/meteor/server/methods/getUsersOfRoom.ts @@ -1,6 +1,6 @@ import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -8,7 +8,7 @@ import { canAccessRoomAsync, roomAccessAttributes } from '../../app/authorizatio import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { findUsersOfRoom } from '../lib/findUsersOfRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { getUsersOfRoom( diff --git a/apps/meteor/server/methods/hideRoom.ts b/apps/meteor/server/methods/hideRoom.ts index 64397969cca0..a53a328d549a 100644 --- a/apps/meteor/server/methods/hideRoom.ts +++ b/apps/meteor/server/methods/hideRoom.ts @@ -1,9 +1,9 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { hideRoom(rid: string): Promise; diff --git a/apps/meteor/server/methods/ignoreUser.ts b/apps/meteor/server/methods/ignoreUser.ts index 980efbd31ba4..358fc3be3d8f 100644 --- a/apps/meteor/server/methods/ignoreUser.ts +++ b/apps/meteor/server/methods/ignoreUser.ts @@ -1,9 +1,9 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { ignoreUser(params: { rid: string; userId: string; ignore?: boolean }): boolean; diff --git a/apps/meteor/server/methods/loadHistory.ts b/apps/meteor/server/methods/loadHistory.ts index a2b44ffab519..44f4e8e98e7c 100644 --- a/apps/meteor/server/methods/loadHistory.ts +++ b/apps/meteor/server/methods/loadHistory.ts @@ -1,6 +1,6 @@ import type { IMessage, IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { hasPermissionAsync } from '../../app/authorization/server/functions/has import { loadMessageHistory } from '../../app/lib/server/functions/loadMessageHistory'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { loadHistory( diff --git a/apps/meteor/server/methods/loadLocale.ts b/apps/meteor/server/methods/loadLocale.ts index 8cf011c18067..891f708037b9 100644 --- a/apps/meteor/server/methods/loadLocale.ts +++ b/apps/meteor/server/methods/loadLocale.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { getMomentLocale } from '../lib/getMomentLocale'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { loadLocale(locale: string): string | undefined; diff --git a/apps/meteor/server/methods/loadMissedMessages.ts b/apps/meteor/server/methods/loadMissedMessages.ts index f2bdc1c4f0e0..7c0ac4609066 100644 --- a/apps/meteor/server/methods/loadMissedMessages.ts +++ b/apps/meteor/server/methods/loadMissedMessages.ts @@ -1,12 +1,12 @@ import type { IMessage, IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomIdAsync } from '../../app/authorization/server/functions/canAccessRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { loadMissedMessages(rid: IRoom['_id'], ts: Date): Promise; diff --git a/apps/meteor/server/methods/loadNextMessages.ts b/apps/meteor/server/methods/loadNextMessages.ts index a5ff7b6940c5..db3235a498cc 100644 --- a/apps/meteor/server/methods/loadNextMessages.ts +++ b/apps/meteor/server/methods/loadNextMessages.ts @@ -1,13 +1,13 @@ import type { IMessage, IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomIdAsync } from '../../app/authorization/server/functions/canAccessRoom'; import { normalizeMessagesForUser } from '../../app/utils/server/lib/normalizeMessagesForUser'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { loadNextMessages(rid: IRoom['_id'], end?: Date, limit?: number): Promise<{ messages: IMessage[] }>; diff --git a/apps/meteor/server/methods/loadSurroundingMessages.ts b/apps/meteor/server/methods/loadSurroundingMessages.ts index d4cd54dfc2a5..3ea0e1492a80 100644 --- a/apps/meteor/server/methods/loadSurroundingMessages.ts +++ b/apps/meteor/server/methods/loadSurroundingMessages.ts @@ -1,6 +1,6 @@ import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { FindOptions } from 'mongodb'; @@ -8,7 +8,7 @@ import type { FindOptions } from 'mongodb'; import { canAccessRoomIdAsync } from '../../app/authorization/server/functions/canAccessRoom'; import { normalizeMessagesForUser } from '../../app/utils/server/lib/normalizeMessagesForUser'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { loadSurroundingMessages( diff --git a/apps/meteor/server/methods/logoutCleanUp.ts b/apps/meteor/server/methods/logoutCleanUp.ts index 359933faccbd..c4ac54020ef7 100644 --- a/apps/meteor/server/methods/logoutCleanUp.ts +++ b/apps/meteor/server/methods/logoutCleanUp.ts @@ -1,12 +1,12 @@ import { AppEvents, Apps } from '@rocket.chat/apps'; import type { IUser } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { afterLogoutCleanUpCallback } from '../../lib/callbacks/afterLogoutCleanUpCallback'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { logoutCleanUp(user: IUser): Promise; diff --git a/apps/meteor/server/methods/messageSearch.ts b/apps/meteor/server/methods/messageSearch.ts index 3ba7b59d2655..e49e3f21a67e 100644 --- a/apps/meteor/server/methods/messageSearch.ts +++ b/apps/meteor/server/methods/messageSearch.ts @@ -1,6 +1,6 @@ import type { ISubscription, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -10,7 +10,7 @@ import { settings } from '../../app/settings/server'; import { readSecondaryPreferred } from '../database/readSecondaryPreferred'; import { parseMessageSearchQuery } from '../lib/parseMessageSearchQuery'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { messageSearch(text: string, rid?: string, limit?: number, offset?: number): IRawSearchResult | boolean; diff --git a/apps/meteor/server/methods/muteUserInRoom.ts b/apps/meteor/server/methods/muteUserInRoom.ts index 95a0331d9bee..07e9683806da 100644 --- a/apps/meteor/server/methods/muteUserInRoom.ts +++ b/apps/meteor/server/methods/muteUserInRoom.ts @@ -1,7 +1,7 @@ import { Message } from '@rocket.chat/core-services'; import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Subscriptions, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -12,7 +12,7 @@ import { RoomMemberActions } from '../../definition/IRoomTypeConfig'; import { callbacks } from '../../lib/callbacks'; import { roomCoordinator } from '../lib/rooms/roomCoordinator'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { muteUserInRoom(data: { rid: IRoom['_id']; username: string }): boolean; diff --git a/apps/meteor/server/methods/openRoom.ts b/apps/meteor/server/methods/openRoom.ts index 3348104862b5..b2957768f237 100644 --- a/apps/meteor/server/methods/openRoom.ts +++ b/apps/meteor/server/methods/openRoom.ts @@ -1,10 +1,10 @@ import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { openRoom(rid: IRoom['_id']): Promise; diff --git a/apps/meteor/server/methods/readMessages.ts b/apps/meteor/server/methods/readMessages.ts index ed1c9fd6441e..217ba948b093 100644 --- a/apps/meteor/server/methods/readMessages.ts +++ b/apps/meteor/server/methods/readMessages.ts @@ -1,13 +1,13 @@ import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomAsync } from '../../app/authorization/server'; import { readMessages } from '../lib/readMessages'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { readMessages(rid: string, readThreads?: boolean): Promise; diff --git a/apps/meteor/server/methods/readThreads.ts b/apps/meteor/server/methods/readThreads.ts index 234d0181294c..8f3652b7012c 100644 --- a/apps/meteor/server/methods/readThreads.ts +++ b/apps/meteor/server/methods/readThreads.ts @@ -1,6 +1,6 @@ import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { settings } from '../../app/settings/server'; import { readThread } from '../../app/threads/server/functions'; import { callbacks } from '../../lib/callbacks'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { readThreads(tmid: IMessage['_id']): void; diff --git a/apps/meteor/server/methods/registerUser.ts b/apps/meteor/server/methods/registerUser.ts index e67181f3b089..09e44c5e1b82 100644 --- a/apps/meteor/server/methods/registerUser.ts +++ b/apps/meteor/server/methods/registerUser.ts @@ -1,6 +1,6 @@ import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Accounts } from 'meteor/accounts-base'; import { Match, check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; @@ -11,7 +11,7 @@ import { validateEmailDomain, passwordPolicy, RateLimiter } from '../../app/lib/ import { settings } from '../../app/settings/server'; import { trim } from '../../lib/utils/stringUtils'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { registerUser( diff --git a/apps/meteor/server/methods/removeRoomLeader.ts b/apps/meteor/server/methods/removeRoomLeader.ts index 40b217e2b793..754d68960a4a 100644 --- a/apps/meteor/server/methods/removeRoomLeader.ts +++ b/apps/meteor/server/methods/removeRoomLeader.ts @@ -1,14 +1,14 @@ import { api, Message, Team } from '@rocket.chat/core-services'; import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { removeRoomLeader(rid: IRoom['_id'], userId: IUser['_id']): boolean; diff --git a/apps/meteor/server/methods/removeRoomModerator.ts b/apps/meteor/server/methods/removeRoomModerator.ts index a0d24159e4c8..291cc294a5fa 100644 --- a/apps/meteor/server/methods/removeRoomModerator.ts +++ b/apps/meteor/server/methods/removeRoomModerator.ts @@ -1,15 +1,15 @@ import { api, Message, Team } from '@rocket.chat/core-services'; import type { IRoom, IUser } from '@rocket.chat/core-typings'; import { isRoomFederated } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { removeRoomModerator(rid: IRoom['_id'], userId: IUser['_id']): boolean; diff --git a/apps/meteor/server/methods/removeRoomOwner.ts b/apps/meteor/server/methods/removeRoomOwner.ts index 37311898177c..82ee2c37f9b8 100644 --- a/apps/meteor/server/methods/removeRoomOwner.ts +++ b/apps/meteor/server/methods/removeRoomOwner.ts @@ -1,7 +1,7 @@ import { api, Message, Team } from '@rocket.chat/core-services'; import { isRoomFederated } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { getUsersInRole } from '../../app/authorization/server'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { removeRoomOwner(rid: string, userId: string): boolean; diff --git a/apps/meteor/server/methods/removeUserFromRoom.ts b/apps/meteor/server/methods/removeUserFromRoom.ts index 6662ae8d22cf..2f0e703a3b66 100644 --- a/apps/meteor/server/methods/removeUserFromRoom.ts +++ b/apps/meteor/server/methods/removeUserFromRoom.ts @@ -1,8 +1,8 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import { AppsEngineException } from '@rocket.chat/apps-engine/definition/exceptions'; import { Message, Team } from '@rocket.chat/core-services'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Rooms, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -17,7 +17,7 @@ import { afterRemoveFromRoomCallback } from '../../lib/callbacks/afterRemoveFrom import { removeUserFromRolesAsync } from '../lib/roles/removeUserFromRoles'; import { roomCoordinator } from '../lib/rooms/roomCoordinator'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { removeUserFromRoom(data: { rid: string; username: string }): boolean; diff --git a/apps/meteor/server/methods/reportMessage.ts b/apps/meteor/server/methods/reportMessage.ts index 05ac5aaf7e7b..cc240a2fb291 100644 --- a/apps/meteor/server/methods/reportMessage.ts +++ b/apps/meteor/server/methods/reportMessage.ts @@ -1,14 +1,14 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import type { IMessage } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { ModerationReports, Rooms, Users, Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { canAccessRoomAsync } from '../../app/authorization/server/functions/canAccessRoom'; import { methodDeprecationLogger } from '../../app/lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { reportMessage(messageId: IMessage['_id'], description: string): Promise; diff --git a/apps/meteor/server/methods/requestDataDownload.ts b/apps/meteor/server/methods/requestDataDownload.ts index bedad2e0e316..80769aae6340 100644 --- a/apps/meteor/server/methods/requestDataDownload.ts +++ b/apps/meteor/server/methods/requestDataDownload.ts @@ -3,14 +3,14 @@ import { tmpdir } from 'os'; import path, { join } from 'path'; import type { IExportOperation } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { ExportOperations, UserDataFiles } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { settings } from '../../app/settings/server'; import * as dataExport from '../lib/dataExport'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { requestDataDownload(params: { fullExport?: boolean }): Promise<{ diff --git a/apps/meteor/server/methods/resetAvatar.ts b/apps/meteor/server/methods/resetAvatar.ts index 1ed59482840e..8df7beb72545 100644 --- a/apps/meteor/server/methods/resetAvatar.ts +++ b/apps/meteor/server/methods/resetAvatar.ts @@ -1,7 +1,7 @@ import { api } from '@rocket.chat/core-services'; import type { IUser } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; @@ -9,7 +9,7 @@ import { hasPermissionAsync } from '../../app/authorization/server/functions/has import { FileUpload } from '../../app/file-upload/server'; import { settings } from '../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { resetAvatar(userId: IUser['_id']): void; diff --git a/apps/meteor/server/methods/roomNameExists.ts b/apps/meteor/server/methods/roomNameExists.ts index e99def10215e..f510391ddd8e 100644 --- a/apps/meteor/server/methods/roomNameExists.ts +++ b/apps/meteor/server/methods/roomNameExists.ts @@ -1,11 +1,11 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { methodDeprecationLogger } from '../../app/lib/server/lib/deprecationWarningLogger'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { roomNameExists(roomName: string): boolean; diff --git a/apps/meteor/server/methods/saveUserPreferences.ts b/apps/meteor/server/methods/saveUserPreferences.ts index dbc6bf835640..f19e653f7ccc 100644 --- a/apps/meteor/server/methods/saveUserPreferences.ts +++ b/apps/meteor/server/methods/saveUserPreferences.ts @@ -1,7 +1,7 @@ +import type { ThemePreference } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions, Users } from '@rocket.chat/models'; import type { FontSize } from '@rocket.chat/rest-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; -import type { ThemePreference } from '@rocket.chat/ui-theming/src/types/themes'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -47,7 +47,7 @@ type UserPreferences = { mentionsWithSymbol?: boolean; }; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { saveUserPreferences(preferences: Partial): boolean; diff --git a/apps/meteor/server/methods/saveUserProfile.ts b/apps/meteor/server/methods/saveUserProfile.ts index c2ed41adaab9..beb72d9a2f63 100644 --- a/apps/meteor/server/methods/saveUserProfile.ts +++ b/apps/meteor/server/methods/saveUserProfile.ts @@ -1,7 +1,7 @@ import { Apps, AppEvents } from '@rocket.chat/apps'; import type { UserStatus } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Accounts } from 'meteor/accounts-base'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -165,7 +165,7 @@ const saveUserProfileWithTwoFactor = twoFactorRequired(saveUserProfile, { requireSecondFactor: true, }); -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { saveUserProfile( diff --git a/apps/meteor/server/methods/sendConfirmationEmail.ts b/apps/meteor/server/methods/sendConfirmationEmail.ts index 8c7d056532d3..b79d037c252f 100644 --- a/apps/meteor/server/methods/sendConfirmationEmail.ts +++ b/apps/meteor/server/methods/sendConfirmationEmail.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Accounts } from 'meteor/accounts-base'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; diff --git a/apps/meteor/server/methods/sendForgotPasswordEmail.ts b/apps/meteor/server/methods/sendForgotPasswordEmail.ts index b77f6318a324..7b8082812dde 100644 --- a/apps/meteor/server/methods/sendForgotPasswordEmail.ts +++ b/apps/meteor/server/methods/sendForgotPasswordEmail.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Accounts } from 'meteor/accounts-base'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -7,7 +7,7 @@ import { Meteor } from 'meteor/meteor'; import { settings } from '../../app/settings/server'; import { SystemLogger } from '../lib/logger/system'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { sendForgotPasswordEmail(to: string): boolean | undefined; diff --git a/apps/meteor/server/methods/setAvatarFromService.ts b/apps/meteor/server/methods/setAvatarFromService.ts index bec5018f9652..b59100e4a627 100644 --- a/apps/meteor/server/methods/setAvatarFromService.ts +++ b/apps/meteor/server/methods/setAvatarFromService.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Match, check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; import { setAvatarFromServiceWithValidation } from '../../app/lib/server/functions/setUserAvatar'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setAvatarFromService(dataURI: Buffer | Blob, contentType?: string, service?: string, targetUserId?: string): void; diff --git a/apps/meteor/server/methods/setUserActiveStatus.ts b/apps/meteor/server/methods/setUserActiveStatus.ts index 4a35080543fb..a14616c30c04 100644 --- a/apps/meteor/server/methods/setUserActiveStatus.ts +++ b/apps/meteor/server/methods/setUserActiveStatus.ts @@ -1,11 +1,11 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import { hasPermissionAsync } from '../../app/authorization/server/functions/hasPermission'; import { setUserActiveStatus } from '../../app/lib/server/functions/setUserActiveStatus'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setUserActiveStatus(userId: string, active: boolean, confirmRelinquish?: boolean): boolean; diff --git a/apps/meteor/server/methods/setUserPassword.ts b/apps/meteor/server/methods/setUserPassword.ts index a395b372c467..e17fa09baf4c 100644 --- a/apps/meteor/server/methods/setUserPassword.ts +++ b/apps/meteor/server/methods/setUserPassword.ts @@ -1,5 +1,5 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Accounts } from 'meteor/accounts-base'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -8,7 +8,7 @@ import type { UpdateResult } from 'mongodb'; import { passwordPolicy } from '../../app/lib/server'; import { compareUserPassword } from '../lib/compareUserPassword'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { setUserPassword(password: string): UpdateResult; diff --git a/apps/meteor/server/methods/toggleFavorite.ts b/apps/meteor/server/methods/toggleFavorite.ts index 14a363a3304a..36555a4566db 100644 --- a/apps/meteor/server/methods/toggleFavorite.ts +++ b/apps/meteor/server/methods/toggleFavorite.ts @@ -1,10 +1,10 @@ import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { toggleFavorite(rid: IRoom['_id'], f?: boolean): Promise; diff --git a/apps/meteor/server/methods/unmuteUserInRoom.ts b/apps/meteor/server/methods/unmuteUserInRoom.ts index 74abdc472e78..ffdb8466de3f 100644 --- a/apps/meteor/server/methods/unmuteUserInRoom.ts +++ b/apps/meteor/server/methods/unmuteUserInRoom.ts @@ -1,7 +1,7 @@ import { Message } from '@rocket.chat/core-services'; import type { IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms, Subscriptions, Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Match, check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; @@ -12,7 +12,7 @@ import { RoomMemberActions } from '../../definition/IRoomTypeConfig'; import { callbacks } from '../../lib/callbacks'; import { roomCoordinator } from '../lib/rooms/roomCoordinator'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { unmuteUserInRoom(data: { rid: IRoom['_id']; username: string }): boolean; diff --git a/apps/meteor/server/methods/userPresence.ts b/apps/meteor/server/methods/userPresence.ts index aa5aefa297e8..21f3f795155e 100644 --- a/apps/meteor/server/methods/userPresence.ts +++ b/apps/meteor/server/methods/userPresence.ts @@ -1,9 +1,9 @@ import { Presence } from '@rocket.chat/core-services'; import { UserStatus } from '@rocket.chat/core-typings'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'UserPresence:setDefaultStatus'(status: UserStatus): boolean | undefined; diff --git a/apps/meteor/server/methods/userSetUtcOffset.ts b/apps/meteor/server/methods/userSetUtcOffset.ts index d06a8f4b76d3..819b9c1b92f1 100644 --- a/apps/meteor/server/methods/userSetUtcOffset.ts +++ b/apps/meteor/server/methods/userSetUtcOffset.ts @@ -1,10 +1,10 @@ +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Users } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { userSetUtcOffset(utcOffset: number): void; diff --git a/apps/meteor/server/models/dummy/BaseDummy.ts b/apps/meteor/server/models/dummy/BaseDummy.ts index 9c91036d3969..c3052ede9487 100644 --- a/apps/meteor/server/models/dummy/BaseDummy.ts +++ b/apps/meteor/server/models/dummy/BaseDummy.ts @@ -1,6 +1,7 @@ import type { RocketChatRecordDeleted } from '@rocket.chat/core-typings'; import type { DefaultFields, FindPaginated, IBaseModel, InsertionModel, ResultFields } from '@rocket.chat/model-typings'; -import { getCollectionName } from '@rocket.chat/models'; +import { getCollectionName, UpdaterImpl } from '@rocket.chat/models'; +import type { Updater } from '@rocket.chat/models'; import type { BulkWriteOptions, ChangeStream, @@ -40,6 +41,14 @@ export class BaseDummy< // nothing to do } + public getUpdater(): Updater { + return new UpdaterImpl(); + } + + public updateFromUpdater(query: Filter, updater: Updater): Promise { + return this.updateOne(query, updater); + } + getCollectionName(): string { return this.collectionName; } diff --git a/apps/meteor/server/models/raw/Analytics.ts b/apps/meteor/server/models/raw/Analytics.ts index 4e95cadebbcd..de4700834168 100644 --- a/apps/meteor/server/models/raw/Analytics.ts +++ b/apps/meteor/server/models/raw/Analytics.ts @@ -1,7 +1,7 @@ import type { IAnalytic, IRoom } from '@rocket.chat/core-typings'; -import type { IAnalyticsModel } from '@rocket.chat/model-typings'; +import type { IAnalyticsModel, IChannelsWithNumberOfMessagesBetweenDate } from '@rocket.chat/model-typings'; import { Random } from '@rocket.chat/random'; -import type { AggregationCursor, FindCursor, Db, IndexDescription, FindOptions, UpdateResult, Document } from 'mongodb'; +import type { AggregationCursor, FindCursor, Db, IndexDescription, FindOptions, UpdateResult, Document, Collection } from 'mongodb'; import { readSecondaryPreferred } from '../../database/readSecondaryPreferred'; import { BaseRaw } from './BaseRaw'; @@ -14,7 +14,11 @@ export class AnalyticsRaw extends BaseRaw implements IAnalyticsModel } protected modelIndexes(): IndexDescription[] { - return [{ key: { date: 1 } }, { key: { 'room._id': 1, 'date': 1 }, unique: true, partialFilterExpression: { type: 'rooms' } }]; + return [ + { key: { date: 1 } }, + { key: { 'room._id': 1, 'date': 1 }, unique: true, partialFilterExpression: { type: 'rooms' } }, + { key: { 'room.t': 1, 'date': 1 }, partialFilterExpression: { type: 'messages' } }, + ]; } saveMessageSent({ room, date }: { room: IRoom; date: IAnalytic['date'] }): Promise { @@ -211,4 +215,117 @@ export class AnalyticsRaw extends BaseRaw implements IAnalyticsModel findByTypeBeforeDate({ type, date }: { type: IAnalytic['type']; date: IAnalytic['date'] }): FindCursor { return this.find({ type, date: { $lte: date } }); } + + getRoomsWithNumberOfMessagesBetweenDateQuery({ + types, + start, + end, + startOfLastWeek, + endOfLastWeek, + options, + }: { + types: Array; + start: number; + end: number; + startOfLastWeek: number; + endOfLastWeek: number; + options?: any; + }) { + const typeAndDateMatch = { + $match: { + 'type': 'messages', + 'room.t': { $in: types }, + 'date': { $gte: startOfLastWeek, $lte: end }, + }, + }; + const roomsGroup = { + $group: { + _id: '$room._id', + room: { $first: '$room' }, + messages: { $sum: { $cond: [{ $gte: ['$date', start] }, '$messages', 0] } }, + lastWeekMessages: { $sum: { $cond: [{ $lte: ['$date', endOfLastWeek] }, '$messages', 0] } }, + }, + }; + const lookup = { + $lookup: { + from: 'rocketchat_room', + localField: '_id', + foreignField: '_id', + as: 'room', + }, + }; + const roomsUnwind = { + $unwind: { + path: '$room', + preserveNullAndEmptyArrays: false, + }, + }; + const project = { + $project: { + _id: 0, + room: { + _id: '$room._id', + name: { $ifNull: ['$room.name', '$room.fname'] }, + ts: '$room.ts', + t: '$room.t', + _updatedAt: '$room._updatedAt', + usernames: '$room.usernames', + }, + messages: '$messages', + lastWeekMessages: '$lastWeekMessages', + diffFromLastWeek: { $subtract: ['$messages', '$lastWeekMessages'] }, + }, + }; + + const sort = { $sort: options?.sort || { messages: -1 } }; + const sortAndPaginationParams: Exclude['aggregate']>[0], undefined> = [sort]; + if (options?.offset) { + sortAndPaginationParams.push({ $skip: options.offset }); + } + + if (options?.count) { + sortAndPaginationParams.push({ $limit: options.count }); + } + const facet = { + $facet: { + channels: [...sortAndPaginationParams], + total: [{ $count: 'total' }], + }, + }; + const totalUnwind = { $unwind: '$total' }; + const totalProject = { + $project: { + channels: '$channels', + total: '$total.total', + }, + }; + + const params: Exclude['aggregate']>[0], undefined> = [ + typeAndDateMatch, + roomsGroup, + lookup, + roomsUnwind, + project, + facet, + totalUnwind, + totalProject, + ]; + + return params; + } + + findRoomsByTypesWithNumberOfMessagesBetweenDate(params: { + types: Array; + start: number; + end: number; + startOfLastWeek: number; + endOfLastWeek: number; + options?: any; + }): AggregationCursor<{ channels: IChannelsWithNumberOfMessagesBetweenDate[]; total: number }> { + const aggregationParams = this.getRoomsWithNumberOfMessagesBetweenDateQuery(params); + return this.col.aggregate<{ channels: IChannelsWithNumberOfMessagesBetweenDate[]; total: number }>(aggregationParams, { + allowDiskUse: true, + readPreference: readSecondaryPreferred(), + }); + } } diff --git a/apps/meteor/server/models/raw/BaseRaw.ts b/apps/meteor/server/models/raw/BaseRaw.ts index 96f64b061ade..1a3dd1a3eb4c 100644 --- a/apps/meteor/server/models/raw/BaseRaw.ts +++ b/apps/meteor/server/models/raw/BaseRaw.ts @@ -1,6 +1,7 @@ import type { RocketChatRecordDeleted } from '@rocket.chat/core-typings'; import type { IBaseModel, DefaultFields, ResultFields, FindPaginated, InsertionModel } from '@rocket.chat/model-typings'; -import { getCollectionName } from '@rocket.chat/models'; +import type { Updater } from '@rocket.chat/models'; +import { getCollectionName, UpdaterImpl } from '@rocket.chat/models'; import { ObjectId } from 'mongodb'; import type { BulkWriteOptions, @@ -109,6 +110,18 @@ export abstract class BaseRaw< return this.collectionName; } + public getUpdater(): Updater { + return new UpdaterImpl(); + } + + public updateFromUpdater(query: Filter, updater: Updater): Promise { + const updateFilter = updater.getUpdateFilter(); + return this.updateOne(query, updateFilter).catch((e) => { + console.warn(e, updateFilter); + return Promise.reject(e); + }); + } + private doNotMixInclusionAndExclusionFields(options: FindOptions = {}): FindOptions { const optionsDef = this.ensureDefaultFields(options); if (optionsDef?.projection === undefined) { diff --git a/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts index 76a0e7610445..891542f03e7a 100644 --- a/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts +++ b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts @@ -12,6 +12,7 @@ import type { DeleteResult, IndexDescription, SortDirection, + AggregationCursor, } from 'mongodb'; import { BaseRaw } from './BaseRaw'; @@ -111,34 +112,6 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw; - - findActiveDepartmentsByAgentId(agentId: string, options: FindOptions): FindCursor; - - findActiveDepartmentsByAgentId

( - agentId: string, - options: FindOptions

, - ): FindCursor

; - - findActiveDepartmentsByAgentId

( - agentId: string, - options?: - | undefined - | FindOptions - | FindOptions

, - ): FindCursor | FindCursor

{ - const query = { - agentId, - departmentEnabled: true, - }; - - if (options === undefined) { - return this.find(query); - } - - return this.find(query, options); - } - findByDepartmentIds(departmentIds: string[], options = {}): FindCursor { return this.find({ departmentId: { $in: departmentIds } }, options); } @@ -395,6 +368,39 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { return this.find({ agentId: { $in: agentsIds }, departmentId }, options); } + + findDepartmentsOfAgent(agentId: string, enabled = false): AggregationCursor { + return this.col.aggregate([ + { + $match: { + agentId, + ...(enabled && { departmentEnabled: true }), + }, + }, + { + $lookup: { + from: 'rocketchat_livechat_department', + localField: 'departmentId', + foreignField: '_id', + as: 'department', + }, + }, + { $unwind: '$department' }, + { + $project: { + _id: '$_id', + agentId: '$agentId', + departmentId: '$departmentId', + departmentName: '$department.name', + username: '$username', + count: '$count', + order: '$order', + departmentEnabled: '$departmentEnabled', + _updatedAt: '$_updatedAt', + }, + }, + ]); + } } const isStringValue = (value: any): value is string => typeof value === 'string'; diff --git a/apps/meteor/server/models/raw/LivechatInquiry.ts b/apps/meteor/server/models/raw/LivechatInquiry.ts index 3178d217be4f..52aedd0585f8 100644 --- a/apps/meteor/server/models/raw/LivechatInquiry.ts +++ b/apps/meteor/server/models/raw/LivechatInquiry.ts @@ -154,10 +154,7 @@ export class LivechatInquiryRaw extends BaseRaw implemen }, }, { - locked: false, - }, - { - locked: { $exists: false }, + locked: { $ne: true }, }, ], }, @@ -189,7 +186,7 @@ export class LivechatInquiryRaw extends BaseRaw implemen async unlockAll(): Promise { return this.updateMany( - { $or: [{ lockedAt: { $exists: true } }, { locked: { $exists: true } }] }, + { locked: { $exists: true } }, { $unset: { locked: 1, lockedAt: 1 }, $set: { status: LivechatInquiryStatus.QUEUED, queuedAt: new Date() } }, ); } diff --git a/apps/meteor/server/models/raw/LivechatRooms.ts b/apps/meteor/server/models/raw/LivechatRooms.ts index d1b704e024b9..ebe10ec67fbc 100644 --- a/apps/meteor/server/models/raw/LivechatRooms.ts +++ b/apps/meteor/server/models/raw/LivechatRooms.ts @@ -9,8 +9,9 @@ import type { ReportResult, MACStats, } from '@rocket.chat/core-typings'; -import { UserStatus } from '@rocket.chat/core-typings'; +import { isMessageFromVisitor, UserStatus } from '@rocket.chat/core-typings'; import type { ILivechatRoomsModel } from '@rocket.chat/model-typings'; +import type { Updater } from '@rocket.chat/models'; import { Settings } from '@rocket.chat/models'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { @@ -1211,6 +1212,7 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive visitorId, roomIds, onhold, + queued, options = {}, extraQuery = {}, }: { @@ -1226,6 +1228,7 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive visitorId?: string; roomIds?: string[]; onhold?: boolean; + queued?: boolean; options?: { offset?: number; count?: number; sort?: { [k: string]: SortDirection } }; extraQuery?: Filter; }) { @@ -1242,6 +1245,10 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive ...(visitorId && visitorId !== 'undefined' && { 'v._id': visitorId }), }; + if (open) { + query.servedBy = { $exists: true }; + } + if (createdAt) { query.ts = {}; if (createdAt.start) { @@ -1280,6 +1287,12 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive }; } + if (queued) { + query.servedBy = { $exists: false }; + query.open = true; + query.onHold = { $ne: true }; + } + return this.findPaginated(query, { sort: options.sort || { name: 1 }, skip: options.offset, @@ -1960,100 +1973,87 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive return this.find(query, options); } - setResponseByRoomId(roomId: string, responseBy: IOmnichannelRoom['responseBy']) { - return this.updateOne( - { - _id: roomId, - t: 'l', - }, - { - $set: { - responseBy, - }, - $unset: { - waitingResponse: 1, - }, - }, - ); + getResponseByRoomIdUpdateQuery(responseBy: IOmnichannelRoom['responseBy'], updater: Updater = this.getUpdater()) { + updater.set('responseBy', responseBy); + updater.unset('waitingResponse'); + return updater; } - setNotResponseByRoomId(roomId: string) { - return this.updateOne( - { - _id: roomId, - t: 'l', - }, - { - $set: { - waitingResponse: true, - }, - $unset: { - responseBy: 1, - }, - }, - ); + getNotResponseByRoomIdUpdateQuery(updater: Updater = this.getUpdater()) { + updater.set('waitingResponse', true); + updater.unset('responseBy'); + return updater; } - setAgentLastMessageTs(roomId: string) { - return this.updateOne( - { - _id: roomId, - t: 'l', - }, - { - $set: { - 'responseBy.lastMessageTs': new Date(), - }, - }, - ); + getAgentLastMessageTsUpdateQuery(updater: Updater = this.getUpdater()) { + return updater.set('responseBy.lastMessageTs', new Date()); } - saveAnalyticsDataByRoomId(room: IOmnichannelRoom, message: IMessage, analyticsData: Record) { - const update: DeepWritable> = { - $set: { - ...(analyticsData && { - 'metrics.response.avg': analyticsData.avgResponseTime, - }), - ...(analyticsData?.firstResponseTime && { - 'metrics.reaction.fd': analyticsData.firstReactionDate, - 'metrics.reaction.ft': analyticsData.firstReactionTime, - 'metrics.response.fd': analyticsData.firstResponseDate, - 'metrics.response.ft': analyticsData.firstResponseTime, - }), - }, - ...(analyticsData && { - $inc: { - 'metrics.response.total': 1, - 'metrics.response.tt': analyticsData.responseTime as number, - 'metrics.reaction.tt': analyticsData.reactionTime as number, - }, - }), - }; + private getAnalyticsUpdateQuery( + analyticsData: Record | undefined, + updater: Updater = this.getUpdater(), + ) { + if (analyticsData) { + updater.set('metrics.response.avg', analyticsData.avgResponseTime); + updater.inc('metrics.response.total', 1); + updater.inc('metrics.response.tt', analyticsData.responseTime as number); + updater.inc('metrics.reaction.tt', analyticsData.reactionTime as number); + } + + if (analyticsData?.firstResponseTime) { + updater.set('metrics.reaction.fd', analyticsData.firstReactionDate); + updater.set('metrics.reaction.ft', analyticsData.firstReactionTime); + updater.set('metrics.response.fd', analyticsData.firstResponseDate); + updater.set('metrics.response.ft', analyticsData.firstResponseTime); + } + + return updater; + } + private getAnalyticsUpdateQueryBySentByAgent( + room: IOmnichannelRoom, + message: IMessage, + analyticsData: Record | undefined, + updater: Updater = this.getUpdater(), + ) { // livechat analytics : update last message timestamps const visitorLastQuery = room.metrics?.v ? room.metrics.v.lq : room.ts; const agentLastReply = room.metrics?.servedBy ? room.metrics.servedBy.lr : room.ts; - if (message.token) { - // update visitor timestamp, only if its new inquiry and not continuing message - if (agentLastReply >= visitorLastQuery) { - // if first query, not continuing query from visitor - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - update.$set!['metrics.v.lq'] = message.ts; - } - } else if (visitorLastQuery > agentLastReply) { - // update agent timestamp, if first response, not continuing - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - update.$set!['metrics.servedBy.lr'] = message.ts; + if (visitorLastQuery > agentLastReply) { + return this.getAnalyticsUpdateQuery(analyticsData, updater).set('metrics.servedBy.lr', message.ts); } - return this.updateOne( - { - _id: room._id, - t: 'l', - }, - update, - ); + return this.getAnalyticsUpdateQuery(analyticsData, updater); + } + + private getAnalyticsUpdateQueryBySentByVisitor( + room: IOmnichannelRoom, + message: IMessage, + analyticsData: Record | undefined, + updater: Updater = this.getUpdater(), + ) { + // livechat analytics : update last message timestamps + const visitorLastQuery = room.metrics?.v ? room.metrics.v.lq : room.ts; + const agentLastReply = room.metrics?.servedBy ? room.metrics.servedBy.lr : room.ts; + + // update visitor timestamp, only if its new inquiry and not continuing message + if (agentLastReply >= visitorLastQuery) { + return this.getAnalyticsUpdateQuery(analyticsData, updater).set('metrics.v.lq', message.ts); + } + + return this.getAnalyticsUpdateQuery(analyticsData, updater); + } + + async getAnalyticsUpdateQueryByRoomId( + room: IOmnichannelRoom, + message: IMessage, + analyticsData: Record | undefined, + updater: Updater = this.getUpdater(), + ) { + return isMessageFromVisitor(message) + ? this.getAnalyticsUpdateQueryBySentByVisitor(room, message, analyticsData, updater) + : this.getAnalyticsUpdateQueryBySentByAgent(room, message, analyticsData, updater); } getTotalConversationsBetweenDate(t: 'l', date: { gte: Date; lt: Date }, { departmentId }: { departmentId?: string } = {}) { @@ -2367,17 +2367,8 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive return this.deleteOne(query); } - setVisitorLastMessageTimestampByRoomId(roomId: string, lastMessageTs: Date) { - const query = { - _id: roomId, - }; - const update = { - $set: { - 'v.lastMessageTs': lastMessageTs, - }, - }; - - return this.updateOne(query, update); + getVisitorLastMessageTsUpdateQueryByRoomId(lastMessageTs: Date, updater: Updater = this.getUpdater()) { + return updater.set('v.lastMessageTs', lastMessageTs); } setVisitorInactivityInSecondsById(roomId: string, visitorInactivity: number) { @@ -2429,18 +2420,17 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive return this.updateOne(query, update); } + getVisitorActiveForPeriodUpdateQuery(period: string, updater: Updater = this.getUpdater()): Updater { + return updater.addToSet('v.activity', period); + } + markVisitorActiveForPeriod(rid: string, period: string): Promise { const query = { _id: rid, }; + const updater = this.getVisitorActiveForPeriodUpdateQuery(period); - const update = { - $addToSet: { - 'v.activity': period, - }, - }; - - return this.updateOne(query, update); + return this.updateOne(query, updater.getUpdateFilter()); } async getMACStatisticsForPeriod(period: string): Promise { @@ -2610,6 +2600,13 @@ export class LivechatRoomsRaw extends BaseRaw implements ILive throw new Error('Method not implemented.'); } + getPredictedVisitorAbandonmentByRoomIdUpdateQuery( + _willBeAbandonedAt: Date, + _updater: Updater, + ): Updater { + throw new Error('Method not implemented.'); + } + setPredictedVisitorAbandonmentByRoomId(_rid: string, _willBeAbandonedAt: Date): Promise { throw new Error('Method not implemented.'); } diff --git a/apps/meteor/server/models/raw/Messages.ts b/apps/meteor/server/models/raw/Messages.ts index 49f46a8e09af..3f79e174fec0 100644 --- a/apps/meteor/server/models/raw/Messages.ts +++ b/apps/meteor/server/models/raw/Messages.ts @@ -364,6 +364,7 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { roomId: IRoom['_id'], types: IMessage['t'][], ts: Date, + showSystemMessages: boolean, options?: FindOptions, showThreadMessages = true, ): FindCursor { @@ -389,6 +390,10 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { query.t = { $nin: types }; } + if (!showSystemMessages) { + query.t = { $exists: false }; + } + return this.find(query, options); } @@ -424,14 +429,25 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { return this.find(query, options); } - findLivechatMessagesWithoutClosing(rid: IRoom['_id'], options?: FindOptions): FindCursor { - return this.find( - { - rid, - t: { $exists: false }, - }, - options, - ); + findLivechatMessagesWithoutTypes( + rid: IRoom['_id'], + ignoredTypes: IMessage['t'][], + showSystemMessages: boolean, + options?: FindOptions, + ): FindCursor { + const query: Filter = { + rid, + }; + + if (ignoredTypes.length > 0) { + query.t = { $nin: ignoredTypes }; + } + + if (!showSystemMessages) { + query.t = { $exists: false }; + } + + return this.find(query, options); } async setBlocksById(_id: string, blocks: Required['blocks']): Promise { diff --git a/apps/meteor/server/models/raw/Rooms.ts b/apps/meteor/server/models/raw/Rooms.ts index 1859f6c18b35..bb496bf79971 100644 --- a/apps/meteor/server/models/raw/Rooms.ts +++ b/apps/meteor/server/models/raw/Rooms.ts @@ -10,6 +10,7 @@ import type { } from '@rocket.chat/core-typings'; import type { FindPaginated, IRoomsModel, IChannelsWithNumberOfMessagesBetweenDate } from '@rocket.chat/model-typings'; import { Subscriptions } from '@rocket.chat/models'; +import type { Updater } from '@rocket.chat/models'; import { escapeRegExp } from '@rocket.chat/string-helpers'; import type { AggregationCursor, @@ -413,18 +414,25 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { } getChannelsWithNumberOfMessagesBetweenDateQuery({ + types, start, end, startOfLastWeek, endOfLastWeek, options, }: { + types: Array; start: number; end: number; startOfLastWeek: number; endOfLastWeek: number; options?: any; }) { + const typeMatch = { + $match: { + t: { $in: types }, + }, + }; const lookup = { $lookup: { from: 'rocketchat_analytics', @@ -504,30 +512,32 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { diffFromLastWeek: { $subtract: ['$messages', '$lastWeekMessages'] }, }, }; - const firstParams = [ - lookup, - messagesProject, - messagesUnwind, - messagesGroup, - lastWeekMessagesUnwind, - lastWeekMessagesGroup, - presentationProject, - ]; + const firstParams = [typeMatch, lookup, messagesProject, messagesUnwind, messagesGroup]; + const lastParams = [lastWeekMessagesUnwind, lastWeekMessagesGroup, presentationProject]; + const sort = { $sort: options?.sort || { messages: -1 } }; - const params: Exclude['aggregate']>[0], undefined> = [...firstParams, sort]; + const sortAndPaginationParams: Exclude['aggregate']>[0], undefined> = [sort]; if (options?.offset) { - params.push({ $skip: options.offset }); + sortAndPaginationParams.push({ $skip: options.offset }); } if (options?.count) { - params.push({ $limit: options.count }); + sortAndPaginationParams.push({ $limit: options.count }); + } + const params: Exclude['aggregate']>[0], undefined> = [...firstParams]; + + if (options?.sort) { + params.push(...lastParams, ...sortAndPaginationParams); + } else { + params.push(...sortAndPaginationParams, ...lastParams, sort); } return params; } - findChannelsWithNumberOfMessagesBetweenDate(params: { + findChannelsByTypesWithNumberOfMessagesBetweenDate(params: { + types: Array; start: number; end: number; startOfLastWeek: number; @@ -541,22 +551,6 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { }); } - countChannelsWithNumberOfMessagesBetweenDate(params: { - start: number; - end: number; - startOfLastWeek: number; - endOfLastWeek: number; - options?: any; - }): AggregationCursor<{ total: number }> { - const aggregationParams = this.getChannelsWithNumberOfMessagesBetweenDateQuery(params); - aggregationParams.push({ $count: 'total' }); - - return this.col.aggregate<{ total: number }>(aggregationParams, { - allowDiskUse: true, - readPreference: readSecondaryPreferred(), - }); - } - findOneByNameOrFname(name: NonNullable, options: FindOptions = {}): Promise { const query = { $or: [ @@ -669,6 +663,10 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateOne({ _id: roomId }, { $set: { name } }); } + setSidepanelById(roomId: IRoom['_id'], sidepanel: IRoom['sidepanel']): Promise { + return this.updateOne({ _id: roomId }, { $set: { sidepanel } }); + } + setFnameById(_id: IRoom['_id'], fname: IRoom['fname']): Promise { const query: Filter = { _id }; @@ -891,6 +889,10 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateOne(query, update); } + getIncMsgCountUpdateQuery(inc: number, roomUpdater: Updater): Updater { + return roomUpdater.inc('msgs', inc); + } + decreaseMessageCountById(_id: IRoom['_id'], count = 1) { return this.incMsgCountById(_id, -count); } @@ -1530,25 +1532,19 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateOne(query, update); } - incMsgCountAndSetLastMessageById( - _id: IRoom['_id'], - inc = 1, - lastMessageTimestamp: NonNullable, - lastMessage?: IMessage, - ): Promise { - const query: Filter = { _id }; + setIncMsgCountAndSetLastMessageUpdateQuery( + inc: number, + lastMessage: IMessage, + shouldStoreLastMessage: boolean, + roomUpdater: Updater, + ): Updater { + roomUpdater.inc('msgs', inc).set('lm', lastMessage.ts); - const update: UpdateFilter = { - $set: { - lm: lastMessageTimestamp, - ...(lastMessage ? { lastMessage } : {}), - }, - $inc: { - msgs: inc, - }, - }; + if (shouldStoreLastMessage) { + roomUpdater.set('lastMessage', lastMessage); + } - return this.updateOne(query, update); + return roomUpdater; } incUsersCountById(_id: IRoom['_id'], inc = 1): Promise { @@ -1581,16 +1577,8 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateMany(query, update); } - setLastMessageById(_id: IRoom['_id'], lastMessage: IRoom['lastMessage']): Promise { - const query: Filter = { _id }; - - const update: UpdateFilter = { - $set: { - lastMessage, - }, - }; - - return this.updateOne(query, update); + getLastMessageUpdateQuery(lastMessage: IRoom['lastMessage'], roomUpdater: Updater): Updater { + return roomUpdater.set('lastMessage', lastMessage); } async resetLastMessageById(_id: IRoom['_id'], lastMessage: IRoom['lastMessage'] | null, msgCountDelta?: number): Promise { diff --git a/apps/meteor/server/models/raw/VideoConference.ts b/apps/meteor/server/models/raw/VideoConference.ts index c9ae3aec9015..73080ac7b41e 100644 --- a/apps/meteor/server/models/raw/VideoConference.ts +++ b/apps/meteor/server/models/raw/VideoConference.ts @@ -21,6 +21,7 @@ export class VideoConferenceRaw extends BaseRaw implements IVid return [ { key: { rid: 1, createdAt: 1 }, unique: false }, { key: { type: 1, status: 1 }, unique: false }, + { key: { discussionRid: 1 }, unique: false }, ]; } @@ -263,4 +264,25 @@ export class VideoConferenceRaw extends BaseRaw implements IVid }, ); } + + public async setDiscussionRidById(callId: string, discussionRid: IRoom['_id']): Promise { + await this.updateOne({ _id: callId }, { $set: { discussionRid } }); + } + + public async unsetDiscussionRidById(callId: string): Promise { + await this.updateOne({ _id: callId }, { $unset: { discussionRid: true } }); + } + + public async unsetDiscussionRid(discussionRid: IRoom['_id']): Promise { + await this.updateMany( + { + discussionRid, + }, + { + $unset: { + discussionRid: 1, + }, + }, + ); + } } diff --git a/apps/meteor/server/modules/notifications/notifications.module.ts b/apps/meteor/server/modules/notifications/notifications.module.ts index 75a2935d5616..a0394591aadf 100644 --- a/apps/meteor/server/modules/notifications/notifications.module.ts +++ b/apps/meteor/server/modules/notifications/notifications.module.ts @@ -1,7 +1,7 @@ import { Authorization, VideoConf } from '@rocket.chat/core-services'; import type { ISubscription, IOmnichannelRoom, IUser } from '@rocket.chat/core-typings'; +import type { StreamerCallbackArgs, StreamKeys, StreamNames } from '@rocket.chat/ddp-client'; import { Rooms, Subscriptions, Users, Settings } from '@rocket.chat/models'; -import type { StreamerCallbackArgs, StreamKeys, StreamNames } from '@rocket.chat/ui-contexts'; import type { IStreamer, IStreamerConstructor, IPublication } from 'meteor/rocketchat:streamer'; import type { ImporterProgress } from '../../../app/importer/server/classes/ImporterProgress'; @@ -257,7 +257,7 @@ export class NotificationsModule { this.streamRoomUsers.allowRead('none'); this.streamRoomUsers.allowWrite(async function (eventName, ...args: any[]) { - const [roomId, e] = eventName.split('/') as typeof eventName extends `${infer K}/${infer E}` ? [K, E] : never; + const [roomId, e] = eventName.split('/'); if (!this.userId) { const room = await Rooms.findOneById(roomId, { projection: { 't': 1, 'servedBy._id': 1 }, diff --git a/apps/meteor/server/modules/streamer/streamer.module.ts b/apps/meteor/server/modules/streamer/streamer.module.ts index c669c7bc2a00..9fc8065db2e7 100644 --- a/apps/meteor/server/modules/streamer/streamer.module.ts +++ b/apps/meteor/server/modules/streamer/streamer.module.ts @@ -1,5 +1,5 @@ import { MeteorError } from '@rocket.chat/core-services'; -import type { StreamerEvents } from '@rocket.chat/ui-contexts'; +import type { StreamerEvents } from '@rocket.chat/ddp-client'; import { EventEmitter } from 'eventemitter3'; import type { IPublication, Rule, Connection, DDPSubscription, IStreamer, IRules, TransformMessage } from 'meteor/rocketchat:streamer'; diff --git a/apps/meteor/server/modules/watchers/lib/messages.ts b/apps/meteor/server/modules/watchers/lib/messages.ts deleted file mode 100644 index e127f465efe9..000000000000 --- a/apps/meteor/server/modules/watchers/lib/messages.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { api, dbWatchersDisabled } from '@rocket.chat/core-services'; -import type { IMessage, IUser, SettingValue, MessageTypesValues } from '@rocket.chat/core-typings'; -import { Messages, Settings, Users } from '@rocket.chat/models'; -import mem from 'mem'; - -import { shouldHideSystemMessage } from '../../../lib/systemMessage/hideSystemMessage'; - -const getUserNameCached = mem( - async (userId: string): Promise => { - const user = await Users.findOne>(userId, { projection: { name: 1 } }); - return user?.name; - }, - { maxAge: 10000 }, -); - -const getSettingCached = mem(async (setting: string): Promise => Settings.getValueById(setting), { maxAge: 10000 }); - -export async function getMessageToBroadcast({ id, data }: { id: IMessage['_id']; data?: IMessage }): Promise { - const message = data ?? (await Messages.findOneById(id)); - if (!message) { - return; - } - - if (message.t) { - const hiddenSystemMessages = (await getSettingCached('Hide_System_Messages')) as MessageTypesValues[]; - const shouldHide = shouldHideSystemMessage(message.t, hiddenSystemMessages); - - if (shouldHide) { - return; - } - } - - if (message._hidden || message.imported != null) { - return; - } - - const useRealName = (await getSettingCached('UI_Use_Real_Name')) === true; - if (useRealName) { - if (message.u?._id) { - const name = await getUserNameCached(message.u._id); - if (name) { - message.u.name = name; - } - } - - if (message.mentions?.length) { - for await (const mention of message.mentions) { - const name = await getUserNameCached(mention._id); - if (name) { - mention.name = name; - } - } - } - } - - return message; -} - -// TODO once the broadcast from file apps/meteor/server/modules/watchers/watchers.module.ts is removed -// this function can be renamed to broadcastMessage -export async function broadcastMessageFromData({ id, data }: { id: IMessage['_id']; data?: IMessage }): Promise { - // if db watchers are active, the event will be triggered automatically so we don't need to broadcast it here. - if (!dbWatchersDisabled) { - return; - } - const message = await getMessageToBroadcast({ id, data }); - if (!message) { - return; - } - void api.broadcast('watch.messages', { message }); -} diff --git a/apps/meteor/server/modules/watchers/watchers.module.ts b/apps/meteor/server/modules/watchers/watchers.module.ts index 684db6945626..c42b24d35b7e 100644 --- a/apps/meteor/server/modules/watchers/watchers.module.ts +++ b/apps/meteor/server/modules/watchers/watchers.module.ts @@ -37,9 +37,9 @@ import { LivechatPriority, } from '@rocket.chat/models'; +import { getMessageToBroadcast } from '../../../app/lib/server/lib/notifyListener'; import { subscriptionFields, roomFields } from '../../../lib/publishFields'; import type { DatabaseWatcher } from '../../database/DatabaseWatcher'; -import { getMessageToBroadcast } from './lib/messages'; type BroadcastCallback = (event: T, ...args: Parameters) => Promise; diff --git a/apps/meteor/server/publications/messages.ts b/apps/meteor/server/publications/messages.ts index e08aa61a13a3..ebf813a637d0 100644 --- a/apps/meteor/server/publications/messages.ts +++ b/apps/meteor/server/publications/messages.ts @@ -1,13 +1,13 @@ import type { IMessage, IRoom } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; import type { FindOptions } from 'mongodb'; import { canAccessRoomIdAsync } from '../../app/authorization/server/functions/canAccessRoom'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'messages/get': ( diff --git a/apps/meteor/server/publications/room/index.ts b/apps/meteor/server/publications/room/index.ts index 84841d30ce53..f8ced449f8cb 100644 --- a/apps/meteor/server/publications/room/index.ts +++ b/apps/meteor/server/publications/room/index.ts @@ -1,6 +1,6 @@ import type { IOmnichannelRoom, IRoom, RoomType } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Rooms } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import _ from 'underscore'; @@ -13,7 +13,7 @@ import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; type PublicRoomField = keyof typeof roomFields; type PublicRoom = Pick & Pick; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'rooms/get'(updatedAt?: Date): IRoom[] | { update: IRoom[]; remove: IRoom[] }; diff --git a/apps/meteor/server/publications/settings/index.ts b/apps/meteor/server/publications/settings/index.ts index 2cf699c8d82e..17c58a123c37 100644 --- a/apps/meteor/server/publications/settings/index.ts +++ b/apps/meteor/server/publications/settings/index.ts @@ -1,6 +1,6 @@ import type { ISetting, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Settings } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import type { WithId } from 'mongodb'; @@ -8,7 +8,7 @@ import { getSettingPermissionId } from '../../../app/authorization/lib'; import { hasPermissionAsync, hasAtLeastOnePermissionAsync } from '../../../app/authorization/server/functions/hasPermission'; import { SettingsEvents } from '../../../app/settings/server'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'public-settings/get'( diff --git a/apps/meteor/server/publications/spotlight.ts b/apps/meteor/server/publications/spotlight.ts index a88a0eb74b65..b9275598c4c6 100644 --- a/apps/meteor/server/publications/spotlight.ts +++ b/apps/meteor/server/publications/spotlight.ts @@ -1,10 +1,10 @@ -import type { ServerMethods } from '@rocket.chat/ui-contexts'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { DDPRateLimiter } from 'meteor/ddp-rate-limiter'; import { Meteor } from 'meteor/meteor'; import { Spotlight } from '../lib/spotlight'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { spotlight( diff --git a/apps/meteor/server/publications/subscription/index.ts b/apps/meteor/server/publications/subscription/index.ts index 9bbe1f63afe3..b691b7daf9ee 100644 --- a/apps/meteor/server/publications/subscription/index.ts +++ b/apps/meteor/server/publications/subscription/index.ts @@ -1,11 +1,11 @@ import type { ISubscription } from '@rocket.chat/core-typings'; +import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Subscriptions } from '@rocket.chat/models'; -import type { ServerMethods } from '@rocket.chat/ui-contexts'; import { Meteor } from 'meteor/meteor'; import { subscriptionFields } from '../../../lib/publishFields'; -declare module '@rocket.chat/ui-contexts' { +declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { 'subscriptions/get'(updatedAt?: Date): ISubscription[] | { update: ISubscription[]; remove: { _id: string; _deletedAt: Date }[] }; diff --git a/apps/meteor/server/routes/avatar/middlewares/auth.js b/apps/meteor/server/routes/avatar/middlewares/auth.js index 40eb072d405c..5a4ead7ed048 100644 --- a/apps/meteor/server/routes/avatar/middlewares/auth.js +++ b/apps/meteor/server/routes/avatar/middlewares/auth.js @@ -1,11 +1,20 @@ -import { userCanAccessAvatar } from '../utils'; +import { userCanAccessAvatar, renderSVGLetters } from '../utils'; // protect all avatar endpoints export const protectAvatars = async (req, res, next) => { if (!(await userCanAccessAvatar(req))) { - res.writeHead(403); - res.write('Forbidden'); + let roomOrUsername; + + if (req.url.startsWith('/room')) { + roomOrUsername = req.url.split('/')[2] || 'Room'; + } else { + roomOrUsername = req.url.split('/')[1] || 'Anonymous'; + } + + res.writeHead(200, { 'Content-Type': 'image/svg+xml' }); + res.write(renderSVGLetters(roomOrUsername, 200)); res.end(); + return; } diff --git a/apps/meteor/server/routes/avatar/room.js b/apps/meteor/server/routes/avatar/room.js index c47e58b48d0b..3482253d57d8 100644 --- a/apps/meteor/server/routes/avatar/room.js +++ b/apps/meteor/server/routes/avatar/room.js @@ -5,6 +5,9 @@ import { FileUpload } from '../../../app/file-upload/server'; import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; import { renderSVGLetters, serveAvatar, wasFallbackModified, setCacheAndDispositionHeaders } from './utils'; +const MAX_ROOM_SVG_AVATAR_SIZE = 1024; +const MIN_ROOM_SVG_AVATAR_SIZE = 16; + const cookie = new Cookies(); const getRoomAvatar = async (roomId) => { const room = await Rooms.findOneById(roomId, { projection: { t: 1, prid: 1, name: 1, fname: 1, federated: 1 } }); @@ -64,7 +67,12 @@ export const roomAvatar = async function (req, res /* , next*/) { return; } - const svg = renderSVGLetters(roomName, req.query.size && parseInt(req.query.size)); + let avatarSize = req.query.size && parseInt(req.query.size); + if (avatarSize) { + avatarSize = Math.min(Math.max(avatarSize, MIN_ROOM_SVG_AVATAR_SIZE), MAX_ROOM_SVG_AVATAR_SIZE); + } + + const svg = renderSVGLetters(roomName, avatarSize); return serveAvatar(svg, req.query.format, res); }; diff --git a/apps/meteor/server/routes/avatar/user.js b/apps/meteor/server/routes/avatar/user.js index 7997a91d95a4..0d86bc4a08cf 100644 --- a/apps/meteor/server/routes/avatar/user.js +++ b/apps/meteor/server/routes/avatar/user.js @@ -4,6 +4,9 @@ import { FileUpload } from '../../../app/file-upload/server'; import { settings } from '../../../app/settings/server'; import { renderSVGLetters, serveAvatar, wasFallbackModified, setCacheAndDispositionHeaders } from './utils'; +const MAX_USER_SVG_AVATAR_SIZE = 1024; +const MIN_USER_SVG_AVATAR_SIZE = 16; + // request /avatar/@name forces returning the svg export const userAvatar = async function (req, res) { const requestUsername = decodeURIComponent(req.url.substr(1).replace(/\?.*$/, '')); @@ -14,7 +17,10 @@ export const userAvatar = async function (req, res) { return; } - const avatarSize = req.query.size && parseInt(req.query.size); + let avatarSize = req.query.size && parseInt(req.query.size); + if (avatarSize) { + avatarSize = Math.min(Math.max(avatarSize, MIN_USER_SVG_AVATAR_SIZE), MAX_USER_SVG_AVATAR_SIZE); + } setCacheAndDispositionHeaders(req, res); diff --git a/apps/meteor/server/services/federation/infrastructure/rocket-chat/hooks/index.ts b/apps/meteor/server/services/federation/infrastructure/rocket-chat/hooks/index.ts index 950aac23a39a..f14257512b11 100644 --- a/apps/meteor/server/services/federation/infrastructure/rocket-chat/hooks/index.ts +++ b/apps/meteor/server/services/federation/infrastructure/rocket-chat/hooks/index.ts @@ -150,7 +150,7 @@ export class FederationHooks { public static afterMessageUpdated(callback: (message: IMessage, roomId: IRoom['_id'], userId: string) => Promise): void { callbacks.add( 'afterSaveMessage', - async (message: IMessage, room: IRoom): Promise => { + async (message, { room }): Promise => { if ( !room || !isRoomFederated(room) || @@ -174,7 +174,7 @@ export class FederationHooks { public static afterMessageSent(callback: (message: IMessage, roomId: IRoom['_id'], userId: string) => Promise): void { callbacks.add( 'afterSaveMessage', - async (message: IMessage, room: IRoom): Promise => { + async (message, { room }): Promise => { if (!room || !isRoomFederated(room) || !message || !settings.get('Federation_Matrix_enabled')) { return message; } diff --git a/apps/meteor/server/services/messages/hooks/BeforeSaveMarkdownParser.ts b/apps/meteor/server/services/messages/hooks/BeforeSaveMarkdownParser.ts index b4b099485de3..e8e00d75b56c 100644 --- a/apps/meteor/server/services/messages/hooks/BeforeSaveMarkdownParser.ts +++ b/apps/meteor/server/services/messages/hooks/BeforeSaveMarkdownParser.ts @@ -31,7 +31,7 @@ export class BeforeSaveMarkdownParser { message.md = parse(message.msg, config); } - if (message.attachments?.[0]?.description !== undefined) { + if (message.attachments?.[0]?.description) { message.attachments[0].descriptionMd = parse(message.attachments[0].description, config); } } catch (e) { diff --git a/apps/meteor/server/services/messages/service.ts b/apps/meteor/server/services/messages/service.ts index e18a9c276c50..906868b6bb17 100644 --- a/apps/meteor/server/services/messages/service.ts +++ b/apps/meteor/server/services/messages/service.ts @@ -6,12 +6,13 @@ import { Messages, Rooms } from '@rocket.chat/models'; import { deleteMessage } from '../../../app/lib/server/functions/deleteMessage'; import { sendMessage } from '../../../app/lib/server/functions/sendMessage'; import { updateMessage } from '../../../app/lib/server/functions/updateMessage'; +import { notifyOnRoomChangedById, notifyOnMessageChange } from '../../../app/lib/server/lib/notifyListener'; +import { notifyUsersOnSystemMessage } from '../../../app/lib/server/lib/notifyUsersOnMessage'; import { executeSendMessage } from '../../../app/lib/server/methods/sendMessage'; import { executeSetReaction } from '../../../app/reactions/server/setReaction'; import { settings } from '../../../app/settings/server'; import { getUserAvatarURL } from '../../../app/utils/server/getUserAvatarURL'; import { BeforeSaveCannedResponse } from '../../../ee/server/hooks/messages/BeforeSaveCannedResponse'; -import { broadcastMessageFromData } from '../../modules/watchers/lib/messages'; import { BeforeSaveBadWords } from './hooks/BeforeSaveBadWords'; import { BeforeSaveCheckMAC } from './hooks/BeforeSaveCheckMAC'; import { BeforeSaveJumpToMessage } from './hooks/BeforeSaveJumpToMessage'; @@ -97,19 +98,38 @@ export class MessageService extends ServiceClassInternal implements IMessageServ return executeSetReaction(userId, reaction, messageId, shouldReact); } + async saveSystemMessageAndNotifyUser( + type: MessageTypesValues, + rid: string, + messageText: string, + owner: Pick, + extraData?: Partial, + ): Promise { + const createdMessage = await this.saveSystemMessage(type, rid, messageText, owner, extraData); + + const room = await Rooms.findOneById(rid); + if (!room) { + throw new Error('Failed to find the room.'); + } + + await notifyUsersOnSystemMessage(createdMessage, room); + + return createdMessage; + } + async saveSystemMessage( type: MessageTypesValues, rid: string, message: string, owner: Pick, extraData?: Partial, - ): Promise { + ): Promise { const { _id: userId, username, name } = owner; if (!username) { throw new Error('The username cannot be empty.'); } - const [result] = await Promise.all([ + const [{ insertedId }] = await Promise.all([ Messages.createWithTypeRoomIdMessageUserAndUnread( type, rid, @@ -121,11 +141,19 @@ export class MessageService extends ServiceClassInternal implements IMessageServ Rooms.incMsgCountById(rid, 1), ]); - void broadcastMessageFromData({ - id: result.insertedId, - }); + if (!insertedId) { + throw new Error('Failed to save system message.'); + } + + const createdMessage = await Messages.findOneById(insertedId); + if (!createdMessage) { + throw new Error('Failed to find the created message.'); + } + + void notifyOnMessageChange({ id: createdMessage._id, data: createdMessage }); + void notifyOnRoomChangedById(rid); - return result.insertedId; + return createdMessage; } async beforeSave({ @@ -142,8 +170,8 @@ export class MessageService extends ServiceClassInternal implements IMessageServ message = await mentionServer.execute(message); message = await this.cannedResponse.replacePlaceholders({ message, room, user }); - message = await this.markdownParser.parseMarkdown({ message, config: this.getMarkdownConfig() }); message = await this.badWords.filterBadWords({ message }); + message = await this.markdownParser.parseMarkdown({ message, config: this.getMarkdownConfig() }); message = await this.spotify.convertSpotifyLinks({ message }); message = await this.jumpToMessage.createAttachmentForMessageURLs({ message, diff --git a/apps/meteor/server/services/room/service.ts b/apps/meteor/server/services/room/service.ts index 4b0fe2d177b5..3ba47284ddee 100644 --- a/apps/meteor/server/services/room/service.ts +++ b/apps/meteor/server/services/room/service.ts @@ -16,7 +16,7 @@ export class RoomService extends ServiceClassInternal implements IRoomService { protected name = 'room'; async create(uid: string, params: ICreateRoomParams): Promise { - const { type, name, members = [], readOnly, extraData, options } = params; + const { type, name, members = [], readOnly, extraData, options, sidepanel } = params; const hasPermission = await Authorization.hasPermission(uid, `create-${type}`); if (!hasPermission) { @@ -29,7 +29,7 @@ export class RoomService extends ServiceClassInternal implements IRoomService { } // TODO convert `createRoom` function to "raw" and move to here - return createRoom(type, name, user, members, false, readOnly, extraData, options) as unknown as IRoom; + return createRoom(type, name, user, members, false, readOnly, extraData, options, sidepanel) as unknown as IRoom; } async createDirectMessage({ to, from }: { to: string; from: string }): Promise<{ rid: string }> { @@ -59,11 +59,14 @@ export class RoomService extends ServiceClassInternal implements IRoomService { async addUserToRoom( roomId: string, - user: Pick | string, + user: Pick | string, inviter?: Pick, - silenced?: boolean, + options?: { + skipSystemMessage?: boolean; + skipAlertSound?: boolean; + }, ): Promise { - return addUserToRoom(roomId, user, inviter, silenced); + return addUserToRoom(roomId, user, inviter, options); } async removeUserFromRoom(roomId: string, user: IUser, options?: { byUser: IUser }): Promise { diff --git a/apps/meteor/server/services/team/service.ts b/apps/meteor/server/services/team/service.ts index be153d565f18..bc4211322b66 100644 --- a/apps/meteor/server/services/team/service.ts +++ b/apps/meteor/server/services/team/service.ts @@ -37,7 +37,10 @@ import { settings } from '../../../app/settings/server'; export class TeamService extends ServiceClassInternal implements ITeamService { protected name = 'team'; - async create(uid: string, { team, room = { name: team.name, extraData: {} }, members, owner }: ITeamCreateParams): Promise { + async create( + uid: string, + { team, room = { name: team.name, extraData: {} }, members, owner, sidepanel }: ITeamCreateParams, + ): Promise { if (!(await checkUsernameAvailability(team.name))) { throw new Error('team-name-already-exists'); } @@ -120,6 +123,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { teamId, teamMain: true, }, + sidepanel, }; const createdRoom = await Room.create(owner || uid, newRoom); @@ -718,7 +722,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { for await (const member of members) { const user = (await Users.findOneById(member.userId, { projection: { username: 1 } })) as Pick; - await addUserToRoom(team.roomId, user, createdBy, false); + await addUserToRoom(team.roomId, user, createdBy, { skipSystemMessage: false }); if (member.roles) { await this.addRolesToMember(teamId, member.userId, member.roles); @@ -826,7 +830,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { return; } - await addUserToRoom(team.roomId, user, inviter, false); + await addUserToRoom(team.roomId, user, inviter, { skipSystemMessage: false }); }), ); } @@ -977,7 +981,7 @@ export class TeamService extends ServiceClassInternal implements ITeamService { // at this point, users are already part of the team so we won't check for membership for await (const user of users) { // add each user to the default room - await addUserToRoom(room._id, user, inviter, false); + await addUserToRoom(room._id, user, inviter, { skipSystemMessage: false }); } }); } diff --git a/apps/meteor/server/services/translation/service.ts b/apps/meteor/server/services/translation/service.ts index e3ec1475e6ce..2dbc1a57a5e3 100644 --- a/apps/meteor/server/services/translation/service.ts +++ b/apps/meteor/server/services/translation/service.ts @@ -17,8 +17,8 @@ export class TranslationService extends ServiceClassInternal implements ITransla } // Use translateText when you already know the language, or want to translate to a predefined language - translateText(text: string, targetLanguage: string): Promise { - return Promise.resolve(i18n.t(text, { lng: targetLanguage })); + translateText(text: string, targetLanguage: string, args?: Record): Promise { + return Promise.resolve(i18n.t(text, { lng: targetLanguage, ...args })); } // Use translate when you want to translate to the user's language, or server's as a fallback @@ -28,9 +28,18 @@ export class TranslationService extends ServiceClassInternal implements ITransla return this.translateText(text, language); } - async translateToServerLanguage(text: string): Promise { + async translateToServerLanguage(text: string, args?: Record): Promise { const language = await this.getServerLanguageCached(); - return this.translateText(text, language); + return this.translateText(text, language, args); + } + + async translateMultipleToServerLanguage(keys: string[]): Promise> { + const language = await this.getServerLanguageCached(); + + return keys.map((key) => ({ + key, + value: i18n.t(key, { lng: language, fallbackLng: 'en' }), + })); } } diff --git a/apps/meteor/server/services/video-conference/service.ts b/apps/meteor/server/services/video-conference/service.ts index 7c7d5950cf5f..a26e947b6b80 100644 --- a/apps/meteor/server/services/video-conference/service.ts +++ b/apps/meteor/server/services/video-conference/service.ts @@ -1,7 +1,8 @@ import { Apps } from '@rocket.chat/apps'; +import type { VideoConfData, VideoConfDataExtended } from '@rocket.chat/apps-engine/definition/videoConfProviders'; import type { AppVideoConfProviderManager } from '@rocket.chat/apps-engine/server/managers'; import type { IVideoConfService, VideoConferenceJoinOptions } from '@rocket.chat/core-services'; -import { api, ServiceClassInternal } from '@rocket.chat/core-services'; +import { api, ServiceClassInternal, Room } from '@rocket.chat/core-services'; import type { IDirectVideoConference, ILivechatVideoConference, @@ -27,14 +28,19 @@ import { isGroupVideoConference, isLivechatVideoConference, } from '@rocket.chat/core-typings'; +import { Logger } from '@rocket.chat/logger'; import { Users, VideoConference as VideoConferenceModel, Rooms, Messages, Subscriptions } from '@rocket.chat/models'; +import { Random } from '@rocket.chat/random'; import type { PaginatedResult } from '@rocket.chat/rest-typings'; +import { wrapExceptions } from '@rocket.chat/tools'; import type * as UiKit from '@rocket.chat/ui-kit'; import { MongoInternals } from 'meteor/mongo'; import { RocketChatAssets } from '../../../app/assets/server'; import { canAccessRoomIdAsync } from '../../../app/authorization/server/functions/canAccessRoom'; +import { createRoom } from '../../../app/lib/server/functions/createRoom'; import { sendMessage } from '../../../app/lib/server/functions/sendMessage'; +import { notifyOnMessageChange } from '../../../app/lib/server/lib/notifyListener'; import { metrics } from '../../../app/metrics/server/lib/metrics'; import PushNotification from '../../../app/push-notifications/server/lib/PushNotification'; import { Push } from '../../../app/push/server/push'; @@ -47,12 +53,14 @@ import { availabilityErrors } from '../../../lib/videoConference/constants'; import { readSecondaryPreferred } from '../../database/readSecondaryPreferred'; import { i18n } from '../../lib/i18n'; import { isRoomCompatibleWithVideoConfRinging } from '../../lib/isRoomCompatibleWithVideoConfRinging'; +import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; import { videoConfProviders } from '../../lib/videoConfProviders'; import { videoConfTypes } from '../../lib/videoConfTypes'; -import { broadcastMessageFromData } from '../../modules/watchers/lib/messages'; const { db } = MongoInternals.defaultRemoteCollectionDriver().mongo; +const logger = new Logger('VideoConference'); + export class VideoConfService extends ServiceClassInternal implements IVideoConfService { protected name = 'video-conference'; @@ -61,33 +69,41 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf { type, rid, createdBy, providerName, ...data }: VideoConferenceCreateData, useAppUser = true, ): Promise { - const room = await Rooms.findOneById>(rid, { - projection: { t: 1, uids: 1, name: 1, fname: 1 }, - }); - - if (!room) { - throw new Error('invalid-room'); - } + return wrapExceptions(async () => { + const room = await Rooms.findOneById>(rid, { + projection: { t: 1, uids: 1, name: 1, fname: 1 }, + }); - const user = await Users.findOneById(createdBy, {}); - if (!user) { - throw new Error('failed-to-load-own-data'); - } + if (!room) { + throw new Error('invalid-room'); + } - if (type === 'direct') { - if (!isRoomCompatibleWithVideoConfRinging(room.t, room.uids)) { - throw new Error('type-and-room-not-compatible'); + const user = await Users.findOneById(createdBy); + if (!user) { + throw new Error('failed-to-load-own-data'); } - return this.startDirect(providerName, user, room, data); - } + if (type === 'direct') { + if (!isRoomCompatibleWithVideoConfRinging(room.t, room.uids)) { + throw new Error('type-and-room-not-compatible'); + } - if (type === 'livechat') { - return this.startLivechat(providerName, user, rid); - } + return this.startDirect(providerName, user, room, data); + } - const title = (data as Partial).title || room.fname || room.name || ''; - return this.startGroup(providerName, user, room._id, title, data, useAppUser); + if (type === 'livechat') { + return this.startLivechat(providerName, user, rid); + } + + const title = (data as Partial).title || room.fname || room.name || ''; + return this.startGroup(providerName, user, room._id, title, data, useAppUser); + }).catch((e) => { + logger.error({ + name: 'Error on VideoConf.create', + error: e, + }); + throw e; + }); } // VideoConference.start: Detect the desired type and provider then start a video conference using them @@ -96,45 +112,61 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf rid: string, { title, allowRinging }: { title?: string; allowRinging?: boolean }, ): Promise { - const providerName = await this.getValidatedProvider(); - const initialData = await this.getTypeForNewVideoConference(rid, Boolean(allowRinging)); - - const data = { - ...initialData, - createdBy: caller, - rid, - providerName, - } as VideoConferenceCreateData; - - if (data.type === 'videoconference') { - data.title = title; - } + return wrapExceptions(async () => { + const providerName = await this.getValidatedProvider(); + const initialData = await this.getTypeForNewVideoConference(rid, Boolean(allowRinging)); + + const data = { + ...initialData, + createdBy: caller, + rid, + providerName, + } as VideoConferenceCreateData; + + if (data.type === 'videoconference') { + data.title = title; + } - return this.create(data, false); + return this.create(data, false); + }).catch((e) => { + logger.error({ + name: 'Error on VideoConf.start', + error: e, + }); + throw e; + }); } public async join(uid: IUser['_id'] | undefined, callId: VideoConference['_id'], options: VideoConferenceJoinOptions): Promise { - const call = await VideoConferenceModel.findOneById(callId); - if (!call || call.endedAt) { - throw new Error('invalid-call'); - } + return wrapExceptions(async () => { + const call = await VideoConferenceModel.findOneById(callId); + if (!call || call.endedAt) { + throw new Error('invalid-call'); + } - let user: Pick | null = null; + let user: Pick | null = null; - if (uid) { - user = await Users.findOneById>(uid, { - projection: { name: 1, username: 1, avatarETag: 1 }, - }); - if (!user) { - throw new Error('failed-to-load-own-data'); + if (uid) { + user = await Users.findOneById>(uid, { + projection: { name: 1, username: 1, avatarETag: 1 }, + }); + if (!user) { + throw new Error('failed-to-load-own-data'); + } } - } - if (call.providerName === 'jitsi') { - updateCounter({ settingsId: 'Jitsi_Click_To_Join_Count' }); - } + if (call.providerName === 'jitsi') { + updateCounter({ settingsId: 'Jitsi_Click_To_Join_Count' }); + } - return this.joinCall(call, user || undefined, options); + return this.joinCall(call, user || undefined, options); + }).catch((e) => { + logger.error({ + name: 'Error on VideoConf.join', + error: e, + }); + throw e; + }); } public async getInfo(callId: VideoConference['_id'], uid: IUser['_id'] | undefined): Promise { @@ -328,7 +360,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf const text = i18n.t('video_livechat_missed', { username: name }); await Messages.setBlocksById(call.messages.started, [this.buildMessageBlock(text)]); - await broadcastMessageFromData({ + await notifyOnMessageChange({ id: call.messages.started, }); } @@ -686,13 +718,15 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf }, providerName, }); + + await this.runNewVideoConferenceEvent(callId); + + await this.maybeCreateDiscussion(callId, user); + const call = (await this.getUnfiltered(callId)) as IDirectVideoConference | null; if (!call) { throw new Error('failed-to-create-direct-call'); } - - await this.runNewVideoConferenceEvent(callId); - const url = await this.generateNewUrl(call); await VideoConferenceModel.setUrlById(callId, url); @@ -759,13 +793,16 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf }, providerName, }); + + await this.runNewVideoConferenceEvent(callId); + + await this.maybeCreateDiscussion(callId, user); + const call = (await this.getUnfiltered(callId)) as IGroupVideoConference | null; if (!call) { throw new Error('failed-to-create-group-call'); } - await this.runNewVideoConferenceEvent(callId); - const url = await this.generateNewUrl(call); await VideoConferenceModel.setUrlById(callId, url); @@ -804,6 +841,8 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf await this.runNewVideoConferenceEvent(callId); + // Livechat conferences do not use discussions + const joinUrl = await this.getUrl(call); const messageId = await this.createLivechatMessage(call, user, joinUrl); call.messages.started = messageId; @@ -852,19 +891,17 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf } const title = isGroupVideoConference(call) ? call.title || (await this.getRoomName(call.rid)) : ''; + const callData: VideoConfData = { + _id: call._id, + type: call.type, + rid: call.rid, + createdBy: call.createdBy as Required, + title, + providerData: call.providerData, + discussionRid: call.discussionRid, + }; - return (await this.getProviderManager()) - .generateUrl(call.providerName, { - _id: call._id, - type: call.type, - rid: call.rid, - createdBy: call.createdBy as Required, - title, - providerData: call.providerData, - }) - .catch((e) => { - throw new Error(e); - }); + return (await this.getProviderManager()).generateUrl(call.providerName, callData); } private async getCallTitleForUser(call: VideoConference, userId?: IUser['_id']): Promise { @@ -920,7 +957,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf await VideoConferenceModel.setUrlById(call._id, call.url); } - const callData = { + const callData: VideoConfDataExtended = { _id: call._id, type: call.type, rid: call.rid, @@ -931,6 +968,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf ...{ customCallTitle: await this.getCallTitleForUser(call, user?._id) }, }, title: await this.getCallTitle(call), + discussionRid: call.discussionRid, }; const userData = user && { @@ -939,9 +977,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf name: user.name as string, }; - return (await this.getProviderManager()).customizeUrl(call.providerName, callData, userData, options).catch((e) => { - throw new Error(e); - }); + return (await this.getProviderManager()).customizeUrl(call.providerName, callData, userData, options); } private async runNewVideoConferenceEvent(callId: VideoConference['_id']): Promise { @@ -955,9 +991,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf throw new Error('video-conf-provider-unavailable'); } - (await this.getProviderManager()).onNewVideoConference(call.providerName, call).catch((e) => { - throw new Error(e); - }); + return (await this.getProviderManager()).onNewVideoConference(call.providerName, call); } private async runVideoConferenceChangedEvent(callId: VideoConference['_id']): Promise { @@ -971,9 +1005,7 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf throw new Error('video-conf-provider-unavailable'); } - (await this.getProviderManager()).onVideoConferenceChanged(call.providerName, call).catch((e) => { - throw new Error(e); - }); + return (await this.getProviderManager()).onVideoConferenceChanged(call.providerName, call); } private async runOnUserJoinEvent(callId: VideoConference['_id'], user?: IVideoConferenceUser): Promise { @@ -987,15 +1019,19 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf throw new Error('video-conf-provider-unavailable'); } - (await this.getProviderManager()).onUserJoin(call.providerName, call, user).catch((e) => { - throw new Error(e); - }); + return (await this.getProviderManager()).onUserJoin(call.providerName, call, user); } private async addUserToCall( call: Optional, { _id, username, name, avatarETag, ts }: AtLeast, '_id' | 'username' | 'name' | 'avatarETag'> & { ts?: Date }, ): Promise { + // If the call has a discussion, ensure the user is subscribed to it; + // This is done even if the user has already joined the call before, so they can be added back if they had left the discussion. + if (call.discussionRid) { + await this.addUserToDiscussion(call.discussionRid, _id); + } + if (call.users.find((user) => user._id === _id)) { return; } @@ -1034,4 +1070,128 @@ export class VideoConfService extends ServiceClassInternal implements IVideoConf await this.runVideoConferenceChangedEvent(call._id); await this.sendAllPushNotifications(call._id); } + + private isPersistentChatEnabled(): boolean { + return settings.get('VideoConf_Enable_Persistent_Chat') && settings.get('Discussion_enabled'); + } + + private async maybeCreateDiscussion(callId: VideoConference['_id'], createdBy?: IUser): Promise { + if (!this.isPersistentChatEnabled()) { + return; + } + + const call = await VideoConferenceModel.findOneById(callId, { + projection: { rid: 1, createdBy: 1, discussionRid: 1, providerName: 1 }, + }); + if (!call) { + throw new Error('invalid-video-conference'); + } + + // If there's already a discussion assigned to it, do not create a new one + if (call.discussionRid) { + return; + } + + // If the call provider does not explicitly support persistent chat, do not create discussions + if (!videoConfProviders.getProviderCapabilities(call.providerName)?.persistentChat) { + return; + } + + const name = settings.get('VideoConf_Persistent_Chat_Discussion_Name') || i18n.t('Conference Call Chat History'); + const displayName = `${name} - ${new Date().toISOString().substring(0, 10)}`; + + await this.createDiscussionForConference(displayName, call, createdBy); + } + + private async getRoomForDiscussion( + baseRoom: IRoom['_id'], + childRoomIds: IRoom['_id'][] = [], + ): Promise> { + const room = await Rooms.findOneById>(baseRoom, { + projection: { t: 1, teamId: 1, prid: 1 }, + }); + if (!room) { + throw new Error('invalid-room'); + } + + if (room.prid) { + if (childRoomIds.includes(room.prid)) { + throw new Error('Room has circular reference.'); + } + + return this.getRoomForDiscussion(room.prid, [...childRoomIds, room._id]); + } + + return room; + } + + private async createDiscussionForConference( + name: string, + call: AtLeast, + createdBy?: IUser, + ): Promise { + const room = await this.getRoomForDiscussion(call.rid); + + const type = await roomCoordinator.getRoomDirectives(room.t).getDiscussionType(room); + const user = call.createdBy._id === createdBy?._id ? createdBy : await Users.findOneById(call.createdBy._id); + if (!user) { + throw new Error('invalid-user'); + } + + const discussion = await createRoom( + type, + Random.id(), + user, + [], + false, + false, + { + fname: name, + prid: room._id, + encrypted: false, + }, + { + creator: user._id, + }, + ); + + return this.assignDiscussionToConference(call._id, discussion._id); + } + + public async assignDiscussionToConference(callId: VideoConference['_id'], rid: IRoom['_id'] | undefined): Promise { + // Ensures the specified rid is a valid room + const room = rid ? await Rooms.findOneById>(rid, { projection: { prid: 1 } }) : null; + if (rid && !room) { + throw new Error('invalid-room-id'); + } + + const call = await VideoConferenceModel.findOneById(callId, { projection: { users: 1, messages: 1 } }); + if (!call) { + return; + } + + if (rid === undefined) { + await VideoConferenceModel.unsetDiscussionRidById(callId); + } else { + await VideoConferenceModel.setDiscussionRidById(callId, rid); + } + + if (room) { + await Promise.all(call.users.map(({ _id }) => this.addUserToDiscussion(room._id, _id))); + } + } + + private async addUserToDiscussion(rid: IRoom['_id'], uid: IUser['_id']): Promise { + try { + await Room.addUserToRoom(rid, { _id: uid }, undefined, { skipAlertSound: true }); + } catch (error) { + // Ignore any errors here so that the subscription doesn't block the user from participating in the conference. + logger.error({ + name: 'Error trying to subscribe user to discussion', + error, + rid, + uid, + }); + } + } } diff --git a/apps/meteor/server/settings/accounts.ts b/apps/meteor/server/settings/accounts.ts index 39e4183dbf5f..a744c47b2a41 100644 --- a/apps/meteor/server/settings/accounts.ts +++ b/apps/meteor/server/settings/accounts.ts @@ -760,7 +760,7 @@ export const createAccountSettings = () => i18nDescription: 'Accounts_AvatarCacheTime_description', }); - await this.add('Accounts_AvatarBlockUnauthenticatedAccess', false, { + await this.add('Accounts_AvatarBlockUnauthenticatedAccess', true, { type: 'boolean', public: true, }); diff --git a/apps/meteor/server/settings/cas.ts b/apps/meteor/server/settings/cas.ts index f8ae4e6ca65a..48a13d8cbd9c 100644 --- a/apps/meteor/server/settings/cas.ts +++ b/apps/meteor/server/settings/cas.ts @@ -33,8 +33,8 @@ export const createCasSettings = () => await this.add('CAS_popup_width', 810, { type: 'int', group: 'CAS', public: true }); await this.add('CAS_popup_height', 610, { type: 'int', group: 'CAS', public: true }); await this.add('CAS_button_label_text', 'CAS', { type: 'string', group: 'CAS' }); - await this.add('CAS_button_label_color', '#FFFFFF', { type: 'color', group: 'CAS', alert: 'OAuth_button_colors_alert' }); - await this.add('CAS_button_color', '#1d74f5', { type: 'color', group: 'CAS', alert: 'OAuth_button_colors_alert' }); + await this.add('CAS_button_label_color', '#FFFFFF', { type: 'color', group: 'CAS' }); + await this.add('CAS_button_color', '#1d74f5', { type: 'color', group: 'CAS' }); await this.add('CAS_autoclose', true, { type: 'boolean', group: 'CAS' }); }); }); diff --git a/apps/meteor/server/settings/oauth.ts b/apps/meteor/server/settings/oauth.ts index acc397faa37d..c67286771a0a 100644 --- a/apps/meteor/server/settings/oauth.ts +++ b/apps/meteor/server/settings/oauth.ts @@ -115,14 +115,12 @@ export const createOauthSettings = () => public: true, i18nLabel: 'Accounts_OAuth_Custom_Button_Label_Color', persistent: true, - alert: 'OAuth_button_colors_alert', }); await this.add('Accounts_OAuth_Nextcloud_button_color', '#0082c9', { type: 'string', public: true, i18nLabel: 'Accounts_OAuth_Custom_Button_Color', persistent: true, - alert: 'OAuth_button_colors_alert', }); }); @@ -275,13 +273,11 @@ export const createOauthSettings = () => type: 'string', i18nLabel: 'Accounts_OAuth_Custom_Button_Label_Color', persistent: true, - alert: 'OAuth_button_colors_alert', }); await this.add('Accounts_OAuth_Dolphin_button_color', '#1d74f5', { type: 'string', i18nLabel: 'Accounts_OAuth_Custom_Button_Color', persistent: true, - alert: 'OAuth_button_colors_alert', }); }); await this.section('Facebook', async function () { diff --git a/apps/meteor/server/settings/omnichannel.ts b/apps/meteor/server/settings/omnichannel.ts index cc9da5474862..ed1daa8ce228 100644 --- a/apps/meteor/server/settings/omnichannel.ts +++ b/apps/meteor/server/settings/omnichannel.ts @@ -404,11 +404,29 @@ export const createOmniSettings = () => enableQuery: [{ _id: 'FileUpload_Enabled', value: true }, omnichannelEnabledQuery], }); + // Making these 2 settings "depend" on each other + // Prevents us from having both as true and then asking visitor if it wants a Transcript + // But send it anyways because of send_always being enabled. So one can only be turned on + // if the other is off. await this.add('Livechat_enable_transcript', false, { type: 'boolean', group: 'Omnichannel', public: true, i18nLabel: 'Transcript_Enabled', + enableQuery: [{ _id: 'Livechat_transcript_send_always', value: false }, omnichannelEnabledQuery], + }); + + await this.add('Livechat_transcript_send_always', false, { + type: 'boolean', + group: 'Omnichannel', + public: true, + enableQuery: [{ _id: 'Livechat_enable_transcript', value: false }, omnichannelEnabledQuery], + }); + + await this.add('Livechat_transcript_show_system_messages', false, { + type: 'boolean', + group: 'Omnichannel', + public: true, enableQuery: omnichannelEnabledQuery, }); @@ -420,6 +438,13 @@ export const createOmniSettings = () => enableQuery: [{ _id: 'Livechat_enable_transcript', value: true }, omnichannelEnabledQuery], }); + await this.add('Livechat_transcript_email_subject', '', { + type: 'string', + group: 'Omnichannel', + public: true, + enableQuery: omnichannelEnabledQuery, + }); + await this.add('Omnichannel_enable_department_removal', false, { type: 'boolean', group: 'Omnichannel', diff --git a/apps/meteor/tests/data/apps/apps-data.ts b/apps/meteor/tests/data/apps/apps-data.ts index 6c5117c2150e..30bc3e92b144 100644 --- a/apps/meteor/tests/data/apps/apps-data.ts +++ b/apps/meteor/tests/data/apps/apps-data.ts @@ -1,6 +1,6 @@ import type { Path } from '@rocket.chat/rest-typings'; -export const APP_URL = 'https://github.com/RocketChat/Apps.RocketChat.Tester/blob/master/dist/appsrocketchattester_0.0.5.zip?raw=true'; +export const APP_URL = 'https://github.com/RocketChat/Apps.RocketChat.Tester/raw/master/dist/appsrocketchattester_0.1.1.zip?raw=true'; export const APP_NAME = 'Apps.RocketChat.Tester'; type PathWithoutPrefix = TPath extends `/apps${infer U}` ? U : never; diff --git a/apps/meteor/tests/data/livechat/department.ts b/apps/meteor/tests/data/livechat/department.ts index 47d0f7f2b468..72ab0af9f267 100644 --- a/apps/meteor/tests/data/livechat/department.ts +++ b/apps/meteor/tests/data/livechat/department.ts @@ -16,12 +16,16 @@ const NewDepartmentData = ((): Partial => ({ showOnOfflineForm: true, }))(); -export const createDepartment = async (departmentData: Partial = NewDepartmentData): Promise => { +export const createDepartment = async ( + departmentData: Partial = NewDepartmentData, + agents?: { agentId: string; count?: string; order?: string }[], +): Promise => { const response = await request .post(api('livechat/department')) .set(credentials) .send({ department: departmentData, + ...(agents && { agents }), }) .expect(200); return response.body.department; @@ -38,7 +42,16 @@ const updateDepartment = async (departmentId: string, departmentData: Partial

  • +const createDepartmentWithMethod = ( + initialAgents: { agentId: string; username: string }[] = [], + { + allowReceiveForwardOffline = false, + fallbackForwardDepartment, + }: { + allowReceiveForwardOffline?: boolean; + fallbackForwardDepartment?: string; + } = {}, +) => new Promise((resolve, reject) => { void request .post(methodCall('livechat:saveDepartment')) @@ -56,6 +69,7 @@ const createDepartmentWithMethod = (initialAgents: { agentId: string; username: name: `new department ${Date.now()}`, description: 'created from api', allowReceiveForwardOffline, + fallbackForwardDepartment, }, initialAgents, ], @@ -126,8 +140,10 @@ export const addOrRemoveAgentFromDepartment = async ( export const createDepartmentWithAnOfflineAgent = async ({ allowReceiveForwardOffline = false, + fallbackForwardDepartment, }: { - allowReceiveForwardOffline: boolean; + allowReceiveForwardOffline?: boolean; + fallbackForwardDepartment?: string; }): Promise<{ department: ILivechatDepartment; agent: { @@ -137,7 +153,10 @@ export const createDepartmentWithAnOfflineAgent = async ({ }> => { const { user, credentials } = await createAnOfflineAgent(); - const department = (await createDepartmentWithMethod(undefined, allowReceiveForwardOffline)) as ILivechatDepartment; + const department = (await createDepartmentWithMethod(undefined, { + allowReceiveForwardOffline, + fallbackForwardDepartment, + })) as ILivechatDepartment; await addOrRemoveAgentFromDepartment(department._id, { agentId: user._id, username: user.username }, true); diff --git a/apps/meteor/tests/e2e/administration-settings.spec.ts b/apps/meteor/tests/e2e/administration-settings.spec.ts new file mode 100644 index 000000000000..d2996d6eac88 --- /dev/null +++ b/apps/meteor/tests/e2e/administration-settings.spec.ts @@ -0,0 +1,52 @@ +import { Users } from './fixtures/userStates'; +import { Admin } from './page-objects'; +import { getSettingValueById } from './utils'; +import { test, expect } from './utils/test'; + +test.use({ storageState: Users.admin.state }); + +test.describe.parallel('administration-settings', () => { + let poAdmin: Admin; + + test.beforeEach(async ({ page }) => { + poAdmin = new Admin(page); + }); + + test.describe('General', () => { + let inputSiteURLSetting: string; + + test.beforeAll(async ({ api }) => { + inputSiteURLSetting = (await getSettingValueById(api, 'Site_Url')) as string; + }); + + test.beforeEach(async ({ page }) => { + await page.goto('/admin/settings/General'); + }); + + test('should be able to reset a setting after a change', async () => { + await poAdmin.inputSiteURL.fill('any_text'); + await poAdmin.btnResetSiteURL.click(); + + await expect(poAdmin.inputSiteURL).toHaveValue(inputSiteURLSetting); + }); + + test('should be able to go back to the settings page', async ({ page }) => { + await poAdmin.btnBack.click(); + + await expect(page).toHaveURL('/admin/settings'); + }); + }); + + test.describe('Layout', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/admin/settings/Layout'); + }); + + test('should code mirror full screen be displayed correctly', async ({ page }) => { + await poAdmin.getAccordionBtnByName('Custom CSS').click(); + await poAdmin.btnFullScreen.click(); + + await expect(page.getByRole('code')).toHaveCSS('width', '920px'); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/administration.spec.ts b/apps/meteor/tests/e2e/administration.spec.ts index 703c4a4bd8b1..45fee011efc3 100644 --- a/apps/meteor/tests/e2e/administration.spec.ts +++ b/apps/meteor/tests/e2e/administration.spec.ts @@ -319,34 +319,4 @@ test.describe.parallel('administration', () => { await expect(poAdmin.getIntegrationByName(incomingIntegrationName)).not.toBeVisible(); }); }); - - test.describe('Settings', () => { - test.describe('General', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/admin/settings/General'); - }); - - test.afterAll(async ({ api }) => { - await setSettingValueById(api, 'Language', 'en'); - }); - - test('expect be able to reset a setting after a change', async () => { - await poAdmin.inputSiteURL.type('any_text'); - await poAdmin.btnResetSiteURL.click(); - }); - }); - - test.describe('Layout', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/admin/settings/Layout'); - }); - - test('should code mirror full screen be displayed correctly', async ({ page }) => { - await poAdmin.getAccordionBtnByName('Custom CSS').click(); - await poAdmin.btnFullScreen.click(); - - await expect(page.getByRole('code')).toHaveCSS('width', '920px'); - }); - }); - }); }); diff --git a/apps/meteor/tests/e2e/app-modal-interaction.spec.ts b/apps/meteor/tests/e2e/apps/app-modal-interaction.spec.ts similarity index 92% rename from apps/meteor/tests/e2e/app-modal-interaction.spec.ts rename to apps/meteor/tests/e2e/apps/app-modal-interaction.spec.ts index 1a1ce2b656e8..e2f25e913427 100644 --- a/apps/meteor/tests/e2e/app-modal-interaction.spec.ts +++ b/apps/meteor/tests/e2e/apps/app-modal-interaction.spec.ts @@ -1,7 +1,7 @@ -import { Users } from './fixtures/userStates'; -import { HomeChannel } from './page-objects'; -import { createTargetChannel } from './utils/create-target-channel'; -import { test, expect } from './utils/test'; +import { Users } from '../fixtures/userStates'; +import { HomeChannel } from '../page-objects'; +import { createTargetChannel } from '../utils/create-target-channel'; +import { test, expect } from '../utils/test'; test.use({ storageState: Users.admin.state }); diff --git a/apps/meteor/tests/e2e/apps.spec.ts b/apps/meteor/tests/e2e/apps/apps-contextualbar.spec.ts similarity index 60% rename from apps/meteor/tests/e2e/apps.spec.ts rename to apps/meteor/tests/e2e/apps/apps-contextualbar.spec.ts index bc41cf7aed06..4753d5167083 100644 --- a/apps/meteor/tests/e2e/apps.spec.ts +++ b/apps/meteor/tests/e2e/apps/apps-contextualbar.spec.ts @@ -1,26 +1,34 @@ -import { Users } from './fixtures/userStates'; -import { HomeChannel } from './page-objects'; -import { expect, test } from './utils/test'; +import type { Page } from '@playwright/test'; + +import { Users } from '../fixtures/userStates'; +import { HomeChannel } from '../page-objects'; +import { expect, test } from '../utils/test'; test.use({ storageState: Users.user1.state }); -test.describe.serial('Apps', () => { +test.describe.serial('Apps > ContextualBar', () => { let poHomeChannel: HomeChannel; - test.beforeEach(async ({ page }) => { + let page: Page; + + test.beforeAll(async ({ browser }) => { + page = await browser.newPage(); poHomeChannel = new HomeChannel(page); await page.goto('/home'); await poHomeChannel.sidenav.openChat('general'); }); + test.afterAll(async () => { + await page.close(); + }); + test('expect allow user open app contextualbar', async () => { await poHomeChannel.content.dispatchSlashCommand('/contextualbar'); await expect(poHomeChannel.btnContextualbarClose).toBeVisible(); }); test('expect app contextualbar to be closed', async () => { - await poHomeChannel.content.dispatchSlashCommand('/contextualbar'); await poHomeChannel.btnContextualbarClose.click(); await expect(poHomeChannel.btnContextualbarClose).toBeHidden(); }); diff --git a/apps/meteor/tests/e2e/apps/apps-modal.spec.ts b/apps/meteor/tests/e2e/apps/apps-modal.spec.ts new file mode 100644 index 000000000000..53a4d479bb27 --- /dev/null +++ b/apps/meteor/tests/e2e/apps/apps-modal.spec.ts @@ -0,0 +1,49 @@ +import type { Page } from '@playwright/test'; + +import { Users } from '../fixtures/userStates'; +import { HomeChannel } from '../page-objects'; +import { Modal } from '../page-objects/modal'; +import { expect, test } from '../utils/test'; + +test.use({ storageState: Users.user1.state }); + +test.describe.serial('Apps > ContextualBar', () => { + let poHomeChannel: HomeChannel; + let poModal: Modal; + + let page: Page; + + test.beforeAll(async ({ browser }) => { + page = await browser.newPage(); + + poHomeChannel = new HomeChannel(page); + poModal = new Modal(page); + + await page.goto('/home'); + await poHomeChannel.sidenav.openChat('general'); + }); + + test.afterAll(async () => { + await page.close(); + }); + + test('expect allow user open app modal', async () => { + await poHomeChannel.content.dispatchSlashCommand('/modal'); + await expect(poModal.btnModalSubmit).toBeVisible(); + }); + + test('expect validation error message appears in app modal', async () => { + await expect(poModal.textInput).toBeVisible(); + + await poModal.btnModalSubmit.click(); + + await expect(poModal.textInputErrorMessage).toBeVisible(); + }); + + test("expect validation error message don't appears in app modal", async () => { + await poModal.textInput.fill('something'); + await poModal.btnModalSubmit.click(); + + await expect(poModal.textInputErrorMessage).not.toBeVisible(); + }); +}); diff --git a/apps/meteor/tests/e2e/channel-management.spec.ts b/apps/meteor/tests/e2e/channel-management.spec.ts index 199f6b1c4388..dc0ec9b1ebaa 100644 --- a/apps/meteor/tests/e2e/channel-management.spec.ts +++ b/apps/meteor/tests/e2e/channel-management.spec.ts @@ -239,7 +239,7 @@ test.describe.serial('channel-management', () => { await expect(user1Channel.tabs.room.btnEdit).toBeVisible(); }); - test('should set user1 as owner', async () => { + test('should set user1 as owner', async ({ browser }) => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnTabMembers.click(); await poHomeChannel.tabs.members.showAllUsers(); @@ -247,14 +247,19 @@ test.describe.serial('channel-management', () => { await expect(poHomeChannel.getSystemMessageByText('set user1 as owner')).toBeVisible(); + const user1Page = await browser.newPage({ storageState: Users.user1.state }); const user1Channel = new HomeChannel(user1Page); await user1Page.goto(`/channel/${targetChannel}`); await user1Channel.waitForChannel(); await user1Channel.tabs.btnRoomInfo.click(); - await expect(user1Channel.tabs.room.btnDelete).toBeVisible(); + + await user1Channel.tabs.room.btnMore.click(); + + await expect(user1Channel.tabs.room.optionDelete).toBeVisible(); await user1Page.close(); }); + test('should ignore user1 messages', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnTabMembers.click(); @@ -315,6 +320,7 @@ test.describe.serial('channel-management', () => { await poHomeChannel.sidenav.openNewByLabel('Channel'); await poHomeChannel.sidenav.inputChannelName.fill(channelName); await poHomeChannel.sidenav.checkboxPrivateChannel.click(); + await poHomeChannel.sidenav.advancedSettingsAccordion.click(); await poHomeChannel.sidenav.checkboxReadOnly.click(); await poHomeChannel.sidenav.btnCreate.click(); diff --git a/apps/meteor/tests/e2e/e2e-encryption.spec.ts b/apps/meteor/tests/e2e/e2e-encryption.spec.ts index 55aefe88571c..dd481ea39b6a 100644 --- a/apps/meteor/tests/e2e/e2e-encryption.spec.ts +++ b/apps/meteor/tests/e2e/e2e-encryption.spec.ts @@ -344,11 +344,14 @@ test.describe.serial('e2e-encryption', () => { await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible(); }); - test('expect placeholder text in place of encrypted file description, when E2EE is not setup', async ({ page }) => { + test('expect placeholder text in place of encrypted file description, when E2EE is not setup and non-encrypted files upload in disabled e2ee room', async ({ + page, + }) => { const channelName = faker.string.uuid(); await poHomeChannel.sidenav.openNewByLabel('Channel'); await poHomeChannel.sidenav.inputChannelName.fill(channelName); + await poHomeChannel.sidenav.advancedSettingsAccordion.click(); await poHomeChannel.sidenav.checkboxEncryption.click(); await poHomeChannel.sidenav.btnCreate.click(); @@ -368,6 +371,42 @@ test.describe.serial('e2e-encryption', () => { await expect(poHomeChannel.content.getFileDescription).toHaveText('any_description'); await expect(poHomeChannel.content.lastMessageFileName).toContainText('any_file1.txt'); + await test.step('disable E2EE in the room', async () => { + await poHomeChannel.tabs.kebab.click(); + + await expect(poHomeChannel.tabs.btnDisableE2E).toBeVisible(); + await poHomeChannel.tabs.btnDisableE2E.click(); + await poHomeChannel.dismissToast(); + // will wait till the key icon in header goes away + await expect(poHomeChannel.content.encryptedRoomHeaderIcon).toHaveCount(0); + }); + + await page.reload(); + + await test.step('upload the file in disabled E2EE room', async () => { + await expect(poHomeChannel.content.encryptedRoomHeaderIcon).not.toBeVisible(); + + await poHomeChannel.content.dragAndDropTxtFile(); + await poHomeChannel.content.descriptionInput.fill('any_description'); + await poHomeChannel.content.fileNameInput.fill('any_file1.txt'); + await poHomeChannel.content.btnModalConfirm.click(); + + await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).not.toBeVisible(); + + await expect(poHomeChannel.content.getFileDescription).toHaveText('any_description'); + await expect(poHomeChannel.content.lastMessageFileName).toContainText('any_file1.txt'); + }); + + await test.step('Enable E2EE in the room', async () => { + await poHomeChannel.tabs.kebab.click(); + + await expect(poHomeChannel.tabs.btnEnableE2E).toBeVisible(); + await poHomeChannel.tabs.btnEnableE2E.click(); + await poHomeChannel.dismissToast(); + // will wait till the key icon in header appears + await expect(poHomeChannel.content.encryptedRoomHeaderIcon).toHaveCount(1); + }); + // Logout to remove e2ee keys await poHomeChannel.sidenav.logout(); @@ -380,10 +419,10 @@ test.describe.serial('e2e-encryption', () => { await expect(poHomeChannel.content.encryptedRoomHeaderIcon).toBeVisible(); - await expect(poHomeChannel.content.lastUserMessage).toContainText( + await expect(poHomeChannel.content.nthMessage(0)).toContainText( 'This message is end-to-end encrypted. To view it, you must enter your encryption key in your account settings.', ); - await expect(poHomeChannel.content.lastUserMessage.locator('.rcx-icon--name-key')).toBeVisible(); + await expect(poHomeChannel.content.nthMessage(0).locator('.rcx-icon--name-key')).toBeVisible(); }); test('expect slash commands to be enabled in an e2ee room', async ({ page }) => { @@ -524,19 +563,26 @@ test.describe.serial('e2e-encryption', () => { await poHomeChannel.tabs.btnPinnedMessagesList.click(); await expect(page.getByRole('dialog', { name: 'Pinned Messages' })).toBeVisible(); - await expect(page.getByRole('dialog', { name: 'Pinned Messages' }).locator('[data-qa-type="message"]').last()).toContainText( - 'This message should be pinned and stared.', - ); + + const lastPinnedMessage = page.getByRole('dialog', { name: 'Pinned Messages' }).locator('[data-qa-type="message"]').last(); + await expect(lastPinnedMessage).toContainText('This message should be pinned and stared.'); + await lastPinnedMessage.hover(); + await lastPinnedMessage.locator('role=button[name="More"]').waitFor(); + await lastPinnedMessage.locator('role=button[name="More"]').click(); + await expect(page.locator('role=menuitem[name="Copy link"]')).toHaveClass(/disabled/); await poHomeChannel.btnContextualbarClose.click(); await poHomeChannel.tabs.kebab.click(); await poHomeChannel.tabs.btnStarredMessageList.click(); + const lastStarredMessage = page.getByRole('dialog', { name: 'Starred Messages' }).locator('[data-qa-type="message"]').last(); await expect(page.getByRole('dialog', { name: 'Starred Messages' })).toBeVisible(); - await expect(page.getByRole('dialog', { name: 'Starred Messages' }).locator('[data-qa-type="message"]').last()).toContainText( - 'This message should be pinned and stared.', - ); + await expect(lastStarredMessage).toContainText('This message should be pinned and stared.'); + await lastStarredMessage.hover(); + await lastStarredMessage.locator('role=button[name="More"]').waitFor(); + await lastStarredMessage.locator('role=button[name="More"]').click(); + await expect(page.locator('role=menuitem[name="Copy link"]')).toHaveClass(/disabled/); }); test.describe('reset keys', () => { @@ -594,6 +640,10 @@ test.describe.serial('e2ee room setup', () => { expect((await api.post('/settings/E2E_Allow_Unencrypted_Messages', { value: false })).status()).toBe(200); }); + test.afterEach(async ({ api }) => { + await api.recreateContext(); + }); + test('expect save password state on encrypted room', async ({ page }) => { await page.goto('/account/security'); await poAccountProfile.securityE2EEncryptionSection.click(); @@ -601,22 +651,18 @@ test.describe.serial('e2ee room setup', () => { await page.locator('role=button[name="Login"]').waitFor(); - await page.reload(); - - await page.locator('role=button[name="Login"]').waitFor(); - await injectInitialData(); await restoreState(page, Users.admin); await page.goto('/home'); - await page.locator('role=banner >> text="Save your encryption password"').waitFor(); await expect(page.locator('role=banner >> text="Save your encryption password"')).toBeVisible(); const channelName = faker.string.uuid(); await poHomeChannel.sidenav.openNewByLabel('Channel'); await poHomeChannel.sidenav.inputChannelName.fill(channelName); + await poHomeChannel.sidenav.advancedSettingsAccordion.click(); await poHomeChannel.sidenav.checkboxEncryption.click(); await poHomeChannel.sidenav.btnCreate.click(); @@ -624,10 +670,8 @@ test.describe.serial('e2ee room setup', () => { await poHomeChannel.dismissToast(); - await poHomeChannel.content.encryptedRoomHeaderIcon.first().waitFor(); await expect(poHomeChannel.content.encryptedRoomHeaderIcon.first()).toBeVisible(); - await page.locator('role=button[name="Save E2EE password"]').waitFor(); await expect(page.locator('role=button[name="Save E2EE password"]')).toBeVisible(); await poHomeChannel.tabs.btnE2EERoomSetupDisableE2E.waitFor(); @@ -660,8 +704,6 @@ test.describe.serial('e2ee room setup', () => { // Logout to remove e2ee keys await poHomeChannel.sidenav.logout(); - await page.locator('role=button[name="Login"]').waitFor(); - await page.reload(); await page.locator('role=button[name="Login"]').waitFor(); await injectInitialData(); @@ -671,6 +713,7 @@ test.describe.serial('e2ee room setup', () => { await poHomeChannel.sidenav.openNewByLabel('Channel'); await poHomeChannel.sidenav.inputChannelName.fill(channelName); + await poHomeChannel.sidenav.advancedSettingsAccordion.click(); await poHomeChannel.sidenav.checkboxEncryption.click(); await poHomeChannel.sidenav.btnCreate.click(); @@ -718,6 +761,7 @@ test.describe.serial('e2ee room setup', () => { await poHomeChannel.sidenav.openNewByLabel('Channel'); await poHomeChannel.sidenav.inputChannelName.fill(channelName); + await poHomeChannel.sidenav.advancedSettingsAccordion.click(); await poHomeChannel.sidenav.checkboxEncryption.click(); await poHomeChannel.sidenav.btnCreate.click(); @@ -781,11 +825,11 @@ test.describe.serial('e2ee support legacy formats', () => { }); test.afterAll(async ({ api }) => { - expect((await api.post('/settings/E2E_Enable', { value: false })).status()).toBe(200); - expect((await api.post('/settings/E2E_Allow_Unencrypted_Messages', { value: false })).status()).toBe(200); + await api.post('/settings/E2E_Enable', { value: false }); + await api.post('/settings/E2E_Allow_Unencrypted_Messages', { value: false }); }); - // Not testing upload since it was not implemented in the legacy format + // ->>>>>>>>>>>Not testing upload since it was not implemented in the legacy format test('expect create a private channel encrypted and send an encrypted message', async ({ page, request }) => { await page.goto('/home'); diff --git a/apps/meteor/tests/e2e/file-upload.spec.ts b/apps/meteor/tests/e2e/file-upload.spec.ts index 0a5d1cfd2512..159b2650ac16 100644 --- a/apps/meteor/tests/e2e/file-upload.spec.ts +++ b/apps/meteor/tests/e2e/file-upload.spec.ts @@ -12,7 +12,7 @@ test.describe.serial('file-upload', () => { test.beforeAll(async ({ api }) => { await setSettingValueById(api, 'FileUpload_MediaTypeBlackList', 'image/svg+xml'); - targetChannel = await createTargetChannel(api); + targetChannel = await createTargetChannel(api, { members: ['user1'] }); }); test.beforeEach(async ({ page }) => { @@ -76,3 +76,27 @@ test.describe.serial('file-upload', () => { await expect(poHomeChannel.content.btnModalConfirm).not.toBeVisible(); }); }); +test.describe('file-upload-not-member', () => { + let poHomeChannel: HomeChannel; + let targetChannel: string; + + test.beforeAll(async ({ api }) => { + targetChannel = await createTargetChannel(api); + }); + + test.beforeEach(async ({ page }) => { + poHomeChannel = new HomeChannel(page); + + await page.goto('/home'); + await poHomeChannel.sidenav.openChat(targetChannel); + }); + + test.afterAll(async ({ api }) => { + expect((await api.post('/channels.delete', { roomName: targetChannel })).status()).toBe(200); + }); + + test('expect not be able to upload if not a member', async () => { + await poHomeChannel.content.dragAndDropTxtFile(); + await expect(poHomeChannel.content.modalFilePreview).not.toBeVisible(); + }); +}); diff --git a/apps/meteor/tests/e2e/fixtures/insert-apps.ts b/apps/meteor/tests/e2e/fixtures/insert-apps.ts index 17928896612f..fd88714daa3b 100644 --- a/apps/meteor/tests/e2e/fixtures/insert-apps.ts +++ b/apps/meteor/tests/e2e/fixtures/insert-apps.ts @@ -3,7 +3,7 @@ import { request } from '@playwright/test'; import { BASE_API_URL, BASE_URL } from '../config/constants'; import { Users } from './userStates'; -const APP_URL = 'https://github.com/RocketChat/Apps.RocketChat.Tester/blob/master/dist/appsrocketchattester_0.0.5.zip?raw=true'; +const APP_URL = 'https://github.com/RocketChat/Apps.RocketChat.Tester/blob/master/dist/appsrocketchattester_0.1.0.zip?raw=true'; export default async function insertApp(): Promise { const api = await request.newContext(); diff --git a/apps/meteor/tests/e2e/image-gallery.spec.ts b/apps/meteor/tests/e2e/image-gallery.spec.ts index 0291eefff9df..526e695870df 100644 --- a/apps/meteor/tests/e2e/image-gallery.spec.ts +++ b/apps/meteor/tests/e2e/image-gallery.spec.ts @@ -31,6 +31,7 @@ test.describe.serial('Image Gallery', async () => { }); test.afterAll(async ({ api }) => { + await poHomeChannel.page.close(); await deleteChannel(api, targetChannel); await deleteChannel(api, targetChannelLargeImage); }); diff --git a/apps/meteor/tests/e2e/message-actions.spec.ts b/apps/meteor/tests/e2e/message-actions.spec.ts index 5186d27e3656..bc916af89bae 100644 --- a/apps/meteor/tests/e2e/message-actions.spec.ts +++ b/apps/meteor/tests/e2e/message-actions.spec.ts @@ -70,6 +70,19 @@ test.describe.serial('message-actions', () => { await expect(poHomeChannel.content.lastMessageTextAttachmentEqualsText).toHaveText(message); }); + test('expect create a discussion from message', async ({ page }) => { + const message = `Message for discussion - ${Date.now()}`; + + await poHomeChannel.content.sendMessage(message); + await poHomeChannel.content.openLastMessageMenu(); + await page.locator('role=menuitem[name="Start a Discussion"]').click(); + const createButton = page.getByRole('dialog').getByRole('button', { name: 'create' }); + // Name should be prefilled thus making the create button enabled + await expect(createButton).not.toBeDisabled(); + await createButton.click(); + await expect(page.locator('header h1')).toHaveText(message); + }); + test('expect star the message', async ({ page }) => { await poHomeChannel.content.sendMessage('Message to star'); await poHomeChannel.content.openLastMessageMenu(); diff --git a/apps/meteor/tests/e2e/message-composer.spec.ts b/apps/meteor/tests/e2e/message-composer.spec.ts index e68d82daf78f..2ed3bcbb238e 100644 --- a/apps/meteor/tests/e2e/message-composer.spec.ts +++ b/apps/meteor/tests/e2e/message-composer.spec.ts @@ -69,4 +69,39 @@ test.describe.serial('message-composer', () => { await expect(poHomeChannel.composer).toHaveValue(`[hello composer](${url})`); }); + + test('should select popup item and not send the message when pressing enter', async ({ page }) => { + await poHomeChannel.sidenav.openChat(targetChannel); + await poHomeChannel.content.sendMessage('hello composer'); + + await test.step('mention popup', async () => { + await page.keyboard.type('hello composer @all'); + + await page.keyboard.press('Enter'); + + await expect(poHomeChannel.composer).toHaveValue('hello composer @all '); + + await poHomeChannel.composer.fill(''); + }); + + await test.step('emoji popup', async () => { + await page.keyboard.type('hello composer :flag_br'); + + await page.keyboard.press('Enter'); + + await expect(poHomeChannel.composer).toHaveValue('hello composer :flag_br: '); + + await poHomeChannel.composer.fill(''); + }); + + await test.step('slash command', async () => { + await page.keyboard.type('/gim'); + + await page.keyboard.press('Enter'); + + await expect(poHomeChannel.composer).toHaveValue('/gimme '); + + await poHomeChannel.composer.fill(''); + }); + }); }); diff --git a/apps/meteor/tests/e2e/messaging.spec.ts b/apps/meteor/tests/e2e/messaging.spec.ts index c5b004faeb85..9cd0c996993e 100644 --- a/apps/meteor/tests/e2e/messaging.spec.ts +++ b/apps/meteor/tests/e2e/messaging.spec.ts @@ -1,3 +1,5 @@ +import type { Page } from '@playwright/test'; + import { createAuxContext } from './fixtures/createAuxContext'; import { Users } from './fixtures/userStates'; import { HomeChannel } from './page-objects'; @@ -137,36 +139,40 @@ test.describe.serial('Messaging', () => { await expect(page.locator('[data-qa-type="message"]').last()).toBeFocused(); }); - test('expect show "hello word" in both contexts (targetChannel)', async ({ browser }) => { - await poHomeChannel.sidenav.openChat(targetChannel); - const { page } = await createAuxContext(browser, Users.user2); - const auxContext = { page, poHomeChannel: new HomeChannel(page) }; + test.describe('Both contexts', () => { + let auxContext: { page: Page; poHomeChannel: HomeChannel }; + test.beforeEach(async ({ browser }) => { + const { page } = await createAuxContext(browser, Users.user2); + auxContext = { page, poHomeChannel: new HomeChannel(page) }; + }); - await auxContext.poHomeChannel.sidenav.openChat(targetChannel); + test.afterEach(async () => { + await auxContext.page.close(); + }); - await poHomeChannel.content.sendMessage('hello world'); + test('expect show "hello word" in both contexts (targetChannel)', async () => { + await poHomeChannel.sidenav.openChat(targetChannel); - await expect(async () => { - await expect(auxContext.poHomeChannel.content.lastUserMessageBody).toHaveText('hello world'); - await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('hello world'); - }).toPass(); + await auxContext.poHomeChannel.sidenav.openChat(targetChannel); - await auxContext.page.close(); - }); + await poHomeChannel.content.sendMessage('hello world'); - test('expect show "hello word" in both contexts (direct)', async ({ browser }) => { - await poHomeChannel.sidenav.openChat('user2'); - const { page } = await createAuxContext(browser, Users.user2); - const auxContext = { page, poHomeChannel: new HomeChannel(page) }; - await auxContext.poHomeChannel.sidenav.openChat('user1'); + await expect(async () => { + await expect(auxContext.poHomeChannel.content.lastUserMessageBody).toHaveText('hello world'); + await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('hello world'); + }).toPass(); + }); - await poHomeChannel.content.sendMessage('hello world'); + test('expect show "hello word" in both contexts (direct)', async () => { + await poHomeChannel.sidenav.openChat('user2'); + await auxContext.poHomeChannel.sidenav.openChat('user1'); - await expect(async () => { - await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('hello world'); - await expect(auxContext.poHomeChannel.content.lastUserMessageBody).toHaveText('hello world'); - }).toPass(); + await poHomeChannel.content.sendMessage('hello world'); - await auxContext.page.close(); + await expect(async () => { + await expect(poHomeChannel.content.lastUserMessageBody).toHaveText('hello world'); + await expect(auxContext.poHomeChannel.content.lastUserMessageBody).toHaveText('hello world'); + }).toPass(); + }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-agents.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-agents.spec.ts index 70b5e51f681c..239978928126 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-agents.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-agents.spec.ts @@ -25,7 +25,7 @@ test.describe.serial('OC - Manage Agents', () => { // Ensure that there is no leftover data even if test fails test.afterEach(async ({ api }) => { - await await api.delete('/livechat/users/agent/user1'); + await api.delete('/livechat/users/agent/user1'); await api.post('/settings/Omnichannel_enable_department_removal', { value: true }).then((res) => expect(res.status()).toBe(200)); await department.delete(); await api.post('/settings/Omnichannel_enable_department_removal', { value: false }).then((res) => expect(res.status()).toBe(200)); @@ -105,4 +105,27 @@ test.describe.serial('OC - Manage Agents', () => { await poOmnichannelAgents.btnSave.click(); }); }); + + test('OC - Edit agent - Manage departments', async ({ page }) => { + await poOmnichannelAgents.selectUsername('user1'); + await poOmnichannelAgents.btnAdd.click(); + await poOmnichannelAgents.inputSearch.fill('user1'); + await poOmnichannelAgents.findRowByUsername('user1').click(); + + await poOmnichannelAgents.btnEdit.click(); + await poOmnichannelAgents.selectDepartment(department.data.name); + await poOmnichannelAgents.btnSave.click(); + + await test.step('expect the selected department is visible', async () => { + await poOmnichannelAgents.findRowByUsername('user1').click(); + + // mock the endpoint to use the one without pagination + await page.route('/api/v1/livechat/department?showArchived=true', async (route) => { + await route.fulfill({ json: { departments: [] } }); + }); + + await poOmnichannelAgents.btnEdit.click(); + await expect(poOmnichannelAgents.findSelectedDepartment(department.data.name)).toBeVisible(); + }); + }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-auto-onhold-chat-closing.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-auto-onhold-chat-closing.spec.ts index 7f321342b502..255ac0d3ed09 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-auto-onhold-chat-closing.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-auto-onhold-chat-closing.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -27,13 +27,13 @@ test.describe('omnichannel-auto-onhold-chat-closing', () => { agent = { page, poHomeChannel: new HomeChannel(page) }; }); test.afterAll(async ({ api }) => { + await agent.page.close(); + await Promise.all([ api.delete('/livechat/users/agent/user1').then((res) => expect(res.status()).toBe(200)), api.post('/settings/Livechat_auto_close_on_hold_chats_timeout', { value: 3600 }).then((res) => expect(res.status()).toBe(200)), api.post('/settings/Livechat_allow_manual_on_hold', { value: false }).then((res) => expect(res.status()).toBe(200)), ]); - - await agent.page.close(); }); test.beforeEach(async ({ page, api }) => { @@ -41,10 +41,7 @@ test.describe('omnichannel-auto-onhold-chat-closing', () => { await agent.poHomeChannel.sidenav.switchStatus('online'); // start a new chat for each test - newVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); poLiveChat = new OmnichannelLiveChat(page, api); await page.goto('/livechat'); await poLiveChat.openLiveChat(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-auto-transfer-unanswered-chat.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-auto-transfer-unanswered-chat.spec.ts index a1620f3d70c7..285fdaef828a 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-auto-transfer-unanswered-chat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-auto-transfer-unanswered-chat.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -32,14 +32,14 @@ test.describe('omnichannel-auto-transfer-unanswered-chat', () => { }); test.afterAll(async ({ api }) => { + await agent1.page.close(); + await agent2.page.close(); + await Promise.all([ api.delete('/livechat/users/agent/user1').then((res) => expect(res.status()).toBe(200)), api.delete('/livechat/users/agent/user2').then((res) => expect(res.status()).toBe(200)), api.post('/settings/Livechat_auto_transfer_chat_timeout', { value: 0 }).then((res) => expect(res.status()).toBe(200)), ]); - - await agent1.page.close(); - await agent2.page.close(); }); test.beforeEach(async ({ page, api }) => { @@ -48,10 +48,7 @@ test.describe('omnichannel-auto-transfer-unanswered-chat', () => { await agent2.poHomeChannel.sidenav.switchOmnichannelStatus('offline'); // start a new chat for each test - newVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); poLiveChat = new OmnichannelLiveChat(page, api); await page.goto('/livechat'); await poLiveChat.openLiveChat(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-canned-responses-sidebar.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-canned-responses-sidebar.spec.ts index b0c7c22491b6..8d3c3a4283f2 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-canned-responses-sidebar.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-canned-responses-sidebar.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -11,15 +11,12 @@ test.describe('Omnichannel Canned Responses Sidebar', () => { test.skip(!IS_EE, 'Enterprise Only'); let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeChannel: HomeChannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); // Set user user 1 as manager and agent await api.post('/livechat/users/agent', { username: 'user1' }); @@ -42,13 +39,13 @@ test.describe('Omnichannel Canned Responses Sidebar', () => { await test.step('Expect send a message as a visitor', async () => { await page.goto('/livechat'); await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); await poLiveChat.btnSendMessageToOnlineAgent.click(); }); await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { - await agent.poHomeChannel.sidenav.openChat(newUser.name); + await agent.poHomeChannel.sidenav.openChat(newVisitor.name); }); await test.step('Expect to be able to open canned responses sidebar and creation', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-changing-room-priority-and-sla.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-changing-room-priority-and-sla.spec.ts index 694dbff94ebe..ee32eb4efe0d 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-changing-room-priority-and-sla.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-changing-room-priority-and-sla.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { ADMIN_CREDENTIALS, IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -30,13 +30,13 @@ test.describe.serial('omnichannel-changing-room-priority-and-sla', () => { test.beforeAll(async ({ api, browser }) => { let statusCode = (await api.post('/livechat/users/agent', { username: ADMIN_CREDENTIALS.username })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); statusCode = (await api.post('/livechat/users/manager', { username: ADMIN_CREDENTIALS.username })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); statusCode = (await api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); const { page } = await createAuxContext(browser, Users.admin); agent = { page, poHomeChannel: new HomeChannel(page) }; @@ -45,23 +45,17 @@ test.describe.serial('omnichannel-changing-room-priority-and-sla', () => { }); test.afterAll(async ({ api }) => { - let statusCode = (await api.delete(`/livechat/users/agent/${ADMIN_CREDENTIALS.username}`)).status(); - await expect(statusCode).toBe(200); - - statusCode = (await api.delete(`/livechat/users/manager/${ADMIN_CREDENTIALS.username}`)).status(); - await expect(statusCode).toBe(200); - - statusCode = (await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' })).status(); - await expect(statusCode).toBe(200); - await agent.page.close(); + + await Promise.all([ + api.delete(`/livechat/users/agent/${ADMIN_CREDENTIALS.username}`), + api.delete(`/livechat/users/manager/${ADMIN_CREDENTIALS.username}`), + api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }), + ]); }); test('expect to initiate a new livechat conversation', async ({ page, api }) => { - newVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); poLiveChat = new OmnichannelLiveChat(page, api); await page.goto('/livechat'); await poLiveChat.openLiveChat(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-history.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-history.spec.ts index 044d3df516f0..2be6347a3e0e 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-history.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-history.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; @@ -8,15 +8,12 @@ import { test, expect } from '../utils/test'; test.describe('Omnichannel chat histr', () => { let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); // Set user user 1 as manager and agent await api.post('/livechat/users/agent', { username: 'user1' }); @@ -38,13 +35,13 @@ test.describe('Omnichannel chat histr', () => { await test.step('Expect send a message as a visitor', async () => { await page.goto('/livechat'); await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); await poLiveChat.btnSendMessageToOnlineAgent.click(); }); await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { - await agent.poHomeOmnichannel.sidenav.openChat(newUser.name); + await agent.poHomeOmnichannel.sidenav.openChat(newVisitor.name); }); await test.step('Expect to be able to close an omnichannel to conversation', async () => { @@ -62,7 +59,7 @@ test.describe('Omnichannel chat histr', () => { }); await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { - await agent.poHomeOmnichannel.sidenav.openChat(newUser.name); + await agent.poHomeOmnichannel.sidenav.openChat(newVisitor.name); }); await test.step('Expect to be able to see conversation history', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-close-chat.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-close-chat.spec.ts index 75fb398ee1de..b17842afd969 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-close-chat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-close-chat.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; @@ -8,15 +8,12 @@ import { test, expect } from '../utils/test'; test.describe('Omnichannel close chat', () => { let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); // Set user user 1 as manager and agent await api.post('/livechat/users/agent', { username: 'user1' }); @@ -39,13 +36,13 @@ test.describe('Omnichannel close chat', () => { await test.step('Expect send a message as a visitor', async () => { await page.goto('/livechat'); await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); await poLiveChat.btnSendMessageToOnlineAgent.click(); }); await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { - await agent.poHomeOmnichannel.sidenav.openChat(newUser.name); + await agent.poHomeOmnichannel.sidenav.openChat(newVisitor.name); }); await test.step('Expect to be able to close an omnichannel to conversation', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-close-inquiry.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-close-inquiry.spec.ts index 18994c080694..b37a34ba861e 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-close-inquiry.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-close-inquiry.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; @@ -8,15 +8,12 @@ import { test, expect } from '../utils/test'; test.describe('Omnichannel close inquiry', () => { let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel }; test.beforeAll(async ({ api }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); await api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' }).then((res) => expect(res.status()).toBe(200)); await api.post('/livechat/users/manager', { username: 'user1' }); @@ -30,26 +27,29 @@ test.describe('Omnichannel close inquiry', () => { agent = { page: auxPage, poHomeOmnichannel: new HomeOmnichannel(auxPage) }; }); + test.afterEach(async () => { + await agent.page.close(); + }); + test.afterAll(async ({ api }) => { await Promise.all([ await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }).then((res) => expect(res.status()).toBe(200)), await api.delete('/livechat/users/agent/user1'), await api.delete('/livechat/users/manager/user1'), ]); - await agent.page.close(); }); test('Receiving a message from visitor', async ({ page }) => { await test.step('Expect send a message as a visitor', async () => { await page.goto('/livechat'); await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); await poLiveChat.btnSendMessageToOnlineAgent.click(); }); await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { - await agent.poHomeOmnichannel.sidenav.getQueuedChat(newUser.name).click(); + await agent.poHomeOmnichannel.sidenav.getQueuedChat(newVisitor.name).click(); await expect(agent.poHomeOmnichannel.content.btnTakeChat).toBeVisible(); }); @@ -63,7 +63,7 @@ test.describe('Omnichannel close inquiry', () => { await test.step('Expect to inquiry be closed when navigate back', async () => { await agent.poHomeOmnichannel.sidenav.openAdministrationByLabel('Omnichannel'); await agent.poHomeOmnichannel.omnisidenav.linkCurrentChats.click(); - await agent.poHomeOmnichannel.currentChats.findRowByName(newUser.name).click(); + await agent.poHomeOmnichannel.currentChats.findRowByName(newVisitor.name).click(); await expect(agent.poHomeOmnichannel.content.btnTakeChat).not.toBeVisible(); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-contact-info.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-contact-info.spec.ts index 266df1849292..76b8ac386ef7 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-contact-info.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-contact-info.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeChannel } from '../page-objects'; @@ -8,15 +8,12 @@ import { test } from '../utils/test'; test.describe('Omnichannel contact info', () => { let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeChannel: HomeChannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); // Set user user 1 as manager and agent await api.post('/livechat/users/agent', { username: 'user1' }); @@ -39,13 +36,13 @@ test.describe('Omnichannel contact info', () => { await test.step('Expect send a message as a visitor', async () => { await page.goto('/livechat'); await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); await poLiveChat.btnSendMessageToOnlineAgent.click(); }); await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { - await agent.poHomeChannel.sidenav.openChat(newUser.name); + await agent.poHomeChannel.sidenav.openChat(newVisitor.name); }); await test.step('Expect to be see contact information and edit', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts index 0e368565cdc0..2d96aef8e365 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-departaments.spec.ts @@ -39,7 +39,7 @@ test.describe('OC - Manage Departments', () => { await poOmnichannelDepartments.sidenav.linkDepartments.click(); }); - test('OC - Manage Departments - Create department', async () => { + test('Create department', async () => { const departmentName = faker.string.uuid(); await poOmnichannelDepartments.headingButtonNew('Create department').click(); @@ -106,190 +106,187 @@ test.describe('OC - Manage Departments', () => { }); }); - test('OC - Manage Departments - Edit department', async ({ api }) => { - const department = await test.step('expect create new department', async () => { - const { data: department } = await createDepartment(api); - - await poOmnichannelDepartments.search(department.name); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - - return department; + test.describe('After creation', async () => { + let department: Awaited>['data']; + test.beforeEach(async ({ api }) => { + department = await createDepartment(api).then((res) => res.data); }); - await test.step('expect update department name', async () => { - await poOmnichannelDepartments.search(department.name); - - await poOmnichannelDepartments.firstRowInTableMenu.click(); - await poOmnichannelDepartments.menuEditOption.click(); - - await poOmnichannelDepartments.inputName.fill(`edited-${department.name}`); - await poOmnichannelDepartments.btnSave.click(); - await poOmnichannelDepartments.btnCloseToastSuccess.click(); - - await poOmnichannelDepartments.search(`edited-${department.name}`); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + test.afterEach(async ({ api }) => { + await deleteDepartment(api, { id: department._id }); }); - await test.step('expect to delete department', async () => { - const deleteRes = await deleteDepartment(api, { id: department._id }); - await expect(deleteRes.status()).toBe(200); - }); - }); + test('Edit department', async ({ api }) => { + await test.step('expect create new department', async () => { + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - test('OC - Manage Departments - Archive department', async ({ api }) => { - const department = await test.step('expect create new department', async () => { - const { data: department } = await createDepartment(api); + return department; + }); - await poOmnichannelDepartments.search(department.name); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + await test.step('expect update department name', async () => { + await poOmnichannelDepartments.search(department.name); - return department; - }); + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuEditOption.click(); - await test.step('expect archive department', async () => { - await poOmnichannelDepartments.search(department.name); + await poOmnichannelDepartments.inputName.fill(`edited-${department.name}`); + await poOmnichannelDepartments.btnSave.click(); + await poOmnichannelDepartments.btnCloseToastSuccess.click(); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); - await poOmnichannelDepartments.firstRowInTableMenu.click(); - await poOmnichannelDepartments.menuArchiveOption.click(); - await expect(poOmnichannelDepartments.toastSuccess).toBeVisible(); + await poOmnichannelDepartments.search(`edited-${department.name}`); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + }); - await poOmnichannelDepartments.archivedDepartmentsTab.click(); - await poOmnichannelDepartments.search(department.name); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + await test.step('expect to delete department', async () => { + const deleteRes = await deleteDepartment(api, { id: department._id }); + await expect(deleteRes.status()).toBe(200); + }); }); - await test.step('expect archived department to not be editable', async () => { - await poOmnichannelDepartments.firstRowInTableMenu.click(); - await expect(poOmnichannelDepartments.menuEditOption).not.toBeVisible(); - }); + test('Archive department', async ({ api }) => { + await test.step('expect create new department', async () => { + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + }); - await test.step('expect unarchive department', async () => { - await poOmnichannelDepartments.menuUnarchiveOption.click(); - await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); - }); + await test.step('expect archive department', async () => { + await poOmnichannelDepartments.search(department.name); - await test.step('expect to delete department', async () => { - const deleteRes = await deleteDepartment(api, { id: department._id }); - await expect(deleteRes.status()).toBe(200); - }); - }); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuArchiveOption.click(); + await expect(poOmnichannelDepartments.toastSuccess).toBeVisible(); - test('OC - Manage Departments - Request tag(s) before closing conversation', async ({ api }) => { - const department = await test.step('expect create new department', async () => { - const { data: department } = await createDepartment(api); + await poOmnichannelDepartments.archivedDepartmentsTab.click(); + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + }); - await poOmnichannelDepartments.search(department.name); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + await test.step('expect archived department to not be editable', async () => { + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await expect(poOmnichannelDepartments.menuEditOption).not.toBeVisible(); + }); - return department; - }); + await test.step('expect unarchive department', async () => { + await poOmnichannelDepartments.menuUnarchiveOption.click(); + await expect(poOmnichannelDepartments.firstRowInTable).toHaveCount(0); + }); - await test.step('expect save form button be disabled', async () => { - await poOmnichannelDepartments.search(department.name); - await poOmnichannelDepartments.firstRowInTableMenu.click(); - await poOmnichannelDepartments.menuEditOption.click(); - await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); - await poOmnichannelDepartments.btnBack.click(); + await test.step('expect to delete department', async () => { + const deleteRes = await deleteDepartment(api, { id: department._id }); + await expect(deleteRes.status()).toBe(200); + }); }); - await test.step('Disabled tags state', async () => { - await poOmnichannelDepartments.search(department.name); - await poOmnichannelDepartments.firstRowInTableMenu.click(); - await poOmnichannelDepartments.menuEditOption.click(); - - await test.step('expect to have department tags toggle button', async () => { - await expect(poOmnichannelDepartments.toggleRequestTags).toBeVisible(); + test('Request tag(s) before closing conversation', async () => { + await test.step('expect create new department', async () => { + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); }); - await test.step('expect have no add tag to department', async () => { - await expect(poOmnichannelDepartments.inputTags).not.toBeVisible(); - await expect(poOmnichannelDepartments.btnTagsAdd).not.toBeVisible(); + await test.step('expect save form button be disabled', async () => { + await poOmnichannelDepartments.search(department.name); + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuEditOption.click(); + await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); await poOmnichannelDepartments.btnBack.click(); }); - }); - await test.step('Enabled tags state', async () => { - const tagName = faker.string.sample(5); + await test.step('Disabled tags state', async () => { + await poOmnichannelDepartments.search(department.name); + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuEditOption.click(); - await poOmnichannelDepartments.search(department.name); - await poOmnichannelDepartments.firstRowInTableMenu.click(); - await poOmnichannelDepartments.menuEditOption.click(); + await test.step('expect to have department tags toggle button', async () => { + await expect(poOmnichannelDepartments.toggleRequestTags).toBeVisible(); + }); - await test.step('expect to have form save option disabled', async () => { - await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); + await test.step('expect have no add tag to department', async () => { + await expect(poOmnichannelDepartments.inputTags).not.toBeVisible(); + await expect(poOmnichannelDepartments.btnTagsAdd).not.toBeVisible(); + await poOmnichannelDepartments.btnBack.click(); + }); }); - await test.step('expect clicking on toggle button to enable tags', async () => { - await poOmnichannelDepartments.toggleRequestTags.click(); - await expect(poOmnichannelDepartments.inputTags).toBeVisible(); - await expect(poOmnichannelDepartments.btnTagsAdd).toBeVisible(); - }); + await test.step('Enabled tags state', async () => { + const tagName = faker.string.sample(5); - await test.step('expect to have add and remove one tag properly tags', async () => { - await poOmnichannelDepartments.inputTags.fill(tagName); - await poOmnichannelDepartments.btnTagsAdd.click(); + await poOmnichannelDepartments.search(department.name); + await poOmnichannelDepartments.firstRowInTableMenu.click(); + await poOmnichannelDepartments.menuEditOption.click(); - await expect(poOmnichannelDepartments.btnTag(tagName)).toBeVisible(); - await expect(poOmnichannelDepartments.btnSave).toBeEnabled(); - }); + await test.step('expect to have form save option disabled', async () => { + await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); + }); - await test.step('expect to be invalid if there is no tag added', async () => { - await poOmnichannelDepartments.btnTag(tagName).click(); - await expect(poOmnichannelDepartments.invalidInputTags).toBeVisible(); - await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); - }); + await test.step('expect clicking on toggle button to enable tags', async () => { + await poOmnichannelDepartments.toggleRequestTags.click(); + await expect(poOmnichannelDepartments.inputTags).toBeVisible(); + await expect(poOmnichannelDepartments.btnTagsAdd).toBeVisible(); + }); - await test.step('expect to be not possible adding empty tags', async () => { - await poOmnichannelDepartments.inputTags.fill(''); - await expect(poOmnichannelDepartments.btnTagsAdd).toBeDisabled(); - }); + await test.step('expect to have add and remove one tag properly tags', async () => { + await poOmnichannelDepartments.inputTags.fill(tagName); + await poOmnichannelDepartments.btnTagsAdd.click(); - await test.step('expect to not be possible adding same tag twice', async () => { - const tagName = faker.string.sample(5); - await poOmnichannelDepartments.inputTags.fill(tagName); - await poOmnichannelDepartments.btnTagsAdd.click(); - await poOmnichannelDepartments.inputTags.fill(tagName); - await expect(poOmnichannelDepartments.btnTagsAdd).toBeDisabled(); - }); - }); - }); + await expect(poOmnichannelDepartments.btnTag(tagName)).toBeVisible(); + await expect(poOmnichannelDepartments.btnSave).toBeEnabled(); + }); - test('OC - Manage Departments - Toggle department removal', async ({ api }) => { - const department = await test.step('expect create new department', async () => { - const { data: department } = await createDepartment(api); + await test.step('expect to be invalid if there is no tag added', async () => { + await poOmnichannelDepartments.btnTag(tagName).click(); + await expect(poOmnichannelDepartments.invalidInputTags).toBeVisible(); + await expect(poOmnichannelDepartments.btnSave).toBeDisabled(); + }); - await poOmnichannelDepartments.search(department.name); - await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + await test.step('expect to be not possible adding empty tags', async () => { + await poOmnichannelDepartments.inputTags.fill(''); + await expect(poOmnichannelDepartments.btnTagsAdd).toBeDisabled(); + }); - return department; + await test.step('expect to not be possible adding same tag twice', async () => { + const tagName = faker.string.sample(5); + await poOmnichannelDepartments.inputTags.fill(tagName); + await poOmnichannelDepartments.btnTagsAdd.click(); + await poOmnichannelDepartments.inputTags.fill(tagName); + await expect(poOmnichannelDepartments.btnTagsAdd).toBeDisabled(); + }); + }); }); - await test.step('expect to be able to delete department', async () => { - await poOmnichannelDepartments.search(department.name); - await poOmnichannelDepartments.selectedDepartmentMenu(department.name).click(); - await expect(poOmnichannelDepartments.menuDeleteOption).toBeEnabled(); - }); + test('Toggle department removal', async ({ api }) => { + await test.step('expect create new department', async () => { + await poOmnichannelDepartments.search(department.name); + await expect(poOmnichannelDepartments.firstRowInTable).toBeVisible(); + }); - await test.step('expect to disable department removal setting', async () => { - const statusCode = (await api.post('/settings/Omnichannel_enable_department_removal', { value: false })).status(); - await expect(statusCode).toBe(200); - }); + await test.step('expect to be able to delete department', async () => { + await poOmnichannelDepartments.search(department.name); + await poOmnichannelDepartments.selectedDepartmentMenu(department.name).click(); + await expect(poOmnichannelDepartments.menuDeleteOption).toBeEnabled(); + }); - await test.step('expect not to be able to delete department', async () => { - await poOmnichannelDepartments.search(department.name); - await poOmnichannelDepartments.selectedDepartmentMenu(department.name).click(); - await expect(poOmnichannelDepartments.menuDeleteOption).toBeDisabled(); - }); + await test.step('expect to disable department removal setting', async () => { + const statusCode = (await api.post('/settings/Omnichannel_enable_department_removal', { value: false })).status(); + await expect(statusCode).toBe(200); + }); - await test.step('expect to enable department removal setting', async () => { - const statusCode = (await api.post('/settings/Omnichannel_enable_department_removal', { value: true })).status(); - await expect(statusCode).toBe(200); - }); + await test.step('expect not to be able to delete department', async () => { + await poOmnichannelDepartments.search(department.name); + await poOmnichannelDepartments.selectedDepartmentMenu(department.name).click(); + await expect(poOmnichannelDepartments.menuDeleteOption).toBeDisabled(); + }); - await test.step('expect to delete department', async () => { - const deleteRes = await deleteDepartment(api, { id: department._id }); - await expect(deleteRes.status()).toBe(200); + await test.step('expect to enable department removal setting', async () => { + const statusCode = (await api.post('/settings/Omnichannel_enable_department_removal', { value: true })).status(); + await expect(statusCode).toBe(200); + }); + + await test.step('expect to delete department', async () => { + const deleteRes = await deleteDepartment(api, { id: department._id }); + await expect(deleteRes.status()).toBe(200); + }); }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts index 7250fce9e24e..e529746def9e 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts @@ -1,6 +1,7 @@ -import { faker } from '@faker-js/faker'; +import { faker } from '@faker-js/faker/locale/af_ZA'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -57,6 +58,12 @@ declare const window: Window & { }; }; +const createFakeVisitorRegistration = (extra?: { department?: string }) => ({ + ...createFakeVisitor(), + token: faker.string.uuid(), + ...extra, +}); + test.describe('OC - Livechat API', () => { // TODO: Check if there is a way to add livechat to the global window object @@ -142,11 +149,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - setTheme', async () => { - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), - }; + const registerGuestVisitor = createFakeVisitorRegistration(); await test.step('Expect setTheme set color', async () => { await poLiveChat.page.evaluate(() => { @@ -229,7 +232,7 @@ test.describe('OC - Livechat API', () => { await addAgentToDepartment(api, { department: departmentA, agentId: agent.data._id }); await addAgentToDepartment(api, { department: departmentB, agentId: agent2.data._id }); - await expect((await api.post('/settings/Livechat_offline_email', { value: 'test@testing.com' })).status()).toBe(200); + expect((await api.post('/settings/Livechat_offline_email', { value: 'test@testing.com' })).status()).toBe(200); }); test.beforeEach(async ({ browser }, testInfo) => { @@ -324,12 +327,9 @@ test.describe('OC - Livechat API', () => { test('setDepartment - Called during ongoing conversation', async () => { const [departmentA, departmentB] = departments.map(({ data }) => data); - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), + const registerGuestVisitor = createFakeVisitorRegistration({ department: departmentA._id, - }; + }); // Start Chat await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); @@ -370,10 +370,7 @@ test.describe('OC - Livechat API', () => { test('setDepartment - Called before conversation', async () => { const departmentB = departments[1].data; - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + const registerGuestVisitor = createFakeVisitor(); const depId = departmentB._id; @@ -421,12 +418,9 @@ test.describe('OC - Livechat API', () => { test('transferChat - Called during ongoing conversation', async () => { const [departmentA, departmentB] = departments.map(({ data }) => data); - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), + const registerGuestVisitor = createFakeVisitorRegistration({ department: departmentA._id, - }; + }); // Start Chat await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); @@ -462,11 +456,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - registerGuest', async ({ browser }) => { - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), - }; + const registerGuestVisitor = createFakeVisitorRegistration(); await test.step('Expect registerGuest to create a valid guest', async () => { await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); @@ -510,17 +500,9 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - registerGuest different guests', async () => { - const registerGuestVisitor1 = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), - }; - - const registerGuestVisitor2 = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), - }; + const registerGuestVisitor1 = createFakeVisitorRegistration(); + + const registerGuestVisitor2 = createFakeVisitorRegistration(); await test.step('Expect registerGuest to create guest 1', async () => { await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); @@ -568,11 +550,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - registerGuest multiple times', async () => { - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), - }; + const registerGuestVisitor = createFakeVisitorRegistration(); await test.step('Expect registerGuest work with the same token, multiple times', async () => { await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); @@ -611,11 +589,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - setGuestEmail', async () => { - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), - }; + const registerGuestVisitor = createFakeVisitorRegistration(); // Start Chat await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).toBeVisible(); @@ -649,11 +623,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - setGuestName', async () => { - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), - }; + const registerGuestVisitor = createFakeVisitorRegistration(); // Start Chat await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); await expect(page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).toBeVisible(); @@ -683,11 +653,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - setGuestToken', async ({ browser }) => { - const registerGuestVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - token: faker.string.uuid(), - }; + const registerGuestVisitor = createFakeVisitorRegistration(); // Register guest and send a message await poLiveChat.page.evaluate(() => window.RocketChat.livechat.maximizeWidget()); @@ -731,7 +697,7 @@ test.describe('OC - Livechat API', () => { test.beforeAll(async ({ api }) => { agent = await createAgent(api, 'user1'); - await expect((await api.post('/settings/Livechat_offline_email', { value: 'test@testing.com' })).status()).toBe(200); + expect((await api.post('/settings/Livechat_offline_email', { value: 'test@testing.com' })).status()).toBe(200); }); test.beforeEach(async ({ browser }, testInfo) => { @@ -790,10 +756,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - onChatStarted & onChatEnded', async () => { - const newVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + const newVisitor = createFakeVisitor(); await test.step('Expect onChatStarted to trigger callback', async () => { const watchForTrigger = page.waitForFunction(() => window.onChatStarted === true); @@ -832,10 +795,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - onPrechatFormSubmit & onAssignAgent', async () => { - const newVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + const newVisitor = createFakeVisitor(); await test.step('Expect onPrechatFormSubmit to trigger callback', async () => { const watchForTrigger = page.waitForFunction(() => window.onPrechatFormSubmit === true); @@ -871,10 +831,7 @@ test.describe('OC - Livechat API', () => { // TODO: Fix this Flaky test test.skip('onAgentStatusChange', async () => { - const newVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + const newVisitor = createFakeVisitor(); await poLiveChat.openLiveChat(); await poLiveChat.sendMessage(newVisitor, false); @@ -896,10 +853,7 @@ test.describe('OC - Livechat API', () => { }); test('OC - Livechat API - onOfflineFormSubmit', async () => { - const newVisitor = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + const newVisitor = createFakeVisitor(); await poAuxContext.poHomeOmnichannel.sidenav.switchStatus('offline'); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-avatar-visibility.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-avatar-visibility.spec.ts index d2b1db457ba1..7729b5684228 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-avatar-visibility.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-avatar-visibility.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { HomeOmnichannel, OmnichannelLiveChatEmbedded } from '../page-objects'; @@ -15,11 +15,6 @@ declare const window: Window & { }; }; -const createVisitor = () => ({ - name: `${faker.person.firstName()} ${faker.string.uuid()}`, - email: faker.internet.email(), -}); - test.use({ storageState: Users.user1.state }); test.describe('OC - Livechat - Avatar visibility', async () => { @@ -49,7 +44,7 @@ test.describe('OC - Livechat - Avatar visibility', async () => { }); test.afterEach(async ({ page }) => { - await poAuxContext.page?.close(); + await poAuxContext.page.close(); await page.close(); }); @@ -58,7 +53,7 @@ test.describe('OC - Livechat - Avatar visibility', async () => { }); test('OC - Livechat - Change avatar visibility', async () => { - const visitor = createVisitor(); + const visitor = createFakeVisitor(); await test.step('should initiate Livechat conversation', async () => { await poLiveChat.openLiveChat(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-background.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-background.spec.ts index 4dd3e7e87257..b7a058e719ee 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-background.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-background.spec.ts @@ -1,5 +1,4 @@ -import { faker } from '@faker-js/faker'; - +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChatEmbedded } from '../page-objects'; @@ -14,11 +13,6 @@ declare const window: Window & { }; }; -const createVisitor = () => ({ - name: `${faker.person.firstName()} ${faker.string.uuid()}`, - email: faker.internet.email(), -}); - test.use({ storageState: Users.admin.state }); test.skip(!IS_EE, 'Enterprise Only'); @@ -52,7 +46,7 @@ test.describe('OC - Livechat - Message list background', async () => { }); test('OC - Livechat - Change message list background', async ({ api, page }) => { - const visitor = createVisitor(); + const visitor = createFakeVisitor(); await test.step('should initiate Livechat conversation', async () => { await poLiveChat.openLiveChat(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-department.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-department.spec.ts index d71467a9336c..0c72c8894cc4 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-department.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-department.spec.ts @@ -1,5 +1,4 @@ -import { faker } from '@faker-js/faker'; - +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -49,8 +48,8 @@ test.describe('OC - Livechat - Department Flow', () => { }); test.afterEach(async ({ page }) => { - await poHomeOmnichannelAgent1?.page?.close(); - await poHomeOmnichannelAgent2?.page?.close(); + await poHomeOmnichannelAgent1.page.close(); + await poHomeOmnichannelAgent2.page.close(); await page.close(); }); @@ -62,10 +61,7 @@ test.describe('OC - Livechat - Department Flow', () => { }); test('OC - Livechat - Chat with Department', async () => { - const guest = { - name: `${faker.person.firstName()} ${faker.string.nanoid(10)}}`, - email: faker.internet.email(), - }; + const guest = createFakeVisitor(); await test.step('expect start Chat with department', async () => { await poLiveChat.openAnyLiveChat(); @@ -89,10 +85,7 @@ test.describe('OC - Livechat - Department Flow', () => { }); test('OC - Livechat - Change Department', async () => { - const guest = { - name: `${faker.person.firstName()} ${faker.string.nanoid(10)}}`, - email: faker.internet.email(), - }; + const guest = createFakeVisitor(); await test.step('expect start Chat with department', async () => { await poLiveChat.openAnyLiveChat(); await poLiveChat.sendMessage(guest, false, departmentA.name); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-fileupload.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-fileupload.spec.ts index b1244e7813b7..d96aa4006bc4 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-fileupload.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-fileupload.spec.ts @@ -1,15 +1,11 @@ -import { faker } from '@faker-js/faker'; - +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { HomeOmnichannel, OmnichannelLiveChat } from '../page-objects'; import { createAgent } from '../utils/omnichannel/agents'; import { test, expect } from '../utils/test'; -const visitor = { - name: `${faker.person.firstName()} ${faker.string.uuid()}}`, - email: faker.internet.email(), -}; +const visitor = createFakeVisitor(); // Endpoint defaults are reset after each test, so if not in matrix assume is true const endpointMatrix = [ @@ -52,7 +48,7 @@ test.describe('OC - Livechat - OC - File Upload', () => { await api.post('/settings/FileUpload_Enabled', { value: true }); await api.post('/settings/Livechat_fileupload_enabled', { value: true }); - await poHomeOmnichannel.page?.close(); + await poHomeOmnichannel.page.close(); await agent.delete(); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-logo.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-logo.spec.ts index c7e70a827982..51f59b5af287 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-logo.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-logo.spec.ts @@ -18,6 +18,10 @@ test.describe('OC - Livechat - Widget logo', async () => { poLiveChat = new OmnichannelLiveChat(livechatPage, api); }); + test.afterEach(async () => { + await poLiveChat.page.close(); + }); + test.beforeEach(async ({ page }) => { poOmnichannelSettings = new OmnichannelSettings(page); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-message-bubble-color.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-message-bubble-color.spec.ts index bc167a299494..70d0441db5e1 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-message-bubble-color.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-message-bubble-color.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { HomeOmnichannel, OmnichannelLiveChatEmbedded } from '../page-objects'; @@ -15,11 +15,6 @@ declare const window: Window & { }; }; -const createVisitor = () => ({ - name: `${faker.person.firstName()} ${faker.string.uuid()}`, - email: faker.internet.email(), -}); - test.use({ storageState: Users.user1.state }); test.describe('OC - Livechat - Bubble background color', async () => { @@ -58,7 +53,7 @@ test.describe('OC - Livechat - Bubble background color', async () => { }); test('OC - Livechat - Change bubble background color', async () => { - const visitor = createVisitor(); + const visitor = createFakeVisitor(); await test.step('should initiate Livechat conversation', async () => { await poLiveChat.openLiveChat(); @@ -74,8 +69,8 @@ test.describe('OC - Livechat - Bubble background color', async () => { }); await test.step('expect to have default bubble background color', async () => { - await expect(await poLiveChat.messageBubbleBackground('message_from_user')).toBe('rgb(193, 39, 45)'); - await expect(await poLiveChat.messageBubbleBackground('message_from_agent')).toBe('rgb(247, 248, 250)'); + expect(await poLiveChat.messageBubbleBackground('message_from_user')).toBe('rgb(193, 39, 45)'); + expect(await poLiveChat.messageBubbleBackground('message_from_agent')).toBe('rgb(247, 248, 250)'); }); await test.step('expect to change bubble background color', async () => { @@ -86,8 +81,8 @@ test.describe('OC - Livechat - Bubble background color', async () => { }), ); - await expect(await poLiveChat.messageBubbleBackground('message_from_user')).toBe('rgb(186, 218, 85)'); - await expect(await poLiveChat.messageBubbleBackground('message_from_agent')).toBe('rgb(0, 100, 250)'); + expect(await poLiveChat.messageBubbleBackground('message_from_user')).toBe('rgb(186, 218, 85)'); + expect(await poLiveChat.messageBubbleBackground('message_from_agent')).toBe('rgb(0, 100, 250)'); }); await test.step('expect to reset bubble background color to defaults', async () => { @@ -95,8 +90,8 @@ test.describe('OC - Livechat - Bubble background color', async () => { window.RocketChat.livechat.setTheme({ guestBubbleBackgroundColor: undefined, agentBubbleBackgroundColor: undefined }), ); - await expect(await poLiveChat.messageBubbleBackground('message_from_user')).toBe('rgb(193, 39, 45)'); - await expect(await poLiveChat.messageBubbleBackground('message_from_agent')).toBe('rgb(247, 248, 250)'); + expect(await poLiveChat.messageBubbleBackground('message_from_user')).toBe('rgb(193, 39, 45)'); + expect(await poLiveChat.messageBubbleBackground('message_from_agent')).toBe('rgb(247, 248, 250)'); }); await test.step('should close the conversation', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-tab-communication.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-tab-communication.spec.ts index 60e2e193262b..59d42dfe1e10 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-tab-communication.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-tab-communication.spec.ts @@ -1,5 +1,4 @@ -import { faker } from '@faker-js/faker'; - +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { HomeOmnichannel, OmnichannelLiveChat } from '../page-objects'; @@ -32,23 +31,23 @@ test.describe('OC - Livechat - Cross Tab Communication', () => { await pageLivechat2.page.goto('/livechat'); }); - test.afterAll(async () => { - await poHomeOmnichannel.page?.close(); - await agent.delete(); + test.afterEach(async () => { await pageLivechat1.page.close(); await pageLivechat2.page.close(); }); + test.afterAll(async () => { + await poHomeOmnichannel.page.close(); + await agent.delete(); + }); + test('OC - Livechat - Send messages, close chat and start again 2 tabs', async () => { - const firstUser = { - name: `${faker.person.firstName()} ${faker.string.uuid()}}`, - email: faker.internet.email(), - }; + const visitor = createFakeVisitor(); await test.step('expect livechat conversations to be synced', async () => { await pageLivechat1.openAnyLiveChat(); - await pageLivechat1.sendMessage(firstUser, false); + await pageLivechat1.sendMessage(visitor, false); await pageLivechat1.onlineAgentMessage.fill('this_a_test_message_from_user'); await pageLivechat1.btnSendMessageToOnlineAgent.click(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-watermark.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-watermark.spec.ts index d0dd0c76f297..09883da3c16b 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-watermark.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-watermark.spec.ts @@ -1,5 +1,4 @@ -import { faker } from '@faker-js/faker'; - +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -7,10 +6,7 @@ import { OmnichannelLiveChat, OmnichannelSettings } from '../page-objects'; import { createAgent, makeAgentAvailable } from '../utils/omnichannel/agents'; import { test, expect } from '../utils/test'; -const visitor = { - name: `${faker.person.firstName()} ${faker.string.uuid()}}`, - email: faker.internet.email(), -}; +const visitor = createFakeVisitor(); test.skip(!IS_EE, 'Enterprise Only'); @@ -35,6 +31,10 @@ test.describe('OC - Livechat - Hide watermark', async () => { poLiveChat = new OmnichannelLiveChat(livechatPage, api); }); + test.afterEach(async () => { + await poLiveChat.page.close(); + }); + test.beforeEach(async ({ page }) => { poOmnichannelSettings = new OmnichannelSettings(page); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts index 24110a15eb25..bf14584ed89f 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts @@ -1,20 +1,13 @@ -import { faker } from '@faker-js/faker'; - +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { HomeOmnichannel, OmnichannelLiveChat } from '../page-objects'; import { createAgent } from '../utils/omnichannel/agents'; import { test, expect } from '../utils/test'; -const firstUser = { - name: `${faker.person.firstName()} ${faker.string.uuid()}}`, - email: faker.internet.email(), -}; +const firstVisitor = createFakeVisitor(); -const secondUser = { - name: `${faker.person.firstName()} ${faker.string.uuid()}}`, - email: faker.internet.email(), -}; +const secondVisitor = createFakeVisitor(); test.use({ storageState: Users.user1.state }); @@ -24,7 +17,7 @@ test.describe.serial('OC - Livechat', () => { test.beforeAll(async ({ api }) => { const statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); }); test.beforeAll(async ({ browser, api }) => { @@ -49,7 +42,7 @@ test.describe.serial('OC - Livechat', () => { await test.step('expect message to be sent by livechat', async () => { await poLiveChat.page.reload(); await poLiveChat.openAnyLiveChat(); - await poLiveChat.sendMessage(firstUser, false); + await poLiveChat.sendMessage(firstVisitor, false); await poLiveChat.onlineAgentMessage.fill('this_a_test_message_from_user'); await poLiveChat.btnSendMessageToOnlineAgent.click(); @@ -58,14 +51,14 @@ test.describe.serial('OC - Livechat', () => { }); await test.step('expect message to be received by agent', async () => { - await poHomeOmnichannel.sidenav.openChat(firstUser.name); + await poHomeOmnichannel.sidenav.openChat(firstVisitor.name); await expect(poHomeOmnichannel.content.lastUserMessage).toBeVisible(); await expect(poHomeOmnichannel.content.lastUserMessage).toContainText('this_a_test_message_from_user'); }); }); test('OC - Livechat - Send message to livechat costumer', async () => { - await poHomeOmnichannel.sidenav.openChat(firstUser.name); + await poHomeOmnichannel.sidenav.openChat(firstVisitor.name); await test.step('expect message to be sent by agent', async () => { await poHomeOmnichannel.content.sendMessage('this_a_test_message_from_agent'); @@ -89,7 +82,7 @@ test.describe.serial('OC - Livechat', () => { }); test('OC - Livechat - Close livechat conversation', async () => { - await poHomeOmnichannel.sidenav.openChat(firstUser.name); + await poHomeOmnichannel.sidenav.openChat(firstVisitor.name); await test.step('expect livechat conversation to be closed by agent', async () => { await poHomeOmnichannel.content.btnCloseChat.click(); @@ -106,7 +99,7 @@ test.describe.serial('OC - Livechat - Resub after close room', () => { test.beforeAll(async ({ api }) => { const statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); }); test.beforeAll(async ({ browser, api }) => { @@ -117,7 +110,7 @@ test.describe.serial('OC - Livechat - Resub after close room', () => { const { page: livechatPage } = await createAuxContext(browser, Users.user1, '/livechat', false); poLiveChat = new OmnichannelLiveChat(livechatPage, api); - await poLiveChat.sendMessageAndCloseChat(firstUser); + await poLiveChat.sendMessageAndCloseChat(firstVisitor); }); test.afterAll(async ({ api }) => { @@ -130,14 +123,14 @@ test.describe.serial('OC - Livechat - Resub after close room', () => { test('OC - Livechat - Resub after close room', async () => { await test.step('expect livechat conversation to be opened again, different guest', async () => { await poLiveChat.startNewChat(); - await poLiveChat.sendMessage(secondUser, false); + await poLiveChat.sendMessage(secondVisitor, false); await poLiveChat.onlineAgentMessage.fill('this_a_test_message_from_user'); await poLiveChat.btnSendMessageToOnlineAgent.click(); await expect(poLiveChat.page.locator('div >> text="this_a_test_message_from_user"')).toBeVisible(); }); await test.step('expect message to be received by agent', async () => { - await poHomeOmnichannel.sidenav.openChat(secondUser.name); + await poHomeOmnichannel.sidenav.openChat(secondVisitor.name); await expect(poHomeOmnichannel.content.lastUserMessage).toBeVisible(); await expect(poHomeOmnichannel.content.lastUserMessage).toContainText('this_a_test_message_from_user'); }); @@ -155,7 +148,7 @@ test.describe('OC - Livechat - Resume chat after closing', () => { test.beforeAll(async ({ api }) => { const statusCode = (await api.post('/livechat/users/agent', { username: 'user1' })).status(); - await expect(statusCode).toBe(200); + expect(statusCode).toBe(200); }); test.beforeAll(async ({ browser, api }) => { @@ -165,7 +158,7 @@ test.describe('OC - Livechat - Resume chat after closing', () => { const { page: livechatPage } = await createAuxContext(browser, Users.user1, '/livechat', false); poLiveChat = new OmnichannelLiveChat(livechatPage, api); - await poLiveChat.sendMessageAndCloseChat(firstUser); + await poLiveChat.sendMessageAndCloseChat(firstVisitor); }); test.afterAll(async ({ api }) => { @@ -184,7 +177,7 @@ test.describe('OC - Livechat - Resume chat after closing', () => { }); await test.step('expect message to be received by agent', async () => { - await poHomeOmnichannel.sidenav.openChat(firstUser.name); + await poHomeOmnichannel.sidenav.openChat(firstVisitor.name); await expect(poHomeOmnichannel.content.lastUserMessage).toBeVisible(); await expect(poHomeOmnichannel.content.lastUserMessage).toContainText('this_a_test_message_from_user'); }); @@ -221,7 +214,7 @@ test.describe('OC - Livechat - Close chat using widget', () => { test('OC - Livechat - Close Chat', async () => { await poLiveChat.openAnyLiveChat(); - await poLiveChat.sendMessage(firstUser, false); + await poLiveChat.sendMessage(firstVisitor, false); await poLiveChat.onlineAgentMessage.fill('this_a_test_message_from_user'); await poLiveChat.btnSendMessageToOnlineAgent.click(); @@ -239,7 +232,7 @@ test.describe('OC - Livechat - Close chat using widget', () => { }); test('OC - Livechat - Close Chat twice', async () => { - await poLiveChat.sendMessageAndCloseChat(firstUser); + await poLiveChat.sendMessageAndCloseChat(firstVisitor); await poLiveChat.startNewChat(); await poLiveChat.onlineAgentMessage.fill('this_a_test_message_from_user'); await poLiveChat.btnSendMessageToOnlineAgent.click(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts index 8a4e74c1661a..ff7245e0b532 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts @@ -39,10 +39,12 @@ test.describe('OC - Manual Selection', () => { agentB = await createAuxContext(browser, Users.user1).then(({ page }) => ({ page, poHomeOmnichannel: new HomeOmnichannel(page) })); }); + test.afterEach(async () => { + await agentB.page.close(); + }); // Delete all data test.afterAll(async ({ api }) => { await Promise.all([ - agentB.page.close(), ...agents.map((agent) => agent.delete()), api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }), ]); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts index 31add936d346..10fe89818fe2 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts @@ -1,5 +1,4 @@ -import { faker } from '@faker-js/faker'; - +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; import { HomeOmnichannel } from '../page-objects'; @@ -7,10 +6,7 @@ import { OmnichannelRoomInfo } from '../page-objects/omnichannel-room-info'; import { createConversation } from '../utils/omnichannel/rooms'; import { test, expect } from '../utils/test'; -const NEW_USER = { - name: faker.person.firstName(), - email: faker.internet.email(), -}; +const visitor = createFakeVisitor(); const getPrioritySystemMessage = (username: string, priority: string) => `Priority changed: ${username} changed the priority to ${priority}`; @@ -44,7 +40,7 @@ test.describe.serial('OC - Priorities [Sidebar]', () => { }); test.beforeEach(async ({ api }) => { - await createConversation(api, { visitorName: NEW_USER.name }); + await createConversation(api, { visitorName: visitor.name }); }); test.afterAll(async ({ api }) => { @@ -62,21 +58,21 @@ test.describe.serial('OC - Priorities [Sidebar]', () => { await page.emulateMedia({ reducedMotion: 'reduce' }); await test.step('expect to change inquiry priority using sidebar menu', async () => { - await poHomeChannel.sidenav.getSidebarItemByName(NEW_USER.name).click(); + await poHomeChannel.sidenav.getSidebarItemByName(visitor.name).click(); await expect(poHomeChannel.content.btnTakeChat).toBeVisible(); await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); - await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Lowest'); + await poHomeChannel.sidenav.selectPriority(visitor.name, 'Lowest'); await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Lowest')}"`).waitFor(); await expect(poRoomInfo.getLabel('Priority')).toBeVisible(); await expect(poRoomInfo.getInfo('Lowest')).toBeVisible(); - await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Highest'); + await poHomeChannel.sidenav.selectPriority(visitor.name, 'Highest'); await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Highest')}"`).waitFor(); await expect(poRoomInfo.getInfo('Highest')).toBeVisible(); - await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Unprioritized'); + await poHomeChannel.sidenav.selectPriority(visitor.name, 'Unprioritized'); await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Unprioritized')}"`).waitFor(); await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); await expect(poRoomInfo.getInfo('Unprioritized')).not.toBeVisible(); @@ -89,16 +85,16 @@ test.describe.serial('OC - Priorities [Sidebar]', () => { await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); - await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Lowest'); + await poHomeChannel.sidenav.selectPriority(visitor.name, 'Lowest'); await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Lowest')}"`).waitFor(); await expect(poRoomInfo.getLabel('Priority')).toBeVisible(); await expect(poRoomInfo.getInfo('Lowest')).toBeVisible(); - await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Highest'); + await poHomeChannel.sidenav.selectPriority(visitor.name, 'Highest'); await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Highest')}"`).waitFor(); await expect(poRoomInfo.getInfo('Highest')).toBeVisible(); - await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Unprioritized'); + await poHomeChannel.sidenav.selectPriority(visitor.name, 'Unprioritized'); await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Unprioritized')}"`).waitFor(); await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); await expect(poRoomInfo.getInfo('Unprioritized')).not.toBeVisible(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts index b1f64b17b94c..75c06efc7507 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -11,14 +11,11 @@ test.skip(!IS_EE, 'Export transcript as PDF > Enterprie Only'); test.describe('omnichannel- export chat transcript as PDF', () => { let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeChannel: HomeOmnichannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); // Set user user 1 as manager and agent await api.post('/livechat/users/agent', { username: 'user1' }); @@ -41,14 +38,14 @@ test.describe('omnichannel- export chat transcript as PDF', () => { await test.step('Expect send a message as a visitor', async () => { await page.goto('/livechat'); await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); await poLiveChat.btnSendMessageToOnlineAgent.click(); }); await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { await new Promise((resolve) => setTimeout(resolve, 5000)); - await agent.poHomeChannel.sidenav.openChat(newUser.name); + await agent.poHomeChannel.sidenav.openChat(newVisitor.name); }); await test.step('Expect to be not able send transcript as PDF', async () => { @@ -76,7 +73,7 @@ test.describe('omnichannel- export chat transcript as PDF', () => { await test.step('Expect to have exported PDF in rocket.cat', async () => { await agent.poHomeChannel.transcript.contactCenter.click(); await agent.poHomeChannel.transcript.contactCenterChats.click(); - await agent.poHomeChannel.transcript.contactCenterSearch.type(newUser.name); + await agent.poHomeChannel.transcript.contactCenterSearch.type(newVisitor.name); await page.waitForTimeout(3000); await agent.poHomeChannel.transcript.firstRow.click(); await agent.poHomeChannel.transcript.btnOpenChat.click(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-send-transcript.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-send-transcript.spec.ts index 032be52d1472..bc19259bfe1f 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-send-transcript.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-send-transcript.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -9,14 +9,11 @@ import { test, expect } from '../utils/test'; test.describe('omnichannel-transcript', () => { let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeChannel: HomeChannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); // Set user user 1 as manager and agent await api.post('/livechat/users/agent', { username: 'user1' }); @@ -39,13 +36,13 @@ test.describe('omnichannel-transcript', () => { await test.step('Expect send a message as a visitor', async () => { await page.goto('/livechat'); await poLiveChat.openLiveChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); await poLiveChat.btnSendMessageToOnlineAgent.click(); }); await test.step('Expect to have 1 omnichannel assigned to agent 1', async () => { - await agent.poHomeChannel.sidenav.openChat(newUser.name); + await agent.poHomeChannel.sidenav.openChat(newVisitor.name); }); await test.step('Expect to be able to send transcript to email', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-tags.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-tags.spec.ts index f14cf6c37445..7b74b3d7cd87 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-tags.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-tags.spec.ts @@ -31,6 +31,7 @@ test.describe('OC - Manage Tags', () => { test.afterAll(async () => { await department.delete(); + await department2.delete(); await agent.delete(); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-takeChat.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-takeChat.spec.ts index f7cacd5805d7..92a06ffb061a 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-takeChat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-takeChat.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; @@ -34,22 +34,18 @@ test.describe('omnichannel-takeChat', () => { await agent.poHomeChannel.sidenav.switchOmnichannelStatus('online'); await agent.poHomeChannel.sidenav.switchStatus('online'); + await agent.page.close(); await Promise.all([ - await api.delete('/livechat/users/agent/user1').then((res) => expect(res.status()).toBe(200)), - await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }).then((res) => expect(res.status()).toBe(200)), - await api.post('/settings/Livechat_enabled_when_agent_idle', { value: true }).then((res) => expect(res.status()).toBe(200)), + await api.delete('/livechat/users/agent/user1'), + await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }), + await api.post('/settings/Livechat_enabled_when_agent_idle', { value: true }), ]); - - await agent.page.close(); }); test.beforeEach('start a new livechat chat', async ({ page, api }) => { await agent.poHomeChannel.sidenav.switchStatus('online'); - newVisitor = { - name: `${faker.person.firstName()} ${faker.string.uuid()}`, - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); poLiveChat = new OmnichannelLiveChat(page, api); @@ -68,8 +64,6 @@ test.describe('omnichannel-takeChat', () => { await expect(agent.poHomeChannel.content.btnTakeChat).not.toBeVisible(); await expect(agent.poHomeChannel.content.inputMessage).toBeVisible(); - - await poLiveChat.closeChat(); }); test('When agent is offline should not take the chat', async () => { diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts index 272cde5c2c49..5be6c4181460 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-transfer-to-another-agents.spec.ts @@ -45,19 +45,19 @@ test.describe('OC - Chat transfers [Agent role]', () => { }); // Make "user-1" online & "user-2" offline so that chat can be automatically routed to "user-1" - test.beforeEach(async () => { + test.beforeAll(async () => { const [agentA, agentB] = sessions; await agentA.poHomeOmnichannel.sidenav.switchStatus('online'); await agentB.poHomeOmnichannel.sidenav.switchStatus('offline'); }); // Close sessions - test.afterEach(async () => { + test.afterAll(async () => { await Promise.all(sessions.map(({ page }) => page.close())); }); // Start a new chat for each test - test.beforeEach(async ({ api }) => { + test.beforeAll(async ({ api }) => { conversations = [await createConversation(api)]; }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-after-registration.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-after-registration.spec.ts index 70d224223744..75d104cf02dc 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-after-registration.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-after-registration.spec.ts @@ -1,6 +1,7 @@ import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; @@ -10,34 +11,46 @@ test.describe('OC - Livechat New Chat Triggers - After Registration', () => { let triggersName: string; let triggerMessage: string; let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel }; - test.beforeEach(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + test.beforeEach(async ({ api, browser, page }) => { + newVisitor = createFakeVisitor(); triggersName = faker.string.uuid(); triggerMessage = 'This is a trigger message after guest registration'; - const requests = await Promise.all([ + await api.post('/livechat/triggers', { + name: triggersName, + description: 'Creating a fresh trigger', + enabled: true, + runOnce: false, + conditions: [ + { + name: 'after-guest-registration', + value: '', + }, + ], + actions: [ + { + name: 'send-message', + params: { + name: '', + msg: triggerMessage, + sender: 'queue', + }, + }, + ], + }); + + await Promise.all([ api.post('/livechat/users/agent', { username: 'user1' }), api.post('/livechat/users/manager', { username: 'user1' }), ]); - requests.every((e) => expect(e.status()).toBe(200)); - - const { page } = await createAuxContext(browser, Users.user1, '/omnichannel/triggers'); - agent = { page, poHomeOmnichannel: new HomeOmnichannel(page) }; - await page.emulateMedia({ reducedMotion: 'reduce' }); + const { page: agentPage } = await createAuxContext(browser, Users.user1); + agent = { page: agentPage, poHomeOmnichannel: new HomeOmnichannel(agentPage) }; - await agent.poHomeOmnichannel.triggers.createTrigger(triggersName, triggerMessage, 'after-guest-registration'); - await agent.poHomeOmnichannel.triggers.btnCloseToastMessage.click(); - - const { page: livechatPage } = await createAuxContext(browser, Users.user1); - - poLiveChat = new OmnichannelLiveChat(livechatPage, api); + poLiveChat = new OmnichannelLiveChat(page, api); }); test.afterEach(async ({ api }) => { @@ -47,19 +60,19 @@ test.describe('OC - Livechat New Chat Triggers - After Registration', () => { await Promise.all(ids.map((id) => api.delete(`/livechat/triggers/${id}`))); - await Promise.all([ - api.delete('/livechat/users/agent/user1'), - api.delete('/livechat/users/manager/user1'), - api.post('/settings/Livechat_clear_local_storage_when_chat_ended', { value: false }), - ]); + await Promise.all([api.delete('/livechat/users/agent/user1'), api.delete('/livechat/users/manager/user1')]); + await agent.page.close(); - await poLiveChat.page.close(); + }); + + test.afterAll(async ({ api }) => { + await api.post('/settings/Livechat_clear_local_storage_when_chat_ended', { value: false }); }); test.describe('OC - Livechat New Chat Triggers - After Registration', async () => { - await test('expect trigger message after registration', async () => { + test('expect trigger message after registration', async () => { await poLiveChat.page.goto('/livechat'); - await poLiveChat.sendMessageAndCloseChat(newUser); + await poLiveChat.sendMessageAndCloseChat(newVisitor); await poLiveChat.startNewChat(); await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); @@ -71,7 +84,7 @@ test.describe('OC - Livechat New Chat Triggers - After Registration', () => { await test.step('expect trigger message after registration to be visible', async () => { await poLiveChat.page.goto('/livechat'); await poLiveChat.openAnyLiveChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); }); @@ -104,14 +117,15 @@ test.describe('OC - Livechat New Chat Triggers - After Registration', () => { await api.post('/settings/Livechat_clear_local_storage_when_chat_ended', { value: true }); }); - await test('expect trigger message after registration', async () => { + test('expect trigger message after registration not be visible after local storage clear', async () => { await poLiveChat.page.goto('/livechat'); - await poLiveChat.sendMessageAndCloseChat(newUser); + await poLiveChat.sendMessageAndCloseChat(newVisitor); - await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); + await expect(poLiveChat.btnNewChat).toBeVisible(); + await expect(poLiveChat.txtChatMessage(triggerMessage)).not.toBeVisible(); await poLiveChat.startNewChat(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-open-by-visitor.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-open-by-visitor.spec.ts index a61508599e80..1045036a926c 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-open-by-visitor.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-open-by-visitor.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; @@ -9,14 +9,11 @@ import { test, expect } from '../utils/test'; test.use({ storageState: Users.admin.state }); test.describe('OC - Livechat Triggers - Open by Visitor', () => { let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); const requests = await Promise.all([ api.post('/livechat/users/agent', { username: 'user1' }), @@ -81,7 +78,7 @@ test.describe('OC - Livechat Triggers - Open by Visitor', () => { await expect(poLiveChat.txtChatMessage('This is a trigger message open by visitor')).toBeVisible(); await poLiveChat.btnChatNow.click(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await poLiveChat.onlineAgentMessage.type('this_a_test_message_from_visitor'); await poLiveChat.btnSendMessageToOnlineAgent.click(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-setDepartment.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-setDepartment.spec.ts new file mode 100644 index 000000000000..0c6415dd058e --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-setDepartment.spec.ts @@ -0,0 +1,127 @@ +import { IS_EE } from '../config/constants'; +import { createAuxContext } from '../fixtures/createAuxContext'; +import { Users } from '../fixtures/userStates'; +import { HomeOmnichannel, OmnichannelLiveChatEmbedded } from '../page-objects'; +import { createAgent } from '../utils/omnichannel/agents'; +import { addAgentToDepartment, createDepartment } from '../utils/omnichannel/departments'; +import { test, expect } from '../utils/test'; + +declare const window: Window & { + RocketChat: { livechat: { setDepartment: (dep: string) => void; maximizeWidget: () => void } }; +}; + +test.use({ storageState: Users.admin.state }); +test.describe('OC - Livechat Triggers - SetDepartment', () => { + test.skip(!IS_EE, 'Enterprise Only'); + let poLiveChat: OmnichannelLiveChatEmbedded; + let departments: Awaited>[]; + let departmentA: Awaited>['data']; + let departmentB: Awaited>['data']; + let agents: Awaited>[]; + let agent1: Awaited>['data']; + let agent2: Awaited>['data']; + let poHomeOmnichannelAgent1: HomeOmnichannel; + let poHomeOmnichannelAgent2: HomeOmnichannel; + + test.beforeAll(async ({ api }) => { + // Assign agents & departments + agents = await Promise.all([createAgent(api, 'user1'), createAgent(api, 'user2')]); + [agent1, agent2] = agents.map(({ data }) => data); + departments = await Promise.all([ + createDepartment(api, { showOnRegistration: true }), + createDepartment(api, { showOnRegistration: true }), + ]); + + [departmentA, departmentB] = departments.map(({ data }) => data); + + await Promise.all([ + addAgentToDepartment(api, { department: departmentA, agentId: agent1._id }), + addAgentToDepartment(api, { department: departmentB, agentId: agent2._id }), + api.post( + '/livechat/triggers', + + { + name: 'open', + description: '', + enabled: true, + runOnce: false, + conditions: [ + { + name: 'chat-opened-by-visitor', + value: '', + }, + ], + actions: [ + { + name: 'send-message', + params: { + name: '', + msg: 'This is a trigger message open by visitor', + sender: 'queue', + }, + }, + ], + }, + ), + ]); + }); + + test.beforeEach(async ({ browser, page }) => { + const { page: agent1Page } = await createAuxContext(browser, Users.user1, '/', true); + poHomeOmnichannelAgent1 = new HomeOmnichannel(agent1Page); + const { page: agent2Page } = await createAuxContext(browser, Users.user2, '/', true); + poHomeOmnichannelAgent2 = new HomeOmnichannel(agent2Page); + + poLiveChat = new OmnichannelLiveChatEmbedded(page); + }); + + test.afterEach(async ({ page }) => { + await poHomeOmnichannelAgent1.page.close(); + await poHomeOmnichannelAgent2.page.close(); + await poLiveChat.page.close(); + await page.close(); + }); + + test.afterAll(async ({ api }) => { + const ids = (await (await api.get('/livechat/triggers')).json()).triggers.map( + (trigger: { _id: string }) => trigger._id, + ) as unknown as string[]; + + await Promise.all(ids.map((id) => api.delete(`/livechat/triggers/${id}`))); + expect((await api.post('/settings/Omnichannel_enable_department_removal', { value: true })).status()).toBe(200); + await Promise.all([...agents.map((agent) => agent.delete())]); + await Promise.all([...departments.map((department) => department.delete())]); + expect((await api.post('/settings/Omnichannel_enable_department_removal', { value: false })).status()).toBe(200); + await api.post('/settings/Livechat_registration_form', { value: true }); + }); + + test('OC - Livechat Triggers - setDepartment should affect agent.next call', async () => { + await poLiveChat.page.goto('/packages/rocketchat_livechat/assets/demo.html'); + + const depId = departmentB._id; + + await poLiveChat.page.evaluate((depId) => window.RocketChat.livechat.setDepartment(depId), depId); + + await poLiveChat.openLiveChat(); + + await expect(poLiveChat.txtChatMessage('This is a trigger message open by visitor')).toBeVisible(); + + await expect(poLiveChat.headerTitle).toContainText(agent2.username); + }); + + test('OC - Livechat Triggers - setDepartment should affect agent.next call - Register Form Disabled', async ({ api }) => { + await api.post('/settings/Livechat_registration_form', { value: false }); + + await poLiveChat.page.goto('/packages/rocketchat_livechat/assets/demo.html'); + + const depId = departmentB._id; + + await poLiveChat.page.evaluate((depId) => window.RocketChat.livechat.setDepartment(depId), depId); + + await poLiveChat.openLiveChat(); + + await expect(poLiveChat.txtChatMessage('This is a trigger message open by visitor')).toBeVisible(); + + await expect(poLiveChat.headerTitle).toContainText(agent2.username); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-time-on-site.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-time-on-site.spec.ts index f52e1ca13709..66bf1058ebfa 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-time-on-site.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-time-on-site.spec.ts @@ -1,6 +1,6 @@ -import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; @@ -9,14 +9,11 @@ import { test, expect } from '../utils/test'; test.use({ storageState: Users.admin.state }); test.describe('OC - Livechat Triggers - Time on site', () => { let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); const requests = await Promise.all([ api.post('/livechat/users/agent', { username: 'user1' }), @@ -77,7 +74,7 @@ test.describe('OC - Livechat Triggers - Time on site', () => { await poLiveChat.btnOpenOnlineLiveChat('Start chat').click(); await poLiveChat.btnOpenOnlineLiveChat('Chat now').click(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); await test.step('expect to not have any trigger message after registration', async () => { await expect(poLiveChat.txtChatMessage('This is a trigger message time on site')).not.toBeVisible(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts index 78d41c7dfd6b..8add05c7c1e6 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers.spec.ts @@ -1,6 +1,7 @@ import { faker } from '@faker-js/faker'; import type { Page } from '@playwright/test'; +import { createFakeVisitor } from '../../mocks/data'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; import { OmnichannelLiveChat, HomeOmnichannel } from '../page-objects'; @@ -10,14 +11,11 @@ test.describe.serial('OC - Livechat Triggers', () => { let triggersName: string; let triggerMessage: string; let poLiveChat: OmnichannelLiveChat; - let newUser: { email: string; name: string }; + let newVisitor: { email: string; name: string }; let agent: { page: Page; poHomeOmnichannel: HomeOmnichannel }; test.beforeAll(async ({ api, browser }) => { - newUser = { - name: faker.person.firstName(), - email: faker.internet.email(), - }; + newVisitor = createFakeVisitor(); triggersName = faker.string.uuid(); triggerMessage = 'This is a trigger message'; const requests = await Promise.all([ @@ -57,7 +55,7 @@ test.describe.serial('OC - Livechat Triggers', () => { await test.step('expect to register visitor', async () => { await expect(poLiveChat.btnChatNow).not.toBeVisible(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); }); await test.step('expect send a message as a visitor', async () => { @@ -99,7 +97,7 @@ test.describe.serial('OC - Livechat Triggers', () => { await test.step('expect to register visitor', async () => { await poLiveChat.btnChatNow.click(); - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); }); await test.step('expect trigger message after registration', async () => { @@ -139,7 +137,7 @@ test.describe.serial('OC - Livechat Triggers', () => { }); await test.step('expect to register visitor', async () => { - await poLiveChat.sendMessage(newUser, false); + await poLiveChat.sendMessage(newVisitor, false); }); await test.step('expect trigger message after registration', async () => { diff --git a/apps/meteor/tests/e2e/page-objects/auth.ts b/apps/meteor/tests/e2e/page-objects/auth.ts index 46ec7e1f38dc..8d5fe1edad20 100644 --- a/apps/meteor/tests/e2e/page-objects/auth.ts +++ b/apps/meteor/tests/e2e/page-objects/auth.ts @@ -20,7 +20,7 @@ export class Registration { } get btnLoginWithSaml(): Locator { - return this.page.locator('role=button[name="SAML test login button"]'); + return this.page.locator('role=button[name="SAML"]'); } get btnLoginWithGoogle(): Locator { 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 f5eededc0f49..bb25d149a009 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts @@ -82,7 +82,7 @@ export class HomeContent { async sendMessage(text: string): Promise { await this.joinRoomIfNeeded(); await this.page.waitForSelector('[name="msg"]:not([disabled])'); - await this.page.locator('[name="msg"]').type(text); + await this.page.locator('[name="msg"]').fill(text); await this.page.keyboard.press('Enter'); } @@ -90,7 +90,7 @@ export class HomeContent { await this.joinRoomIfNeeded(); await this.page.waitForSelector('[name="msg"]:not([disabled])'); await this.page.locator('[name="msg"]').fill(''); - await this.page.locator('[name="msg"]').type(text); + await this.page.locator('[name="msg"]').fill(text); await this.page.keyboard.press('Enter'); await this.page.keyboard.press('Enter'); } diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts index 0a612aa12785..a76d89a9d962 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts @@ -11,8 +11,12 @@ export class HomeFlextabRoom { return this.page.locator('role=button[name="Edit"]'); } - get btnDelete(): Locator { - return this.page.locator('role=button[name="Delete"]'); + get btnMore(): Locator { + return this.page.locator('role=button[name="More"]'); + } + + get optionDelete(): Locator { + return this.page.locator('label[data-key="delete"]'); } get inputName(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts index c0cb13a3b5b4..0f17b7ccb5d4 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts @@ -9,6 +9,10 @@ export class HomeSidenav { this.page = page; } + get advancedSettingsAccordion(): Locator { + return this.page.getByRole('dialog').getByRole('button', { name: 'Advanced settings', exact: true }); + } + get checkboxPrivateChannel(): Locator { return this.page.locator('label', { has: this.page.getByRole('checkbox', { name: 'Private' }) }); } @@ -114,8 +118,8 @@ export class HomeSidenav { async waitForChannel(): Promise { await this.page.locator('role=main').waitFor(); await this.page.locator('role=main >> role=heading[level=1]').waitFor(); + await this.page.locator('role=main >> role=list').waitFor(); - await expect(this.page.locator('role=main >> .rcx-skeleton')).toHaveCount(0); await expect(this.page.locator('role=main >> role=list')).not.toHaveAttribute('aria-busy', 'true'); } @@ -154,6 +158,7 @@ export class HomeSidenav { async createEncryptedChannel(name: string) { await this.openNewByLabel('Channel'); await this.inputChannelName.type(name); + await this.advancedSettingsAccordion.click(); await this.checkboxEncryption.click(); await this.btnCreate.click(); } diff --git a/apps/meteor/tests/e2e/page-objects/home-channel.ts b/apps/meteor/tests/e2e/page-objects/home-channel.ts index a5c9fa478c6c..7b3c0d093ddc 100644 --- a/apps/meteor/tests/e2e/page-objects/home-channel.ts +++ b/apps/meteor/tests/e2e/page-objects/home-channel.ts @@ -4,7 +4,7 @@ import { expect } from '../utils/test'; import { HomeContent, HomeSidenav, HomeFlextab } from './fragments'; export class HomeChannel { - private readonly page: Page; + public readonly page: Page; readonly content: HomeContent; diff --git a/apps/meteor/tests/e2e/page-objects/modal.ts b/apps/meteor/tests/e2e/page-objects/modal.ts new file mode 100644 index 000000000000..c8a66d71fa1c --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/modal.ts @@ -0,0 +1,21 @@ +import type { Locator, Page } from '@playwright/test'; + +export class Modal { + protected readonly page: Page; + + constructor(page: Page) { + this.page = page; + } + + get textInput(): Locator { + return this.page.locator('[name="modal_input"]'); + } + + get textInputErrorMessage(): Locator { + return this.page.getByText('Validation failed'); + } + + get btnModalSubmit(): Locator { + return this.page.locator('role=button[name="Submit"]'); + } +} diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts index d588e409423f..4bde20c1da20 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts @@ -93,4 +93,8 @@ export class OmnichannelAgents { findRowByName(name: string) { return this.page.locator('tr', { has: this.page.locator(`td >> text="${name}"`) }); } + + findSelectedDepartment(name: string) { + return this.page.locator(`role=option[name="${name}"]`); + } } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat-embedded.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat-embedded.ts index 79d1e9532677..3990d5fce7bb 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat-embedded.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat-embedded.ts @@ -35,6 +35,10 @@ export class OmnichannelLiveChatEmbedded { return this.page.frameLocator('#rocketchat-iframe').locator('div >> text="Chat Finished"'); } + get headerTitle(): Locator { + return this.page.frameLocator('#rocketchat-iframe').locator('[data-qa="header-title"]'); + } + get btnChatNow(): Locator { return this.page.frameLocator('#rocketchat-iframe').locator('[type="button"] >> text="Chat now"'); } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts index 0b0862617524..330fc981237f 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-livechat.ts @@ -172,6 +172,7 @@ export class OmnichannelLiveChat { await this.onlineAgentMessage.fill(message); await this.btnSendMessageToOnlineAgent.click(); await expect(this.txtChatMessage(message)).toBeVisible(); + await expect(this.page.locator('[data-qa="message-bubble"] >> text="Chat started"')).toBeVisible(); await this.closeChat(); } diff --git a/apps/meteor/tests/e2e/permissions.spec.ts b/apps/meteor/tests/e2e/permissions.spec.ts index 54aaeb3c0ee5..75bf44a159e2 100644 --- a/apps/meteor/tests/e2e/permissions.spec.ts +++ b/apps/meteor/tests/e2e/permissions.spec.ts @@ -186,7 +186,7 @@ test.describe.serial('permissions', () => { }); }); - test.describe.skip('Filter words', () => { + test.describe.serial('Filter words', () => { test.beforeAll(async ({ api }) => { const statusCode1 = (await api.post('/settings/Message_AllowBadWordsFilter', { value: true })).status(); const statusCode2 = (await api.post('/settings/Message_BadWordsFilterList', { value: 'badword' })).status(); diff --git a/apps/meteor/tests/e2e/read-receipts.spec.ts b/apps/meteor/tests/e2e/read-receipts.spec.ts index 54eb52f06fa6..f61e1b2e1d1f 100644 --- a/apps/meteor/tests/e2e/read-receipts.spec.ts +++ b/apps/meteor/tests/e2e/read-receipts.spec.ts @@ -1,3 +1,5 @@ +import type { Page } from '@playwright/test'; + import { IS_EE } from './config/constants'; import { createAuxContext } from './fixtures/createAuxContext'; import { Users } from './fixtures/userStates'; @@ -43,14 +45,22 @@ test.describe.serial('read-receipts', () => { await setSettingValueById(api, 'Message_Read_Receipt_Store_Users', false); }); + let auxContext: { page: Page; poHomeChannel: HomeChannel } | undefined; + + test.afterEach(async () => { + if (auxContext) { + await auxContext.page.close(); + } + auxContext = undefined; + }); + test('should show read receipts message sent status in the sent message', async ({ browser }) => { const { page } = await createAuxContext(browser, Users.user1); - const auxContext = { page, poHomeChannel: new HomeChannel(page) }; + auxContext = { page, poHomeChannel: new HomeChannel(page) }; await auxContext.poHomeChannel.sidenav.openChat(targetChannel); await auxContext.poHomeChannel.content.sendMessage('hello admin'); await expect(auxContext.poHomeChannel.content.lastUserMessage.getByRole('status', { name: 'Message sent' })).toBeVisible(); - await auxContext.page.close(); }); test('should show read receipts message viewed status in the sent message', async () => { diff --git a/apps/meteor/tests/e2e/retention-policy.spec.ts b/apps/meteor/tests/e2e/retention-policy.spec.ts index 7464fd736a97..708e5f19b520 100644 --- a/apps/meteor/tests/e2e/retention-policy.spec.ts +++ b/apps/meteor/tests/e2e/retention-policy.spec.ts @@ -1,4 +1,5 @@ import { faker } from '@faker-js/faker'; +import type { Page } from '@playwright/test'; import { timeUnitToMs, TIMEUNIT } from '../../client/lib/convertTimeUnit'; import { createAuxContext } from './fixtures/createAuxContext'; @@ -91,20 +92,26 @@ test.describe.serial('retention-policy', () => { }); test.describe('edit-room-retention-policy permission', async () => { - test('should not show prune section in edit channel for users without permission', async ({ browser }) => { + let auxContext: { page: Page; poHomeChannel: HomeChannel }; + test.beforeEach(async ({ browser }) => { const { page } = await createAuxContext(browser, Users.user1); - const auxContext = { page, poHomeChannel: new HomeChannel(page) }; + auxContext = { page, poHomeChannel: new HomeChannel(page) }; + await auxContext.poHomeChannel.sidenav.openChat(targetChannel); + await auxContext.poHomeChannel.tabs.btnRoomInfo.click(); + await auxContext.poHomeChannel.tabs.room.btnEdit.click(); + }); + test.afterEach(async () => { + await auxContext.page.close(); + }); + test('should not show prune section in edit channel for users without permission', async () => { await auxContext.poHomeChannel.sidenav.openChat(targetChannel); await auxContext.poHomeChannel.tabs.btnRoomInfo.click(); await auxContext.poHomeChannel.tabs.room.btnEdit.click(); await expect(poHomeChannel.tabs.room.pruneAccordion).not.toBeVisible(); - await auxContext.page.close(); }); - test('users without permission should be able to edit the channel', async ({ browser }) => { - const { page } = await createAuxContext(browser, Users.user1); - const auxContext = { page, poHomeChannel: new HomeChannel(page) }; + test('users without permission should be able to edit the channel', async () => { await auxContext.poHomeChannel.sidenav.openChat(targetChannel); await auxContext.poHomeChannel.tabs.btnRoomInfo.click(); await auxContext.poHomeChannel.tabs.room.btnEdit.click(); @@ -112,7 +119,6 @@ test.describe.serial('retention-policy', () => { await auxContext.poHomeChannel.tabs.room.btnSave.click(); await expect(auxContext.poHomeChannel.getSystemMessageByText('set room to read only')).toBeVisible(); - await auxContext.page.close(); }); }); diff --git a/apps/meteor/tests/e2e/saml.spec.ts b/apps/meteor/tests/e2e/saml.spec.ts index fe1295ca0b4b..3d5935107bb1 100644 --- a/apps/meteor/tests/e2e/saml.spec.ts +++ b/apps/meteor/tests/e2e/saml.spec.ts @@ -10,7 +10,6 @@ import * as constants from './config/constants'; import { createUserFixture } from './fixtures/collections/users'; import { Users } from './fixtures/userStates'; import { Registration } from './page-objects'; -import { convertHexToRGB } from './utils/convertHexToRGB'; import { createCustomRole, deleteCustomRole } from './utils/custom-role'; import { getUserInfo } from './utils/getUserInfo'; import { parseMeteorResponse } from './utils/parseMeteorResponse'; @@ -60,8 +59,6 @@ const resetTestData = async ({ api, cleanupOnly = false }: { api?: any; cleanupO { _id: 'SAML_Custom_Default_issuer', value: 'http://localhost:3000/_saml/metadata/test-sp' }, { _id: 'SAML_Custom_Default_entry_point', value: 'http://localhost:8080/simplesaml/saml2/idp/SSOService.php' }, { _id: 'SAML_Custom_Default_idp_slo_redirect_url', value: 'http://localhost:8080/simplesaml/saml2/idp/SingleLogoutService.php' }, - { _id: 'SAML_Custom_Default_button_label_text', value: 'SAML test login button' }, - { _id: 'SAML_Custom_Default_button_color', value: '#185925' }, ]; await Promise.all(settings.map(({ _id, value }) => setSettingValueById(api, _id, value))); @@ -155,10 +152,6 @@ test.describe('SAML', () => { await expect(poRegistration.btnLoginWithSaml).toBeVisible({ timeout: 10000 }); }); - await test.step('expect to have SAML login button to have the required background color', async () => { - await expect(poRegistration.btnLoginWithSaml).toHaveCSS('background-color', convertHexToRGB('#185925')); - }); - await test.step('expect to be redirected to the IdP for login', async () => { await poRegistration.btnLoginWithSaml.click(); diff --git a/apps/meteor/tests/e2e/team-management.spec.ts b/apps/meteor/tests/e2e/team-management.spec.ts index 9542b8a81a70..55530302ca96 100644 --- a/apps/meteor/tests/e2e/team-management.spec.ts +++ b/apps/meteor/tests/e2e/team-management.spec.ts @@ -46,6 +46,7 @@ test.describe.serial('teams-management', () => { test('expect create "targetTeamReadOnly" readonly', async ({ page }) => { await poHomeTeam.sidenav.openNewByLabel('Team'); await poHomeTeam.inputTeamName.type(targetTeamReadOnly); + await poHomeTeam.sidenav.advancedSettingsAccordion.click(); await poHomeTeam.textReadOnly.click(); await poHomeTeam.addMember('user1'); await poHomeTeam.btnTeamCreate.click(); diff --git a/apps/meteor/tests/e2e/threads.spec.ts b/apps/meteor/tests/e2e/threads.spec.ts index 16198c15a942..2de7c53ba48a 100644 --- a/apps/meteor/tests/e2e/threads.spec.ts +++ b/apps/meteor/tests/e2e/threads.spec.ts @@ -162,5 +162,38 @@ test.describe.serial('Threads', () => { await page.keyboard.press('Escape'); await expect(page).not.toHaveURL(/.*thread/); }); + + test('expect reset the thread composer to original message if user presses escape', async ({ page }) => { + await expect(page).toHaveURL(/.*thread/); + await expect(page.getByRole('dialog').locator('[data-qa-type="message"]')).toBeVisible(); + + await expect(page.locator('[name="msg"]').last()).toBeFocused(); + await page.locator('[name="msg"]').last().fill('message to be edited'); + await page.keyboard.press('Enter'); + await page.keyboard.press('ArrowUp'); + + await expect(page.locator('[name="msg"]').last()).toHaveValue('message to be edited'); + await page.locator('[name="msg"]').last().fill('this message was edited'); + + await page.keyboard.press('Escape'); + await expect(page.locator('[name="msg"]').last()).toHaveValue('message to be edited'); + await expect(page).toHaveURL(/.*thread/); + }); + + test('expect clean composer and keep the thread open if user is editing message and presses escape', async ({ page }) => { + await expect(page).toHaveURL(/.*thread/); + await expect(page.getByRole('dialog').locator('[data-qa-type="message"]')).toBeVisible(); + await expect(page.locator('[name="msg"]').last()).toBeFocused(); + + await page.locator('[name="msg"]').last().fill('message to be edited'); + await page.keyboard.press('Enter'); + + await page.keyboard.press('ArrowUp'); + await expect(page.locator('[name="msg"]').last()).toHaveValue('message to be edited'); + + await page.keyboard.press('Escape'); + await expect(page.locator('[name="msg"]').last()).toHaveValue(''); + await expect(page).toHaveURL(/.*thread/); + }); }); }); diff --git a/apps/meteor/tests/e2e/utils/convertHexToRGB.ts b/apps/meteor/tests/e2e/utils/convertHexToRGB.ts deleted file mode 100644 index 9b20671cfcaa..000000000000 --- a/apps/meteor/tests/e2e/utils/convertHexToRGB.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const convertHexToRGB = (hex: string) => { - hex = hex.replace(/^#/, ''); - - const red = parseInt(hex.substring(0, 2), 16); - const green = parseInt(hex.substring(2, 4), 16); - const blue = parseInt(hex.substring(4, 6), 16); - - return `rgb(${red}, ${green}, ${blue})`; -}; diff --git a/apps/meteor/tests/e2e/video-conference-ring.spec.ts b/apps/meteor/tests/e2e/video-conference-ring.spec.ts index 03ab7bd53c33..3c6ba1730e3d 100644 --- a/apps/meteor/tests/e2e/video-conference-ring.spec.ts +++ b/apps/meteor/tests/e2e/video-conference-ring.spec.ts @@ -1,3 +1,5 @@ +import type { Page } from '@playwright/test'; + import { IS_EE } from './config/constants'; import { createAuxContext } from './fixtures/createAuxContext'; import { Users } from './fixtures/userStates'; @@ -17,10 +19,18 @@ test.describe('video conference ringing', () => { await page.goto('/home'); }); - test('expect is ringing in direct', async ({ browser }) => { - await poHomeChannel.sidenav.openChat('user2'); + let auxContext: { page: Page; poHomeChannel: HomeChannel }; + test.beforeEach(async ({ browser }) => { const { page } = await createAuxContext(browser, Users.user2); - const auxContext = { page, poHomeChannel: new HomeChannel(page) }; + auxContext = { page, poHomeChannel: new HomeChannel(page) }; + }); + + test.afterEach(async () => { + await auxContext.page.close(); + }); + + test('expect is ringing in direct', async () => { + await poHomeChannel.sidenav.openChat('user2'); await auxContext.poHomeChannel.sidenav.openChat('user1'); await poHomeChannel.content.btnCall.click(); diff --git a/apps/meteor/tests/end-to-end/api/34-engagement-dashboard.ts b/apps/meteor/tests/end-to-end/api/34-engagement-dashboard.ts new file mode 100644 index 000000000000..c1fc685d11f9 --- /dev/null +++ b/apps/meteor/tests/end-to-end/api/34-engagement-dashboard.ts @@ -0,0 +1,347 @@ +import type { IRoom } from '@rocket.chat/core-typings'; +import { expect } from 'chai'; +import { after, before, describe, it } from 'mocha'; +import type { Response } from 'supertest'; + +import { getCredentials, api, request, credentials } from '../../data/api-data'; +import { sendSimpleMessage } from '../../data/chat.helper'; +import { updatePermission } from '../../data/permissions.helper'; +import { createRoom, deleteRoom } from '../../data/rooms.helper'; + +describe('[Engagement Dashboard]', function () { + this.retries(0); + + const isEnterprise = Boolean(process.env.IS_EE); + + before((done) => getCredentials(done)); + + before(() => updatePermission('view-engagement-dashboard', ['admin'])); + + after(() => updatePermission('view-engagement-dashboard', ['admin'])); + + (isEnterprise ? describe : describe.skip)('[/engagement-dashboard/channels/list]', () => { + let testRoom: IRoom; + + before(async () => { + testRoom = (await createRoom({ type: 'c', name: `channel.test.engagement.${Date.now()}-${Math.random()}` })).body.channel; + }); + + after(async () => { + await deleteRoom({ type: 'c', roomId: testRoom._id }); + }); + + it('should fail if user does not have the view-engagement-dashboard permission', async () => { + await updatePermission('view-engagement-dashboard', []); + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date().toISOString(), + start: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + offset: 0, + count: 25, + }) + .expect('Content-Type', 'application/json') + .expect(403) + .expect((res: Response) => { + expect(res.body).to.have.property('success', false); + expect(res.body.error).to.be.equal('User does not have the permissions required for this action [error-unauthorized]'); + }); + }); + + it('should fail if start param is not a valid date', async () => { + await updatePermission('view-engagement-dashboard', ['admin']); + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + start: 'invalid-date', + end: new Date().toISOString(), + offset: 0, + count: 25, + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res: Response) => { + expect(res.body).to.have.property('success', false); + expect(res.body.error).to.be.equal('Match error: Failed Match.Where validation in field start'); + }); + }); + + it('should fail if end param is not a valid date', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + start: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + end: 'invalid-date', + offset: 0, + count: 25, + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res: Response) => { + expect(res.body).to.have.property('success', false); + expect(res.body.error).to.be.equal('Match error: Failed Match.Where validation in field end'); + }); + }); + + it('should fail if start param is not provided', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date(), + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res: Response) => { + expect(res.body).to.have.property('success', false); + expect(res.body.error).to.be.equal("Match error: Missing key 'start'"); + }); + }); + + it('should fail if end param is not provided', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + start: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res: Response) => { + expect(res.body).to.have.property('success', false); + expect(res.body.error).to.be.equal("Match error: Missing key 'end'"); + }); + }); + + it('should succesfuly return results', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date().toISOString(), + start: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('offset', 0); + expect(res.body).to.have.property('count'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('channels'); + expect(res.body.channels).to.be.an('array').that.is.not.empty; + + expect(res.body.channels[0]).to.be.an('object').that.is.not.empty; + expect(res.body.channels[0]).to.have.property('messages').that.is.a('number'); + expect(res.body.channels[0]).to.have.property('lastWeekMessages').that.is.a('number'); + expect(res.body.channels[0]).to.have.property('diffFromLastWeek').that.is.a('number'); + expect(res.body.channels[0].room).to.be.an('object').that.is.not.empty; + + expect(res.body.channels[0].room).to.have.property('_id').that.is.a('string'); + expect(res.body.channels[0].room).to.have.property('name').that.is.a('string'); + expect(res.body.channels[0].room).to.have.property('ts').that.is.a('string'); + expect(res.body.channels[0].room).to.have.property('t').that.is.a('string'); + expect(res.body.channels[0].room).to.have.property('_updatedAt').that.is.a('string'); + }); + }); + + it('should not return empty rooms when the hideRoomsWithNoActivity param is provided', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date().toISOString(), + start: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + hideRoomsWithNoActivity: true, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('offset', 0); + expect(res.body).to.have.property('count'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('channels'); + const channelRecord = res.body.channels.find(({ room }: { room: { _id: string } }) => room._id === testRoom._id); + expect(channelRecord).to.be.undefined; + }); + }); + + it('should correctly count messages in an empty room', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date().toISOString(), + start: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('offset', 0); + expect(res.body).to.have.property('count'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('channels'); + expect(res.body.channels).to.be.an('array').that.is.not.empty; + + const channelRecord = res.body.channels.find(({ room }: { room: { _id: string } }) => room._id === testRoom._id); + expect(channelRecord).not.to.be.undefined; + + expect(channelRecord).to.be.an('object').that.is.not.empty; + expect(channelRecord).to.have.property('messages', 0); + expect(channelRecord).to.have.property('lastWeekMessages', 0); + expect(channelRecord).to.have.property('diffFromLastWeek', 0); + expect(channelRecord.room).to.be.an('object').that.is.not.empty; + + expect(channelRecord.room).to.have.property('_id', testRoom._id); + expect(channelRecord.room).to.have.property('name', testRoom.name); + expect(channelRecord.room).to.have.property('ts', testRoom.ts); + expect(channelRecord.room).to.have.property('t', testRoom.t); + expect(channelRecord.room).to.have.property('_updatedAt', testRoom._updatedAt); + }); + }); + + it('should correctly count messages diff compared to last week when the hideRoomsWithNoActivity param is provided and there are messages in a room', async () => { + await sendSimpleMessage({ roomId: testRoom._id }); + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date().toISOString(), + start: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + hideRoomsWithNoActivity: true, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('offset', 0); + expect(res.body).to.have.property('count'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('channels'); + expect(res.body.channels).to.be.an('array').that.is.not.empty; + + const channelRecord = res.body.channels.find(({ room }: { room: { _id: string } }) => room._id === testRoom._id); + expect(channelRecord).not.to.be.undefined; + + expect(channelRecord).to.be.an('object').that.is.not.empty; + expect(channelRecord).to.have.property('messages', 1); + expect(channelRecord).to.have.property('lastWeekMessages', 0); + expect(channelRecord).to.have.property('diffFromLastWeek', 1); + expect(channelRecord.room).to.be.an('object').that.is.not.empty; + + expect(channelRecord.room).to.have.property('_id', testRoom._id); + expect(channelRecord.room).to.have.property('name', testRoom.name); + expect(channelRecord.room).to.have.property('ts', testRoom.ts); + expect(channelRecord.room).to.have.property('t', testRoom.t); + }); + }); + + it('should correctly count messages diff compared to last week when there are messages in a room', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date().toISOString(), + start: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('offset', 0); + expect(res.body).to.have.property('count'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('channels'); + expect(res.body.channels).to.be.an('array').that.is.not.empty; + + const channelRecord = res.body.channels.find(({ room }: { room: { _id: string } }) => room._id === testRoom._id); + expect(channelRecord).not.to.be.undefined; + + expect(channelRecord).to.be.an('object').that.is.not.empty; + expect(channelRecord).to.have.property('messages', 1); + expect(channelRecord).to.have.property('lastWeekMessages', 0); + expect(channelRecord).to.have.property('diffFromLastWeek', 1); + expect(channelRecord.room).to.be.an('object').that.is.not.empty; + + expect(channelRecord.room).to.have.property('_id', testRoom._id); + expect(channelRecord.room).to.have.property('name', testRoom.name); + expect(channelRecord.room).to.have.property('ts', testRoom.ts); + expect(channelRecord.room).to.have.property('t', testRoom.t); + }); + }); + + it('should correctly count messages from last week and diff when moving to the next week and providing the hideRoomsWithNoActivity param', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date(Date.now() + 8 * 24 * 60 * 60 * 1000).toISOString(), + start: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), + hideRoomsWithNoActivity: true, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('offset', 0); + expect(res.body).to.have.property('count'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('channels'); + expect(res.body.channels).to.be.an('array').that.is.not.empty; + + const channelRecord = res.body.channels.find(({ room }: { room: { _id: string } }) => room._id === testRoom._id); + expect(channelRecord).not.to.be.undefined; + + expect(channelRecord).to.be.an('object').that.is.not.empty; + expect(channelRecord).to.have.property('messages', 0); + expect(channelRecord).to.have.property('lastWeekMessages', 1); + expect(channelRecord).to.have.property('diffFromLastWeek', -1); + expect(channelRecord.room).to.be.an('object').that.is.not.empty; + + expect(channelRecord.room).to.have.property('_id', testRoom._id); + expect(channelRecord.room).to.have.property('name', testRoom.name); + expect(channelRecord.room).to.have.property('ts', testRoom.ts); + expect(channelRecord.room).to.have.property('t', testRoom.t); + }); + }); + + it('should correctly count messages from last week and diff when moving to the next week', async () => { + await request + .get(api('engagement-dashboard/channels/list')) + .set(credentials) + .query({ + end: new Date(Date.now() + 8 * 24 * 60 * 60 * 1000).toISOString(), + start: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('offset', 0); + expect(res.body).to.have.property('count'); + expect(res.body).to.have.property('total'); + expect(res.body).to.have.property('channels'); + expect(res.body.channels).to.be.an('array').that.is.not.empty; + + const channelRecord = res.body.channels.find(({ room }: { room: { _id: string } }) => room._id === testRoom._id); + expect(channelRecord).not.to.be.undefined; + + expect(channelRecord).to.be.an('object').that.is.not.empty; + expect(channelRecord).to.have.property('messages', 0); + expect(channelRecord).to.have.property('lastWeekMessages', 1); + expect(channelRecord).to.have.property('diffFromLastWeek', -1); + expect(channelRecord.room).to.be.an('object').that.is.not.empty; + + expect(channelRecord.room).to.have.property('_id', testRoom._id); + expect(channelRecord.room).to.have.property('name', testRoom.name); + expect(channelRecord.room).to.have.property('ts', testRoom.ts); + expect(channelRecord.room).to.have.property('t', testRoom.t); + }); + }); + }); +}); diff --git a/apps/meteor/tests/end-to-end/api/audit.ts b/apps/meteor/tests/end-to-end/api/audit.ts new file mode 100644 index 000000000000..ba62caf621b8 --- /dev/null +++ b/apps/meteor/tests/end-to-end/api/audit.ts @@ -0,0 +1,301 @@ +import type { Credentials } from '@rocket.chat/api-client'; +import type { IRoom, IUser } from '@rocket.chat/core-typings'; +import { Random } from '@rocket.chat/random'; +import { expect } from 'chai'; +import EJSON from 'ejson'; +import { before, describe, it, after } from 'mocha'; + +import { getCredentials, api, request, credentials, methodCall } from '../../data/api-data'; +import { updatePermission } from '../../data/permissions.helper'; +import { createRoom, deleteRoom } from '../../data/rooms.helper'; +import { password } from '../../data/user'; +import { createUser, deleteUser, login } from '../../data/users.helper'; +import { IS_EE } from '../../e2e/config/constants'; + +(IS_EE ? describe : describe.skip)('Audit Panel', () => { + let testChannel: IRoom; + let testPrivateChannel: IRoom; + let dummyUser: IUser; + let auditor: IUser; + let auditorCredentials: Credentials; + before((done) => getCredentials(done)); + before(async () => { + testChannel = (await createRoom({ type: 'c', name: `chat.api-test-${Date.now()}` })).body.channel; + testPrivateChannel = (await createRoom({ type: 'p', name: `chat.api-test-${Date.now()}` })).body.group; + dummyUser = await createUser(); + auditor = await createUser({ roles: ['user', 'auditor'] }); + + auditorCredentials = await login(auditor.username, password); + }); + after(async () => { + await deleteRoom({ type: 'c', roomId: testChannel._id }); + await deleteUser({ _id: dummyUser._id }); + await deleteUser({ _id: auditor._id }); + await deleteRoom({ type: 'p', roomId: testPrivateChannel._id }); + }); + + describe('audit/rooms.members [no permissions]', () => { + before(async () => { + await updatePermission('view-members-list-all-rooms', []); + }); + after(async () => { + await updatePermission('view-members-list-all-rooms', ['admin', 'auditor']); + }); + it('should fail if user does not have view-members-list-all-rooms permission', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: 'GENERAL', + }) + .expect(403); + await request + .get(api('audit/rooms.members')) + .set(auditorCredentials) + .query({ + roomId: 'GENERAL', + }) + .expect(403); + }); + }); + + describe('audit/rooms.members', () => { + it('should fail if user is not logged in', async () => { + await request + .get(api('audit/rooms.members')) + .query({ + roomId: 'GENERAL', + }) + .expect(401); + }); + it('should fail if roomId is invalid', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: Random.id(), + }) + .expect(404); + }); + it('should fail if roomId is not present', async () => { + await request.get(api('audit/rooms.members')).set(credentials).query({}).expect(400); + }); + it('should fail if roomId is an empty string', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: '', + }) + .expect(400); + }); + it('should fetch the members of a room', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: testChannel._id, + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members).to.have.lengthOf(1); + }); + }); + it('should persist a log entry', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: testChannel._id, + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members).to.have.lengthOf(1); + }); + + await request + .post(methodCall('auditGetAuditions')) + .set(credentials) + .send({ + message: EJSON.stringify({ + method: 'auditGetAuditions', + params: [{ startDate: new Date(Date.now() - 86400000), endDate: new Date() }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + const message = JSON.parse(res.body.message); + + expect(message.result).to.be.an('array').with.lengthOf.greaterThan(1); + const entry = message.result.find((audition: any) => { + return audition.fields.rids.includes(testChannel._id); + }); + expect(entry).to.have.property('u').that.is.an('object').deep.equal({ + _id: 'rocketchat.internal.admin.test', + username: 'rocketchat.internal.admin.test', + name: 'RocketChat Internal Admin Test', + }); + expect(entry).to.have.property('fields').that.is.an('object'); + const { fields } = entry; + + expect(fields).to.have.property('msg', 'Room_members_list'); + expect(fields).to.have.property('rids').that.is.an('array').with.lengthOf(1); + }); + }); + it('should fetch the members of a room with offset and count', async () => { + await request + .post(methodCall('addUsersToRoom')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'addUsersToRoom', + params: [{ rid: testChannel._id, users: [dummyUser.username] }], + id: 'id', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + }); + + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: testChannel._id, + offset: 1, + count: 1, + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members).to.have.lengthOf(1); + expect(res.body.members[0].username).to.be.equal(dummyUser.username); + expect(res.body.total).to.be.equal(2); + expect(res.body.offset).to.be.equal(1); + expect(res.body.count).to.be.equal(1); + }); + }); + + it('should filter by username', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: testChannel._id, + filter: dummyUser.username, + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members).to.have.lengthOf(1); + expect(res.body.members[0].username).to.be.equal(dummyUser.username); + }); + }); + + it('should filter by user name', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: testChannel._id, + filter: dummyUser.name, + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members).to.have.lengthOf(1); + expect(res.body.members[0].name).to.be.equal(dummyUser.name); + }); + }); + + it('should sort by username', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: testChannel._id, + sort: '{ "username": -1 }', + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members).to.have.lengthOf(2); + expect(res.body.members[1].username).to.be.equal('rocketchat.internal.admin.test'); + expect(res.body.members[0].username).to.be.equal(dummyUser.username); + }); + }); + + it('should not allow nosqlinjection on filter param', async () => { + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: testChannel._id, + filter: '{ "$ne": "rocketchat.internal.admin.test" }', + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members).to.have.lengthOf(0); + }); + + await request + .get(api('audit/rooms.members')) + .set(credentials) + .query({ + roomId: testChannel._id, + filter: { username: 'rocketchat.internal.admin.test' }, + }) + .expect(400); + }); + + it('should allow to fetch info even if user is not in the room', async () => { + await request + .get(api('audit/rooms.members')) + .set(auditorCredentials) + .query({ + roomId: testChannel._id, + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members[0].username).to.be.equal('rocketchat.internal.admin.test'); + expect(res.body.members[1].username).to.be.equal(dummyUser.username); + expect(res.body.total).to.be.equal(2); + }); + }); + + it('should allow to fetch info from private rooms', async () => { + await request + .get(api('audit/rooms.members')) + .set(auditorCredentials) + .query({ + roomId: testPrivateChannel._id, + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.members).to.be.an('array'); + expect(res.body.members[0].username).to.be.equal('rocketchat.internal.admin.test'); + expect(res.body.total).to.be.equal(1); + }); + }); + }); +}); diff --git a/apps/meteor/tests/end-to-end/api/chat.ts b/apps/meteor/tests/end-to-end/api/chat.ts index e41a4232d908..7c10eeba45bc 100644 --- a/apps/meteor/tests/end-to-end/api/chat.ts +++ b/apps/meteor/tests/end-to-end/api/chat.ts @@ -1,5 +1,6 @@ import type { Credentials } from '@rocket.chat/api-client'; import type { IMessage, IRoom, IThreadMessage, IUser } from '@rocket.chat/core-typings'; +import { Random } from '@rocket.chat/random'; import { expect } from 'chai'; import { after, before, beforeEach, describe, it } from 'mocha'; import type { Response } from 'supertest'; @@ -768,6 +769,40 @@ describe('[Chat]', () => { .end(done); }); + describe('Bad words filter', () => { + before(() => + Promise.all([updateSetting('Message_AllowBadWordsFilter', true), updateSetting('Message_BadWordsFilterList', 'badword,badword2')]), + ); + + after(() => Promise.all([updateSetting('Message_AllowBadWordsFilter', false), updateSetting('Message_BadWordsFilterList', '')])); + + it('should censor bad words on send', async () => { + const badMessage = { + _id: Random.id(), + rid: testChannel._id, + msg: 'This message has badword badword2', + }; + + await request + .post(api('chat.sendMessage')) + .set(credentials) + .send({ message: badMessage }) + .expect(200) + .expect('Content-Type', 'application/json') + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('message'); + const { message } = res.body; + expect(message).to.have.property('msg', 'This message has ******* ********'); + expect(message).to.have.property('md').to.be.an('array').that.has.lengthOf(1); + const para = message.md[0]; + expect(para).to.have.property('value').to.be.an('array').that.has.lengthOf(1); + const text = para.value[0]; + expect(text).to.have.property('value', 'This message has ******* ********'); + }); + }); + }); + describe('oembed', () => { let ytEmbedMsgId: IMessage['_id']; let imgUrlMsgId: IMessage['_id']; @@ -1117,6 +1152,27 @@ describe('[Chat]', () => { .end(done); }); + it('should fail if message is a system message', () => { + const msgId = Random.id(); + return request + .post(api('chat.sendMessage')) + .set(credentials) + .send({ + message: { + _id: msgId, + rid: 'GENERAL', + msg: 'xss', + t: 'subscription-role-added', + role: '

    XSS', + }, + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + }); + }); + describe('customFields', () => { async function testMessageSending({ customFields, @@ -1359,10 +1415,17 @@ describe('[Chat]', () => { let simpleMessageId: IMessage['_id']; before('should send simple message in room', async () => { + await updateSetting('Message_CustomFields_Enabled', true); + await updateSetting('Message_CustomFields', JSON.stringify({ properties: { test: { type: 'string' } } })); const res = await sendSimpleMessage({ roomId: 'GENERAL' }); simpleMessageId = res.body.message._id; }); + after(async () => { + await updateSetting('Message_CustomFields_Enabled', false); + await updateSetting('Message_CustomFields', ''); + }); + it('should update a message successfully', (done) => { void request .post(api('chat.update')) @@ -1460,6 +1523,94 @@ describe('[Chat]', () => { expect(res.body.message).to.have.property('attachments').that.is.an('array').that.has.lengthOf(0); }); }); + + it('should do nothing if the message text hasnt changed and theres no custom fields', async () => { + await request + .post(api('chat.update')) + .set(credentials) + .send({ + roomId: testChannel._id, + msgId: message._id, + text: 'This message was edited via API', + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.nested.property('message.msg', 'This message was edited via API'); + expect(res.body).to.not.have.nested.property('message.customFields'); + }); + }); + + it('should update message custom fields along with msg', async () => { + await request + .post(api('chat.update')) + .set(credentials) + .send({ + roomId: testChannel._id, + msgId: message._id, + text: 'This message was edited via API 2', + customFields: { test: 'test' }, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.nested.property('message.msg', 'This message was edited via API 2'); + expect(res.body.message).to.have.property('customFields').that.is.an('object').that.deep.equals({ test: 'test' }); + }); + }); + + it('should update message custom fields without changes to msg', async () => { + await request + .post(api('chat.update')) + .set(credentials) + .send({ + roomId: testChannel._id, + msgId: message._id, + text: 'This message was edited via API 2', + customFields: { test: 'test 2' }, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.nested.property('message.msg', 'This message was edited via API 2'); + expect(res.body.message).to.have.property('customFields').that.is.an('object').that.deep.equals({ test: 'test 2' }); + }); + }); + + describe('Bad words filter', () => { + before(() => + Promise.all([updateSetting('Message_AllowBadWordsFilter', true), updateSetting('Message_BadWordsFilterList', 'badword,badword2')]), + ); + + after(() => Promise.all([updateSetting('Message_AllowBadWordsFilter', false), updateSetting('Message_BadWordsFilterList', '')])); + + it('should censor bad words on update', async () => { + await request + .post(api('chat.update')) + .set(credentials) + .send({ + roomId: testChannel._id, + msgId: message._id, + text: 'This message has badword badword2', + }) + .expect(200) + .expect('Content-Type', 'application/json') + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('message'); + const { message } = res.body; + expect(message).to.have.property('msg', 'This message has ******* ********'); + expect(message).to.have.property('md').to.be.an('array').that.has.lengthOf(1); + const para = message.md[0]; + expect(para).to.have.property('value').to.be.an('array').that.has.lengthOf(1); + const text = para.value[0]; + expect(text).to.have.property('value', 'This message has ******* ********'); + }); + }); + }); }); describe('[/chat.delete]', () => { diff --git a/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts b/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts index 5c881b530d08..9f0427ec2d8e 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts @@ -35,6 +35,7 @@ import { fetchMessages, deleteVisitor, makeAgentUnavailable, + sendAgentMessage, } from '../../../data/livechat/rooms'; import { saveTags } from '../../../data/livechat/tags'; import type { DummyResponse } from '../../../data/livechat/utils'; @@ -341,6 +342,77 @@ describe('LIVECHAT - rooms', () => { expect(body.rooms.some((room: IOmnichannelRoom) => !!room.closedAt)).to.be.true; expect(body.rooms.some((room: IOmnichannelRoom) => room.open)).to.be.true; }); + it('should return queued rooms when `queued` param is passed', async () => { + await updateSetting('Livechat_Routing_Method', 'Manual_Selection'); + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + + const { body } = await request.get(api('livechat/rooms')).query({ queued: true }).set(credentials).expect(200); + + expect(body.rooms.every((room: IOmnichannelRoom) => room.open)).to.be.true; + expect(body.rooms.every((room: IOmnichannelRoom) => !room.servedBy)).to.be.true; + expect(body.rooms.find((froom: IOmnichannelRoom) => froom._id === room._id)).to.be.not.undefined; + }); + it('should return queued rooms when `queued` and `open` params are passed', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + + const { body } = await request.get(api('livechat/rooms')).query({ queued: true, open: true }).set(credentials).expect(200); + + expect(body.rooms.every((room: IOmnichannelRoom) => room.open)).to.be.true; + expect(body.rooms.every((room: IOmnichannelRoom) => !room.servedBy)).to.be.true; + expect(body.rooms.find((froom: IOmnichannelRoom) => froom._id === room._id)).to.be.not.undefined; + }); + it('should return open rooms when `open` is param is passed. Open rooms should not include queued conversations', async () => { + const visitor = await createVisitor(); + const room = await createLivechatRoom(visitor.token); + + const { room: room2 } = await startANewLivechatRoomAndTakeIt(); + + const { body } = await request.get(api('livechat/rooms')).query({ open: true }).set(credentials).expect(200); + + expect(body.rooms.every((room: IOmnichannelRoom) => room.open)).to.be.true; + expect(body.rooms.find((froom: IOmnichannelRoom) => froom._id === room2._id)).to.be.not.undefined; + expect(body.rooms.find((froom: IOmnichannelRoom) => froom._id === room._id)).to.be.undefined; + + await updateSetting('Livechat_Routing_Method', 'Auto_Selection'); + }); + (IS_EE ? describe : describe.skip)('Queued and OnHold chats', () => { + before(async () => { + await updateSetting('Livechat_allow_manual_on_hold', true); + await updateSetting('Livechat_Routing_Method', 'Manual_Selection'); + }); + + after(async () => { + await updateSetting('Livechat_Routing_Method', 'Auto_Selection'); + await updateSetting('Livechat_allow_manual_on_hold', false); + }); + + it('should not return on hold rooms along with queued rooms when `queued` is true and `onHold` is true', async () => { + const { room } = await startANewLivechatRoomAndTakeIt(); + await sendAgentMessage(room._id); + const response = await request + .post(api('livechat/room.onHold')) + .set(credentials) + .send({ + roomId: room._id, + }) + .expect(200); + + expect(response.body.success).to.be.true; + + const visitor = await createVisitor(); + const room2 = await createLivechatRoom(visitor.token); + + const { body } = await request.get(api('livechat/rooms')).query({ queued: true, onhold: true }).set(credentials).expect(200); + + expect(body.rooms.every((room: IOmnichannelRoom) => room.open)).to.be.true; + expect(body.rooms.every((room: IOmnichannelRoom) => !room.servedBy)).to.be.true; + expect(body.rooms.every((room: IOmnichannelRoom) => !room.onHold)).to.be.true; + expect(body.rooms.find((froom: IOmnichannelRoom) => froom._id === room._id)).to.be.undefined; + expect(body.rooms.find((froom: IOmnichannelRoom) => froom._id === room2._id)).to.be.not.undefined; + }); + }); (IS_EE ? it : it.skip)('should return only rooms with the given department', async () => { const { department } = await createDepartmentWithAnOnlineAgent(); @@ -910,7 +982,6 @@ describe('LIVECHAT - rooms', () => { .expect('Content-Type', 'application/json') .expect(200) .expect((res: Response) => { - console.log({ res: res.body }); expect(res.body).to.have.property('success', true); }); @@ -929,6 +1000,45 @@ describe('LIVECHAT - rooms', () => { roomId = newRoom._id; visitorToken = newVisitor.token; }); + (IS_EE ? describe : describe.skip)('fallback department', () => { + let fallbackDepartment: Awaited>['department']; + let initialDepartment: Awaited>['department']; + let newVisitor: ILivechatVisitor; + let latestRoom: IOmnichannelRoom; + before(async () => { + await updateSetting('Livechat_Routing_Method', 'Auto_Selection'); + + fallbackDepartment = (await createDepartmentWithAnOnlineAgent()).department; + initialDepartment = ( + await createDepartmentWithAnOfflineAgent({ + fallbackForwardDepartment: fallbackDepartment._id, + }) + ).department; + + expect(initialDepartment.fallbackForwardDepartment).to.be.equal(fallbackDepartment._id); + }); + + after(async () => { + await Promise.all([ + deleteDepartment(fallbackDepartment._id), + deleteDepartment(initialDepartment._id), + deleteVisitor(newVisitor._id), + closeOmnichannelRoom(latestRoom._id), + ]); + }); + + it('should redirect chat to fallback department when all agents in the initial department are offline', async () => { + await updateSetting('Livechat_Routing_Method', 'Auto_Selection'); + + newVisitor = await createVisitor(initialDepartment._id); + const newRoom = await createLivechatRoom(newVisitor.token); + + latestRoom = await getLivechatRoomInfo(newRoom._id); + + expect(latestRoom).to.have.property('departmentId'); + expect(latestRoom.departmentId).to.be.equal(fallbackDepartment._id); + }); + }); (IS_EE ? it : it.skip)('system messages sent on transfer should be properly generated', async () => { const messagesList = await fetchMessages(roomId, visitorToken); diff --git a/apps/meteor/tests/end-to-end/api/livechat/01-agents.ts b/apps/meteor/tests/end-to-end/api/livechat/01-agents.ts index fc81488ac37d..d8cd23d97752 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/01-agents.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/01-agents.ts @@ -1,11 +1,13 @@ import type { Credentials } from '@rocket.chat/api-client'; import { UserStatus, type ILivechatAgent, type ILivechatDepartment, type IRoom, type IUser } from '@rocket.chat/core-typings'; +import { Random } from '@rocket.chat/random'; import { expect } from 'chai'; import { after, before, describe, it } from 'mocha'; import type { Response } from 'supertest'; import { getCredentials, api, request, credentials } from '../../../data/api-data'; import { disableDefaultBusinessHour, makeDefaultBusinessHourActiveAndClosed } from '../../../data/livechat/businessHours'; +import { createDepartment, deleteDepartment } from '../../../data/livechat/department'; import { createAgent, createManager, @@ -21,6 +23,7 @@ import { import { updatePermission, updateSetting } from '../../../data/permissions.helper'; import { password } from '../../../data/user'; import { createUser, deleteUser, getMe, login, setUserStatus } from '../../../data/users.helper'; +import { IS_EE } from '../../../e2e/config/constants'; describe('LIVECHAT - Agents', () => { let agent: ILivechatAgent; @@ -377,7 +380,36 @@ describe('LIVECHAT - Agents', () => { }); }); - describe('livechat/agents/:agentId/departments', () => { + (IS_EE ? describe : describe.skip)('livechat/agents/:agentId/departments', () => { + let dep1: ILivechatDepartment; + let dep2: ILivechatDepartment; + before(async () => { + dep1 = await createDepartment( + { + enabled: true, + name: Random.id(), + showOnRegistration: true, + email: `${Random.id()}@example.com`, + showOnOfflineForm: true, + }, + [{ agentId: credentials['X-User-Id'] }], + ); + dep2 = await createDepartment( + { + enabled: false, + name: Random.id(), + email: `${Random.id()}@example.com`, + showOnRegistration: true, + showOnOfflineForm: true, + }, + [{ agentId: credentials['X-User-Id'] }], + ); + }); + + after(async () => { + await deleteDepartment(dep1._id); + await deleteDepartment(dep2._id); + }); it('should return an "unauthorized error" when the user does not have the necessary permission', async () => { await updatePermission('view-l-room', []); await request @@ -385,9 +417,9 @@ describe('LIVECHAT - Agents', () => { .set(credentials) .expect('Content-Type', 'application/json') .expect(403); + await updatePermission('view-l-room', ['livechat-manager', 'livechat-agent', 'admin']); }); it('should return an empty array of departments when the agentId is invalid', async () => { - await updatePermission('view-l-room', ['admin']); await request .get(api('livechat/agents/invalid-id/departments')) .set(credentials) @@ -399,7 +431,6 @@ describe('LIVECHAT - Agents', () => { }); }); it('should return an array of departments when the agentId is valid', async () => { - await updatePermission('view-l-room', ['admin']); await request .get(api(`livechat/agents/${agent._id}/departments`)) .set(credentials) @@ -408,12 +439,26 @@ describe('LIVECHAT - Agents', () => { .expect((res: Response) => { expect(res.body).to.have.property('success', true); expect(res.body).to.have.property('departments').and.to.be.an('array'); + expect(res.body.departments.length).to.be.equal(2); (res.body.departments as ILivechatDepartment[]).forEach((department) => { expect(department.agentId).to.be.equal(agent._id); + expect(department).to.have.property('departmentName').that.is.a('string'); }); }); - - await updatePermission('view-l-room', ['livechat-manager', 'livechat-agent', 'admin']); + }); + it('should return only enabled departments when param `enabledDepartmentsOnly` is true ', async () => { + await request + .get(api(`livechat/agents/${agent._id}/departments`)) + .set(credentials) + .query({ enabledDepartmentsOnly: true }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res: Response) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('departments').and.to.be.an('array'); + expect(res.body.departments.length).to.be.equal(1); + expect(res.body.departments[0].departmentEnabled).to.be.true; + }); }); }); diff --git a/apps/meteor/tests/end-to-end/api/methods.ts b/apps/meteor/tests/end-to-end/api/methods.ts index d03b83854b28..e1ca05d1fbf2 100644 --- a/apps/meteor/tests/end-to-end/api/methods.ts +++ b/apps/meteor/tests/end-to-end/api/methods.ts @@ -1,5 +1,6 @@ import type { Credentials } from '@rocket.chat/api-client'; import type { IMessage, IRoom, IThreadMessage, IUser } from '@rocket.chat/core-typings'; +import { Random } from '@rocket.chat/random'; import { expect } from 'chai'; import { after, before, beforeEach, describe, it } from 'mocha'; @@ -1979,6 +1980,46 @@ describe('Meteor.methods', () => { }) .end(done); }); + + it('should not send message if it is a system message', async () => { + const msgId = Random.id(); + await request + .post(methodCall('sendMessage')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'sendMessage', + params: [ + { + _id: msgId, + rid: 'GENERAL', + msg: 'xss', + t: 'subscription-role-added', + role: '

    XSS', + }, + ], + id: 1000, + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + const data = JSON.parse(res.body.message); + expect(data).to.not.have.a.property('result').that.is.an('object'); + expect(data).to.have.a.property('error').that.is.an('object'); + }); + await request + .get(api('chat.getMessage')) + .set(credentials) + .query({ msgId }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + }); + }); }); describe('[@updateMessage]', () => { @@ -3180,4 +3221,78 @@ describe('Meteor.methods', () => { }); }); }); + + describe('@insertOrUpdateUser', () => { + let testUser: TestUser; + let testUserCredentials: Credentials; + + before(async () => { + testUser = await createUser(); + testUserCredentials = await login(testUser.username, password); + }); + + after(() => Promise.all([deleteUser(testUser)])); + + it('should fail if user tries to verify their own email via insertOrUpdateUser', (done) => { + void request + .post(methodCall('insertOrUpdateUser')) + .set(testUserCredentials) + .send({ + message: JSON.stringify({ + method: 'insertOrUpdateUser', + params: [ + { + _id: testUserCredentials['X-User-Id'], + email: 'manager@rocket.chat', + verified: true, + }, + ], + id: '52', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('msg', 'result'); + expect(data).to.have.a.property('id', '52'); + expect(data.error).to.have.property('error', 'error-action-not-allowed'); + }) + .end(done); + }); + + it('should pass if a user with the right permissions tries to verify the email of another user', (done) => { + void request + .post(methodCall('insertOrUpdateUser')) + .set(credentials) + .send({ + message: JSON.stringify({ + method: 'insertOrUpdateUser', + params: [ + { + _id: testUserCredentials['X-User-Id'], + email: 'testuser@rocket.chat', + verified: true, + }, + ], + id: '52', + msg: 'method', + }), + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.a.property('success', true); + expect(res.body).to.have.a.property('message').that.is.a('string'); + const data = JSON.parse(res.body.message); + expect(data).to.have.a.property('msg', 'result'); + expect(data).to.have.a.property('id', '52'); + expect(data).to.have.a.property('result', true); + }) + .end(done); + }); + }); }); diff --git a/apps/meteor/tests/end-to-end/api/methods/2fa-enable.ts b/apps/meteor/tests/end-to-end/api/methods/2fa-enable.ts new file mode 100644 index 000000000000..a2bd9dfeb3a7 --- /dev/null +++ b/apps/meteor/tests/end-to-end/api/methods/2fa-enable.ts @@ -0,0 +1,158 @@ +import type { IUser } from '@rocket.chat/core-typings'; +import { Random } from '@rocket.chat/random'; +import { expect } from 'chai'; +import { before, describe, it, after } from 'mocha'; +import speakeasy from 'speakeasy'; + +import { getCredentials, methodCall, request } from '../../../data/api-data'; +import { password } from '../../../data/user'; +import { createUser, deleteUser, login } from '../../../data/users.helper'; + +describe('2fa:enable', function () { + this.retries(0); + let totpSecret: string; + let user1: IUser; + let user2: IUser; + let user3: IUser; + let user1Credentials: { 'X-Auth-Token': string; 'X-User-Id': string }; + let user2Credentials: { 'X-Auth-Token': string; 'X-User-Id': string }; + let user3Credentials: { 'X-Auth-Token': string; 'X-User-Id': string }; + + before((done) => getCredentials(done)); + + before('create user', async () => { + [user1, user2, user3] = await Promise.all([ + createUser({ username: Random.id(), email: `${Random.id()}@example.com`, verified: true }), + createUser({ username: Random.id(), email: `${Random.id()}@example.com}`, verified: true }), + createUser({ username: Random.id(), email: `${Random.id()}@example.com}`, verified: false }), + ]); + [user1Credentials, user2Credentials, user3Credentials] = await Promise.all([ + login(user1.username, password), + login(user2.username, password), + login(user3.username, password), + ]); + }); + + after('remove user', async () => Promise.all([deleteUser(user1), deleteUser(user2), deleteUser(user3)])); + + it('should return error when user is not logged in', async () => { + await request + .post(methodCall('2fa:enable')) + .send({ + message: JSON.stringify({ + msg: 'method', + id: 'id1', + method: '2fa:enable', + params: [], + }), + }) + .expect(401) + .expect((res) => { + expect(res.body).to.have.property('status', 'error'); + }); + }); + + it('should return error when user is not verified', async () => { + await request + .post(methodCall('2fa:enable')) + .set(user3Credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: 'id1', + method: '2fa:enable', + params: [], + }), + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('message'); + const result = JSON.parse(res.body.message); + expect(result).to.have.property('error'); + expect(result.error).to.not.have.property('errpr', 'error-invalid-user'); + }); + }); + + it('should return secret and qr code url when 2fa is disabled on user', async () => { + await request + .post(methodCall('2fa:enable')) + .set(user1Credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: 'id1', + method: '2fa:enable', + params: [], + }), + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + const parsedBody = JSON.parse(res.body.message); + expect(parsedBody).to.have.property('result'); + expect(parsedBody.result).to.have.property('secret').of.a('string'); + expect(parsedBody.result) + .to.have.property('url') + .of.a('string') + .match(/^otpauth:\/\//); + }); + }); + + it('should enable 2fa on the user', async () => { + const enableResponse = await request + .post(methodCall('2fa:enable')) + .set(user2Credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: 'id2', + method: '2fa:enable', + params: [], + }), + }) + .expect(200); + + const enableData = JSON.parse(enableResponse.body.message); + totpSecret = enableData.result.secret; + + await request + .post(methodCall('2fa:validateTempToken')) + .set(user2Credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: 'id3', + method: '2fa:validateTempToken', + params: [speakeasy.totp({ secret: totpSecret, encoding: 'base32' })], + }), + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + const parsedBody = JSON.parse(res.body.message); + expect(parsedBody).to.have.property('result'); + expect(parsedBody.result).to.have.property('codes').of.a('array'); + }); + }); + + it('should return error when 2fa is already enabled on the user', async () => { + await request + .post(methodCall('2fa:enable')) + .set(user2Credentials) + .send({ + message: JSON.stringify({ + msg: 'method', + id: 'id4', + method: '2fa:enable', + params: [], + }), + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + const parsedBody = JSON.parse(res.body.message); + expect(parsedBody).to.have.property('error'); + expect(parsedBody).to.not.have.property('result'); + }); + }); +}); diff --git a/apps/meteor/tests/end-to-end/api/rooms.ts b/apps/meteor/tests/end-to-end/api/rooms.ts index a8d64b1f4c7d..d59d3722f1a4 100644 --- a/apps/meteor/tests/end-to-end/api/rooms.ts +++ b/apps/meteor/tests/end-to-end/api/rooms.ts @@ -2129,12 +2129,15 @@ describe('[Rooms]', () => { describe('rooms.saveRoomSettings', () => { let testChannel: IRoom; const randomString = `randomString${Date.now()}`; + const teamName = `team-${Date.now()}`; let discussion: IRoom; + let testTeam: ITeam; before(async () => { const result = await createRoom({ type: 'c', name: `channel.test.${Date.now()}-${Math.random()}` }); testChannel = result.body.channel; + const resTeam = await request.post(api('teams.create')).set(credentials).send({ name: teamName, type: 0 }); const resDiscussion = await request .post(api('rooms.createDiscussion')) .set(credentials) @@ -2143,10 +2146,17 @@ describe('[Rooms]', () => { t_name: `discussion-create-from-tests-${testChannel.name}`, }); + testTeam = resTeam.body.team; discussion = resDiscussion.body.discussion; }); - after(() => Promise.all([deleteRoom({ type: 'p', roomId: discussion._id }), deleteRoom({ type: 'p', roomId: testChannel._id })])); + after(() => + Promise.all([ + deleteRoom({ type: 'p', roomId: discussion._id }), + deleteTeam(credentials, testTeam.name), + deleteRoom({ type: 'p', roomId: testChannel._id }), + ]), + ); it('should update the room settings', (done) => { const imageDataUri = `data:image/png;base64,${fs.readFileSync(path.join(process.cwd(), imgURL)).toString('base64')}`; @@ -2290,6 +2300,64 @@ describe('[Rooms]', () => { expect(res.body.room).to.not.have.property('favorite'); }); }); + it('should update the team sidepanel items to channels and discussions', async () => { + const sidepanelItems = ['channels', 'discussions']; + const response = await request + .post(api('rooms.saveRoomSettings')) + .set(credentials) + .send({ + rid: testTeam.roomId, + sidepanel: { items: sidepanelItems }, + }) + .expect('Content-Type', 'application/json') + .expect(200); + + expect(response.body).to.have.property('success', true); + + const channelInfoResponse = await request + .get(api('channels.info')) + .set(credentials) + .query({ roomId: response.body.rid }) + .expect('Content-Type', 'application/json') + .expect(200); + + expect(channelInfoResponse.body).to.have.property('success', true); + expect(channelInfoResponse.body.channel).to.have.property('sidepanel'); + expect(channelInfoResponse.body.channel.sidepanel).to.have.property('items').that.is.an('array').to.have.deep.members(sidepanelItems); + }); + it('should throw error when updating team sidepanel with incorrect items', async () => { + const sidepanelItems = ['wrong']; + await request + .post(api('rooms.saveRoomSettings')) + .set(credentials) + .send({ + rid: testTeam.roomId, + sidepanel: { items: sidepanelItems }, + }) + .expect(400); + }); + it('should throw error when updating team sidepanel with more than 2 items', async () => { + const sidepanelItems = ['channels', 'discussions', 'extra']; + await request + .post(api('rooms.saveRoomSettings')) + .set(credentials) + .send({ + rid: testTeam.roomId, + sidepanel: { items: sidepanelItems }, + }) + .expect(400); + }); + it('should throw error when updating team sidepanel with duplicated items', async () => { + const sidepanelItems = ['channels', 'channels']; + await request + .post(api('rooms.saveRoomSettings')) + .set(credentials) + .send({ + rid: testTeam.roomId, + sidepanel: { items: sidepanelItems }, + }) + .expect(400); + }); }); describe('rooms.images', () => { diff --git a/apps/meteor/tests/end-to-end/api/subscriptions.ts b/apps/meteor/tests/end-to-end/api/subscriptions.ts index c1df85bafccd..a03179569615 100644 --- a/apps/meteor/tests/end-to-end/api/subscriptions.ts +++ b/apps/meteor/tests/end-to-end/api/subscriptions.ts @@ -50,8 +50,36 @@ describe('[Subscriptions]', () => { .end(done); }); - it('/subscriptions.getOne:', () => { - it('subscriptions.getOne', (done) => { + describe('/subscriptions.getOne', () => { + it('should fail if no roomId provided', (done) => { + void request + .get(api('subscriptions.getOne')) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body).to.have.property('error', "must have required property 'roomId' [invalid-params]"); + }) + .end(done); + }); + + it('should fail if not logged in', (done) => { + void request + .get(api('subscriptions.getOne')) + .query({ + roomId: testChannel._id, + }) + .expect('Content-Type', 'application/json') + .expect(401) + .expect((res) => { + expect(res.body).to.have.property('status', 'error'); + expect(res.body).to.have.property('message'); + }) + .end(done); + }); + + it('should return the subscription with success', (done) => { void request .get(api('subscriptions.getOne')) .set(credentials) @@ -66,6 +94,52 @@ describe('[Subscriptions]', () => { }) .end(done); }); + + it('should keep subscription as read after sending a message', async () => { + await request + .get(api('subscriptions.getOne')) + .set(credentials) + .query({ + roomId: testChannel._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').and.to.be.an('object'); + expect(res.body.subscription).to.have.property('alert', false); + }); + + await request + .post(api('chat.sendMessage')) + .set(credentials) + .send({ + message: { + rid: testChannel._id, + msg: 'Sample message', + }, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('message').and.to.be.an('object'); + }); + + await request + .get(api('subscriptions.getOne')) + .set(credentials) + .query({ + roomId: testChannel._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').and.to.be.an('object'); + expect(res.body.subscription).to.have.property('alert', false); + }); + }); }); describe('[/subscriptions.read]', () => { diff --git a/apps/meteor/tests/end-to-end/api/teams.ts b/apps/meteor/tests/end-to-end/api/teams.ts index 99689650384d..425d0039e502 100644 --- a/apps/meteor/tests/end-to-end/api/teams.ts +++ b/apps/meteor/tests/end-to-end/api/teams.ts @@ -172,6 +172,84 @@ describe('[Teams]', () => { }) .end(done); }); + + it('should create a team with sidepanel items containing channels', async () => { + const teamName = `test-team-with-sidepanel-${Date.now()}`; + const sidepanelItems = ['channels']; + + const response = await request + .post(api('teams.create')) + .set(credentials) + .send({ + name: teamName, + type: 0, + sidepanel: { + items: sidepanelItems, + }, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + }); + + await request + .get(api('channels.info')) + .set(credentials) + .query({ roomId: response.body.team.roomId }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((response) => { + expect(response.body).to.have.property('success', true); + expect(response.body.channel).to.have.property('sidepanel'); + expect(response.body.channel.sidepanel).to.have.property('items').that.is.an('array').to.have.deep.members(sidepanelItems); + }); + await deleteTeam(credentials, teamName); + }); + + it('should throw error when creating a team with sidepanel with more than 2 items', async () => { + await request + .post(api('teams.create')) + .set(credentials) + .send({ + name: `test-team-with-sidepanel-error-${Date.now()}`, + type: 0, + sidepanel: { + items: ['channels', 'discussion', 'other'], + }, + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + + it('should throw error when creating a team with sidepanel with incorrect items', async () => { + await request + .post(api('teams.create')) + .set(credentials) + .send({ + name: `test-team-with-sidepanel-error-${Date.now()}`, + type: 0, + sidepanel: { + items: ['other'], + }, + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); + it('should throw error when creating a team with sidepanel with duplicated items', async () => { + await request + .post(api('teams.create')) + .set(credentials) + .send({ + name: `test-team-with-sidepanel-error-${Date.now()}`, + type: 0, + sidepanel: { + items: ['channels', 'channels'], + }, + }) + .expect('Content-Type', 'application/json') + .expect(400); + }); }); describe('/teams.convertToChannel', () => { diff --git a/apps/meteor/tests/end-to-end/api/users.ts b/apps/meteor/tests/end-to-end/api/users.ts index 8a4c89973008..d6112dd2416b 100644 --- a/apps/meteor/tests/end-to-end/api/users.ts +++ b/apps/meteor/tests/end-to-end/api/users.ts @@ -622,6 +622,23 @@ describe('[Users]', () => { }) .end(done); }); + it("should return an error when registering a user's name with invalid characters: >, <, /, or \\", (done) => { + void request + .post(api('users.register')) + .send({ + email, + name: '', + username, + pass: 'test', + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body).to.have.property('error').and.to.be.equal('Name contains invalid characters'); + }) + .end(done); + }); }); describe('[/users.info]', () => { @@ -1325,6 +1342,21 @@ describe('[Users]', () => { }); }); }); + it('should prevent users from passing server-side request forgery (SSRF) payloads as avatarUrl', (done) => { + void request + .post(api('users.setAvatar')) + .set(credentials) + .send({ + userId: userCredentials['X-User-Id'], + avatarUrl: 'http://169.254.169.254/', + }) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + }) + .end(done); + }); }); describe('[/users.resetAvatar]', () => { diff --git a/apps/meteor/tests/end-to-end/apps/installation.ts b/apps/meteor/tests/end-to-end/apps/installation.ts index a3cfd3c17ce0..e3484eb81543 100644 --- a/apps/meteor/tests/end-to-end/apps/installation.ts +++ b/apps/meteor/tests/end-to-end/apps/installation.ts @@ -100,9 +100,10 @@ describe('Apps - Installation', () => { .expect(200) .expect((res) => { expect(res.body).to.have.a.property('success', true); - expect(res.body).to.have.a.property('data').that.is.an('array').with.lengthOf(2); + expect(res.body).to.have.a.property('data').that.is.an('array').with.lengthOf(3); expect(res.body.data[0]).to.be.an('object').with.a.property('key').equal('test'); - expect(res.body.data[1]).to.be.an('object').with.a.property('key').equal('unconfigured'); + expect(res.body.data[1]).to.be.an('object').with.a.property('key').equal('persistentchat'); + expect(res.body.data[2]).to.be.an('object').with.a.property('key').equal('unconfigured'); }) .end(done); }); diff --git a/apps/meteor/tests/end-to-end/apps/video-conferences.ts b/apps/meteor/tests/end-to-end/apps/video-conferences.ts index 8d29eee97b7d..65727168c47f 100644 --- a/apps/meteor/tests/end-to-end/apps/video-conferences.ts +++ b/apps/meteor/tests/end-to-end/apps/video-conferences.ts @@ -69,6 +69,18 @@ describe('Apps - Video Conferences', () => { before(async () => { await cleanupApps(); await installTestApp(); + await updateSetting('Discussion_enabled', true); + }); + + after(async () => { + await updateSetting('VideoConf_Default_Provider', ''); + await updateSetting('Discussion_enabled', true); + if (!process.env.IS_EE) { + return; + } + + await updateSetting('VideoConf_Enable_Persistent_Chat', false); + await updateSetting('VideoConf_Persistent_Chat_Discussion_Name', 'Conference Call Chat History'); }); describe('[/video-conference.capabilities]', () => { @@ -125,6 +137,7 @@ describe('Apps - Video Conferences', () => { expect(res.body.capabilities).to.have.a.property('mic').equal(true); expect(res.body.capabilities).to.have.a.property('cam').equal(false); expect(res.body.capabilities).to.have.a.property('title').equal(true); + expect(res.body.capabilities).to.have.a.property('persistentChat').equal(false); }); }); }); @@ -233,6 +246,82 @@ describe('Apps - Video Conferences', () => { expect(res.body.data).to.have.a.property('callId').that.is.a('string'); }); }); + + it('should start a call successfully when using a provider that supports persistent chat', async function () { + if (!process.env.IS_EE) { + this.skip(); + return; + } + + await updateSetting('VideoConf_Default_Provider', 'persistentchat'); + await updateSetting('VideoConf_Enable_Persistent_Chat', true); + + await request + .post(api('video-conference.start')) + .set(credentials) + .send({ + roomId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body.data).to.be.an('object'); + expect(res.body.data).to.have.a.property('providerName').equal('persistentchat'); + expect(res.body.data).to.have.a.property('type').equal('videoconference'); + expect(res.body.data).to.have.a.property('callId').that.is.a('string'); + }); + }); + + it('should start a call successfully when using a provider that supports persistent chat with the feature disabled', async function () { + if (!process.env.IS_EE) { + this.skip(); + return; + } + + await updateSetting('VideoConf_Default_Provider', 'persistentchat'); + await updateSetting('VideoConf_Enable_Persistent_Chat', false); + + await request + .post(api('video-conference.start')) + .set(credentials) + .send({ + roomId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body.data).to.be.an('object'); + expect(res.body.data).to.have.a.property('providerName').equal('persistentchat'); + expect(res.body.data).to.have.a.property('type').equal('videoconference'); + expect(res.body.data).to.have.a.property('callId').that.is.a('string'); + }); + }); + + it('should start a call successfully when using a provider that supports persistent chat with discussions disabled', async function () { + if (!process.env.IS_EE) { + this.skip(); + return; + } + + await updateSetting('VideoConf_Default_Provider', 'persistentchat'); + await updateSetting('VideoConf_Enable_Persistent_Chat', true); + await updateSetting('Discussion_enabled', false); + + await request + .post(api('video-conference.start')) + .set(credentials) + .send({ + roomId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body.data).to.be.an('object'); + expect(res.body.data).to.have.a.property('providerName').equal('persistentchat'); + expect(res.body.data).to.have.a.property('type').equal('videoconference'); + expect(res.body.data).to.have.a.property('callId').that.is.a('string'); + }); + }); }); describe('[/video-conference.join]', () => { @@ -323,55 +412,398 @@ describe('Apps - Video Conferences', () => { }); }); - describe('[/video-conference.list]', () => { - let callId1: string | undefined; - let callId2: string | undefined; + describe('[video-conference.start + video-conference.info]', () => { + describe('[Test provider with the persistent chat feature disabled]', () => { + let callId: string | undefined; - before(async () => { - await updateSetting('VideoConf_Default_Provider', 'test'); - const res = await request.post(api('video-conference.start')).set(credentials).send({ - roomId, + before(async () => { + await updateSetting('VideoConf_Default_Provider', 'test'); + await updateSetting('Discussion_enabled', true); + + if (process.env.IS_EE) { + await updateSetting('VideoConf_Enable_Persistent_Chat', false); + } + const res = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + + callId = res.body.data.callId; }); - callId1 = res.body.data.callId; - const res2 = await request.post(api('video-conference.start')).set(credentials).send({ - roomId, + it('should load the video conference data successfully', async () => { + await request + .get(api('video-conference.info')) + .set(credentials) + .query({ + callId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body).to.have.a.property('providerName').equal('test'); + expect(res.body).to.not.have.a.property('providerData'); + expect(res.body).to.have.a.property('_id').equal(callId); + expect(res.body).to.have.a.property('url').equal(`test/videoconference/${callId}/${roomName}`); + expect(res.body).to.have.a.property('type').equal('videoconference'); + expect(res.body).to.have.a.property('rid').equal(roomId); + expect(res.body).to.have.a.property('users').that.is.an('array').with.lengthOf(0); + expect(res.body).to.have.a.property('status').equal(1); + expect(res.body).to.have.a.property('title').equal(roomName); + expect(res.body).to.have.a.property('messages').that.is.an('object'); + expect(res.body.messages).to.have.a.property('started').that.is.a('string'); + expect(res.body).to.have.a.property('createdBy').that.is.an('object'); + expect(res.body.createdBy).to.have.a.property('_id').equal(credentials['X-User-Id']); + expect(res.body.createdBy).to.have.a.property('username').equal(adminUsername); + expect(res.body).to.not.have.a.property('discussionRid'); + }); }); + }); + + describe('[Test provider with the persistent chat feature enabled]', () => { + let callId: string | undefined; + + before(async () => { + if (!process.env.IS_EE) { + return; + } - callId2 = res2.body.data.callId; + await updateSetting('VideoConf_Default_Provider', 'test'); + await updateSetting('Discussion_enabled', true); + await updateSetting('VideoConf_Enable_Persistent_Chat', true); + const res = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + + callId = res.body.data.callId; + }); + + it('should load the video conference data successfully', async function () { + if (!process.env.IS_EE) { + this.skip(); + return; + } + + await request + .get(api('video-conference.info')) + .set(credentials) + .query({ + callId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body).to.have.a.property('providerName').equal('test'); + expect(res.body).to.not.have.a.property('providerData'); + expect(res.body).to.have.a.property('_id').equal(callId); + expect(res.body).to.have.a.property('url').equal(`test/videoconference/${callId}/${roomName}`); + expect(res.body).to.have.a.property('type').equal('videoconference'); + expect(res.body).to.have.a.property('rid').equal(roomId); + expect(res.body).to.have.a.property('users').that.is.an('array').with.lengthOf(0); + expect(res.body).to.have.a.property('status').equal(1); + expect(res.body).to.have.a.property('title').equal(roomName); + expect(res.body).to.have.a.property('messages').that.is.an('object'); + expect(res.body.messages).to.have.a.property('started').that.is.a('string'); + expect(res.body).to.have.a.property('createdBy').that.is.an('object'); + expect(res.body.createdBy).to.have.a.property('_id').equal(credentials['X-User-Id']); + expect(res.body.createdBy).to.have.a.property('username').equal(adminUsername); + expect(res.body).to.not.have.a.property('discussionRid'); + }); + }); }); - it('should load the list of video conferences sorted by new', async () => { - await request - .get(api('video-conference.list')) - .set(credentials) - .query({ + describe('[Persistent Chat provider with the persistent chat feature enabled]', () => { + let callId: string | undefined; + let discussionRid: string | undefined; + + before(async () => { + if (!process.env.IS_EE) { + return; + } + + await updateSetting('VideoConf_Default_Provider', 'persistentchat'); + await updateSetting('Discussion_enabled', true); + await updateSetting('VideoConf_Enable_Persistent_Chat', true); + await updateSetting('VideoConf_Persistent_Chat_Discussion_Name', 'Chat History'); + const res = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + + callId = res.body.data.callId; + }); + + it('should include a discussion room id on the response', async function () { + if (!process.env.IS_EE) { + this.skip(); + return; + } + + await request + .get(api('video-conference.info')) + .set(credentials) + .query({ + callId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body).to.have.a.property('providerName').equal('persistentchat'); + expect(res.body).to.not.have.a.property('providerData'); + expect(res.body).to.have.a.property('_id').equal(callId); + expect(res.body).to.have.a.property('discussionRid').that.is.a('string'); + + discussionRid = res.body.discussionRid; + expect(res.body).to.have.a.property('url').equal(`pchat/videoconference/${callId}/${discussionRid}`); + }); + }); + + it('should have created the discussion room using the configured name', async function () { + if (!process.env.IS_EE) { + this.skip(); + return; + } + + await request + .get(api('rooms.info')) + .set(credentials) + .query({ + roomId: discussionRid, + }) + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('room').and.to.be.an('object'); + expect(res.body.room).to.have.a.property('_id').equal(discussionRid); + expect(res.body.room) + .to.have.a.property('fname') + .that.is.a('string') + .that.satisfies((msg: string) => msg.startsWith('Chat History')); + }); + }); + }); + + describe('[Persistent Chat provider with the persistent chat feature disabled]', () => { + let callId: string | undefined; + + before(async () => { + await updateSetting('VideoConf_Default_Provider', 'persistentchat'); + await updateSetting('Discussion_enabled', true); + if (process.env.IS_EE) { + await updateSetting('VideoConf_Enable_Persistent_Chat', false); + } + const res = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + + callId = res.body.data.callId; + }); + + it('should not include a discussion room id on the response', async () => { + await request + .get(api('video-conference.info')) + .set(credentials) + .query({ + callId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body).to.have.a.property('providerName').equal('persistentchat'); + expect(res.body).to.not.have.a.property('providerData'); + expect(res.body).to.have.a.property('_id').equal(callId); + expect(res.body).to.not.have.a.property('discussionRid'); + + expect(res.body).to.have.a.property('url').equal(`pchat/videoconference/${callId}/none`); + }); + }); + }); + + describe('[Persistent Chat provider with the persistent chat feature enabled but discussions disabled]', () => { + let callId: string | undefined; + + before(async () => { + if (!process.env.IS_EE) { + return; + } + + await updateSetting('VideoConf_Default_Provider', 'persistentchat'); + await updateSetting('Discussion_enabled', false); + await updateSetting('VideoConf_Enable_Persistent_Chat', true); + const res = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + + callId = res.body.data.callId; + }); + + it('should not include a discussion room id on the response', async function () { + if (!process.env.IS_EE) { + this.skip(); + return; + } + + await request + .get(api('video-conference.info')) + .set(credentials) + .query({ + callId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body).to.have.a.property('providerName').equal('persistentchat'); + expect(res.body).to.not.have.a.property('providerData'); + expect(res.body).to.have.a.property('_id').equal(callId); + expect(res.body).to.not.have.a.property('discussionRid'); + + expect(res.body).to.have.a.property('url').equal(`pchat/videoconference/${callId}/none`); + }); + }); + }); + }); + + describe('[/video-conference.list]', () => { + describe('[Test provider]', () => { + let callId1: string | undefined; + let callId2: string | undefined; + + before(async () => { + await updateSetting('VideoConf_Default_Provider', 'test'); + await updateSetting('Discussion_enabled', true); + const res = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + callId1 = res.body.data.callId; + + const res2 = await request.post(api('video-conference.start')).set(credentials).send({ roomId, - }) - .expect(200) - .expect((res: Response) => { - expect(res.body.success).to.be.equal(true); - expect(res.body).to.have.a.property('count').that.is.greaterThanOrEqual(2); - expect(res.body).to.have.a.property('data').that.is.an('array').with.lengthOf(res.body.count); - - const call2 = res.body.data[0]; - const call1 = res.body.data[1]; - - expect(call1).to.have.a.property('_id').equal(callId1); - expect(call1).to.have.a.property('url').equal(`test/videoconference/${callId1}/${roomName}`); - expect(call1).to.have.a.property('type').equal('videoconference'); - expect(call1).to.have.a.property('rid').equal(roomId); - expect(call1).to.have.a.property('users').that.is.an('array').with.lengthOf(0); - expect(call1).to.have.a.property('status').equal(1); - expect(call1).to.have.a.property('title').equal(roomName); - expect(call1).to.have.a.property('messages').that.is.an('object'); - expect(call1.messages).to.have.a.property('started').that.is.a('string'); - expect(call1).to.have.a.property('createdBy').that.is.an('object'); - expect(call1.createdBy).to.have.a.property('_id').equal(credentials['X-User-Id']); - expect(call1.createdBy).to.have.a.property('username').equal(adminUsername); - - expect(call2).to.have.a.property('_id').equal(callId2); }); + + callId2 = res2.body.data.callId; + }); + + it('should load the list of video conferences sorted by new', async () => { + await request + .get(api('video-conference.list')) + .set(credentials) + .query({ + roomId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body).to.have.a.property('count').that.is.greaterThanOrEqual(2); + expect(res.body).to.have.a.property('data').that.is.an('array').with.lengthOf(res.body.count); + + const call2 = res.body.data[0]; + const call1 = res.body.data[1]; + + expect(call1).to.have.a.property('_id').equal(callId1); + expect(call1).to.have.a.property('url').equal(`test/videoconference/${callId1}/${roomName}`); + expect(call1).to.have.a.property('type').equal('videoconference'); + expect(call1).to.have.a.property('rid').equal(roomId); + expect(call1).to.have.a.property('users').that.is.an('array').with.lengthOf(0); + expect(call1).to.have.a.property('status').equal(1); + expect(call1).to.have.a.property('title').equal(roomName); + expect(call1).to.have.a.property('messages').that.is.an('object'); + expect(call1.messages).to.have.a.property('started').that.is.a('string'); + expect(call1).to.have.a.property('createdBy').that.is.an('object'); + expect(call1.createdBy).to.have.a.property('_id').equal(credentials['X-User-Id']); + expect(call1.createdBy).to.have.a.property('username').equal(adminUsername); + expect(call1).to.not.have.a.property('discussionRid'); + + expect(call2).to.have.a.property('_id').equal(callId2); + }); + }); + }); + + describe('[Persistent Chat Provider]', () => { + let callId1: string | undefined; + let callId2: string | undefined; + let callId3: string | undefined; + let callId4: string | undefined; + + before(async () => { + if (!process.env.IS_EE) { + return; + } + + await updateSetting('Discussion_enabled', true); + await updateSetting('VideoConf_Default_Provider', 'test'); + const res = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + callId1 = res.body.data.callId; + + await updateSetting('VideoConf_Default_Provider', 'persistentchat'); + await updateSetting('VideoConf_Enable_Persistent_Chat', false); + const res2 = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + + callId2 = res2.body.data.callId; + + await updateSetting('VideoConf_Enable_Persistent_Chat', true); + const res3 = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + + callId3 = res3.body.data.callId; + + await updateSetting('Discussion_enabled', false); + const res4 = await request.post(api('video-conference.start')).set(credentials).send({ + roomId, + }); + + callId4 = res4.body.data.callId; + }); + + it('should load the list of video conferences sorted by new', async function () { + if (!process.env.IS_EE) { + this.skip(); + return; + } + + await request + .get(api('video-conference.list')) + .set(credentials) + .query({ + roomId, + }) + .expect(200) + .expect((res: Response) => { + expect(res.body.success).to.be.equal(true); + expect(res.body).to.have.a.property('count').that.is.greaterThanOrEqual(4); + expect(res.body).to.have.a.property('data').that.is.an('array').with.lengthOf(res.body.count); + + const call4 = res.body.data[0]; + const call3 = res.body.data[1]; + const call2 = res.body.data[2]; + const call1 = res.body.data[3]; + + expect(call1).to.have.a.property('_id').equal(callId1); + expect(call1).to.have.a.property('url').equal(`test/videoconference/${callId1}/${roomName}`); + expect(call1).to.have.a.property('type').equal('videoconference'); + expect(call1).to.have.a.property('rid').equal(roomId); + expect(call1).to.have.a.property('users').that.is.an('array').with.lengthOf(0); + expect(call1).to.have.a.property('status').equal(1); + expect(call1).to.have.a.property('title').equal(roomName); + expect(call1).to.have.a.property('messages').that.is.an('object'); + expect(call1.messages).to.have.a.property('started').that.is.a('string'); + expect(call1).to.have.a.property('createdBy').that.is.an('object'); + expect(call1.createdBy).to.have.a.property('_id').equal(credentials['X-User-Id']); + expect(call1.createdBy).to.have.a.property('username').equal(adminUsername); + expect(call1).to.not.have.a.property('discussionRid'); + + expect(call2).to.have.a.property('_id').equal(callId2); + expect(call2).to.not.have.a.property('discussionRid'); + + expect(call3).to.have.a.property('_id').equal(callId3); + expect(call3).to.have.a.property('discussionRid').that.is.a('string'); + + expect(call4).to.have.a.property('_id').equal(callId4); + expect(call4).to.not.have.a.property('discussionRid'); + }); + }); }); }); }); diff --git a/apps/meteor/tests/mocks/client/RouterContextMock.tsx b/apps/meteor/tests/mocks/client/RouterContextMock.tsx index 2831fe226adf..c81e92dbbdc4 100644 --- a/apps/meteor/tests/mocks/client/RouterContextMock.tsx +++ b/apps/meteor/tests/mocks/client/RouterContextMock.tsx @@ -115,6 +115,7 @@ const RouterContextMock = ({ defineRoutes: () => () => undefined, getRoutes: () => [], subscribeToRoutesChange: () => () => undefined, + getRoomRoute: () => ({ path: '/' }), }; }, [currentPath, navigate])} > diff --git a/apps/meteor/tests/mocks/client/ServerProviderMock.tsx b/apps/meteor/tests/mocks/client/ServerProviderMock.tsx index 6c07573f05b2..b661fea54379 100644 --- a/apps/meteor/tests/mocks/client/ServerProviderMock.tsx +++ b/apps/meteor/tests/mocks/client/ServerProviderMock.tsx @@ -69,14 +69,14 @@ const contextValue = { getStream, }; -type ServerProviderProps = { +type ServerProviderMockProps = { children?: ReactNode; callEndpoint?: ContextType['callEndpoint']; }; -const ServerProvider = ({ children, callEndpoint }: ServerProviderProps) => { +const ServerProviderMock = ({ children, callEndpoint }: ServerProviderMockProps) => { const value = useMemo(() => ({ ...contextValue, callEndpoint: callEndpoint ?? contextValue.callEndpoint }), [callEndpoint]); return ; }; -export default ServerProvider; +export default ServerProviderMock; diff --git a/apps/meteor/tests/mocks/client/blobUrls.ts b/apps/meteor/tests/mocks/client/blobUrls.ts deleted file mode 100644 index d56164c027ff..000000000000 --- a/apps/meteor/tests/mocks/client/blobUrls.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { v4 } from 'uuid'; - -export const enableBlobUrlsMock = (): void => { - const urlByBlob = new WeakMap(); - const blobByUrl = new Map(); - - window.URL.createObjectURL = (blob: Blob): string => { - const url = urlByBlob.get(blob) ?? `blob://${v4()}`; - urlByBlob.set(blob, url); - blobByUrl.set(url, blob); - return url; - }; - - window.URL.revokeObjectURL = (url: string): void => { - const blob = blobByUrl.get(url); - if (!blob) { - return; - } - - urlByBlob.delete(blob); - blobByUrl.delete(url); - }; -}; diff --git a/apps/meteor/tests/mocks/client/jsdom.ts b/apps/meteor/tests/mocks/client/jsdom.ts deleted file mode 100644 index 3398a619a932..000000000000 --- a/apps/meteor/tests/mocks/client/jsdom.ts +++ /dev/null @@ -1,9 +0,0 @@ -import globalJsdom from 'jsdom-global'; - -const testUrl = process.env.TEST_API_URL || 'http://localhost:3000'; - -export const enableJsdom = (): void => { - globalJsdom('', { - url: testUrl, - }); -}; diff --git a/apps/meteor/tests/mocks/client/meteor.ts b/apps/meteor/tests/mocks/client/meteor.ts new file mode 100644 index 000000000000..d8340ae7b3e7 --- /dev/null +++ b/apps/meteor/tests/mocks/client/meteor.ts @@ -0,0 +1,9 @@ +import { jest } from '@jest/globals'; + +export const Meteor = { + loginWithSamlToken: jest.fn((_token, callback: () => void) => callback()), +}; + +export const Mongo = { + Collection: class Collection {}, +}; diff --git a/apps/meteor/tests/mocks/data.ts b/apps/meteor/tests/mocks/data.ts index 5e48d89f7199..14f03a6bd9ab 100644 --- a/apps/meteor/tests/mocks/data.ts +++ b/apps/meteor/tests/mocks/data.ts @@ -255,3 +255,22 @@ export function createFakeMessageWithAttachment(overrides?: Partial): ...overrides, }; } + +const guestNames = faker.helpers.uniqueArray(faker.person.firstName, 1000); + +function pullNextVisitorName() { + const guestName = guestNames.pop(); + + if (!guestName) { + throw new Error('exhausted guest names'); + } + + return guestName; +} + +export function createFakeVisitor() { + return { + name: pullNextVisitorName(), + email: faker.internet.email(), + } as const; +} diff --git a/apps/meteor/tests/mocks/mockDate.ts b/apps/meteor/tests/mocks/mockDate.ts deleted file mode 100644 index 6591dfdf7b1b..000000000000 --- a/apps/meteor/tests/mocks/mockDate.ts +++ /dev/null @@ -1,12 +0,0 @@ -// you must use jest.useFakeTimers for this to work. -export const setDate = (minutes = 1, hours = 0, date = 1) => { - // June 12, 2024, 12:00 AM - const fakeDate = new Date(); - fakeDate.setFullYear(2024); - fakeDate.setMonth(5); - fakeDate.setDate(date); - fakeDate.setHours(hours); - fakeDate.setMinutes(minutes); - fakeDate.setSeconds(0); - jest.setSystemTime(fakeDate); -}; diff --git a/apps/meteor/tests/setup/cleanupTestingLibrary.ts b/apps/meteor/tests/setup/cleanupTestingLibrary.ts deleted file mode 100644 index 663890796ac8..000000000000 --- a/apps/meteor/tests/setup/cleanupTestingLibrary.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { cleanup } from '@testing-library/react'; - -/** - * Usually the testing library attachs its `cleanup` function by itself when an `afterEach` function is present at the - * global scope. It provides a simple mechanism for, e.g., unmounting React components after tests to avoid leaking - * memory and breaking the idempotence of subsequent tests. Despite working fine at a single run, when Mocha is run in - * _watch mode_ all hooks previously attached are discarded and reloaded from **tests files only**, and its supposed to - * work that way. - * - * See https://testing-library.com/docs/react-testing-library/setup#auto-cleanup-in-mochas-watch-mode - */ - -export const mochaHooks = { - afterEach(): void { - cleanup(); - }, -}; diff --git a/apps/meteor/tests/setup/hoistedReact.ts b/apps/meteor/tests/setup/hoistedReact.ts deleted file mode 100644 index 47a42b21fd95..000000000000 --- a/apps/meteor/tests/setup/hoistedReact.ts +++ /dev/null @@ -1,15 +0,0 @@ -// A UNINTENDED LOL-ZONE: SORRY FOR THIS -// ------------+----------+------------- -// /\O | _O | O -// /\/ | //|_ | /_ -// /\ | | | |\ -// / \ | /| | / | -// LOL LOL | LLOL | LOLLOL -// ------------+----------+------------- -// BLACK MAGIC FULL FEATURED ENABLED - -// As Meteor requires a disabled hoisting of dependencies, we end up with multiple React instances, -// despite having the same version. - -// eslint-disable-next-line @typescript-eslint/no-var-requires -Object.assign(require('../../node_modules/react'), require('../../../../node_modules/react')); diff --git a/apps/meteor/tests/setup/registerWebApiMocks.ts b/apps/meteor/tests/setup/registerWebApiMocks.ts deleted file mode 100644 index 83bf826fa0d0..000000000000 --- a/apps/meteor/tests/setup/registerWebApiMocks.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { enableBlobUrlsMock } from '../mocks/client/blobUrls'; -import { enableJsdom } from '../mocks/client/jsdom'; - -enableJsdom(); -enableBlobUrlsMock(); diff --git a/apps/meteor/tests/unit/app/apps/server/messages.tests.js b/apps/meteor/tests/unit/app/apps/server/messages.tests.js index 2959820e0df9..04866f6440b6 100644 --- a/apps/meteor/tests/unit/app/apps/server/messages.tests.js +++ b/apps/meteor/tests/unit/app/apps/server/messages.tests.js @@ -18,6 +18,9 @@ const { AppMessagesConverter } = proxyquire.noCallThru().load('../../../../../ap Messages: new MessagesMock(), Users: new UsersMock(), }, + '@rocket.chat/core-typings': { + isMessageFromVisitor: (message) => 'token' in message, + }, }); describe('The AppMessagesConverter instance', () => { diff --git a/apps/meteor/tests/unit/app/lib/server/lib/checkUrlForSsrf.tests.ts b/apps/meteor/tests/unit/app/lib/server/lib/checkUrlForSsrf.tests.ts new file mode 100644 index 000000000000..bcd4fe73026c --- /dev/null +++ b/apps/meteor/tests/unit/app/lib/server/lib/checkUrlForSsrf.tests.ts @@ -0,0 +1,69 @@ +import { expect } from 'chai'; +import p from 'proxyquire'; +import Sinon from 'sinon'; + +const lookupMock = Sinon.stub(); +const dnsLookup = (host: string, cb: (...args: any[]) => any) => { + return cb(null, lookupMock(host)); +}; + +const { checkUrlForSsrf } = p.noCallThru().load('../../../../../../app/lib/server/functions/checkUrlForSsrf.ts', { + dns: { + lookup: dnsLookup, + }, +}); + +describe('checkUrlForSsrf', () => { + beforeEach(() => { + lookupMock.reset(); + }); + it('should return false if the URL does not start with http:// or https://', async () => { + const result = await checkUrlForSsrf('ftp://example.com'); + expect(result).to.be.false; + }); + + it('should return false if the domain is not valid', async () => { + const result = await checkUrlForSsrf('https://www_google_com'); + expect(result).to.be.false; + }); + + it('should return false if the IP is not in a valid IPv4 format', async () => { + const result = await checkUrlForSsrf('https://127.1'); + expect(result).to.be.false; + }); + + it('should return false if the IP is in a restricted range', async () => { + const result = await checkUrlForSsrf('http://127.0.0.1'); + expect(result).to.be.false; + }); + + it('should return false if the domain is metadata.google.internal', async () => { + const result = await checkUrlForSsrf('http://metadata.google.internal'); + expect(result).to.be.false; + }); + + it('should return false if DNS resolves to an IP in the restricted range', async () => { + lookupMock.returns('127.0.0.1'); + const result = await checkUrlForSsrf('http://169.254.169.254.nip.io'); + expect(result).to.be.false; + }); + + it('should return true if valid domain', async () => { + lookupMock.returns('216.58.214.174'); + const result = await checkUrlForSsrf('https://www.google.com/'); + expect(result).to.be.true; + }); + + it('should return true if valid IP', async () => { + const result = await checkUrlForSsrf('http://216.58.214.174'); + expect(result).to.be.true; + }); + + it('should return true if valid URL', async () => { + lookupMock.returns('216.58.214.174'); + const result = await checkUrlForSsrf( + 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Cat_August_2010-4.jpg/2560px-Cat_August_2010-4.jpg', + ); + expect(result).to.be.true; + }); +}); diff --git a/apps/meteor/tests/unit/server/modules/watchers/lib/messages.spec.ts b/apps/meteor/tests/unit/app/lib/server/lib/notifyListener.spec.ts similarity index 74% rename from apps/meteor/tests/unit/server/modules/watchers/lib/messages.spec.ts rename to apps/meteor/tests/unit/app/lib/server/lib/notifyListener.spec.ts index 5ef8bbdd1634..60b01dcefd12 100644 --- a/apps/meteor/tests/unit/server/modules/watchers/lib/messages.spec.ts +++ b/apps/meteor/tests/unit/app/lib/server/lib/notifyListener.spec.ts @@ -9,7 +9,7 @@ describe('Message Broadcast Tests', () => { let messagesFindOneStub: sinon.SinonStub; let broadcastStub: sinon.SinonStub; let getMessageToBroadcast: any; - let broadcastMessageFromData: any; + let notifyOnMessageChange: any; let memStub: sinon.SinonStub; const sampleMessage: IMessage = { @@ -49,18 +49,14 @@ describe('Message Broadcast Tests', () => { broadcastStub = sinon.stub(); memStub = sinon.stub().callsFake((fn: any) => fn); - const proxyMock = proxyquire.noCallThru().load('../../../../../../server/modules/watchers/lib/messages', { + const proxyMock = proxyquire.noPreserveCache().load('../../../../../../app/lib/server/lib/notifyListener', { '@rocket.chat/models': modelsStubs(), '@rocket.chat/core-services': coreStubs(false), 'mem': memStub, }); getMessageToBroadcast = proxyMock.getMessageToBroadcast; - broadcastMessageFromData = proxyMock.broadcastMessageFromData; - }); - - afterEach(() => { - sinon.reset(); + notifyOnMessageChange = proxyMock.notifyOnMessageChange; }); describe('getMessageToBroadcast', () => { @@ -77,12 +73,19 @@ describe('Message Broadcast Tests', () => { const testCases = [ { - description: 'should return undefined if message is hidden or imported', + description: 'should return undefined if message is hidden', message: { ...sampleMessage, _hidden: true }, hideSystemMessages: [], useRealName: false, expectedResult: undefined, }, + { + description: 'should return undefined if message is imported', + message: { ...sampleMessage, imported: true }, + hideSystemMessages: [], + useRealName: false, + expectedResult: undefined, + }, { description: 'should hide message if type is in hideSystemMessage settings', message: sampleMessage, @@ -97,6 +100,26 @@ describe('Message Broadcast Tests', () => { useRealName: true, expectedResult: { ...sampleMessage, u: { ...sampleMessage.u, name: 'Real User' } }, }, + { + description: 'should return the message with mentions real name if useRealName is true', + message: { + ...sampleMessage, + mentions: [ + { _id: 'mention1', username: 'mention1', name: 'Mention 1' }, + { _id: 'mention2', username: 'mention2', name: 'Mention 2' }, + ], + }, + hideSystemMessages: [], + useRealName: true, + expectedResult: { + ...sampleMessage, + u: { ...sampleMessage.u, name: 'Real User' }, + mentions: [ + { _id: 'mention1', username: 'mention1', name: 'Mention 1' }, + { _id: 'mention2', username: 'mention2', name: 'Mention 2' }, + ], + }, + }, { description: 'should return the message if Hide_System_Messages is undefined', message: sampleMessage, @@ -162,7 +185,12 @@ describe('Message Broadcast Tests', () => { getSettingValueByIdStub.withArgs('UI_Use_Real_Name').resolves(useRealName); if (useRealName) { - usersFindOneStub.resolves({ name: 'Real User' }); + const realNames = + message.mentions && message.mentions.length > 0 + ? [message.u.name, ...message.mentions.map((mention) => mention.name)] + : [message.u.name]; + + realNames.forEach((user, index) => usersFindOneStub.onCall(index).resolves({ name: user })); } const result = await getMessageToBroadcast({ id: '123' }); @@ -172,14 +200,14 @@ describe('Message Broadcast Tests', () => { }); }); - describe('broadcastMessageFromData', () => { + describe('notifyOnMessageChange', () => { const setupProxyMock = (dbWatchersDisabled: boolean) => { - const proxyMock = proxyquire.noCallThru().load('../../../../../../server/modules/watchers/lib/messages', { + const proxyMock = proxyquire.noCallThru().load('../../../../../../app/lib/server/lib/notifyListener', { '@rocket.chat/models': modelsStubs(), '@rocket.chat/core-services': coreStubs(dbWatchersDisabled), 'mem': memStub, }); - broadcastMessageFromData = proxyMock.broadcastMessageFromData; + notifyOnMessageChange = proxyMock.notifyOnMessageChange; }; const testCases = [ @@ -187,25 +215,33 @@ describe('Message Broadcast Tests', () => { description: 'should broadcast the message if dbWatchersDisabled is true', dbWatchersDisabled: true, expectBroadcast: true, + message: sampleMessage, }, { description: 'should not broadcast the message if dbWatchersDisabled is false', dbWatchersDisabled: false, expectBroadcast: false, + message: sampleMessage, + }, + { + description: 'should not broadcast the message if there is no data attributes', + dbWatchersDisabled: true, + expectBroadcast: false, + message: null, }, ]; - testCases.forEach(({ description, dbWatchersDisabled, expectBroadcast }) => { + testCases.forEach(({ description, dbWatchersDisabled, expectBroadcast, message }) => { it(description, async () => { setupProxyMock(dbWatchersDisabled); - messagesFindOneStub.resolves(sampleMessage); + messagesFindOneStub.resolves(message); getSettingValueByIdStub.resolves([]); - await broadcastMessageFromData({ id: '123', data: sampleMessage }); + await notifyOnMessageChange({ id: '123', data: message }); if (expectBroadcast) { expect(broadcastStub.calledOnce).to.be.true; - expect(broadcastStub.calledOnceWith('watch.messages', { message: sampleMessage })).to.be.true; + expect(broadcastStub.calledOnceWith('watch.messages', { message })).to.be.true; } else { expect(broadcastStub.called).to.be.false; } diff --git a/apps/meteor/tests/unit/app/lib/server/lib/validateNameChars.tests.ts b/apps/meteor/tests/unit/app/lib/server/lib/validateNameChars.tests.ts new file mode 100644 index 000000000000..a78a0cbc3322 --- /dev/null +++ b/apps/meteor/tests/unit/app/lib/server/lib/validateNameChars.tests.ts @@ -0,0 +1,56 @@ +import { expect } from 'chai'; + +import { validateNameChars } from '../../../../../../app/lib/server/functions/validateNameChars'; + +describe('validateNameChars', () => { + it('should return false for undefined input', () => { + expect(validateNameChars(undefined)).to.be.false; + }); + + it('should return false for non-string input', () => { + expect(validateNameChars(123 as any)).to.be.false; + expect(validateNameChars({} as any)).to.be.false; + expect(validateNameChars([] as any)).to.be.false; + }); + + it('should return false for names with invalid characters', () => { + expect(validateNameChars('name<')).to.be.false; + expect(validateNameChars('name>')).to.be.false; + expect(validateNameChars('name/')).to.be.false; + expect(validateNameChars('name\\')).to.be.false; + }); + + it('should return false for names with invalid characters after decoding', () => { + expect(validateNameChars('name%3E')).to.be.false; + expect(validateNameChars('name%5C')).to.be.false; + expect(validateNameChars('name%3C')).to.be.false; + }); + + it('should return false for malicious HTML payloads', () => { + expect(validateNameChars('')).to.be.false; + expect(validateNameChars('%3Cscript%3Ealert%28%27XSS%27%29%3C%2Fscript%3E')).to.be.false; + expect( + validateNameChars( + '
    ', + ), + ).to.be.false; + expect( + validateNameChars( + '%3Cform%20action%3D%22http%3A%2F%2Fmalicious.site%22%20method%3D%22post%22%3E%3Cinput%20type%3D%22text%22%20name%3D%22username%22%20value%3D%22Enter%20username%22%3E%3Cinput%20type%3D%22password%22%20name%3D%22password%22%20value%3D%22Enter%20password%22%3E%3Cinput%20type%3D%22submit%22%20value%3D%22Submit%22%3E%3C%2Fform%3E', + ), + ).to.be.false; + }); + + it('should return false if decodeURI throws an error', () => { + expect(validateNameChars('%')).to.be.false; + expect(validateNameChars('%E0%A4%A')).to.be.false; + }); + + it('should return true for valid names', () => { + expect(validateNameChars('name')).to.be.true; + expect(validateNameChars('valid_name')).to.be.true; + expect(validateNameChars('valid-name')).to.be.true; + expect(validateNameChars('valid.name')).to.be.true; + expect(validateNameChars('valid name')).to.be.true; + }); +}); diff --git a/apps/meteor/tests/unit/app/livechat/server/lib/parseTranscriptRequest.spec.ts b/apps/meteor/tests/unit/app/livechat/server/lib/parseTranscriptRequest.spec.ts new file mode 100644 index 000000000000..a1b2ce52d1a3 --- /dev/null +++ b/apps/meteor/tests/unit/app/livechat/server/lib/parseTranscriptRequest.spec.ts @@ -0,0 +1,127 @@ +import { expect } from 'chai'; +import p from 'proxyquire'; +import sinon from 'sinon'; + +const modelsMock = { + Users: { + findOneById: sinon.stub(), + }, + LivechatVisitors: { + findOneById: sinon.stub(), + }, +}; + +const settingsGetMock = { + get: sinon.stub(), +}; + +const { parseTranscriptRequest } = p.noCallThru().load('../../../../../../app/livechat/server/lib/parseTranscriptRequest', { + '@rocket.chat/models': modelsMock, + '../../../settings/server': { settings: settingsGetMock }, +}); + +describe('parseTranscriptRequest', () => { + beforeEach(() => { + settingsGetMock.get.reset(); + modelsMock.Users.findOneById.reset(); + modelsMock.LivechatVisitors.findOneById.reset(); + }); + + it('should return `options` param with no changes when Livechat_enable_transcript setting is true', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(true); + const options = await parseTranscriptRequest({} as any, {} as any); + expect(options).to.be.deep.equal({}); + }); + + it('should return `options` param with no changes when send always is disabled', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(false); + settingsGetMock.get.withArgs('Livechat_transcript_send_always').returns(false); + const options = await parseTranscriptRequest({} as any, {} as any); + expect(options).to.be.deep.equal({}); + }); + + it('should return `options` param with no changes when visitor is not provided and its not found on db', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(false); + settingsGetMock.get.withArgs('Livechat_transcript_send_always').returns(true); + modelsMock.LivechatVisitors.findOneById.resolves(null); + + const options = await parseTranscriptRequest({ v: { _id: '123' } } as any, {} as any); + expect(options).to.be.deep.equal({}); + }); + + it('should return `options` param with no changes when visitor is passed but no email is found', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(false); + settingsGetMock.get.withArgs('Livechat_transcript_send_always').returns(true); + modelsMock.LivechatVisitors.findOneById.resolves({} as any); + + const options = await parseTranscriptRequest({ v: { _id: '123' } } as any, {} as any, { _id: '123' } as any); + expect(options).to.be.deep.equal({}); + }); + + it('should return `options` param with no changes when visitor is fetched from db, but no email is found', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(false); + settingsGetMock.get.withArgs('Livechat_transcript_send_always').returns(true); + modelsMock.LivechatVisitors.findOneById.resolves({} as any); + + const options = await parseTranscriptRequest({ v: { _id: '123' } } as any, {} as any); + expect(options).to.be.deep.equal({}); + }); + + it('should return `options` param with no changes when no user is passed, room is not being served and rocketcat is not present', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(false); + settingsGetMock.get.withArgs('Livechat_transcript_send_always').returns(true); + modelsMock.Users.findOneById.resolves(null); + modelsMock.LivechatVisitors.findOneById.resolves({ visitorEmails: [{ address: 'abc@rocket.chat' }] } as any); + + const options = await parseTranscriptRequest({ v: { _id: '123' } } as any, {} as any); + expect(options).to.be.deep.equal({}); + }); + + it('should return `options` param with `transcriptRequest` key attached when user is passed', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(false); + settingsGetMock.get.withArgs('Livechat_transcript_send_always').returns(true); + modelsMock.LivechatVisitors.findOneById.resolves({ visitorEmails: [{ address: 'abc@rocket.chat' }] } as any); + + const options = await parseTranscriptRequest({ v: { _id: '123' } } as any, {} as any, undefined, { _id: '123' } as any); + + expect(modelsMock.LivechatVisitors.findOneById.getCall(0).firstArg).to.be.equal('123'); + expect(options).to.have.property('emailTranscript').that.is.an('object'); + expect(options.emailTranscript.requestData).to.have.property('email', 'abc@rocket.chat'); + expect(options.emailTranscript.requestData).to.have.property('subject', ''); + expect(options.emailTranscript.requestData.requestedBy).to.be.deep.equal({ _id: '123' }); + }); + + it('should return `options` param with `transcriptRequest` key attached when no user is passed, but theres an agent serving the room', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(false); + settingsGetMock.get.withArgs('Livechat_transcript_send_always').returns(true); + modelsMock.Users.findOneById.resolves({ _id: '123', username: 'kevsxxx', name: 'Kev' } as any); + modelsMock.LivechatVisitors.findOneById.resolves({ visitorEmails: [{ address: 'abc@rocket.chat' }] } as any); + + const options = await parseTranscriptRequest({ v: { _id: '123' }, servedBy: { _id: '123' } } as any, {} as any); + + expect(modelsMock.Users.findOneById.getCall(0).firstArg).to.be.equal('123'); + expect(options).to.have.property('emailTranscript').that.is.an('object'); + expect(options.emailTranscript.requestData).to.have.property('email', 'abc@rocket.chat'); + expect(options.emailTranscript.requestData).to.have.property('subject', ''); + expect(options.emailTranscript.requestData.requestedBy).to.be.deep.equal({ _id: '123', username: 'kevsxxx', name: 'Kev' }); + }); + + it('should return `options` param with `transcriptRequest` key attached when no user is passed, no agent is serving but rocket.cat is present', async () => { + settingsGetMock.get.withArgs('Livechat_enable_transcript').returns(false); + settingsGetMock.get.withArgs('Livechat_transcript_send_always').returns(true); + modelsMock.Users.findOneById.resolves({ _id: 'rocket.cat', username: 'rocket.cat', name: 'Rocket Cat' } as any); + modelsMock.LivechatVisitors.findOneById.resolves({ visitorEmails: [{ address: 'abc@rocket.chat' }] } as any); + + const options = await parseTranscriptRequest({ v: { _id: '123' } } as any, {} as any); + + expect(modelsMock.Users.findOneById.getCall(0).firstArg).to.be.equal('rocket.cat'); + expect(options).to.have.property('emailTranscript').that.is.an('object'); + expect(options.emailTranscript.requestData).to.have.property('email', 'abc@rocket.chat'); + expect(options.emailTranscript.requestData).to.have.property('subject', ''); + expect(options.emailTranscript.requestData.requestedBy).to.be.deep.equal({ + _id: 'rocket.cat', + username: 'rocket.cat', + name: 'Rocket Cat', + }); + }); +}); diff --git a/apps/meteor/tests/unit/app/livechat/server/lib/sendTranscript.spec.ts b/apps/meteor/tests/unit/app/livechat/server/lib/sendTranscript.spec.ts new file mode 100644 index 000000000000..64da050cfd88 --- /dev/null +++ b/apps/meteor/tests/unit/app/livechat/server/lib/sendTranscript.spec.ts @@ -0,0 +1,205 @@ +import { expect } from 'chai'; +import p from 'proxyquire'; +import sinon from 'sinon'; + +const modelsMock = { + LivechatRooms: { + findOneById: sinon.stub(), + }, + LivechatVisitors: { + getVisitorByToken: sinon.stub(), + }, + Messages: { + findLivechatClosingMessage: sinon.stub(), + findVisibleByRoomIdNotContainingTypesBeforeTs: sinon.stub(), + }, + Users: { + findOneById: sinon.stub(), + }, +}; + +const checkMock = sinon.stub(); + +const mockLogger = class { + debug() { + return null; + } + + error() { + return null; + } + + warn() { + return null; + } + + info() { + return null; + } +}; + +const mockSettingValues: Record = { + Livechat_show_agent_info: true, + Language: 'en', + From_Email: 'test@rocket.chat', +}; + +const settingsMock = function (key: string) { + return mockSettingValues[key] || null; +}; + +const getTimezoneMock = sinon.stub(); + +const mailerMock = sinon.stub(); + +const tStub = sinon.stub(); + +const { sendTranscript } = p.noCallThru().load('../../../../../../app/livechat/server/lib/sendTranscript', { + '@rocket.chat/models': modelsMock, + '@rocket.chat/logger': { Logger: mockLogger }, + 'meteor/check': { check: checkMock }, + '../../../../lib/callbacks': { + callbacks: { + run: sinon.stub(), + }, + }, + '../../../../server/lib/i18n': { i18n: { t: tStub } }, + '../../../mailer/server/api': { send: mailerMock }, + '../../../settings/server': { settings: { get: settingsMock } }, + '../../../utils/server/lib/getTimezone': { getTimezone: getTimezoneMock }, + // TODO: add tests for file handling on transcripts + '../../../file-upload/server': { FileUpload: {} }, +}); + +describe('Send transcript', () => { + beforeEach(() => { + checkMock.reset(); + modelsMock.LivechatRooms.findOneById.reset(); + modelsMock.LivechatVisitors.getVisitorByToken.reset(); + modelsMock.Messages.findLivechatClosingMessage.reset(); + modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.reset(); + modelsMock.Users.findOneById.reset(); + mailerMock.reset(); + tStub.reset(); + }); + it('should throw error when rid or email are invalid params', async () => { + checkMock.throws(new Error('Invalid params')); + await expect(sendTranscript({})).to.be.rejectedWith(Error); + }); + it('should throw error when visitor not found', async () => { + modelsMock.LivechatVisitors.getVisitorByToken.resolves(null); + await expect(sendTranscript({ rid: 'rid', email: 'email', logger: mockLogger })).to.be.rejectedWith(Error); + }); + it('should attempt to send an email when params are valid using default subject', async () => { + modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); + modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'token' } }); + modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.resolves([]); + tStub.returns('Conversation Transcript'); + + await sendTranscript({ + rid: 'rid', + token: 'token', + email: 'email', + user: { _id: 'x', name: 'x', utcOffset: '-6', username: 'x' }, + }); + + expect(getTimezoneMock.calledWith({ _id: 'x', name: 'x', utcOffset: '-6', username: 'x' })).to.be.true; + expect(modelsMock.Messages.findLivechatClosingMessage.calledWith('rid', { projection: { ts: 1 } })).to.be.true; + expect(modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.called).to.be.true; + expect( + mailerMock.calledWith({ + to: 'email', + from: 'test@rocket.chat', + subject: 'Conversation Transcript', + replyTo: 'test@rocket.chat', + html: '

    ', + }), + ).to.be.true; + }); + it('should use provided subject', async () => { + modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); + modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'token' } }); + modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.resolves([]); + + await sendTranscript({ + rid: 'rid', + token: 'token', + email: 'email', + subject: 'A custom subject', + user: { _id: 'x', name: 'x', utcOffset: '-6', username: 'x' }, + }); + + expect(getTimezoneMock.calledWith({ _id: 'x', name: 'x', utcOffset: '-6', username: 'x' })).to.be.true; + expect(modelsMock.Messages.findLivechatClosingMessage.calledWith('rid', { projection: { ts: 1 } })).to.be.true; + expect(modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.called).to.be.true; + expect( + mailerMock.calledWith({ + to: 'email', + from: 'test@rocket.chat', + subject: 'A custom subject', + replyTo: 'test@rocket.chat', + html: '

    ', + }), + ).to.be.true; + }); + it('should use subject from setting (when configured) when no subject provided', async () => { + modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); + modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'token' } }); + modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.resolves([]); + mockSettingValues.Livechat_transcript_email_subject = 'A custom subject obtained from setting.get'; + + await sendTranscript({ + rid: 'rid', + token: 'token', + email: 'email', + user: { _id: 'x', name: 'x', utcOffset: '-6', username: 'x' }, + }); + + expect(getTimezoneMock.calledWith({ _id: 'x', name: 'x', utcOffset: '-6', username: 'x' })).to.be.true; + expect(modelsMock.Messages.findLivechatClosingMessage.calledWith('rid', { projection: { ts: 1 } })).to.be.true; + expect(modelsMock.Messages.findVisibleByRoomIdNotContainingTypesBeforeTs.called).to.be.true; + expect( + mailerMock.calledWith({ + to: 'email', + from: 'test@rocket.chat', + subject: 'A custom subject obtained from setting.get', + replyTo: 'test@rocket.chat', + html: '

    ', + }), + ).to.be.true; + }); + it('should fail if room provided is invalid', async () => { + modelsMock.LivechatRooms.findOneById.resolves(null); + modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); + + await expect(sendTranscript({ rid: 'rid', email: 'email', logger: mockLogger })).to.be.rejectedWith(Error); + }); + + it('should fail if room provided is of different type', async () => { + modelsMock.LivechatRooms.findOneById.resolves({ t: 'c' }); + modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); + + await expect(sendTranscript({ rid: 'rid', email: 'email' })).to.be.rejectedWith(Error); + }); + + it('should fail if room is of valid type, but doesnt doesnt have `v` property', async () => { + modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); + modelsMock.LivechatRooms.findOneById.resolves({ t: 'l' }); + + await expect(sendTranscript({ rid: 'rid', email: 'email' })).to.be.rejectedWith(Error); + }); + + it('should fail if room is of valid type, has `v` prop, but it doesnt contain `token`', async () => { + modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); + modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { otherProp: 'xxx' } }); + + await expect(sendTranscript({ rid: 'rid', email: 'email' })).to.be.rejectedWith(Error); + }); + + it('should fail if room is of valid type, has `v.token`, but its different from the one on param (room from another visitor)', async () => { + modelsMock.LivechatVisitors.getVisitorByToken.resolves({ language: null }); + modelsMock.LivechatRooms.findOneById.resolves({ t: 'l', v: { token: 'xxx' } }); + + await expect(sendTranscript({ rid: 'rid', email: 'email', token: 'xveasdf' })).to.be.rejectedWith(Error); + }); +}); diff --git a/apps/meteor/tests/unit/app/settings/server/functions/compareSettingsMetadata.tests.ts b/apps/meteor/tests/unit/app/settings/server/functions/compareSettingsMetadata.tests.ts new file mode 100644 index 000000000000..e06249a8e7f8 --- /dev/null +++ b/apps/meteor/tests/unit/app/settings/server/functions/compareSettingsMetadata.tests.ts @@ -0,0 +1,28 @@ +import { expect } from 'chai'; + +import { compareSettings } from '../../../../../../app/settings/server/SettingsRegistry'; +import { getSettingDefaults } from '../../../../../../app/settings/server/functions/getSettingDefaults'; + +const testSetting = getSettingDefaults({ + _id: 'my_dummy_setting', + type: 'string', + value: 'dummy', +}); + +describe('#compareSettings', () => { + const ignoredKeys = ['value', 'ts', 'createdAt', 'valueSource', 'packageValue', 'processEnvValue', '_updatedAt']; + + ignoredKeys.forEach((key) => + it(`should return true if ${key} changes`, () => { + const copiedSetting: any = { ...testSetting }; + + if (['ts', 'createdAt', '_updatedAt'].includes(key)) { + copiedSetting[key] = new Date(); + } else { + copiedSetting[key] = 'random'; + } + + expect(compareSettings(testSetting, copiedSetting)).to.be.true; + }), + ); +}); diff --git a/apps/meteor/tests/unit/app/settings/server/functions/settings.tests.ts b/apps/meteor/tests/unit/app/settings/server/functions/settings.tests.ts index 272fa950a407..5f5001c0251d 100644 --- a/apps/meteor/tests/unit/app/settings/server/functions/settings.tests.ts +++ b/apps/meteor/tests/unit/app/settings/server/functions/settings.tests.ts @@ -3,13 +3,21 @@ import { beforeEach, describe, it } from 'mocha'; import { CachedSettings } from '../../../../../../app/settings/server/CachedSettings'; import { SettingsRegistry } from '../../../../../../app/settings/server/SettingsRegistry'; +import { getSettingDefaults } from '../../../../../../app/settings/server/functions/getSettingDefaults'; import { Settings } from '../../../../../../app/settings/server/functions/settings.mocks'; +const testSetting = getSettingDefaults({ + _id: 'my_dummy_setting', + type: 'string', + value: 'dummy', +}); + describe('Settings', () => { beforeEach(() => { Settings.insertCalls = 0; Settings.upsertCalls = 0; process.env = {}; + Settings.setDelay(0); }); it('should not insert the same setting twice', async () => { @@ -440,6 +448,123 @@ describe('Settings', () => { .to.not.have.any.keys('section'); }); + it('should ignore setting object from code if only value changes in code and setting already stored', async () => { + const settings = new CachedSettings(); + Settings.settings = settings; + settings.initialized(); + const settingsRegistry = new SettingsRegistry({ store: settings, model: Settings as any }); + + await settingsRegistry.add(testSetting._id, testSetting.value, testSetting); + + expect(Settings.insertCalls).to.be.equal(1); + Settings.insertCalls = 0; + + const settingFromCodeFaked = { ...testSetting, value: Date.now().toString() }; + + await settingsRegistry.add(settingFromCodeFaked._id, settingFromCodeFaked.value, settingFromCodeFaked); + + expect(Settings.insertCalls).to.be.equal(0); + expect(Settings.upsertCalls).to.be.equal(0); + }); + + it('should not update (reset) cached setting with value in code if some prop in code changes (including value)', async () => { + Settings.setDelay(1000); + const settings = new CachedSettings(); + process.env[`OVERWRITE_SETTING_${testSetting._id}`] = 'false'; + const storedSetting = { ...testSetting, value: true, packageValue: true }; + settings.set(storedSetting); + + Settings.settings = settings; + + settings.initialized(); + + expect(settings.get(storedSetting._id)).to.be.equal(true); + + const settingsRegistry = new SettingsRegistry({ store: settings, model: Settings as any }); + + const settingFromCodeFaked = { + ...storedSetting, + value: true, + enterprise: true, + invalidValue: '', + }; + + await settingsRegistry.add(settingFromCodeFaked._id, settingFromCodeFaked.value, settingFromCodeFaked); + + expect(Settings.insertCalls).to.be.equal(0); + expect(Settings.upsertCalls).to.be.equal(1); + + expect(settings.get(storedSetting._id)).to.be.equal(false); + }); + + it('should update cached setting with value from environment if some prop including value in code changes', async () => { + const settings = new CachedSettings(); + Settings.settings = settings; + settings.initialized(); + const settingsRegistry = new SettingsRegistry({ store: settings, model: Settings as any }); + + await settingsRegistry.add(testSetting._id, testSetting.value, testSetting); + + expect(Settings.insertCalls).to.be.equal(1); + Settings.insertCalls = 0; + + const settingFromCodeFaked = { ...testSetting, value: Date.now().toString(), enterprise: true, invalidValue: '' }; + + process.env[`OVERWRITE_SETTING_${testSetting._id}`] = Date.now().toString(); + + await settingsRegistry.add(settingFromCodeFaked._id, settingFromCodeFaked.value, settingFromCodeFaked); + + expect(Settings.insertCalls).to.be.equal(0); + expect(Settings.upsertCalls).to.be.equal(1); + + expect(settings.get(testSetting._id)).to.be.equal(process.env[`OVERWRITE_SETTING_${testSetting._id}`]); + }); + + it('should ignore default value from environment if setting is already stored', async () => { + const settings = new CachedSettings(); + Settings.settings = settings; + settings.initialized(); + const settingsRegistry = new SettingsRegistry({ store: settings, model: Settings as any }); + + await settingsRegistry.add(testSetting._id, testSetting.value, testSetting); + + process.env[testSetting._id] = Date.now().toString(); + + await settingsRegistry.add(testSetting._id, testSetting.value, testSetting); + + expect(Settings.findOne({ _id: testSetting._id }).value).to.be.equal(testSetting.value); + }); + + it('should update setting cache synchronously if overwrite is available in environment', async () => { + const settings = new CachedSettings(); + Settings.settings = settings; + settings.initialized(); + const settingsRegistry = new SettingsRegistry({ store: settings, model: Settings as any }); + + settings.set(testSetting); + + process.env[`OVERWRITE_SETTING_${testSetting._id}`] = Date.now().toString(); + + await settingsRegistry.add(testSetting._id, testSetting.value, testSetting); + + expect(settings.get(testSetting._id)).to.be.equal(process.env[`OVERWRITE_SETTING_${testSetting._id}`]); + }); + + it('should update cached value with OVERWRITE_SETTING value even if both overwrite and default overwrite variables both exist', async () => { + const settings = new CachedSettings(); + Settings.settings = settings; + settings.initialized(); + const settingsRegistry = new SettingsRegistry({ store: settings, model: Settings as any }); + + process.env[`OVERWRITE_SETTING_${testSetting._id}`] = Date.now().toString(); + process.env[testSetting._id] = Date.now().toString(); + + await settingsRegistry.add(testSetting._id, testSetting.value, testSetting); + + expect(Settings.insertCalls).to.be.equal(1); + expect(settings.get(testSetting._id)).to.be.equal(process.env[`OVERWRITE_SETTING_${testSetting._id}`]); + }); + it('should call `settings.get` callback on setting added', async () => { return new Promise(async (resolve) => { const settings = new CachedSettings(); @@ -502,4 +627,19 @@ describe('Settings', () => { }, settings.getConfig({ debounce: 10 }).debounce); }); }); + + it('should update the stored value on setting change', async () => { + Settings.setDelay(10); + process.env[`OVERWRITE_SETTING_${testSetting._id}`] = 'false'; + const settings = new CachedSettings(); + Settings.settings = settings; + + settings.set(testSetting); + settings.initialized(); + + const settingsRegistry = new SettingsRegistry({ store: settings, model: Settings as any }); + await settingsRegistry.add(testSetting._id, testSetting.value, testSetting); + + expect(settings.get(testSetting._id)).to.be.equal(false); + }); }); diff --git a/apps/meteor/tests/unit/app/ui-utils/client.tests.ts b/apps/meteor/tests/unit/app/ui-utils/client.tests.ts deleted file mode 100644 index 5de4d53e2003..000000000000 --- a/apps/meteor/tests/unit/app/ui-utils/client.tests.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* eslint-env mocha */ -import { expect } from 'chai'; -import { JSDOM } from 'jsdom'; - -import { waitForElement } from '../../../../client/lib/utils/waitForElement'; - -describe('waitUntilWrapperExists', () => { - const globalDocument = global.document; - const mutationObserver = global.MutationObserver; - - beforeEach(() => { - const dom = new JSDOM( - ` - - - - `, - { url: 'http://localhost' }, - ); - global.document = dom.window.document; - global.MutationObserver = dom.window.MutationObserver; - }); - - afterEach(() => { - global.document = globalDocument; - global.MutationObserver = mutationObserver; - }); - - it('should return the element when it is already in the dom', async () => { - expect(await waitForElement('.ready')).to.be.equal(document.querySelector('.ready')); - }); - - it('should await until the element be in the dom and return it', async () => { - setTimeout(() => { - const element = document.createElement('div'); - element.setAttribute('class', 'not-ready'); - document.body.appendChild(element); - }, 5); - expect(await waitForElement('.not-ready')).to.be.equal(document.querySelector('.not-ready')); - }); -}); diff --git a/apps/meteor/tests/unit/client/components/Omnichannel/modals/TranscriptModal.spec.tsx b/apps/meteor/tests/unit/client/components/Omnichannel/modals/TranscriptModal.spec.tsx deleted file mode 100644 index 517253afd087..000000000000 --- a/apps/meteor/tests/unit/client/components/Omnichannel/modals/TranscriptModal.spec.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; -import { userEvent } from '@storybook/testing-library'; -import { render, screen } from '@testing-library/react'; -import { expect, spy } from 'chai'; -import React from 'react'; - -import TranscriptModal from '../../../../../../client/components/Omnichannel/modals/TranscriptModal'; - -const room = { - open: true, - v: { token: '1234567890' }, - transcriptRequest: { - email: 'example@example.com', - subject: 'Transcript of livechat conversation', - }, -} as IOmnichannelRoom; - -const defaultProps = { - room, - email: 'test@example.com', - onRequest: () => null, - onSend: () => null, - onCancel: () => null, - onDiscard: () => null, -}; - -describe('components/Omnichannel/TranscriptModal', () => { - it('should show Undo request button when roomOpen is true and transcriptRequest exist', () => { - const onDiscardMock = spy(); - render(); - const undoRequestButton = screen.getByText('Undo_request'); - - userEvent.click(undoRequestButton); - - expect(onDiscardMock).to.have.been.called(); - }); - - it('should show Request button when roomOpen is true and transcriptRequest not exist', async () => { - render(); - - const requestBtn = await screen.findByRole('button', { name: 'request-button' }); - expect(requestBtn).to.be.visible; - }); - - it('should show Send button when roomOpen is false', async () => { - render(); - - const sendBtn = await screen.findByRole('button', { name: 'send-button' }); - expect(sendBtn).to.be.visible; - }); -}); diff --git a/apps/meteor/tests/unit/client/lib/federation/Federation.test.ts b/apps/meteor/tests/unit/client/lib/federation/Federation.test.ts deleted file mode 100644 index dff34d739258..000000000000 --- a/apps/meteor/tests/unit/client/lib/federation/Federation.test.ts +++ /dev/null @@ -1,489 +0,0 @@ -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; -import sinon from 'sinon'; - -import { RoomMemberActions, RoomSettingsEnum } from '../../../../../definition/IRoomTypeConfig'; - -const findOneStub = sinon.stub(); - -const Federation = proxyquire.noCallThru().load('../../../../../client/lib/federation/Federation', { - '../../../app/models/client': { - RoomRoles: { - findOne: findOneStub, - }, - }, -}); - -describe('Federation[Client] - Federation', () => { - afterEach(() => findOneStub.reset()); - - describe('#actionAllowed()', () => { - const me = 'user-id'; - const them = 'other-user-id'; - - it('should return false if the room is not federated', () => { - expect(Federation.actionAllowed({ federated: false } as any, RoomMemberActions.REMOVE_USER, 'user-id', { roles: ['owner'] } as any)) - .to.be.false; - }); - - it('should return false if the room is a direct message', () => { - expect( - Federation.actionAllowed({ federated: true, t: 'd' } as any, RoomMemberActions.REMOVE_USER, 'user-id', { roles: ['owner'] } as any), - ).to.be.false; - }); - - it('should return false if the user is not subscribed to the room', () => { - expect(Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, 'user-id', undefined)).to.be.false; - }); - - it('should return false if the user is trying to remove himself', () => { - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, 'user-id', { - u: { _id: 'user-id' }, - roles: ['owner'], - } as any), - ).to.be.false; - }); - - describe('Owners', () => { - const myRole = ['owner']; - - describe('Seeing another owners', () => { - const theirRole = ['owner']; - it('should return true if the user want to remove himself as an owner', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: me }, - roles: myRole, - } as any), - ).to.be.true; - }); - it('should return true if the user want to add himself as a moderator (Demoting himself to moderator)', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: me }, - roles: myRole, - } as any), - ).to.be.true; - }); - it('should return false if the user want to remove another owners as an owner', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.false; - }); - it('should return false if the user want to remove another owners from the room', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.false; - }); - }); - describe('Seeing moderators', () => { - const theirRole = ['moderator']; - - it('should return true if the user want to add/remove moderators as an owner', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.true; - }); - it('should return true if the user want to remove moderators as a moderator', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.true; - }); - it('should return true if the user want to remove moderators from the room', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.true; - }); - }); - describe('Seeing normal users', () => { - it('should return true if the user want to add/remove normal users as an owner', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.true; - }); - it('should return true if the user want to add/remove normal users as a moderator', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.true; - }); - it('should return true if the user want to remove normal users from the room', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.true; - }); - }); - }); - - describe('Moderators', () => { - const myRole = ['moderator']; - describe('Seeing owners', () => { - const theirRole = ['owner']; - it('should return false if the user want to add/remove owners as a moderator', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: me }, - roles: myRole, - } as any), - ).to.be.false; - }); - it('should return false if the user want to add/remove owners as a moderator', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: me }, - roles: myRole, - } as any), - ).to.be.false; - }); - it('should return false if the user want to add/remove owners as a moderator', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: me }, - roles: myRole, - } as any), - ).to.be.false; - }); - it('should return false if the user want to remove owners from the room', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: me }, - roles: myRole, - } as any), - ).to.be.false; - }); - }); - describe('Seeing another moderators', () => { - const theirRole = ['moderator']; - it('should return false if the user want to add/remove moderator as an owner', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.false; - }); - it('should return true if the user want to remove himself as a moderator (Demoting himself)', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: me }, - roles: myRole, - } as any), - ).to.be.true; - }); - it('should return false if the user want to promote himself as an owner', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: me }, - roles: myRole, - } as any), - ).to.be.false; - }); - it('should return false if the user want to remove another moderator from their role', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.false; - }); - it('should return false if the user want to remove another moderator from the room', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.false; - }); - }); - describe('Seeing normal users', () => { - it('should return false if the user want to add/remove normal users as an owner', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.false; - }); - it('should return true if the user want to add/remove normal users as a moderator', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.true; - }); - it('should return true if the user want to remove normal users from the room', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: them }, - roles: myRole, - } as any), - ).to.be.true; - }); - }); - }); - - describe('Normal user', () => { - describe('Seeing owners', () => { - const theirRole = ['owner']; - it('should return false if the user want to add/remove owners as a normal user', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - it('should return false if the user want to add/remove moderators as a normal user', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - it('should return false if the user want to remove owners from the room', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - }); - describe('Seeing moderators', () => { - const theirRole = ['owner']; - it('should return false if the user want to add/remove owner as a normal user', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - it('should return false if the user want to remove a moderator from their role', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_MODERATOR, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - it('should return false if the user want to remove a moderator from the room', () => { - findOneStub.returns({ roles: theirRole }); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - }); - describe('Seeing another normal users', () => { - it('should return false if the user want to add/remove owner as a normal user', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - it('should return false if the user want to add/remove moderator as a normal user', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.SET_AS_OWNER, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - it('should return false if the user want to remove normal users from the room', () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, RoomMemberActions.REMOVE_USER, me, { - u: { _id: them }, - } as any), - ).to.be.false; - }); - - [RoomMemberActions.SET_AS_MODERATOR, RoomMemberActions.SET_AS_OWNER, RoomMemberActions.REMOVE_USER].forEach((action) => { - it(`should return false if the user want to ${action} for himself`, () => { - findOneStub.returns(undefined); - expect( - Federation.actionAllowed({ federated: true } as any, action, me, { - u: { _id: me }, - } as any), - ).to.be.false; - }); - }); - }); - }); - }); - - describe('#isEditableByTheUser()', () => { - it('should return false if the user is null', () => { - expect(Federation.isEditableByTheUser(undefined, { u: { _id: 'id' } } as any, {} as any)).to.be.false; - }); - - it('should return false if the room is null', () => { - expect(Federation.isEditableByTheUser({} as any, undefined, {} as any)).to.be.false; - }); - - it('should return false if the subscription is null', () => { - expect(Federation.isEditableByTheUser({} as any, {} as any, undefined)).to.be.false; - }); - - it('should return false if the current room is NOT a federated one', () => { - expect(Federation.isEditableByTheUser({ _id: 'differentId' } as any, { u: { _id: 'id' } } as any, {} as any)).to.be.false; - }); - - it('should return false if the current user is NOT the room owner nor moderator', () => { - expect(Federation.isEditableByTheUser({ _id: 'differentId' } as any, { federated: true, u: { _id: 'id' } } as any, {} as any)).to.be - .false; - }); - - it('should return true if the current user is a room owner', () => { - expect( - Federation.isEditableByTheUser( - { _id: 'differentId' } as any, - { federated: true, u: { _id: 'id' } } as any, - { roles: ['owner'] } as any, - ), - ).to.be.true; - }); - - it('should return true if the current user is a room moderator', () => { - expect( - Federation.isEditableByTheUser( - { _id: 'differentId' } as any, - { federated: true, u: { _id: 'id' } } as any, - { roles: ['moderator'] } as any, - ), - ).to.be.true; - }); - }); - describe('#canCreateInviteLinks()', () => { - it('should return false if the user is null', () => { - expect(Federation.canCreateInviteLinks(undefined, { u: { _id: 'id' } } as any, {} as any)).to.be.false; - }); - - it('should return false if the room is null', () => { - expect(Federation.canCreateInviteLinks({} as any, undefined, {} as any)).to.be.false; - }); - - it('should return false if the subscription is null', () => { - expect(Federation.canCreateInviteLinks({} as any, {} as any, undefined)).to.be.false; - }); - - it('should return false if the current room is NOT a federated one', () => { - expect(Federation.canCreateInviteLinks({ _id: 'differentId' } as any, { u: { _id: 'id' } } as any, {} as any)).to.be.false; - }); - - it('should return false if the current room is federated one but NOT a public one', () => { - expect(Federation.canCreateInviteLinks({ _id: 'differentId' } as any, { federated: true, u: { _id: 'id' } } as any, {} as any)).to.be - .false; - }); - - it('should return false if the current room is federated one, a public one but the user is NOT an owner nor moderator', () => { - expect( - Federation.canCreateInviteLinks({ _id: 'differentId' } as any, { federated: true, t: 'c', u: { _id: 'id' } } as any, {} as any), - ).to.be.false; - }); - - it('should return false if the current room is federated one, a public one but the user is NOT an owner nor moderator', () => { - expect( - Federation.canCreateInviteLinks({ _id: 'differentId' } as any, { federated: true, t: 'c', u: { _id: 'id' } } as any, {} as any), - ).to.be.false; - }); - - it('should return true if the current room is federated one, a public one but the user is an owner', () => { - expect( - Federation.canCreateInviteLinks( - { _id: 'differentId' } as any, - { federated: true, t: 'c', u: { _id: 'id' } } as any, - { roles: ['owner'] } as any, - ), - ).to.be.true; - }); - - it('should return true if the current room is federated one, a public one but the user is an moderator', () => { - expect( - Federation.canCreateInviteLinks( - { _id: 'differentId' } as any, - { federated: true, t: 'c', u: { _id: 'id' } } as any, - { roles: ['moderator'] } as any, - ), - ).to.be.true; - }); - }); - - describe('#isRoomSettingAllowed()', () => { - it('should return false if the room is NOT federated', () => { - expect(Federation.isRoomSettingAllowed({ t: 'c' } as any, RoomSettingsEnum.NAME)).to.be.false; - }); - - it('should return false if the room is a DM one', () => { - expect(Federation.isRoomSettingAllowed({ t: 'd', federated: true } as any, RoomSettingsEnum.NAME)).to.be.false; - }); - - const allowedSettingsChanges = [RoomSettingsEnum.NAME, RoomSettingsEnum.TOPIC]; - - Object.values(RoomSettingsEnum) - .filter((setting) => !allowedSettingsChanges.includes(setting as any)) - .forEach((setting) => { - it('should return false if the setting change is NOT allowed within the federation context for regular channels', () => { - expect(Federation.isRoomSettingAllowed({ t: 'c', federated: true } as any, setting)).to.be.false; - }); - }); - - allowedSettingsChanges.forEach((setting) => { - it('should return true if the setting change is allowed within the federation context for regular channels', () => { - expect(Federation.isRoomSettingAllowed({ t: 'c', federated: true } as any, setting)).to.be.true; - }); - }); - }); -}); diff --git a/apps/meteor/tests/unit/client/lib/getRoomGroup.spec.ts b/apps/meteor/tests/unit/client/lib/getRoomGroup.spec.ts deleted file mode 100644 index 0c2a1e53dc8e..000000000000 --- a/apps/meteor/tests/unit/client/lib/getRoomGroup.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { IRoom } from '@rocket.chat/core-typings'; -import { expect } from 'chai'; -import { describe, it } from 'mocha'; - -import { getRoomGroup } from '../../../../client/views/room/lib/getRoomGroup'; - -describe('getRoomGroup', () => { - it('should return "direct" for direct message rooms', () => { - const result = getRoomGroup({ t: 'd' } as IRoom); - - expect(result).to.be.equal('direct'); - }); - - it('should return "team" for team rooms', () => { - const result = getRoomGroup({ teamMain: true } as IRoom); - - expect(result).to.be.equal('team'); - }); - - it('should return "direct_multiple" for direct message room with many users', () => { - const result = getRoomGroup({ uids: ['id1', 'id2', 'id3'], t: 'd' } as IRoom); - - expect(result).to.be.equal('direct_multiple'); - }); -}); diff --git a/apps/meteor/tests/unit/client/lib/minimongo/bson.spec.ts b/apps/meteor/tests/unit/client/lib/minimongo/bson.spec.ts deleted file mode 100644 index 9f177a90079e..000000000000 --- a/apps/meteor/tests/unit/client/lib/minimongo/bson.spec.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { expect } from 'chai'; -import { describe, it } from 'mocha'; - -import { getBSONType, compareBSONValues } from '../../../../../client/lib/minimongo/bson'; -import { BSONType } from '../../../../../client/lib/minimongo/types'; - -describe('getBSONType', () => { - it('should work', () => { - expect(getBSONType(1)).to.be.equals(BSONType.Double); - expect(getBSONType('xyz')).to.be.equals(BSONType.String); - expect(getBSONType({})).to.be.equals(BSONType.Object); - expect(getBSONType([])).to.be.equals(BSONType.Array); - expect(getBSONType(new Uint8Array())).to.be.equals(BSONType.BinData); - expect(getBSONType(undefined)).to.be.equals(BSONType.Object); - expect(getBSONType(null)).to.be.equals(BSONType.Null); - expect(getBSONType(false)).to.be.equals(BSONType.Boolean); - expect(getBSONType(/.*/)).to.be.equals(BSONType.Regex); - expect(getBSONType(() => true)).to.be.equals(BSONType.JavaScript); - expect(getBSONType(new Date(0))).to.be.equals(BSONType.Date); - }); -}); - -describe('compareBSONValues', () => { - it('should work for the same types', () => { - expect(compareBSONValues(2, 3)).to.be.equals(-1); - expect(compareBSONValues('xyz', 'abc')).to.be.equals(1); - expect(compareBSONValues({}, {})).to.be.equals(0); - expect(compareBSONValues(true, false)).to.be.equals(1); - expect(compareBSONValues(new Date(0), new Date(1))).to.be.equals(-1); - }); - - it('should work for different types', () => { - expect(compareBSONValues(2, null)).to.be.equals(1); - expect(compareBSONValues('xyz', {})).to.be.equals(-1); - expect(compareBSONValues(false, 3)).to.be.equals(1); - }); -}); diff --git a/apps/meteor/tests/unit/client/lib/minimongo/comparisons.spec.ts b/apps/meteor/tests/unit/client/lib/minimongo/comparisons.spec.ts deleted file mode 100644 index 04163469e7e8..000000000000 --- a/apps/meteor/tests/unit/client/lib/minimongo/comparisons.spec.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { expect } from 'chai'; -import { describe, it } from 'mocha'; - -import { equals, isObject, flatSome, some, isEmptyArray } from '../../../../../client/lib/minimongo/comparisons'; - -describe('Comparisons service', () => { - describe('equals', () => { - it('should return true if two numbers are equal', () => { - expect(equals(1, 1)).to.be.equal(true); - }); - - it('should return false if arguments are null or undefined', () => { - expect(equals(undefined, null)).to.be.equal(false); - expect(equals(null, undefined)).to.be.equal(false); - }); - - it('should return false if arguments arent objects and they are not the same', () => { - expect(equals('not', 'thesame')).to.be.equal(false); - }); - - it('should return true if date objects provided have the same value', () => { - const currentDate = new Date(); - - expect(equals(currentDate, currentDate)).to.be.equal(true); - }); - - it('should return true if 2 equal UInt8Array are provided', () => { - const arr1 = new Uint8Array([1, 2]); - const arr2 = new Uint8Array([1, 2]); - - expect(equals(arr1, arr2)).to.be.equal(true); - }); - - it('should return true if 2 equal arrays are provided', () => { - const arr1 = [1, 2, 4]; - const arr2 = [1, 2, 4]; - - expect(equals(arr1, arr2)).to.be.equal(true); - }); - - it('should return false if 2 arrays with different length are provided', () => { - const arr1 = [1, 4, 5]; - const arr2 = [1, 4, 5, 7]; - - expect(equals(arr1, arr2)).to.be.equal(false); - }); - - it('should return true if the objects provided are "equal"', () => { - const obj = { a: 1 }; - const obj2 = obj; - - expect(equals(obj, obj2)).to.be.equal(true); - }); - - it('should return true if both objects have the same keys', () => { - const obj = { a: 1 }; - const obj2 = { a: 1 }; - - expect(equals(obj, obj2)).to.be.equal(true); - }); - }); - - describe('isObject', () => { - it('should return true if value is an object or function', () => { - const obj = {}; - const func = (a: any): any => a; - - expect(isObject(obj)).to.be.equal(true); - expect(isObject(func)).to.be.equal(true); - }); - - it('should return false for other data types', () => { - expect(isObject(1)).to.be.equal(false); - expect(isObject(true)).to.be.equal(false); - expect(isObject('212')).to.be.equal(false); - }); - }); - - describe('flatSome', () => { - it('should run .some on array', () => { - const arr = [1, 2, 4, 6, 9]; - const isEven = (v: number): boolean => v % 2 === 0; - - expect(flatSome(arr, isEven)).to.be.equal(true); - }); - - it('should run the function on the value when its not an array', () => { - const val = 1; - const isEven = (v: number): boolean => v % 2 === 0; - - expect(flatSome(val, isEven)).to.be.equal(false); - }); - }); - - describe('some', () => { - it('should run .some on array', () => { - const arr = [1, 2, 4, 6, 9]; - const isEven = (v: number | number[]): boolean => { - if (Array.isArray(v)) { - return false; - } - return v % 2 === 0; - }; - - expect(some(arr, isEven)).to.be.equal(true); - }); - - it('should run the function on the value when its not an array', () => { - const val = 1; - const isEven = (v: number | number[]): boolean => { - if (Array.isArray(v)) { - return false; - } - return v % 2 === 0; - }; - - expect(some(val, isEven)).to.be.equal(false); - }); - }); - - describe('isEmptyArray', () => { - it('should return true if array is empty', () => { - expect(isEmptyArray([])).to.be.equal(true); - }); - - it('should return false if value is not an array', () => { - expect(isEmptyArray(1)).to.be.equal(false); - }); - - it('should return false if array is not empty', () => { - expect(isEmptyArray([1, 2])).to.be.equal(false); - }); - }); -}); diff --git a/apps/meteor/tests/unit/client/lib/minimongo/lookups.spec.ts b/apps/meteor/tests/unit/client/lib/minimongo/lookups.spec.ts deleted file mode 100644 index f2117f6eaa96..000000000000 --- a/apps/meteor/tests/unit/client/lib/minimongo/lookups.spec.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { expect } from 'chai'; -import { describe, it } from 'mocha'; - -import { createLookupFunction } from '../../../../../client/lib/minimongo/lookups'; - -describe('createLookupFunction', () => { - it('should work', () => { - expect(createLookupFunction('a.x')({ a: { x: 1 } })).to.be.deep.equals([1]); - expect(createLookupFunction('a.x')({ a: { x: [1] } })).to.be.deep.equals([[1]]); - expect(createLookupFunction('a.x')({ a: 5 })).to.be.deep.equals([undefined]); - expect(createLookupFunction('a.x')({ a: [{ x: 1 }, { x: [2] }, { y: 3 }] })).to.be.deep.equals([1, [2], undefined]); - }); -}); diff --git a/apps/meteor/tests/unit/client/lib/utils/isRTLScriptLanguage.spec.ts b/apps/meteor/tests/unit/client/lib/utils/isRTLScriptLanguage.spec.ts deleted file mode 100644 index bcf610b7bfbc..000000000000 --- a/apps/meteor/tests/unit/client/lib/utils/isRTLScriptLanguage.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { expect } from 'chai'; - -import { isRTLScriptLanguage } from '../../../../../client/lib/utils/isRTLScriptLanguage'; - -describe('isRTLScriptLanguage', () => { - const testCases = [ - ['en', false], - ['ar', true], - ['dv', true], - ['fa', true], - ['he', true], - ['ku', true], - ['ps', true], - ['sd', true], - ['ug', true], - ['ur', true], - ['yi', true], - ['ar', true], - ['ar-LY', true], - ['dv-MV', true], - ['', false], - ] as const; - - testCases.forEach(([parameter, expectedResult]) => { - it(`should return ${JSON.stringify(expectedResult)} for ${JSON.stringify(parameter)}`, () => { - const result = isRTLScriptLanguage(parameter); - expect(result).to.be.equal(expectedResult); - }); - }); -}); diff --git a/apps/meteor/tests/unit/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.spec.tsx b/apps/meteor/tests/unit/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.spec.tsx deleted file mode 100644 index a5d7a250b722..000000000000 --- a/apps/meteor/tests/unit/client/sidebar/header/MatrixFederationSearch/MatrixFederationSearch.spec.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import { cleanup, render, screen, within } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; -import type { ReactElement } from 'react'; -import React from 'react'; - -const fetchRoomList = async ({ serverName, roomName, count }: any): Promise => { - return new Promise((resolve) => - resolve({ - rooms: Array.from({ length: count || 100 }).map((index) => ({ - id: `Matrix${index}`, - name: `${roomName}${index}` || `Matrix${index}`, - canJoin: true, - canonicalAlias: `#${serverName}:matrix.org`, - joinedMembers: 44461, - topic: - 'The Official Matrix HQ - chat about Matrix here! | https://matrix.org | https://spec.matrix.org | To support Matrix.org development: https://patreon.com/matrixdotorg | Code of Conduct: https://matrix.org/legal/code-of-conduct/ | This is an English speaking room | The Official Matrix HQ - chat about Matrix here! | https://matrix.org | https://spec.matrix.org | To support Matrix.org development: https://patreon.com/matrixdotorg | Code of Conduct: https://matrix.org/legal/code-of-conduct/ | This is an English speaking room The Official Matrix HQ - chat about Matrix here! | https://matrix.org | https://spec.matrix.org | To support Matrix.org development: https://patreon.com/matrixdotorg | Code of Conduct: https://matrix.org/legal/code-of-conduct/ | This is an English speaking room | The Official Matrix HQ - chat about Matrix here! | https://matrix.org | https://spec.matrix.org | To support Matrix.org development: https://patreon.com/matrixdotorg | Code of Conduct: https://matrix.org/legal/code-of-conduct/ | This is an English speaking room', - })), - count: 1, - total: 73080, - nextPageToken: 'g6FtzZa3oXK+IUpkemFiTlVQUFh6bENKQWhFbDpmYWJyaWMucHVioWTD', - prevPageToken: 'g6FtzYqIoXK+IWNOd2pkUXdWcFJNc0lNa1VweDptYXRyaXgub3JnoWTC', - success: true, - }), - ); -}; - -const joinExternalPublicRoom: any = async () => ({ success: true }); - -let serverList = [ - { name: `server-1`, default: true, local: false }, - { name: `server-2`, default: false, local: false }, - { name: `server-3`, default: false, local: false }, -]; - -const fetchServerList = async () => ({ - servers: serverList, -}); - -const removeMatrixServer: any = async ({ serverName }: any) => { - serverList = serverList.filter((server) => server.name !== serverName); -}; -const addMatrixServer: any = async ({ serverName }: any) => serverList.push({ name: serverName, default: false, local: false }); - -const COMPONENT_PATH = '../../../../../../client/sidebar/header/MatrixFederationSearch'; - -const defaultConfig = { - '@rocket.chat/ui-contexts': { - 'useSetModal': () => (modal: ReactElement) => { - cleanup(); - if (!modal) { - return; - } - render(modal); - }, - '@global': true, - }, - '../../../lib/rooms/roomCoordinator': { - '@noCallThru': true, - '@global': true, - 'roomCoordinator': { - openRouteLink: () => null, - }, - }, -}; -const { makeCallEndpoint } = proxyquire.load('../../../../../mocks/client/ServerProviderMock', defaultConfig); - -const [callEndpoint, registerEndpoint] = makeCallEndpoint(); - -registerEndpoint('GET', '/v1/federation/listServersByUser', fetchServerList); -registerEndpoint('GET', '/v1/federation/searchPublicRooms', fetchRoomList); -registerEndpoint('GET', '/v1/federation/joinExternalPublicRoom', joinExternalPublicRoom); -registerEndpoint('POST', '/v1/federation/addServerByUser', addMatrixServer); -registerEndpoint('POST', '/v1/federation/removeServerByUser', removeMatrixServer); - -const openManageServers = () => { - const manageServerLink = screen.getByRole('a'); - expect(manageServerLink).to.exist; - userEvent.click(manageServerLink); - expect(screen.getByRole('dialog')).to.exist; - expect(screen.getByText('Manage servers')).to.exist; -}; - -const renderMatrixFederationSearch = () => { - const MatrixFederationSearch = proxyquire.load(COMPONENT_PATH, defaultConfig).default; - const ServerProviderMock = proxyquire.load('../../../../../mocks/client/ServerProviderMock', defaultConfig).default; - const QueryClientProviderMock = proxyquire.load( - '../../../../../../client/stories/contexts/QueryClientProviderMock', - defaultConfig, - ).default; - - render( - - - - - , - ); -}; - -describe.skip('sidebar/header/MatrixFederationSearch', () => { - it('should render Federated Room search modal', async () => { - renderMatrixFederationSearch(); - - expect(screen.getByRole('dialog')).to.exist; - expect(screen.getByText('Federated room search')).to.exist; - expect(screen.getByText('Matrix1')).to.exist; - expect(screen.getByText('Matrix2')).to.exist; - }); - - it('should search for rooms', async () => { - renderMatrixFederationSearch(); - - const input = screen.getByPlaceholderText('Search rooms'); - expect(input).to.exist; - userEvent.type(input, 'NotMatrix'); - expect(screen.getByText('NotMatrix1')).to.exist; - expect(screen.getByText('NotMatrix2')).to.exist; - }); - - it('should close the modal when joining a room', async () => { - renderMatrixFederationSearch(); - - const firstListItem = screen.getByRole('li', { name: 'Matrix1' }); - expect(firstListItem).to.exist; - const joinButton = within(firstListItem).getByRole('button'); - expect(joinButton).to.exist; - userEvent.click(joinButton); - expect(screen.getByRole('dialog')).to.not.exist; - }); - - it('should open the manage server modal', async () => { - renderMatrixFederationSearch(); - - openManageServers(); - serverList.forEach((server) => { - expect(screen.getByText(server.name)).to.exist; - }); - }); - - it('should return to the Search modal when clicking cancel', async () => { - renderMatrixFederationSearch(); - - openManageServers(); - - const cancelButton = screen.getByText('Cancel'); - expect(cancelButton).to.exist; - userEvent.click(cancelButton); - - expect(screen.getByRole('dialog')).to.exist; - expect(screen.getByText('Federated room search')).to.exist; - }); - - it('should return to the Search modal with the new server selected', async () => { - renderMatrixFederationSearch(); - - openManageServers(); - - const input = screen.getByRole('input'); - expect(input).to.exist; - userEvent.type(input, 'server-4'); - - const addButton = screen.getByText('Add'); - expect(addButton).to.exist; - userEvent.click(addButton); - - expect(screen.getByRole('dialog')).to.exist; - expect(screen.getByText('Federated room search')).to.exist; - expect(screen.getByText('server-4')).to.be.visible; - }); - - it('should remove servers from the list', async () => { - renderMatrixFederationSearch(); - - openManageServers(); - - const defaultItem = screen.getByTitle('server-1'); - expect(defaultItem).to.exist; - userEvent.hover(defaultItem); - expect(within(defaultItem).getByRole('i')).to.not.exist; - - const lastItem = screen.getByTitle('server-4'); - expect(lastItem).to.exist; - userEvent.hover(lastItem); - const removeButton = within(lastItem).getByRole('i'); - expect(removeButton).to.be.visible; - userEvent.click(removeButton); - - expect(screen.getByText('server-4')).to.not.exist; - }); -}); diff --git a/apps/meteor/tests/unit/client/views/notFound/NotFoundPage.spec.tsx b/apps/meteor/tests/unit/client/views/notFound/NotFoundPage.spec.tsx deleted file mode 100644 index d188202c503a..000000000000 --- a/apps/meteor/tests/unit/client/views/notFound/NotFoundPage.spec.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { render, waitFor, screen } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import '@testing-library/jest-dom'; -import type { MutableRefObject } from 'react'; -import React from 'react'; - -import NotFoundPage from '../../../../../client/views/notFound/NotFoundPage'; -import RouterContextMock from '../../../../mocks/client/RouterContextMock'; - -describe('views/notFound/NotFoundPage', () => { - it('should look good', async () => { - render(); - - await screen.findByRole('heading'); - - expect(screen.getByRole('heading')).toHaveTextContent('Page_not_found'); - - expect(screen.getByRole('button', { name: 'Homepage' })).not.toBeDisabled(); - }); - - it('should have correct tab order', () => { - render(); - // eslint-disable-next-line testing-library/no-node-access - expect(document.activeElement).toBe(document.body); - userEvent.tab(); - // eslint-disable-next-line testing-library/no-node-access - expect(document.activeElement).toBe(screen.getByRole('button', { name: 'Homepage' })); - userEvent.tab(); - // eslint-disable-next-line testing-library/no-node-access - expect(document.activeElement).toBe(document.body); - }); - - describe('"Return to home" button', () => { - describe('when clicked', () => { - it('should go back on history', async () => { - const currentPath: MutableRefObject = { current: undefined }; - - render( - - - , - ); - const button = screen.getByRole('button', { name: 'Homepage' }); - - userEvent.click(button); - - await waitFor(() => expect(currentPath.current).toBe('/home')); - }); - }); - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/Message.test.tsx b/apps/meteor/tests/unit/client/views/room/MessageList/Message.test.tsx deleted file mode 100644 index b6a0f9ecd957..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/Message.test.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import type { IMessage } from '@rocket.chat/core-typings'; -import { render, screen } from '@testing-library/react'; -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; -import React from 'react'; - -import type { default as _RoomMessage } from '../../../../../../client/components/message/variants/RoomMessage'; - -const date = new Date('2021-10-27T00:00:00.000Z'); -const baseMessage: IMessage = { - ts: date, - u: { - _id: 'userId', - name: 'userName', - username: 'userName', - }, - msg: 'message', - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'message', - }, - ], - }, - ], - rid: 'roomId', - _id: 'messageId', - _updatedAt: date, - urls: [], -}; - -const RoomMessage = proxyquire.noCallThru().load('../../../../../../client/components/message/variants/RoomMessage.tsx', { - '../../avatar/UserAvatar': () =>

    user avatar

    , - '../../../views/room/MessageList/contexts/MessageHighlightContext': { - useIsMessageHighlight: () => false, - }, - '../../../views/room/MessageList/contexts/SelectedMessagesContext': { - useIsSelecting: () => '', - useToggleSelect: () => '', - useIsSelectedMessage: () => '', - useCountSelected: () => '', - }, - '../IgnoredContent': () =>

    message ignored

    , - './room/RoomMessageContent': () => baseMessage.msg, - '../MessageHeader': () =>

    message header

    , - '../StatusIndicators': { MessageIndicators: () =>

    message indicators

    }, - '../MessageToolboxHolder': () =>

    toolbox

    , -}).default as typeof _RoomMessage; - -describe('Message', () => { - it('should show normal message', () => { - render( - , - ); - - expect(screen.getByText(baseMessage.msg)).to.exist; - }); - - it('should show ignored message', () => { - render( - , - ); - - expect(screen.getByText('message ignored')).to.exist; - }); - - it('should show ignored message', () => { - render( - , - ); - - expect(screen.getByText('message ignored')).to.exist; - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/hooks/useKatex.test.ts b/apps/meteor/tests/unit/client/views/room/MessageList/hooks/useKatex.test.ts deleted file mode 100644 index 1739f070e32a..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/hooks/useKatex.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { renderHook } from '@testing-library/react-hooks'; -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; - -const COMPONENT_PATH = '../../../../../../../client/views/room/MessageList/hooks/useKatex'; -const defaultConfig = { - '@rocket.chat/ui-contexts': { - useSetting: () => true, - }, -}; - -describe('room/MessageList/hooks/useKatex', () => { - it('should return enabled true dollar syntax true and parenthesis syntax true if all settings is enabled', () => { - const { useKatex } = proxyquire.load(COMPONENT_PATH, defaultConfig); - - const { result } = renderHook(() => useKatex()); - - expect(result.current.katexEnabled).to.be.equal(true); - expect(result.current.katexDollarSyntaxEnabled).to.be.equal(true); - expect(result.current.katexParenthesisSyntaxEnabled).to.be.equal(true); - }); - - it('should return enabled false dollar syntax false and parenthesis syntax false if all settings is disabled', () => { - const { useKatex } = proxyquire.load(COMPONENT_PATH, { - ...defaultConfig, - '@rocket.chat/ui-contexts': { - useSetting: () => false, - }, - }); - - const { result } = renderHook(() => useKatex()); - - expect(result.current.katexEnabled).to.be.equal(false); - expect(result.current.katexDollarSyntaxEnabled).to.be.equal(false); - expect(result.current.katexParenthesisSyntaxEnabled).to.be.equal(false); - }); - - it('should return enabled true dollar syntax false and parenthesis syntax false if Katex_Enabled settings is enable', () => { - const { useKatex } = proxyquire.load(COMPONENT_PATH, { - ...defaultConfig, - '@rocket.chat/ui-contexts': { - useSetting: (str: string) => str === 'Katex_Enabled', - }, - }); - - const { result } = renderHook(() => useKatex()); - - expect(result.current.katexEnabled).to.be.equal(true); - expect(result.current.katexDollarSyntaxEnabled).to.be.equal(false); - expect(result.current.katexParenthesisSyntaxEnabled).to.be.equal(false); - }); - - it('should return enabled false dollar syntax false and parenthesis syntax false if DollarSyntaxEnabled and ParenthesisSyntaxEnabled settings is enable', () => { - const { useKatex } = proxyquire.load(COMPONENT_PATH, { - ...defaultConfig, - '@rocket.chat/ui-contexts': { - useSetting: (str: string) => str === 'DollarSyntaxEnabled' || str === 'ParenthesisSyntaxEnabled', - }, - }); - - const { result } = renderHook(() => useKatex()); - - expect(result.current.katexEnabled).to.be.equal(false); - expect(result.current.katexDollarSyntaxEnabled).to.be.equal(false); - expect(result.current.katexParenthesisSyntaxEnabled).to.be.equal(false); - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/autoTranslate.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/autoTranslate.spec.ts deleted file mode 100644 index bbf6f10cc7ef..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/autoTranslate.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { IMessage, MessageAttachment } from '@rocket.chat/core-typings'; -import { expect } from 'chai'; - -import { - hasTranslationLanguageInAttachments, - hasTranslationLanguageInMessage, -} from '../../../../../../../client/views/room/MessageList/lib/autoTranslate'; - -describe('autoTranslate', () => { - describe('hasTranslationLanguageInMessage', () => { - const testCases = [ - [{}, '', false], - [{ translations: { en: 'bah' } }, '', false], - [{ translations: { en: 'bah' } }, 'pt', false], - [{ translations: { en: 'bah' } }, 'en', true], - ] as const; - - testCases.forEach(([message, language, expectedResult]) => { - it(`should return ${JSON.stringify(expectedResult)} for ${JSON.stringify(message)} with ${JSON.stringify(language)}`, () => { - const result = hasTranslationLanguageInMessage(message as unknown as IMessage, language); - expect(result).to.be.equal(expectedResult); - }); - }); - }); - - describe('hasTranslationLanguageInAttachments', () => { - const testCases = [ - [[{}], '', false], - [undefined, '', false], - [[{ translations: { en: 'bah' } }], '', false], - [[{ translations: { en: 'bah' } }], 'pt', false], - [[{ translations: { en: 'bah' } }], 'pt', false], - [[{ translations: { en: 'bah' } }], 'en', true], - ] as const; - - testCases.forEach(([attachment, language, expectedResult]) => { - it(`should return ${JSON.stringify(expectedResult)} for ${JSON.stringify(attachment)} with ${JSON.stringify(language)}`, () => { - const result = hasTranslationLanguageInAttachments(attachment as unknown as MessageAttachment[], language); - expect(result).to.be.equal(expectedResult); - }); - }); - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/buildImageURL.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/buildImageURL.spec.ts deleted file mode 100644 index 83d90f90e4c6..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/buildImageURL.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { expect } from 'chai'; - -import { buildImageURL } from '../../../../../../../client/components/message/content/urlPreviews/buildImageURL'; - -describe('buildImageURL', () => { - const testCases = [ - [ - 'https://g1.globo.com/mundo/video/misseis-atingem-ponte-de-vidro-em-kiev-11012523.ghtml', - 'https://s2.glbimg.com/fXQKM_UZjF6I_3APIbPJzJTOUvw=/1200x/smart/filters:cover():strip_icc()/s04.video.glbimg.com/x720/11012523.jpg', - 'https://s2.glbimg.com/fXQKM_UZjF6I_3APIbPJzJTOUvw=/1200x/smart/filters:cover():strip_icc()/s04.video.glbimg.com/x720/11012523.jpg', - ], - ['https://open.rocket.chat/channel/general', 'assets/favicon_512.png', 'https://open.rocket.chat/assets/favicon_512.png'], - ['https://open.rocket.chat/channel/general', '/assets/favicon_512.png', 'https://open.rocket.chat/assets/favicon_512.png'], - ['https://open.rocket.chat/channel/general/', '/assets/favicon_512.png', 'https://open.rocket.chat/assets/favicon_512.png'], - ] as const; - - testCases.forEach(([linkUrl, metaImgUrl, expectedResult]) => { - it(`should return ${expectedResult} for ${metaImgUrl}`, () => { - const result = buildImageURL(linkUrl, metaImgUrl); - - expect(result).to.equal(JSON.stringify(expectedResult)); - }); - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/isMessageNewDay.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/isMessageNewDay.spec.ts deleted file mode 100644 index 27af3d4c6de9..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/isMessageNewDay.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-env mocha */ -import type { IMessage } from '@rocket.chat/core-typings'; -import { expect } from 'chai'; - -import { isMessageNewDay } from '../../../../../../../client/views/room/MessageList/lib/isMessageNewDay'; - -const date = new Date('2021-10-27T00:00:00.000Z'); - -const baseMessage: IMessage = { - ts: date, - u: { - _id: 'userId', - name: 'userName', - username: 'userName', - }, - msg: 'message', - rid: 'roomId', - _id: 'messageId', - _updatedAt: date, - urls: [], -}; - -describe('isMessageNewDay', () => { - it('should return true if the message is from a different day', () => { - const message = { - ...baseMessage, - }; - const message2 = { - ...baseMessage, - ts: new Date('2021-10-28T00:00:00.000Z'), - }; - expect(isMessageNewDay(message, message2)).to.be.true; - }); - it('should return false if the message is from the same day', () => { - const message = { - ...baseMessage, - }; - const message2 = { - ...baseMessage, - }; - expect(isMessageNewDay(message, message2)).to.be.false; - }); - it('should return true if there is no previous message', () => { - const message = { - ...baseMessage, - }; - expect(isMessageNewDay(message, undefined)).to.be.true; - }); - - it('should return true for different days even if the range is on second', () => { - const previous: IMessage = { - ...baseMessage, - ts: new Date(2022, 0, 1, 23, 59, 59, 999), - }; - const current: IMessage = { - ...baseMessage, - ts: new Date(2022, 0, 2, 0, 0, 0, 0), - }; - expect(isMessageNewDay(current, previous)).to.be.true; - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/isMessageSequential.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/isMessageSequential.spec.ts deleted file mode 100644 index aa74388f04f6..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/isMessageSequential.spec.ts +++ /dev/null @@ -1,168 +0,0 @@ -/* eslint-env mocha */ -import type { IMessage } from '@rocket.chat/core-typings'; -import { expect } from 'chai'; - -import { MessageTypes } from '../../../../../../../app/ui-utils/lib/MessageTypes'; -import { isMessageSequential } from '../../../../../../../client/views/room/MessageList/lib/isMessageSequential'; - -const TIME_RANGE_IN_SECONDS = 300; - -const date = new Date('2021-10-27T00:00:00.000Z'); -const baseMessage: IMessage = { - ts: date, - u: { - _id: 'userId', - name: 'userName', - username: 'userName', - }, - msg: 'message', - rid: 'roomId', - _id: 'messageId', - _updatedAt: date, - urls: [], -}; - -describe('isMessageSequential', () => { - it('should return false if no previous message', () => { - const current: IMessage = { - ...baseMessage, - }; - expect(isMessageSequential(current, undefined, TIME_RANGE_IN_SECONDS)).to.be.false; - }); - - it("should return false if both messages doesn't belong to the same user", () => { - const previous: IMessage = { - ...baseMessage, - }; - const current: IMessage = { - ...baseMessage, - u: { - _id: 'userId2', - name: 'userName2', - username: 'userName2', - }, - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.false; - }); - - it('should return false if both messages belongs to the same user but have more than five minutes of difference', () => { - const previous: IMessage = { - ...baseMessage, - }; - - const current: IMessage = { - ...previous, - ts: new Date('2021-10-27T00:05:00.001Z'), - }; - - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.false; - }); - it('should return true if both messages belongs to the same user and have less than five minutes of difference', () => { - const previous: IMessage = { - ...baseMessage, - }; - const current: IMessage = { - ...previous, - ts: new Date('2021-10-27T00:04:59.999Z'), - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.true; - }); - it('should return false if message are not groupable', () => { - const previous: IMessage = { - ...baseMessage, - groupable: false, - }; - const current: IMessage = { - ...previous, - groupable: false, - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.false; - }); - it('should return false if both messages are not from the same thread', () => { - const previous: IMessage = { - ...baseMessage, - tmid: 'threadId', - }; - const current: IMessage = { - ...previous, - tmid: 'threadId2', - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.false; - }); - - it('should return true if both messages are from the same thread same user and bellow the time range', () => { - const previous: IMessage = { - ...baseMessage, - tmid: 'threadId', - }; - const current: IMessage = { - ...previous, - tmid: 'threadId', - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.true; - }); - - it('should return false if previous message is thread message but the current is a regular one', () => { - const previous: IMessage = { - tmid: 'threadId', - ...baseMessage, - }; - const current: IMessage = { - ...baseMessage, - }; - - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.false; - }); - - it('should return true if message is a reply from a previous message', () => { - const previous: IMessage = { - ...baseMessage, - _id: 'threadId', - }; - const current: IMessage = { - ...previous, - tmid: 'threadId', - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.true; - }); - it("should return false if both messages don't have the same alias", () => { - const previous: IMessage = { - ...baseMessage, - alias: 'alias', - }; - const current: IMessage = { - ...previous, - alias: 'alias2', - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.false; - }); - - it('should return false if message is from system', () => { - MessageTypes.registerType({ - id: 'au', - system: true, - message: 'User_added_by', - }); - const previous: IMessage = { - ...baseMessage, - }; - const current: IMessage = { - ...previous, - ts: new Date('2021-10-27T00:04:59.999Z'), - t: 'au', - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.false; - }); - - it('should return false even if messages should be sequential, but they are from a different day', () => { - const previous: IMessage = { - ...baseMessage, - ts: new Date(2022, 0, 1, 23, 59, 59, 999), - }; - const current: IMessage = { - ...baseMessage, - ts: new Date(2022, 0, 2, 0, 0, 0, 0), - }; - expect(isMessageSequential(current, previous, TIME_RANGE_IN_SECONDS)).to.be.false; - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/isOwnUserMessage.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/isOwnUserMessage.spec.ts deleted file mode 100644 index cc98cdce6647..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/isOwnUserMessage.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* eslint-env mocha */ -import type { IMessage, ISubscription } from '@rocket.chat/core-typings'; -import { expect } from 'chai'; - -import { MessageTypes } from '../../../../../../../app/ui-utils/lib/MessageTypes'; -import { isOwnUserMessage } from '../../../../../../../client/views/room/MessageList/lib/isOwnUserMessage'; - -const date = new Date('2021-10-27T00:00:00.000Z'); - -const baseMessage: IMessage = { - ts: date, - u: { - _id: 'userId', - name: 'userName', - username: 'userName', - }, - msg: 'message', - rid: 'roomId', - _id: 'messageId', - _updatedAt: date, - urls: [], -}; - -// Register a system message -MessageTypes.registerType({ - id: 'au', - system: true, - message: 'User_added_to', -}); - -describe('isUserMessage', () => { - it('should return true if the message is from user', () => { - const message: IMessage = { - ...baseMessage, - }; - - const subscription: ISubscription = { - u: { - _id: 'userId', - }, - } as ISubscription; - - expect(isOwnUserMessage(message, subscription)).to.be.true; - }); - - it('should return false if the message is not from user', () => { - const message: IMessage = { - ...baseMessage, - }; - - const subscription: ISubscription = { - u: { - _id: 'otherUser', - }, - } as ISubscription; - - expect(isOwnUserMessage(message, subscription)).to.be.false; - }); - - it('should return false if there is no subscription', () => { - const message: IMessage = { - ...baseMessage, - }; - - expect(isOwnUserMessage(message, undefined)).to.be.false; - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/isParsedMessage.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/isParsedMessage.spec.ts deleted file mode 100644 index e2e2a57377f2..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/isParsedMessage.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { IMessage } from '@rocket.chat/core-typings'; -import type { Root } from '@rocket.chat/message-parser'; -/* eslint-env mocha */ -import { expect } from 'chai'; - -import { isParsedMessage } from '../../../../../../../client/views/room/MessageList/lib/isParsedMessage'; - -const date = new Date('2021-10-27T00:00:00.000Z'); - -const baseMessage: IMessage = { - ts: date, - u: { - _id: 'userId', - name: 'userName', - username: 'userName', - }, - msg: 'message', - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'message', - }, - ], - }, - ], - rid: 'roomId', - _id: 'messageId', - _updatedAt: date, - urls: [], -}; - -describe('isParsedMessage', () => { - it('should return true if the message parsed', () => { - const message: IMessage = { - ...baseMessage, - }; - - expect(isParsedMessage(message.md as Root)).to.be.true; - }); - - it('should return false if the message is not parsed', () => { - const message: IMessage = { - ...baseMessage, - }; - - expect(isParsedMessage(message.msg as string)).to.be.false; - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessage.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessage.spec.ts deleted file mode 100644 index eeca03982132..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessage.spec.ts +++ /dev/null @@ -1,317 +0,0 @@ -/* eslint-env mocha */ -import type { IMessage, ITranslatedMessage } from '@rocket.chat/core-typings'; -import type { Options, Root } from '@rocket.chat/message-parser'; -import { expect } from 'chai'; - -import { parseMessageTextToAstMarkdown } from '../../../../../../../client/lib/parseMessageTextToAstMarkdown'; - -const date = new Date('2021-10-27T00:00:00.000Z'); - -const parseOptions: Options = { - colors: true, - emoticons: true, - katex: { - dollarSyntax: true, - parenthesisSyntax: true, - }, -}; - -const messageParserTokenMessageWithWrongData: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'message', - }, - { - type: 'BOLD', - value: [ - { - type: 'PLAIN_TEXT', - value: 'bold', - }, - ], - }, - { - type: 'PLAIN_TEXT', - value: ' ', - }, - { - type: 'ITALIC', - value: [ - { - type: 'PLAIN_TEXT', - value: 'italic', - }, - ], - }, - { - type: 'PLAIN_TEXT', - value: ' and ', - }, - { - type: 'STRIKE', - value: [ - { - type: 'PLAIN_TEXT', - value: 'strike', - }, - ], - }, - ], - }, -]; - -const messageParserTokenMessage: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'message ', - }, - { - type: 'BOLD', - value: [ - { - type: 'PLAIN_TEXT', - value: 'bold', - }, - ], - }, - { - type: 'PLAIN_TEXT', - value: ' ', - }, - { - type: 'ITALIC', - value: [ - { - type: 'PLAIN_TEXT', - value: 'italic', - }, - ], - }, - { - type: 'PLAIN_TEXT', - value: ' and ', - }, - { - type: 'STRIKE', - value: [ - { - type: 'PLAIN_TEXT', - value: 'strike', - }, - ], - }, - ], - }, -]; - -const baseMessage: IMessage = { - ts: date, - u: { - _id: 'userId', - name: 'userName', - username: 'userName', - }, - msg: 'message **bold** _italic_ and ~strike~', - rid: 'roomId', - _id: 'messageId', - _updatedAt: date, - urls: [], -}; - -const autoTranslateOptions = { - autoTranslateEnabled: false, - showAutoTranslate: () => false, -}; - -const quoteMessage = { - author_name: 'authorName', - author_link: 'link', - author_icon: 'icon', - md: [], -}; - -describe('parseMessage', () => { - it('should return md property populated if the message is parsed', () => { - expect(parseMessageTextToAstMarkdown(baseMessage, parseOptions, autoTranslateOptions).md).to.deep.equal(messageParserTokenMessage); - }); - - it('should return correct parsed md property populated and fail in comparison with different Root element', () => { - expect(parseMessageTextToAstMarkdown(baseMessage, parseOptions, autoTranslateOptions).md).to.not.deep.equal( - messageParserTokenMessageWithWrongData, - ); - }); - - describe('translated', () => { - const translatedMessage: ITranslatedMessage = { - ...baseMessage, - msg: 'message not translated', - translationProvider: 'provider', - translations: { - en: 'message translated', - }, - }; - const translatedMessageParsed: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'message translated', - }, - ], - }, - ]; - - const enabledAutoTranslatedOptions = { - autoTranslateEnabled: true, - autoTranslateLanguage: 'en', - showAutoTranslate: () => true, - }; - it('should return correct translated parsed md when translate is active', () => { - expect(parseMessageTextToAstMarkdown(translatedMessage, parseOptions, enabledAutoTranslatedOptions).md).to.deep.equal( - translatedMessageParsed, - ); - }); - - it('should return correct attachment translated parsed md when translate is active', () => { - const attachmentTranslatedMessage = { - ...translatedMessage, - attachments: [ - { - description: 'description', - translations: { - en: 'description translated', - }, - }, - ], - }; - const attachmentTranslatedMessageParsed = { - ...translatedMessage, - md: translatedMessageParsed, - attachments: [ - { - description: 'description', - translations: { - en: 'description translated', - }, - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'description translated', - }, - ], - }, - ], - }, - ], - }; - - expect(parseMessageTextToAstMarkdown(attachmentTranslatedMessage, parseOptions, enabledAutoTranslatedOptions)).to.deep.equal( - attachmentTranslatedMessageParsed, - ); - }); - - it('should return correct attachment quote translated parsed md when translate is active', () => { - const attachmentTranslatedMessage = { - ...translatedMessage, - attachments: [ - { - text: 'text', - translations: { - en: 'text translated', - }, - }, - ], - }; - const attachmentTranslatedMessageParsed = { - ...translatedMessage, - md: translatedMessageParsed, - attachments: [ - { - text: 'text', - translations: { - en: 'text translated', - }, - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'text translated', - }, - ], - }, - ], - }, - ], - }; - - expect(parseMessageTextToAstMarkdown(attachmentTranslatedMessage, parseOptions, enabledAutoTranslatedOptions)).to.deep.equal( - attachmentTranslatedMessageParsed, - ); - }); - - it('should return correct multiple attachment quote translated parsed md when translate is active', () => { - const attachmentTranslatedMessage = { - ...translatedMessage, - attachments: [ - { - text: 'text', - translations: { - en: 'text translated', - }, - attachments: [{ ...quoteMessage, text: 'text level 2', translations: { en: 'text level 2 translated' } }], - }, - ], - }; - const attachmentTranslatedMessageParsed = { - ...translatedMessage, - md: translatedMessageParsed, - attachments: [ - { - text: 'text', - translations: { - en: 'text translated', - }, - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'text translated', - }, - ], - }, - ], - attachments: [ - { - ...quoteMessage, - text: 'text level 2', - translations: { - en: 'text level 2 translated', - }, - }, - ], - }, - ], - }; - - expect(parseMessageTextToAstMarkdown(attachmentTranslatedMessage, parseOptions, enabledAutoTranslatedOptions)).to.deep.equal( - attachmentTranslatedMessageParsed, - ); - }); - }); - - // TODO: Add more tests for each type of message and for each type of token -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessageAttachment.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessageAttachment.spec.ts deleted file mode 100644 index 7b94a3cfdef3..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessageAttachment.spec.ts +++ /dev/null @@ -1,191 +0,0 @@ -/* eslint-env mocha */ -import type { MessageQuoteAttachment } from '@rocket.chat/core-typings'; -import type { Options, Root } from '@rocket.chat/message-parser'; -import { expect } from 'chai'; - -import { parseMessageAttachment } from '../../../../../../../client/lib/parseMessageTextToAstMarkdown'; - -const parseOptions: Options = { - colors: true, - emoticons: true, - katex: { - dollarSyntax: true, - parenthesisSyntax: true, - }, -}; - -const messageParserTokenMessage: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'message ', - }, - { - type: 'BOLD', - value: [ - { - type: 'PLAIN_TEXT', - value: 'bold', - }, - ], - }, - { - type: 'PLAIN_TEXT', - value: ' ', - }, - { - type: 'ITALIC', - value: [ - { - type: 'PLAIN_TEXT', - value: 'italic', - }, - ], - }, - { - type: 'PLAIN_TEXT', - value: ' and ', - }, - { - type: 'STRIKE', - value: [ - { - type: 'PLAIN_TEXT', - value: 'strike', - }, - ], - }, - ], - }, -]; - -const autoTranslateOptions = { - autoTranslateEnabled: false, - translated: false, -}; - -const quoteMessage = { - author_name: 'authorName', - author_link: 'link', - author_icon: 'icon', - message_link: 'http://localhost/any_link', - text: 'message **bold** _italic_ and ~strike~', - md: messageParserTokenMessage, -}; - -describe('parseMessageAttachment', () => { - it('should return md property populated if the quote is parsed', () => { - expect(parseMessageAttachment(quoteMessage, parseOptions, autoTranslateOptions).md).to.deep.equal(messageParserTokenMessage); - }); - - it('should return md property populated if the quote is not parsed', () => { - expect( - parseMessageAttachment({ ...quoteMessage, md: undefined } as unknown as MessageQuoteAttachment, parseOptions, autoTranslateOptions) - .md, - ).to.deep.equal(messageParserTokenMessage); - }); - - describe('translated', () => { - const translatedQuote = { - ...quoteMessage, - text: 'quote not translated', - translationProvider: 'provider', - translations: { - en: 'quote translated', - }, - }; - const translatedMessageParsed: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'quote translated', - }, - ], - }, - ]; - - const enabledAutoTranslatedOptions = { - translated: true, - autoTranslateLanguage: 'en', - }; - it('should return correct quote translated parsed md when translate is active', () => { - expect(parseMessageAttachment(translatedQuote, parseOptions, enabledAutoTranslatedOptions).md).to.deep.equal(translatedMessageParsed); - }); - - it('should return text parsed md when translate is active and autoTranslateLanguage is undefined', () => { - expect( - parseMessageAttachment(translatedQuote, parseOptions, { ...enabledAutoTranslatedOptions, autoTranslateLanguage: undefined }).md, - ).to.deep.equal([ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'quote not translated', - }, - ], - }, - ]); - }); - - it('should return correct multiple attachment quote translated parsed md when translate is active', () => { - const quote = { ...quoteMessage, text: 'text level 2', translations: { en: 'text level 2 translated' } }; - - const multipleQuotes = { - ...translatedQuote, - attachments: [ - { - ...translatedQuote, - text: 'text', - translations: { - en: 'text translated', - }, - attachments: [quote], - }, - ], - }; - const multipleQuotesParsed = { - ...translatedQuote, - md: translatedMessageParsed, - attachments: [ - { - ...multipleQuotes.attachments[0], - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'text translated', - }, - ], - }, - ], - attachments: [ - { - ...quote, - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'text level 2 translated', - }, - ], - }, - ], - }, - ], - }, - ], - }; - - expect(parseMessageAttachment(multipleQuotes, parseOptions, enabledAutoTranslatedOptions)).to.deep.equal(multipleQuotesParsed); - }); - }); -}); diff --git a/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessageAttachments.spec.ts b/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessageAttachments.spec.ts deleted file mode 100644 index 23d6944f99f2..000000000000 --- a/apps/meteor/tests/unit/client/views/room/MessageList/lib/parseMessageAttachments.spec.ts +++ /dev/null @@ -1,236 +0,0 @@ -/* eslint-env mocha */ -import type { Options, Root } from '@rocket.chat/message-parser'; -import { expect } from 'chai'; - -import { parseMessageAttachments } from '../../../../../../../client/lib/parseMessageTextToAstMarkdown'; - -const parseOptions: Options = { - colors: true, - emoticons: true, - katex: { - dollarSyntax: true, - parenthesisSyntax: true, - }, -}; - -const messageParserTokenMessage: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'message ', - }, - { - type: 'BOLD', - value: [ - { - type: 'PLAIN_TEXT', - value: 'bold', - }, - ], - }, - { - type: 'PLAIN_TEXT', - value: ' ', - }, - { - type: 'ITALIC', - value: [ - { - type: 'PLAIN_TEXT', - value: 'italic', - }, - ], - }, - { - type: 'PLAIN_TEXT', - value: ' and ', - }, - { - type: 'STRIKE', - value: [ - { - type: 'PLAIN_TEXT', - value: 'strike', - }, - ], - }, - ], - }, -]; - -const autoTranslateOptions = { - autoTranslateEnabled: false, - translated: false, -}; - -const attachmentMessage = [ - { - description: 'message **bold** _italic_ and ~strike~', - md: messageParserTokenMessage, - }, -]; - -describe('parseMessageAttachments', () => { - it('should return md property populated if the message is parsed', () => { - expect(parseMessageAttachments(attachmentMessage, parseOptions, autoTranslateOptions)[0].md).to.deep.equal(messageParserTokenMessage); - }); - - it('should return md property populated if the attachment is not parsed', () => { - expect(parseMessageAttachments([{ ...attachmentMessage[0], md: undefined }], parseOptions, autoTranslateOptions)[0].md).to.deep.equal( - messageParserTokenMessage, - ); - }); - - describe('translated', () => { - const enabledAutoTranslatedOptions = { - translated: true, - autoTranslateLanguage: 'en', - }; - - it('should return correct attachment description translated parsed md when translate is active', () => { - const descriptionAttachment = [ - { - ...attachmentMessage[0], - description: 'attachment not translated', - translationProvider: 'provider', - translations: { - en: 'attachment translated', - }, - }, - ]; - const descriptionAttachmentParsed: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'attachment translated', - }, - ], - }, - ]; - - expect(parseMessageAttachments(descriptionAttachment, parseOptions, enabledAutoTranslatedOptions)[0].md).to.deep.equal( - descriptionAttachmentParsed, - ); - }); - - it('should return correct attachment description parsed md when translate is active and auto translate language is undefined', () => { - const descriptionAttachment = [ - { - ...attachmentMessage[0], - description: 'attachment not translated', - translationProvider: 'provider', - translations: { - en: 'attachment translated', - }, - }, - ]; - const descriptionAttachmentParsed: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'attachment not translated', - }, - ], - }, - ]; - - expect( - parseMessageAttachments(descriptionAttachment, parseOptions, { - ...enabledAutoTranslatedOptions, - autoTranslateLanguage: undefined, - })[0].md, - ).to.deep.equal(descriptionAttachmentParsed); - }); - - it('should return correct attachment text translated parsed md when translate is active', () => { - const textAttachment = [ - { - ...attachmentMessage[0], - text: 'attachment not translated', - translationProvider: 'provider', - translations: { - en: 'attachment translated', - }, - }, - ]; - const textAttachmentParsed: Root = [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'attachment translated', - }, - ], - }, - ]; - - expect(parseMessageAttachments(textAttachment, parseOptions, enabledAutoTranslatedOptions)[0].md).to.deep.equal(textAttachmentParsed); - }); - - it('should return correct attachment text translated parsed md when translate is active and has multiple texts', () => { - const quote = { - author_name: 'authorName', - author_link: 'link', - author_icon: 'icon', - message_link: 'messageLink', - md: [], - text: 'text level 2', - translations: { en: 'text level 2 translated' }, - }; - const textAttachment = [ - { - ...quote, - text: 'attachment not translated', - translationProvider: 'provider', - translations: { - en: 'attachment translated', - }, - attachments: [quote], - }, - ]; - const textAttachmentParsed = { - ...textAttachment[0], - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'attachment translated', - }, - ], - }, - ], - attachments: [ - { - ...quote, - text: 'text level 2', - translations: { - en: 'text level 2 translated', - }, - md: [ - { - type: 'PARAGRAPH', - value: [ - { - type: 'PLAIN_TEXT', - value: 'text level 2 translated', - }, - ], - }, - ], - }, - ], - }; - - expect(parseMessageAttachments(textAttachment, parseOptions, enabledAutoTranslatedOptions)[0]).to.deep.equal(textAttachmentParsed); - }); - }); -}); diff --git a/apps/meteor/tests/unit/client/views/root/SAMLLoginRoute.spec.tsx b/apps/meteor/tests/unit/client/views/root/SAMLLoginRoute.spec.tsx deleted file mode 100644 index bfd0d9ec0a6b..000000000000 --- a/apps/meteor/tests/unit/client/views/root/SAMLLoginRoute.spec.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { MockedServerContext, MockedUserContext } from '@rocket.chat/mock-providers'; -import { render } from '@testing-library/react'; -import '@testing-library/jest-dom'; -import { Meteor } from 'meteor/meteor'; -import React from 'react'; -import sinon from 'sinon'; - -import SAMLLoginRoute from '../../../../../client/views/root/SAMLLoginRoute'; -import RouterContextMock from '../../../../mocks/client/RouterContextMock'; - -const loginWithSamlTokenStub = Meteor.loginWithSamlToken as sinon.SinonStub; -const navigateStub = sinon.stub(); - -describe('views/root/SAMLLoginRoute', () => { - beforeEach(() => { - jest.clearAllMocks(); - navigateStub.resetHistory(); - loginWithSamlTokenStub.reset(); - loginWithSamlTokenStub.callsFake((_token, callback) => callback()); - }); - - it('should redirect to /home when userId is not null', async () => { - render( - - - - - - - , - ); - - expect(navigateStub.calledTwice).toBe(true); - expect( - navigateStub.calledWith( - sinon.match({ - pathname: '/home', - }), - ), - ).toBe(true); - }); - - it('should redirect to /home when userId is null and redirectUrl is not within the workspace domain', async () => { - render( - - - - - , - ); - - expect( - navigateStub.calledOnceWith( - sinon.match({ - pathname: '/home', - }), - ), - ).toBe(true); - }); - - it('should redirect to the provided redirectUrl when userId is null and redirectUrl is within the workspace domain', async () => { - render( - - - - - , - ); - - expect( - navigateStub.calledOnceWith( - sinon.match({ - pathname: '/invite/test', - }), - ), - ).toBe(true); - }); - - it('should call loginWithSamlToken when component is mounted', async () => { - render( - - - - - , - ); - - expect(loginWithSamlTokenStub.calledOnceWith(undefined)).toBe(true); - }); - - it('should call loginWithSamlToken with the token when it is present', async () => { - render( - - - - - , - ); - - expect(loginWithSamlTokenStub.calledOnceWith('testToken')).toBe(true); - }); -}); diff --git a/apps/meteor/tests/unit/server/federation/infrastructure/rocket-chat/hooks/hooks.spec.ts b/apps/meteor/tests/unit/server/federation/infrastructure/rocket-chat/hooks/hooks.spec.ts index 7d3e664022c8..c77f6e4993fa 100644 --- a/apps/meteor/tests/unit/server/federation/infrastructure/rocket-chat/hooks/hooks.spec.ts +++ b/apps/meteor/tests/unit/server/federation/infrastructure/rocket-chat/hooks/hooks.spec.ts @@ -507,7 +507,7 @@ describe('Federation - Infrastructure - RocketChat - Hooks', () => { get.returns(true); const stub = sinon.stub(); FederationHooks.afterMessageUpdated(stub); - hooks['federation-v2-after-room-message-updated'](message, { federated: true, _id: 'roomId' }); + hooks['federation-v2-after-room-message-updated'](message, { room: { federated: true, _id: 'roomId' } }); expect(stub.calledWith(message, 'roomId', 'userId')).to.be.true; }); }); @@ -551,7 +551,7 @@ describe('Federation - Infrastructure - RocketChat - Hooks', () => { get.returns(true); const stub = sinon.stub(); FederationHooks.afterMessageSent(stub); - hooks['federation-v2-after-room-message-sent']({ u: { _id: 'userId' } }, { federated: true, _id: 'roomId' }); + hooks['federation-v2-after-room-message-sent']({ u: { _id: 'userId' } }, { room: { federated: true, _id: 'roomId' } }); expect(stub.calledWith({ u: { _id: 'userId' } }, 'roomId', 'userId')).to.be.true; }); }); diff --git a/apps/meteor/tests/unit/server/livechat/hooks/beforeNewRoom.spec.ts b/apps/meteor/tests/unit/server/livechat/hooks/beforeNewRoom.spec.ts new file mode 100644 index 000000000000..9ba9ae73fe57 --- /dev/null +++ b/apps/meteor/tests/unit/server/livechat/hooks/beforeNewRoom.spec.ts @@ -0,0 +1,52 @@ +import { expect } from 'chai'; +import { describe, it, beforeEach } from 'mocha'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +import { callbacks } from '../../../../../lib/callbacks'; + +const findStub = sinon.stub(); + +proxyquire.noCallThru().load('../../../../../ee/app/livechat-enterprise/server/hooks/beforeNewRoom.ts', { + 'meteor/meteor': { + Meteor: { + Error, + }, + }, + '@rocket.chat/models': { + OmnichannelServiceLevelAgreements: { + findOneByIdOrName: findStub, + }, + }, +}); + +describe('livechat.beforeRoom', () => { + beforeEach(() => findStub.withArgs('high').resolves({ _id: 'high' }).withArgs('invalid').resolves(null)); + + it('should return roomInfo with customFields when provided', async () => { + const roomInfo = { name: 'test' }; + const extraData = { customFields: { test: 'test' } }; + const result = await callbacks.run('livechat.beforeRoom', roomInfo, extraData); + expect(result).to.deep.equal({ ...roomInfo, customFields: extraData.customFields }); + }); + + it('should throw an error when provided with an invalid sla', async () => { + const roomInfo = { name: 'test' }; + const extraData = { customFields: { test: 'test' }, sla: 'invalid' }; + await expect(callbacks.run('livechat.beforeRoom', roomInfo, extraData)).to.be.rejectedWith(Error, 'error-invalid-sla'); + }); + + it('should not include field in roomInfo when extraData has field other than customFields, sla', async () => { + const roomInfo = { name: 'test' }; + const extraData = { customFields: { test: 'test' }, sla: 'high' }; + const result = await callbacks.run('livechat.beforeRoom', roomInfo, extraData); + expect(result).to.deep.equal({ ...roomInfo, customFields: extraData.customFields, slaId: 'high' }); + }); + + it('should return roomInfo with no customFields when customFields is not an object', async () => { + const roomInfo = { name: 'test' }; + const extraData = { customFields: 'not an object' }; + const result = await callbacks.run('livechat.beforeRoom', roomInfo, extraData); + expect(result).to.deep.equal({ ...roomInfo }); + }); +}); diff --git a/docker-compose-ci.yml b/docker-compose-ci.yml index 67b89d61ef52..23ee3b125524 100644 --- a/docker-compose-ci.yml +++ b/docker-compose-ci.yml @@ -30,6 +30,7 @@ services: traefik.http.services.rocketchat.loadbalancer.server.port: 3000 traefik.http.routers.rocketchat.service: rocketchat traefik.http.routers.rocketchat.rule: PathPrefix(`/`) + traefik.http.middlewares.test-retry.retry.attempts: 4 authorization-service: platform: linux/amd64 @@ -162,9 +163,10 @@ services: image: nats:2.6-alpine traefik: - image: traefik:v2.8 + image: traefik:v3.1 command: - --providers.docker=true + - '--serverstransport.maxidleconnsperhost=-1' ports: - 3000:80 volumes: diff --git a/ee/apps/account-service/CHANGELOG.md b/ee/apps/account-service/CHANGELOG.md index 88e9f42c4464..fd5eb3925946 100644 --- a/ee/apps/account-service/CHANGELOG.md +++ b/ee/apps/account-service/CHANGELOG.md @@ -1,5 +1,140 @@ # @rocket.chat/account-service +## 0.4.3 + +### Patch Changes + +- ([#32527](https://github.com/RocketChat/Rocket.Chat/pull/32527)) Fixed an inconsistent evaluation of the `Accounts_LoginExpiration` setting over the codebase. In some places, it was being used as milliseconds while in others as days. Invalid values produced different results. A helper function was created to centralize the setting validation and the proper value being returned to avoid edge cases. + Negative values may be saved on the settings UI panel but the code will interpret any negative, NaN or 0 value to the default expiration which is 90 days. +-
    Updated dependencies [8fc6ca8b4e, 439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/tools@0.2.2 + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 + - @rocket.chat/rest-typings@6.11.0 +
    + +## 0.4.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.4.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.4.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.4.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.4.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.4.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.4.3-rc.0 + +### Patch Changes + +- ([#32527](https://github.com/RocketChat/Rocket.Chat/pull/32527)) Fixed an inconsistent evaluation of the `Accounts_LoginExpiration` setting over the codebase. In some places, it was being used as milliseconds while in others as days. Invalid values produced different results. A helper function was created to centralize the setting validation and the proper value being returned to avoid edge cases. + Negative values may be saved on the settings UI panel but the code will interpret any negative, NaN or 0 value to the default expiration which is 90 days. +-
    Updated dependencies [8fc6ca8b4e, 439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/tools@0.2.2-rc.0 + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 + +## 0.4.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.4.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.4.0 ### Minor Changes diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index 194a3e1760e5..ac28eb76e76d 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/account-service", "private": true, - "version": "0.4.0", + "version": "0.4.3", "description": "Rocket.Chat Account service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/authorization-service/CHANGELOG.md b/ee/apps/authorization-service/CHANGELOG.md index 9d7701e2ab0f..df7be3c9b1eb 100644 --- a/ee/apps/authorization-service/CHANGELOG.md +++ b/ee/apps/authorization-service/CHANGELOG.md @@ -1,5 +1,135 @@ # @rocket.chat/authorization-service +## 0.4.3 + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 + - @rocket.chat/rest-typings@6.11.0 +
    + +## 0.4.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.4.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.4.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.4.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.4.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.4.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.4.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 +
    + +## 0.4.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.4.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.4.0 ### Minor Changes diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index 6b4830f918d6..bff15e7f7d91 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/authorization-service", "private": true, - "version": "0.4.0", + "version": "0.4.3", "description": "Rocket.Chat Authorization service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/ddp-streamer/CHANGELOG.md b/ee/apps/ddp-streamer/CHANGELOG.md index f19a4a40be4a..1162e17c05d7 100644 --- a/ee/apps/ddp-streamer/CHANGELOG.md +++ b/ee/apps/ddp-streamer/CHANGELOG.md @@ -1,5 +1,167 @@ # @rocket.chat/ddp-streamer +## 0.3.3 + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 4e8aa575a6, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/ui-contexts@9.0.0 + - @rocket.chat/models@0.2.0 + - @rocket.chat/rest-typings@6.11.0 + - @rocket.chat/instance-status@0.1.3 +
    + +## 0.3.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/ui-contexts@9.0.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 + - @rocket.chat/instance-status@0.1.3-rc.6 +
    + +## 0.3.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/ui-contexts@9.0.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 + - @rocket.chat/instance-status@0.1.3-rc.5 +
    + +## 0.3.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/ui-contexts@9.0.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 + - @rocket.chat/instance-status@0.1.3-rc.4 +
    + +## 0.3.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/ui-contexts@9.0.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 + - @rocket.chat/instance-status@0.1.3-rc.3 +
    + +## 0.3.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/ui-contexts@9.0.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 + - @rocket.chat/instance-status@0.1.3-rc.2 +
    + +## 0.3.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/ui-contexts@9.0.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 + - @rocket.chat/instance-status@0.1.2-rc.1 +
    + +## 0.3.3-rc.0 + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 4e8aa575a6, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/ui-contexts@9.0.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 + - @rocket.chat/instance-status@0.1.2-rc.0 +
    + +## 0.3.2 + +### Patch Changes + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/ui-contexts@8.0.2 + - @rocket.chat/models@0.1.2 + - @rocket.chat/instance-status@0.1.2 +
    + +## 0.3.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/ui-contexts@8.0.1 + - @rocket.chat/models@0.1.1 + - @rocket.chat/instance-status@0.1.1 +
    + ## 0.3.0 ### Minor Changes diff --git a/ee/apps/ddp-streamer/Dockerfile b/ee/apps/ddp-streamer/Dockerfile index 893fdcff858b..f556cbde6752 100644 --- a/ee/apps/ddp-streamer/Dockerfile +++ b/ee/apps/ddp-streamer/Dockerfile @@ -26,9 +26,6 @@ COPY ./packages/peggy-loader/dist packages/peggy-loader/dist COPY ./packages/password-policies/package.json packages/password-policies/package.json COPY ./packages/password-policies/dist packages/password-policies/dist -COPY ./packages/ui-contexts/package.json packages/ui-contexts/package.json -COPY ./packages/ui-contexts/dist packages/ui-contexts/dist - COPY ./packages/model-typings/package.json packages/model-typings/package.json COPY ./packages/model-typings/dist packages/model-typings/dist diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index b20066036c20..fdee5d5d3b9a 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/ddp-streamer", "private": true, - "version": "0.3.0", + "version": "0.3.3", "description": "Rocket.Chat DDP-Streamer service", "scripts": { "build": "tsc -p tsconfig.json", @@ -15,7 +15,7 @@ ], "author": "Rocket.Chat", "dependencies": { - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.0", "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "~0.31.25", @@ -25,7 +25,6 @@ "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@rocket.chat/string-helpers": "~0.31.25", - "@rocket.chat/ui-contexts": "workspace:^", "colorette": "^1.4.0", "ejson": "^2.2.3", "event-loop-stats": "^1.4.1", @@ -45,6 +44,7 @@ "ws": "^8.8.1" }, "devDependencies": { + "@rocket.chat/ddp-client": "workspace:~", "@rocket.chat/eslint-config": "workspace:^", "@types/ejson": "^2.2.1", "@types/gc-stats": "^1.4.2", diff --git a/ee/apps/ddp-streamer/src/Streamer.ts b/ee/apps/ddp-streamer/src/Streamer.ts index fcb2d9decf5e..686e3224d7ef 100644 --- a/ee/apps/ddp-streamer/src/Streamer.ts +++ b/ee/apps/ddp-streamer/src/Streamer.ts @@ -1,5 +1,5 @@ import { api } from '@rocket.chat/core-services'; -import type { StreamNames } from '@rocket.chat/ui-contexts'; +import type { StreamNames } from '@rocket.chat/ddp-client'; import type { DDPSubscription, Connection, TransformMessage } from 'meteor/rocketchat:streamer'; import WebSocket from 'ws'; diff --git a/ee/apps/omnichannel-transcript/CHANGELOG.md b/ee/apps/omnichannel-transcript/CHANGELOG.md index 935b90c2bc3c..aac67c02dd3d 100644 --- a/ee/apps/omnichannel-transcript/CHANGELOG.md +++ b/ee/apps/omnichannel-transcript/CHANGELOG.md @@ -1,5 +1,147 @@ # @rocket.chat/omnichannel-transcript +## 0.4.3 + +### Patch Changes + +-
    Updated dependencies [8fc6ca8b4e, 439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/tools@0.2.2 + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/omnichannel-services@0.3.0 + - @rocket.chat/pdf-worker@0.2.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 +
    + +## 0.4.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/omnichannel-services@0.3.0-rc.6 + - @rocket.chat/pdf-worker@0.2.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.4.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/omnichannel-services@0.3.0-rc.5 + - @rocket.chat/pdf-worker@0.2.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.4.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/omnichannel-services@0.3.0-rc.4 + - @rocket.chat/pdf-worker@0.2.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.4.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/omnichannel-services@0.3.0-rc.3 + - @rocket.chat/pdf-worker@0.2.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.4.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/omnichannel-services@0.3.0-rc.2 + - @rocket.chat/pdf-worker@0.2.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.4.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/omnichannel-services@0.3.0-rc.1 + - @rocket.chat/pdf-worker@0.2.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.4.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [8fc6ca8b4e, 439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/tools@0.2.2-rc.0 + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/omnichannel-services@0.3.0-rc.0 + - @rocket.chat/pdf-worker@0.2.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 +
    + +## 0.4.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/omnichannel-services@0.2.2 + - @rocket.chat/pdf-worker@0.1.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.4.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/omnichannel-services@0.2.1 + - @rocket.chat/pdf-worker@0.1.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.4.0 ### Minor Changes diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index 5acae19a3660..c60542c180ec 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/omnichannel-transcript", "private": true, - "version": "0.4.0", + "version": "0.4.3", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", @@ -43,7 +43,6 @@ }, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/ui-contexts": "workspace:^", "@types/gc-stats": "^1.4.2", "@types/polka": "^0.5.6", "eslint": "~8.45.0", diff --git a/ee/apps/presence-service/CHANGELOG.md b/ee/apps/presence-service/CHANGELOG.md index 54d88fa70219..b9544b0cdde9 100644 --- a/ee/apps/presence-service/CHANGELOG.md +++ b/ee/apps/presence-service/CHANGELOG.md @@ -1,5 +1,135 @@ # @rocket.chat/presence-service +## 0.4.3 + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 + - @rocket.chat/presence@0.2.3 +
    + +## 0.4.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/presence@0.2.3-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.4.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/presence@0.2.3-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.4.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/presence@0.2.3-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.4.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/presence@0.2.3-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.4.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/presence@0.2.3-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.4.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/presence@0.2.2-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.4.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/presence@0.2.2-rc.0 +
    + +## 0.4.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/presence@0.2.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.4.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/presence@0.2.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.4.0 ### Minor Changes diff --git a/ee/apps/presence-service/Dockerfile b/ee/apps/presence-service/Dockerfile index a6b6e641a39d..aa9c1c0bd6c9 100644 --- a/ee/apps/presence-service/Dockerfile +++ b/ee/apps/presence-service/Dockerfile @@ -43,9 +43,6 @@ COPY ./packages/server-cloud-communication/ packages/server-cloud-communication/ COPY ./ee/packages/license/package.json packages/license/package.json COPY ./ee/packages/license/dist packages/license/dist -COPY ./packages/ui-contexts/package.json packages/ui-contexts/package.json -COPY ./packages/ui-contexts/dist packages/ui-contexts/dist - COPY ./packages/ui-kit/package.json packages/ui-kit/package.json COPY ./packages/ui-kit/dist packages/ui-kit/dist diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index 850cc96c3429..c800dd4d6c80 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/presence-service", "private": true, - "version": "0.4.0", + "version": "0.4.3", "description": "Rocket.Chat Presence service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/queue-worker/CHANGELOG.md b/ee/apps/queue-worker/CHANGELOG.md index 636ec40b1c23..12271005af74 100644 --- a/ee/apps/queue-worker/CHANGELOG.md +++ b/ee/apps/queue-worker/CHANGELOG.md @@ -1,5 +1,135 @@ # @rocket.chat/queue-worker +## 0.4.3 + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/omnichannel-services@0.3.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 +
    + +## 0.4.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/omnichannel-services@0.3.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.4.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/omnichannel-services@0.3.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.4.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/omnichannel-services@0.3.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.4.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/omnichannel-services@0.3.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.4.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/omnichannel-services@0.3.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.4.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/omnichannel-services@0.3.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.4.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/omnichannel-services@0.3.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 +
    + +## 0.4.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/omnichannel-services@0.2.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.4.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/omnichannel-services@0.2.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.4.0 ### Minor Changes diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index d4737556e665..0a227cb271c0 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/queue-worker", "private": true, - "version": "0.4.0", + "version": "0.4.3", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/stream-hub-service/CHANGELOG.md b/ee/apps/stream-hub-service/CHANGELOG.md index 4fa60570b11c..3fbf664a0b30 100644 --- a/ee/apps/stream-hub-service/CHANGELOG.md +++ b/ee/apps/stream-hub-service/CHANGELOG.md @@ -1,5 +1,125 @@ # @rocket.chat/stream-hub-service +## 0.4.3 + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 +
    + +## 0.4.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.4.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.4.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.4.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.4.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.4.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.4.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 +
    + +## 0.4.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.4.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.4.0 ### Minor Changes diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index 5b7f0d15d7fc..812522a5f1d8 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/stream-hub-service", "private": true, - "version": "0.4.0", + "version": "0.4.3", "description": "Rocket.Chat Stream Hub service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/packages/api-client/CHANGELOG.md b/ee/packages/api-client/CHANGELOG.md index 613f4f79cda6..8fe130aeaf28 100644 --- a/ee/packages/api-client/CHANGELOG.md +++ b/ee/packages/api-client/CHANGELOG.md @@ -1,5 +1,105 @@ # @rocket.chat/api-client +## 0.2.3 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/rest-typings@6.11.0 +
    + +## 0.2.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 +
    + +## 0.2.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 +
    + +## 0.2.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 +
    + +## 0.2.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 +
    + +## 0.2.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 +
    + +## 0.2.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 +
    + +## 0.2.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 +
    + +## 0.2.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 +
    + +## 0.2.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 +
    + ## 0.2.0 ### Minor Changes diff --git a/ee/packages/api-client/jest.config.ts b/ee/packages/api-client/jest.config.ts index 455fa3a054f2..2905f298e766 100644 --- a/ee/packages/api-client/jest.config.ts +++ b/ee/packages/api-client/jest.config.ts @@ -1,13 +1,7 @@ +import client from '@rocket.chat/jest-presets/client'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', - errorOnDeprecated: true, - testEnvironment: 'jsdom', - modulePathIgnorePatterns: ['/dist/'], - transform: { - '^.+\\.(t|j)sx?$': '@swc/jest', - }, - moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', - }, - collectCoverage: true, -}; + preset: client.preset, + setupFilesAfterEnv: [...client.setupFilesAfterEnv], +} satisfies Config; diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index 043733fe9a62..43de20583d47 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -1,23 +1,22 @@ { "name": "@rocket.chat/api-client", - "version": "0.2.0", + "version": "0.2.3", "devDependencies": { - "@swc/core": "^1.3.95", - "@swc/jest": "^0.2.29", - "@types/jest": "~29.5.7", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "@types/strict-uri-encode": "^2.0.1", "eslint": "~8.45.0", - "jest": "~29.6.4", + "jest": "~29.7.0", "jest-fetch-mock": "^3.0.3", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "scripts": { + "build": "tsc", + "dev": "tsc --watch --preserveWatchOutput", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "testunit": "jest", - "build": "tsc -p tsconfig.json", - "dev": "tsc --watch --preserveWatchOutput -p tsconfig.json" + "test": "jest", + "testunit": "jest" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", @@ -31,5 +30,8 @@ "query-string": "^7.1.3", "split-on-first": "^3.0.0", "strict-uri-encode": "^2.0.0" + }, + "volta": { + "extends": "../../../package.json" } } diff --git a/ee/packages/ddp-client/CHANGELOG.md b/ee/packages/ddp-client/CHANGELOG.md index c75ce3f978b1..0f9b5f7f26b3 100644 --- a/ee/packages/ddp-client/CHANGELOG.md +++ b/ee/packages/ddp-client/CHANGELOG.md @@ -1,5 +1,105 @@ # @rocket.chat/ddp-client +## 0.3.3 + +### Patch Changes + +-
    Updated dependencies [264d7d5496, b8e5887fb9]: + + - @rocket.chat/rest-typings@6.11.0 + - @rocket.chat/api-client@0.2.3 +
    + +## 0.3.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/api-client@0.2.3-rc.6 +
    + +## 0.3.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/api-client@0.2.3-rc.5 +
    + +## 0.3.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/api-client@0.2.3-rc.4 +
    + +## 0.3.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/api-client@0.2.3-rc.3 +
    + +## 0.3.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/api-client@0.2.3-rc.2 +
    + +## 0.3.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/api-client@0.2.2-rc.1 +
    + +## 0.3.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [264d7d5496, b8e5887fb9]: + + - @rocket.chat/rest-typings@6.11.0-rc.0 + - @rocket.chat/api-client@0.2.2-rc.0 +
    + +## 0.3.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/api-client@0.2.2 +
    + +## 0.3.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/api-client@0.2.1 +
    + ## 0.3.0 ### Minor Changes diff --git a/ee/packages/ddp-client/jest.config.ts b/ee/packages/ddp-client/jest.config.ts index eb3f38119a73..513d37db1e9c 100644 --- a/ee/packages/ddp-client/jest.config.ts +++ b/ee/packages/ddp-client/jest.config.ts @@ -1,14 +1,7 @@ +import client from '@rocket.chat/jest-presets/client'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', - errorOnDeprecated: true, - testEnvironment: 'jsdom', - modulePathIgnorePatterns: ['/dist/'], - testMatch: ['**/**.spec.ts'], - transform: { - '^.+\\.(t|j)sx?$': '@swc/jest', - }, - moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', - }, - collectCoverage: true, -}; + preset: client.preset, + modulePathIgnorePatterns: ['/__tests__/helpers'], +} satisfies Config; diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index 394a0b436180..9e4fdfd85910 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -1,16 +1,13 @@ { "name": "@rocket.chat/ddp-client", - "version": "0.3.0", + "version": "0.3.3", "devDependencies": { - "@swc/core": "^1.3.95", - "@swc/jest": "^0.2.29", - "@types/jest": "^29.5.12", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "@types/ws": "^8.5.8", "eslint": "~8.45.0", - "jest": "~29.6.4", - "jest-environment-jsdom": "~29.6.4", - "jest-websocket-mock": "^2.4.0", - "ts-jest": "^29.1.2", + "jest": "~29.7.0", + "jest-websocket-mock": "~2.5.0", "typescript": "~5.3.3", "ws": "^8.13.0" }, @@ -18,12 +15,12 @@ "@rocket.chat/emitter": "*" }, "scripts": { + "build": "tsc", + "dev": "tsc --watch --preserveWatchOutput", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "unit": "jest", - "testunit": "jest", - "build": "rm -rf dist && tsc -p tsconfig.json", - "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" + "test": "jest", + "testunit": "jest" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", @@ -35,6 +32,7 @@ }, "dependencies": { "@rocket.chat/api-client": "workspace:^", + "@rocket.chat/core-typings": "workspace:~", "@rocket.chat/rest-typings": "workspace:^" } } diff --git a/ee/packages/ddp-client/src/index.ts b/ee/packages/ddp-client/src/index.ts index 2c0fec409180..15f13add5a3a 100644 --- a/ee/packages/ddp-client/src/index.ts +++ b/ee/packages/ddp-client/src/index.ts @@ -1,3 +1,8 @@ export * from './DDPSDK'; export * from './legacy/RocketchatSDKLegacy'; export * from './livechat/LivechatClientImpl'; +export * from './livechat/types/LivechatSDK'; +export * from './types/ClientStream'; +export * from './types/methods'; +export * from './types/streams'; +export type { SDK } from './types/SDK'; diff --git a/ee/packages/ddp-client/src/types/methods.ts b/ee/packages/ddp-client/src/types/methods.ts index 711f5dd79343..f8a7052c3266 100644 --- a/ee/packages/ddp-client/src/types/methods.ts +++ b/ee/packages/ddp-client/src/types/methods.ts @@ -11,7 +11,3 @@ export type ServerMethodName = keyof ServerMethods; export type ServerMethodParameters = Parameters; export type ServerMethodReturn = Awaited>; - -export type ServerMethodFunction = ( - ...args: ServerMethodParameters -) => Promise>; diff --git a/ee/packages/license/CHANGELOG.md b/ee/packages/license/CHANGELOG.md index e8ca375a5559..8cc9df0dd502 100644 --- a/ee/packages/license/CHANGELOG.md +++ b/ee/packages/license/CHANGELOG.md @@ -1,5 +1,95 @@ # @rocket.chat/license +## 0.2.3 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0 +
    + +## 0.2.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 +
    + +## 0.2.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 +
    + +## 0.2.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 +
    + +## 0.2.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 +
    + +## 0.2.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 +
    + +## 0.2.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 +
    + +## 0.2.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0-rc.0 +
    + +## 0.2.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 +
    + +## 0.2.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 +
    + ## 0.2.0 ### Minor Changes diff --git a/ee/packages/license/jest.config.ts b/ee/packages/license/jest.config.ts index 21121603f6e0..a89df51443e5 100644 --- a/ee/packages/license/jest.config.ts +++ b/ee/packages/license/jest.config.ts @@ -1,16 +1,7 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', - errorOnDeprecated: true, - modulePathIgnorePatterns: ['/dist/'], - testMatch: ['**/**.spec.ts'], - transform: { - '^.+\\.(t|j)sx?$': '@swc/jest', - }, - // transformIgnorePatterns: ['!node_modules/jose'], - moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', - '^jose$': require.resolve('jose'), - }, - collectCoverage: true, - collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'], -}; + preset: server.preset, + modulePathIgnorePatterns: ['/__tests__/MockedLicenseBuilder'], +} satisfies Config; diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json index 45e2d7b7d810..1c746514d443 100644 --- a/ee/packages/license/package.json +++ b/ee/packages/license/package.json @@ -1,29 +1,24 @@ { "name": "@rocket.chat/license", - "version": "0.2.0", + "version": "0.2.3", "private": true, "devDependencies": { - "@swc/core": "^1.3.95", - "@swc/jest": "^0.2.29", + "@rocket.chat/jest-presets": "workspace:~", "@types/bcrypt": "^5.0.1", - "@types/jest": "~29.5.7", + "@types/jest": "~29.5.12", "@types/ws": "^8.5.8", "eslint": "~8.45.0", - "jest": "~29.6.4", - "jest-environment-jsdom": "~29.6.4", - "jest-websocket-mock": "^2.4.0", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", + "jest-websocket-mock": "~2.5.0", "typescript": "~5.3.3" }, "scripts": { + "build": "tsc", + "dev": "tsc --watch --preserveWatchOutput", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", "test": "jest", - "testunit": "jest", - "build": "npm run build:types && npm run build:js", - "build:types": "tsc --emitDeclarationOnly", - "build:js": "rm -rf dist && tsc -p tsconfig.json", - "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" + "testunit": "jest" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", diff --git a/ee/packages/omnichannel-services/CHANGELOG.md b/ee/packages/omnichannel-services/CHANGELOG.md index 6439fa133a75..a4a49de7aa30 100644 --- a/ee/packages/omnichannel-services/CHANGELOG.md +++ b/ee/packages/omnichannel-services/CHANGELOG.md @@ -1,5 +1,163 @@ # @rocket.chat/omnichannel-services +## 0.3.0 + +### Minor Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +### Patch Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Reduced time on generation of PDF transcripts. Earlier Rocket.Chat was fetching the required translations everytime a PDF transcript was requested, this process was async and was being unnecessarily being performed on every pdf transcript request. This PR improves this and now the translations are loaded at the start and kept in memory to process further pdf transcripts requests. This reduces the time of asynchronously fetching translations again and again. + +-
    Updated dependencies [8fc6ca8b4e, 439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/tools@0.2.2 + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/pdf-worker@0.2.0 + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 + - @rocket.chat/rest-typings@6.11.0 +
    + +## 0.3.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/pdf-worker@0.2.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.3.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/pdf-worker@0.2.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.3.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/pdf-worker@0.2.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.3.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/pdf-worker@0.2.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.3.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/pdf-worker@0.2.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.3.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/pdf-worker@0.2.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.3.0-rc.0 + +### Minor Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +### Patch Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Reduced time on generation of PDF transcripts. Earlier Rocket.Chat was fetching the required translations everytime a PDF transcript was requested, this process was async and was being unnecessarily being performed on every pdf transcript request. This PR improves this and now the translations are loaded at the start and kept in memory to process further pdf transcripts requests. This reduces the time of asynchronously fetching translations again and again. + +-
    Updated dependencies [8fc6ca8b4e, 439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 03c8b066f9, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/tools@0.2.2-rc.0 + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/pdf-worker@0.2.0-rc.0 + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 +
    + +## 0.2.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/pdf-worker@0.1.2 + - @rocket.chat/model-typings@0.5.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.2.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/pdf-worker@0.1.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/model-typings@0.5.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.2.0 ### Minor Changes diff --git a/ee/packages/omnichannel-services/jest.config.ts b/ee/packages/omnichannel-services/jest.config.ts new file mode 100644 index 000000000000..c18c8ae02465 --- /dev/null +++ b/ee/packages/omnichannel-services/jest.config.ts @@ -0,0 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + +export default { + preset: server.preset, +} satisfies Config; diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index f61b7759dcc5..f520d82bd7d3 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -1,13 +1,13 @@ { "name": "@rocket.chat/omnichannel-services", - "version": "0.2.0", + "version": "0.3.0", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", - "@types/jest": "~29.5.7", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "dependencies": { @@ -22,6 +22,7 @@ "@rocket.chat/string-helpers": "~0.31.25", "@rocket.chat/tools": "workspace:^", "@types/node": "^14.18.63", + "date-fns": "^2.28.0", "ejson": "^2.2.3", "emoji-toolkit": "^7.0.1", "eventemitter3": "^4.0.7", diff --git a/ee/packages/omnichannel-services/src/OmnichannelTranscript.fixtures.ts b/ee/packages/omnichannel-services/src/OmnichannelTranscript.fixtures.ts new file mode 100644 index 000000000000..7cf3c3e5aa07 --- /dev/null +++ b/ee/packages/omnichannel-services/src/OmnichannelTranscript.fixtures.ts @@ -0,0 +1,70 @@ +import type { MessageTypesValues } from '@rocket.chat/core-typings'; + +export const validFile = { name: 'screenshot.png', buffer: Buffer.from([1, 2, 3]) }; + +export const invalidFile = { name: 'audio.mp3', buffer: null }; + +export const messages = [ + { + msg: 'Hello, how can I help you today?', + ts: '2022-11-21T16:00:00.000Z', + u: { + _id: '123', + name: 'Juanito De Ponce', + username: 'juanito.ponce', + }, + }, + { + msg: 'I am having trouble with my account.', + ts: '2022-11-21T16:00:00.000Z', + u: { + _id: '321', + name: 'Christian Castro', + username: 'cristiano.castro', + }, + md: [ + { + type: 'UNORDERED_LIST', + value: [ + { type: 'LIST_ITEM', value: [{ type: 'PLAIN_TEXT', value: 'I am having trouble with my account;' }] }, + { + type: 'LIST_ITEM', + value: [ + { type: 'PLAIN_TEXT', value: 'I am having trouble with my password. ' }, + { type: 'EMOJI', value: undefined, unicode: '🙂' }, + ], + }, + ], + }, + ], + }, + { + msg: 'Can you please provide your account email?', + ts: '2022-11-21T16:00:00.000Z', + u: { + _id: '123', + name: 'Juanito De Ponce', + username: 'juanito.ponce', + }, + }, +]; + +export const validSystemMessage = { + ts: '2022-11-21T16:00:00.000Z', + u: { + _id: '123', + name: 'Juanito De Ponce', + username: 'juanito.ponce', + }, + t: 'livechat-started' as MessageTypesValues, +}; + +export const invalidSystemMessage = { + ts: '2022-11-21T16:00:00.000Z', + u: { + _id: '123', + name: 'Juanito De Ponce', + username: 'juanito.ponce', + }, + t: 'some-system-message' as MessageTypesValues, +}; diff --git a/ee/packages/omnichannel-services/src/OmnichannelTranscript.spec.ts b/ee/packages/omnichannel-services/src/OmnichannelTranscript.spec.ts new file mode 100644 index 000000000000..569e0b4eefe5 --- /dev/null +++ b/ee/packages/omnichannel-services/src/OmnichannelTranscript.spec.ts @@ -0,0 +1,118 @@ +import type { IMessage } from '@rocket.chat/core-typings'; +import { Logger } from '@rocket.chat/logger'; + +import { OmnichannelTranscript } from './OmnichannelTranscript'; +import { invalidSystemMessage, messages, validSystemMessage } from './OmnichannelTranscript.fixtures'; + +jest.mock('@rocket.chat/pdf-worker', () => ({ + PdfWorker: jest.fn().mockImplementation(() => ({ + renderToStream: jest.fn().mockResolvedValue(Buffer.from('')), + isMimeTypeValid: jest.fn(() => true), + })), +})); + +jest.mock('@rocket.chat/core-services', () => ({ + ServiceClass: class {}, + Upload: { + getFileBuffer: jest.fn().mockResolvedValue(Buffer.from('')), + uploadFile: jest.fn().mockResolvedValue({ _id: 'fileId', name: 'fileName' }), + sendFileMessage: jest.fn(), + }, + Message: { + sendMessage: jest.fn(), + }, + Room: { + createDirectMessage: jest.fn().mockResolvedValue({ rid: 'roomId' }), + }, + QueueWorker: { + queueWork: jest.fn(), + }, + Translation: { + translate: jest.fn().mockResolvedValue('translated message'), + translateToServerLanguage: jest.fn().mockResolvedValue('translated server message'), + translateMultipleToServerLanguage: jest.fn((keys) => keys.map((key: any) => ({ key, value: key }))), + }, + Settings: { + get: jest.fn().mockResolvedValue(''), + }, +})); + +jest.mock('@rocket.chat/models', () => ({ + LivechatRooms: { + findOneById: jest.fn().mockResolvedValue({}), + setTranscriptRequestedPdfById: jest.fn(), + unsetTranscriptRequestedPdfById: jest.fn(), + setPdfTranscriptFileIdById: jest.fn(), + }, + Messages: { + findLivechatMessagesWithoutTypes: jest.fn().mockReturnValue({ + toArray: jest.fn().mockResolvedValue([]), + }), + }, + Uploads: { + findOneById: jest.fn().mockResolvedValue({}), + }, + Users: { + findOneById: jest.fn().mockResolvedValue({}), + findOneAgentById: jest.fn().mockResolvedValue({}), + }, + LivechatVisitors: { + findOneEnabledById: jest.fn().mockResolvedValue({}), + }, +})); + +jest.mock('@rocket.chat/tools', () => ({ + guessTimezone: jest.fn().mockReturnValue('UTC'), + guessTimezoneFromOffset: jest.fn().mockReturnValue('UTC'), + streamToBuffer: jest.fn().mockResolvedValue(Buffer.from('')), +})); + +describe('OmnichannelTranscript', () => { + let omnichannelTranscript: OmnichannelTranscript; + + beforeEach(() => { + omnichannelTranscript = new OmnichannelTranscript(Logger); + }); + + it('should return default timezone', async () => { + const timezone = await omnichannelTranscript.getTimezone(); + expect(timezone).toBe('UTC'); + }); + + it('should parse the messages', async () => { + const parsedMessages = await omnichannelTranscript.getMessagesData(messages as unknown as IMessage[]); + console.log(parsedMessages[0]); + expect(parsedMessages).toBeDefined(); + expect(parsedMessages).toHaveLength(3); + expect(parsedMessages[0]).toHaveProperty('files'); + expect(parsedMessages[0].files).toHaveLength(0); + expect(parsedMessages[0]).toHaveProperty('quotes'); + expect(parsedMessages[0].quotes).toHaveLength(0); + }); + + it('should parse system message', async () => { + const parsedMessages = await omnichannelTranscript.getMessagesData([...messages, validSystemMessage] as unknown as IMessage[]); + const systemMessage = parsedMessages[3]; + expect(parsedMessages).toBeDefined(); + expect(parsedMessages).toHaveLength(4); + expect(systemMessage).toHaveProperty('t'); + expect(systemMessage.t).toBe('livechat-started'); + expect(systemMessage).toHaveProperty('msg'); + expect(systemMessage.msg).toBe('Chat_started'); + expect(systemMessage).toHaveProperty('files'); + expect(systemMessage.files).toHaveLength(0); + expect(systemMessage).toHaveProperty('quotes'); + expect(systemMessage.quotes).toHaveLength(0); + }); + + it('should parse an invalid system message', async () => { + const parsedMessages = await omnichannelTranscript.getMessagesData([...messages, invalidSystemMessage] as unknown as IMessage[]); + const systemMessage = parsedMessages[3]; + console.log(parsedMessages[3]); + expect(parsedMessages).toBeDefined(); + expect(parsedMessages).toHaveLength(4); + expect(systemMessage).toHaveProperty('t'); + expect(systemMessage.t).toBe('some-system-message'); + expect(systemMessage.msg).toBeUndefined(); + }); +}); diff --git a/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts b/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts index 5f99269f671b..3c7222e99a64 100644 --- a/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts +++ b/ee/packages/omnichannel-services/src/OmnichannelTranscript.ts @@ -10,7 +10,16 @@ import { Settings as settingsService, } from '@rocket.chat/core-services'; import type { IOmnichannelTranscriptService } from '@rocket.chat/core-services'; -import type { IMessage, IUser, IRoom, IUpload, ILivechatVisitor, ILivechatAgent, IOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { + IMessage, + IUser, + IRoom, + IUpload, + ILivechatVisitor, + ILivechatAgent, + IOmnichannelRoom, + IOmnichannelSystemMessage, +} from '@rocket.chat/core-typings'; import { isQuoteAttachment, isFileAttachment, isFileImageAttachment } from '@rocket.chat/core-typings'; import type { Logger } from '@rocket.chat/logger'; import { parse } from '@rocket.chat/message-parser'; @@ -19,6 +28,8 @@ import { LivechatRooms, Messages, Uploads, Users, LivechatVisitors } from '@rock import { PdfWorker } from '@rocket.chat/pdf-worker'; import { guessTimezone, guessTimezoneFromOffset, streamToBuffer } from '@rocket.chat/tools'; +import { getAllSystemMessagesKeys, getSystemMessage } from './livechatSystemMessages'; + const isPromiseRejectedResult = (result: any): result is PromiseRejectedResult => result.status === 'rejected'; type WorkDetails = { @@ -32,7 +43,22 @@ type WorkDetailsWithSource = WorkDetails & { type Quote = { name: string; ts?: Date; md: Root }; -type MessageData = Pick & { +export type MessageData = Pick< + IOmnichannelSystemMessage, + | 'msg' + | '_id' + | 'u' + | 'ts' + | 'md' + | 't' + | 'navigation' + | 'transferData' + | 'requestData' + | 'webRtcCallEndTs' + | 'comment' + | 'slaData' + | 'priorityData' +> & { files: ({ name?: string; buffer: Buffer | null; extension?: string } | undefined)[]; quotes: (Quote | undefined)[]; }; @@ -49,6 +75,12 @@ type WorkerData = { translations: { key: string; value: string }[]; }; +const customSprintfInterpolation = (template: string, values: Record) => { + return template.replace(/{{(\w+)}}/g, (match, key) => { + return typeof values[key] !== 'undefined' ? values[key] : match; + }); +}; + export class OmnichannelTranscript extends ServiceClass implements IOmnichannelTranscriptService { protected name = 'omnichannel-transcript'; @@ -56,6 +88,10 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT private log: Logger; + // this is initialized as undefined and will be set when the first pdf is requested. + // if we try to initialize it at the start of the service using IIAFE, for some reason i18next doesn't return translations, maybe i18n isn't initialised yet + private translations?: Array<{ key: string; value: string }> = undefined; + maxNumberOfConcurrentJobs = 25; currentJobNumber = 0; @@ -83,11 +119,29 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT } } - private getMessagesFromRoom({ rid }: { rid: string }): Promise { + private async getMessagesFromRoom({ rid }: { rid: string }): Promise { + const showSystemMessages = await settingsService.get('Livechat_transcript_show_system_messages'); + // Closing message should not appear :) - return Messages.findLivechatMessagesWithoutClosing(rid, { + return Messages.findLivechatMessagesWithoutTypes(rid, ['command'], showSystemMessages, { sort: { ts: 1 }, - projection: { _id: 1, msg: 1, u: 1, t: 1, ts: 1, attachments: 1, files: 1, md: 1 }, + projection: { + _id: 1, + msg: 1, + u: 1, + t: 1, + ts: 1, + attachments: 1, + files: 1, + md: 1, + navigation: 1, + requestData: 1, + transferData: 1, + webRtcCallEndTs: 1, + comment: 1, + priorityData: 1, + slaData: 1, + }, }).toArray(); } @@ -159,22 +213,49 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT return quotes; } - private async getMessagesData(messages: IMessage[]): Promise { + private getSystemMessage(message: IMessage): false | MessageData { + if (!message.t) { + return false; + } + + const systemMessageDefinition = getSystemMessage(message.t); + + if (!systemMessageDefinition) { + return false; + } + + const args = systemMessageDefinition.data && systemMessageDefinition?.data(message, this.getTranslation.bind(this)); + + const systemMessage = this.getTranslation(systemMessageDefinition.message, args); + + return { + ...message, + msg: systemMessage, + files: [], + quotes: [], + }; + } + + async getMessagesData(messages: IMessage[]): Promise { const messagesData: MessageData[] = []; for await (const message of messages) { + const systemMessage = this.getSystemMessage(message); + + if (systemMessage) { + messagesData.push(systemMessage); + continue; + } + if (!message.attachments?.length) { // If there's no attachment and no message, what was sent? lol messagesData.push({ - _id: message._id, + ...message, files: [], quotes: [], - ts: message.ts, - u: message.u, - msg: message.msg, - md: message.md, }); continue; } + const files = []; const quotes = []; @@ -267,17 +348,61 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT return messagesData; } - private async getTranslations(): Promise> { - const keys: string[] = ['Agent', 'Date', 'Customer', 'Not_assigned', 'Time', 'Chat_transcript', 'This_attachment_is_not_supported']; + private async getAllTranslations(): Promise> { + const keys: string[] = [ + 'Agent', + 'Date', + 'Customer', + 'Not_assigned', + 'Time', + 'Chat_transcript', + 'This_attachment_is_not_supported', + 'Livechat_transfer_to_agent', + 'Livechat_transfer_to_agent_with_a_comment', + 'Livechat_transfer_to_department', + 'Livechat_transfer_to_department_with_a_comment', + 'Livechat_transfer_return_to_the_queue', + 'Livechat_transfer_return_to_the_queue_with_a_comment', + 'Livechat_transfer_to_agent_auto_transfer_unanswered_chat', + 'Livechat_transfer_return_to_the_queue_auto_transfer_unanswered_chat', + 'Livechat_visitor_transcript_request', + 'Livechat_user_sent_chat_transcript_to_visitor', + 'WebRTC_call_ended_message', + 'WebRTC_call_declined_message', + 'Without_SLA', + 'Unknown_User', + 'Livechat_transfer_failed_fallback', + 'Unprioritized', + 'Unknown_User', + 'Without_priority', + ...getAllSystemMessagesKeys(), + ]; + + return translationService.translateMultipleToServerLanguage(keys); + } - return Promise.all( - keys.map(async (key) => { - return { - key, - value: await translationService.translateToServerLanguage(key), - }; - }), - ); + private getTranslation(translationKey: string, args?: Record): string { + const translationValue = this.translations?.find(({ key }) => key === translationKey)?.value; + + if (!translationValue) { + return translationKey; + } + + if (!args) { + return translationValue; + } + + const translation = customSprintfInterpolation(translationValue, args); + + return translation; + } + + private async loadTranslations() { + if (!this.translations) { + this.translations = await this.getAllTranslations(); + } + + return this.translations; } async workOnPdf({ details }: { details: WorkDetailsWithSource }): Promise { @@ -300,14 +425,15 @@ export class OmnichannelTranscript extends ServiceClass implements IOmnichannelT const agent = room.servedBy && (await Users.findOneAgentById(room.servedBy._id, { projection: { _id: 1, name: 1, username: 1, utcOffset: 1 } })); + const translations = await this.loadTranslations(); + const messagesData = await this.getMessagesData(messages); - const [siteName, dateFormat, timeAndDateFormat, timezone, translations] = await Promise.all([ + const [siteName, dateFormat, timeAndDateFormat, timezone] = await Promise.all([ settingsService.get('Site_Name'), settingsService.get('Message_DateFormat'), settingsService.get('Message_TimeAndDateFormat'), this.getTimezone(agent), - this.getTranslations(), ]); const data = { visitor, diff --git a/ee/packages/omnichannel-services/src/livechatSystemMessages.ts b/ee/packages/omnichannel-services/src/livechatSystemMessages.ts new file mode 100644 index 000000000000..48e313cfa4c7 --- /dev/null +++ b/ee/packages/omnichannel-services/src/livechatSystemMessages.ts @@ -0,0 +1,239 @@ +import type { IOmnichannelSystemMessage, MessageTypesValues } from '@rocket.chat/core-typings'; +import { escapeHTML } from '@rocket.chat/string-helpers'; +import formatDistance from 'date-fns/formatDistance'; +import moment from 'moment'; + +const livechatSystemMessagesMap = new Map< + MessageTypesValues, + { + message: string; + data?: (message: IOmnichannelSystemMessage, t: (k: string, obj?: Record) => string) => Record; + } +>(); + +const addType = ( + id: MessageTypesValues, + options: { + message: string; + data?: (message: IOmnichannelSystemMessage, t: (k: string, obj?: Record) => string) => Record; + }, +) => livechatSystemMessagesMap.set(id, options); + +export const getSystemMessage = (t: MessageTypesValues) => livechatSystemMessagesMap.get(t); + +export const getAllSystemMessagesKeys = () => Array.from(livechatSystemMessagesMap.values()).map((item) => item.message); + +addType('livechat-started', { message: 'Chat_started' }); + +addType('uj', { + message: 'User_joined_the_channel', + data(message) { + return { + user: message.u.username, + }; + }, +}); + +addType('livechat_video_call', { + message: 'New_videocall_request', +}); + +addType('livechat-close', { + message: 'Conversation_closed', + data(message) { + return { + comment: message.msg, + }; + }, +}); + +addType('livechat_navigation_history', { + message: 'New_visitor_navigation', + data(message: IOmnichannelSystemMessage) { + return { + history: message.navigation + ? `${(message.navigation.page.title ? `${message.navigation.page.title} - ` : '') + message.navigation.page.location.href}` + : '', + }; + }, +}); + +addType('livechat_transfer_history', { + message: 'New_chat_transfer', + data(message: IOmnichannelSystemMessage, t) { + if (!message.transferData) { + return { + transfer: '', + }; + } + + const { comment } = message.transferData; + const commentLabel = comment && comment !== '' ? '_with_a_comment' : ''; + const from = + message.transferData.transferredBy && (message.transferData.transferredBy.name || message.transferData.transferredBy.username); + const transferTypes = { + agent: (): string => + t(`Livechat_transfer_to_agent${commentLabel}`, { + from, + to: message?.transferData?.transferredTo?.name || message?.transferData?.transferredTo?.username || '', + ...(comment && { comment }), + }), + department: (): string => + t(`Livechat_transfer_to_department${commentLabel}`, { + from, + to: message?.transferData?.nextDepartment?.name || '', + ...(comment && { comment }), + }), + queue: (): string => + t(`Livechat_transfer_return_to_the_queue${commentLabel}`, { + from, + ...(comment && { comment }), + }), + autoTransferUnansweredChatsToAgent: (): string => + t(`Livechat_transfer_to_agent_auto_transfer_unanswered_chat`, { + from, + to: message?.transferData?.transferredTo?.name || message?.transferData?.transferredTo?.username || '', + duration: comment, + }), + autoTransferUnansweredChatsToQueue: (): string => + t(`Livechat_transfer_return_to_the_queue_auto_transfer_unanswered_chat`, { + from, + duration: comment, + }), + }; + return { + transfer: transferTypes[message.transferData.scope](), + }; + }, +}); + +addType('livechat_transcript_history', { + message: 'Livechat_chat_transcript_sent', + data(message: IOmnichannelSystemMessage, t) { + if (!message.requestData) { + return { + transcript: '', + }; + } + + const { requestData: { type, visitor, user } = { type: 'user' } } = message; + const requestTypes = { + visitor: (): string => + t('Livechat_visitor_transcript_request', { + guest: visitor?.name || visitor?.username || '', + }), + user: (): string => + t('Livechat_user_sent_chat_transcript_to_visitor', { + agent: user?.name || user?.username || '', + guest: visitor?.name || visitor?.username || '', + }), + }; + + return { + transcript: requestTypes[type](), + }; + }, +}); + +addType('livechat_webrtc_video_call', { + message: 'room_changed_type', + data(message: IOmnichannelSystemMessage, t) { + if (message.msg === 'ended' && message.webRtcCallEndTs && message.ts) { + return { + message: t('WebRTC_call_ended_message', { + callDuration: formatDistance(new Date(message.webRtcCallEndTs), new Date(message.ts)), + endTime: moment(message.webRtcCallEndTs).format('h:mm A'), + }), + }; + } + if (message.msg === 'declined' && message.webRtcCallEndTs) { + return { + message: t('WebRTC_call_declined_message'), + }; + } + return { + message: escapeHTML(message.msg), + }; + }, +}); + +addType('omnichannel_placed_chat_on_hold', { + message: 'Omnichannel_placed_chat_on_hold', + data(message: IOmnichannelSystemMessage) { + return { + comment: message.comment ? message.comment : 'No comment provided', + }; + }, +}); + +addType('omnichannel_on_hold_chat_resumed', { + message: 'Omnichannel_on_hold_chat_resumed', + data(message: IOmnichannelSystemMessage) { + return { + comment: message.comment ? message.comment : 'No comment provided', + }; + }, +}); + +addType('ul', { + message: 'User_left_this_channel', +}); + +addType('omnichannel_priority_change_history', { + message: 'omnichannel_priority_change_history', + data(message: IOmnichannelSystemMessage, t): Record { + if (!message.priorityData) { + return { + user: t('Unknown_User'), + priority: t('Without_priority'), + }; + } + const { + definedBy: { username }, + priority: { name = null, i18n } = {}, + } = message.priorityData; + + return { + user: username || t('Unknown_User'), + priority: name || (i18n && t(i18n)) || t('Unprioritized'), + }; + }, +}); + +addType('livechat_transfer_history_fallback', { + message: 'New_chat_transfer_fallback', + data(message: any, t) { + if (!message.transferData) { + return { + fallback: 'SHOULD_NEVER_HAPPEN', + }; + } + const from = message.transferData.prevDepartment; + const to = message.transferData.department.name; + + return { + fallback: t('Livechat_transfer_failed_fallback', { from, to }), + }; + }, +}); + +addType('omnichannel_sla_change_history', { + message: 'omnichannel_sla_change_history', + data(message: IOmnichannelSystemMessage, t): Record { + if (!message.slaData) { + return { + user: t('Unknown_User'), + priority: t('Without_SLA'), + }; + } + const { + definedBy: { username }, + sla: { name = null } = {}, + } = message.slaData; + + return { + user: username || t('Unknown_User'), + sla: name || t('Without_SLA'), + }; + }, +}); diff --git a/ee/packages/pdf-worker/CHANGELOG.md b/ee/packages/pdf-worker/CHANGELOG.md index f96576a0f479..5ebe251216a7 100644 --- a/ee/packages/pdf-worker/CHANGELOG.md +++ b/ee/packages/pdf-worker/CHANGELOG.md @@ -1,5 +1,99 @@ # @rocket.chat/pdf-worker +## 0.2.0 + +### Minor Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0 +
    + +## 0.2.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 +
    + +## 0.2.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 +
    + +## 0.2.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 +
    + +## 0.2.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 +
    + +## 0.2.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 +
    + +## 0.2.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 +
    + +## 0.2.0-rc.0 + +### Minor Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0-rc.0 +
    +
    + +## 0.1.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 +
    + ## 0.1.0 ### Minor Changes diff --git a/ee/packages/pdf-worker/jest.config.ts b/ee/packages/pdf-worker/jest.config.ts index acf158bdd7d8..b8f99e5482c0 100644 --- a/ee/packages/pdf-worker/jest.config.ts +++ b/ee/packages/pdf-worker/jest.config.ts @@ -1,9 +1,22 @@ +import client from '@rocket.chat/jest-presets/client'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', - errorOnDeprecated: true, - testEnvironment: 'jsdom', - modulePathIgnorePatterns: ['/dist/', '/src/worker.spec.ts'], - moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', - }, -}; + projects: [ + { + displayName: 'client', + preset: client.preset, + setupFilesAfterEnv: [...client.setupFilesAfterEnv], + modulePathIgnorePatterns: ['/src/worker.spec.ts'], + }, + { + displayName: 'worker', + preset: client.preset, + setupFilesAfterEnv: [...client.setupFilesAfterEnv], + moduleNameMapper: { + '^fontkit($|/.+)': '/../../../node_modules/fontkit$1', // needed to a weird bug related to module resolution in SWC + }, + modulePathIgnorePatterns: ['/src/strategies/', '/src/templates/'], + }, + ], +} satisfies Config; diff --git a/ee/packages/pdf-worker/jest.worker.config.ts b/ee/packages/pdf-worker/jest.worker.config.ts deleted file mode 100644 index 83706fdd37ec..000000000000 --- a/ee/packages/pdf-worker/jest.worker.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default { - preset: 'ts-jest', - errorOnDeprecated: true, - modulePathIgnorePatterns: ['/dist/', '/src/strategies/', '/src/templates/'], -}; diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index 14560ccbf260..749d48ccc9c2 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -1,31 +1,29 @@ { "name": "@rocket.chat/pdf-worker", - "version": "0.1.0", + "version": "0.2.0", "private": true, "devDependencies": { + "@rocket.chat/jest-presets": "workspace:~", "@storybook/addon-essentials": "~6.5.16", "@storybook/react": "~6.5.16", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "~13.4.0", + "@testing-library/react": "~16.0.0", "@types/emojione": "^2.2.8", - "@types/jest": "~29.5.7", + "@types/jest": "~29.5.12", + "@types/react": "~17.0.69", "@types/react-dom": "~17.0.22", - "@types/testing-library__jest-dom": "~5.14.9", "eslint": "~8.45.0", - "jest": "~29.6.4", - "jest-environment-jsdom": "~29.6.4", - "react-dom": "^18.2.0", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", + "react-dom": "~18.3.1", "typescript": "~5.3.3" }, "scripts": { + "build": "tsc -p tsconfig.build.json && cp -r src/public dist/public", + "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", "test": "jest", - "test:worker": "jest --config ./jest.worker.config.ts", - "testunit": "yarn run test && yarn run test:worker", - "build": "rm -rf dist && tsc -p tsconfig.json && cp -r src/public dist/public", - "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput", + "testunit": "jest", "storybook": "start-storybook -p 6006" }, "main": "./dist/index.js", @@ -37,12 +35,11 @@ "@react-pdf/renderer": "^3.1.14", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/fuselage-tokens": "^0.33.1", - "@types/react": "~17.0.69", "emoji-assets": "^7.0.1", "emoji-toolkit": "^7.0.1", "moment": "^2.29.4", "moment-timezone": "^0.5.43", - "react": "^18.2.0" + "react": "~18.3.1" }, "volta": { "extends": "../../../package.json" diff --git a/ee/packages/pdf-worker/src/strategies/ChatTranscript.spec.ts b/ee/packages/pdf-worker/src/strategies/ChatTranscript.spec.ts index b377fe07a90f..8e425c014ec7 100644 --- a/ee/packages/pdf-worker/src/strategies/ChatTranscript.spec.ts +++ b/ee/packages/pdf-worker/src/strategies/ChatTranscript.spec.ts @@ -1,6 +1,5 @@ import moment from 'moment-timezone'; -import '@testing-library/jest-dom'; import { invalidData, validData, newDayData, sameDayData, translationsData } from '../templates/ChatTranscript/ChatTranscript.fixtures'; import { ChatTranscript } from './ChatTranscript'; @@ -60,4 +59,10 @@ describe('Strategies/ChatTranscript', () => { result.t('invalidKey'); }).toThrow('Translation not found for key: invalidKey'); }); + + it('should parse the system message', () => { + const data = { ...validData, translations: translationsData.translations }; + const result = chatTranscript.parseTemplateData(data); + expect(result.messages[2]).toHaveProperty('t', 'livechat-started'); + }); }); diff --git a/ee/packages/pdf-worker/src/templates/ChatTranscript/ChatTranscript.fixtures.ts b/ee/packages/pdf-worker/src/templates/ChatTranscript/ChatTranscript.fixtures.ts index 14bc75c7a532..83f441980aa1 100644 --- a/ee/packages/pdf-worker/src/templates/ChatTranscript/ChatTranscript.fixtures.ts +++ b/ee/packages/pdf-worker/src/templates/ChatTranscript/ChatTranscript.fixtures.ts @@ -1,3 +1,5 @@ +import type { MessageTypesValues } from '@rocket.chat/core-typings'; + import type { Data } from '../../types/Data'; const base64Image = @@ -14,6 +16,7 @@ export const validData = { messages: [ { ts: '2022-11-21T16:00:00.000Z', text: 'Hello, how can I help you today?' }, { ts: '2022-11-21T16:00:00.000Z', text: 'I am having trouble with my account.' }, + { ts: '2022-11-21T16:00:00.000Z', t: 'livechat-started' }, ], translations: [ { key: 'transcript', value: 'Transcript' }, @@ -73,6 +76,17 @@ export const validMessage = { }, }; +export const validSystemMessage = { + msg: 'livechat-started', + ts: '2022-11-21T16:00:00.000Z', + u: { + _id: '123', + name: 'Juanito De Ponce', + username: 'juanito.ponce', + }, + t: 'livechat-started' as MessageTypesValues, +}; + export const exampleData = { agent: { name: 'Juanito De Ponce', diff --git a/ee/packages/pdf-worker/src/templates/ChatTranscript/components/Files.spec.tsx b/ee/packages/pdf-worker/src/templates/ChatTranscript/components/Files.spec.tsx index 16b5b92c5de9..4a2273ac65e5 100644 --- a/ee/packages/pdf-worker/src/templates/ChatTranscript/components/Files.spec.tsx +++ b/ee/packages/pdf-worker/src/templates/ChatTranscript/components/Files.spec.tsx @@ -1,7 +1,6 @@ import { render } from '@testing-library/react'; import type { ReactNode } from 'react'; -import '@testing-library/jest-dom'; import { invalidFile, validFile } from '../ChatTranscript.fixtures'; import { Files } from './Files'; diff --git a/ee/packages/pdf-worker/src/templates/ChatTranscript/components/Message.tsx b/ee/packages/pdf-worker/src/templates/ChatTranscript/components/Message.tsx new file mode 100644 index 000000000000..a523ad5f0095 --- /dev/null +++ b/ee/packages/pdf-worker/src/templates/ChatTranscript/components/Message.tsx @@ -0,0 +1,45 @@ +import { Text, View, StyleSheet } from '@react-pdf/renderer'; +import { fontScales } from '@rocket.chat/fuselage-tokens/typography.json'; + +import type { PDFMessage } from '..'; +import { Markup } from '../markup'; +import { Divider } from './Divider'; +import { Files } from './Files'; +import { MessageHeader } from './MessageHeader'; +import { Quotes } from './Quotes'; + +const styles = StyleSheet.create({ + wrapper: { + marginBottom: 16, + paddingBottom: 16, + paddingHorizontal: 32, + }, + message: { + marginTop: 1, + fontSize: fontScales.p2.fontSize, + }, + systemMessage: { + fontStyle: 'italic', + }, +}); + +const messageLongerThanPage = (message: string) => message.length > 1200; + +const isSystemMessage = (message: PDFMessage) => !!message.t; + +const Message = ({ message, invalidFileMessage }: { message: PDFMessage; invalidFileMessage: string }) => ( + + + {message.divider && } + + + {message.md ? : {message.msg}} + + {message.quotes && } + + + {message.files && } + +); + +export default Message; diff --git a/ee/packages/pdf-worker/src/templates/ChatTranscript/components/MessageList.spec.tsx b/ee/packages/pdf-worker/src/templates/ChatTranscript/components/MessageList.spec.tsx index 0a04bb3bce6b..49994e1c69fe 100644 --- a/ee/packages/pdf-worker/src/templates/ChatTranscript/components/MessageList.spec.tsx +++ b/ee/packages/pdf-worker/src/templates/ChatTranscript/components/MessageList.spec.tsx @@ -1,7 +1,6 @@ import { render } from '@testing-library/react'; -import '@testing-library/jest-dom'; -import { invalidFile, validFile, validMessage } from '../ChatTranscript.fixtures'; +import { invalidFile, validFile, validMessage, validSystemMessage } from '../ChatTranscript.fixtures'; import { MessageList } from './MessageList'; jest.mock('@react-pdf/renderer', () => ({ @@ -37,4 +36,9 @@ describe('components/MessageList', () => { expect(getByText(validMessage.msg)).toBeInTheDocument(); expect(getByText('invalid message')).toBeInTheDocument(); }); + + it('should render valid system message', () => { + const { getByText } = render(); + expect(getByText(validSystemMessage.t)).toBeInTheDocument(); + }); }); diff --git a/ee/packages/pdf-worker/src/templates/ChatTranscript/components/MessageList.tsx b/ee/packages/pdf-worker/src/templates/ChatTranscript/components/MessageList.tsx index a18e1e6582a7..79519386792d 100644 --- a/ee/packages/pdf-worker/src/templates/ChatTranscript/components/MessageList.tsx +++ b/ee/packages/pdf-worker/src/templates/ChatTranscript/components/MessageList.tsx @@ -1,40 +1,10 @@ -import { Text, View, StyleSheet } from '@react-pdf/renderer'; -import { fontScales } from '@rocket.chat/fuselage-tokens/typography.json'; - import type { ChatTranscriptData } from '..'; -import { Markup } from '../markup'; -import { Divider } from './Divider'; -import { Files } from './Files'; -import { MessageHeader } from './MessageHeader'; -import { Quotes } from './Quotes'; - -const styles = StyleSheet.create({ - wrapper: { - marginBottom: 16, - paddingBottom: 16, - paddingHorizontal: 32, - }, - message: { - marginTop: 1, - fontSize: fontScales.p2.fontSize, - }, -}); - -const messageLongerThanPage = (message: string) => message.length > 1200; +import Message from './Message'; export const MessageList = ({ messages, invalidFileMessage }: { messages: ChatTranscriptData['messages']; invalidFileMessage: string }) => ( <> {messages.map((message, index) => ( - - - {message.divider && } - - {message.md ? : {message.msg}} - {message.quotes && } - - - {message.files && } - + ))} ); diff --git a/ee/packages/pdf-worker/src/templates/ChatTranscript/index.tsx b/ee/packages/pdf-worker/src/templates/ChatTranscript/index.tsx index c167fa550847..36dc77fe4f1c 100644 --- a/ee/packages/pdf-worker/src/templates/ChatTranscript/index.tsx +++ b/ee/packages/pdf-worker/src/templates/ChatTranscript/index.tsx @@ -1,7 +1,7 @@ import * as path from 'path'; import ReactPDF, { Font, Document, Page, StyleSheet } from '@react-pdf/renderer'; -import type { ILivechatAgent, ILivechatVisitor, IMessage, Serialized } from '@rocket.chat/core-typings'; +import type { ILivechatAgent, ILivechatVisitor, IOmnichannelSystemMessage, Serialized } from '@rocket.chat/core-typings'; import colors from '@rocket.chat/fuselage-tokens/colors.json'; import type { Root } from '@rocket.chat/message-parser'; @@ -14,7 +14,15 @@ export type PDFFile = { name?: string; buffer: Buffer | null; extension?: 'png' export type Quote = { md: Root; name: string; ts: string }; -export type PDFMessage = Serialized, 'files'>> & { +export type PDFMessage = Serialized< + Omit< + Pick< + IOmnichannelSystemMessage, + 'msg' | 'u' | 'ts' | 'md' | 't' | 'navigation' | 'transferData' | 'requestData' | 'webRtcCallEndTs' | 'comment' + >, + 'files' + > +> & { files?: PDFFile[]; } & { divider?: string } & { quotes?: Quote[] }; diff --git a/ee/packages/pdf-worker/src/worker.fixtures.ts b/ee/packages/pdf-worker/src/worker.fixtures.ts index e95a3a619882..a91c5f75e396 100644 --- a/ee/packages/pdf-worker/src/worker.fixtures.ts +++ b/ee/packages/pdf-worker/src/worker.fixtures.ts @@ -714,3 +714,57 @@ Maecenas pretium, sem non eleifend sodales, sapien ligula sollicitudin mauris, v }, ], }; + +export const dataWithASingleSystemMessage = { + agent: { + name: 'Juanito De Ponce', + username: 'juanito.ponce', + }, + visitor: { + name: 'Christian Castro', + username: 'christian.castro', + }, + siteName: 'Rocket.Chat', + closedAt: '2022-11-21T00:00:00.000Z', + dateFormat: 'MMM D, YYYY', + timeAndDateFormat: 'MMM D, YYYY H:mm:ss', + timezone: 'Etc/GMT+1', + translations: [ + { + key: 'Agent', + value: 'Agent', + }, + { + key: 'Date', + value: 'Date', + }, + { + key: 'Customer', + value: 'Customer', + }, + { + key: 'Chat_transcript', + value: 'Chat transcript', + }, + { + key: 'Time', + value: 'Time', + }, + { + key: 'This_attachment_is_not_supported', + value: 'Attachment format not supported', + }, + ], + messages: [ + { + ts: '2022-11-21T16:00:00.000Z', + u: { + _id: '123', + name: 'Juanito De Ponce', + username: 'juanito.ponce', + }, + t: 'livechat-started', + msg: 'livechat started', + }, + ], +}; diff --git a/ee/packages/pdf-worker/src/worker.spec.ts b/ee/packages/pdf-worker/src/worker.spec.ts index dadf1fc40286..d880700194be 100644 --- a/ee/packages/pdf-worker/src/worker.spec.ts +++ b/ee/packages/pdf-worker/src/worker.spec.ts @@ -1,4 +1,6 @@ -import fs from 'fs'; +import { mkdtemp, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; import { PdfWorker } from './index'; import { @@ -6,6 +8,7 @@ import { dataWithASingleMessageButAReallyLongMessage, dataWithMultipleMessagesAndABigMessage, dataWithASingleMessageAndAnImage, + dataWithASingleSystemMessage, } from './worker.fixtures'; const streamToBuffer = async (stream: NodeJS.ReadableStream) => { @@ -19,55 +22,69 @@ const streamToBuffer = async (stream: NodeJS.ReadableStream) => { const pdfWorker = new PdfWorker('chat-transcript'); -describe('PdfWorker', () => { - it('should fail to instantiate if no mode is provided', () => { - // @ts-expect-error - testing - expect(() => new PdfWorker('')).toThrow(); - }); - it('should fail to instantiate if mode is invalid', () => { - // @ts-expect-error - testing - expect(() => new PdfWorker('invalid')).toThrow(); - }); - it('should properly instantiate', () => { - const newWorker = new PdfWorker('chat-transcript'); +it('should fail to instantiate if no mode is provided', () => { + // @ts-expect-error - testing + expect(() => new PdfWorker('')).toThrow(); +}); - expect(newWorker).toBeInstanceOf(PdfWorker); - expect(newWorker.mode).toBe('chat-transcript'); - }); - it('should generate a pdf transcript for a big bunch of messages', async () => { - const stream = await pdfWorker.renderToStream({ data: bigConversationData }); - const buffer = await streamToBuffer(stream); +it('should fail to instantiate if mode is invalid', () => { + // @ts-expect-error - testing + expect(() => new PdfWorker('invalid')).toThrow(); +}); - expect(buffer).toBeTruthy(); - }); - it('should generate a pdf transcript for a single message, but a really long message', async () => { - const stream = await pdfWorker.renderToStream({ data: dataWithASingleMessageButAReallyLongMessage }); - const buffer = await streamToBuffer(stream); +it('should properly instantiate', () => { + const newWorker = new PdfWorker('chat-transcript'); - expect(buffer).toBeTruthy(); - }); + expect(newWorker).toBeInstanceOf(PdfWorker); + expect(newWorker.mode).toBe('chat-transcript'); +}); - it('should generate a pdf transcript of a single message with an image', async () => { - const stream = await pdfWorker.renderToStream({ data: dataWithASingleMessageAndAnImage }); - const buffer = await streamToBuffer(stream); +it('should generate a pdf transcript for a big bunch of messages', async () => { + const stream = await pdfWorker.renderToStream({ data: bigConversationData }); + const buffer = await streamToBuffer(stream); - fs.writeFileSync('test.pdf', buffer); - expect(buffer).toBeTruthy(); - }); + expect(buffer).toBeTruthy(); +}, 10000); - it('should generate a pdf transcript for multiple messages, one big message and 2 small messages', async () => { - const stream = await pdfWorker.renderToStream({ data: dataWithMultipleMessagesAndABigMessage }); - const buffer = await streamToBuffer(stream); +it('should generate a pdf transcript for a single message, but a really long message', async () => { + const stream = await pdfWorker.renderToStream({ data: dataWithASingleMessageButAReallyLongMessage }); + const buffer = await streamToBuffer(stream); + + expect(buffer).toBeTruthy(); +}, 10000); + +it('should generate a pdf transcript of a single message with an image', async () => { + const stream = await pdfWorker.renderToStream({ data: dataWithASingleMessageAndAnImage }); + const buffer = await streamToBuffer(stream); + + expect(buffer).toBeTruthy(); + + const tempDir = await mkdtemp(join(tmpdir(), 'pdf-worker')); + const tempFile = join(tempDir, 'test.pdf'); + // console.log(tempFile); + await writeFile(tempFile, buffer); +}, 10000); + +it('should generate a pdf transcript for multiple messages, one big message and 2 small messages', async () => { + const stream = await pdfWorker.renderToStream({ data: dataWithMultipleMessagesAndABigMessage }); + const buffer = await streamToBuffer(stream); + + expect(buffer).toBeTruthy(); +}, 10000); + +it('should generate a pdf transcript for a single system message', async () => { + const stream = await pdfWorker.renderToStream({ data: dataWithASingleSystemMessage }); + const buffer = await streamToBuffer(stream); + + expect(buffer).toBeTruthy(); +}); - expect(buffer).toBeTruthy(); +describe('isMimeTypeValid', () => { + it('should return true if mimeType is valid', () => { + expect(pdfWorker.isMimeTypeValid('image/png')).toBe(true); }); - describe('isMimeTypeValid', () => { - it('should return true if mimeType is valid', () => { - expect(pdfWorker.isMimeTypeValid('image/png')).toBe(true); - }); - it('should return false if mimeType is not valid', () => { - expect(pdfWorker.isMimeTypeValid('image/svg')).toBe(false); - }); + it('should return false if mimeType is not valid', () => { + expect(pdfWorker.isMimeTypeValid('image/svg')).toBe(false); }); }); diff --git a/ee/packages/pdf-worker/test.pdf b/ee/packages/pdf-worker/test.pdf new file mode 100644 index 000000000000..a4cb0d90fce4 Binary files /dev/null and b/ee/packages/pdf-worker/test.pdf differ diff --git a/ee/packages/pdf-worker/tsconfig.build.json b/ee/packages/pdf-worker/tsconfig.build.json new file mode 100644 index 000000000000..3c11f201b746 --- /dev/null +++ b/ee/packages/pdf-worker/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "declaration": true, + "declarationMap": true + }, + "include": ["./src/**/*"], + "exclude": ["./src/**/*.spec.ts", "./src/**/*.spec.tsx"], +} diff --git a/ee/packages/pdf-worker/tsconfig.json b/ee/packages/pdf-worker/tsconfig.json index 64ec0d793b2f..a59de9bb7935 100644 --- a/ee/packages/pdf-worker/tsconfig.json +++ b/ee/packages/pdf-worker/tsconfig.json @@ -1,10 +1,6 @@ { "extends": "../../../tsconfig.base.server.json", "compilerOptions": { - "declaration": true, - "rootDir": "./src", - "outDir": "./dist", - "jsx": "react-jsx", - }, - "include": ["./src/**/*"] + "jsx": "react-jsx" + } } diff --git a/ee/packages/presence/CHANGELOG.md b/ee/packages/presence/CHANGELOG.md index 07cbc3e223f9..3d1a7e35b705 100644 --- a/ee/packages/presence/CHANGELOG.md +++ b/ee/packages/presence/CHANGELOG.md @@ -1,5 +1,127 @@ # @rocket.chat/presence +## 0.2.3 + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [03c8b066f9, 2d89a0c448, 24f7df4894, 03c8b066f9, b8e5887fb9]: + + - @rocket.chat/core-services@0.5.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 +
    + +## 0.2.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/core-services@0.5.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.2.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/core-services@0.5.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.2.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/core-services@0.5.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.2.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/core-services@0.5.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.2.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/core-services@0.5.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.2.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/core-services@0.5.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.2.3-rc.0 + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [03c8b066f9, 2d89a0c448, 24f7df4894, 03c8b066f9, b8e5887fb9]: + + - @rocket.chat/core-services@0.5.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 +
    + +## 0.2.2 + +### Patch Changes + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-services@0.4.2 + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.2.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/core-services@0.4.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.2.0 ### Minor Changes diff --git a/ee/packages/presence/jest.config.ts b/ee/packages/presence/jest.config.ts new file mode 100644 index 000000000000..c18c8ae02465 --- /dev/null +++ b/ee/packages/presence/jest.config.ts @@ -0,0 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + +export default { + preset: server.preset, +} satisfies Config; diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index 0ff069768423..21f1883b6704 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -1,27 +1,27 @@ { "name": "@rocket.chat/presence", - "version": "0.2.0", + "version": "0.2.3", "private": true, "devDependencies": { "@babel/core": "~7.22.20", "@babel/preset-env": "~7.22.20", "@babel/preset-typescript": "~7.22.15", - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.0", "@rocket.chat/eslint-config": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", "@types/node": "^14.18.63", "babel-jest": "^29.0.3", "eslint": "~8.45.0", - "jest": "~29.6.4", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "scripts": { "lint": "eslint src", "lint:fix": "eslint src --fix", "test": "jest", - "build": "tsc -p tsconfig.json", - "testunit": "jest tests/**/*.test.ts", - "typecheck": "tsc --noEmit --skipLibCheck -p tsconfig.json" + "build": "tsc", + "testunit": "jest", + "typecheck": "tsc --noEmit --skipLibCheck" }, "main": "./dist/Presence.js", "typings": "./dist/Presence.d.ts", diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json index add24d33a8ab..d1929c8b93f0 100644 --- a/ee/packages/ui-theming/package.json +++ b/ee/packages/ui-theming/package.json @@ -4,37 +4,23 @@ "private": true, "devDependencies": { "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/icons": "^0.36.0", "@rocket.chat/ui-contexts": "workspace:~", - "@storybook/addon-actions": "~6.5.16", - "@storybook/addon-docs": "~6.5.16", - "@storybook/addon-essentials": "~6.5.16", - "@storybook/addon-interactions": "~6.5.16", - "@storybook/addon-links": "~6.5.16", - "@storybook/addon-postcss": "~2.0.0", - "@storybook/builder-webpack4": "~6.5.16", - "@storybook/manager-webpack4": "~6.5.16", - "@storybook/react": "~6.5.16", - "@storybook/testing-library": "~0.0.13", - "@types/jest": "~29.5.7", "@types/react": "~17.0.69", "eslint": "~8.45.0", "eslint-plugin-anti-trojan-source": "~1.1.1", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", "eslint-plugin-testing-library": "^5.11.1", - "jest": "~29.6.4", "react": "~17.0.2", "react-docgen-typescript-plugin": "~1.0.5", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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-build.json", "dev": "tsc -p tsconfig-build.json --watch --preserveWatchOutput" }, diff --git a/ee/packages/ui-theming/src/hooks/useCreateStyleContainer.ts b/ee/packages/ui-theming/src/hooks/useCreateStyleContainer.ts deleted file mode 100644 index aaa37df66ae6..000000000000 --- a/ee/packages/ui-theming/src/hooks/useCreateStyleContainer.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { useMemo } from 'react'; - -export const useCreateStyleContainer = (id: string) => { - return useMemo(() => { - const refElement = document.getElementById('rcx-styles') || document.head.lastChild; - - const el = document.getElementById(id); - - if (el) { - return el; - } - - const styleElement = document.createElement('style'); - styleElement.setAttribute('id', id); - - document.head.insertBefore(styleElement, refElement); - document.head.appendChild(document.createElement('style')); - return styleElement; - }, [id]); -}; diff --git a/ee/packages/ui-theming/src/hooks/useLayoutVariables.ts b/ee/packages/ui-theming/src/hooks/useLayoutVariables.ts deleted file mode 100644 index e0d8310c41e0..000000000000 --- a/ee/packages/ui-theming/src/hooks/useLayoutVariables.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { useSetting } from '@rocket.chat/ui-contexts'; - -export const useLayoutPalette = () => { - const setting = String(useSetting('Layout_Fuselage_Palette') || '{}'); - - return JSON.parse(setting); -}; diff --git a/ee/packages/ui-theming/src/hooks/useSetLayoutSetting.ts b/ee/packages/ui-theming/src/hooks/useSetLayoutSetting.ts deleted file mode 100644 index 1810273bbfe7..000000000000 --- a/ee/packages/ui-theming/src/hooks/useSetLayoutSetting.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { useEndpoint } from '@rocket.chat/ui-contexts'; - -export const useSetLayoutSetting = (): (({ value }: { value: string }) => void) => { - return useEndpoint('POST', '/v1/settings/:_id', { _id: 'Layout_Fuselage_Palette' }); -}; diff --git a/ee/packages/ui-theming/src/hooks/useThemeMode.ts b/ee/packages/ui-theming/src/hooks/useThemeMode.ts index 63cf01bf6eb2..ca60d7845d4a 100644 --- a/ee/packages/ui-theming/src/hooks/useThemeMode.ts +++ b/ee/packages/ui-theming/src/hooks/useThemeMode.ts @@ -1,6 +1,6 @@ +import type { ThemePreference as ThemeMode, Themes } from '@rocket.chat/core-typings'; import { useDarkMode } from '@rocket.chat/fuselage-hooks'; import { useEndpoint, useUserPreference } from '@rocket.chat/ui-contexts'; -import type { ThemePreference as ThemeMode, Themes } from '@rocket.chat/ui-theming/src/types/themes'; import { useCallback, useState } from 'react'; /** diff --git a/ee/packages/ui-theming/src/index.ts b/ee/packages/ui-theming/src/index.ts new file mode 100644 index 000000000000..a3c440cc2e49 --- /dev/null +++ b/ee/packages/ui-theming/src/index.ts @@ -0,0 +1 @@ +export * from './hooks/useThemeMode'; diff --git a/fuselage.sh b/fuselage.sh index 17c912745b9e..fdcd559a3b5b 100755 --- a/fuselage.sh +++ b/fuselage.sh @@ -94,11 +94,10 @@ echo "đŸ“Ļ @rocket.chat/emitter [UPDATING to $targetVersion version...] đŸ“Ļ @rocket.chat/message-parser [UPDATING to $targetVersion version...] đŸ“Ļ @rocket.chat/onboarding-ui [UPDATING to $targetVersion version...] đŸ“Ļ @rocket.chat/string-helpers [UPDATING to $targetVersion version...] -đŸ“Ļ @rocket.chat/ui-kit [UPDATING to $targetVersion version...] đŸ“Ļ @rocket.chat/layout [UPDATING to $targetVersion version...] đŸ“Ļ @rocket.chat/message-parser [UPDATING to $targetVersion version...]" - eval "yarn up @rocket.chat/emitter@$targetVersion @rocket.chat/fuselage-polyfills@$targetVersion @rocket.chat/fuselage-toastbar@$targetVersion @rocket.chat/fuselage-tokens@$targetVersion @rocket.chat/css-in-js@$targetVersion @rocket.chat/styled@$targetVersion @rocket.chat/fuselage@$targetVersion @rocket.chat/fuselage-hooks@$targetVersion @rocket.chat/icons@$targetVersion @rocket.chat/logo@$targetVersion @rocket.chat/memo@$targetVersion @rocket.chat/message-parser@$targetVersion @rocket.chat/onboarding-ui@$targetVersion @rocket.chat/string-helpers@$targetVersion @rocket.chat/ui-kit@$targetVersion @rocket.chat/layout@$targetVersion @rocket.chat/message-parser@$targetVersion" + eval "yarn up @rocket.chat/emitter@$targetVersion @rocket.chat/fuselage-polyfills@$targetVersion @rocket.chat/fuselage-toastbar@$targetVersion @rocket.chat/fuselage-tokens@$targetVersion @rocket.chat/css-in-js@$targetVersion @rocket.chat/styled@$targetVersion @rocket.chat/fuselage@$targetVersion @rocket.chat/fuselage-hooks@$targetVersion @rocket.chat/icons@$targetVersion @rocket.chat/logo@$targetVersion @rocket.chat/memo@$targetVersion @rocket.chat/message-parser@$targetVersion @rocket.chat/onboarding-ui@$targetVersion @rocket.chat/string-helpers@$targetVersion @rocket.chat/layout@$targetVersion @rocket.chat/message-parser@$targetVersion" exit 1 fi diff --git a/package.json b/package.json index f5a9cdcb9353..29de436373e2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket.chat", - "version": "6.11.0-develop", + "version": "6.12.0-develop", "description": "Rocket.Chat Monorepo", "main": "index.js", "private": true, @@ -9,8 +9,8 @@ "build:services": "turbo run build --filter=rocketchat-services...", "build:ci": "turbo run build:ci", "testunit": "turbo run testunit", - "dev": "turbo run dev --parallel --filter=@rocket.chat/meteor...", - "dsv": "turbo run dsv --filter=@rocket.chat/meteor...", + "dev": "turbo run dev --env-mode=loose --parallel --filter=@rocket.chat/meteor...", + "dsv": "turbo run dsv --env-mode=loose --filter=@rocket.chat/meteor...", "lint": "turbo run lint", "storybook": "yarn workspace @rocket.chat/meteor run storybook", "fuselage": "./fuselage.sh", @@ -21,7 +21,7 @@ "@types/chart.js": "^2.9.39", "@types/js-yaml": "^4.0.8", "ts-node": "^10.9.2", - "turbo": "^1.12.4" + "turbo": "latest" }, "workspaces": [ "apps/*", diff --git a/packages/account-utils/package.json b/packages/account-utils/package.json index d6c8161f264c..e33876a02d28 100644 --- a/packages/account-utils/package.json +++ b/packages/account-utils/package.json @@ -3,16 +3,12 @@ "version": "0.0.2", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, diff --git a/packages/agenda/package.json b/packages/agenda/package.json index 7351f373c861..71b8b01bd6b0 100644 --- a/packages/agenda/package.json +++ b/packages/agenda/package.json @@ -13,16 +13,12 @@ }, "devDependencies": { "@types/debug": "^4.1.10", - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, "main": "./dist/index.js", diff --git a/packages/apps/CHANGELOG.md b/packages/apps/CHANGELOG.md index c0ee3cb0d943..07f4af49f31e 100644 --- a/packages/apps/CHANGELOG.md +++ b/packages/apps/CHANGELOG.md @@ -1,5 +1,117 @@ # @rocket.chat/apps +## 0.1.3 + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0 + - @rocket.chat/core-typings@6.11.0 +
    + +## 0.1.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/model-typings@0.6.0-rc.6 +
    + +## 0.1.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/model-typings@0.6.0-rc.5 +
    + +## 0.1.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/model-typings@0.6.0-rc.4 +
    + +## 0.1.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/model-typings@0.6.0-rc.3 +
    + +## 0.1.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/model-typings@0.6.0-rc.2 +
    + +## 0.1.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/model-typings@0.6.0-rc.1 +
    + +## 0.1.3-rc.0 + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 24f7df4894, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/model-typings@0.6.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 +
    + +## 0.1.2 + +### Patch Changes + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/model-typings@0.5.2 +
    + +## 0.1.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/model-typings@0.5.1 +
    + ## 0.1.0 ### Minor Changes diff --git a/packages/apps/package.json b/packages/apps/package.json index 3387deeea23a..15289501be4c 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -1,18 +1,14 @@ { "name": "@rocket.chat/apps", - "version": "0.1.0", + "version": "0.1.3", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, @@ -22,7 +18,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.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 index 856bc1253790..b85672d23f5a 100644 --- a/packages/apps/src/AppsEngine.ts +++ b/packages/apps/src/AppsEngine.ts @@ -8,6 +8,7 @@ export type { IVisitorPhone as IAppsVisitorPhone, } from '@rocket.chat/apps-engine/definition/livechat'; export type { IMessage as IAppsMessage } from '@rocket.chat/apps-engine/definition/messages'; +export type { IMessageRaw as IAppsMesssageRaw } from '@rocket.chat/apps-engine/definition/messages'; export { AppInterface as AppEvents } from '@rocket.chat/apps-engine/definition/metadata'; export type { IUser as IAppsUser } from '@rocket.chat/apps-engine/definition/users'; export type { IRole as IAppsRole } from '@rocket.chat/apps-engine/definition/roles'; diff --git a/packages/apps/src/converters/IAppMessagesConverter.ts b/packages/apps/src/converters/IAppMessagesConverter.ts index 185e247895de..863c10c95477 100644 --- a/packages/apps/src/converters/IAppMessagesConverter.ts +++ b/packages/apps/src/converters/IAppMessagesConverter.ts @@ -1,6 +1,6 @@ import type { IMessage } from '@rocket.chat/core-typings'; -import type { IAppsMessage } from '../AppsEngine'; +import type { IAppsMessage, IAppsMesssageRaw } from '../AppsEngine'; export interface IAppMessagesConverter { convertById(messageId: IMessage['_id']): Promise; @@ -10,4 +10,6 @@ export interface IAppMessagesConverter { convertAppMessage(message: undefined | null): Promise; convertAppMessage(message: IAppsMessage): Promise; convertAppMessage(message: IAppsMessage | undefined | null): Promise; + convertMessageRaw(message: IMessage): Promise; + convertMessageRaw(message: IMessage | undefined | null): Promise; } diff --git a/packages/base64/jest.config.ts b/packages/base64/jest.config.ts index 959a31a7c6bf..c18c8ae02465 100644 --- a/packages/base64/jest.config.ts +++ b/packages/base64/jest.config.ts @@ -1,3 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', -}; + preset: server.preset, +} satisfies Config; diff --git a/packages/base64/package.json b/packages/base64/package.json index a7fd818270f1..c58a652877a3 100644 --- a/packages/base64/package.json +++ b/packages/base64/package.json @@ -16,11 +16,11 @@ "@babel/core": "~7.22.20", "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", + "@rocket.chat/jest-presets": "workspace:~", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "volta": { diff --git a/packages/cas-validate/package.json b/packages/cas-validate/package.json index 8459c72ab4ea..769b74d38e56 100644 --- a/packages/cas-validate/package.json +++ b/packages/cas-validate/package.json @@ -4,16 +4,12 @@ "version": "0.0.2", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, diff --git a/packages/core-services/CHANGELOG.md b/packages/core-services/CHANGELOG.md index e505865721ec..0c10b78c3bf4 100644 --- a/packages/core-services/CHANGELOG.md +++ b/packages/core-services/CHANGELOG.md @@ -1,5 +1,151 @@ # @rocket.chat/core-services +## 0.5.0 + +### Minor Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Reduced time on generation of PDF transcripts. Earlier Rocket.Chat was fetching the required translations everytime a PDF transcript was requested, this process was async and was being unnecessarily being performed on every pdf transcript request. This PR improves this and now the translations are loaded at the start and kept in memory to process further pdf transcripts requests. This reduces the time of asynchronously fetching translations again and again. + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [2d89a0c448, 24f7df4894, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 + - @rocket.chat/ui-kit@0.36.0 + - @rocket.chat/rest-typings@6.11.0 +
    + +## 0.5.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.5.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.5.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.5.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.5.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.5.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.5.0-rc.0 + +### Minor Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Reduced time on generation of PDF transcripts. Earlier Rocket.Chat was fetching the required translations everytime a PDF transcript was requested, this process was async and was being unnecessarily being performed on every pdf transcript request. This PR improves this and now the translations are loaded at the start and kept in memory to process further pdf transcripts requests. This reduces the time of asynchronously fetching translations again and again. + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [2d89a0c448, 24f7df4894, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/ui-kit@0.36.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 +
    + +## 0.4.2 + +### Patch Changes + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.4.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.4.0 ### Minor Changes diff --git a/packages/core-services/jest.config.ts b/packages/core-services/jest.config.ts new file mode 100644 index 000000000000..c18c8ae02465 --- /dev/null +++ b/packages/core-services/jest.config.ts @@ -0,0 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + +export default { + preset: server.preset, +} satisfies Config; diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 4b7ce783ac8c..d576f87bef27 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -1,18 +1,19 @@ { "name": "@rocket.chat/core-services", - "version": "0.4.0", + "version": "0.5.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", "@babel/preset-env": "~7.22.20", "@babel/preset-typescript": "~7.22.15", "@rocket.chat/eslint-config": "workspace:^", + "@rocket.chat/jest-presets": "workspace:~", "@types/babel__core": "^7.20.3", "@types/babel__preset-env": "^7.9.4", - "@types/jest": "~29.5.7", + "@types/jest": "~29.5.12", "babel-jest": "^29.5.0", "eslint": "~8.45.0", - "jest": "~29.6.4", + "jest": "~29.7.0", "mongodb": "^4.17.2", "prettier": "~2.8.8", "typescript": "~5.3.3" @@ -20,10 +21,9 @@ "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "jest": "jest", - "testunit": "jest --verbose tests/**/*.test.ts", - "dev": "tsc --watch --preserveWatchOutput -p tsconfig.json", - "build": "rm -rf dist && tsc -p tsconfig.json" + "testunit": "jest", + "dev": "tsc --watch --preserveWatchOutput", + "build": "rm -rf dist && tsc" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", @@ -34,7 +34,7 @@ "extends": "../../package.json" }, "dependencies": { - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.0", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/icons": "^0.36.0", "@rocket.chat/message-parser": "workspace:^", diff --git a/packages/core-services/src/types/IMessageService.ts b/packages/core-services/src/types/IMessageService.ts index b38d6a9559d6..0563fc6f148d 100644 --- a/packages/core-services/src/types/IMessageService.ts +++ b/packages/core-services/src/types/IMessageService.ts @@ -8,7 +8,14 @@ export interface IMessageService { message: string, user: Pick, extraData?: Partial, - ): Promise; + ): Promise; + saveSystemMessageAndNotifyUser( + type: MessageTypesValues, + rid: string, + message: string, + user: Pick, + extraData?: Partial, + ): Promise; beforeSave(param: { message: IMessage; room: IRoom; user: IUser }): Promise; sendMessageWithValidation(user: IUser, message: Partial, room: Partial, upsert?: boolean): Promise; deleteMessage(user: IUser, message: IMessage): Promise; diff --git a/packages/core-services/src/types/IRoomService.ts b/packages/core-services/src/types/IRoomService.ts index 53704ab3728d..23186590af50 100644 --- a/packages/core-services/src/types/IRoomService.ts +++ b/packages/core-services/src/types/IRoomService.ts @@ -24,6 +24,7 @@ export interface ICreateRoomParams { readOnly?: boolean; extraData?: Partial; options?: ICreateRoomOptions; + sidepanel?: IRoom['sidepanel']; } export interface IRoomService { addMember(uid: string, rid: string): Promise; @@ -32,9 +33,12 @@ export interface IRoomService { createDirectMessageWithMultipleUsers(members: string[], creatorId: string): Promise<{ rid: string }>; addUserToRoom( roomId: string, - user: Pick | string, + user: Pick | string, inviter?: Pick, - silenced?: boolean, + options?: { + skipSystemMessage?: boolean; + skipAlertSound?: boolean; + }, ): Promise; removeUserFromRoom(roomId: string, user: IUser, options?: { byUser: Pick }): Promise; getValidRoomName(displayName: string, roomId?: string, options?: { allowDuplicates?: boolean }): Promise; diff --git a/packages/core-services/src/types/ITeamService.ts b/packages/core-services/src/types/ITeamService.ts index 98747a385b59..2d67bf515fca 100644 --- a/packages/core-services/src/types/ITeamService.ts +++ b/packages/core-services/src/types/ITeamService.ts @@ -23,6 +23,7 @@ export interface ITeamCreateParams { room: ITeamCreateRoom; members?: Array | null; // list of user _ids owner?: string | null; // the team owner. If not present, owner = requester + sidepanel?: IRoom['sidepanel']; } export interface ITeamMemberParams { diff --git a/packages/core-services/src/types/ITranslationService.ts b/packages/core-services/src/types/ITranslationService.ts index f4a034fe704f..a3e159c9ce14 100644 --- a/packages/core-services/src/types/ITranslationService.ts +++ b/packages/core-services/src/types/ITranslationService.ts @@ -1,7 +1,8 @@ import type { IUser } from '@rocket.chat/core-typings'; export interface ITranslationService { - translateText(text: string, targetLanguage: string): Promise; + translateText(text: string, targetLanguage: string, args?: Record): Promise; translate(text: string, user: IUser): Promise; - translateToServerLanguage(text: string): Promise; + translateToServerLanguage(text: string, args?: Record): Promise; + translateMultipleToServerLanguage(keys: string[]): Promise>; } diff --git a/packages/core-services/src/types/IVideoConfService.ts b/packages/core-services/src/types/IVideoConfService.ts index 6491787c2b55..4f007229b98d 100644 --- a/packages/core-services/src/types/IVideoConfService.ts +++ b/packages/core-services/src/types/IVideoConfService.ts @@ -40,4 +40,5 @@ export interface IVideoConfService { caller: IUser['_id'], params: { callId: VideoConference['_id']; uid: IUser['_id']; rid: IRoom['_id'] }, ): Promise; + assignDiscussionToConference(callId: VideoConference['_id'], rid: IRoom['_id'] | undefined): Promise; } diff --git a/packages/core-typings/CHANGELOG.md b/packages/core-typings/CHANGELOG.md index ca75dd912ec0..fb313a4d1320 100644 --- a/packages/core-typings/CHANGELOG.md +++ b/packages/core-typings/CHANGELOG.md @@ -1,5 +1,67 @@ # @rocket.chat/core-typings +## 6.11.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +- ([#32328](https://github.com/RocketChat/Rocket.Chat/pull/32328)) Allow customFields on livechat creation bridge + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [2d89a0c448]: + + - @rocket.chat/ui-kit@0.36.0 +
    + +## 6.11.0-rc.6 + +## 6.11.0-rc.5 + +## 6.11.0-rc.4 + +## 6.11.0-rc.3 + +## 6.11.0-rc.2 + +## 6.11.0-rc.1 + +## 6.11.0-rc.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +- ([#32328](https://github.com/RocketChat/Rocket.Chat/pull/32328)) Allow customFields on livechat creation bridge + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [2d89a0c448]: + + - @rocket.chat/ui-kit@0.36.0-rc.0 +
    + +## 6.10.2 + +### Patch Changes + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +## 6.10.1 + ## 6.10.0 ### Minor Changes diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 7932b00b7e5f..267e75e5c177 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", - "version": "6.11.0-develop", + "version": "6.12.0-develop", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "eslint": "~8.45.0", @@ -22,7 +22,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.0", "@rocket.chat/icons": "^0.36.0", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/ui-kit": "workspace:~" diff --git a/packages/core-typings/src/ILivechatDepartmentAgents.ts b/packages/core-typings/src/ILivechatDepartmentAgents.ts index e33c80ff9245..7de0f01b258e 100644 --- a/packages/core-typings/src/ILivechatDepartmentAgents.ts +++ b/packages/core-typings/src/ILivechatDepartmentAgents.ts @@ -1,5 +1,6 @@ -export interface ILivechatDepartmentAgents { - _id: string; +import type { IRocketChatRecord } from './IRocketChatRecord'; + +export interface ILivechatDepartmentAgents extends IRocketChatRecord { departmentId: string; departmentEnabled: boolean; agentId: string; diff --git a/packages/core-typings/src/IMessage/IMessage.ts b/packages/core-typings/src/IMessage/IMessage.ts index 1812dfb6dad3..694225dc71a4 100644 --- a/packages/core-typings/src/IMessage/IMessage.ts +++ b/packages/core-typings/src/IMessage/IMessage.ts @@ -401,3 +401,9 @@ export type IMessageWithPendingFileImport = IMessage & { downloaded?: boolean; }; }; + +export interface IMessageFromVisitor extends IMessage { + token: string; +} + +export const isMessageFromVisitor = (message: IMessage): message is IMessageFromVisitor => 'token' in message; diff --git a/packages/core-typings/src/IRoom.ts b/packages/core-typings/src/IRoom.ts index ac31c2cc6a3a..442cac45fada 100644 --- a/packages/core-typings/src/IRoom.ts +++ b/packages/core-typings/src/IRoom.ts @@ -7,6 +7,8 @@ import type { IUser, Username } from './IUser'; import type { RoomType } from './RoomType'; type CallStatus = 'ringing' | 'ended' | 'declined' | 'ongoing'; +const sidepanelItemValues = ['channels', 'discussions'] as const; +export type SidepanelItem = (typeof sidepanelItemValues)[number]; export type RoomID = string; export type ChannelName = string; @@ -95,8 +97,28 @@ export interface IRoom extends IRocketChatRecord { customFields?: Record; usersWaitingForE2EKeys?: { userId: IUser['_id']; ts: Date }[]; + + sidepanel?: { + items: [SidepanelItem, SidepanelItem?]; + }; } +export const isSidepanelItem = (item: any): item is SidepanelItem => { + return sidepanelItemValues.includes(item); +}; + +export const isValidSidepanel = (sidepanel: IRoom['sidepanel']) => { + if (!sidepanel?.items) { + return false; + } + return ( + Array.isArray(sidepanel.items) && + sidepanel.items.length && + sidepanel.items.every(isSidepanelItem) && + sidepanel.items.length === new Set(sidepanel.items).size + ); +}; + export const isRoomWithJoinCode = (room: Partial): room is IRoomWithJoinCode => 'joinCodeRequired' in room && (room as any).joinCodeRequired === true; @@ -275,9 +297,12 @@ export interface IOmnichannelRoom extends IOmnichannelGenericRoom { total: number; avg: number; ft: number; + fd?: number; }; reaction?: { + tt: number; ft: number; + fd?: number; }; }; diff --git a/packages/core-typings/src/IUser.ts b/packages/core-typings/src/IUser.ts index 136146e40a34..3c6d1c890d7b 100644 --- a/packages/core-typings/src/IUser.ts +++ b/packages/core-typings/src/IUser.ts @@ -231,5 +231,3 @@ export type AvatarServiceObject = { }; export type AvatarObject = AvatarReset | AvatarUrlObj | FormData | AvatarServiceObject; - -export type IAdminUserTabs = 'all' | 'active' | 'deactivated' | 'pending'; diff --git a/packages/core-typings/src/IVideoConference.ts b/packages/core-typings/src/IVideoConference.ts index 327b7dd107a8..334e1fd6a0e2 100644 --- a/packages/core-typings/src/IVideoConference.ts +++ b/packages/core-typings/src/IVideoConference.ts @@ -56,6 +56,7 @@ export interface IVideoConference extends IRocketChatRecord { providerData?: Record; ringing?: boolean; + discussionRid?: IRoom['_id']; } export interface IDirectVideoConference extends IVideoConference { diff --git a/packages/core-typings/src/RoomRouteData.ts b/packages/core-typings/src/RoomRouteData.ts new file mode 100644 index 000000000000..06394137452e --- /dev/null +++ b/packages/core-typings/src/RoomRouteData.ts @@ -0,0 +1,26 @@ +import type { IRoom } from './IRoom'; + +export type DirectRoomRouteData = ( + | { + rid: IRoom['_id']; + name?: IRoom['name']; + } + | { + name: IRoom['name']; + } +) & { + tab?: string; +}; + +export type ChannelRouteData = { + name: IRoom['name']; + tab?: string; + context?: string; +}; + +export type OmnichannelRoomRouteData = { + rid: IRoom['_id']; + tab?: string; +}; + +export type RoomRouteData = DirectRoomRouteData | ChannelRouteData | OmnichannelRoomRouteData; diff --git a/packages/core-typings/src/VideoConferenceCapabilities.ts b/packages/core-typings/src/VideoConferenceCapabilities.ts index 0ff6ccb754af..18070608e53f 100644 --- a/packages/core-typings/src/VideoConferenceCapabilities.ts +++ b/packages/core-typings/src/VideoConferenceCapabilities.ts @@ -2,4 +2,5 @@ export type VideoConferenceCapabilities = { mic?: boolean; cam?: boolean; title?: boolean; + persistentChat?: boolean; }; diff --git a/packages/core-typings/src/ee/IAuditLog.ts b/packages/core-typings/src/ee/IAuditLog.ts index de1c6ff5213f..4618400d8017 100644 --- a/packages/core-typings/src/ee/IAuditLog.ts +++ b/packages/core-typings/src/ee/IAuditLog.ts @@ -12,12 +12,13 @@ export interface IAuditLog extends IRocketChatRecord { fields: { type: string; msg: IMessage['msg']; - startDate: Date; - endDate: Date; + startDate?: Date; + endDate?: Date; rids?: IRoom['_id'][]; room: IRoom['name']; users?: IUser['username'][]; visitor?: ILivechatVisitor['_id']; agent?: ILivechatAgent['_id']; + filters?: string; }; } diff --git a/packages/core-typings/src/index.ts b/packages/core-typings/src/index.ts index c310ba486516..c04ffa998d77 100644 --- a/packages/core-typings/src/index.ts +++ b/packages/core-typings/src/index.ts @@ -137,4 +137,7 @@ export * from './ICustomOAuthConfig'; export * from './IModerationReport'; export * from './CustomFieldMetadata'; +export * from './RoomRouteData'; + export * as Cloud from './cloud'; +export * from './themes'; diff --git a/packages/core-typings/src/omnichannel/routing.ts b/packages/core-typings/src/omnichannel/routing.ts index af27f221c2b1..526c88eb3d5a 100644 --- a/packages/core-typings/src/omnichannel/routing.ts +++ b/packages/core-typings/src/omnichannel/routing.ts @@ -27,10 +27,7 @@ export type TransferData = { userId?: string; departmentId?: string; department?: Pick; - transferredBy: { - _id: string; - username?: string; - }; + transferredBy: TransferByData; transferredTo?: { username?: string; name?: string; @@ -47,5 +44,5 @@ export type TransferByData = { _id: string; username?: string; name?: string; - userType?: 'agent' | 'user' | 'visitor'; + userType: 'agent' | 'user' | 'visitor'; }; diff --git a/ee/packages/ui-theming/src/types/themes.ts b/packages/core-typings/src/themes.ts similarity index 100% rename from ee/packages/ui-theming/src/types/themes.ts rename to packages/core-typings/src/themes.ts diff --git a/packages/cron/CHANGELOG.md b/packages/cron/CHANGELOG.md index adf3a4197bb7..33c0c9872a60 100644 --- a/packages/cron/CHANGELOG.md +++ b/packages/cron/CHANGELOG.md @@ -1,5 +1,105 @@ # @rocket.chat/cron +## 0.1.3 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/models@0.2.0 +
    + +## 0.1.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.1.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.1.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.1.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.1.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.1.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.1.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/models@0.2.0-rc.0 +
    + +## 0.1.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/models@0.1.2 +
    + +## 0.1.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/models@0.1.1 +
    + ## 0.1.0 ### Minor Changes diff --git a/packages/cron/package.json b/packages/cron/package.json index ae38acb7a799..a6484224ded5 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -1,18 +1,14 @@ { "name": "@rocket.chat/cron", - "version": "0.1.0", + "version": "0.1.3", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md index 6e7cf8afed99..e8fe73f6d549 100644 --- a/packages/fuselage-ui-kit/CHANGELOG.md +++ b/packages/fuselage-ui-kit/CHANGELOG.md @@ -1,5 +1,153 @@ # Change Log +## 9.0.0 + +### Patch Changes + +- ([#32679](https://github.com/RocketChat/Rocket.Chat/pull/32679)) Fix validations from "UiKit" modal component + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [2d89a0c448, 24f7df4894, 4e8aa575a6, b8e5887fb9]: + + - @rocket.chat/ui-video-conf@9.0.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/ui-contexts@9.0.0 + - @rocket.chat/ui-kit@0.36.0 + - @rocket.chat/gazzodown@9.0.0 + - @rocket.chat/ui-avatar@5.0.0 +
    + +## 9.0.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/gazzodown@9.0.0-rc.6 + - @rocket.chat/ui-contexts@9.0.0-rc.6 + - @rocket.chat/ui-avatar@5.0.0-rc.6 + - @rocket.chat/ui-video-conf@9.0.0-rc.6 +
    + +## 9.0.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/gazzodown@9.0.0-rc.5 + - @rocket.chat/ui-contexts@9.0.0-rc.5 + - @rocket.chat/ui-avatar@5.0.0-rc.5 + - @rocket.chat/ui-video-conf@9.0.0-rc.5 +
    + +## 9.0.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/gazzodown@9.0.0-rc.4 + - @rocket.chat/ui-contexts@9.0.0-rc.4 + - @rocket.chat/ui-avatar@5.0.0-rc.4 + - @rocket.chat/ui-video-conf@9.0.0-rc.4 +
    + +## 9.0.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/gazzodown@9.0.0-rc.3 + - @rocket.chat/ui-contexts@9.0.0-rc.3 + - @rocket.chat/ui-avatar@5.0.0-rc.3 + - @rocket.chat/ui-video-conf@9.0.0-rc.3 +
    + +## 9.0.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/gazzodown@9.0.0-rc.2 + - @rocket.chat/ui-contexts@9.0.0-rc.2 + - @rocket.chat/ui-avatar@5.0.0-rc.2 + - @rocket.chat/ui-video-conf@9.0.0-rc.2 +
    + +## 9.0.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/gazzodown@9.0.0-rc.1 + - @rocket.chat/ui-contexts@9.0.0-rc.1 + - @rocket.chat/ui-avatar@5.0.0-rc.1 + - @rocket.chat/ui-video-conf@9.0.0-rc.1 +
    + +## 9.0.0-rc.0 + +### Patch Changes + +- ([#32679](https://github.com/RocketChat/Rocket.Chat/pull/32679)) Fix validations from "UiKit" modal component + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [2d89a0c448, 24f7df4894, 4e8aa575a6, b8e5887fb9]: + + - @rocket.chat/ui-video-conf@9.0.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/ui-contexts@9.0.0-rc.0 + - @rocket.chat/ui-kit@0.36.0-rc.0 + - @rocket.chat/gazzodown@9.0.0-rc.0 + - @rocket.chat/ui-avatar@5.0.0-rc.0 +
    + +## 8.0.2 + +### Patch Changes + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/gazzodown@8.0.2 + - @rocket.chat/ui-contexts@8.0.2 + - @rocket.chat/ui-avatar@4.0.2 + - @rocket.chat/ui-video-conf@8.0.2 +
    + +## 8.0.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/gazzodown@8.0.1 + - @rocket.chat/ui-contexts@8.0.1 + - @rocket.chat/ui-avatar@4.0.1 + - @rocket.chat/ui-video-conf@8.0.1 +
    + ## 8.0.0 ### Minor Changes diff --git a/packages/fuselage-ui-kit/jest.config.ts b/packages/fuselage-ui-kit/jest.config.ts index 070e217dc457..5c3180dfe83f 100644 --- a/packages/fuselage-ui-kit/jest.config.ts +++ b/packages/fuselage-ui-kit/jest.config.ts @@ -1,35 +1,13 @@ +import client from '@rocket.chat/jest-presets/client'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', - errorOnDeprecated: true, - testEnvironment: 'jsdom', - modulePathIgnorePatterns: ['/dist/'], - transform: { - '^.+\\.(t|j)sx?$': [ - '@swc/jest', - { - sourceMaps: true, - jsc: { - parser: { - syntax: 'typescript', - tsx: true, - decorators: false, - dynamicImport: true, - }, - transform: { - react: { - runtime: 'automatic', - }, - }, - }, - }, - ], - }, + preset: client.preset, + setupFilesAfterEnv: [...client.setupFilesAfterEnv], moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', '^react($|/.+)': '/../../node_modules/react$1', + '^react-dom/client$': '/../../node_modules/react-dom$1', + '^react-dom($|/.+)': '/../../node_modules/react-dom$1', + '^react-i18next($|/.+)': '/../../node_modules/react-i18next$1', }, - setupFilesAfterEnv: [ - '@testing-library/jest-dom/extend-expect', - '/jest.setup.ts', - ], -}; +} satisfies Config; diff --git a/packages/fuselage-ui-kit/jest.setup.ts b/packages/fuselage-ui-kit/jest.setup.ts deleted file mode 100644 index 657e42bbdea1..000000000000 --- a/packages/fuselage-ui-kit/jest.setup.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TextEncoder, TextDecoder } from 'util'; - -global.TextEncoder = TextEncoder; -// @ts-ignore -global.TextDecoder = TextDecoder; - -global.ResizeObserver = jest.fn().mockImplementation(() => ({ - observe: jest.fn(), - unobserve: jest.fn(), - disconnect: jest.fn(), -})); diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 622741719481..6d6b882c89d2 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/fuselage-ui-kit", "private": true, - "version": "8.0.0", + "version": "9.0.0", "description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system", "homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/", "author": { @@ -30,8 +30,8 @@ "dev": "tsc --watch --preserveWatchOutput -p tsconfig-esm.json", "build": "run-s .:build:clean .:build:esm .:build:cjs", ".:build:clean": "rimraf dist", - ".:build:esm": "tsc -p tsconfig-esm.json", - ".:build:cjs": "tsc -p tsconfig-cjs.json", + ".:build:esm": "tsc -p tsconfig.esm.json", + ".:build:cjs": "tsc -p tsconfig.cjs.json", "test": "jest", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "testunit": "jest", @@ -50,10 +50,10 @@ "@rocket.chat/icons": "*", "@rocket.chat/prettier-config": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "4.0.0", - "@rocket.chat/ui-contexts": "8.0.0", - "@rocket.chat/ui-kit": "0.35.0", - "@rocket.chat/ui-video-conf": "8.0.0", + "@rocket.chat/ui-avatar": "5.0.0", + "@rocket.chat/ui-contexts": "9.0.0", + "@rocket.chat/ui-kit": "0.36.0", + "@rocket.chat/ui-video-conf": "9.0.0", "@tanstack/react-query": "*", "react": "*", "react-dom": "*" @@ -63,13 +63,14 @@ "@babel/preset-env": "~7.22.20", "@babel/preset-react": "~7.22.15", "@babel/preset-typescript": "~7.22.15", - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.0", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/icons": "^0.36.0", + "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/mock-providers": "workspace:^", "@rocket.chat/prettier-config": "~0.31.25", "@rocket.chat/styled": "~0.31.25", @@ -85,9 +86,8 @@ "@storybook/source-loader": "~6.5.16", "@storybook/theming": "~6.5.16", "@tanstack/react-query": "^4.16.1", - "@testing-library/react": "^12.1.4", - "@testing-library/react-hooks": "^8.0.1", - "@testing-library/user-event": "^14.5.2", + "@testing-library/react": "~16.0.0", + "@testing-library/user-event": "~14.5.2", "@types/babel__core": "^7.20.3", "@types/babel__preset-env": "^7.9.4", "@types/react": "~17.0.69", @@ -96,7 +96,7 @@ "cross-env": "^7.0.3", "eslint": "~8.45.0", "i18next": "^23.10.1", - "jest": "^29.7.0", + "jest": "~29.7.0", "normalize.css": "^8.0.1", "npm-run-all": "^4.1.5", "prettier": "~2.8.8", @@ -105,7 +105,6 @@ "react-i18next": "^14.1.0", "rimraf": "^3.0.2", "storybook-dark-mode": "~3.0.1", - "ts-jest": "^29.1.2", "tslib": "^2.5.3", "typescript": "~5.3.3" }, diff --git a/packages/fuselage-ui-kit/src/blocks/InputBlock.tsx b/packages/fuselage-ui-kit/src/blocks/InputBlock.tsx index 979e04e808c7..9844372a3060 100644 --- a/packages/fuselage-ui-kit/src/blocks/InputBlock.tsx +++ b/packages/fuselage-ui-kit/src/blocks/InputBlock.tsx @@ -46,7 +46,15 @@ const InputBlock = ({ {surfaceRenderer.renderInputBlockElement(inputElement, 0)} {error && {error}} - {block.hint && {block.hint}} + {block.hint && ( + + {surfaceRenderer.renderTextObject( + block.hint, + 0, + UiKit.BlockContext.NONE + )} + + )} ); }; diff --git a/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx b/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx index 81cfbe3f88bf..969ad0af1d7c 100644 --- a/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx +++ b/packages/fuselage-ui-kit/src/blocks/VideoConferenceBlock/VideoConferenceBlock.tsx @@ -1,4 +1,8 @@ -import { useTranslation, useUserId } from '@rocket.chat/ui-contexts'; +import { + useGoToRoom, + useTranslation, + useUserId, +} from '@rocket.chat/ui-contexts'; import type * as UiKit from '@rocket.chat/ui-kit'; import { VideoConfMessageSkeleton, @@ -33,6 +37,7 @@ const VideoConferenceBlock = ({ const { callId, appId = 'videoconf-core' } = block; const surfaceType = useSurfaceType(); const userId = useUserId(); + const goToRoom = useGoToRoom(); const { action, viewId = undefined, rid } = useContext(UiKitContext); @@ -85,6 +90,12 @@ const VideoConferenceBlock = ({ ); }; + const openDiscussion: MouseEventHandler = (_e) => { + if (data.discussionRid) { + goToRoom(data.discussionRid); + } + }; + if (result.isLoading || result.isError) { // TODO: error handling return ; @@ -93,6 +104,19 @@ const VideoConferenceBlock = ({ const { data } = result; const isUserCaller = data.createdBy._id === userId; + const actions = ( + + {data.discussionRid && ( + + )} + + + ); + if ('endedAt' in data) { return ( @@ -101,9 +125,7 @@ const VideoConferenceBlock = ({ {t('Call_ended')} - - - + {actions} {data.type === 'direct' && ( @@ -146,9 +168,7 @@ const VideoConferenceBlock = ({ {t('Calling')} - - - + {actions} @@ -166,9 +186,7 @@ const VideoConferenceBlock = ({ {t('Call_ongoing')} - - - + {actions} diff --git a/packages/fuselage-ui-kit/src/contexts/UiKitContext.ts b/packages/fuselage-ui-kit/src/contexts/UiKitContext.ts index 11a7da574859..8bd64348f772 100644 --- a/packages/fuselage-ui-kit/src/contexts/UiKitContext.ts +++ b/packages/fuselage-ui-kit/src/contexts/UiKitContext.ts @@ -26,7 +26,7 @@ type UiKitContextValue = { event: Parameters>[0] ) => Promise | void; appId?: string; - errors?: Record; + errors?: { [field: string]: string }[] | { [field: string]: string }; values: Record; viewId?: string; rid?: string; diff --git a/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/ChannelsSelectElement.spec.tsx b/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/ChannelsSelectElement.spec.tsx index 6af59dba4f63..a1a1f93dd1cd 100644 --- a/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/ChannelsSelectElement.spec.tsx +++ b/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/ChannelsSelectElement.spec.tsx @@ -66,7 +66,10 @@ describe('UiKit ChannelsSelect Element', () => { context={BlockContext.FORM} surfaceRenderer={contextualBarParser} /> - + , + { + legacyRoot: true, + } ); }); diff --git a/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/ChannelsSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/ChannelsSelectElement.tsx index 51d25f7ae0d5..a26037373aa7 100644 --- a/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/ChannelsSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/ChannelsSelectElement.tsx @@ -1,10 +1,4 @@ -import { - AutoComplete, - Option, - Box, - Options, - Chip, -} from '@rocket.chat/fuselage'; +import { AutoComplete, Option, Box, Chip } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { RoomAvatar } from '@rocket.chat/ui-avatar'; import type * as UiKit from '@rocket.chat/ui-kit'; @@ -28,8 +22,8 @@ const ChannelsSelectElement = ({ const options = useChannelsData({ filter: filterDebounced }); const handleChange = useCallback( - (value) => { - action({ target: { value } }); + (value: string | string[]) => { + if (!Array.isArray(value)) action({ target: { value } }); }, [action] ); @@ -59,7 +53,7 @@ const ChannelsSelectElement = ({ label={label.name} avatar={ { context={BlockContext.FORM} surfaceRenderer={contextualBarParser} /> - + , + { legacyRoot: true } ); }); diff --git a/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/MultiChannelsSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/MultiChannelsSelectElement.tsx index 78bf07bbf599..b050a137860d 100644 --- a/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/MultiChannelsSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/ChannelsSelectElement/MultiChannelsSelectElement.tsx @@ -22,8 +22,8 @@ const MultiChannelsSelectElement = ({ const options = useChannelsData({ filter: filterDebounced }); const handleChange = useCallback( - (value) => { - action({ target: { value } }); + (value: string | string[]) => { + if (Array.isArray(value)) action({ target: { value } }); }, [action] ); diff --git a/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx index a1948a921f49..9bb5746f7ef0 100644 --- a/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx @@ -27,7 +27,7 @@ const MultiStaticSelectElement = ({ ); const handleChange = useCallback( - (value) => { + (value: string[]) => { action({ target: { value } }); }, [action] diff --git a/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx index c68a7f067a8d..549ef2d8bd6e 100644 --- a/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx @@ -26,7 +26,7 @@ const StaticSelectElement = ({ ); const handleChange = useCallback( - (value) => { + (value: string) => { action({ target: { value } }); }, [action] diff --git a/packages/fuselage-ui-kit/src/elements/UsersSelectElement/MultiUsersSelectElement.spec.tsx b/packages/fuselage-ui-kit/src/elements/UsersSelectElement/MultiUsersSelectElement.spec.tsx index 1a6afad6c614..eea4f509fed0 100644 --- a/packages/fuselage-ui-kit/src/elements/UsersSelectElement/MultiUsersSelectElement.spec.tsx +++ b/packages/fuselage-ui-kit/src/elements/UsersSelectElement/MultiUsersSelectElement.spec.tsx @@ -53,7 +53,8 @@ describe('UiKit MultiUsersSelect Element', () => { context={BlockContext.FORM} surfaceRenderer={contextualBarParser} /> - + , + { legacyRoot: true } ); }); diff --git a/packages/fuselage-ui-kit/src/elements/UsersSelectElement/MultiUsersSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/UsersSelectElement/MultiUsersSelectElement.tsx index bdf7bfef4a31..3fd3351c2bb6 100644 --- a/packages/fuselage-ui-kit/src/elements/UsersSelectElement/MultiUsersSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/UsersSelectElement/MultiUsersSelectElement.tsx @@ -31,8 +31,8 @@ const MultiUsersSelectElement = ({ const data = useUsersData({ filter: debouncedFilter }); const handleChange = useCallback( - (value) => { - action({ target: { value } }); + (value: string | string[]) => { + if (Array.isArray(value)) action({ target: { value } }); }, [action] ); diff --git a/packages/fuselage-ui-kit/src/elements/UsersSelectElement/UserSelectElement.spec.tsx b/packages/fuselage-ui-kit/src/elements/UsersSelectElement/UserSelectElement.spec.tsx index 02f11d50951b..6e92a85d1656 100644 --- a/packages/fuselage-ui-kit/src/elements/UsersSelectElement/UserSelectElement.spec.tsx +++ b/packages/fuselage-ui-kit/src/elements/UsersSelectElement/UserSelectElement.spec.tsx @@ -53,7 +53,8 @@ describe('UiKit UserSelect Element', () => { context={BlockContext.FORM} surfaceRenderer={contextualBarParser} /> - + , + { legacyRoot: true } ); }); diff --git a/packages/fuselage-ui-kit/src/elements/UsersSelectElement/UsersSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/UsersSelectElement/UsersSelectElement.tsx index 39e71bd4fce8..03306a36905c 100644 --- a/packages/fuselage-ui-kit/src/elements/UsersSelectElement/UsersSelectElement.tsx +++ b/packages/fuselage-ui-kit/src/elements/UsersSelectElement/UsersSelectElement.tsx @@ -24,8 +24,8 @@ const UsersSelectElement = ({ block, context }: UsersSelectElementProps) => { const data = useUsersData({ filter: debouncedFilter }); const handleChange = useCallback( - (value) => { - action({ target: { value } }); + (value: string | string[]) => { + if (!Array.isArray(value)) action({ target: { value } }); }, [action] ); diff --git a/packages/fuselage-ui-kit/src/hooks/useAppTranslation.spec.tsx b/packages/fuselage-ui-kit/src/hooks/useAppTranslation.spec.tsx index e32dff123c1a..46314982aed8 100644 --- a/packages/fuselage-ui-kit/src/hooks/useAppTranslation.spec.tsx +++ b/packages/fuselage-ui-kit/src/hooks/useAppTranslation.spec.tsx @@ -1,5 +1,6 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook, waitFor } from '@testing-library/react'; import * as i18next from 'i18next'; +import { Suspense } from 'react'; import { I18nextProvider, initReactI18next } from 'react-i18next'; import { AppIdProvider } from '../contexts/AppIdContext'; @@ -30,6 +31,7 @@ beforeEach(async () => { it('should work with normal app ID (`test`)', async () => { const { result } = renderHook(() => useAppTranslation().t('test'), { + legacyRoot: true, wrapper: ({ children }) => ( {children} @@ -42,6 +44,7 @@ it('should work with normal app ID (`test`)', async () => { it('should work with core app ID (`test-core`)', async () => { const { result } = renderHook(() => useAppTranslation().t('test'), { + legacyRoot: true, wrapper: ({ children }) => ( {children} @@ -57,7 +60,14 @@ describe('with suspense', () => { beforeEach(async () => { i18n = i18next - .createInstance() + .createInstance({ + lng: 'en', + defaultNS: 'core', + partialBundledLanguages: true, + react: { + useSuspense: true, + }, + }) .use({ type: 'backend', init: () => undefined, @@ -81,27 +91,20 @@ describe('with suspense', () => { } satisfies i18next.BackendModule) .use(initReactI18next); - await i18n.init({ - lng: 'en', - defaultNS: 'core', - partialBundledLanguages: true, - react: { - useSuspense: true, - }, - }); + await i18n.init(); }); it('should work with normal app ID (`test`)', async () => { - const { result, waitFor } = renderHook( - () => useAppTranslation().t('test'), - { - wrapper: ({ children }) => ( - - {children} - - ), - } - ); + const { result } = renderHook(() => useAppTranslation().t('test'), { + legacyRoot: true, + wrapper: ({ children }) => ( + + + {children} + + + ), + }); await waitFor(() => expect(result.current).toBe('jumped over the lazy dog') @@ -109,16 +112,16 @@ describe('with suspense', () => { }); it('should work with core app ID (`test-core`)', async () => { - const { result, waitFor } = renderHook( - () => useAppTranslation().t('test'), - { - wrapper: ({ children }) => ( - - {children} - - ), - } - ); + const { result } = renderHook(() => useAppTranslation().t('test'), { + legacyRoot: true, + wrapper: ({ children }) => ( + + + {children} + + + ), + }); await waitFor(() => expect(result.current).toBe('a quick brown fox')); }); diff --git a/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts b/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts index 4468f4fd86a7..6af9245f9a51 100644 --- a/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts +++ b/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts @@ -57,7 +57,11 @@ export const useUiKitState = ( const { values, errors } = useContext(UiKitContext); const _value = getElementValueFromState(actionId, values, initialValue); - const error = errors?.[actionId]; + const error = Array.isArray(errors) + ? errors.find((error) => + Object.keys(error).find((key) => key === actionId) + )?.[actionId] + : errors?.[actionId]; const [value, setValue] = useSafely(useState(_value)); const [loading, setLoading] = useSafely(useState(false)); diff --git a/packages/fuselage-ui-kit/src/surfaces/createSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/createSurfaceRenderer.tsx index 2f6115f8ca66..0208198f0268 100644 --- a/packages/fuselage-ui-kit/src/surfaces/createSurfaceRenderer.tsx +++ b/packages/fuselage-ui-kit/src/surfaces/createSurfaceRenderer.tsx @@ -1,11 +1,11 @@ import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ComponentType, ReactElement } from 'react'; +import type { ComponentType, ReactElement, ReactNode } from 'react'; export const createSurfaceRenderer = < S extends UiKit.SurfaceRenderer >( // eslint-disable-next-line @typescript-eslint/naming-convention - SurfaceComponent: ComponentType, + SurfaceComponent: ComponentType<{ children: ReactNode }>, surfaceRenderer: S ) => function Surface( diff --git a/packages/fuselage-ui-kit/tsconfig-cjs.json b/packages/fuselage-ui-kit/tsconfig.cjs.json similarity index 78% rename from packages/fuselage-ui-kit/tsconfig-cjs.json rename to packages/fuselage-ui-kit/tsconfig.cjs.json index d4ac04a4fbc0..baae5231fec4 100644 --- a/packages/fuselage-ui-kit/tsconfig-cjs.json +++ b/packages/fuselage-ui-kit/tsconfig.cjs.json @@ -6,5 +6,5 @@ "outDir": "./dist/cjs" }, "include": ["src"], - "exclude": ["node_modules", "dist", "src/**/*.stories.tsx", ".storybook/**/*"] + "exclude": ["node_modules", "dist", "src/**/*.stories.tsx", ".storybook/**/*", "./src/**/*.spec.ts", "./src/**/*.spec.tsx"] } diff --git a/packages/fuselage-ui-kit/tsconfig-esm.json b/packages/fuselage-ui-kit/tsconfig.esm.json similarity index 78% rename from packages/fuselage-ui-kit/tsconfig-esm.json rename to packages/fuselage-ui-kit/tsconfig.esm.json index e7628b7b0174..017766f03607 100644 --- a/packages/fuselage-ui-kit/tsconfig-esm.json +++ b/packages/fuselage-ui-kit/tsconfig.esm.json @@ -6,5 +6,5 @@ "outDir": "./dist/esm" }, "include": ["src"], - "exclude": ["node_modules", "dist", "src/**/*.stories.tsx", ".storybook/**/*"] + "exclude": ["node_modules", "dist", "src/**/*.stories.tsx", ".storybook/**/*", "./src/**/*.spec.ts", "./src/**/*.spec.tsx"] } diff --git a/packages/fuselage-ui-kit/tsconfig.json b/packages/fuselage-ui-kit/tsconfig.json index 59d360dca033..bad1623ca4d9 100644 --- a/packages/fuselage-ui-kit/tsconfig.json +++ b/packages/fuselage-ui-kit/tsconfig.json @@ -1,14 +1,9 @@ { "extends": "../../tsconfig.base.client.json", "compilerOptions": { - "module": "CommonJS", - "rootDirs": ["./src", "./.storybook"], - "outDir": "./dist", - "allowJs": false, "noImplicitReturns": true, "noImplicitThis": true, - "jsx": "react-jsx" }, "include": ["src", ".storybook/**/*"], - "exclude": ["node_modules", "dist", "src/**/*.stories.tsx"] + "exclude": ["node_modules", "src/**/*.stories.tsx", "src/**/*.spec.ts", "src/**/*.spec.tsx"] } diff --git a/packages/gazzodown/CHANGELOG.md b/packages/gazzodown/CHANGELOG.md index b6aecd837384..4febdb0f54b2 100644 --- a/packages/gazzodown/CHANGELOG.md +++ b/packages/gazzodown/CHANGELOG.md @@ -1,5 +1,115 @@ # @rocket.chat/gazzodown +## 9.0.0 + +### Patch Changes + +-
    Updated dependencies [1b7b1161cf, 2d89a0c448, 24f7df4894, 3ffe4a2944, 4e8aa575a6, b8e5887fb9]: + + - @rocket.chat/ui-client@9.0.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/ui-contexts@9.0.0 +
    + +## 9.0.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/ui-contexts@9.0.0-rc.6 + - @rocket.chat/ui-client@9.0.0-rc.6 +
    + +## 9.0.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/ui-contexts@9.0.0-rc.5 + - @rocket.chat/ui-client@9.0.0-rc.5 +
    + +## 9.0.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/ui-contexts@9.0.0-rc.4 + - @rocket.chat/ui-client@9.0.0-rc.4 +
    + +## 9.0.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/ui-contexts@9.0.0-rc.3 + - @rocket.chat/ui-client@9.0.0-rc.3 +
    + +## 9.0.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/ui-contexts@9.0.0-rc.2 + - @rocket.chat/ui-client@9.0.0-rc.2 +
    + +## 9.0.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/ui-contexts@9.0.0-rc.1 + - @rocket.chat/ui-client@9.0.0-rc.1 +
    + +## 9.0.0-rc.0 + +### Patch Changes + +-
    Updated dependencies [1b7b1161cf, 2d89a0c448, 24f7df4894, 3ffe4a2944, 4e8aa575a6, b8e5887fb9]: + + - @rocket.chat/ui-client@9.0.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/ui-contexts@9.0.0-rc.0 +
    + +## 8.0.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/ui-contexts@8.0.2 + - @rocket.chat/ui-client@8.0.2 +
    + +## 8.0.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/ui-contexts@8.0.1 + - @rocket.chat/ui-client@8.0.1 +
    + ## 8.0.0 ### Minor Changes diff --git a/packages/gazzodown/jest.config.ts b/packages/gazzodown/jest.config.ts index 578c2920c79e..597fbebb687b 100644 --- a/packages/gazzodown/jest.config.ts +++ b/packages/gazzodown/jest.config.ts @@ -1,30 +1,12 @@ +import client from '@rocket.chat/jest-presets/client'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', - errorOnDeprecated: true, - testEnvironment: 'jsdom', - modulePathIgnorePatterns: ['/dist/'], - transform: { - '^.+\\.(t|j)sx?$': [ - '@swc/jest', - { - sourceMaps: true, - jsc: { - parser: { - syntax: 'typescript', - tsx: true, - decorators: false, - dynamicImport: true, - }, - transform: { - react: { - runtime: 'automatic', - }, - }, - }, - }, - ], - }, + preset: client.preset, + setupFilesAfterEnv: [...client.setupFilesAfterEnv], moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', + '^react($|/.+)': '/../../node_modules/react$1', + '^react-dom/client$': '/../../node_modules/react-dom$1', + '^react-dom($|/.+)': '/../../node_modules/react-dom$1', }, -}; +} satisfies Config; diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index 03cdcd09d29f..6ecb49fa9544 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -1,13 +1,14 @@ { "name": "@rocket.chat/gazzodown", - "version": "8.0.0", + "version": "9.0.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/fuselage-tokens": "^0.33.1", + "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/styled": "~0.31.25", "@rocket.chat/ui-client": "workspace:^", @@ -21,15 +22,11 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@swc/core": "^1.3.95", - "@swc/jest": "^0.2.29", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "~12.1.5", - "@types/jest": "~29.5.7", + "@testing-library/react": "~16.0.0", + "@types/jest": "~29.5.12", "@types/katex": "~0.16.5", "@types/react": "~17.0.69", "@types/react-dom": "~17.0.22", - "@types/testing-library__jest-dom": "~5.14.9", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "babel-loader": "^8.3.0", @@ -39,23 +36,21 @@ "eslint-plugin-react-hooks": "~4.6.0", "eslint-plugin-storybook": "~0.6.15", "identity-obj-proxy": "^3.0.0", - "jest": "~29.6.4", - "jest-environment-jsdom": "~29.6.4", + "jest": "~29.7.0", "katex": "~0.16.9", "outdent": "^0.8.0", "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "~17.0.2", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "testunit": "jest --runInBand", - "test": "jest --runInBand", - "build": "rm -rf dist && tsc -p tsconfig.json", - "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput", - "typecheck": "tsc -p tsconfig.json --noEmit", + "testunit": "jest", + "test": "jest", "storybook": "start-storybook -p 6006", "build-storybook": "build-storybook" }, @@ -71,8 +66,8 @@ "@rocket.chat/fuselage-tokens": "*", "@rocket.chat/message-parser": "0.31.29", "@rocket.chat/styled": "*", - "@rocket.chat/ui-client": "8.0.0", - "@rocket.chat/ui-contexts": "8.0.0", + "@rocket.chat/ui-client": "9.0.0", + "@rocket.chat/ui-contexts": "9.0.0", "katex": "*", "react": "*" }, diff --git a/packages/gazzodown/src/Markup.spec.tsx b/packages/gazzodown/src/Markup.spec.tsx index 29ff8cda0fb0..a773ca73b919 100644 --- a/packages/gazzodown/src/Markup.spec.tsx +++ b/packages/gazzodown/src/Markup.spec.tsx @@ -1,20 +1,15 @@ -import { render, screen, cleanup, waitFor } from '@testing-library/react'; +import { render, screen, waitFor } from '@testing-library/react'; import { Suspense } from 'react'; -import '@testing-library/jest-dom'; import { MarkupInteractionContext } from '.'; import Markup from './Markup'; -afterEach(cleanup); - -beforeAll(() => { - jest.mock('highlight.js', () => ({ - highlightElement: (): void => undefined, - })); -}); +jest.mock('highlight.js', () => ({ + highlightElement: (): void => undefined, +})); it('renders empty', () => { - const { container } = render(); + const { container } = render(, { legacyRoot: true }); expect(container).toBeEmptyDOMElement(); }); @@ -39,6 +34,7 @@ it('renders a big emoji block', () => { ]} /> , + { legacyRoot: true }, ); expect(screen.getByRole('presentation')).toHaveTextContent(':smile:😀:smile:'); @@ -67,6 +63,7 @@ it('renders a big emoji block with ASCII emoji', () => { ]} /> , + { legacyRoot: true }, ); expect(screen.getByRole('presentation')).toHaveTextContent(':slight_smile:🙂:)'); @@ -84,6 +81,7 @@ it('renders a paragraph', () => { }, ]} />, + { legacyRoot: true }, ); expect(screen.getByText('Hello')).toBeInTheDocument(); @@ -100,6 +98,7 @@ it('renders a heading', () => { }, ]} />, + { legacyRoot: true }, ); expect(screen.getByRole('heading', { name: 'Hello' })).toBeInTheDocument(); @@ -119,6 +118,7 @@ it('renders a unordered list', () => { }, ]} />, + { legacyRoot: true }, ); expect(screen.getByRole('list')).toBeInTheDocument(); @@ -145,6 +145,7 @@ it('renders an ordered list', () => { }, ]} />, + { legacyRoot: true }, ); expect(screen.getByRole('list')).toBeInTheDocument(); @@ -171,6 +172,7 @@ it('renders a task list', () => { }, ]} />, + { legacyRoot: true }, ); expect(screen.getByRole('list')).toBeInTheDocument(); @@ -213,6 +215,7 @@ it('renders a blockquote', () => { }, ]} />, + { legacyRoot: true }, ); expect(screen.getByText('Cogito ergo sum.')).toBeInTheDocument(); @@ -233,6 +236,7 @@ it('renders a code block', async () => { ]} /> , + { legacyRoot: true }, ); await waitFor(() => expect(screen.getByRole('region')).toBeInTheDocument()); @@ -253,6 +257,7 @@ it('renders a code block with language', async () => { ]} /> , + { legacyRoot: true }, ); await waitFor(() => expect(screen.getByRole('region')).toBeInTheDocument()); @@ -273,6 +278,7 @@ it('renders a Katex block', async () => { ]} /> , + { legacyRoot: true }, ); // workaround for jest-dom's inability to handle MathML @@ -292,6 +298,7 @@ it('renders a line break', () => { }, ]} />, + { legacyRoot: true }, ); expect(container).toContainHTML('
    '); @@ -319,6 +326,7 @@ it('renders plain text instead of emojis based on preference', () => { ]} /> , + { legacyRoot: true }, ); expect(screen.getByText('Hey! :smile: :)')).toBeInTheDocument(); @@ -346,6 +354,7 @@ it('renders plain text instead of ASCII emojis based on useEmojis preference', ( ]} /> , + { legacyRoot: true }, ); expect(screen.getByText('Hey! :smile: :)')).toBeInTheDocument(); diff --git a/packages/gazzodown/src/elements/Timestamp/ErrorBoundary.tsx b/packages/gazzodown/src/elements/Timestamp/ErrorBoundary.tsx index 453853275f8a..a659adec2aa7 100644 --- a/packages/gazzodown/src/elements/Timestamp/ErrorBoundary.tsx +++ b/packages/gazzodown/src/elements/Timestamp/ErrorBoundary.tsx @@ -1,7 +1,12 @@ -import React, { Component, ReactNode } from 'react'; +import { Component, ReactNode } from 'react'; -export class ErrorBoundary extends Component<{ fallback: React.ReactNode }, { hasError: boolean }> { - constructor(props: { fallback: React.ReactNode }) { +interface ErrorBoundaryProps { + fallback: ReactNode; + children: ReactNode; +} + +export class ErrorBoundary extends Component { + constructor(props: ErrorBoundaryProps) { super(props); this.state = { hasError: false }; } diff --git a/packages/gazzodown/tsconfig.build.json b/packages/gazzodown/tsconfig.build.json new file mode 100644 index 000000000000..9bab40e0b3d8 --- /dev/null +++ b/packages/gazzodown/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["./src/**/*"], + "exclude": ["./src/**/*.spec.ts", "./src/**/*.spec.tsx"] +} diff --git a/packages/gazzodown/tsconfig.json b/packages/gazzodown/tsconfig.json index e2be47cf5499..a144b6f02aa0 100644 --- a/packages/gazzodown/tsconfig.json +++ b/packages/gazzodown/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "../../tsconfig.base.client.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["./src/**/*"] + "extends": "../../tsconfig.base.client.json" } diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index 0b2df52c6042..8c46d5736706 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,5 +1,49 @@ # @rocket.chat/i18n +## 0.6.0 + +### Minor Changes + +- ([#32792](https://github.com/RocketChat/Rocket.Chat/pull/32792)) Allows admins to customize the `Subject` field of Omnichannel email transcripts via setting. By passing a value to the setting `Custom email subject for transcript`, system will use it as the `Subject` field, unless a custom subject is passed when requesting a transcript. If there's no custom subject and setting value is empty, the current default value will be used + +- ([#32517](https://github.com/RocketChat/Rocket.Chat/pull/32517)) Feature Preview: New Navigation - `Header` and `Contextualbar` size improvements consistent with the new global `NavBar` + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. +- ([#32744](https://github.com/RocketChat/Rocket.Chat/pull/32744)) Added account setting `Accounts_Default_User_Preferences_sidebarSectionsOrder` to allow users to reorganize sidebar sections + +### Patch Changes + +- ([#32788](https://github.com/RocketChat/Rocket.Chat/pull/32788)) Fixed wrong wording on a federation setting + +- ([#32024](https://github.com/RocketChat/Rocket.Chat/pull/32024)) Implemented a new tab to the users page called 'Active', this tab lists all users who have logged in for the first time and are active. + +## 0.6.0-rc.0 + +### Minor Changes + +- ([#32792](https://github.com/RocketChat/Rocket.Chat/pull/32792)) Allows admins to customize the `Subject` field of Omnichannel email transcripts via setting. By passing a value to the setting `Custom email subject for transcript`, system will use it as the `Subject` field, unless a custom subject is passed when requesting a transcript. If there's no custom subject and setting value is empty, the current default value will be used + +- ([#32517](https://github.com/RocketChat/Rocket.Chat/pull/32517)) Feature Preview: New Navigation - `Header` and `Contextualbar` size improvements consistent with the new global `NavBar` + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. +- ([#32744](https://github.com/RocketChat/Rocket.Chat/pull/32744)) Added account setting `Accounts_Default_User_Preferences_sidebarSectionsOrder` to allow users to reorganize sidebar sections + +### Patch Changes + +- ([#32788](https://github.com/RocketChat/Rocket.Chat/pull/32788)) Fixed wrong wording on a federation setting + +- ([#32024](https://github.com/RocketChat/Rocket.Chat/pull/32024)) Implemented a new tab to the users page called 'Active', this tab lists all users who have logged in for the first time and are active. + ## 0.5.0 ### Minor Changes diff --git a/packages/i18n/babel.config.cjs b/packages/i18n/babel.config.cjs deleted file mode 100644 index ab413e04e571..000000000000 --- a/packages/i18n/babel.config.cjs +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [['@babel/preset-env', { bugfixes: true }]], -}; diff --git a/packages/i18n/jest.config.mjs b/packages/i18n/jest.config.mjs deleted file mode 100644 index ab3eeabeabfb..000000000000 --- a/packages/i18n/jest.config.mjs +++ /dev/null @@ -1,6 +0,0 @@ -export default { - testEnvironment: 'node', - transform: {}, - moduleFileExtensions: ['js', 'mjs'], - testMatch: ['**/?(*.)+(spec|test).(m)js'], -}; diff --git a/packages/i18n/jest.config.ts b/packages/i18n/jest.config.ts new file mode 100644 index 000000000000..eb3d5fd797e5 --- /dev/null +++ b/packages/i18n/jest.config.ts @@ -0,0 +1,9 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + +export default { + preset: server.preset, + testMatch: ['/src/**/*.spec.(ts|js|mjs)'], + transformIgnorePatterns: ['/node_modules/@babel', '/node_modules/@jest', 'signal-exit'], + collectCoverage: false, +} satisfies Config; diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 91b74ef36cfa..6927aae08d1c 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,14 +1,11 @@ { "name": "@rocket.chat/i18n", - "version": "0.5.0", + "version": "0.6.0", "private": true, "devDependencies": { - "@babel/core": "~7.22.20", - "@babel/preset-env": "~7.22.20", - "babel-jest": "^29.5.0", + "@rocket.chat/jest-presets": "workspace:~", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", "tsup": "^6.7.0", "typescript": "~5.3.3" }, @@ -16,7 +13,8 @@ "build": "node ./src/index.mjs", "lint": "eslint --ext .mjs,.js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .mjs,.js,.jsx,.ts,.tsx . --fix", - "test": "NODE_OPTIONS=--experimental-vm-modules jest" + "test": "jest", + "testunit": "jest" }, "main": "./dist/index.js", "module": "./dist/index.mjs", diff --git a/packages/i18n/src/index.spec.mjs b/packages/i18n/src/index.spec.mjs index 5941bf8fa579..b3efdaa10175 100644 --- a/packages/i18n/src/index.spec.mjs +++ b/packages/i18n/src/index.spec.mjs @@ -9,6 +9,8 @@ describe('i18n', () => { jest.spyOn(fs, 'readdirSync').mockReturnValue(['en.i18n.json']); jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); jest.spyOn(fs, 'readFileSync').mockImplementation(() => JSON.stringify({})); + jest.spyOn(fs, 'existsSync').mockReturnValue(true); + jest.spyOn(fs, 'rmdirSync').mockImplementation(() => {}); }); afterEach(() => { diff --git a/packages/i18n/src/locales/af.i18n.json b/packages/i18n/src/locales/af.i18n.json index 0dc39dbae650..40ab367489b6 100644 --- a/packages/i18n/src/locales/af.i18n.json +++ b/packages/i18n/src/locales/af.i18n.json @@ -2060,12 +2060,19 @@ "Retail": "Kleinhandel", "Retention_setting_changed_successfully": "Behoudingsbeleidinstelling is suksesvol verander", "RetentionPolicy": "Retensiebeleid", + "RetentionPolicy_AppliesToChannels": "Van toepassing op kanale", + "RetentionPolicy_AppliesToDMs": "Van toepassing op direkte boodskappe", + "RetentionPolicy_AppliesToGroups": "Van toepassing op privaat groepe", "RetentionPolicy_Description": "Snoei ou boodskappe outomaties oor jou Rocket.Chat-voorbeeld.", "RetentionPolicy_Enabled": "enabled", "RetentionPolicy_ExcludePinned": "Sluit uitgespelde boodskappe uit", "RetentionPolicy_FilesOnly": "Net verwyder lÃĒers", "RetentionPolicy_FilesOnly_Description": "Slegs lÃĒers sal uitgevee word, die boodskappe self sal in plek bly.", "RetentionPolicy_MaxAge": "Maksimum boodskap ouderdom", + "RetentionPolicy_MaxAge_Channels": "Maksimum boodskap ouderdom in kanale", + "RetentionPolicy_MaxAge_Description": "Snoei alle boodskappe ouer as hierdie waarde, in dae", + "RetentionPolicy_MaxAge_DMs": "Maksimum boodskap ouderdom in direkte boodskappe", + "RetentionPolicy_MaxAge_Groups": "Maksimum boodskap ouderdom in privaat groepe", "RetentionPolicy_Precision": "Timer Precision", "RetentionPolicy_Precision_Description": "Hoe gereeld moet die snoei-timer hardloop. Om dit tot 'n meer presiese waarde te stel, maak kanale met vinnige retentietydperke beter, maar kan ekstra verwerkingskrag op groot gemeenskappe kos.", "RetentionPolicyRoom_Enabled": "Snoei ou boodskappe outomaties", @@ -2758,4 +2765,4 @@ "registration.component.form.sendConfirmationEmail": "Stuur bevestiging e-pos", "Enterprise": "onderneming", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ar.i18n.json b/packages/i18n/src/locales/ar.i18n.json index 72c53f59612b..d3a86879f716 100644 --- a/packages/i18n/src/locales/ar.i18n.json +++ b/packages/i18n/src/locales/ar.i18n.json @@ -232,6 +232,7 @@ "Accounts_ShowFormLogin": "ØšØąØļ Ų†Ų…ŲˆØ°ØŦ ØĒØŗØŦŲŠŲ„ اŲ„د؎ŲˆŲ„ اŲ„اŲØĒØąØ§ØļŲŠ", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled": "ØĒŲ…ŲƒŲŠŲ† اŲ„Ų…ØĩادŲ‚ØŠ اŲ„ØĢŲ†Ø§ØĻŲŠØŠ ØšØ¨Øą TOTP", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled_Description": "ŲŠŲ…ŲƒŲ† Ų„Ų„Ų…ØŗØĒ؎دŲ…ŲŠŲ† ØĨؚداد اŲ„Ų…ØĩادŲ‚ØŠ اŲ„ØĢŲ†Ø§ØĻŲŠØŠ باØŗØĒ؎داŲ… ØŖŲŠ ØĒØˇØ¨ŲŠŲ‚ TOTP، Ų…ØĢŲ„ Google Authenticator ØŖŲˆ Authy.", + "Calls_in_queue_many": "{{count}} Ų…Ų† اŲ„Ų…ŲƒØ§Ų„Ų…اØĒ اŲ„اŲ†ØĒØ¸Ø§Øą", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "اŲ„ا؎ØĒŲŠØ§Øą اŲ„ØĒŲ„Ų‚اØĻŲŠ Ų„دŲ‰ اŲ„Ų…ØŗØĒ؎دŲ…ŲŠŲ† اŲ„ØŦدد Ų„Ų„Ų…ØĩادŲ‚ØŠ اŲ„ØĢŲ†Ø§ØĻŲŠØŠ ØšØ¨Øą اŲ„Ø¨ØąŲŠØ¯ اŲ„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "ØŗŲŠØĒŲ… ØĒŲ…ŲƒŲŠŲ† اŲ„Ų…ØĩادŲ‚ØŠ اŲ„ØĢŲ†Ø§ØĻŲŠØŠ Ų„دŲ‰ اŲ„Ų…ØŗØĒ؎دŲ…ŲŠŲ† اŲ„ØŦدد ØšØ¨Øą اŲ„Ø¨ØąŲŠØ¯ اŲ„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ اŲØĒØąØ§ØļŲŠŲ‹Ø§. ŲˆØŗŲŠØĒŲ…ŲƒŲ†ŲˆŲ† Ų…Ų† ØĒØšØˇŲŠŲ„Ų‡Ø§ ŲŲŠ ØĩŲØ­ØŠ Ų…Ų„ŲŲ‡Ų… اŲ„Ø´ØŽØĩŲŠ.", "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "اŲ„ŲˆŲ‚ØĒ اŲ„Ų…حدد Ų„اŲ†ØĒŲ‡Ø§ØĄ ØĩŲ„احŲŠØŠ اŲ„ØąŲ…Ø˛ اŲ„Ų…ØąØŗŲ„ ØšØ¨Øą اŲ„Ø¨ØąŲŠØ¯ اŲ„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ باŲ„ØĢŲˆØ§Ų†ŲŠ", @@ -250,6 +251,7 @@ "API_EmbedDisabledFor": "ØĒØšØˇŲŠŲ„ اŲ„ØĒØļŲ…ŲŠŲ† Ų„Ų„Ų…ØŗØĒ؎دŲ…ŲŠŲ†", "Accounts_UserAddedEmail_Default": "

    Ų…ØąØ­Ø¨Ų‹Ø§ بŲƒŲ… ŲŲŠ [Site_Name]

    اŲ†ØĒŲ‚Ų„ ØĨŲ„Ų‰ [Site_URL] ŲˆØŦØąØ¨ ØŖŲØļŲ„ Ø­Ų„ Ų„Ų„Ø¯ØąØ¯Ø´ØŠ Ų…ŲØĒŲˆØ­ØŠ اŲ„Ų…ØĩØ¯Øą Ų…ØĒاح اŲ„ŲŠŲˆŲ…!

    ŲŠŲ…ŲƒŲ†Ųƒ ØĒØŗØŦŲŠŲ„ اŲ„د؎ŲˆŲ„ باØŗØĒ؎داŲ… Ø¨ØąŲŠØ¯Ųƒ اŲ„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ: [email] ŲˆŲƒŲ„Ų…ØŠ اŲ„Ų…ØąŲˆØą: [password]. Ų‚د ŲŠŲØˇŲ„ب Ų…Ų†Ųƒ ØĒØēŲŠŲŠØąŲ‡Ø§ بؚد ØĒØŗØŦŲŠŲ„ اŲ„د؎ŲˆŲ„ ŲŲŠ اŲ„Ų…ØąØŠ اŲ„ØŖŲˆŲ„Ų‰.", "Accounts_UserAddedEmail_Description": "ŲŠŲ…ŲƒŲ†Ųƒ اØŗØĒ؎داŲ… اŲ„ØšŲ†Ø§ØĩØą اŲ„Ų†Ø§ØĻب؊ اŲ„ØĒاŲ„ŲŠØŠ: \n - [name]، [fname]، [lname] Ų„اØŗŲ… اŲ„Ų…ØŗØĒ؎دŲ… اŲ„ŲƒØ§Ų…Ų„ ØŖŲˆ اŲ„اØŗŲ… اŲ„ØŖŲˆŲ„ ØŖŲˆ اØŗŲ… اŲ„ؚاØĻŲ„ØŠØŒ ØšŲ„Ų‰ اŲ„ØĒŲˆØ§Ų„ŲŠ. \n - `[email]` Ų„Ų„Ø¨ØąŲŠØ¯ اŲ„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ Ų„Ų„Ų…ØŗØĒ؎دŲ…. \n - `[password]` Ų„ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą اŲ„Ų…ØŗØĒ؎دŲ…. \n - `[Site_Name]` Ųˆ[Site_URL] Ų„اØŗŲ… اŲ„ØĒØˇØ¨ŲŠŲ‚ ŲˆØšŲ†ŲˆØ§Ų† URL اŲ„؎اØĩ بŲ‡ ØšŲ„Ų‰ اŲ„ØĒŲˆØ§Ų„ŲŠ. ", + "Calls_in_queue_few": "{{count}} Ų…Ų† اŲ„Ų…ŲƒØ§Ų„Ų…اØĒ اŲ„اŲ†ØĒØ¸Ø§Øą", "API_EmbedDisabledFor_Description": "Ų‚اØĻŲ…ØŠ ØŖØŗŲ…Ø§ØĄ اŲ„Ų…ØŗØĒ؎دŲ…ŲŠŲ† Ų…ŲØĩŲˆŲ„ØŠ بŲŲˆØ§ØĩŲ„ Ų„ØĒØšØˇŲŠŲ„ Ų…ؚاŲŠŲ†Ø§ØĒ اŲ„ØąØ§Ø¨Øˇ اŲ„Ų…ØļŲ…Ų†.", "Accounts_UserAddedEmailSubject_Default": "Ų„Ų‚د ØĒŲ…ØĒ ØĨØļاŲØĒŲƒ ØĨŲ„Ų‰ [Site_Name]", "Action": "اŲ„ØĨØŦØąØ§ØĄ", @@ -277,7 +279,6 @@ "add-livechat-department-agents_description": "ØĨØ°Ų† Ų„ØĨØļاŲØŠ ŲˆŲƒŲ„Ø§ØĄ Ų„Ų„Ų‚Ų†ŲˆØ§ØĒ Ų…ØĒؚدد؊ اŲ„اØĒØŦاŲ‡Ø§ØĒ ØĨŲ„Ų‰ اŲ„ØŖŲ‚ØŗاŲ…", "add-oauth-service": "ØĨØļاŲØŠ ؎دŲ…ØŠ Oauth", "add-oauth-service_description": "ØĨØ°Ų† Ų„ØĨØļاŲØŠ ؎دŲ…ØŠ Oauth ØŦدŲŠØ¯ØŠ", - "Calls_in_queue_many": "{{count}} Ų…Ų† اŲ„Ų…ŲƒØ§Ų„Ų…اØĒ اŲ„اŲ†ØĒØ¸Ø§Øą", "add-user": "ØĨØļاŲØŠ Ų…ØŗØĒ؎دŲ…", "add-user_description": "ØĨØ°Ų† Ų„ØĨØļاŲØŠ Ų…ØŗØĒ؎دŲ…ŲŠŲ† ØŦدد ØĨŲ„Ų‰ اŲ„؎ادŲ… ØšØ¨Øą شاش؊ اŲ„Ų…ØŗØĒ؎دŲ…ŲŠŲ†", "add-user-to-any-c-room": "ØĨØļاŲØŠ Ų…ØŗØĒ؎دŲ… ØĨŲ„Ų‰ ØŖŲŠ Channel ؚاŲ…ØŠ", @@ -297,7 +298,6 @@ "additional_integrations_Bots": "ØĨذا ŲƒŲ†ØĒ ØĒبحØĢ ØšŲ† ŲƒŲŠŲŲŠØŠ دŲ…ØŦ اŲ„ØąŲˆØ¨ŲˆØĒ اŲ„؎اØĩ بŲƒØŒ ŲŲ„Ų† ØĒØŦد ØŖŲØļŲ„ Ų…Ų† Ų…Ø­ŲˆŲ„ Hubot اŲ„؎اØĩ بŲ†Ø§. https://github.com/RocketChat/hubot-rocketchat", "Admin_disabled_encryption": "Ų„Ų… ŲŠŲ‚ŲˆŲ… اŲ„Ų…ØŗؤŲˆŲ„ Ų„دŲŠŲƒ بØĒŲ…ŲƒŲŠŲ† اŲ„ØĒØ´ŲŲŠØą بŲŠŲ† اŲ„ŲˆØ­Ø¯Ø§ØĒ اŲ„ØˇØąŲŲŠØŠ.", "Admin_Info": "Ų…ØšŲ„ŲˆŲ…اØĒ اŲ„Ų…ØŗؤŲˆŲ„", - "Calls_in_queue_few": "{{count}} Ų…Ų† اŲ„Ų…ŲƒØ§Ų„Ų…اØĒ اŲ„اŲ†ØĒØ¸Ø§Øą", "Administration": "اŲ„ØĨØ¯Ø§ØąØŠ", "Adult_images_are_not_allowed": "ØēŲŠØą Ų…ØŗŲ…ŲˆØ­ باŲ„ØĩŲˆØą اŲ„؎اØĩØŠ باŲ„ŲƒØ¨Ø§Øą", "Aerospace_and_Defense": "اŲ„ŲØļØ§ØĄ ŲˆØ§Ų„دŲØ§Øš", @@ -748,6 +748,7 @@ "CAS_enabled": "ØĒŲ… اŲ„ØĒŲ…ŲƒŲŠŲ†", "CAS_Login_Layout": "ØĒØŽØˇŲŠØˇ ØĒØŗØŦŲŠŲ„ د؎ŲˆŲ„ CAS", "CAS_login_url": "ØšŲ†ŲˆØ§Ų† URL Ų„ØĒØŗØŦŲŠŲ„ اŲ„د؎ŲˆŲ„ ØĨŲ„Ų‰ SSO", + "message_counter_many": "{{count}} ØąØŗاØĻŲ„", "CAS_login_url_Description": "ØšŲ†ŲˆØ§Ų† URL Ų„ØĒØŗØŦŲŠŲ„ اŲ„د؎ŲˆŲ„ اŲ„؎اØĩ ب؎دŲ…ØŠ SSO اŲ„ØŽØ§ØąØŦŲŠØŠØŒ Ų…ØĢŲ„: `https://sso.example.undef/sso/login`", "CAS_popup_height": "Ø§ØąØĒŲØ§Øš اŲ„Ų†Ø§ŲØ°ØŠ اŲ„Ų…Ų†Ø¨ØĢŲ‚ØŠ Ų„ØĒØŗØŦŲŠŲ„ اŲ„د؎ŲˆŲ„", "CAS_popup_width": "ØšØąØļ اŲ„Ų†Ø§ŲØ°ØŠ اŲ„Ų…Ų†Ø¨ØĢŲ‚ØŠ Ų„ØĒØŗØŦŲŠŲ„ اŲ„د؎ŲˆŲ„", @@ -763,6 +764,7 @@ "Categories*": "اŲ„ŲØĻاØĒ*", "CDN_JSCSS_PREFIX": "بادØĻØŠ CDN Ų„Ų€ JS/CSS", "CDN_PREFIX": "بادØĻØŠ CDN", + "meteor_status_reconnect_in_many": "اŲ„Ų…حاŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ ØŽŲ„اŲ„ {{count}} Ų…Ų† اŲ„ØĢŲˆØ§Ų†ŲŠ...", "CDN_PREFIX_ALL": "اØŗØĒ؎دŲ… بادØĻØŠ CDN Ų„ØŦŲ…ŲŠØš اŲ„ØŖØĩŲˆŲ„", "Certificates_and_Keys": "اŲ„Ø´Ų‡Ø§Ø¯Ø§ØĒ ŲˆØ§Ų„Ų…ŲØ§ØĒŲŠØ­", "change-livechat-room-visitor": "ØĒØēŲŠŲŠØą Ø˛ŲˆØ§Øą Livechat Room‎", @@ -831,6 +833,7 @@ "Click_here": "اŲ†Ų‚Øą Ų‡Ų†Ø§", "Click_here_for_more_details_or_contact_sales_for_a_new_license": "اŲ†Ų‚Øą Ų‡Ų†Ø§Ų„Ų…Ø˛ŲŠØ¯ Ų…Ų† اŲ„ØĒŲØ§ØĩŲŠŲ„ ØŖŲˆ اØĒØĩŲ„ بŲ€ {{email}} Ų„Ų„Ø­ØĩŲˆŲ„ ØšŲ„Ų‰ ØĒØąØŽŲŠØĩ ØŦدŲŠØ¯.", "Click_here_for_more_info": "اŲ†Ų‚Øą Ų‡Ų†Ø§ Ų„Ų„Ų…Ø˛ŲŠØ¯ Ų…Ų† اŲ„Ų…ØšŲ„ŲˆŲ…اØĒ", + "message_counter_few": "{{count}} ØąØŗاØĻŲ„", "Click_here_to_clear_the_selection": "اŲ†Ų‚Øą Ų‡Ų†Ø§ Ų„Ų…ØŗØ­ اŲ„ØĒحدŲŠØ¯", "Click_here_to_enter_your_encryption_password": "اŲ†Ų‚Øą Ų‡Ų†Ø§ Ų„ØĨد؎اŲ„ ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą اŲ„ØĒØ´ŲŲŠØą اŲ„؎اØĩØŠ بŲƒ", "Click_here_to_view_and_copy_your_password": "اŲ†Ų‚Øą Ų‡Ų†Ø§ Ų„ØšØąØļ ŲƒŲ„Ų…ØŠ اŲ„Ų…ØąŲˆØą ŲˆŲ†ØŗØŽŲ‡Ø§.", @@ -862,6 +865,7 @@ "Cloud_Invalid_license": "ØĒØąØŽŲŠØĩ ØēŲŠØą ØĩاŲ„Ø­!", "Cloud_Apply_license": "ØĒØˇØ¨ŲŠŲ‚ اŲ„ØĒØąØŽŲŠØĩ", "Cloud_connectivity": "اŲ„اØĒØĩاŲ„ اŲ„ØŗحابŲŠ", + "meteor_status_reconnect_in_few": "اŲ„Ų…حاŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ ØŽŲ„اŲ„ {{count}} Ų…Ų† اŲ„ØĢŲˆØ§Ų†ŲŠ...", "Cloud_address_to_send_registration_to": "اŲ„ØšŲ†ŲˆØ§Ų† اŲ„Ų…Ų‚ØąØą ØĨØąØŗاŲ„ اŲ„Ø¨ØąŲŠØ¯ اŲ„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ Ų„Ų„ØĒØŗØŦŲŠŲ„ اŲ„ØŗحابŲŠ اŲ„؎اØĩ بŲƒ ØĨŲ„ŲŠŲ‡.", "Cloud_click_here": "بؚد Ų†ØŗØŽ اŲ„Ų†Øĩ، اŲ†ØĒŲ‚Ų„ ØĨŲ„Ų‰ [ŲˆØ­Ø¯ØŠ اŲ„ØĒØ­ŲƒŲ… اŲ„ØŗحابŲŠØŠ (اŲ†Ų‚Øą Ų‡Ų†Ø§)] ({{cloudConsoleUrl}}).", "Cloud_console": "ŲˆØ­Ø¯ØŠ اŲ„ØĒØ­ŲƒŲ… اŲ„ØŗحابŲŠØŠ", @@ -942,7 +946,6 @@ "Contact_not_found": "Ų„Ų… ŲŠØĒŲ… اŲ„ØšØĢŲˆØą ØšŲ„Ų‰ ØŦŲ‡ØŠ اŲ„اØĒØĩاŲ„", "Contact_Profile": "اŲ„Ų…Ų„Ų اŲ„Ø´ØŽØĩŲŠ Ų„ØŦŲ‡ØŠ اŲ„اØĒØĩاŲ„", "Contact_Info": "Ų…ØšŲ„ŲˆŲ…اØĒ ØŦŲ‡ØŠ اŲ„اØĒØĩاŲ„", - "message_counter_many": "{{count}} ØąØŗاØĻŲ„", "Content": "اŲ„Ų…Ø­ØĒŲˆŲ‰", "Continue": "Ų…ØĒابؚ؊", "Continuous_sound_notifications_for_new_livechat_room": "ØĨØ´ØšØ§ØąØ§ØĒ ØĩŲˆØĒŲŠØŠ Ų…ØŗØĒŲ…ØąØŠ Ų„ØēØąŲØŠ اŲ„Ų‚Ų†Ø§ØŠ Ų…ØĒؚدد؊ اŲ„اØĒØŦاŲ‡Ø§Ų‡ØĒ اŲ„ØŦدŲŠØ¯ØŠ", @@ -957,7 +960,6 @@ "Conversations": "اŲ„Ų…حادØĢاØĒ", "Conversations_per_day": "اŲ„Ų…حادØĢاØĒ Ų„ŲƒŲ„ ŲŠŲˆŲ…", "Convert": "ØĒØ­ŲˆŲŠŲ„", - "meteor_status_reconnect_in_many": "اŲ„Ų…حاŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ ØŽŲ„اŲ„ {{count}} Ų…Ų† اŲ„ØĢŲˆØ§Ų†ŲŠ...", "Convert_Ascii_Emojis": "ØĒØ­ŲˆŲŠŲ„ ASCII ØĨŲ„Ų‰ ØąŲ…Ø˛ ØĒؚبŲŠØąŲŠ", "Convert_to_channel": "اŲ„ØĒØ­ŲˆŲŠŲ„ ØĨŲ„Ų‰ Channel", "Converting_channel_to_a_team": "ØŖŲ†ØĒ ØĒŲ‚ŲˆŲ… بØĒØ­ŲˆŲŠŲ„ Channel Ų‡Ø°Ų‡ ØĨŲ„Ų‰ ŲØąŲŠŲ‚. ØŗŲŠØĒŲ… اŲ„احØĒŲØ§Ø¸ بØŦŲ…ŲŠØš اŲ„ØŖØšØļØ§ØĄ.", @@ -1033,7 +1035,6 @@ "Country_Denmark": "اŲ„دŲ†Ų…Ø§ØąŲƒ", "Country_Djibouti": "ØŦŲŠØ¨ŲˆØĒŲŠ", "Country_Dominica": "دŲˆŲ…ŲŠŲ†ŲŠŲƒØ§", - "message_counter_few": "{{count}} ØąØŗاØĻŲ„", "Country_Dominican_Republic": "ØŦŲ…Ų‡ŲˆØąŲŠØŠ اŲ„دŲˆŲ…Ų†ŲŠŲƒØ§Ų†", "Country_Ecuador": "اŲ„ØĨŲƒŲˆØ§Ø¯ŲˆØą", "Country_Egypt": "Ų…ØĩØą", @@ -1069,7 +1070,6 @@ "Country_Heard_Island_and_Mcdonald_Islands": "ØŦØ˛ŲŠØąØŠ Ų‡ŲŠØąØ¯ ŲˆØŦØ˛Øą Ų…اŲƒØ¯ŲˆŲ†Ø§Ų„د", "Country_Holy_See_Vatican_City_State": "اŲ„ŲƒØąØŗŲŠ اŲ„ØąØŗŲˆŲ„ŲŠ (دŲˆŲ„ØŠ اŲ„ŲØ§ØĒŲŠŲƒØ§Ų†)", "Country_Honduras": "Ų‡Ų†Ø¯ŲˆØąØ§Øŗ", - "meteor_status_reconnect_in_few": "اŲ„Ų…حاŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ ØŽŲ„اŲ„ {{count}} Ų…Ų† اŲ„ØĢŲˆØ§Ų†ŲŠ...", "Country_Hong_Kong": "Ų‡ŲˆŲ†Øē ŲƒŲˆŲ†Øē", "Country_Hungary": "Ų‡Ų†ØēØ§ØąŲŠØ§", "Country_Iceland": "ØŖŲŠØŗŲ„Ų†Ø¯Ø§", @@ -1353,8 +1353,10 @@ "delete-message_description": "ØĨØ°Ų† Ų„حذŲ ØąØŗاŲ„ØŠ ŲŲŠ ØēØąŲØŠ", "delete-own-message": "حذŲ ØąØŗاŲ„ØŠ Ø´ØŽØĩŲŠØŠ", "delete-own-message_description": "ØĨØ°Ų† Ų„حذŲ ØąØŗاŲ„ØŠ Ø´ØŽØĩŲŠØŠ", + "message_counter_two": "{{count}} ØąØŗاØĻŲ„", "delete-p": "حذŲ Channel اŲ„؎اØĩØŠ", "delete-p_description": "ØĨØ°Ų† Ų„حذŲ اŲ„Ų‚Ų†ŲˆØ§ØĒ اŲ„؎اØĩØŠ", + "message_counter_zero": "{{count}} ØąØŗاØĻŲ„", "delete-user": "حذŲ Ų…ØŗØĒ؎دŲ…", "delete-user_description": "ØĨØ°Ų† Ų„حذŲ اŲ„Ų…ØŗØĒ؎دŲ…ŲŠŲ†", "Deleted": "ØĒŲ… اŲ„حذŲ!", @@ -1379,6 +1381,8 @@ "Details": "اŲ„ØĒŲØ§ØĩŲŠŲ„", "line": "اŲ„ØŗØˇØą", "Device_Management_IP": " ØšŲ†ŲˆØ§Ų† IP", + "meteor_status_reconnect_in_two": "اŲ„Ų…حاŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ ØŽŲ„اŲ„ {{count}} Ų…Ų† اŲ„ØĢŲˆØ§Ų†ŲŠ...", + "meteor_status_reconnect_in_zero": "اŲ„Ų…حاŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ ØŽŲ„اŲ„ {{count}} Ų…Ų† اŲ„ØĢŲˆØ§Ų†ŲŠ...", "Different_Style_For_User_Mentions": "Ų†Ų…Øˇ Ų…ØŽØĒŲ„Ų Ų„ØĨØ´Ø§ØąØ§ØĒ اŲ„Ų…ØŗØĒ؎دŲ…", "Livechat_Facebook_API_Key": "Ų…ŲØĒاح ŲˆØ§ØŦŲ‡ØŠ Ø¨ØąŲ…ØŦØŠ ØĒØˇØ¨ŲŠŲ‚اØĒ Channel Ų…ØĒؚدد؊ اŲ„اØĒØŦاŲ‡Ø§ØĒ", "Direct": "Ų…Ø¨Ø§Ø´Øą", @@ -1607,10 +1611,8 @@ "EncryptionKey_Change_Disabled": "Ų„ا ŲŠŲ…ŲƒŲ†Ųƒ ØĒØšŲŠŲŠŲ† ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą Ų„Ų…ŲØĒاح اŲ„ØĒØ´ŲŲŠØą اŲ„؎اØĩ بŲƒ Ų„ØŖŲ† Ų…ŲØĒاحŲƒ اŲ„؎اØĩ ØēŲŠØą Ų…ŲˆØŦŲˆØ¯ ØšŲ„Ų‰ Ų‡Ø°Ø§ اŲ„ØšŲ…ŲŠŲ„. Ų„ØĒØšŲŠŲŠŲ† ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØą ØŦدŲŠØ¯ØŠØŒ ŲŠŲ„Ø˛Ų…Ųƒ ØĒØ­Ų…ŲŠŲ„ Ų…ŲØĒاحŲƒ اŲ„؎اØĩ باØŗØĒ؎داŲ… ŲƒŲ„Ų…ØŠ Ų…ØąŲˆØąŲƒ اŲ„حاŲ„ŲŠØŠ ØŖŲˆ اØŗØĒ؎داŲ… ŲˆŲƒŲŠŲ„ ØŗبŲ‚ ØąŲØš اŲ„Ų…ŲØĒاح Ų„دŲŠŲ‡.", "End": "ØĨŲ†Ų‡Ø§ØĄ", "End_call": "ØĨŲ†Ų‡Ø§ØĄ Ų…ŲƒØ§Ų„Ų…ØŠ", - "message_counter_two": "{{count}} ØąØŗاØĻŲ„", "Expand_view": "ØĒŲˆØŗŲŠØš اŲ„ØšØąØļ", "Explore_marketplace": "اØŗØĒŲƒØ´Ø§Ų اŲ„ØŗŲˆŲ‚", - "message_counter_zero": "{{count}} ØąØŗاØĻŲ„", "Explore_the_marketplace_to_find_awesome_apps": "اØŗØĒŲƒØ´Ų اŲ„ØŗŲˆŲ‚ Ų„Ų„ØšØĢŲˆØą ØšŲ„Ų‰ ØĒØˇØ¨ŲŠŲ‚اØĒ ØąØ§ØĻؚ؊ Ų„Ų€ Rocket.Chat", "Export": "ØĒØĩدŲŠØą", "End_Call": "ØĨŲ†Ų‡Ø§ØĄ Ų…ŲƒØ§Ų„Ų…ØŠ", @@ -1659,9 +1661,7 @@ "error-canned-response-not-found": "Ų„Ų… ŲŠØĒŲ… اŲ„ØšØĢŲˆØą ØšŲ„Ų‰ ØąØ¯ŲˆØ¯ Ų…ØŗØŦŲ„ØŠ", "error-cannot-delete-app-user": "ØēŲŠØą Ų…ØŗŲ…ŲˆØ­ بحذŲ Ų…ØŗØĒ؎دŲ… اŲ„ØĒØˇØ¨ŲŠŲ‚ØŒ Ų‚Ų… بØĨŲ„ØēØ§ØĄ ØĒØĢبŲŠØĒ اŲ„ØĒØˇØ¨ŲŠŲ‚ اŲ„Ų…Ų‚ابŲ„ Ų„ØĨØ˛Ø§Ų„ØĒŲ‡.", "error-cant-invite-for-direct-room": "Ų„ا ŲŠŲ…ŲƒŲ† دؚŲˆØŠ اŲ„Ų…ØŗØĒ؎دŲ… ŲŲŠ اŲ„ØēØąŲØŠ اŲ„Ų…Ø¨Ø§Ø´ØąØŠ", - "meteor_status_reconnect_in_two": "اŲ„Ų…حاŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ ØŽŲ„اŲ„ {{count}} Ų…Ų† اŲ„ØĢŲˆØ§Ų†ŲŠ...", "error-channels-setdefault-is-same": "اŲ„ØĨؚداد اŲ„اŲØĒØąØ§ØļŲŠ Ų„Ų„Ų‚Ų†Ø§ØŠ Ų‡Ųˆ Ų†ŲØŗŲ‡ اŲ„Ø°ŲŠ ØŗŲŠØĒŲ… ØĒØēŲŠŲŠØąŲ‡ ØĨŲ„ŲŠŲ‡.", - "meteor_status_reconnect_in_zero": "اŲ„Ų…حاŲˆŲ„ØŠ Ų…ØąØŠ ØŖØŽØąŲ‰ ØŽŲ„اŲ„ {{count}} Ų…Ų† اŲ„ØĢŲˆØ§Ų†ŲŠ...", "error-channels-setdefault-missing-default-param": "ŲŠŲ„Ø˛Ų… ØĒŲˆŲŲŠØą bodyParam \"اŲ„اŲØĒØąØ§ØļŲŠØŠ\"", "error-could-not-change-email": "ØĒØšØ°Øą ØĒØēŲŠŲŠØą اŲ„Ø¨ØąŲŠØ¯ اŲ„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠ", "error-could-not-change-name": "ØĒØšØ°Øą ØĒØēŲŠŲŠØą اŲ„اØŗŲ…", @@ -3546,6 +3546,9 @@ "RetentionPolicy_Advanced_Precision": "اØŗØĒ؎داŲ… ØĒŲƒŲˆŲŠŲ† Ų†Ų‡ØŦ اŲ„اØŗØĒبŲ‚Ø§ØĄ اŲ„Ų…ØĒŲ‚دŲ…", "RetentionPolicy_Advanced_Precision_Cron": "اØŗØĒ؎داŲ… Cron Ų„Ų†Ų‡ØŦ اŲ„اØŗØĒبŲ‚Ø§ØĄ اŲ„Ų…ØĒŲ‚دŲ…", "RetentionPolicy_Advanced_Precision_Cron_Description": "ؚدد اŲ„Ų…ØąØ§ØĒ اŲ„ØĒŲŠ ŲŠØŦب ŲŲŠŲ‡Ø§ ØĒØ´ØēŲŠŲ„ Ų…ؤŲ‚ØĒ اŲ„ØĒŲ†Ų‚ŲŠØ­ اŲ„Ų…حدد بŲˆØ§ØŗØˇØŠ ØĒؚبŲŠØą ŲˆØ¸ŲŠŲØŠ cron. ŲŠØ¤Ø¯ŲŠ ØĒØšŲŠŲŠŲ† Ų‡Ø°Ø§ ØĨŲ„Ų‰ Ų‚ŲŠŲ…ØŠ ØŖŲƒØĢØą دŲ‚ØŠ ØĨŲ„Ų‰ ØŦØšŲ„ اŲ„Ų‚Ų†ŲˆØ§ØĒ ذاØĒ Ų…ؤŲ‚ØĒاØĒ اŲ„اØŗØĒبŲ‚Ø§ØĄ اŲ„ØŗØąŲŠØšØŠ ØĒØšŲ…Ų„ بشŲƒŲ„ ØŖŲØļŲ„ØŒ ŲˆŲ„ŲƒŲ†Ų‡Ø§ Ų‚د ØĒŲƒŲ„Ų Ų‚ŲˆØŠ Ų…ؚاŲ„ØŦØŠ ØĨØļاŲŲŠØŠ ØšŲ„Ų‰ اŲ„Ų…ØŦØĒŲ…ؚاØĒ اŲ„ŲƒØ¨ŲŠØąØŠ.", + "RetentionPolicy_AppliesToChannels": "ŲŠŲ†ØˇØ¨Ų‚ ØšŲ„Ų‰ اŲ„Ų‚Ų†ŲˆØ§ØĒ", + "RetentionPolicy_AppliesToDMs": "ŲŠŲ†ØˇØ¨Ų‚ ØšŲ„Ų‰ اŲ„ØąØŗاØĻŲ„ اŲ„Ų…Ø¨Ø§Ø´ØąØŠ", + "RetentionPolicy_AppliesToGroups": "ŲŠŲ†ØˇØ¨Ų‚ ØšŲ„Ų‰ اŲ„Ų…ØŦŲ…ŲˆØšØ§ØĒ اŲ„؎اØĩØŠ", "RetentionPolicy_Description": "ŲŠŲ‚ŲˆŲ… ØĒŲ„Ų‚اØĻŲŠŲ‹Ø§ بØĒŲ†Ų‚ŲŠØ­ اŲ„ØąØŗاØĻŲ„ اŲ„Ų‚دŲŠŲ…ØŠ ØšØ¨Øą Ų…ØĢŲŠŲ„ Rocket.Chat اŲ„؎اØĩ بŲƒ.", "RetentionPolicy_DoNotPruneDiscussion": "Ų„ا ØĒŲ‚Ų… بØĒŲ†Ų‚ŲŠØ­ ØąØŗاØĻŲ„ اŲ„Ų…Ų†Ø§Ų‚ش؊", "RetentionPolicy_DoNotPrunePinned": "Ų„ا ØĒŲ‚Ų… بØĒŲ†Ų‚ŲŠØ­ اŲ„ØąØŗاØĻŲ„ اŲ„Ų…ØĢبØĒØŠ", @@ -3555,6 +3558,10 @@ "RetentionPolicy_FilesOnly": "حذŲ اŲ„Ų…Ų„ŲØ§ØĒ ŲŲ‚Øˇ", "RetentionPolicy_FilesOnly_Description": "ØŗŲŠØĒŲ… حذŲ اŲ„Ų…Ų„ŲØ§ØĒ ŲŲ‚ØˇØŒ ŲˆØŗØĒظŲ„ اŲ„ØąØŗاØĻŲ„ Ų†ŲØŗŲ‡Ø§ ŲŲŠ Ų…ŲƒØ§Ų†Ų‡Ø§.", "RetentionPolicy_MaxAge": "اŲ„حد اŲ„ØŖŲ‚ØĩŲ‰ Ų„ØšŲ…Øą اŲ„ØąØŗاØĻŲ„", + "RetentionPolicy_MaxAge_Channels": "اŲ„حد اŲ„ØŖŲ‚ØĩŲ‰ Ų„ØšŲ…Øą اŲ„ØąØŗاØĻŲ„ ŲŲŠ اŲ„Ų‚Ų†ŲˆØ§ØĒ", + "RetentionPolicy_MaxAge_Description": "ØĒŲ†Ų‚ŲŠØ­ ŲƒŲ„ اŲ„ØąØŗاØĻŲ„ اŲ„ØŖŲ‚دŲ… Ų…Ų† Ų‡Ø°Ų‡ اŲ„Ų‚ŲŠŲ…ØŠØŒ باŲ„ØŖŲŠØ§Ų…", + "RetentionPolicy_MaxAge_DMs": "اŲ„حد اŲ„ØŖŲ‚ØĩŲ‰ Ų„ØšŲ…Øą اŲ„ØąØŗاØĻŲ„ ŲŲŠ اŲ„ØąØŗاØĻŲ„ اŲ„Ų…Ø¨Ø§Ø´ØąØŠ", + "RetentionPolicy_MaxAge_Groups": "اŲ„حد اŲ„ØŖŲ‚ØĩŲ‰ Ų„ØšŲ…Øą اŲ„ØąØŗاØĻŲ„ ŲŲŠ اŲ„Ų…ØŦŲ…ŲˆØšØ§ØĒ اŲ„؎اØĩØŠ", "RetentionPolicy_Precision": "دŲ‚ØŠ اŲ„Ų…ؤŲ‚ØĒ", "RetentionPolicy_Precision_Description": "ؚدد اŲ„Ų…ØąØ§ØĒ اŲ„ØĒŲŠ ŲŠØŦب ŲŲŠŲ‡Ø§ ØĒØ´ØēŲŠŲ„ Ų…ؤŲ‚ØĒ اŲ„ØĒŲ†Ų‚ŲŠØ­. ŲŠØ¤Ø¯ŲŠ ØĒØšŲŠŲŠŲ† Ų‡Ø°Ø§ ØĨŲ„Ų‰ Ų‚ŲŠŲ…ØŠ ØŖŲƒØĢØą دŲ‚ØŠ ØĨŲ„Ų‰ ØŦØšŲ„ اŲ„Ų‚Ų†ŲˆØ§ØĒ ذاØĒ Ų…ؤŲ‚ØĒاØĒ اŲ„اØŗØĒبŲ‚Ø§ØĄ اŲ„ØŗØąŲŠØšØŠ ØĒØšŲ…Ų„ بشŲƒŲ„ ØŖŲØļŲ„ØŒ ŲˆŲ„ŲƒŲ†Ų‡Ø§ Ų‚د ØĒŲƒŲ„Ų Ų‚ŲˆØŠ Ų…ؚاŲ„ØŦØŠ ØĨØļاŲŲŠØŠ ØšŲ„Ų‰ اŲ„Ų…ØŦØĒŲ…ؚاØĒ اŲ„ŲƒØ¨ŲŠØąØŠ.", "RetentionPolicyRoom_Enabled": "ØĒŲ†Ų‚ŲŠØ­ اŲ„ØąØŗاØĻŲ„ اŲ„Ų‚دŲŠŲ…ØŠ ØĒŲ„Ų‚اØĻŲŠŲ‹Ø§", @@ -4885,4 +4892,4 @@ "Enterprise": "Ų…ؤØŗØŗØŠ", "UpgradeToGetMore_engagement-dashboard_Title": "اŲ„ØĒØ­Ų„ŲŠŲ„اØĒ", "UpgradeToGetMore_auditing_Title": "ØĒدŲ‚ŲŠŲ‚ اŲ„ØąØŗاØĻŲ„" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/az.i18n.json b/packages/i18n/src/locales/az.i18n.json index 93d83cd373a8..118be4b37920 100644 --- a/packages/i18n/src/locales/az.i18n.json +++ b/packages/i18n/src/locales/az.i18n.json @@ -2060,12 +2060,19 @@ "Retail": "Pərakəndə", "Retention_setting_changed_successfully": "Saxlama siyasəti parametrləri uğurla dəyişdirildi", "RetentionPolicy": "Saklama siyasəti", + "RetentionPolicy_AppliesToChannels": "Kanallara tətbiq edilir", + "RetentionPolicy_AppliesToDMs": "Birbaşa mesajlar ÃŧçÃŧn tətbiq edilir", + "RetentionPolicy_AppliesToGroups": "Şəxsi qruplara tətbiq edilir", "RetentionPolicy_Description": "Sizin Rocket.Chat nizamÄąnda avtomatik olaraq kÃļhnə mesajlarÄą kəsdirir.", "RetentionPolicy_Enabled": "Etkin", "RetentionPolicy_ExcludePinned": "Səslənən mesajlarÄą həddindən kənarlaşdÄąrÄąn", "RetentionPolicy_FilesOnly": "YalnÄąz fayllarÄą silin", "RetentionPolicy_FilesOnly_Description": "YalnÄąz fayllar silinəcək, mesajlar Ãļzləri yerində qalacaqlar.", "RetentionPolicy_MaxAge": "Maksimum mesaj yaÅŸÄą", + "RetentionPolicy_MaxAge_Channels": "Kanallarda maksimum mesaj yaÅŸÄą", + "RetentionPolicy_MaxAge_Description": "Bu dəyərdən daha eski olan bÃŧtÃŧn mesajlarÄą bir neçə gÃŧndə kəsin", + "RetentionPolicy_MaxAge_DMs": "Birbaşa mesajlarda maksimum mesaj yaÅŸÄą", + "RetentionPolicy_MaxAge_Groups": "Şəxsi qruplarda maksimum mesaj yaÅŸÄą", "RetentionPolicy_Precision": "Timer dəqiqliyi", "RetentionPolicy_Precision_Description": "Hədəf çəkicinin necə tez-tez istifadə etməsi lazÄąmdÄąr. Bunu daha dəqiq bir dəyərə təyin etmək, sÃŧrətli saxlama sayğaclarÄą olan kanallarÄą daha yaxÅŸÄą işlədir, lakin bÃļyÃŧk icmalarda əlavə işləmə gÃŧcÃŧnə səbəb ola bilər.", "RetentionPolicyRoom_Enabled": "Avtomatik olaraq kÃļhnə mesajlar budayÄąn", @@ -2758,4 +2765,4 @@ "registration.component.form.sendConfirmationEmail": "Təsdiq e-poçt gÃļndər", "Enterprise": "MÃŧəssisə", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/be-BY.i18n.json b/packages/i18n/src/locales/be-BY.i18n.json index 829759366886..858688468755 100644 --- a/packages/i18n/src/locales/be-BY.i18n.json +++ b/packages/i18n/src/locales/be-BY.i18n.json @@ -2077,12 +2077,19 @@ "Retail": "Ņ€ĐžĐˇĐŊŅ–Ņ‡ĐŊŅ‹", "Retention_setting_changed_successfully": "НаŅŅ‚Ņ€ĐžĐšĐēĐ° ĐŋĐ°ĐģŅ–Ņ‚Ņ‹ĐēŅ– ŅžŅ‚Ņ€Ņ‹ĐŧĐ°ĐŊĐŊŅ ĐŋĐ°ŅĐŋŅŅ…Ова СĐŧĐĩĐŊĐĩĐŊŅ‹", "RetentionPolicy": "ĐŋĐ°ĐģŅ–Ņ‚Ņ‹ĐēĐ° ŅžŅ‚Ņ€Ņ‹ĐŧĐ°ĐŊĐŊŅ", + "RetentionPolicy_AppliesToChannels": "ĐĄŅ‚авŅ–Ņ†Ņ†Đ° Đ´Đ° ĐēĐ°ĐŊĐ°ĐģĐ°Ņ…", + "RetentionPolicy_AppliesToDMs": "ЎĐļŅ‹Đ˛Đ°ĐĩŅ†Ņ†Đ° Đ´ĐģŅ ĐŊĐ°ĐēŅ–Ņ€Đ°Đ˛Đ°ĐŊĐŊŅ ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅŅž", + "RetentionPolicy_AppliesToGroups": "ĐĄŅ‚авŅ–Ņ†Ņ†Đ° Đ´Đ° ĐŋŅ€Ņ‹Đ˛Đ°Ņ‚ĐŊŅ‹Ņ… ĐŗŅ€ŅƒĐŋĐ°Đŧ", "RetentionPolicy_Description": "АŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊĐ° Đ°Ņ‡Ņ‹ŅˆŅ‡Đ°Đĩ ŅŅ‚Đ°Ņ€Ņ‹Ņ ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ– ĐŋŅ€Đ°Đˇ ваŅˆ Rocket.Chat Đ°ŅĐžĐąĐŊŅ–Đē.", "RetentionPolicy_Enabled": "ĐŖĐēĐģŅŽŅ‡Đ°ĐŊĐ°", "RetentionPolicy_ExcludePinned": "ВŅ‹ĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ŅžŅĐēĐģĐ°Đ´Đ°ĐģŅ– ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ", "RetentionPolicy_FilesOnly": "ĐĸĐžĐģŅŒĐēŅ– вŅ‹Đ´Đ°ĐģŅŅ†ŅŒ Ņ„Đ°ĐšĐģŅ‹", "RetentionPolicy_FilesOnly_Description": "ĐĸĐžĐģŅŒĐēŅ– Ņ„Đ°ĐšĐģŅ‹ ĐąŅƒĐ´ŅƒŅ†ŅŒ вŅ‹Đ´Đ°ĐģĐĩĐŊŅ‹Ņ, ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ– ĐąŅƒĐ´ŅƒŅ†ŅŒ ŅĐ°ĐŧŅ– СаŅŅ‚Đ°ŅŽŅ†Ņ†Đ° ĐŊĐ° ĐŧĐĩŅŅ†Ņ‹.", "RetentionPolicy_MaxAge": "МаĐēŅŅ–ĐŧĐ°ĐģŅŒĐŊŅ‹ ŅžĐˇŅ€ĐžŅŅ‚ ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ", + "RetentionPolicy_MaxAge_Channels": "МаĐēŅŅ–ĐŧĐ°ĐģŅŒĐŊŅ‹ ŅžĐˇŅ€ĐžŅŅ‚ ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ– Ņž ĐēĐ°ĐŊĐ°ĐģĐ°Ņ…", + "RetentionPolicy_MaxAge_Description": "ВŅ‹Đ´Đ°ĐģŅŅ†ŅŒ ŅžŅĐĩ ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ– ŅŅ‚Đ°Ņ€ŅĐš, Ņ‡Ņ‹Đŧ ĐŗŅŅ‚Đ° СĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ, Ņƒ Đ´ĐŊŅŅ…", + "RetentionPolicy_MaxAge_DMs": "МаĐēŅŅ–ĐŧĐ°ĐģŅŒĐŊŅ‹ ŅžĐˇŅ€ĐžŅŅ‚ ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ– Ņž ĐŋŅ€Đ°ĐŧŅ‹Ņ… ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅŅž", + "RetentionPolicy_MaxAge_Groups": "МаĐēŅŅ–ĐŧĐ°ĐģŅŒĐŊŅ‹ ŅžĐˇŅ€ĐžŅŅ‚ ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ– Ņž ĐŋŅ€Ņ‹Đ˛Đ°Ņ‚ĐŊŅ‹Ņ… ĐŗŅ€ŅƒĐŋĐ°Ņ…", "RetentionPolicy_Precision": "Ņ‚Đ°ĐšĐŧĐĩŅ€ Precision", "RetentionPolicy_Precision_Description": "Đ¯Đē Ņ‡Đ°ŅŅ‚Đ° Ņ‚Đ°ĐšĐŧĐĩŅ€ Ņ‡Đ°Ņ€ĐŊĐ°ŅĐģŅ–Ņž ĐŋавŅ–ĐŊĐĩĐŊ ĐŋŅ€Đ°Ņ†Đ°Đ˛Đ°Ņ†ŅŒ. ЎŅŅ‚Đ°ĐŊĐžŅžĐēĐ° ĐŗŅŅ‚Đ°ĐŗĐ° йОĐģŅŒŅˆ Đ´Đ°ĐēĐģĐ°Đ´ĐŊĐ°ĐŗĐ° СĐŊĐ°Ņ‡ŅĐŊĐŊĐĩ Ņ€ĐžĐąŅ–Ņ†ŅŒ ĐēĐ°ĐŊĐ°ĐģŅ‹ С Ņ…ŅƒŅ‚ĐēŅ–ĐŧŅ– Ņ‚Đ°ĐšĐŧĐĩŅ€Đ°ĐŧŅ– СаŅ…ĐžŅžĐ˛Đ°ĐŊĐŊŅ ĐģĐĩĐŋŅˆ ĐŋŅ€Đ°Ņ†Đ°Đ˛Đ°Ņ†ŅŒ, Đ°ĐģĐĩ ĐŧĐžĐŗŅƒŅ†ŅŒ ĐēĐ°ŅˆŅ‚аваŅ†ŅŒ Đ´Đ°Đ´Đ°Ņ‚ĐēОвŅ‹Ņ… вŅ‹ĐģŅ–Ņ‡Đ°ĐģŅŒĐŊŅ‹Ņ… ĐŧĐ°ĐŗŅƒŅ‚ĐŊĐ°ŅŅ†ŅŅž ĐŊĐ° вŅĐģŅ–ĐēŅ–Ņ… ŅŅƒĐŋĐžĐģŅŒĐŊĐ°ŅŅ†ŅŅ….", "RetentionPolicyRoom_Enabled": "АŅžŅ‚Đ°ĐŧĐ°Ņ‚Ņ‹Ņ‡ĐŊĐ° Đ°ĐąŅ€ŅĐˇĐ°Ņ†ŅŒ ŅŅ‚Đ°Ņ€Ņ‹Ņ ĐŋавĐĩĐ´Đ°ĐŧĐģĐĩĐŊĐŊŅ–", @@ -2776,4 +2783,4 @@ "registration.component.form.sendConfirmationEmail": "АдĐŋŅ€Đ°Đ˛Ņ–Ņ†ŅŒ ĐŋĐ° ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐ°Đš ĐŋĐžŅˆŅ†Đĩ ĐŋĐ°Ņ†Đ˛ŅŅ€Đ´ĐļŅĐŊĐŊĐĩ", "Enterprise": "ĐŋŅ€Đ°Đ´ĐŋŅ€Ņ‹ĐĩĐŧŅŅ‚ва", "UpgradeToGetMore_engagement-dashboard_Title": "Đ°ĐŊĐ°ĐģŅ–Ņ‚Ņ‹ĐēĐ°" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/bg.i18n.json b/packages/i18n/src/locales/bg.i18n.json index 3c786eaea50b..ac7c8ddcd000 100644 --- a/packages/i18n/src/locales/bg.i18n.json +++ b/packages/i18n/src/locales/bg.i18n.json @@ -2057,12 +2057,19 @@ "Retail": "На Đ´Ņ€ĐĩĐąĐŊĐž", "Retention_setting_changed_successfully": "НаŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ‚Đ° ĐŊĐ° ĐŋŅ€Đ°Đ˛Đ¸ĐģĐ°Ņ‚Đ° Са СадŅŠŅ€ĐļĐ°ĐŊĐĩ ĐąĐĩ ĐŋŅ€ĐžĐŧĐĩĐŊĐĩĐŊĐ° ŅƒŅĐŋĐĩŅˆĐŊĐž", "RetentionPolicy": "ПŅ€Đ°Đ˛Đ¸ĐģĐ° Са СаĐŋаСваĐŊĐĩ", + "RetentionPolicy_AppliesToChannels": "ПŅ€Đ¸ĐģĐ°ĐŗĐ° ŅĐĩ Са ĐēĐ°ĐŊĐ°Đģи", + "RetentionPolicy_AppliesToDMs": "ПŅ€Đ¸ĐģĐ°ĐŗĐ° ŅĐĩ Са диŅ€ĐĩĐēŅ‚ĐŊи ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅ", + "RetentionPolicy_AppliesToGroups": "ОŅ‚ĐŊĐ°ŅŅ ŅĐĩ Са Ņ‡Đ°ŅŅ‚ĐŊи ĐŗŅ€ŅƒĐŋи", "RetentionPolicy_Description": "АвŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐŊĐž ĐŋОдŅ€ŅĐˇĐ˛Đ° ŅŅ‚Đ°Ņ€Đ¸Ņ‚Đĩ ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅ в иСĐŗĐģĐĩĐ´Đ° Ви Rocket.Chat.", "RetentionPolicy_Enabled": "Enabled", "RetentionPolicy_ExcludePinned": "ИСĐēĐģŅŽŅ‡ĐĩŅ‚Đĩ СаĐēĐ°Ņ‡ĐĩĐŊиŅ‚Đĩ ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅ", "RetentionPolicy_FilesOnly": "ИСŅ‚Ņ€Đ¸Đ˛Đ°ĐšŅ‚Đĩ ŅĐ°ĐŧĐž Ņ„Đ°ĐšĐģОвĐĩ", "RetentionPolicy_FilesOnly_Description": "ĐĄĐ°ĐŧĐž Ņ„Đ°ĐšĐģОвĐĩŅ‚Đĩ Ņ‰Đĩ ĐąŅŠĐ´Đ°Ņ‚ иСŅ‚Ņ€Đ¸Ņ‚и, ŅĐ°ĐŧиŅ‚Đĩ ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅ Ņ‰Đĩ ĐžŅŅ‚Đ°ĐŊĐ°Ņ‚ ĐŊĐ° ĐŧŅŅŅ‚ĐžŅ‚Đž ŅĐ¸.", "RetentionPolicy_MaxAge": "МаĐēŅĐ¸ĐŧĐ°ĐģĐŊĐ° вŅŠĐˇŅ€Đ°ŅŅ‚ ĐŊĐ° ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅŅ‚Đ°", + "RetentionPolicy_MaxAge_Channels": "МаĐēŅĐ¸ĐŧĐ°ĐģĐŊĐ° вŅŠĐˇŅ€Đ°ŅŅ‚ ĐŊĐ° ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅŅ‚Đ° в ĐēĐ°ĐŊĐ°ĐģиŅ‚Đĩ", + "RetentionPolicy_MaxAge_Description": "ПŅ€ĐĩĐŧĐ°Ņ…ваĐŊĐĩ ĐŊĐ° вŅĐ¸Ņ‡Đēи ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅ, ĐŋĐž-ŅŅ‚Đ°Ņ€Đ¸ ĐžŅ‚ Ņ‚аСи ŅŅ‚ОКĐŊĐžŅŅ‚, в Đ´ĐŊи", + "RetentionPolicy_MaxAge_DMs": "МаĐēŅĐ¸ĐŧĐ°ĐģĐŊĐ° вŅŠĐˇŅ€Đ°ŅŅ‚ ĐŊĐ° ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅŅ‚Đ° в диŅ€ĐĩĐēŅ‚ĐŊиŅ‚Đĩ ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅ", + "RetentionPolicy_MaxAge_Groups": "МаĐēŅĐ¸ĐŧĐ°ĐģĐŊĐ° вŅŠĐˇŅ€Đ°ŅŅ‚ ĐŊĐ° ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅŅ‚Đ° в Ņ‡Đ°ŅŅ‚ĐŊи ĐŗŅ€ŅƒĐŋи", "RetentionPolicy_Precision": "ĐĸĐžŅ‡ĐŊĐžŅŅ‚ ĐŊĐ° Ņ‚Đ°ĐšĐŧĐĩŅ€Đ°", "RetentionPolicy_Precision_Description": "КоĐģĐēĐž Ņ‡ĐĩŅŅ‚Đž Ņ‚Ņ€ŅĐąĐ˛Đ° Đ´Đ° ŅĐĩ иСĐŋŅŠĐģĐŊŅĐ˛Đ° Ņ‚Đ°ĐšĐŧĐĩŅ€ŅŠŅ‚ Са ĐŋОдŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ. ЗадаваĐŊĐĩŅ‚Đž ĐŊĐ° Ņ‚Ова Ņ ĐŋĐž-Ņ‚ĐžŅ‡ĐŊĐ° ŅŅ‚ОКĐŊĐžŅŅ‚ ĐŋŅ€Đ°Đ˛Đ¸ ĐēĐ°ĐŊĐ°ĐģиŅ‚Đĩ Ņ ĐąŅŠŅ€ĐˇĐ¸ Ņ‚Đ°ĐšĐŧĐĩŅ€Đ¸ Са СадŅŠŅ€ĐļĐ°ĐŊĐĩ Đ´Đ° Ņ€Đ°ĐąĐžŅ‚ŅŅ‚ ĐŋĐž-дОйŅ€Đĩ, ĐŊĐž ĐŧĐžĐļĐĩ Đ´Đ° ŅŅ‚Ņ€ŅƒĐ˛Đ° Đ´ĐžĐŋŅŠĐģĐŊиŅ‚ĐĩĐģĐŊĐ° ĐŧĐžŅ‰ĐŊĐžŅŅ‚ Са ОйŅ€Đ°ĐąĐžŅ‚ĐēĐ° ĐŊĐ° ĐŗĐžĐģĐĩĐŧи ОйŅ‰ĐŊĐžŅŅ‚и.", "RetentionPolicyRoom_Enabled": "АвŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐŊĐž ĐŋŅ€ĐĩŅ€ŅĐˇĐ˛Đ°ĐŊĐĩ ĐŊĐ° ŅŅ‚Đ°Ņ€Đ¸Ņ‚Đĩ ŅŅŠĐžĐąŅ‰ĐĩĐŊиŅ", @@ -2751,4 +2758,4 @@ "registration.component.form.sendConfirmationEmail": "ИСĐŋŅ€Đ°Ņ‚ĐĩŅ‚Đĩ иĐŧĐĩĐšĐģ Са ĐŋĐžŅ‚вŅŠŅ€ĐļĐ´ĐĩĐŊиĐĩ", "Enterprise": "ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ĐŊиĐĩ", "UpgradeToGetMore_engagement-dashboard_Title": "Đ°ĐŊĐ°ĐģиС" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/bs.i18n.json b/packages/i18n/src/locales/bs.i18n.json index 6ce6a2959e5e..ebe0b045c418 100644 --- a/packages/i18n/src/locales/bs.i18n.json +++ b/packages/i18n/src/locales/bs.i18n.json @@ -2054,12 +2054,19 @@ "Retail": "Maloprodaja", "Retention_setting_changed_successfully": "Postavka pravila zadrÅžavanja uspjeÅĄno je promijenjena", "RetentionPolicy": "Pravila zadrÅžavanja", + "RetentionPolicy_AppliesToChannels": "Odnosi se na kanale", + "RetentionPolicy_AppliesToDMs": "Odnosi se na izravne poruke", + "RetentionPolicy_AppliesToGroups": "Odnosi se na privatne grupe", "RetentionPolicy_Description": "Automatski prunes stare poruke preko vaÅĄeg Rocket.Chat instanca.", "RetentionPolicy_Enabled": "Omogućeno", "RetentionPolicy_ExcludePinned": "Izuzmite prikvačene poruke", "RetentionPolicy_FilesOnly": "Samo izbriÅĄite datoteke", "RetentionPolicy_FilesOnly_Description": "Samo će se datoteke izbrisati, poruke će ostati na mjestu.", "RetentionPolicy_MaxAge": "Maksimalna dob poruka", + "RetentionPolicy_MaxAge_Channels": "Maksimalna dob poruka u kanalima", + "RetentionPolicy_MaxAge_Description": "Prune sve poruke starijima od ove vrijednosti, u danima", + "RetentionPolicy_MaxAge_DMs": "Maksimalna dob poruka u izravnim porukama", + "RetentionPolicy_MaxAge_Groups": "Maksimalna dob poruka u privatnim skupinama", "RetentionPolicy_Precision": "Preciznost mjerača", "RetentionPolicy_Precision_Description": "Koliko često bi trebao trajati mjerač vremena. Postavljanje na precizniju vrijednost čini kanale s brzim retencijskim vremenskim razmacima bolji, ali mogu koÅĄtati dodatnu snagu obrade u velikim zajednicama.", "RetentionPolicyRoom_Enabled": "Automatski obriÅĄite stare poruke", @@ -2748,4 +2755,4 @@ "registration.component.form.sendConfirmationEmail": "PoÅĄalji potvrdni email", "Enterprise": "Poduzeće", "UpgradeToGetMore_engagement-dashboard_Title": "Analitika" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ca.i18n.json b/packages/i18n/src/locales/ca.i18n.json index 9785de70e432..3f74fc967416 100644 --- a/packages/i18n/src/locales/ca.i18n.json +++ b/packages/i18n/src/locales/ca.i18n.json @@ -3484,6 +3484,9 @@ "RetentionPolicy_Advanced_Precision": "Utilitza la configuraciÃŗ avançada de la política de retenciÃŗ", "RetentionPolicy_Advanced_Precision_Cron": "Utilitzeu Cron de política de retenciÃŗ avançada", "RetentionPolicy_Advanced_Precision_Cron_Description": "Amb quina freqÃŧència ha de executar-se el temporitzador de poda definit per l'expressiÃŗ de la feina cron. Establir aixÃ˛ en un valor mÊs precís fa que els canals amb temporitzadors de retenciÃŗ ràpids funcionin millor, perÃ˛ podria costar potència de processament addicional en comunitats grans.", + "RetentionPolicy_AppliesToChannels": "S'aplica als canals", + "RetentionPolicy_AppliesToDMs": "S'aplica als missatges directes", + "RetentionPolicy_AppliesToGroups": "S'aplica a grups privats", "RetentionPolicy_Description": "Elimina automàticament els missatges antics en la instància de Rocket.Chat.", "RetentionPolicy_DoNotPruneDiscussion": "No esborrar els missatges de discussiÃŗ", "RetentionPolicy_DoNotPrunePinned": "No esborrar els missatges fixats", @@ -3493,6 +3496,10 @@ "RetentionPolicy_FilesOnly": "NomÊs elimineu arxius", "RetentionPolicy_FilesOnly_Description": "NomÊs s'eliminaran els arxius, els propis missatges romandran al seu lloc.", "RetentionPolicy_MaxAge": "Antiguitat màxima de l'missatge", + "RetentionPolicy_MaxAge_Channels": "Antiguitat màxima dels missatges en els canals", + "RetentionPolicy_MaxAge_Description": "Elimineu tots els missatges anteriors a aquest valor, en dies", + "RetentionPolicy_MaxAge_DMs": "Antiguitat màxima del missatge en missatges directes", + "RetentionPolicy_MaxAge_Groups": "Antiguitat màxima del missatge en grups privats", "RetentionPolicy_Precision": "PrecisiÃŗ del temporitzador", "RetentionPolicy_Precision_Description": "Amb quina freqÃŧència ha de funcionar el comptador de poda. Establir aixÃ˛ en un valor mÊs precís fa que els canals amb temporitzadors de retenciÃŗ ràpids funcionin millor, perÃ˛ podria costar potència de processament addicional en comunitats grans.", "RetentionPolicyRoom_Enabled": "Esborrar missatges antics automàticament", @@ -4684,4 +4691,4 @@ "Enterprise": "Empresa", "UpgradeToGetMore_engagement-dashboard_Title": "Analítiques", "UpgradeToGetMore_auditing_Title": "Auditoria de missatges" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/cs.i18n.json b/packages/i18n/src/locales/cs.i18n.json index a5a6fb99bbd4..914d6c35d485 100644 --- a/packages/i18n/src/locales/cs.i18n.json +++ b/packages/i18n/src/locales/cs.i18n.json @@ -613,6 +613,7 @@ "CAS_enabled": "Povoleno", "CAS_Login_Layout": "RozloÅžení CAS přihlÃĄÅĄení", "CAS_login_url": "SSO přihlaÅĄovací URL", + "message_counter_many": "{{count}} zprÃĄv(y)", "CAS_login_url_Description": "Adresa přihlÃĄÅĄení vaÅĄÃ­ externí SSO sluÅžby např: https://sso.priklad.cz/sso/login", "CAS_popup_height": "VÃŊÅĄka přihlaÅĄovacího popupu", "CAS_popup_width": "Šířka přihlaÅĄovacího popupu", @@ -627,6 +628,7 @@ "Categories": "Kategorie", "CDN_JSCSS_PREFIX": "Prefix CDN pro JS/CSS", "CDN_PREFIX": "CDN Prefix", + "meteor_status_reconnect_in_many": "zkusím znovu za {{count}} sekund...", "CDN_PREFIX_ALL": "PouÅžijte prefix CDN pro vÅĄechny prvky", "Certificates_and_Keys": "CertifikÃĄty a klíče", "Change_Room_Type": "Změna typu místnosti", @@ -677,6 +679,7 @@ "Click_here": "Klikněte zde", "Click_here_for_more_details_or_contact_sales_for_a_new_license": "Kliknutím sem zobrazíte podrobnosti, případně kontaktujte {{email}} pro novou licenci.", "Click_here_for_more_info": "Klikněte pro více infomací", + "message_counter_few": "{{count}} zprÃĄv(y)", "Click_here_to_enter_your_encryption_password": "Klikněte zde pro zadÃĄní svÊho ÅĄifrovacího hesla", "Click_here_to_view_and_copy_your_password": "Klikněte zde pro zobrazení a zkopírovÃĄní svÊho hesla.", "Click_the_messages_you_would_like_to_send_by_email": "Kikněte na zprÃĄvy, kterÊ chcete odeslat e-mailem", @@ -699,6 +702,7 @@ "Closing_chat": "Uzavření místnosti", "Closing_chat_message": "ZprÃĄva uzavření", "Cloud": "Cloud", + "meteor_status_reconnect_in_few": "zkusím znovu za {{count}} sekund...", "Cloud_address_to_send_registration_to": "Adresa, na kterou chcete poslat svůj registrační e-mail do Cloudu.", "Cloud_click_here": "Po zkopírovÃĄní textu přejděte do cloudovÊ konzole - [Klikněte zde]({{cloudConsoleUrl}})", "Cloud_console": "Cloud přehled", @@ -759,7 +763,6 @@ "Contact": "Kontakt", "Contact_Chat_History": "Historie kontaktu", "Contains_Security_Fixes": "Obsahuje opravy zabezpečení", - "message_counter_many": "{{count}} zprÃĄv(y)", "Content": "Obsah", "Continue": "Pokračovat", "Continuous_sound_notifications_for_new_livechat_room": "TrvalÊ zvukovÊ oznÃĄmení pro novou Omnichannel místnost", @@ -773,7 +776,6 @@ "conversation_with_s": "konverzace s %s", "Conversations": "Konverzace", "Conversations_per_day": "Konverzace za den", - "meteor_status_reconnect_in_many": "zkusím znovu za {{count}} sekund...", "Convert_Ascii_Emojis": "Převod ASCII na Emoji", "Copied": "ZkopírovÃĄno", "Copy": "Kopírovat", @@ -844,7 +846,6 @@ "Country_Denmark": "DÃĄnsko", "Country_Djibouti": "DÅžibutsko", "Country_Dominica": "Dominika", - "message_counter_few": "{{count}} zprÃĄv(y)", "Country_Dominican_Republic": "DominikÃĄnskÃĄ republika", "Country_Ecuador": "EkvÃĄdor", "Country_Egypt": "Egypt", @@ -880,7 +881,6 @@ "Country_Heard_Island_and_Mcdonald_Islands": "Heardův ostrov a McDonaldovy ostrovy", "Country_Holy_See_Vatican_City_State": "SvatÃŊ stolec (VatikÃĄnskÃŊ městskÃŊ stÃĄt)", "Country_Honduras": "Honduras", - "meteor_status_reconnect_in_few": "zkusím znovu za {{count}} sekund...", "Country_Hong_Kong": "Hongkong", "Country_Hungary": "Maďarsko", "Country_Iceland": "Island", @@ -2972,6 +2972,9 @@ "Retail": "Obchod", "Retention_setting_changed_successfully": "Nastavení zÃĄsady uchovÃĄní bylo ÃēspÄ›ÅĄně změněno", "RetentionPolicy": "ZÃĄsady uchovÃĄvÃĄní", + "RetentionPolicy_AppliesToChannels": "Platí pro místnosti", + "RetentionPolicy_AppliesToDMs": "Platí pro přímÊ zprÃĄvy", + "RetentionPolicy_AppliesToGroups": "Platí pro soukromÊ skupiny", "RetentionPolicy_Description": "Automaticky omezí starÊ zprÃĄvy napříč vaÅĄÃ­ Rocket.Chat instancí.", "RetentionPolicy_DoNotPruneDiscussion": "NepročiÅĄÅĨovat zprÃĄvy v diskuzi", "RetentionPolicy_DoNotPrunePinned": "NepročiÅĄÅĨovat připnutÊ zprÃĄvy", @@ -2981,6 +2984,10 @@ "RetentionPolicy_FilesOnly": "Smazat pouze soubory", "RetentionPolicy_FilesOnly_Description": "Pouze soubory budou smazÃĄny, samotnÊ zprÃĄvy zůstanou na místě.", "RetentionPolicy_MaxAge": "MaximÃĄlní stÃĄÅ™Ã­ zprÃĄvy", + "RetentionPolicy_MaxAge_Channels": "MaximÃĄlní stÃĄÅ™Ã­ zprÃĄvy v místnostech", + "RetentionPolicy_MaxAge_Description": "Pročistit vÅĄechny zprÃĄvy starÅĄÃ­, neÅž X dní", + "RetentionPolicy_MaxAge_DMs": "MaximÃĄlní stÃĄÅ™Ã­ zprÃĄvy v přímÃŊch zprÃĄvÃĄch", + "RetentionPolicy_MaxAge_Groups": "MaximÃĄlní stÃĄÅ™Ã­ zprÃĄv v soukromÃŊch skupinÃĄch", "RetentionPolicy_Precision": "Přesnost časovače", "RetentionPolicy_Precision_Description": "Jak často by měl časovač pročiÅĄtění spustit. Nastavením tÊto hodnoty na přesnějÅĄÃ­ hodnotu pracují kanÃĄly s rychlejÅĄÃ­mi retenčními časovači lÊpe, ale v případě velkÃŊch komunit by to mohlo stÃĄt dalÅĄÃ­ procesní vÃŊkon.", "RetentionPolicyRoom_Enabled": "Automaticky pročiÅĄÅĨovat starÊ zprÃĄvy", @@ -3970,4 +3977,4 @@ "Enterprise": "Korporace", "UpgradeToGetMore_engagement-dashboard_Title": "Analytika", "UpgradeToGetMore_auditing_Title": "Audit zprÃĄv" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/cy.i18n.json b/packages/i18n/src/locales/cy.i18n.json index 58749ee5445b..f9c7b4d7ec87 100644 --- a/packages/i18n/src/locales/cy.i18n.json +++ b/packages/i18n/src/locales/cy.i18n.json @@ -2055,12 +2055,19 @@ "Retail": "Manwerthu", "Retention_setting_changed_successfully": "Mae lleoliad polisi cadwraeth wedi newid yn llwyddiannus", "RetentionPolicy": "Polisi Cadw", + "RetentionPolicy_AppliesToChannels": "Yn berthnasol i sianeli", + "RetentionPolicy_AppliesToDMs": "Mae'n berthnasol i negeseuon uniongyrchol", + "RetentionPolicy_AppliesToGroups": "Yn berthnasol i grwpiau preifat", "RetentionPolicy_Description": "Rhowch negeseuon o hen negeseuon yn awtomatig ar draws eich enghraifft Rocket.Chat.", "RetentionPolicy_Enabled": "Wedi'i alluogi", "RetentionPolicy_ExcludePinned": "Eithrio negeseuon wedi'u pinnio", "RetentionPolicy_FilesOnly": "Dileu ffeiliau yn unig", "RetentionPolicy_FilesOnly_Description": "Dim ond ffeiliau fydd yn cael eu dileu, bydd y negeseuon eu hunain yn aros yn eu lle.", "RetentionPolicy_MaxAge": "Uchafswm oedran neges", + "RetentionPolicy_MaxAge_Channels": "Uchafswm oedran neges mewn sianeli", + "RetentionPolicy_MaxAge_Description": "Torrwch bob neges yn hÅˇn na'r gwerth hwn, mewn dyddiau", + "RetentionPolicy_MaxAge_DMs": "Uchafswm oed neges mewn negeseuon uniongyrchol", + "RetentionPolicy_MaxAge_Groups": "Uchafswm oedran neges mewn grwpiau preifat", "RetentionPolicy_Precision": "Precision Timer", "RetentionPolicy_Precision_Description": "Pa mor aml y dylai'r amserydd prÃŽn redeg. Mae gosod hyn i werth mwy manwl yn gwneud sianelau gydag amseryddion cadw cyflym yn gweithio'n well, ond gallant gostio pÅĩer prosesu ychwanegol ar gymunedau mawr.", "RetentionPolicyRoom_Enabled": "Gwthio hen negeseuon yn awtomatig", @@ -2750,4 +2757,4 @@ "registration.component.form.sendConfirmationEmail": "Anfon ebost cadarnhad", "Enterprise": "Menter", "UpgradeToGetMore_engagement-dashboard_Title": "Dadansoddiadau" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/da.i18n.json b/packages/i18n/src/locales/da.i18n.json index 83aa42bf65ee..a675ab4843c0 100644 --- a/packages/i18n/src/locales/da.i18n.json +++ b/packages/i18n/src/locales/da.i18n.json @@ -3072,6 +3072,9 @@ "RetentionPolicy_Advanced_Precision": "Brug konfigurationen til avanceret opbevaringspolitik", "RetentionPolicy_Advanced_Precision_Cron": "Brug avanceret opbevaringspolitik vha. Cron", "RetentionPolicy_Advanced_Precision_Cron_Description": "Hvor ofte sletnings-timeren skal køre. Indstilling af dette til en mere prÃĻcis vÃĻrdi gør kanaler med hurtige opbevarings-timere bedre, men kan koste ekstra procestid pÃĨ store communities.", + "RetentionPolicy_AppliesToChannels": "GÃĻlder for kanaler", + "RetentionPolicy_AppliesToDMs": "GÃĻlder for direkte meddelelser", + "RetentionPolicy_AppliesToGroups": "GÃĻlder for private grupper", "RetentionPolicy_Description": "Beskytter automatisk gamle meddelelser over din Rocket.Chat-forekomst.", "RetentionPolicy_DoNotPruneDiscussion": "Slet ikke diskussionsmeddelelser", "RetentionPolicy_DoNotPrunePinned": "Slet ikke fastgjorte beskeder", @@ -3081,6 +3084,10 @@ "RetentionPolicy_FilesOnly": "Slet kun filer", "RetentionPolicy_FilesOnly_Description": "Kun filer slettes, meddelelserne selv forbliver pÃĨ plads.", "RetentionPolicy_MaxAge": "Maksimal meddelelsesalder", + "RetentionPolicy_MaxAge_Channels": "Maksimal meddelelsesalder i kanaler", + "RetentionPolicy_MaxAge_Description": "BeskÃĻr alle meddelelser, der er ÃĻldre end denne vÃĻrdi, om dage", + "RetentionPolicy_MaxAge_DMs": "Maksimal meddelelsesalder i direkte beskeder", + "RetentionPolicy_MaxAge_Groups": "Maksimal meddelelsesalder i private grupper", "RetentionPolicy_Precision": "Timer Precision", "RetentionPolicy_Precision_Description": "Hvor ofte sletnings-timeren skal køre. Indstilling af dette til en mere prÃĻcis vÃĻrdi gør kanaler med hurtige opbevarings-timere bedre, men kan koste ekstra procestid pÃĨ store communities.", "RetentionPolicyRoom_Enabled": "BeskÃĻr automatisk gamle beskeder", @@ -4085,4 +4092,4 @@ "Enterprise": "Firma", "UpgradeToGetMore_engagement-dashboard_Title": "Analyse", "UpgradeToGetMore_auditing_Title": "MeddelelsesovervÃĨgning" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/de-AT.i18n.json b/packages/i18n/src/locales/de-AT.i18n.json index a3ea142396ea..0be8030f5738 100644 --- a/packages/i18n/src/locales/de-AT.i18n.json +++ b/packages/i18n/src/locales/de-AT.i18n.json @@ -2063,12 +2063,19 @@ "Retail": "Verkauf", "Retention_setting_changed_successfully": "Die Einstellung fÃŧr die Aufbewahrungsrichtlinie wurde erfolgreich geändert", "RetentionPolicy": "Aufbewahrungsrichtlinie", + "RetentionPolicy_AppliesToChannels": "Gilt fÃŧr Kanäle", + "RetentionPolicy_AppliesToDMs": "Gilt fÃŧr direkte Nachrichten", + "RetentionPolicy_AppliesToGroups": "Gilt fÃŧr private Gruppen", "RetentionPolicy_Description": "LÃļscht automatisch alte Nachrichten in Ihrer Rocket.Chat-Instanz.", "RetentionPolicy_Enabled": "aktiviert", "RetentionPolicy_ExcludePinned": "Pinned-Nachrichten ausschließen", "RetentionPolicy_FilesOnly": "LÃļschen Sie nur Dateien", "RetentionPolicy_FilesOnly_Description": "Nur Dateien werden gelÃļscht, die Nachrichten selbst bleiben bestehen.", "RetentionPolicy_MaxAge": "Maximales Nachrichtenalter", + "RetentionPolicy_MaxAge_Channels": "Maximales Nachrichtenalter in Kanälen", + "RetentionPolicy_MaxAge_Description": "Bereinigen Sie alle Nachrichten, die älter als dieser Wert sind, in Tagen", + "RetentionPolicy_MaxAge_DMs": "Maximales Nachrichtenalter in direkten Nachrichten", + "RetentionPolicy_MaxAge_Groups": "Maximales Nachrichtenalter in privaten Gruppen", "RetentionPolicy_Precision": "Timer-Präzision", "RetentionPolicy_Precision_Description": "Wie oft sollte der Prune Timer laufen? Wenn Sie dies auf einen präziseren Wert setzen, werden Kanäle mit schnellen Retention-Timern zwar besser, in großen Communities jedoch mÃļglicherweise zusätzliche Verarbeitungsleistung.", "RetentionPolicyRoom_Enabled": "Alte Nachrichten automatisch lÃļschen", @@ -2758,4 +2765,4 @@ "registration.component.form.sendConfirmationEmail": "Bestätigungsmail versenden", "Enterprise": "Unternehmen", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/de.i18n.json b/packages/i18n/src/locales/de.i18n.json index a463a07318cb..a67509672d33 100644 --- a/packages/i18n/src/locales/de.i18n.json +++ b/packages/i18n/src/locales/de.i18n.json @@ -31,6 +31,8 @@ "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "Eine sichere und private, selbstverwaltete LÃļsung fÃŧr Telefonkonferenzen.", "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "Ein Arbeitsbereich-Administrator muss eine Telefonkonferenz-App installieren und konfigurieren.", "An_app_needs_to_be_installed_and_configured": "Eine App muss installiert und konfiguriert werden.", + "Accessibility_and_Appearance": "Barrierefreiheit & Erscheinungsbild", + "Accessibility_activation": "Hier kÃļnnen Sie eine Vielzahl von Funktionen aktivieren, um Ihr Browser-Erlebnis zu verbessern.", "Accept_Call": "Anruf annehmen", "Accept": "Akzeptieren", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Akzeptiere eingehende Omnichannel-Anfragen auch wenn kein Agent online ist", @@ -322,6 +324,7 @@ "Added__username__to_this_team": "@{{user_added}} zu diesem Team hinzugefÃŧgt", "Adding_OAuth_Services": "HinzufÃŧgen von OAuth-Services", "Adding_permission": "Berechtigung hinzufÃŧgen", + "Adjustable_layout": "Anpassbares Layout", "Adding_user": "Benutzer hinzufÃŧgen", "Additional_emails": "Zusätzliche E-Mails", "Additional_Feedback": "Zusätzliches Feedback", @@ -333,6 +336,7 @@ "admin-no-videoconf-provider-app": "**Conference call not enabled**: Apps fÃŧr Telefonkonferenzen sind auf dem Rocket.Chat-Marktplatz erhältlich.", "Administration": "Administration", "Address": "Adresse", + "Adjustable_font_size_description": "Entwickelt fÃŧr diejenigen, die grÃļßere oder kleinere Texte fÃŧr eine verbesserte Lesbarkeit bevorzugen. Diese Flexibilität fÃļrdert die Inklusivität, indem sie den Benutzern ermÃļglicht, die Softwareoberfläche an ihre spezifischen BedÃŧrfnisse anzupassen.", "Adult_images_are_not_allowed": "Nicht-jugendfreie Bilder sind nicht erlaubt", "Aerospace_and_Defense": "Luft- und Raumfahrt sowie Verteidigung", "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "Nach der OAuth2-Authentifizierung werden Benutzer auf diese URL weitergeleitet. Sie kÃļnnen eine URL pro Zeile hinzufÃŧgen.", @@ -2224,6 +2228,7 @@ "Force_visitor_to_accept_data_processing_consent_enabled_alert": "Die Zustimmung zur Datenverarbeitung muss auf einem einfach nachvollziehbaren Grund fÃŧr die Verarbeitung der Daten beruhen. Aus diesem Deshalb muss das Feld unten ausgefÃŧllt werden. Das Feld muss Informationen enthalten, die dem Benutzer auf einfache Art und Weise erklären, warum seine personenbezogenen Daten verarbeitet werden mÃŧssen.", "force-delete-message": "LÃļschen der Nachricht erzwingen", "force-delete-message_description": "Berechtigung, eine Nachricht ohne weitere PrÃŧfungen zu lÃļschen", + "Font_size": "SchriftgrÃļße", "Forgot_password": "Passwort vergessen?", "Forgot_Password_Description": "Sie kÃļnnen die folgenden Platzhalter verwenden: \n - `[Forgot_Password_Url]` fÃŧr die Passwort-Wiederherstellungs-URL. \n - `[name]`, `[fname]`, `[lname]` fÃŧr den vollständigen Namen, Vornamen oder Nachnamen des Benutzers. \n - `[email]` fÃŧr die E-Mail-Adresse des Benutzers. \n - .", "Forgot_Password_Email": "Hier klicken, um das Passwort zurÃŧckzusetzen.", @@ -2848,6 +2853,7 @@ "Lead_capture_email_regex": "Lead Capture E-Mail Regex", "Lead_capture_phone_regex": "Lead Capture Telefon Regex", "Learn_more": "Mehr erfahren", + "Learn_more_about_accessibility": "Erfahren Sie hier mehr Ãŧber unser Engagement fÃŧr Barrierefreiheit:", "Least_recent_updated": "Zuletzt aktualisiert", "Learn_how_to_unlock_the_myriad_possibilities_of_rocket_chat": "Erfahren Sie, wie Sie die zahllosen MÃļglichkeiten von Rocket.Chat nutzen kÃļnnen.", "Leave": "Verlassen", @@ -3147,6 +3153,8 @@ "Mentions": "Erwähnungen", "Mentions_default": "Erwähnungen (Standard)", "Mentions_only": "Nur Erwähnungen", + "Mentions_with_@_symbol": "Erwähnungen mit @-Symbol", + "Mentions_with_@_symbol_description": "Erwähnungen benachrichtigen und heben Nachrichten fÃŧr Gruppen oder bestimmte Benutzer hervor, was eine gezielte Kommunikation erleichtert.\n\nDie Bildschirmleserfunktion wird optimiert, wenn das \"@\"-Symbol in der Erwähnungsfunktion verwendet wird. Dies stellt sicher, dass Benutzer, die auf Bildschirmleser angewiesen sind, diese Erwähnungen leicht interpretieren und darauf zugreifen kÃļnnen.", "Merge_Channels": "Channels zusammenfÃŧhren", "message": "Nachricht", "Message": "Nachricht", @@ -3981,6 +3989,9 @@ "RetentionPolicy_Advanced_Precision": "Konfiguration der erweiterten Aufbewahrungsregelung verwenden", "RetentionPolicy_Advanced_Precision_Cron": "Erweiterte Aufbewahrungsregelung Cron verwenden", "RetentionPolicy_Advanced_Precision_Cron_Description": "Der Cron-Job-Ausdruck definiert, wie oft der Bereinigungs-Timer ausgefÃŧhrt werden soll. Wenn dieser auf einen genaueren Wert gesetzt wird, funktionieren Kanäle mit schnellen Aufbewahrungs-Timern besser, verlieren allerdings mÃļglicherweise in großen Communities zusätzliche Rechenleistung.", + "RetentionPolicy_AppliesToChannels": "Gilt fÃŧr Channels", + "RetentionPolicy_AppliesToDMs": "Gilt fÃŧr Direktnachrichten", + "RetentionPolicy_AppliesToGroups": "Gilt fÃŧr private Gruppen", "RetentionPolicy_Description": "LÃļscht automatisch alte Nachrichten in Ihrer Rocket.Chat-Instanz.", "RetentionPolicy_DoNotPruneDiscussion": "Nachrichten in der Diskussion nicht bereinigen", "RetentionPolicy_DoNotPrunePinned": "Keine angehefteten Nachrichten bereinigen", @@ -3990,6 +4001,10 @@ "RetentionPolicy_FilesOnly": "LÃļschen Sie nur Dateien", "RetentionPolicy_FilesOnly_Description": "Nur Dateien werden gelÃļscht, die Nachrichten selbst bleiben bestehen.", "RetentionPolicy_MaxAge": "Maximales Nachrichtenalter", + "RetentionPolicy_MaxAge_Channels": "Maximales Nachrichtenalter in Kanälen", + "RetentionPolicy_MaxAge_Description": "Alle Nachrichten bereinigen, die älter als dieser Wert sind, in Tagen", + "RetentionPolicy_MaxAge_DMs": "Maximales Nachrichtenalter in direkten Nachrichten", + "RetentionPolicy_MaxAge_Groups": "Maximales Nachrichtenalter in privaten Gruppen", "RetentionPolicy_Precision": "Timer-Präzision", "RetentionPolicy_Precision_Description": "Wie oft sollte der Bereinigungs-Timer laufen? Wenn Sie dies auf einen präziseren Wert setzen, werden Kanäle mit schnellen Aufbewahrungs-Timern zwar besser, in großen Communitys jedoch mÃļglicherweise zusätzliche Verarbeitungsleistung.", "RetentionPolicyRoom_Enabled": "Alte Nachrichten automatisch lÃļschen", @@ -4355,6 +4370,10 @@ "Showing_online_users": "Anzeigen von: {{total_showing}}, Online: {{online}}, Gesamt: {{total}} Benutzer", "Showing_results": "

    %s Ergebnisse

    ", "Showing_results_of": "Anzeigen von %s - %s von %s Ergebnissen", + "Show_usernames": "Benutzernamen anzeigen", + "Show_roles": "Rollen anzeigen", + "Show_or_hide_the_user_roles_of_message_authors": "Die Benutzerrollen der Nachrichtenautoren anzeigen oder ausblenden.", + "Show_or_hide_the_username_of_message_authors": "Den Benutzernamen der Nachrichtenautoren anzeigen oder ausblenden.", "Sidebar": "Seitenleiste", "Sidebar_list_mode": "Seitenleisten-Channel-Listen-Modus", "Sign_in_to_start_talking": "Anmelden, um mit dem Chatten zu beginnen", @@ -5413,7 +5432,7 @@ "onboarding.component.form.action.confirm": "Bestätigen", "onboarding.component.form.action.pasteHere": "Hier einfÃŧgen...", "onboarding.component.form.termsAndConditions": "Ich bin mit den Nutzungsvereinbarung und den Datenschutzbestimmungen einverstanden", - "onboarding.component.emailCodeFallback": "Keine E-Mail erhalten? Noch einemal versenden oder E-Mailadresse ändern", + "onboarding.component.emailCodeFallback": "Keine E-Mail erhalten? <1>Noch einmal versenden oder <3>E-Mailadresse ändern", "onboarding.page.form.title": "Starten wir Ihren Arbeitsbereich", "onboarding.page.emailConfirmed.title": "E-Mail bestätigt", "onboarding.page.emailConfirmed.subtitle": "Sie kÃļnnen zu Ihrer Rocket.Chat-Anwendung zurÃŧckkehren - wir haben Ihren Arbeitsbereich bereits gestartet.", @@ -5479,7 +5498,13 @@ "Something_Went_Wrong": "Etwas ist schief gelaufen", "Toolbox_room_actions": "Primäre Room-Aktionen", "Theme_light": "Hell", + "Theme_light_description": "Zugänglicher fÃŧr Menschen mit Sehbehinderungen und eine gute Wahl fÃŧr gut beleuchtete Umgebungen.", "Theme_dark": "Dunkel", + "Theme_dark_description": "Reduzieren Sie die Augenbelastung und ErmÃŧdung bei schlechten Lichtverhältnissen, indem Sie die vom Bildschirm abgegebene Lichtmenge minimieren.", + "Theme_match_system": "System anpassen", + "Theme_match_system_description": "Das Erscheinungsbild Ihres Systems automatisch anpassen.", + "Theme_high_contrast": "Hoher Kontrast", + "Theme_high_contrast_description": "Maximale Tonunterschiede mit kräftigen Farben und scharfen Kontrasten bieten eine verbesserte Zugänglichkeit.", "Create_an_account": "Ein Konto erstellen", "Undo_request": "Anfrage rÃŧckgängig machen", "No_permission": "Keine Berechtigung", @@ -5505,4 +5530,4 @@ "Enterprise": "Unternehmen", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", "UpgradeToGetMore_auditing_Title": "NachrichtenÃŧberprÃŧfung" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/el.i18n.json b/packages/i18n/src/locales/el.i18n.json index 00b8967dfa90..731a56695f7a 100644 --- a/packages/i18n/src/locales/el.i18n.json +++ b/packages/i18n/src/locales/el.i18n.json @@ -2068,12 +2068,19 @@ "Retail": "ΛιαÎŊÎĩÎŧĪ€ÎŋĪÎšÎŋ", "Retention_setting_changed_successfully": "Η ĪĪÎ¸ÎŧΚĪƒÎˇ Ī€ÎŋÎģΚĪ„ΚÎēÎŽĪ‚ δΚιĪ„ÎŽĪÎˇĪƒÎˇĪ‚ ÎŦÎģÎģιΞÎĩ ÎŧÎĩ ÎĩĪ€ÎšĪ„Ī…Ī‡Î¯Îą", "RetentionPolicy": "ΠÎŋÎģΚĪ„ΚÎēÎŽ δΚιĪ„ÎŽĪÎˇĪƒÎˇĪ‚", + "RetentionPolicy_AppliesToChannels": "ΙĪƒĪ‡ĪÎĩΚ ÎŗΚι ÎēÎąÎŊÎŦÎģΚι", + "RetentionPolicy_AppliesToDMs": "ΙĪƒĪ‡ĪÎĩΚ ÎŗΚι ÎąĪ€ÎĩĪ…θÎĩÎ¯ÎąĪ‚ ÎŧΡÎŊĪÎŧÎąĪ„Îą", + "RetentionPolicy_AppliesToGroups": "ΙĪƒĪ‡ĪÎĩΚ ÎŗΚι ΚδΚĪ‰Ī„ΚÎēέĪ‚ ÎŋÎŧÎŦδÎĩĪ‚", "RetentionPolicy_Description": "ΑĪ…Ī„ĪŒÎŧÎąĪ„Îą ÎēÎģιδÎĩĪÎĩΚ Ī„Îą Ī€ÎąÎģΚÎŦ ÎŧΡÎŊĪÎŧÎąĪ„Îą ĪƒÎĩ ĪŒÎģÎĩĪ‚ Ī„ΚĪ‚ Ī€ÎĩĪÎšĪ€Ī„ĪŽĪƒÎĩΚĪ‚ Rocket.Chat.", "RetentionPolicy_Enabled": "ΕÎŊÎĩĪÎŗÎŋĪ€ÎŋΚΡÎŧέÎŊÎŋ", "RetentionPolicy_ExcludePinned": "ΕξαιĪÎŋĪÎŊĪ„ιΚ Ī„Îą ÎēÎąĪĪ†ÎšĪ„ĪƒĪ‰ÎŧέÎŊÎą ÎŧΡÎŊĪÎŧÎąĪ„Îą", "RetentionPolicy_FilesOnly": "ΔιαÎŗĪÎŦĪˆĪ„Îĩ ÎŧĪŒÎŊÎŋ Ī„Îą ÎąĪĪ‡ÎĩÎ¯Îą", "RetentionPolicy_FilesOnly_Description": "ΜĪŒÎŊÎŋ Ī„Îą ÎąĪĪ‡ÎĩÎ¯Îą θι δΚιÎŗĪÎąĪ†ÎŋĪÎŊ, Ī„Îą Î¯Î´ÎšÎą Ī„Îą ÎŧΡÎŊĪÎŧÎąĪ„Îą θι Ī€ÎąĪÎąÎŧÎĩίÎŊÎŋĪ…ÎŊ ĪƒĪ„Ρ θέĪƒÎˇ Ī„ÎŋĪ…Ī‚.", "RetentionPolicy_MaxAge": "ΜέÎŗΚĪƒĪ„Ρ ΡÎģΚÎēÎ¯Îą ÎŧΡÎŊĪÎŧÎąĪ„ÎŋĪ‚", + "RetentionPolicy_MaxAge_Channels": "ΜέÎŗΚĪƒĪ„Ρ ΡÎģΚÎēÎ¯Îą ÎŧΡÎŊĪÎŧÎąĪ„ÎŋĪ‚ ĪƒĪ„Îą ÎēÎąÎŊÎŦÎģΚι", + "RetentionPolicy_MaxAge_Description": "ΚÎģιδέĪˆĪ„Îĩ ĪŒÎģÎą Ī„Îą ÎŧΡÎŊĪÎŧÎąĪ„Îą Ī€ÎŋĪ… ÎĩίÎŊιΚ Ī€ÎąÎģιΚĪŒĪ„ÎĩĪÎą ÎąĪ€ĪŒ ÎąĪ…Ī„ÎŽÎŊ Ī„ΡÎŊ Ī„ΚÎŧÎŽ, ĪƒÎĩ ΡÎŧέĪÎĩĪ‚", + "RetentionPolicy_MaxAge_DMs": "ΜέÎŗΚĪƒĪ„Ρ ΡÎģΚÎēÎ¯Îą ÎŧΡÎŊĪÎŧÎąĪ„ÎŋĪ‚ ĪƒĪ„Îą ÎŦÎŧÎĩĪƒÎą ÎŧΡÎŊĪÎŧÎąĪ„Îą", + "RetentionPolicy_MaxAge_Groups": "ΜέÎŗΚĪƒĪ„Ρ ΡÎģΚÎēÎ¯Îą ÎŧΡÎŊĪÎŧÎąĪ„ÎŋĪ‚ ĪƒÎĩ ΚδΚĪ‰Ī„ΚÎēέĪ‚ ÎŋÎŧÎŦδÎĩĪ‚", "RetentionPolicy_Precision": "ΧĪÎŋÎŊĪŒÎŧÎĩĪ„ĪÎŋ ÎąÎēĪÎ¯Î˛ÎĩΚιĪ‚", "RetentionPolicy_Precision_Description": "ΠĪŒĪƒÎŋ ĪƒĪ…Ī‡ÎŊÎŦ Ī€ĪÎ­Ī€ÎĩΚ ÎŊÎą Ī„ĪÎ­Ī‡ÎĩΚ Îŋ Ī‡ĪÎŋÎŊÎŋÎŧÎĩĪ„ĪÎˇĪ„ÎŽĪ‚. Η ĪĪÎ¸ÎŧΚĪƒÎˇ ÎąĪ…Ī„ÎŽ ĪƒÎĩ ÎŧΚι Ī€ÎšÎŋ ÎąÎēĪÎšÎ˛ÎŽ Ī„ΚÎŧÎŽ ÎēιθΚĪƒĪ„ÎŦ Ī„Îą ÎēÎąÎŊÎŦÎģΚι ÎŧÎĩ Ī‡ĪÎŋÎŊÎŋδΚιÎēĪŒĪ€Ī„ÎĩĪ‚ ÎŗĪÎŽÎŗÎŋĪÎˇĪ‚ ĪƒĪ…ÎŗÎēĪÎŦĪ„ΡĪƒÎˇĪ‚ ÎŊÎą ÎģÎĩΚĪ„ÎŋĪ…ĪÎŗÎŋĪÎŊ ÎēÎąÎģĪĪ„ÎĩĪÎą, ÎąÎģÎģÎŦ ÎŧĪ€ÎŋĪÎĩί ÎŊÎą ÎēÎŋĪƒĪ„ίÎļÎŋĪ…ÎŊ ÎĩĪ€ÎšĪ€ÎģέÎŋÎŊ ΚĪƒĪ‡Ī ÎĩĪ€ÎĩΞÎĩĪÎŗÎąĪƒÎ¯ÎąĪ‚ ĪƒÎĩ ÎŧÎĩÎŗÎŦÎģÎĩĪ‚ ÎēÎŋΚÎŊĪŒĪ„ΡĪ„ÎĩĪ‚.", "RetentionPolicyRoom_Enabled": "ΑĪ…Ī„ĪŒÎŧÎąĪ„Ρ Ī€ÎĩĪÎšÎēÎŋĪ€ÎŽ Ī€ÎąÎģΚĪŽÎŊ ÎŧΡÎŊĪ…ÎŧÎŦĪ„Ī‰ÎŊ", @@ -2765,4 +2772,4 @@ "registration.component.form.sendConfirmationEmail": "ΑĪ€ÎŋĪƒĪ„ÎŋÎģÎŽ email ÎĩĪ€ÎšÎ˛ÎĩÎ˛ÎąÎ¯Ī‰ĪƒÎˇĪ‚", "Enterprise": "ΕĪ€ÎšĪ‡ÎĩίĪÎˇĪƒÎˇ", "UpgradeToGetMore_engagement-dashboard_Title": "ΑÎŊÎąÎģĪ…Ī„ΚÎēÎŦ ĪƒĪ„ÎŋΚĪ‡ÎĩÎ¯Îą" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json index abbb4faf12df..77c7c102a2d0 100644 --- a/packages/i18n/src/locales/en.i18n.json +++ b/packages/i18n/src/locales/en.i18n.json @@ -1758,6 +1758,7 @@ "Dont_ask_me_again_list": "Don't ask me again list", "Download": "Download", "Download_Destkop_App": "Download Desktop App", + "Download_Disabled": "Download disabled", "Download_Info": "Download info", "Download_My_Data": "Download My Data (HTML)", "Download_Pending_Avatars": "Download Pending Avatars", @@ -1929,7 +1930,7 @@ "Extra_CSP_Domains": "Extra CSP Domains", "Extra_CSP_Domains_Description": "Extra domains to add to the Content-Security-Policy", "Enable_Desktop_Notifications": "Enable Desktop Notifications", - "Enable_encryption" : "Enable encryption", + "Enable_encryption": "Enable encryption", "Enable_inquiry_fetch_by_stream": "Enable inquiry data fetch from server using a stream", "Enable_omnichannel_auto_close_abandoned_rooms": "Enable automatic closing of rooms abandoned by the visitor", "Enable_Password_History": "Enable Password History", @@ -2862,6 +2863,7 @@ "Join_Chat": "Join Chat", "Join_conference": "Join conference", "Join_default_channels": "Join default channels", + "Join_discussion": "Join discussion", "Join_the_Community": "Join the Community", "Join_the_given_channel": "Join the given channel", "Join_rooms": "Join rooms", @@ -3271,9 +3273,14 @@ "Livechat_title_color": "Livechat Title Background Color", "Livechat_transcript_already_requested_warning": "The transcript of this chat has already been requested and will be sent as soon as the conversation ends.", "Livechat_transcript_has_been_requested": "Export requested. It may take a few seconds.", + "Livechat_transcript_show_system_messages": "Include system messages in transcripts", "Livechat_email_transcript_has_been_requested": "The transcript has been requested. It may take a few seconds.", "Livechat_transcript_request_has_been_canceled": "The chat transcription request has been canceled.", "Livechat_transcript_sent": "Omnichannel transcript sent", + "Livechat_transcript_send_always": "Always send conversation transcript to visitors via email", + "Livechat_transcript_send_always_Description": "Once finished, send conversation transcript via email to visitors automatically, regardless of agent's preferences.", + "Livechat_transcript_email_subject": "Custom email subject for transcript", + "Livechat_transcript_email_subject_Description": "Allows to customize the email subject for transcripts sent via email. It can be overriden by passing a `subject` property when closing a room. Leave it empty to use default subject.", "Livechat_transfer_return_to_the_queue": "{{from}} returned the chat to the queue", "Livechat_transfer_return_to_the_queue_with_a_comment": "{{from}} returned the chat to the queue with a comment: {{comment}}", "Livechat_transfer_return_to_the_queue_auto_transfer_unanswered_chat": "{{from}} returned the chat to the queue since it was unanswered for {{duration}} seconds", @@ -3965,7 +3972,6 @@ "OAuth": "OAuth", "OAuth_Description": "Configure authentication methods beyond just username and password.", "OAuth_Application": "OAuth Application", - "OAuth_button_colors_alert": "Changing the color may result in non-compliance with WCAG (Web Content Accessibility Guidelines) requirements. Please ensure that the new colors meet the recommended contrast and readability standards to maintain accessibility for all users.", "Objects": "Objects", "Off": "Off", "Off_the_record_conversation": "Off-the-Record Conversation", @@ -5764,6 +5770,10 @@ "VideoConf_Enable_Groups": "Enable in private channels", "VideoConf_Enable_DMs": "Enable in direct messages", "VideoConf_Enable_Teams": "Enable in teams", + "VideoConf_Enable_Persistent_Chat": "Enable Persistent Chat", + "VideoConf_Enable_Persistent_Chat_description": "When persistent chat is enabled, Rocket.Chat will create a discussion every time a conference call is initiated. The provider app is responsible for sending the chat messages to this discussion.", + "VideoConf_Enable_Persistent_Chat_Alert": "Persistent Chat will not work if discussions are disabled on the workspace. It will also not work if the provider app being used do not explicitly support this feature.", + "VideoConf_Persistent_Chat_Discussion_Name": "Persistent Chat Discussion Name", "VideoConf_Mobile_Ringing": "Enable mobile ringing", "VideoConf_Mobile_Ringing_Description": "When enabled, direct calls to mobile users will ring their device as a phone call.", "VideoConf_Mobile_Ringing_Alert": "This feature is currently in an experimental stage and may not yet be fully supported by the mobile app. When enabled it will send additional Push Notifications to users.", @@ -5791,6 +5801,9 @@ "view-all-teams_description": "Permission to view all teams", "view-all-team-channels": "View All Team Channels", "view-all-team-channels_description": "Permission to view all team's channels", + "view-members-list-all-rooms": "Can view members in all rooms", + "view-members-list-all-rooms_description": "Gives the ability to see the members list in all rooms, even those the user is not part of", + "Room_members_list": "Members list", "view-broadcast-member-list": "View Members List in Broadcast Room", "view-broadcast-member-list_description": "Permission to view list of users in broadcast channel", "view-c-room": "View Public Channel", @@ -6116,6 +6129,7 @@ "registration.component.form.emailOrUsername": "Email or username", "registration.component.form.username": "Username", "registration.component.form.name": "Name", + "registration.component.form.nameContainsInvalidChars": "Name contains invalid characters", "registration.component.form.nameOptional": "Name optional", "registration.component.form.createAnAccount": "Create an account", "registration.component.form.userAlreadyExist": "Username already exists. Please try another username.", @@ -6274,7 +6288,7 @@ "Always_send_the_transcript_to_contacts_at_the_end_of_the_conversations": "Always send the transcript to contacts at the end of the conversations.", "Export_conversation_transcript_as_PDF": "Export conversation transcript as PDF", "Omnichannel_transcript_email": "Send chat transcript via email.", - "Accounts_Default_User_Preferences_omnichannelTranscriptEmail_Description": "Always send the transcript to contacts at the end of the conversations.", + "Accounts_Default_User_Preferences_omnichannelTranscriptEmail_Description": "Always send the transcript to contacts at the end of the conversations. This preference may be overriden by an admin setting.", "Omnichannel_transcript_pdf": "Export chat transcript as PDF.", "Accounts_Default_User_Preferences_omnichannelTranscriptPDF_Description": "Always export the transcript as PDF at the end of conversations.", "Contact_email": "Contact email", @@ -6498,5 +6512,7 @@ "Workspace_and_user_settings": "Workspace and user settings", "Sidebar_Sections_Order": "Sidebar sections order", "Sidebar_Sections_Order_Description": "Select the categories in your preferred order", - "Incoming_Calls": "Incoming calls" + "Incoming_Calls": "Incoming calls", + "Advanced_settings": "Advanced settings", + "Security_and_permissions": "Security and permissions" } diff --git a/packages/i18n/src/locales/eo.i18n.json b/packages/i18n/src/locales/eo.i18n.json index 42f8d33688e5..1558424c9445 100644 --- a/packages/i18n/src/locales/eo.i18n.json +++ b/packages/i18n/src/locales/eo.i18n.json @@ -2060,12 +2060,19 @@ "Retail": "Retail", "Retention_setting_changed_successfully": "Rezerva politika agordo ŝanĝiĝis sukcese", "RetentionPolicy": "Politika Retenado", + "RetentionPolicy_AppliesToChannels": "Aplikas al kanaloj", + "RetentionPolicy_AppliesToDMs": "Aplikas direkti mesaĝojn", + "RetentionPolicy_AppliesToGroups": "Aplikas al privataj grupoj", "RetentionPolicy_Description": "AÅ­tomate prunas malnovajn mesaĝojn tra via raketo.", "RetentionPolicy_Enabled": "Enabled", "RetentionPolicy_ExcludePinned": "Ekskludi kovritajn mesaĝojn", "RetentionPolicy_FilesOnly": "Nur forigi dosierojn", "RetentionPolicy_FilesOnly_Description": "Nur dosieroj estos forigitaj, la mesaĝoj mem restos en loko.", "RetentionPolicy_MaxAge": "Maksimuma mesaĝo", + "RetentionPolicy_MaxAge_Channels": "Maksimuma mesaĝo en kanaloj", + "RetentionPolicy_MaxAge_Description": "Pritondu ĉiujn mesaĝojn pli malnovajn ol ĉi tiu valoro, en tagoj", + "RetentionPolicy_MaxAge_DMs": "Maksimuma mesaĝo en rektaj mesaĝoj", + "RetentionPolicy_MaxAge_Groups": "Maksimuma mesaĝo en privataj grupoj", "RetentionPolicy_Precision": "Timer Precizeco", "RetentionPolicy_Precision_Description": "Kiom ofte la pruntempa temporilo devus kuri. Fiksante ĉi tion al pli preciza valoro faras kanalojn kun rapidaj retencaj tempoj pli bone funkcii, sed povus kosti ekstra prilabor-potencon en grandaj komunumoj.", "RetentionPolicyRoom_Enabled": "AÅ­tomate prunti malnovajn mesaĝojn", @@ -2759,4 +2766,4 @@ "registration.component.form.sendConfirmationEmail": "Sendu konfirman retpoŝton", "Enterprise": "Entrepreno", "UpgradeToGetMore_engagement-dashboard_Title": "Analitiko" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/es.i18n.json b/packages/i18n/src/locales/es.i18n.json index 6ddcf2b6479f..a276a3c51690 100644 --- a/packages/i18n/src/locales/es.i18n.json +++ b/packages/i18n/src/locales/es.i18n.json @@ -756,6 +756,7 @@ "CAS_enabled": "Habilitada", "CAS_Login_Layout": "DiseÃąo de inicio de sesiÃŗn de CAS", "CAS_login_url": "URL de inicio de sesiÃŗn SSO", + "message_counter_many": "{{count}} mensajes", "CAS_login_url_Description": "URL de inicio de sesiÃŗn de tu servicio SSO externo; por ejemplo, `https://sso.example.undef/sso/login`", "CAS_popup_height": "Altura de la ventana emergente de inicio de sesiÃŗn", "CAS_popup_width": "Anchura de la ventana emergente de inicio de sesiÃŗn", @@ -771,6 +772,7 @@ "Categories*": "Categorías*", "CDN_JSCSS_PREFIX": "Prefijo de CDN para JS/CSS", "CDN_PREFIX": "Prefijo de CDN", + "meteor_status_reconnect_in_many": "intentando de nuevo dentro de {{count}} segundos...", "CDN_PREFIX_ALL": "Usar prefijo de CDN para todos los activos", "Certificates_and_Keys": "Certificados y claves", "change-livechat-room-visitor": "Cambiar visitantes de Room de Livechat", @@ -947,7 +949,6 @@ "Contact_not_found": "Contacto no encontrado", "Contact_Profile": "Perfil de contacto", "Contact_Info": "InformaciÃŗn de contacto", - "message_counter_many": "{{count}} mensajes", "Content": "Contenido", "Continue": "Continuar", "Continuous_sound_notifications_for_new_livechat_room": "Notificaciones de sonido continuas para nueva sala de Omnichannel", @@ -962,7 +963,6 @@ "Conversations": "Conversaciones", "Conversations_per_day": "Conversaciones por día", "Convert": "Convertir", - "meteor_status_reconnect_in_many": "intentando de nuevo dentro de {{count}} segundos...", "Convert_Ascii_Emojis": "Convierte ASCII a emoji", "Convert_to_channel": "Convertir en Channel", "Converting_channel_to_a_team": "Vas a convertir este Channel en un equipo. Se conservarÃĄn todos los miembros.", @@ -1495,11 +1495,14 @@ "E2E_Enabled": "E2E habilitado", "E2E_Enabled_Default_DirectRooms": "Habilitar cifrado de Rooms directas por defecto", "E2E_Enabled_Default_PrivateRooms": "Habilitar cifrado de Rooms privadas por defecto", + "mentions_counter_many": "{{count}} menciones", "E2E_Encryption_Password_Change": "Cambiar contraseÃąa de cifrado", "E2E_Encryption_Password_Explanation": "Ahora puedes crear grupos privados cifrados y mensajes directos. TambiÊn puedes cambiar los grupos privados o los mensajes directos existentes para cifrarlos.

    Este es un cifrado de extremo a extremo, por lo que la clave para codifica/decodificar tus mensajes no se guardarÃĄ en el servidor. Por esa razÃŗn, debes guardar tu contraseÃąa en un lugar seguro. Se te pedirÃĄ que la introduzcas en otros dispositivos en los que quieras usar el cifrado E2E.", "E2E_key_reset_email": "NotificaciÃŗn de restablecimiento de clave E2E", "E2E_password_request_text": "Para acceder a tus grupos privados y mensajes directos cifrados, introduce tu contraseÃąa de cifrado.
    Necesitas introducir esta contraseÃąa para codificar/decodificar tus mensajes en cada cliente que uses, ya que la clave no se almacena en el servidor.", "E2E_password_reveal_text": "Ahora puedes crear grupos privados y mensajes directos cifrados. TambiÊn puedes cambiar los grupos privados o los mensajes directos existentes para cifrarlos.

    Este es un cifrado de extremo a extremo, por lo que la clave para codifica/decodificar tus mensajes no se guardarÃĄ en el servidor. Por esa razÃŗn, debes guardar tu contraseÃąa en un lugar seguro. Se te pedirÃĄ que la introduzcas en otros dispositivos en los que quieras usar el cifrado E2E.Consulta mÃĄs informaciÃŗn aquí.

    Tu contraseÃąa: %s

    Esta es una contraseÃąa generada automÃĄticamente. Puedes configurar una nueva contraseÃąa para tu clave de cifrado en cualquier momento desde cualquier navegador en el que hayas introducido la contraseÃąa existente.
    Esta contraseÃąa solo se almacena en este navegador hasta que la guardes y descartes este mensaje.", + "threads_counter_many": "{{count}} mensajes en hilo sin leer", + "unread_messages_counter_many": "{{count}} mensajes sin leer", "E2E_Reset_Email_Content": "Tu sesiÃŗn se ha cerrado automÃĄticamente. Cuando vuelvas a iniciar sesiÃŗn, Rocket.Chat generarÃĄ una nueva clave y restaurarÃĄ tu acceso a cualquier sala cifrada que tenga uno o mÃĄs miembros en línea. Debido a la naturaleza del cifrado E2E, Rocket.Chat no podrÃĄ restaurar el acceso a ninguna sala cifrada que no tenga miembros en línea.", "E2E_Reset_Key_Explanation": "Esta opciÃŗn eliminarÃĄ tu clave E2E actual y cerrarÃĄ tu sesiÃŗn.
    Cuando vuelvas a iniciar sesiÃŗn, Rocket.Chat generarÃĄ una nueva clave y restaurarÃĄ tu acceso a cualquier sala cifrada que tenga uno o mÃĄs miembros en línea.
    Debido a la naturaleza del cifrado E2E, Rocket.Chat no podrÃĄ restaurar el acceso a ninguna sala cifrada que no tenga miembros en línea.", "E2E_Reset_Other_Key_Warning": "Restablecer la clave E2E actual cerrarÃĄ la sesiÃŗn del usuario. Cuando vuelva a iniciar sesiÃŗn, Rocket.Chat generarÃĄ una nueva clave y restaurarÃĄ su acceso a cualquier sala cifrada que tenga uno o mÃĄs miembros en línea. Debido a la naturaleza del cifrado E2E, Rocket.Chat no podrÃĄ restaurar el acceso a ninguna sala cifrada que no tenga miembros en línea.", @@ -1742,8 +1745,10 @@ "error-no-tokens-for-this-user": "No hay ningÃēn token para este usuario", "error-no-agents-online-in-department": "No hay agentes en línea en el departamento", "error-no-message-for-unread": "No hay mensajes para marcar como no leídos", + "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.", "error-not-allowed": "No permitido", "error-not-authorized": "No autorizado", + "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.", "error-office-hours-are-closed": "El horario de oficina ha finalizado.", "Estimated_due_time": "Tiempo estimado de vencimiento", "error-password-in-history": "La contraseÃąa introducida se ha usado anteriormente", @@ -1798,14 +1803,11 @@ "every_5_minutes": "Una vez cada 5 minutos", "every_10_seconds": "Una vez cada 10 segundos", "every_30_minutes": "Una vez cada 30 minutos", - "mentions_counter_many": "{{count}} menciones", "every_day": "Una vez cada día", "every_hour": "Una vez cada hora", "every_minute": "Una vez cada minuto", "every_second": "Una vez cada segundo", "every_six_hours": "Una vez cada seis horas", - "threads_counter_many": "{{count}} mensajes en hilo sin leer", - "unread_messages_counter_many": "{{count}} mensajes sin leer", "Everyone_can_access_this_channel": "Todos pueden acceder a este canal", "Exact": "Exacto", "Example_payload": "Carga Ãētil de ejemplo", @@ -2124,9 +2126,7 @@ "Impersonate_user_description": "Cuando esta opciÃŗn estÊ habilitada, la integraciÃŗn publicarÃĄ como el usuario que activÃŗ la integraciÃŗn", "Import": "Importar", "Import_New_File": "Importar archivo nuevo", - "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.", "Import_requested_successfully": "ImportaciÃŗn solicitada correctamente", - "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.", "Import_Type": "Tipo de importaciÃŗn", "Importer_Archived": "Archivado", "Importer_CSV_Information": "El importador de CSV requiere un formato específico; lee la documentaciÃŗn sobre cÃŗmo estructurar tu archivo zip:", @@ -3534,6 +3534,9 @@ "RetentionPolicy_Advanced_Precision": "Usar la configuraciÃŗn avanzada de la política de retenciÃŗn", "RetentionPolicy_Advanced_Precision_Cron": "Usar CRON de política de retenciÃŗn avanzada", "RetentionPolicy_Advanced_Precision_Cron_Description": "Frecuencia con la que debe ejecutarse el temporizador de retirada definido por la expresiÃŗn del trabajo CRON. Establecer esto en un valor mÃĄs preciso hace que los canales con temporizadores de retenciÃŗn rÃĄpidos funcionen mejor, pero podría exigir potencia de procesamiento adicional en comunidades grandes.", + "RetentionPolicy_AppliesToChannels": "Se aplica a canales", + "RetentionPolicy_AppliesToDMs": "Se aplica a mensajes directos", + "RetentionPolicy_AppliesToGroups": "Se aplica a grupos privados", "RetentionPolicy_Description": "Retira automÃĄticamente los mensajes antiguos en tu instancia de Rocket.Chat.", "RetentionPolicy_DoNotPruneDiscussion": "No retirar mensajes de discusiÃŗn", "RetentionPolicy_DoNotPrunePinned": "No retirar mensajes fijados", @@ -3543,6 +3546,10 @@ "RetentionPolicy_FilesOnly": "Eliminar solo archivos", "RetentionPolicy_FilesOnly_Description": "Solo se eliminarÃĄn los archivos, los mensajes en sí se conservarÃĄn.", "RetentionPolicy_MaxAge": "AntigÃŧedad mÃĄxima de mensaje", + "RetentionPolicy_MaxAge_Channels": "AntigÃŧedad mÃĄxima de mensajes en canales", + "RetentionPolicy_MaxAge_Description": "Retirar todos los mensajes anteriores a este valor (en días)", + "RetentionPolicy_MaxAge_DMs": "AntigÃŧedad mÃĄxima de mensajes directos", + "RetentionPolicy_MaxAge_Groups": "AntigÃŧedad mÃĄxima de mensaje en grupos privados", "RetentionPolicy_Precision": "PrecisiÃŗn del temporizador", "RetentionPolicy_Precision_Description": "Frecuencia con la que debe ejecutarse el temporizador de retirada. Establecer esto en un valor mÃĄs preciso hace que los canales con temporizadores de retenciÃŗn rÃĄpidos funcionen mejor, pero podría exigir potencia de procesamiento adicional en comunidades grandes.", "RetentionPolicyRoom_Enabled": "Retirar mensajes antiguos automÃĄticamente", @@ -4936,7 +4943,7 @@ "Always_send_the_transcript_to_contacts_at_the_end_of_the_conversations": "Envía siempre la transcripciÃŗn a los contactos al final de las conversaciones.", "Export_conversation_transcript_as_PDF": "Exportar la transcripciÃŗn de la conversaciÃŗn en PDF", "Omnichannel_transcript_email": "Enviar la transcripciÃŗn del chat por correo electrÃŗnico.", - "Accounts_Default_User_Preferences_omnichannelTranscriptEmail_Description": "Envía siempre la transcripciÃŗn a los contactos al final de las conversaciones.", + "Accounts_Default_User_Preferences_omnichannelTranscriptEmail_Description": "Envía siempre la transcripciÃŗn a los contactos al final de las conversaciones. Esta preferncia puede ser sobreescrita por un administrador.", "Omnichannel_transcript_pdf": "Exporta la transcripciÃŗn del chat en PDF.", "Accounts_Default_User_Preferences_omnichannelTranscriptPDF_Description": "Exporte siempre la transcripciÃŗn en PDF al final de las conversaciones.", "Customer": "Cliente", @@ -5083,4 +5090,4 @@ "Unlimited_seats": "Puestos ilimitados", "Unlimited_MACs": "Contactos Activos por Mes (MAC) ilimitados", "Unlimited_seats_MACs": "Puestos y Contactos Activos por Mes (MAC) ilimitados" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/fa.i18n.json b/packages/i18n/src/locales/fa.i18n.json index 12a187b29050..c4850a7d30eb 100644 --- a/packages/i18n/src/locales/fa.i18n.json +++ b/packages/i18n/src/locales/fa.i18n.json @@ -2372,16 +2372,21 @@ "Retail": "ØŦØ˛ØĻی", "Retention_setting_changed_successfully": "ØĒŲ†Ø¸ÛŒŲ… ØŗیاØŗØĒ Ø­ŲØ¸ Ø­ŲØ¸ شدŲ‡ با Ų…ŲˆŲŲ‚ÛŒØĒ ØĒØēÛŒÛŒØą ÚŠØąØ¯", "RetentionPolicy": "ØŗیاØŗØĒ Ų†Ú¯Ų‡Ø¯Ø§ØąÛŒ", + "RetentionPolicy_AppliesToChannels": "بŲ‡ ڊاŲ†Ø§Ų„ Ų‡Ø§ اؚŲ…اŲ„ Ų…ÛŒ Ø´ŲˆØ¯", + "RetentionPolicy_AppliesToDMs": "بŲ‡ ŲžÛŒØ§Ų… Ų‡Ø§ÛŒ Ų…ØŗØĒŲ‚ÛŒŲ… اؚŲ…اŲ„ Ų…ÛŒ Ø´ŲˆØ¯", + "RetentionPolicy_AppliesToGroups": "اؚŲ…اŲ„ بŲ‡ Ú¯ØąŲˆŲ‡ Ų‡Ø§ÛŒ ØŽØĩŲˆØĩی", "RetentionPolicy_Description": "بŲ‡ ØˇŲˆØą ØŽŲˆØ¯ÚŠØ§Øą ŲžÛŒØ§Ų… Ų‡Ø§ÛŒ Ų‚دیŲ…ÛŒ ØąØ§ Ø¯Øą ØŗØąØ§ØŗØą Ų†Ų…ŲˆŲ†Ų‡ Rocket.Chat ØŽŲˆØ¯ Ų‚ØąØ§Øą دŲ‡ÛŒØ¯.", "RetentionPolicy_Enabled": "ŲØšØ§Ų„", "RetentionPolicy_ExcludePinned": "ŲžÛŒØ§Ų… Ų‡Ø§ÛŒ ŲžÛŒŲ† شدŲ‡ ØąØ§ حذŲ ÚŠŲ†ÛŒØ¯", "RetentionPolicy_FilesOnly": "ŲŲ‚Øˇ ŲØ§ÛŒŲ„Ų‡Ø§ ØąØ§ حذŲ ÚŠŲ†ÛŒØ¯", "RetentionPolicy_FilesOnly_Description": "ŲŲ‚Øˇ ŲØ§ÛŒŲ„ Ų‡Ø§ حذŲ ØŽŲˆØ§Ų‡Ų†Ø¯ شد، ŲžÛŒØ§Ų… Ų‡Ø§ÛŒ ØŽŲˆØ¯ ØąØ§ Ø¯Øą ØŦای ØŽŲˆØ¯ Ų‚ØąØ§Øą Ų…ÛŒ دŲ‡Ų†Ø¯.", "RetentionPolicy_MaxAge": "حداڊØĢØą ØŗŲ† ŲžÛŒØ§Ų…", + "RetentionPolicy_MaxAge_Channels": "حداڊØĢØą ØŗŲ† ŲžÛŒØ§Ų… Ø¯Øą ڊاŲ†Ø§Ų„ Ų‡Ø§", + "RetentionPolicy_MaxAge_Description": "ØĒŲ…اŲ… ŲžÛŒØ§Ų… Ų‡Ø§ÛŒ Ų‚دیŲ…ÛŒ ØĒØą Ø§Ø˛ ایŲ† Ų…Ų‚Ø¯Ø§Øą ØąØ§ Ø¯Øą ØąŲˆØ˛Ų‡Ø§ ŲØąŲˆ ÚŠŲ†", + "RetentionPolicy_MaxAge_DMs": "حداڊØĢØą ØŗŲ† ŲžÛŒØ§Ų… Ø¯Øą ŲžÛŒØ§Ų… Ų‡Ø§ÛŒ Ų…ØŗØĒŲ‚ÛŒŲ…", + "RetentionPolicy_MaxAge_Groups": "حداڊØĢØą ØŗŲ† ŲžÛŒØ§Ų… Ø¯Øą Ú¯ØąŲˆŲ‡ Ų‡Ø§ÛŒ ØŽØĩŲˆØĩی", "RetentionPolicy_Precision": "ØĒایŲ…Øą دŲ‚ÛŒŲ‚", "RetentionPolicy_Precision_Description": "Ų‡Øą چŲ†Ø¯ ŲˆŲ‚ØĒ ÛŒÚŠØ¨Ø§Øą ØĒایŲ…Øą Ø¨ØąŲ‡ باید اØŦØąØ§ Ø´ŲˆØ¯ ØĒŲ†Ø¸ÛŒŲ… ایŲ† بŲ‡ یڊ Ų…Ų‚Ø¯Ø§Øą دŲ‚ÛŒŲ‚ ØĒØą باؚØĢ Ų…ÛŒ Ø´ŲˆØ¯ ڊاŲ†Ø§Ų„ Ų‡Ø§ÛŒ با ØĒایŲ…Øą Ų†Ú¯Ų‡Ø¯Ø§ØąÛŒ ØŗØąÛŒØš ÚŠØ§Øą بŲ‡ØĒØąØŒ اŲ…ا Ų…Ų…ÚŠŲ† اØŗØĒ ŲžØąØ¯Ø§Ø˛Ø´ Ų‚Ø¯ØąØĒ اØļاŲÛŒ Ø¯Øą ØŦŲˆØ§Ų…Øš Ø¨Ø˛ØąÚ¯ Ų‡Ø˛ÛŒŲ†Ų‡.", - - "RetentionPolicyRoom_Enabled": "ŲžÛŒØ§Ų… Ų‡Ø§ÛŒ Ų‚دیŲ…ÛŒ ØąØ§ بŲ‡ ØˇŲˆØą ØŽŲˆØ¯ÚŠØ§Øą ØŽØąØ¯ ÚŠŲ†ÛŒØ¯", "RetentionPolicyRoom_ExcludePinned": "ŲžÛŒØ§Ų… Ų‡Ø§ÛŒ ŲžÛŒŲ† شدŲ‡ ØąØ§ حذŲ ÚŠŲ†ÛŒØ¯", "RetentionPolicyRoom_FilesOnly": "ŲŲ‚Øˇ ŲžØąŲˆŲ†Ø¯Ų‡ Ų‡Ø§ ØąØ§ ببŲ†Ø¯ÛŒØ¯ØŒ ŲžÛŒØ§Ų… Ų‡Ø§ ØąØ§ Ų†Ú¯Ų‡ Ø¯Ø§ØąÛŒØ¯", @@ -3109,4 +3114,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "ڊاŲ†Ø§Ų„ Ų‡Ų…Ų‡â€ŒÚŠØ§ØąŲ‡", "Enterprise": "Ø´ØąÚŠØĒ، ŲžØąŲˆÚ˜Ų‡", "UpgradeToGetMore_engagement-dashboard_Title": "ØĒØŦØ˛ÛŒŲ‡ Ųˆ ØĒØ­Ų„ÛŒŲ„ ØĒØąØ§ŲÛŒÚŠ" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/fi.i18n.json b/packages/i18n/src/locales/fi.i18n.json index c8078bb2545f..17b5f65eab31 100644 --- a/packages/i18n/src/locales/fi.i18n.json +++ b/packages/i18n/src/locales/fi.i18n.json @@ -4060,6 +4060,9 @@ "RetentionPolicy_Advanced_Precision": "Käytä laajennettua säilytyskäytäntÃļä", "RetentionPolicy_Advanced_Precision_Cron": "Käytä laajennetun säilytyskäytännÃļn Cron -käytäntÃļä", "RetentionPolicy_Advanced_Precision_Cron_Description": "Kuinka usein karsinta-ajastimen tulisi toimia, määritellään cron-tyÃļn lausekkeella. Jos tämä asetetaan tarkempaan arvoon, kanavat, joissa on nopeat säilytysajastimet, toimivat paremmin, mutta se saattaa vaatia ylimääräistä laskentatehoa suurissa yhteisÃļissä.", + "RetentionPolicy_AppliesToChannels": "Koskee kanavia", + "RetentionPolicy_AppliesToDMs": "Koskee suoria viestejä", + "RetentionPolicy_AppliesToGroups": "Koskee yksityisiä ryhmiä", "RetentionPolicy_Description": "Karsii vanhat viestit ja tiedostot automaattisesti koko tyÃļtilassa.", "RetentionPolicy_DoNotPruneDiscussion": "Älä karsi keskusteluviestejä", "RetentionPolicy_DoNotPrunePinned": "Älä karsi kiinnitettyjä viestejä", @@ -4069,6 +4072,10 @@ "RetentionPolicy_FilesOnly": "Poista vain tiedostot", "RetentionPolicy_FilesOnly_Description": "Vain tiedostot poistetaan, itse viestit säilyvät.", "RetentionPolicy_MaxAge": "Viestin maksimi-ikä", + "RetentionPolicy_MaxAge_Channels": "Viestin maksimi-ikä kanavilla", + "RetentionPolicy_MaxAge_Description": "Karsi kaikki viestit, jotka ovat vanhempia kuin tämä arvo (päiviä)", + "RetentionPolicy_MaxAge_DMs": "Viestin maksimi-ikä yksityisviesteissä", + "RetentionPolicy_MaxAge_Groups": "Viestin maksimi-ikä yksityisissä ryhmissä", "RetentionPolicy_Precision": "Ajastimen tarkkuus", "RetentionPolicy_Precision_Description": "Karsinta-ajastimen suoritustiheys. Tarkan arvon määritys toimii paremmin kanavilla, joilla on nopeat säilytysajastimet, mutta käsittelyteho saattaa kärsiä suurissa yhteisÃļissä.", "RetentionPolicyRoom_Enabled": "Karsi vanhat viestit automaattisesti", @@ -5743,4 +5750,4 @@ "Theme_Appearence": "Teeman ulkoasu", "Enterprise": "Yritys", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/fr.i18n.json b/packages/i18n/src/locales/fr.i18n.json index c20361ae9329..84d33eaf5330 100644 --- a/packages/i18n/src/locales/fr.i18n.json +++ b/packages/i18n/src/locales/fr.i18n.json @@ -232,6 +232,7 @@ "Accounts_ShowFormLogin": "Afficher le formulaire de connexion par dÊfaut", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled": "Activer l'authentification à deux facteurs via TOTP", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled_Description": "Les utilisateurs peuvent configurer l'authentification à deux facteurs via n'importe quelle application TOTP, comme Google Authenticateur ou Authy.", + "Calls_in_queue_many": "{{count}} appels en file d'attente", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Activer automatiquement l'authentification à deux facteurs par e-mail pour les nouveaux utilisateurs", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "L'authentification à deux facteurs par e-mail sera activÊe par dÊfaut pour les nouveaux utilisateurs. Ils pourront la dÊsactiver dans leur page de profil.", "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "DÊlai d'expiration du code envoyÊ par e-mail (en secondes)", @@ -277,7 +278,6 @@ "add-livechat-department-agents_description": "Autorisation d'ajouter des agents omnicanaux aux dÊpartements", "add-oauth-service": "Ajouter un service Oauth", "add-oauth-service_description": "Autorisation d'ajouter un nouveau service Oauth", - "Calls_in_queue_many": "{{count}} appels en file d'attente", "add-user": "Ajouter un utilisateur", "add-user_description": "Autorisation d'ajouter de nouveaux utilisateurs au serveur via l'Êcran des utilisateurs", "add-user-to-any-c-room": "Ajouter un utilisateur à un canal public", @@ -751,6 +751,7 @@ "CAS_enabled": "ActivÊ", "CAS_Login_Layout": "PrÊsentation de la connexion CAS", "CAS_login_url": "URL de connexion SSO", + "message_counter_many": "{{count}} messages", "CAS_login_url_Description": "URL de connexion de votre service SSO externe, par exemple : `https://sso.example.undef/sso/login`", "CAS_popup_height": "Hauteur de la fenÃĒtre contextuelle de connexion", "CAS_popup_width": "Largeur de la fenÃĒtre contextuelle de connexion", @@ -766,6 +767,7 @@ "Categories*": "CatÊgories*", "CDN_JSCSS_PREFIX": "PrÊfixe CDN pour JS/CSS", "CDN_PREFIX": "PrÊfixe CDN", + "meteor_status_reconnect_in_many": "nouvelle tentative dans {{count}} secondes...", "CDN_PREFIX_ALL": "Utiliser le prÊfixe CDN pour toutes les ressources", "Certificates_and_Keys": "Certificats et clÊs", "change-livechat-room-visitor": "Modifier les visiteurs des salons Livechat", @@ -944,7 +946,6 @@ "Contact_not_found": "Contact introuvable", "Contact_Profile": "Profil de contact", "Contact_Info": "Informations de contact", - "message_counter_many": "{{count}} messages", "Content": "Contenu", "Continue": "Continuer", "Continuous_sound_notifications_for_new_livechat_room": "Notifications sonores continues pour le nouveau salon omnicanal", @@ -959,7 +960,6 @@ "Conversations": "Conversations", "Conversations_per_day": "Conversations par jour", "Convert": "Convertir", - "meteor_status_reconnect_in_many": "nouvelle tentative dans {{count}} secondes...", "Convert_Ascii_Emojis": "Convertir le code ASCII en emoji", "Convert_to_channel": "Convertir en canal", "Converting_channel_to_a_team": "Vous convertissez ce canal en Êquipe. Tous les membres seront conservÊs.", @@ -3535,6 +3535,9 @@ "RetentionPolicy_Advanced_Precision": "Utiliser la configuration de la politique de rÊtention avancÊe", "RetentionPolicy_Advanced_Precision_Cron": "Utiliser cron pour la politique de rÊtention avancÊe", "RetentionPolicy_Advanced_Precision_Cron_Description": "FrÊquence d'exÊcution du temporisateur d'Êlagage dÊfinie par l'expression de la tÃĸche cron. Une valeur plus prÊcise amÊliore le fonctionnement des canaux avec des temporisateurs de rÊtention rapides, mais le coÃģt en termes de puissance de traitement peut ÃĒtre ÊlevÊ pour les grandes communautÊs.", + "RetentionPolicy_AppliesToChannels": "S'applique aux canaux", + "RetentionPolicy_AppliesToDMs": "S'applique aux messages directs", + "RetentionPolicy_AppliesToGroups": "S'applique aux groupes privÊs", "RetentionPolicy_Description": "Élague automatiquement les anciens messages de votre instance Rocket.Chat.", "RetentionPolicy_DoNotPruneDiscussion": "Ne pas Êlaguer les messages de discussion", "RetentionPolicy_DoNotPrunePinned": "Ne pas Êlaguer les messages ÊpinglÊs", @@ -3544,6 +3547,10 @@ "RetentionPolicy_FilesOnly": "Supprimer uniquement les fichiers", "RetentionPolicy_FilesOnly_Description": "Seuls les fichiers seront supprimÊs, les messages eux-mÃĒmes seront conservÊs.", "RetentionPolicy_MaxAge": "Âge maximal des messages", + "RetentionPolicy_MaxAge_Channels": "Âge maximal des messages dans les canaux", + "RetentionPolicy_MaxAge_Description": "Élaguer tous les messages plus anciens que cette valeur, en jours", + "RetentionPolicy_MaxAge_DMs": "Âge maximal des messages dans les messages directs", + "RetentionPolicy_MaxAge_Groups": "Âge maximal des messages dans les groupes privÊs", "RetentionPolicy_Precision": "PrÊcision du temporisateur", "RetentionPolicy_Precision_Description": "FrÊquence d'exÊcution du temporisateur d'Êlagage. Une valeur plus prÊcise amÊliore le fonctionnement des canaux avec des temporisateurs de rÊtention rapides, mais le coÃģt en termes de puissance de traitement peut ÃĒtre ÊlevÊ pour les grandes communautÊs.", "RetentionPolicyRoom_Enabled": "Élaguer automatiquement les anciens messages", @@ -4880,4 +4887,4 @@ "Enterprise": "Entreprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analyses", "UpgradeToGetMore_auditing_Title": "Audit des messages" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/hi-IN.i18n.json b/packages/i18n/src/locales/hi-IN.i18n.json index d68f9e2d8d08..1049d8495d86 100644 --- a/packages/i18n/src/locales/hi-IN.i18n.json +++ b/packages/i18n/src/locales/hi-IN.i18n.json @@ -1,9 +1,29 @@ { "500": "ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤¸ā¤°āĨā¤ĩā¤° ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "__agents__agents_and__count__conversations__period__": "{{agents}} ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤”ā¤° {{count}} ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤, {{period}}", + "__count__empty_rooms_will_be_removed_automatically": "{{count}} ā¤–ā¤žā¤˛āĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} ā¤–ā¤žā¤˛āĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡:
    {{rooms}}āĨ¤", + "__count__message_pruned": "{{count}} ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•ā¤žā¤Ÿ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "__count__conversations__period__": "{{count}} ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤, {{period}}", + "__count__tags__and__count__conversations__period__": "{{count}} ā¤ŸāĨˆā¤— ā¤”ā¤° {{conversations}} ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤, {{period}}", + "__departments__departments_and__count__conversations__period__": "{{departments}} ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤”ā¤° {{count}} ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤, {{period}}", + "__usersCount__member_joined": "+ {{usersCount}} ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨā¤", + "__usersCount__people_will_be_invited": "{{usersCount}} ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", "__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}}", + "__count__without__department__": "ā¤Ŧā¤ŋā¤¨ā¤ž ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‡ {{count}}", + "__count__without__tags__": "ā¤Ŧā¤ŋā¤¨ā¤ž ā¤ŸāĨˆā¤— ā¤•āĨ‡ {{count}}", + "__count__without__assignee__": "{{count}} ā¤Ŧā¤ŋā¤¨ā¤ž ā¤…ā¤¸ā¤žā¤‡ā¤¨āĨ€ ā¤•āĨ‡", + "removed__username__as__role_": "{{username}} ā¤•āĨ‹ {{role}} ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "set__username__as__role_": "{{username}} ā¤•āĨ‹ {{role}} ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "This_room_encryption_has_been_enabled_by__username_": "ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ {{username}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "This_room_encryption_has_been_disabled_by__username_": "ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ {{username}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Third_party_login": "ā¤¤āĨƒā¤¤āĨ€ā¤¯-ā¤Ēā¤•āĨā¤ˇ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨", + "Enabled_E2E_Encryption_for_this_room": "ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "disabled": "ā¤…ā¤•āĨā¤ˇā¤Ž", + "Disabled_E2E_Encryption_for_this_room": "ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤•āĨā¤ˇā¤Ž E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨", "@username": "@ā¤¯āĨ‚āĨ›ā¤°ā¤¨āĨ‡ā¤Ž", - "@username_message": "@ā¤¯āĨ‚āĨ›ā¤°ā¤¨āĨ‡ā¤Ž ", + "@username_message": "@ā¤¯āĨ‚āĨ›ā¤°ā¤¨āĨ‡ā¤Ž ", "#channel": "#ā¤šāĨˆā¤¨ā¤˛", "%_of_conversations": "% ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", "0_Errors_Only": "0 - ā¤¤āĨā¤°āĨā¤Ÿā¤ŋā¤¯ā¤žā¤‚ ā¤•āĨ‡ā¤ĩā¤˛", @@ -11,18 +31,38 @@ "2_Erros_Information_and_Debug": "2 - ā¤¤āĨā¤°āĨā¤Ÿā¤ŋā¤¯ā¤žā¤‚, ā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤”ā¤° ā¤Ąā¤ŋā¤Ŧā¤—", "12_Hour": "12-ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤•āĨ€ ā¤˜ā¤Ąā¤ŧāĨ€", "24_Hour": "24-ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤•āĨ€ ā¤˜ā¤Ąā¤ŧāĨ€", + "A_cloud-based_platform_for_those_needing_a_plug-and-play_app": "ā¤ĒāĨā¤˛ā¤—-ā¤ā¤‚ā¤Ą-ā¤ĒāĨā¤˛āĨ‡ ā¤ā¤Ē ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤ĩā¤žā¤˛āĨ‡ ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą-ā¤†ā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤Ÿā¤Ģā¤ŧāĨ‰ā¤°āĨā¤ŽāĨ¤", + "A_new_owner_will_be_assigned_automatically_to__count__rooms": "ā¤ā¤• ā¤¨ā¤ ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ {{count}} ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨŒā¤‚ā¤Ēā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "A_new_owner_will_be_assigned_automatically_to_the__roomName__room": "ā¤ā¤• ā¤¨ā¤ ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ {{roomName}} ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤­ā¤žā¤° ā¤¸āĨŒā¤‚ā¤Ēā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "A_new_owner_will_be_assigned_automatically_to_those__count__rooms__rooms__": "ā¤ā¤• ā¤¨ā¤ ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤‰ā¤¨ {{count}} ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨŒā¤‚ā¤Ēā¤ž ā¤œā¤žā¤ā¤—ā¤ž:
    {{rooms}}āĨ¤", + "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤”ā¤° ā¤…ā¤¤āĨā¤¯ā¤§ā¤ŋā¤• ā¤¨ā¤ŋā¤œāĨ€ ā¤¸āĨā¤ĩ-ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨āĨ¤", + "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "ā¤ā¤• ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤•āĨ‹ ā¤ā¤• ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤”ā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "An_app_needs_to_be_installed_and_configured": "ā¤ā¤• ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤”ā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž.", + "Accessibility": "ā¤¸ā¤°ā¤˛ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—", + "Accessibility_and_Appearance": "ā¤Ēā¤šāĨā¤‚ā¤š ā¤ā¤ĩā¤‚ ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Accessibility_activation": "ā¤¯ā¤šā¤žā¤‚ ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤ŋā¤‚ā¤— ā¤…ā¤¨āĨā¤­ā¤ĩ ā¤•āĨ‹ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ˆ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤•āĨ€ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤žā¤ā¤‚ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Accept_Call": "ā¤•āĨ‰ā¤˛ ā¤˛āĨ‡ā¤¨ā¤ž", "Accept": "ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "ā¤¯ā¤Ļā¤ŋ ā¤•āĨ‹ā¤ˆ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤­āĨ€ ā¤‡ā¤¨ā¤•ā¤Žā¤ŋā¤‚ā¤— ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Accept_new_livechats_when_agent_is_idle": "ā¤œā¤Ŧ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ ā¤¤āĨ‹ ā¤¨ā¤ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", "Accept_with_no_online_agents": "ā¤•āĨ‹ā¤ˆ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", "Access_not_authorized": "ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", "Access_Token_URL": "ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ URL", + "Access_Your_Account": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤–ā¤žā¤¤āĨ‡ ā¤Ēā¤° ā¤Ēā¤šāĨā¤‚ā¤š", + "access_your_basic_information": "ā¤…ā¤Ēā¤¨āĨ€ ā¤ŦāĨā¤¨ā¤ŋā¤¯ā¤žā¤ĻāĨ€ ā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤•ā¤ž ā¤†ā¤‚ā¤•ā¤˛ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", "access-mailer": "ā¤ŽāĨ‡ā¤˛ā¤° ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•ā¤°āĨ‡ā¤‚", "access-mailer_description": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Ŧā¤Ąā¤ŧāĨ‡ ā¤ĒāĨˆā¤Žā¤žā¤¨āĨ‡ ā¤Ēā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋāĨ¤", + "access-marketplace": "ā¤Ŧā¤žā¤œā¤ŧā¤žā¤° ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "access-marketplace_description": "ā¤Ŧā¤žā¤œā¤ŧā¤žā¤° ā¤¸āĨ‡ ā¤ā¤ĒāĨā¤¸ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", "access-permissions": "ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•ā¤°āĨ‡ā¤‚", "access-permissions_description": "ā¤ĩā¤ŋā¤­ā¤ŋā¤¨āĨā¤¨ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "access-setting-permissions": "ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—-ā¤†ā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "access-setting-permissions_description": "ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—-ā¤†ā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", "Accessing_permissions": "ā¤…ā¤•āĨā¤¸āĨ‡ā¤¸āĨā¤¸ā¤ŋā¤‚ā¤— ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", "Account_SID": "ā¤–ā¤žā¤¤ā¤ž ā¤ā¤¸ā¤†ā¤ˆā¤ĄāĨ€", + "Account": "ā¤–ā¤žā¤¤ā¤ž", "Accounts": "ā¤–ā¤žā¤¤ā¤ž", + "Accounts_Description": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤–ā¤žā¤¤ā¤ž ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚.", "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.

    ", @@ -31,12 +71,17 @@ "Accounts_AllowDeleteOwnAccount": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_AllowedDomainsList": "ā¤…ā¤¨āĨā¤Žā¤¤ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤¸āĨ‚ā¤šāĨ€", "Accounts_AllowedDomainsList_Description": "ā¤…ā¤¨āĨā¤Žā¤¤ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤•āĨ€ ā¤•āĨ‹ā¤Žā¤ž-ā¤ĒāĨƒā¤Ĩā¤• ā¤¸āĨ‚ā¤šāĨ€", + "Accounts_AllowInvisibleStatusOption": "ā¤…ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_AllowEmailChange": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Accounts_AllowEmailNotifications": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Accounts_AllowFeaturePreview": "ā¤Ģā¤ŧāĨ€ā¤šā¤° ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_AllowPasswordChange": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Accounts_AllowPasswordChangeForOAuthUsers": "OAuth ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_AllowRealNameChange": "ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_AllowUserAvatarChange": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_AllowUsernameChange": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_AllowUserProfileChange": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Accounts_AllowUserStatusMessageChange": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_AvatarBlockUnauthenticatedAccess": "ā¤…ā¤ĒāĨā¤ˇāĨā¤Ÿ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•āĨ‹ ā¤…ā¤ĩā¤¤ā¤žā¤°āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", "Accounts_AvatarCacheTime": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•āĨˆā¤ļ ā¤¸ā¤Žā¤¯", "Accounts_AvatarCacheTime_description": "HTTP ā¤ĒāĨā¤°āĨ‹ā¤ŸāĨ‹ā¤•āĨ‰ā¤˛ ā¤•āĨ‹ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤›ā¤ĩā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•āĨˆā¤ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤Ŧā¤¤ā¤žā¤ˆ ā¤—ā¤ˆ ā¤šāĨˆāĨ¤", @@ -52,11 +97,14 @@ "Accounts_CustomFieldsToShowInUserInfo": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤", "Accounts_Default_User_Preferences": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤‚", "Accounts_Default_User_Preferences_audioNotifications": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", + "Accounts_Default_User_Preferences_alsoSendThreadToChannel_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤­āĨ€ ā¤­āĨ‡ā¤œāĨ‡ā¤‚ ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤° ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", "Accounts_Default_User_Preferences_desktopNotifications": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", "Accounts_Default_User_Preferences_pushNotifications": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", "Accounts_Default_User_Preferences_not_available": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛, ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤ĩāĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤¸āĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤šāĨˆā¤‚", + "Accounts_Default_User_Preferences_showThreadsInMainChannel_Description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤ĨāĨā¤°āĨ‡ā¤Ą ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ā¤°āĨā¤—ā¤¤ ā¤¸ā¤­āĨ€ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤­āĨ€ ā¤¸āĨ€ā¤§āĨ‡ ā¤ŽāĨā¤–āĨā¤¯ ā¤•ā¤•āĨā¤ˇ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤ĒāĨā¤°āĨ‡ā¤ˇā¤• ā¤•āĨ€ ā¤Ēā¤¸ā¤‚ā¤Ļ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤ĨāĨā¤°āĨ‡ā¤Ą ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", "Accounts_DefaultUsernamePrefixSuggestion": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤‰ā¤Ēā¤¸ā¤°āĨā¤— ā¤¸āĨā¤ā¤žā¤ĩ", "Accounts_denyUnverifiedEmail": "ā¤…ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_Directory_DefaultView": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž ā¤¸āĨ‚ā¤šāĨ€", "Accounts_Email_Activated": "[name]

    ā¤†ā¤Ēā¤•ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤Ĩā¤žāĨ¤

    ", "Accounts_Email_Activated_Subject": "ā¤–ā¤žā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", "Accounts_Email_Approved": "[name]

    ā¤†ā¤Ēā¤•ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤žāĨ¤

    ", @@ -76,18 +124,36 @@ "Accounts_iframe_url": "Iframe URL", "Accounts_LoginExpiration": "ā¤Ļā¤ŋā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤•āĨ€ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ", "Accounts_ManuallyApproveNewUsers": "ā¤¨ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤¨āĨā¤ŽāĨ‹ā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_OAuth_Apple": "Apple ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_OAuth_Apple_Description": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤•ā¤ŋ Apple ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•āĨ‡ā¤ĩā¤˛ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤Ēā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹, ā¤¤āĨ‹ ā¤†ā¤Ē ā¤¸ā¤­āĨ€ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Accounts_OAuth_Custom_Access_Token_Param": "ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤°ā¤Ž ā¤¨ā¤žā¤Ž", "Accounts_OAuth_Custom_Authorize_Path": "ā¤Ēā¤Ĩ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_OAuth_Custom_Avatar_Field": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", "Accounts_OAuth_Custom_Button_Color": "ā¤Ŧā¤Ÿā¤¨ ā¤•ā¤ž ā¤°ā¤‚ā¤—", "Accounts_OAuth_Custom_Button_Label_Color": "ā¤Ŧā¤Ÿā¤¨ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤°ā¤‚ā¤—", "Accounts_OAuth_Custom_Button_Label_Text": "ā¤Ŧā¤Ÿā¤¨ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", + "Accounts_OAuth_Custom_Channel_Admin": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°", + "Accounts_OAuth_Custom_Channel_Map": "OAuth ā¤¸ā¤ŽāĨ‚ā¤š ā¤šāĨˆā¤¨ā¤˛ ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°", + "Accounts_OAuth_Custom_Email_Field": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", "Accounts_OAuth_Custom_Enable": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_OAuth_Custom_Groups_Claim": "ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨˆā¤Ēā¤ŋā¤‚ā¤— ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤/ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", "Accounts_OAuth_Custom_id": "Id", "Accounts_OAuth_Custom_Identity_Path": "ā¤Ēā¤šā¤šā¤žā¤¨ ā¤Ēā¤Ĩ", - "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž", + "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "ā¤•āĨ‡ ā¤œā¤°ā¤ŋā¤ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž", + "Accounts_OAuth_Custom_Key_Field": "ā¤•āĨā¤‚ā¤œāĨ€ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", "Accounts_OAuth_Custom_Login_Style": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ļāĨˆā¤˛āĨ€", + "Accounts_OAuth_Custom_Map_Channels": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤“ā¤‚/ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤Ēā¤° ā¤ŽāĨˆā¤Ē ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_OAuth_Custom_Merge_Roles": "SSO ā¤¸āĨ‡ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤Žā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", "Accounts_OAuth_Custom_Merge_Users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Žā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_OAuth_Custom_Merge_Users_Distinct_Services": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤˛ā¤—-ā¤…ā¤˛ā¤— ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤¸āĨ‡ ā¤Žā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_OAuth_Custom_Merge_Users_Distinct_Services_Description": "ā¤œā¤Ŧ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤•āĨā¤‚ā¤œāĨ€ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•ā¤ŋā¤¸āĨ€ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨ‡ ā¤ŽāĨ‡ā¤˛ ā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤‡ā¤¸ OAuth ā¤¸āĨ‡ā¤ĩā¤ž ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ€ ā¤ŽāĨ‚ā¤˛ ā¤¸āĨ‡ā¤ĩā¤ž ā¤•āĨ€ ā¤Ēā¤°ā¤ĩā¤žā¤š ā¤•ā¤ŋā¤ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤˛ā¤¯ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚āĨ¤", + "Accounts_OAuth_Custom_Name_Field": "ā¤¨ā¤žā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "Accounts_OAuth_Custom_Roles_Claim": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤/ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¨ā¤žā¤Ž", + "Accounts_OAuth_Custom_Roles_To_Sync": "ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤", + "Accounts_OAuth_Custom_Roles_To_Sync_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤”ā¤° ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ ā¤Ēā¤° ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ OAuth ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ (ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤—)āĨ¤", "Accounts_OAuth_Custom_Scope": "ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", "Accounts_OAuth_Custom_Secret": "ā¤—āĨā¤ĒāĨā¤¤", + "Accounts_OAuth_Custom_Show_Button_On_Login_Page": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‡ā¤œ ā¤Ēā¤° ā¤Ŧā¤Ÿā¤¨ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", "Accounts_OAuth_Custom_Token_Path": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤Ēā¤Ĩ", "Accounts_OAuth_Custom_Token_Sent_Via": "ā¤•āĨ‡ ā¤œā¤°ā¤ŋā¤ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž", "Accounts_OAuth_Custom_Username_Field": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", @@ -111,6 +177,7 @@ "Accounts_OAuth_Gitlab_callback_url": "GitLab ā¤•āĨ‰ā¤˛ā¤ŦāĨˆā¤• URL", "Accounts_OAuth_Gitlab_id": "Gitlab Id", "Accounts_OAuth_Gitlab_identity_path": "ā¤Ēā¤šā¤šā¤žā¤¨ ā¤Ēā¤Ĩ", + "Accounts_OAuth_Gitlab_merge_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Žā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", "Accounts_OAuth_Gitlab_secret": "ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ Secret", "Accounts_OAuth_Google": "Google ā¤˛āĨ‰ā¤—ā¤ŋā¤¨", "Accounts_OAuth_Google_callback_url": "Google ā¤•āĨ‰ā¤˛ā¤ŦāĨˆā¤• URL", @@ -125,7 +192,10 @@ "Accounts_OAuth_Meteor_id": "Meteor Id", "Accounts_OAuth_Meteor_secret": "Meteor Secret", "Accounts_OAuth_Nextcloud": "OAuth ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Accounts_OAuth_Nextcloud_callback_url": "ā¤¨āĨ‡ā¤•āĨā¤¸āĨā¤Ÿā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•āĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Accounts_OAuth_Nextcloud_id": "ā¤¨āĨ‡ā¤•āĨā¤¸āĨā¤Ÿā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤†ā¤ˆā¤ĄāĨ€", "Accounts_OAuth_Nextcloud_secret": "ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ Secret", + "Accounts_OAuth_Nextcloud_URL": "ā¤¨āĨ‡ā¤•āĨā¤¸āĨā¤Ÿā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", "Accounts_OAuth_Proxy_host": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤šāĨ‹ā¤¸āĨā¤Ÿ", "Accounts_OAuth_Proxy_services": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤", "Accounts_OAuth_Tokenpass": "Tokenpass ā¤˛āĨ‰ā¤—ā¤‡ā¤¨", @@ -152,65 +222,5918 @@ "Accounts_Password_Policy_AtLeastOneLowercase_Description": "ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤˛āĨ‹ā¤…ā¤°ā¤•āĨ‡ā¤¸ ā¤ĩā¤°āĨā¤Ŗ ā¤šāĨ‹āĨ¤", "Accounts_Password_Policy_AtLeastOneNumber": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤¨ā¤‚ā¤Ŧā¤°", "Accounts_Password_Policy_AtLeastOneNumber_Description": "ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤ā¤• ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žā¤¤āĨā¤Žā¤• ā¤šā¤°ā¤ŋā¤¤āĨā¤° ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Accounts_Password_Policy_AtLeastOneSpecialCharacter": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•", + "Accounts_Password_Policy_AtLeastOneSpecialCharacter_Description": "ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ā¤…ā¤•āĨā¤ˇā¤° ā¤šāĨ‹āĨ¤", + "Accounts_Password_Policy_AtLeastOneUppercase": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤…ā¤Ēā¤°ā¤•āĨ‡ā¤¸", "Accounts_Password_Policy_AtLeastOneUppercase_Description": "ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤˛āĨ‹ā¤…ā¤°ā¤•āĨ‡ā¤¸ ā¤ĩā¤°āĨā¤Ŗ ā¤šāĨ‹āĨ¤", + "Accounts_Password_Policy_Enabled": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¨āĨ€ā¤¤ā¤ŋ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_Password_Policy_Enabled_Description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‹ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤¨āĨ€ā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•ā¤ž ā¤Ēā¤žā¤˛ā¤¨ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤ ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚: ā¤¯ā¤š ā¤•āĨ‡ā¤ĩā¤˛ ā¤¨ā¤ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ēā¤° ā¤˛ā¤žā¤—āĨ‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ, ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ēā¤° ā¤¨ā¤šāĨ€ā¤‚āĨ¤", + "Accounts_Password_Policy_ForbidRepeatingCharacters": "ā¤…ā¤•āĨā¤ˇā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Žā¤¨ā¤ž ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_Password_Policy_ForbidRepeatingCharacters_Description": "ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤ā¤•-ā¤ĻāĨ‚ā¤¸ā¤°āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤—ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤¸ā¤Žā¤žā¤¨ ā¤…ā¤•āĨā¤ˇā¤° ā¤¨ ā¤šāĨ‹ā¤‚āĨ¤", + "Accounts_Password_Policy_ForbidRepeatingCharactersCount": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ĩ ā¤ĩā¤žā¤˛āĨ‡ ā¤…ā¤•āĨā¤ˇā¤°", + "Accounts_Password_Policy_ForbidRepeatingCharactersCount_Description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤Ēā¤žā¤¤āĨā¤° ā¤•āĨ‹ ā¤Ēā¤šā¤˛āĨ‡ ā¤•ā¤ŋā¤¤ā¤¨āĨ€ ā¤Ŧā¤žā¤° ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤‡ā¤¸ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "Accounts_Password_Policy_MaxLength": "ā¤œāĨā¤¯ā¤žā¤Ļā¤ž ā¤¸āĨ‡ ā¤œāĨā¤¯ā¤žā¤Ļā¤ž ā¤˛ā¤‚ā¤Ŧā¤žā¤ˆ", + "Accounts_Password_Policy_MaxLength_Description": "ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤‡ā¤¸ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤…ā¤•āĨā¤ˇā¤° ā¤¨ ā¤šāĨ‹ā¤‚āĨ¤ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `-1` ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚.", + "Accounts_Password_Policy_MinLength": "ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ā¤˛ā¤‚ā¤Ŧā¤žā¤ˆ", + "Accounts_Password_Policy_MinLength_Description": "ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤‡ā¤¤ā¤¨āĨ‡ ā¤…ā¤•āĨā¤ˇā¤° ā¤šāĨ‹ā¤¨āĨ‡ ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `-1` ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚.", + "Accounts_PasswordReset": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ", + "Accounts_Registration_AuthenticationServices_Default_Roles": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤", + "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ (ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤—) ā¤ĻāĨ€ ā¤œā¤žā¤ā¤‚ā¤—āĨ€", + "Accounts_Registration_AuthenticationServices_Enabled": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ", + "Accounts_Registration_Users_Default_Roles": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤", + "Accounts_Registration_Users_Default_Roles_Description": "ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ (ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤¸ā¤šā¤ŋā¤¤) ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤‚ (ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤—) ā¤ĻāĨ€ ā¤œā¤žā¤ā¤‚ā¤—āĨ€", + "Accounts_Registration_Users_Default_Roles_Enabled": "ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_Registration_InviteUrlType": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ URL ā¤ĒāĨā¤°ā¤•ā¤žā¤°", "Accounts_Registration_InviteUrlType_Direct": "ā¤¸āĨ€ā¤§ā¤ž", + "Accounts_Registration_InviteUrlType_Proxy": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤¨ā¤ŋā¤§ā¤ŋ", "Accounts_RegistrationForm": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤Ēā¤¤āĨā¤°", "Accounts_RegistrationForm_Disabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Accounts_RegistrationForm_LinkReplacementText": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĢāĨ‰ā¤°āĨā¤Ž ā¤˛ā¤ŋā¤‚ā¤• ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨ ā¤Ēā¤žā¤ ", "Accounts_RegistrationForm_Public": "ā¤œā¤¨ā¤¤ā¤ž", + "Accounts_RegistrationForm_Secret_URL": "ā¤—āĨā¤ĒāĨā¤¤ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Accounts_RegistrationForm_SecretURL": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨā¤°ā¤Ēā¤¤āĨā¤° ā¤—āĨā¤ĒāĨā¤¤ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Accounts_RegistrationForm_SecretURL_Description": "ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤¯ā¤žā¤ĻāĨƒā¤šāĨā¤›ā¤ŋā¤• ā¤¸āĨā¤ŸāĨā¤°ā¤ŋā¤‚ā¤— ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€ ā¤œāĨ‹ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ URL ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧāĨ€ ā¤œā¤žā¤ā¤—āĨ€āĨ¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `https://open.rocket.chat/register/[secret_hash]`", + "Accounts_RequireNameForSignUp": "ā¤¸ā¤žā¤‡ā¤¨ā¤…ā¤Ē ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤žā¤Ž ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Accounts_RequirePasswordConfirmation": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Accounts_RoomAvatarExternalProviderUrl": "ā¤•ā¤•āĨā¤ˇ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Accounts_RoomAvatarExternalProviderUrl_Description": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `https://acme.com/api/v1/{roomId}`", + "Accounts_SearchFields": "ā¤–āĨ‹ā¤œ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤šā¤žā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "Accounts_Send_Email_When_Activating": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Accounts_Send_Email_When_Deactivating": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Accounts_Set_Email_Of_External_Accounts_as_Verified": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‹ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€, ā¤“ā¤ā¤Ĩ ā¤†ā¤Ļā¤ŋ ā¤œāĨˆā¤¸āĨ€ ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤¸āĨ‡ ā¤Ŧā¤¨ā¤žā¤ ā¤—ā¤ ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡", + "Accounts_SetDefaultAvatar": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_SetDefaultAvatar_Description": "OAuth ā¤–ā¤žā¤¤āĨ‡ ā¤¯ā¤ž Gravatar ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Accounts_ShowFormLogin": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĢāĨ‰ā¤°āĨā¤Ž ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Accounts_TwoFactorAuthentication_By_TOTP_Enabled": "ā¤ŸāĨ€ā¤“ā¤ŸāĨ€ā¤ĒāĨ€ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_TwoFactorAuthentication_By_TOTP_Enabled_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž Google Authenticator ā¤¯ā¤ž Authy ā¤œāĨˆā¤¸āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ TOTP ā¤ā¤Ē ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤…ā¤Ēā¤¨ā¤ž ā¤ŸāĨ‚ ā¤ĢāĨˆā¤•āĨā¤Ÿā¤° ā¤‘ā¤ĨāĨ‡ā¤‚ā¤Ÿā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ŸāĨ‚ ā¤ĢāĨˆā¤•āĨā¤Ÿā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤‘ā¤ŸāĨ‹ ā¤‘ā¤ĒāĨā¤Ÿ ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "ā¤¨ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤—ā¤žāĨ¤ ā¤ĩāĨ‡ ā¤‡ā¤¸āĨ‡ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤¸ā¤•āĨ‡ā¤‚ā¤—āĨ‡.", + "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤•āĨ‹ā¤Ą ā¤•āĨ‹ ā¤¸āĨ‡ā¤•ā¤‚ā¤ĄāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "Accounts_TwoFactorAuthentication_By_Email_Enabled": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "ā¤œā¤ŋā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤šāĨˆ ā¤”ā¤° ā¤‰ā¤¨ā¤•āĨ‡ ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ, ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤•āĨā¤› ā¤•ā¤žā¤°āĨā¤¯āĨ‹ā¤‚ ā¤œāĨˆā¤¸āĨ‡ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨, ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤šāĨ‡ā¤œā¤¨ā¤ž ā¤†ā¤Ļā¤ŋ ā¤•āĨ‹ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤•āĨ‹ā¤Ą ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "Accounts_TwoFactorAuthentication_Enabled": "ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_TwoFactorAuthentication_Enabled_Description": "ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¸ā¤­āĨ€ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤° ā¤ĻāĨ‡ā¤—āĨ€āĨ¤\nā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ŧā¤žā¤§āĨā¤¯ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤•āĨ‹ ā¤‡ā¤¸āĨ‡ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ 'ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž' ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤•āĨ‹ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "Accounts_TwoFactorAuthentication_Enforce_Password_Fallback": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ģā¤ŧāĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_TwoFactorAuthentication_Enforce_Password_Fallback_Description": "ā¤¯ā¤Ļā¤ŋ ā¤‰ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤…ā¤¨āĨā¤¯ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤”ā¤° ā¤‰ā¤¸ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤Žā¤šā¤¤āĨā¤ĩā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤•ā¤žā¤°āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Žā¤œā¤ŦāĨ‚ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", "Accounts_TwoFactorAuthentication_MaxDelta": "soochna", + "Accounts_TwoFactorAuthentication_MaxDelta_Description": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤ĄāĨ‡ā¤˛āĨā¤Ÿā¤ž ā¤¯ā¤š ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¸ā¤Žā¤¯ ā¤•ā¤ŋā¤¤ā¤¨āĨ‡ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤ĩāĨˆā¤§ ā¤šāĨˆā¤‚āĨ¤ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤šā¤° 30 ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤”ā¤° (30 * ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤ĄāĨ‡ā¤˛āĨā¤Ÿā¤ž) ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨˆā¤§ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤\nā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤ĄāĨ‡ā¤˛āĨā¤Ÿā¤ž 10 ā¤Ēā¤° ā¤¸āĨ‡ā¤Ÿ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤‰ā¤¸ā¤•āĨ‡ ā¤Ÿā¤žā¤‡ā¤Žā¤¸āĨā¤ŸāĨˆā¤ŽāĨā¤Ē ā¤¸āĨ‡ 300 ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤Ēā¤šā¤˛āĨ‡ ā¤¯ā¤ž ā¤Ŧā¤žā¤Ļ ā¤¤ā¤• ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¯ā¤š ā¤¤ā¤Ŧ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—āĨ€ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤Ŧ ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤•āĨ€ ā¤˜ā¤Ąā¤ŧāĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ āĨ€ā¤• ā¤¸āĨ‡ ā¤¸ā¤Žā¤¨āĨā¤ĩā¤¯ā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Accounts_TwoFactorAuthentication_RememberFor": "(ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą) ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤¯ā¤žā¤Ļ ā¤°ā¤–āĨ‡ā¤‚", + "Accounts_TwoFactorAuthentication_RememberFor_Description": "ā¤¯ā¤Ļā¤ŋ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤žā¤§ā¤ŋā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ā¤Ą ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤Žā¤¯ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨ‹ ā¤¤āĨ‹ ā¤‰ā¤¸ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Accounts_UseDefaultBlockedDomainsList": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤¸āĨ‚ā¤šāĨ€ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_UseDNSDomainCheck": "DNS ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤œā¤žā¤ā¤š ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "API_EmbedDisabledFor": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤‚ā¤ŦāĨ‡ā¤Ą ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Accounts_UserAddedEmail_Default": "

    [ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¨ā¤žā¤Ž] ā¤ŽāĨ‡ā¤‚ ā¤†ā¤Ēā¤•ā¤ž ā¤¸āĨā¤ĩā¤žā¤—ā¤¤ ā¤šāĨˆ

    [Site_URL] ā¤Ēā¤° ā¤œā¤žā¤ā¤ ā¤”ā¤° ā¤†ā¤œ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¸ā¤°āĨā¤ĩāĨ‹ā¤¤āĨā¤¤ā¤Ž ā¤“ā¤Ēā¤¨ ā¤¸āĨ‹ā¤°āĨā¤¸ ā¤šāĨˆā¤Ÿ ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨ ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤!

    ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛: [ā¤ˆā¤ŽāĨ‡ā¤˛] ā¤”ā¤° ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą: [ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą] ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤‡ā¤¸āĨ‡ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Accounts_UserAddedEmail_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - `[ā¤¨ā¤žā¤Ž]`, `[fname]`, `[lname]` ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¨ā¤žā¤Ž, ā¤ĒāĨā¤°ā¤Ĩā¤Ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n - `[ā¤ˆā¤ŽāĨ‡ā¤˛]` ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n - ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `[ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą]`āĨ¤\n - ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[Site_Name]` ā¤”ā¤° `[Site_URL]`āĨ¤", + "API_EmbedDisabledFor_Description": "ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤ĄāĨ‡ā¤Ą ā¤˛ā¤ŋā¤‚ā¤• ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤ŽāĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€āĨ¤", + "Accounts_UserAddedEmailSubject_Default": "ā¤†ā¤Ēā¤•āĨ‹ [Site_Name] ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Accounts_Verify_Email_For_External_Accounts": "ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Action": "ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ", + "Action_required": "ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "Action_Available_After_Custom_Content_Added": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¯ā¤š ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—āĨ€", + "Action_Available_After_Custom_Content_Added_And_Visible": "ā¤¯ā¤š ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤”ā¤° ā¤¸ā¤­āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĻāĨƒā¤ļāĨā¤¯ā¤Žā¤žā¤¨ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—āĨ€", + "Activate": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "Active": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "Active_users": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Activity": "ā¤—ā¤¤ā¤ŋā¤ĩā¤ŋā¤§ā¤ŋ", + "Add": "ā¤œāĨ‹ā¤Ąā¤ŧā¤¨ā¤ž", + "Add_a_Message": "ā¤•āĨ‹ā¤ˆ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_agent": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_custom_oauth": "ā¤•ā¤¸āĨā¤Ÿā¤Ž OAuth ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_Domain": "ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_emoji": "ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_files_from": "ā¤¸āĨ‡ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_manager": "ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_monitor": "ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_Reaction": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_Role": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_Sender_To_ReplyTo": "ā¤ĒāĨā¤°āĨ‡ā¤ˇā¤• ā¤•āĨ‹ ā¤‰ā¤¤āĨā¤¤ā¤°-ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_Server": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡", + "Add_URL": "ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_User": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Add_members": "ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-all-to-room": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ā¤• ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-all-to-room_description": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ā¤• ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "add-livechat-department-agents": "ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-livechat-department-agents_description": "ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "add-oauth-service": "OAuth ā¤¸āĨ‡ā¤ĩā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-oauth-service_description": "ā¤¨ā¤ˆ OAuth ā¤¸āĨ‡ā¤ĩā¤ž ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "bypass-time-limit-edit-and-delete": "ā¤¸ā¤Žā¤¯ ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‹ ā¤Ŧā¤žā¤¯ā¤Ēā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "bypass-time-limit-edit-and-delete_description": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤Žā¤¯ ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‹ ā¤Ŧā¤žā¤¯ā¤Ēā¤žā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "add-team-channel": "ā¤ŸāĨ€ā¤Ž ā¤šāĨˆā¤¨ā¤˛ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-team-channel_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤¨ā¤˛ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "add-team-member": "ā¤ŸāĨ€ā¤Ž ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-team-member_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "add-user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-user_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤¨ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "add-user-to-any-c-room": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-user-to-any-c-room_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "add-user-to-any-p-room": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-user-to-any-p-room_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "add-user-to-joined-room": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤šāĨā¤ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "add-user-to-joined-room_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "added__roomName__to_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ #{{roomName}} ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Added__username__to_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ @{{user_added}} ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "added__roomName__to_this_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ #{{roomName}} ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Apps_Framework_enabled": "ā¤ā¤Ē ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤Žā¤ĩā¤°āĨā¤• ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Added__username__to_this_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ @{{user_added}} ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Adding_OAuth_Services": "OAuth ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨ā¤ž", + "Adding_permission": "ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤œāĨ‹ā¤Ąā¤ŧāĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "Adjustable_layout": "ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œāĨā¤¯ ā¤˛āĨ‡ā¤†ā¤‰ā¤Ÿ", + "Adding_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Additional_emails": "ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ˆā¤ŽāĨ‡ā¤˛", "Additional_Feedback": "ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž", + "additional_integrations_Bots": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤¯ā¤š ā¤–āĨ‹ā¤œ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚ ā¤•ā¤ŋ ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ‰ā¤Ÿ ā¤•āĨ‹ ā¤•āĨˆā¤¸āĨ‡ ā¤ā¤•āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤, ā¤¤āĨ‹ ā¤šā¤Žā¤žā¤°āĨ‡ ā¤šā¤ŦāĨ‹ā¤Ÿ ā¤ā¤ĄāĨ‰ā¤ĒāĨā¤Ÿā¤° ā¤•āĨ‡ ā¤…ā¤˛ā¤žā¤ĩā¤ž ā¤•ā¤šāĨ€ā¤‚ ā¤”ā¤° ā¤¨ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚āĨ¤ https://github.com/RocketChat/hubot-rocketchat", + "Admin_disabled_encryption": "ā¤†ā¤Ēā¤•āĨ‡ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨āĨ‡ E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ.", + "Admin_Info": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "admin-no-active-video-conf-provider": "**ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ**: ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ēā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤•ā¤°ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "admin-video-conf-provider-not-configured": "**ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ**: ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ēā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤•ā¤°ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "admin-no-videoconf-provider-app": "**ā¤•āĨ‰ā¤¨āĨā¤ĢāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚**: ā¤•āĨ‰ā¤¨āĨā¤ĢāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤ā¤ĒāĨā¤¸ ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚āĨ¤", + "Administration": "ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨", + "Address": "ā¤Ēā¤¤ā¤ž", + "Adjustable_font_size": "ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œāĨā¤¯ ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤†ā¤•ā¤žā¤°", + "Adjustable_font_size_description": "ā¤‰ā¤¨ ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤œā¤ŧā¤žā¤‡ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤œāĨ‹ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤Ēā¤ ā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ŧā¤Ąā¤ŧāĨ‡ ā¤¯ā¤ž ā¤›āĨ‹ā¤ŸāĨ‡ ā¤Ēā¤žā¤  ā¤•āĨ‹ ā¤Ēā¤¸ā¤‚ā¤Ļ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¯ā¤š ā¤˛ā¤šāĨ€ā¤˛ā¤žā¤Ēā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨ‰ā¤Ģā¤ŧāĨā¤Ÿā¤ĩāĨ‡ā¤¯ā¤° ā¤‡ā¤‚ā¤Ÿā¤°ā¤Ģā¤ŧāĨ‡ā¤¸ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ€ ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤°āĨ‚ā¤Ē ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤ļā¤•āĨā¤¤ ā¤Ŧā¤¨ā¤žā¤•ā¤° ā¤¸ā¤Žā¤žā¤ĩāĨ‡ā¤ļā¤ŋā¤¤ā¤ž ā¤•āĨ‹ ā¤Ŧā¤ĸā¤ŧā¤žā¤ĩā¤ž ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Adult_images_are_not_allowed": "ā¤ĩā¤¯ā¤¸āĨā¤• ā¤›ā¤ĩā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Aerospace_and_Defense": "ā¤ĩā¤ŋā¤Žā¤žā¤¨ā¤¨ ā¤ĩ ā¤°ā¤•āĨā¤ˇā¤ž", + "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "OAuth2 ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤‡ā¤¸ ā¤¸āĨ‚ā¤šāĨ€ ā¤•āĨ‡ ā¤ā¤• URL ā¤Ēā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤†ā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ ā¤ā¤• URL ā¤œāĨ‹ā¤Ąā¤ŧ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚.", + "After_guest_registration": "ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ", + "Agent": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤¨ā¤ŋā¤§ā¤ŋ", + "Agent_added": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Agent_Info": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Agent_messages": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Agent_Name": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Agent_Name_Placeholder": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "Agent_removed": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Agent_deactivated": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Agent_Without_Extensions": "ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "Agents": "ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚", + "Agree": "ā¤¸ā¤šā¤Žā¤¤", + "Alerts": "ā¤…ā¤˛ā¤°āĨā¤Ÿ", + "Alias": "ā¤‰ā¤Ēā¤¨ā¤žā¤Ž", + "Alias_Format": "ā¤…ā¤¨āĨā¤¯ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē", + "Alias_Format_Description": "ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸āĨā¤˛āĨˆā¤• ā¤¸āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚; %s ā¤•āĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤–ā¤žā¤˛āĨ€ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Alias_Set": "ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤¸āĨ‡ā¤Ÿ", + "AutoLinker_Email": "ā¤‘ā¤ŸāĨ‹ā¤˛ā¤ŋā¤‚ā¤•ā¤° ā¤ˆā¤ŽāĨ‡ā¤˛", + "Aliases": "ā¤‰ā¤Ēā¤¨ā¤žā¤Ž", + "AutoLinker_Phone": "ā¤‘ā¤ŸāĨ‹ā¤˛ā¤ŋā¤‚ā¤•ā¤° ā¤Ģā¤ŧāĨ‹ā¤¨", + "AutoLinker_Phone_Description": "ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤¨ā¤‚ā¤Ŧā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤˛ā¤ŋā¤‚ā¤• ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž. ā¤œāĨˆā¤¸āĨ‡ `(123)456-7890`", + "All": "ā¤¸ā¤­āĨ€", + "AutoLinker_StripPrefix": "ā¤‘ā¤ŸāĨ‹ā¤˛ā¤ŋā¤‚ā¤•ā¤° ā¤¸āĨā¤ŸāĨā¤°ā¤ŋā¤Ē ā¤‰ā¤Ēā¤¸ā¤°āĨā¤—", + "All_Apps": "ā¤¸ā¤­āĨ€ ā¤ā¤ĒāĨā¤˛āĨ€ā¤•āĨ‡ā¤ļā¤¨", + "AutoLinker_StripPrefix_Description": "ā¤˛ā¤˜āĨ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤¨. ā¤œāĨˆā¤¸āĨ‡ https://rocket.chat => ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ", + "All_added_tokens_will_be_required_by_the_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤¸ā¤­āĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ ā¤—ā¤ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤—āĨ€", + "All_categories": "ā¤¸ā¤Ŧ ā¤ĩā¤°āĨā¤—", + "AutoLinker_Urls_Scheme": "ā¤‘ā¤ŸāĨ‹ā¤˛ā¤ŋā¤‚ā¤•ā¤° ā¤¯āĨ‹ā¤œā¤¨ā¤ž: // ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "All_channels": "ā¤¸ā¤­āĨ€ ā¤šāĨˆā¤¨ā¤˛", + "AutoLinker_Urls_TLD": "ā¤‘ā¤ŸāĨ‹ā¤˛ā¤ŋā¤‚ā¤•ā¤° ā¤ŸāĨ€ā¤ā¤˛ā¤ĄāĨ€ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "All_closed_chats_have_been_removed": "ā¤¸ā¤­āĨ€ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨˆā¤Ÿ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤šāĨˆā¤‚", + "AutoLinker_Urls_www": "ā¤‘ā¤ŸāĨ‹ā¤˛ā¤ŋā¤‚ā¤• 'www' ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "All_logs": "ā¤¸ā¤­āĨ€ ā¤˛āĨ‰ā¤—", + "AutoLinker_UrlsRegExp": "ā¤‘ā¤ŸāĨ‹ā¤˛ā¤ŋā¤‚ā¤•ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¨ā¤ŋā¤¯ā¤Žā¤ŋā¤¤ ā¤…ā¤­ā¤ŋā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ", + "All_messages": "ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "All_Prices": "ā¤¸ā¤­āĨ€ ā¤•āĨ€ā¤Žā¤¤āĨ‡ā¤‚", + "All_status": "ā¤¸ā¤­āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "All_users": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "All_users_in_the_channel_can_write_new_messages": "ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛ā¤ŋā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Allow_collect_and_store_HTTP_header_informations": "HTTP ā¤šāĨ‡ā¤Ąā¤° ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ā¤•ā¤¤āĨā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Allow_collect_and_store_HTTP_header_informations_description": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆ ā¤•ā¤ŋ ā¤•āĨā¤¯ā¤ž ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤•āĨ‹ HTTP ā¤šāĨ‡ā¤Ąā¤° ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸āĨ‡ ā¤ā¤•ā¤¤āĨā¤° ā¤•āĨ€ ā¤—ā¤ˆ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€, ā¤œāĨˆā¤¸āĨ‡ ā¤†ā¤ˆā¤ĒāĨ€ ā¤Ēā¤¤ā¤ž, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž-ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ, ā¤†ā¤Ļā¤ŋ ā¤•āĨ‹ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆāĨ¤", + "Allow_Invalid_SelfSigned_Certs": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¸āĨā¤ĩ-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤° ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Allow_Invalid_SelfSigned_Certs_Description": "ā¤˛ā¤ŋā¤‚ā¤• ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨ ā¤”ā¤° ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤”ā¤° ā¤¸āĨā¤ĩ-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°ā¤ŋā¤¤ ā¤ā¤¸ā¤ā¤¸ā¤ā¤˛ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤° ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚āĨ¤", + "Allow_Marketing_Emails": "ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Allow_Online_Agents_Outside_Business_Hours": "ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Allow_Online_Agents_Outside_Office_Hours": "ā¤•ā¤žā¤°āĨā¤¯ā¤žā¤˛ā¤¯ ā¤¸ā¤Žā¤¯ ā¤•āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Allow_Save_Media_to_Gallery": "ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤•āĨ‹ ā¤—āĨˆā¤˛ā¤°āĨ€ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤šāĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Allow_switching_departments": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤•āĨ‹ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Almost_done": "ā¤˛ā¤—ā¤­ā¤— ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "Alphabetical": "ā¤ĩā¤°āĨā¤Ŗā¤Žā¤žā¤˛ā¤ž", + "bold": "ā¤ŦāĨ‹ā¤˛āĨā¤Ą", + "Also_send_thread_message_to_channel_behavior": "ā¤šāĨˆā¤¨ā¤˛ ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĨāĨā¤°āĨ‡ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ€ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Also_send_to_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤­āĨ€ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Always_open_in_new_window": "ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤¨ā¤ˆ ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹ ā¤ŽāĨ‡ā¤‚ ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Always_show_thread_replies_in_main_channel": "ā¤ĨāĨā¤°āĨ‡ā¤Ą ā¤‰ā¤¤āĨā¤¤ā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤ŽāĨā¤–āĨā¤¯ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Analytic_reports": "ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗā¤žā¤¤āĨā¤Žā¤• ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ", + "Analytics": "ā¤ā¤¨ā¤žā¤˛ā¤ŋā¤Ÿā¤ŋā¤•āĨā¤¸", + "Analytics_Description": "ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•āĨˆā¤¸āĨ‡ ā¤‡ā¤‚ā¤Ÿā¤°āĨˆā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Analytics_features_enabled": "ā¤¸āĨā¤ĩā¤ŋā¤§ā¤žā¤ā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Analytics_features_messages_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤•āĨ€ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤‡ā¤¯āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ˆā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤ŸāĨā¤°āĨˆā¤• ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Analytics_features_rooms_Description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤¯ā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ēā¤° ā¤—ā¤¤ā¤ŋā¤ĩā¤ŋā¤§ā¤ŋā¤¯āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ˆā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤ŸāĨā¤°āĨˆā¤• ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ (ā¤Ŧā¤¨ā¤žā¤ā¤‚, ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚, ā¤šā¤Ÿā¤žā¤ā¤‚)āĨ¤", + "Analytics_features_users_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤žā¤°āĨā¤¯āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ˆā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤ŸāĨā¤°āĨˆā¤• ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ (ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤¸ā¤Žā¤¯, ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šā¤ŋā¤¤āĨā¤° ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨, ā¤†ā¤Ļā¤ŋ)āĨ¤", + "Analytics_Google": "ā¤—āĨ‚ā¤—ā¤˛ ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤ŋā¤•āĨ€", + "Analytics_Google_id": "ā¤ŸāĨā¤°āĨˆā¤•ā¤ŋā¤‚ā¤— ā¤†ā¤ˆā¤ĄāĨ€", + "Analytics_page_briefing_first_paragraph": "Rocket.Chat ā¤¸ā¤­āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļ ā¤•āĨ‹ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¨ā¤žā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ĄāĨ‡ā¤Ÿā¤ž, ā¤œāĨˆā¤¸āĨ‡ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤”ā¤° ā¤¸ā¤¤āĨā¤° ā¤•āĨ€ ā¤˛ā¤‚ā¤Ŧā¤žā¤ˆ, ā¤ā¤•ā¤¤āĨā¤° ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Analytics_page_briefing_second_paragraph": "ā¤šā¤Ž ā¤•ā¤­āĨ€ ā¤­āĨ€ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤¯ā¤ž ā¤¸ā¤‚ā¤ĩāĨ‡ā¤Ļā¤¨ā¤ļāĨ€ā¤˛ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ā¤•ā¤¤āĨā¤° ā¤¨ ā¤•ā¤°ā¤•āĨ‡ ā¤†ā¤Ēā¤•āĨ€ ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤•āĨ€ ā¤°ā¤•āĨā¤ˇā¤ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¯ā¤š ā¤…ā¤¨āĨā¤­ā¤žā¤— ā¤Ļā¤ŋā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•āĨā¤¯ā¤ž ā¤ā¤•ā¤¤āĨā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤œāĨ‹ ā¤Ēā¤žā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ā¤ž ā¤”ā¤° ā¤ĩā¤ŋā¤ļāĨā¤ĩā¤žā¤¸ ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤šā¤Žā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤ĻāĨā¤§ā¤¤ā¤ž ā¤•āĨ‹ ā¤Žā¤œā¤ŦāĨ‚ā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Analyze_practical_usage": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚, ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤”ā¤° ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩāĨā¤¯ā¤žā¤ĩā¤šā¤žā¤°ā¤ŋā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ‡ ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‹ā¤‚ ā¤•ā¤ž ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "and": "ā¤”ā¤°", + "And_more": "ā¤”ā¤° {{length}} ā¤”ā¤° ā¤­āĨ€", + "Animals_and_Nature": "ā¤Ēā¤ļāĨ ā¤”ā¤° ā¤ĒāĨā¤°ā¤•āĨƒā¤¤ā¤ŋ", + "Announcement": "ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž", + "Anonymous": "ā¤—āĨā¤Žā¤¨ā¤žā¤Ž", + "Answer_call": "ā¤•āĨ‰ā¤˛ ā¤•ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ā¤‚", + "API": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ", + "API_Add_Personal_Access_Token": "ā¤¨ā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "API_Allow_Infinite_Count": "ā¤¸ā¤Ŧ ā¤•āĨā¤› ā¤Ēā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "API_Allow_Infinite_Count_Description": "ā¤•āĨā¤¯ā¤ž REST API ā¤Ēā¤° ā¤•āĨ‰ā¤˛ ā¤•āĨ‹ ā¤ā¤• ā¤•āĨ‰ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Ŧ ā¤•āĨā¤› ā¤ĩā¤žā¤Ēā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ€ ā¤œā¤žā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤?", + "API_Analytics": "ā¤ā¤¨ā¤žā¤˛ā¤ŋā¤Ÿā¤ŋā¤•āĨā¤¸", + "API_CORS_Origin": "ā¤•āĨ‰ā¤°āĨā¤¸ ā¤‰ā¤¤āĨā¤Ēā¤¤āĨā¤¤ā¤ŋ", + "API_Apply_permission_view-outside-room_on_users-list": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ `users.list` ā¤Ēā¤° `view-outside-room` ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°āĨ‡ā¤‚", + "API_Apply_permission_view-outside-room_on_users-list_Description": "ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—. ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤•āĨ‹ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ā¤°āĨā¤—ā¤¤ ā¤…ā¤—ā¤˛āĨ€ ā¤ĒāĨā¤°ā¤ŽāĨā¤– ā¤°ā¤ŋā¤˛āĨ€ā¤œā¤ŧ ā¤Ēā¤° ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "API_Default_Count": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ count", + "API_Default_Count_Description": "ā¤¯ā¤Ļā¤ŋ ā¤‰ā¤Ēā¤­āĨ‹ā¤•āĨā¤¤ā¤ž ā¤¨āĨ‡ ā¤•āĨ‹ā¤ˆ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ REST API ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤ŽāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤—ā¤Ŗā¤¨ā¤žāĨ¤", + "API_Drupal_URL": "ā¤ĄāĨā¤°āĨ‚ā¤Ēā¤˛ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "API_Drupal_URL_Description": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `https://domain.com` (ā¤…ā¤¨āĨā¤—ā¤žā¤ŽāĨ€ ā¤¸āĨā¤˛āĨˆā¤ļ ā¤•āĨ‹ ā¤›āĨ‹ā¤Ąā¤ŧā¤•ā¤°)", + "API_Embed": "ā¤˛ā¤ŋā¤‚ā¤• ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "API_Embed_Description": "ā¤œā¤Ŧ ā¤•āĨ‹ā¤ˆ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ ā¤Ēā¤° ā¤˛ā¤ŋā¤‚ā¤• ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤ĄāĨ‡ā¤Ą ā¤˛ā¤ŋā¤‚ā¤• ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚āĨ¤", + "API_EmbedIgnoredHosts": "ā¤‰ā¤ĒāĨ‡ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤šāĨ‹ā¤¸āĨā¤Ÿ ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "API_EmbedIgnoredHosts_Description": "ā¤šāĨ‹ā¤¸āĨā¤Ÿ ā¤¯ā¤ž ā¤¸āĨ€ā¤†ā¤ˆā¤ĄāĨ€ā¤†ā¤° ā¤Ēā¤¤āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€, ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤ ā¤˛āĨ‹ā¤•ā¤˛ā¤šāĨ‹ā¤¸āĨā¤Ÿ, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", + "API_EmbedSafePorts": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤Ŧā¤‚ā¤Ļā¤°ā¤—ā¤žā¤š", + "API_EmbedSafePorts_Description": "ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤Ŧā¤‚ā¤Ļā¤°ā¤—ā¤žā¤šāĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€āĨ¤", + "API_Embed_UserAgent": "ā¤ā¤‚ā¤ŦāĨ‡ā¤Ą ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "API_EmbedCacheExpirationDays": "ā¤ā¤‚ā¤ŦāĨ‡ā¤Ą ā¤•āĨˆā¤ļ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ ā¤Ļā¤ŋā¤ĩā¤¸", + "API_Enable_CORS": "CORS ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_Enable_Direct_Message_History_EndPoint": "ā¤¸āĨ€ā¤§ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤Ŧā¤ŋā¤‚ā¤ĻāĨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_Enable_Direct_Message_History_EndPoint_Description": "ā¤¯ā¤š `/api/v1/im.history.others` ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤œāĨ‹ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤ŋā¤¨ā¤•ā¤ž ā¤•āĨ‰ā¤˛ā¤° ā¤šā¤ŋā¤¸āĨā¤¸ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "API_Enable_Personal_Access_Tokens": "REST API ā¤ŽāĨ‡ā¤‚ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_Enable_Personal_Access_Tokens_Description": "REST API ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_Enable_Rate_Limiter": "ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤• ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_Enable_Rate_Limiter_Dev": "ā¤ĩā¤ŋā¤•ā¤žā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤• ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_Enable_Rate_Limiter_Dev_Description": "ā¤•āĨā¤¯ā¤ž ā¤ĩā¤ŋā¤•ā¤žā¤¸ ā¤Ēā¤°ā¤ŋā¤ĩāĨ‡ā¤ļ ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‰ā¤˛ ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤•āĨ‹ ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤Ŧā¤ŋā¤‚ā¤ĻāĨā¤“ā¤‚ ā¤¤ā¤• ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤?", + "API_Enable_Rate_Limiter_Limit_Calls_Default": "ā¤°āĨ‡ā¤Ÿ ā¤˛ā¤ŋā¤Žā¤ŋā¤Ÿā¤° ā¤Ēā¤° ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¨ā¤‚ā¤Ŧā¤° ā¤•āĨ‰ā¤˛", + "API_Enable_Rate_Limiter_Limit_Calls_Default_Description": "REST API ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤Ŧā¤ŋā¤‚ā¤ĻāĨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤•āĨ‰ā¤˛ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž, ā¤¨āĨ€ā¤šāĨ‡ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤¸ā¤Žā¤¯ ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‡ ā¤­āĨ€ā¤¤ā¤° ā¤…ā¤¨āĨā¤Žā¤¤ ā¤šāĨˆ", + "API_Enable_Rate_Limiter_Limit_Time_Default": "ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¸ā¤Žā¤¯ ā¤¸āĨ€ā¤Žā¤ž (ā¤ā¤Žā¤ā¤¸ ā¤ŽāĨ‡ā¤‚)", + "API_Enable_Rate_Limiter_Limit_Time_Default_Description": "REST API ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤Ŧā¤ŋā¤‚ā¤ĻāĨ ā¤Ēā¤° ā¤•āĨ‰ā¤˛ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ (ā¤ā¤Žā¤ā¤¸ ā¤ŽāĨ‡ā¤‚)", + "API_Enable_Shields": "ā¤ļāĨ€ā¤˛āĨā¤ĄāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_Enable_Shields_Description": "`/api/v1/shield.svg` ā¤Ēā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤ļāĨ€ā¤˛āĨā¤Ą ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_GitHub_Enterprise_URL": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "API_GitHub_Enterprise_URL_Description": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `https://domain.com` (ā¤…ā¤¨āĨā¤—ā¤žā¤ŽāĨ€ ā¤¸āĨā¤˛āĨˆā¤ļ ā¤•āĨ‹ ā¤›āĨ‹ā¤Ąā¤ŧā¤•ā¤°)", + "API_Gitlab_URL": "ā¤—ā¤ŋā¤Ÿā¤˛āĨˆā¤Ŧ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "API_Personal_Access_Token_Generated": "ā¤Ēā¤°āĨā¤¸ā¤¨ā¤˛ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤šāĨā¤†", + "API_Personal_Access_Token_Generated_Text_Token_s_UserId_s": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨ā¤ž ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸ā¤žā¤ĩā¤§ā¤žā¤¨āĨ€ ā¤¸āĨ‡ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚ ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤‡ā¤¸ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤†ā¤Ē ā¤‡ā¤¸āĨ‡ ā¤¨ā¤šāĨ€ā¤‚ ā¤ĻāĨ‡ā¤– ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤
    ā¤ŸāĨ‹ā¤•ā¤¨: {{token}}
    ā¤†ā¤Ēā¤•āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤†ā¤ˆā¤ĄāĨ€: {{userId}}", + "API_Personal_Access_Token_Name": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤Ēā¤šāĨā¤ā¤š ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¨ā¤žā¤Ž", + "API_Personal_Access_Tokens_Regenerate_It": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤ĒāĨā¤¨: ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "API_Personal_Access_Tokens_Regenerate_Modal": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤¨āĨ‡ ā¤…ā¤Ēā¤¨ā¤ž ā¤ŸāĨ‹ā¤•ā¤¨ ā¤–āĨ‹ ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ ā¤¯ā¤ž ā¤­āĨ‚ā¤˛ ā¤—ā¤ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤†ā¤Ē ā¤‡ā¤¸āĨ‡ ā¤ĒāĨā¤¨: ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤¯ā¤žā¤Ļ ā¤°ā¤–āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤¸ā¤­āĨ€ ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤•āĨ‹ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "API_Personal_Access_Tokens_Remove_Modal": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤‡ā¤¸ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "API_Personal_Access_Tokens_To_REST_API": "REST API ā¤¤ā¤• ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤Ēā¤šāĨā¤‚ā¤š ā¤ŸāĨ‹ā¤•ā¤¨", + "API_Rate_Limiter": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤•", + "API_Shield_Types": "ā¤ĸā¤žā¤˛ ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "API_Shield_Types_Description": "ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ļāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤•ā¤žā¤°, ā¤¸ā¤­āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨`, `ā¤šāĨˆā¤¨ā¤˛` ā¤¯ā¤ž `*` ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ ā¤šāĨā¤¨āĨ‡ā¤‚", + "Apps_Framework_Development_Mode": "ā¤ĩā¤ŋā¤•ā¤žā¤¸ ā¤ŽāĨ‹ā¤Ą ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "API_Shield_user_require_auth": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ļāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "API_Token": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤ŸāĨ‹ā¤•ā¤¨", + "Apps_Framework_Development_Mode_Description": "ā¤ĄāĨ‡ā¤ĩā¤˛ā¤Ēā¤ŽāĨ‡ā¤‚ā¤Ÿ ā¤ŽāĨ‹ā¤Ą ā¤‰ā¤¨ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆ ā¤œāĨ‹ Rocket.Chat ā¤•āĨ‡ ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤¸āĨ‡ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤", + "API_Tokenpass_URL": "ā¤ŸāĨ‹ā¤•ā¤¨ā¤Ēā¤žā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "API_Tokenpass_URL_Description": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `https://domain.com` (ā¤…ā¤¨āĨā¤—ā¤žā¤ŽāĨ€ ā¤¸āĨā¤˛āĨˆā¤ļ ā¤•āĨ‹ ā¤›āĨ‹ā¤Ąā¤ŧā¤•ā¤°)", + "API_Upper_Count_Limit": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤°ā¤ŋā¤•ā¤žā¤°āĨā¤Ą ā¤°ā¤žā¤ļā¤ŋ", + "API_Upper_Count_Limit_Description": "REST API ā¤•āĨ‹ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤•ā¤ŋā¤¤ā¤¨āĨ‡ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤˛āĨŒā¤Ÿā¤žā¤¨āĨ‡ ā¤šā¤žā¤šā¤ŋā¤ (ā¤œā¤Ŧ ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤¨ ā¤šāĨ‹)?", + "API_Use_REST_For_DDP_Calls": "ā¤‰ā¤˛āĨā¤•ā¤ž ā¤•āĨ‰ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨ‡ā¤Ŧā¤¸āĨ‹ā¤•āĨ‡ā¤Ÿ ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ REST ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "API_User_Limit": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨ€ā¤Žā¤ž", + "API_Wordpress_URL": "ā¤ĩā¤°āĨā¤Ąā¤ĒāĨā¤°āĨ‡ā¤¸ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "api-bypass-rate-limit": "REST API ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ŧā¤žā¤ˆā¤Ēā¤žā¤¸ ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤ž", + "api-bypass-rate-limit_description": "ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤•āĨ‰ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Apiai_Key": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ.ā¤ā¤†ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€", + "Apiai_Language": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ.ā¤ā¤†ā¤ˆ ā¤­ā¤žā¤ˇā¤ž", + "APIs": "ā¤ļā¤šā¤Ļ ā¤•āĨ€ ā¤Žā¤•āĨā¤–āĨ€", + "App_author_homepage": "ā¤˛āĨ‡ā¤–ā¤• ā¤ŽāĨā¤–ā¤ĒāĨƒā¤ˇāĨā¤ ", + "App_Details": "ā¤ā¤Ē ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "App_Info": "ā¤…ā¤¨āĨā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "App_Information": "ā¤ā¤Ē ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "App_Installation": "ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤Ÿā¤žā¤˛āĨ‡ā¤ļā¤¨", + "App_not_enabled": "ā¤ā¤Ē ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "App_not_found": "ā¤ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", "App_status_auto_enabled": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "App_status_constructed": "ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ", "App_status_disabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "App_status_error_disabled": "ā¤…ā¤•āĨā¤ˇā¤Ž: ā¤§āĨā¤¯ā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤¨ ā¤†ā¤ˆ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "App_status_initialized": "ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­", + "App_status_invalid_license_disabled": "ā¤ĩā¤ŋā¤•ā¤˛ā¤žā¤‚ā¤—: ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸", + "App_status_invalid_settings_disabled": "ā¤…ā¤•āĨā¤ˇā¤Ž: ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "App_status_manually_disabled": "ā¤…ā¤•āĨā¤ˇā¤Ž: ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡", "App_status_manually_enabled": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "App_status_unknown": "ā¤…ā¤œāĨā¤žā¤žā¤¤", + "App_Store": "ā¤ā¤Ē ā¤¸āĨā¤ŸāĨ‹ā¤°", + "App_support_url": "ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "App_Url_to_Install_From": "ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¸āĨ‡ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "App_Url_to_Install_From_File": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸āĨ‡ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "App_user_not_allowed_to_login": "ā¤ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨ€ā¤§āĨ‡ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", "Appearance": "ā¤Ļā¤ŋā¤–ā¤žā¤ĩā¤Ÿ", + "Application_added": "ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Application_delete_warning": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡!", + "Application_Name": "ā¤†ā¤ĩāĨ‡ā¤Ļā¤¨ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Application_updated": "ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Apply": "ā¤†ā¤ĩāĨ‡ā¤Ļā¤¨ ā¤•ā¤°ā¤¨ā¤ž", + "Apply_and_refresh_all_clients": "ā¤¸ā¤­āĨ€ ā¤—āĨā¤°ā¤žā¤šā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤•ā¤°āĨ‡ā¤‚", + "Apps": "ā¤ā¤ĒāĨā¤¸", + "Apps_context_explore": "ā¤…ā¤¨āĨā¤ĩāĨ‡ā¤ˇā¤Ŗ ā¤•ā¤°ā¤¨ā¤ž", + "Apps_context_installed": "ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤", + "Apps_context_requested": "ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž", + "Apps_context_private": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸", + "Apps_context_premium": "ā¤…ā¤§ā¤ŋā¤ŽāĨ‚ā¤˛āĨā¤¯", + "Apps_Count_Enabled": "{{count}} ā¤ā¤Ē ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Private_Apps_Count_Enabled": "{{count}} ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤Ē ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Apps_Count_Enabled_tooltip": "ā¤¸ā¤žā¤ŽāĨā¤Ļā¤žā¤¯ā¤ŋā¤• ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž {{number}} {{context}} ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Apps_disabled_when_Premium_trial_ended": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤ā¤ĒāĨā¤¸ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤—ā¤", + "Apps_disabled_when_Premium_trial_ended_description": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž 5 ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ā¤ĒāĨā¤¸ ā¤”ā¤° 3 ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤ƒ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤šāĨ‡ā¤‚āĨ¤", + "Apps_disabled_when_Premium_trial_ended_description_admin": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž 5 ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ā¤ĒāĨā¤¸ ā¤”ā¤° 3 ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤†ā¤Ēā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤ƒ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚.", + "Apps_Engine_Version": "ā¤ā¤ĒāĨā¤¸ ā¤‡ā¤‚ā¤œā¤¨ ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "Apps_Error_private_app_install_disabled": "ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛āĨ‡ā¤ļā¤¨ ā¤”ā¤° ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚", + "Apps_Essential_Alert": "ā¤¯ā¤š ā¤ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤˜ā¤Ÿā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ:", + "Apps_Essential_Disclaimer": "ā¤¯ā¤Ļā¤ŋ ā¤¯ā¤š ā¤ā¤Ē ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤Šā¤Ēā¤° ā¤¸āĨ‚ā¤šāĨ€ā¤Ŧā¤ĻāĨā¤§ ā¤ˆā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤Ŧā¤žā¤§ā¤ŋā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤•ā¤ŋ Rocket.Chat ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ€ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇā¤Žā¤¤ā¤ž ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤•ā¤žā¤Ž ā¤•ā¤°āĨ‡, ā¤¤āĨ‹ ā¤†ā¤Ēā¤•āĨ‹ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¨ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "Apps_Framework_Source_Package_Storage_Type": "ā¤ā¤ĒāĨā¤¸ ā¤•ā¤ž ā¤¸āĨā¤°āĨ‹ā¤¤ ā¤ĒāĨˆā¤•āĨ‡ā¤œ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šā¤Ŗ ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "Apps_Framework_Source_Package_Storage_Type_Description": "ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¸ā¤­āĨ€ ā¤ā¤ĒāĨā¤¸ ā¤•ā¤ž ā¤¸āĨā¤°āĨ‹ā¤¤ ā¤•āĨ‹ā¤Ą ā¤•ā¤šā¤žā¤ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤ā¤Ē ā¤•ā¤ž ā¤†ā¤•ā¤žā¤° ā¤•ā¤ˆ ā¤ŽāĨ‡ā¤—ā¤žā¤Ŧā¤žā¤‡ā¤Ÿ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Apps_Framework_Source_Package_Storage_Type_Alert": "ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤ĩā¤šā¤žā¤‚ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤ā¤ĒāĨā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸āĨā¤Ĩā¤ŋā¤°ā¤¤ā¤ž ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆ", + "Apps_Framework_Source_Package_Storage_FileSystem_Path": "ā¤ā¤ĒāĨā¤¸ ā¤¸āĨā¤°āĨ‹ā¤¤ ā¤ĒāĨˆā¤•āĨ‡ā¤œ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž", + "Apps_Framework_Source_Package_Storage_FileSystem_Path_Description": "ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‡ ā¤¸āĨā¤°āĨ‹ā¤¤ ā¤•āĨ‹ā¤Ą ā¤•āĨ‹ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤Ēā¤Ĩ (ā¤œā¤ŧā¤ŋā¤Ē ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚)", + "Apps_Framework_Source_Package_Storage_FileSystem_Alert": "ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤šāĨā¤¨āĨ€ ā¤—ā¤ˆ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ ā¤”ā¤° Rocket.Chat ā¤‰ā¤¸ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ (ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡/ā¤˛ā¤ŋā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ)", + "Apps_Game_Center": "ā¤–āĨ‡ā¤˛ ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤°", + "Apps_Game_Center_Back": "ā¤—āĨ‡ā¤Ž ā¤¸āĨ‡ā¤‚ā¤Ÿā¤° ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Apps_Game_Center_Invite_Friends": "ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĻāĨ‹ā¤¸āĨā¤¤āĨ‹ā¤‚ ā¤•āĨ‹ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•āĨ€ā¤œā¤ŋā¤", + "Apps_Game_Center_Play_Game_Together": "@ā¤¯ā¤šā¤žā¤ ā¤†ā¤‡ā¤ ā¤ā¤• ā¤¸ā¤žā¤Ĩ {{name}} ā¤–āĨ‡ā¤˛āĨ‡ā¤‚!", + "Apps_Interface_IPostExternalComponentClosed": "ā¤•ā¤ŋā¤¸āĨ€ ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤˜ā¤Ÿā¤• ā¤•āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPostExternalComponentOpened": "ā¤•ā¤ŋā¤¸āĨ€ ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤˜ā¤Ÿā¤• ā¤•āĨ‡ ā¤–āĨā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPostMessageDeleted": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPostMessageSent": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPostMessageUpdated": "ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPostRoomCreate": "ā¤°āĨ‚ā¤Ž ā¤Ŧā¤¨ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛ā¤ž ā¤‡ā¤ĩāĨ‡ā¤‚ā¤Ÿ", + "Apps_Interface_IPostRoomDeleted": "ā¤ā¤• ā¤•ā¤Žā¤°ā¤ž ā¤šā¤Ÿā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPostRoomUserJoined": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž (ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š, ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛)", + "Apps_Interface_IPreMessageDeletePrevent": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreMessageSentExtend": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreMessageSentModify": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreMessageSentPrevent": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreMessageUpdatedExtend": "ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreMessageUpdatedModify": "ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreMessageUpdatedPrevent": "ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreRoomCreateExtend": "ā¤°āĨ‚ā¤Ž ā¤Ŧā¤¨ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreRoomCreateModify": "ā¤°āĨ‚ā¤Ž ā¤Ŧā¤¨ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreRoomCreatePrevent": "ā¤°āĨ‚ā¤Ž ā¤Ŧā¤¨ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreRoomDeletePrevent": "ā¤•ā¤ŋā¤¸āĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž", + "Apps_Interface_IPreRoomUserJoined": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤˜ā¤Ÿā¤¨ā¤ž (ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š, ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛)", + "Apps_License_Message_appId": "ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤œā¤žā¤°āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Apps_License_Message_bundle": "ā¤ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ąā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤œā¤žā¤°āĨ€ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤ā¤Ē ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Apps_License_Message_expire": "ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤…ā¤Ŧ ā¤ĩāĨˆā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤”ā¤° ā¤‡ā¤¸āĨ‡ ā¤¨ā¤ĩāĨ€ā¤¨āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Apps_License_Message_maxSeats": "ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤•āĨ‹ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸āĨ€ā¤ŸāĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤Ŧā¤ĸā¤ŧā¤žā¤ā¤", + "Apps_License_Message_publicKey": "ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤•āĨ‹ ā¤Ąā¤ŋā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ā¤• ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤šāĨā¤ˆ ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿā¤ŋā¤ĩā¤ŋā¤ŸāĨ€ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_License_Message_renewal": "ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤¨ā¤ĩāĨ€ā¤¨āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Apps_License_Message_seats": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤•āĨ‹ ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°āĨā¤¯ā¤žā¤ĒāĨā¤¤ ā¤¸āĨ€ā¤ŸāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸āĨ€ā¤ŸāĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤Ŧā¤ĸā¤ŧā¤žā¤ā¤", + "Apps_Logs_TTL": "ā¤ā¤ĒāĨā¤¸ ā¤¸āĨ‡ ā¤˛āĨ‰ā¤— ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ļā¤ŋā¤¨āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Apps_Logs_TTL_7days": "7 ā¤Ļā¤ŋā¤¨", + "Apps_Logs_TTL_14days": "14 ā¤Ļā¤ŋā¤¨", + "Apps_Logs_TTL_30days": "ā¤¤āĨ€ā¤¸ ā¤Ļā¤ŋā¤¨", + "Apps_Logs_TTL_Alert": "ā¤˛āĨ‰ā¤— ā¤¸ā¤‚ā¤—āĨā¤°ā¤š ā¤•āĨ‡ ā¤†ā¤•ā¤žā¤° ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤°, ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤•āĨā¤› ā¤•āĨā¤ˇā¤ŖāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤§āĨ€ā¤Žā¤žā¤Ēā¤¨ ā¤† ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Apps_Marketplace_Deactivate_App_Prompt": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Apps_Marketplace_Login_Required_Description": "Rocket.Chat ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤¸āĨ‡ ā¤ā¤ĒāĨā¤¸ ā¤–ā¤°āĨ€ā¤Ļā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Apps_Marketplace_Login_Required_Title": "ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•", + "Apps_Marketplace_Modify_App_Subscription": "ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Marketplace_pricingPlan_monthly": "{{price}} /ā¤Žā¤žā¤š", + "Apps_Marketplace_pricingPlan_monthly_perUser": "{{price}} / ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Žā¤žā¤š", + "Apps_Marketplace_pricingPlan_monthly_trialDays": "{{price}} / ā¤Žā¤žā¤š-{{trialDays}}-ā¤Ļā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Apps_Marketplace_pricingPlan_monthly_perUser_trialDays": "{{price}}/ā¤Žā¤žā¤š ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž-{{trialDays}}-ā¤Ļā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Apps_Marketplace_pricingPlan_+*_monthly": " {{price}}+* /ā¤Žā¤žā¤š", + "Apps_Marketplace_pricingPlan_+*_monthly_trialDays": " {{price}}+* / ā¤Žā¤žā¤š-{{trialDays}}-ā¤Ļā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Apps_Marketplace_pricingPlan_+*_monthly_perUser": " {{price}}+* / ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Žā¤žā¤š", + "Apps_Marketplace_pricingPlan_+*_monthly_perUser_trialDays": " {{price}}+* / ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Žā¤žā¤š-{{trialDays}}-ā¤Ļā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Apps_Marketplace_pricingPlan_+*_yearly": " {{price}}+* / ā¤ĩā¤°āĨā¤ˇ", + "Apps_Marketplace_pricingPlan_+*_yearly_trialDays": " {{price}}+* / ā¤ĩā¤°āĨā¤ˇ-{{trialDays}}-ā¤Ļā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Apps_Marketplace_pricingPlan_+*_yearly_perUser": " {{price}}+* / ā¤ĩā¤°āĨā¤ˇ ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Apps_Marketplace_pricingPlan_+*_yearly_perUser_trialDays": " {{price}}+* / ā¤ĩā¤°āĨā¤ˇ ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž-{{trialDays}}-ā¤Ļā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Apps_Marketplace_pricingPlan_yearly_trialDays": "{{price}} / ā¤ĩā¤°āĨā¤ˇ-{{trialDays}}-ā¤Ļā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Apps_Marketplace_pricingPlan_yearly_perUser_trialDays": "{{price}} / ā¤ĩā¤°āĨā¤ˇ ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž-{{trialDays}}-ā¤Ļā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Apps_Marketplace_Uninstall_App_Prompt": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ‹ ā¤…ā¤¨ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Apps_Marketplace_Uninstall_Subscribed_App_Anyway": "ā¤Ģā¤ŋā¤° ā¤­āĨ€ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¨ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Marketplace_Uninstall_Subscribed_App_Prompt": "ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ€ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤…ā¤¨ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤¯ā¤š ā¤°ā¤ĻāĨā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—āĨ€āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤ā¤¸ā¤ž ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤¨ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤…ā¤Ēā¤¨āĨ€ ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Apps_Permissions_Review_Modal_Title": "ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤", + "Apps_Permissions_Review_Modal_Subtitle": "ā¤¯ā¤š ā¤ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤šā¤žā¤šā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤¸ā¤šā¤Žā¤¤ ā¤šāĨˆā¤‚?", + "Apps_Permissions_No_Permissions_Required": "ā¤ā¤Ē ā¤•āĨ‹ ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Apps_Permissions_cloud_workspace-token": "ā¤‡ā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤“ā¤° ā¤¸āĨ‡ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_user_read": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_user_write": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_upload_read": "ā¤‡ā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚", + "Apps_Permissions_upload_write": "ā¤‡ā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_server-setting_read": "ā¤‡ā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_server-setting_write": "ā¤‡ā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_room_read": "ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_room_write": "ā¤•ā¤Žā¤°āĨ‡ ā¤Ŧā¤¨ā¤žā¤ā¤‚ ā¤”ā¤° ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_message_read": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_message_write": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚ ā¤”ā¤° ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_livechat-status_read": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_livechat-custom-fields_write": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_livechat-visitor_read": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_livechat-visitor_write": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_livechat-message_read": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_livechat-message_write": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_livechat-room_read": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_livechat-room_write": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_livechat-department_read": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡ā¤‚", + "Apps_Permissions_livechat-department_multiple": "ā¤•ā¤ˆ ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š", + "Apps_Permissions_livechat-department_write": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_slashcommand": "ā¤¨ā¤ ā¤¸āĨā¤˛āĨˆā¤ļ ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_api": "ā¤¨ā¤ HTTP ā¤¸ā¤Žā¤žā¤Ēā¤¨ā¤Ŧā¤ŋā¤‚ā¤ĻāĨ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_env_read": "ā¤‡ā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĩā¤žā¤¤ā¤žā¤ĩā¤°ā¤Ŗ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤šāĨ‡ā¤‚", + "Apps_Permissions_networking": "ā¤‡ā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¨āĨ‡ā¤Ÿā¤ĩā¤°āĨā¤• ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š", + "Apps_Permissions_persistence": "ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Permissions_scheduler": "ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤¨āĨŒā¤•ā¤°ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤Ŧā¤¨ā¤žā¤ ā¤°ā¤–āĨ‡ā¤‚", + "Apps_Permissions_ui_interact": "ā¤¯āĨ‚ā¤†ā¤ˆ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤‡ā¤‚ā¤Ÿā¤°āĨˆā¤•āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Apps_Settings": "ā¤ā¤Ē ā¤•āĨ€ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸", + "Apps_Manual_Update_Modal_Title": "ā¤¯ā¤š ā¤ā¤Ē ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤šāĨˆ", + "Apps_Manual_Update_Modal_Body": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤‡ā¤¸āĨ‡ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Apps_User_Already_Exists": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž \"{{username}}\" ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆāĨ¤ ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ‹ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚ ā¤¯ā¤ž ā¤‰ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤‚", + "AutoLinker": "ā¤‘ā¤ŸāĨ‹ā¤˛ā¤ŋā¤‚ā¤•ā¤°", + "Apps_WhatIsIt": "ā¤ā¤ĒāĨā¤¸: ā¤ĩāĨ‡ ā¤•āĨā¤¯ā¤ž ā¤šāĨˆā¤‚?", + "Apps_WhatIsIt_paragraph1": "ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤†ā¤‡ā¤•ā¤¨! ā¤‡ā¤¸ā¤•ā¤ž ā¤•āĨā¤¯ā¤ž ā¤Žā¤¤ā¤˛ā¤Ŧ ā¤šāĨˆ ā¤”ā¤° ā¤ā¤ĒāĨā¤¸ ā¤•āĨā¤¯ā¤ž ā¤šāĨˆā¤‚?", + "Apps_WhatIsIt_paragraph2": "ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡, ā¤‡ā¤¸ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ ā¤ŽāĨ‡ā¤‚ ā¤ā¤ĒāĨā¤¸ ā¤•ā¤ž ā¤¤ā¤žā¤¤āĨā¤Ēā¤°āĨā¤¯ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¸āĨ‡ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤ ā¤ĩā¤žā¤¸āĨā¤¤ā¤ĩ ā¤ŽāĨ‡ā¤‚, ā¤ĒāĨā¤˛ā¤—ā¤‡ā¤¨āĨā¤¸ ā¤¯ā¤ž ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤¨ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‹ā¤šā¤¨ā¤ž ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤…ā¤šāĨā¤›ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "Apps_WhatIsIt_paragraph3": "ā¤ĻāĨ‚ā¤¸ā¤°āĨ‡, ā¤ĩāĨ‡ ā¤—ā¤¤ā¤ŋā¤ļāĨ€ā¤˛ ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤¯ā¤ž ā¤ĒāĨˆā¤•āĨ‡ā¤œ ā¤šāĨˆā¤‚ ā¤œāĨ‹ ā¤†ā¤Ēā¤•āĨ‹ ā¤•āĨ‹ā¤Ąā¤ŦāĨ‡ā¤¸ ā¤•āĨ‹ ā¤ĢāĨ‹ā¤°āĨā¤• ā¤•ā¤ŋā¤ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚ā¤—āĨ‡āĨ¤ ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤§āĨā¤¯ā¤žā¤¨ ā¤°ā¤–āĨ‡ā¤‚, ā¤¯ā¤š ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤ĢāĨ€ā¤šā¤° ā¤¸āĨ‡ā¤Ÿ ā¤šāĨˆ ā¤”ā¤° ā¤‡ā¤¸ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ ā¤¯ā¤š 100% ā¤¸āĨā¤Ĩā¤ŋā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¸ā¤žā¤Ĩ ā¤šāĨ€, ā¤šā¤Ž ā¤…ā¤­āĨ€ ā¤­āĨ€ ā¤ĢāĨ€ā¤šā¤° ā¤¸āĨ‡ā¤Ÿ ā¤ĩā¤ŋā¤•ā¤¸ā¤ŋā¤¤ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚ ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤‡ā¤¸ ā¤¸ā¤Žā¤¯ ā¤šā¤° ā¤šāĨ€ā¤œ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤•ā¤ŋā¤¸āĨ€ ā¤ā¤Ē ā¤•āĨ‹ ā¤ĩā¤ŋā¤•ā¤¸ā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤¯ā¤šā¤žā¤‚ ā¤œā¤žā¤•ā¤° ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚:", + "Apps_WhatIsIt_paragraph4": "ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤‡ā¤¸ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šāĨ€, ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤‡ā¤¸ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤‡ā¤¸āĨ‡ ā¤†ā¤œā¤ŧā¤Žā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤°āĨā¤šā¤ŋ ā¤°ā¤–ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤¤āĨ‹ ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤‡ā¤¸ ā¤Ŧā¤Ÿā¤¨ ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Archive": "ā¤ĒāĨā¤°ā¤žā¤˛āĨ‡ā¤–", + "Archived": "ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤", + "archive-room": "ā¤ĒāĨā¤°ā¤žā¤˛āĨ‡ā¤– ā¤•ā¤•āĨā¤ˇ", + "archive-room_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "are_typing": "ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "are_playing": "ā¤–āĨ‡ā¤˛ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "is_playing": "ā¤–āĨ‡ā¤˛ ā¤°ā¤šāĨ‡ ā¤šāĨˆ", + "are_uploading": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "are_recording": "ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ąā¤ŋā¤‚ā¤— ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "is_uploading": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨˆ", + "is_recording": "ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ąā¤ŋā¤‚ā¤— ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Are_you_sure": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ēā¤•āĨ‹ ā¤¯ā¤•āĨ€ā¤¨ ā¤šāĨˆ?", + "Are_you_sure_delete_department": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤‡ā¤¸ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚? ā¤‡ā¤¸ ā¤ā¤•āĨā¤ļā¤¨ ā¤•āĨ‹ ā¤ĩā¤žā¤Ēā¤¸ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤žāĨ¤ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Are_you_sure_you_want_to_clear_all_unread_messages": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤¸ā¤­āĨ€ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Are_you_sure_you_want_to_close_this_chat": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤‡ā¤¸ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Are_you_sure_you_want_to_delete_this_record": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤¯ā¤š ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Are_you_sure_you_want_to_delete_your_account": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤‡ā¤¸ ā¤–ā¤žā¤¤āĨ‡ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤šāĨˆā¤‚?", + "Are_you_sure_you_want_to_disable_Facebook_integration": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Are_you_sure_you_want_to_reset_the_name_of_all_priorities": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤¸ā¤­āĨ€ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Assets": "ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ", + "Assets_Description": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•ā¤ž ā¤˛āĨ‹ā¤—āĨ‹, ā¤†ā¤‡ā¤•ā¤¨, ā¤Ģā¤ŧāĨ‡ā¤ĩā¤ŋā¤•āĨ‰ā¤¨ ā¤”ā¤° ā¤Ŧā¤šāĨā¤¤ ā¤•āĨā¤› ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Asset_preview": "ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨", + "Assign_admin": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨ā¤ŋā¤¯āĨā¤•āĨā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Assign_new_conversations_to_bot_agent": "ā¤ŦāĨ‰ā¤Ÿ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤¨ā¤ˆ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤¸āĨŒā¤‚ā¤ĒāĨ‡ā¤‚", + "Assign_new_conversations_to_bot_agent_description": "ā¤°āĨ‚ā¤Ÿā¤ŋā¤‚ā¤— ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤•ā¤ŋā¤¸āĨ€ ā¤Žā¤žā¤¨ā¤ĩ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤¨ā¤ˆ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ŦāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ā¤• ā¤ŦāĨ‰ā¤Ÿ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤–āĨ‹ā¤œā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤", + "assign-admin-role": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "assign-admin-role_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¸āĨŒā¤‚ā¤Ēā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "assign-roles": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤¸āĨŒā¤‚ā¤ĒāĨ‡ā¤‚", + "assign-roles_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤†ā¤ĩā¤‚ā¤Ÿā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Associate": "ā¤¸ā¤‚ā¤Ŧā¤‚ā¤ĻāĨā¤§ ā¤•ā¤°ā¤¨ā¤ž", + "Associate_Agent": "ā¤¸ā¤šā¤¯āĨ‹ā¤—āĨ€ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "Associate_Agent_to_Extension": "ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤¸āĨ‹ā¤¸ā¤ŋā¤ā¤Ÿ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "at": "ā¤Ēā¤°", + "At_least_one_added_token_is_required_by_the_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "AtlassianCrowd": "ā¤ā¤Ÿā¤˛ā¤¸ā¤ŋā¤¯ā¤¨ ā¤­āĨ€ā¤Ąā¤ŧ", + "AtlassianCrowd_Description": "ā¤ā¤Ÿā¤˛ā¤¸ā¤ŋā¤¯ā¤¨ ā¤­āĨ€ā¤Ąā¤ŧ ā¤•āĨ‹ ā¤ā¤•āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Attachment_File_Uploaded": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ", + "Attribute_handling": "ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨", + "Audio": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹", + "Audio_message": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Audio_Notification_Value_Description": "ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤¯ā¤ž ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆ: ā¤ŦāĨ€ā¤Ē, ā¤šāĨ‡ā¤˛āĨ‡, ā¤Ąā¤ŋā¤‚ā¤—, ā¤ĄāĨā¤°āĨ‰ā¤Ēā¤˛āĨ‡ā¤Ÿ, ā¤šā¤žā¤ˆā¤ŦāĨ‡ā¤˛, ā¤¸āĨ€ā¤œā¤ŧā¤¨", "Audio_Notifications_Default_Alert": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", + "Audio_Notifications_Value": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹", + "Audio_record": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą", + "Audios": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹", + "Audit": "ā¤…ā¤‚ā¤•āĨ‡ā¤•āĨā¤ˇā¤Ŗ", + "Auditing": "ā¤˛āĨ‡ā¤–ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤ž", + "Auth": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ", + "Auth_Token": "ā¤ĒāĨā¤°ā¤žā¤Žā¤žā¤Ŗā¤ŋā¤• ā¤ŸāĨ‹ā¤•ā¤¨", + "Authentication": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ", + "Author": "ā¤˛āĨ‡ā¤–ā¤•", + "Author_Information": "ā¤˛āĨ‡ā¤–ā¤• ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Author_Site": "ā¤˛āĨ‡ā¤–ā¤• ā¤¸ā¤žā¤‡ā¤Ÿ", + "Authorization_URL": "ā¤ĒāĨā¤°ā¤žā¤§ā¤ŋā¤•ā¤°ā¤Ŗ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Authorize": "ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤", + "Authorize_access_to_your_account": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤–ā¤žā¤¤āĨ‡ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Automatic_translation_not_available": "ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Automatic_translation_not_available_info": "ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ, ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Auto_Load_Images": "ā¤›ā¤ĩā¤ŋā¤¯ā¤žā¤ ā¤¸āĨā¤ĩā¤¤ā¤ƒ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Auto_Selection": "ā¤¸āĨā¤ĩā¤¤ā¤ƒ ā¤šā¤¯ā¤¨", + "Auto_Translate": "ā¤‘ā¤ŸāĨ‹ ā¤•ā¤ž ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "auto-translate": "ā¤¸āĨā¤ĩā¤¤ā¤ƒ ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "auto-translate_description": "ā¤‘ā¤ŸāĨ‹ ā¤ŸāĨā¤°ā¤žā¤‚ā¤¸ā¤˛āĨ‡ā¤ļā¤¨ ā¤ŸāĨ‚ā¤˛ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Automatic_Translation": "ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "AutoTranslate": "ā¤‘ā¤ŸāĨ‹ ā¤•ā¤ž ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "AutoTranslate_APIKey": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€", + "AutoTranslate_Change_Language_Description": "ā¤‘ā¤ŸāĨ‹-ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤­ā¤žā¤ˇā¤ž ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "AutoTranslate_DeepL": "ā¤ĄāĨ€ā¤Ēā¤ā¤˛", + "AutoTranslate_Disabled_for_room": "#{{roomName}} ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤ĩā¤¤ā¤ƒ-ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "AutoTranslate_Enabled": "ā¤¸āĨā¤ĩā¤¤ā¤ƒ-ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "AutoTranslate_Enabled_Description": "ā¤‘ā¤ŸāĨ‹-ā¤ŸāĨā¤°ā¤žā¤‚ā¤¸ā¤˛āĨ‡ā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ 'ā¤‘ā¤ŸāĨ‹-ā¤ŸāĨā¤°ā¤žā¤‚ā¤¸ā¤˛āĨ‡ā¤Ÿ' ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĩā¤žā¤˛āĨ‡ ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤‰ā¤¨ā¤•āĨ€ ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤­ā¤žā¤ˇā¤ž ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤Žā¤ŋā¤˛ ā¤œā¤žā¤ā¤—āĨ€āĨ¤ ā¤ļāĨā¤˛āĨā¤• ā¤˛ā¤žā¤—āĨ‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ.", + "AutoTranslate_Enabled_for_room": "#{{roomName}} ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤ĩā¤¤ā¤ƒ-ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "AutoTranslate_AutoEnableOnJoinRoom": "ā¤—āĨˆā¤°-ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤­ā¤žā¤ˇā¤ž ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "AutoTranslate_AutoEnableOnJoinRoom_Description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤œā¤Ŧ ā¤­āĨ€ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¸āĨ‡ ā¤­ā¤ŋā¤¨āĨā¤¨ ā¤­ā¤žā¤ˇā¤ž ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤ĩā¤žā¤˛ā¤ž ā¤•āĨ‹ā¤ˆ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤¯ā¤š ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤‰ā¤¨ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļā¤ŋā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "AutoTranslate_Google": "ā¤—āĨ‚ā¤—ā¤˛", + "AutoTranslate_language_set_to": "ā¤¸āĨā¤ĩā¤¤ā¤ƒ-ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤­ā¤žā¤ˇā¤ž ā¤•āĨ‹ {{language}} ā¤Ēā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "AutoTranslate_Microsoft": "ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤¸āĨ‰ā¤ĢāĨā¤Ÿ", + "AutoTranslate_Microsoft_API_Key": "Ocp-ā¤ā¤Ēā¤ŋā¤Ž-ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž-ā¤•āĨā¤‚ā¤œāĨ€", + "AutoTranslate_ServiceProvider": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž", + "Available": "ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§", + "Available_agents": "ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "Available_departments": "ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤ĩā¤ŋā¤­ā¤žā¤—", + "Avatar": "ā¤…ā¤ĩā¤¤ā¤žā¤°", + "Avatars": "ā¤…ā¤ĩā¤¤ā¤žā¤°āĨ‹ā¤‚", + "Avatar_changed_successfully": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Avatar_URL": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Avatar_format_invalid": "ā¤…ā¤ĩāĨˆā¤§ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤ĒāĨ¤ ā¤•āĨ‡ā¤ĩā¤˛ ā¤›ā¤ĩā¤ŋ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ", + "Avatar_url_invalid_or_error": "ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆ ā¤¯ā¤ž ā¤Ēā¤šāĨā¤‚ā¤š ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤ā¤• ā¤…ā¤˛ā¤— ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤¸ā¤žā¤ĨāĨ¤", + "Avg_chat_duration": "ā¤šāĨˆā¤Ÿ period ā¤•ā¤ž ā¤”ā¤¸ā¤¤", + "Avg_first_response_time": "ā¤ĒāĨā¤°ā¤Ĩā¤Ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤Žā¤¯ ā¤•ā¤ž ā¤”ā¤¸ā¤¤", + "Avg_of_abandoned_chats": "ā¤›āĨ‹ā¤Ąā¤ŧāĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤Ÿ ā¤•ā¤ž ā¤”ā¤¸ā¤¤", + "Avg_of_available_service_time": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¸ā¤Žā¤¯ ā¤•ā¤ž ā¤”ā¤¸ā¤¤", + "Avg_of_chat_duration_time": "ā¤šāĨˆā¤Ÿ period ā¤•ā¤ž ā¤”ā¤¸ā¤¤ ā¤¸ā¤Žā¤¯", + "Avg_of_service_time": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤¸ā¤Žā¤¯ ā¤•ā¤ž ā¤”ā¤¸ā¤¤", + "Avg_of_waiting_time": "ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯ ā¤•ā¤ž ā¤”ā¤¸ā¤¤", + "Avg_reaction_time": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤Žā¤¯ ā¤•ā¤ž ā¤”ā¤¸ā¤¤", + "Avg_response_time": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤Žā¤¯ ā¤•ā¤ž ā¤”ā¤¸ā¤¤", + "away": "ā¤ĻāĨ‚ā¤°", + "Away": "ā¤ĻāĨ‚ā¤°", + "Back": "ā¤ĒāĨ€ā¤›āĨ‡", + "Back_to_applications": "ā¤…ā¤¨āĨā¤ĒāĨā¤°ā¤¯āĨ‹ā¤—āĨ‹ā¤‚ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Back_to_calendar": "ā¤•āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤° ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Back_to_chat": "ā¤šāĨˆā¤Ÿ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Back_to_imports": "ā¤†ā¤¯ā¤žā¤¤ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Back_to_integration_detail": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Back_to_integrations": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Back_to_login": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤‚", + "Back_to_Manage_Apps": "ā¤ā¤ĒāĨā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤‚", + "Back_to_permissions": "ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Back_to_room": "ā¤•ā¤•āĨā¤ˇ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤žā¤Ēā¤¸", + "Back_to_threads": "ā¤§ā¤žā¤—āĨ‹ā¤‚ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤", + "Backup_codes": "ā¤ŦāĨˆā¤•ā¤…ā¤Ē ā¤•āĨ‹ā¤Ą", + "ban-user": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "ban-user_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "BBB_End_Meeting": "ā¤ŦāĨˆā¤ ā¤• ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤", + "BBB_Enable_Teams": "ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "BBB_Join_Meeting": "ā¤ŦāĨˆā¤ ā¤• ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛", + "BBB_Start_Meeting": "ā¤ŽāĨ€ā¤Ÿā¤ŋā¤‚ā¤— ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "BBB_Video_Call": "ā¤ŦāĨ€ā¤ŦāĨ€ā¤ŦāĨ€ ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛", + "BBB_You_have_no_permission_to_start_a_call": "ā¤†ā¤Ēā¤•āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤•āĨ‹ā¤ˆ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Be_the_first_to_join": "ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤Ŧā¤¨āĨ‡ā¤‚", + "Belongs_To": "ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤", + "Best_first_response_time": "ā¤¸ā¤°āĨā¤ĩāĨ‹ā¤¤āĨā¤¤ā¤Ž ā¤ĒāĨā¤°ā¤Ĩā¤Ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤Žā¤¯", + "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "ā¤ŦāĨ€ā¤Ÿā¤ž ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž. ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤Ēā¤° ā¤¨ā¤ŋā¤°āĨā¤­ā¤° ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Better": "ā¤ŦāĨ‡ā¤šā¤¤ā¤°", + "Bio": "ā¤ĩā¤š ā¤Ĩā¤ž", + "Bio_Placeholder": "ā¤Ŧā¤žā¤¯āĨ‹ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°", + "Block": "ā¤…ā¤ĩā¤°āĨ‹ā¤§ ā¤ĒāĨˆā¤Ļā¤ž ā¤•ā¤°ā¤¨ā¤ž", + "Block_Multiple_Failed_Logins_Attempts_Until_Block_By_Ip": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ā¤ĄāĨā¤°āĨ‡ā¤¸ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤…ā¤¸ā¤Ģā¤˛ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸āĨ‹ā¤‚ ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž", + "Block_Multiple_Failed_Logins_Attempts_Until_Block_by_User": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸āĨ‹ā¤‚ ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž", + "Block_Multiple_Failed_Logins_By_Ip": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ĩā¤ŋā¤Ģā¤˛ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Block_Multiple_Failed_Logins_By_User": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ĩā¤ŋā¤Ģā¤˛ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Block_Multiple_Failed_Logins_Enable_Collect_Login_data_Description": "ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤˛āĨ‡ā¤•ā¤° ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤Ēā¤° ā¤¸ā¤‚ā¤—āĨā¤°ā¤š ā¤¤ā¤• ā¤†ā¤ˆā¤ĒāĨ€ ā¤”ā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Block_Multiple_Failed_Logins_Enabled": "ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ā¤•ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Block_Multiple_Failed_Logins_Ip_Whitelist": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ļāĨā¤ĩāĨ‡ā¤¤ā¤¸āĨ‚ā¤šāĨ€", + "Block_Multiple_Failed_Logins_Ip_Whitelist_Description": "ā¤ļāĨā¤ĩāĨ‡ā¤¤ā¤¸āĨ‚ā¤šāĨ€ā¤Ŧā¤ĻāĨā¤§ ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€", + "Block_Multiple_Failed_Logins_Time_To_Unblock_By_Ip_In_Minutes": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ā¤ĄāĨā¤°āĨ‡ā¤¸ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•āĨ€ period (ā¤Žā¤ŋā¤¨ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚)", + "Block_Multiple_Failed_Logins_Time_To_Unblock_By_Ip_In_Minutes_Description": "ā¤¯ā¤š ā¤ĩā¤š ā¤¸ā¤Žā¤¯ ā¤šāĨˆ ā¤œā¤Ŧ ā¤†ā¤ˆā¤ĒāĨ€ ā¤ā¤ĄāĨā¤°āĨ‡ā¤¸ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ, ā¤”ā¤° ā¤ĩā¤š ā¤¸ā¤Žā¤¯ ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤° ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤…ā¤¸ā¤Ģā¤˛ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Block_Multiple_Failed_Logins_Time_To_Unblock_By_User_In_Minutes": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•āĨ€ period (ā¤Žā¤ŋā¤¨ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚)", + "Block_Multiple_Failed_Logins_Time_To_Unblock_By_User_In_Minutes_Description": "ā¤¯ā¤š ā¤ĩā¤š ā¤¸ā¤Žā¤¯ ā¤šāĨˆ ā¤œā¤Ŧ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ, ā¤”ā¤° ā¤ĩā¤š ā¤¸ā¤Žā¤¯ ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤° ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Block_Multiple_Failed_Logins_Notify_Failed": "ā¤ĩā¤ŋā¤Ģā¤˛ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ĻāĨ‡ā¤‚", + "Block_Multiple_Failed_Logins_Notify_Failed_Channel": "ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨˆā¤¨ā¤˛", + "Block_Multiple_Failed_Logins_Notify_Failed_Channel_Desc": "ā¤¯ā¤šāĨ€ā¤‚ ā¤Ēā¤° ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤‚ā¤—āĨ€. ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ. ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤¨ā¤žā¤Ž ā¤ŽāĨ‡ā¤‚ # ā¤šā¤ŋā¤¨āĨā¤š ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "Block_User": "ā¤–ā¤‚ā¤Ą ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Blockchain": "ā¤ŦāĨā¤˛āĨ‰ā¤•ā¤šāĨ‡ā¤¨", + "block-ip-device-management": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "block-ip-device-management_description": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ā¤ĄāĨā¤°āĨ‡ā¤¸ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Block_IP_Address": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ā¤ĄāĨā¤°āĨ‡ā¤¸ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Blocked_IP_Addresses": "ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤†ā¤ˆā¤ĒāĨ€ ā¤Ēā¤¤āĨ‡", + "Blockstack": "ā¤ŦāĨā¤˛āĨ‰ā¤•ā¤¸āĨā¤ŸāĨˆā¤•", + "Blockstack_Description": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤¤āĨ€ā¤¸ā¤°āĨ‡ ā¤Ēā¤•āĨā¤ˇ ā¤¯ā¤ž ā¤ĻāĨ‚ā¤°ā¤¸āĨā¤Ĩ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤­ā¤°āĨ‹ā¤¸ā¤ž ā¤•ā¤ŋā¤ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤•āĨā¤ˇā¤Žā¤¤ā¤ž ā¤ĻāĨ‡ā¤‚āĨ¤", + "Blockstack_Auth_Description": "ā¤ĒāĨā¤°ā¤žā¤Žā¤žā¤Ŗā¤ŋā¤• ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "Blockstack_ButtonLabelText": "ā¤Ŧā¤Ÿā¤¨ ā¤˛āĨ‡ā¤Ŧā¤˛ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ", + "Blockstack_Generate_Username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Body": "ā¤ļā¤°āĨ€ā¤°", + "Bold": "ā¤ŦāĨ‹ā¤˛āĨā¤Ą", + "bot_request": "ā¤ŦāĨ‰ā¤Ÿ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§", + "BotHelpers_userFields": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "BotHelpers_userFields_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•ā¤ž CSV ā¤œā¤ŋā¤¸āĨ‡ ā¤ŦāĨ‰ā¤ŸāĨā¤¸ ā¤¸ā¤šā¤žā¤¯ā¤• ā¤ĩā¤ŋā¤§ā¤ŋā¤¯āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Bot": "ā¤ŦāĨ€ā¤“ā¤ŸāĨ€", + "Bots": "ā¤ŦāĨ‰ā¤Ÿ", + "Bots_Description": "ā¤ĩāĨ‡ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤ŋā¤¨āĨā¤šāĨ‡ā¤‚ ā¤ŦāĨ‰ā¤Ÿ ā¤ĩā¤ŋā¤•ā¤¸ā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ā¤ŋā¤¤ ā¤”ā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Branch": "ā¤ļā¤žā¤–ā¤ž", + "Broadcast": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ", + "Broadcast_channel": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤šāĨˆā¤¨ā¤˛", + "Broadcast_channel_Description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨ€ ā¤¨ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛ā¤ŋā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ ā¤¸ā¤•āĨ‡ā¤‚ā¤—āĨ‡", + "Broadcast_Connected_Instances": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤ŸāĨ‡ā¤Ą ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Broadcasting_api_key": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€", + "Broadcasting_client_id": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤†ā¤ˆā¤ĄāĨ€", + "Broadcasting_client_secret": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤—āĨā¤°ā¤žā¤šā¤• ā¤°ā¤šā¤¸āĨā¤¯", + "Broadcasting_enabled": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Broadcasting_media_server_url": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤¸ā¤°āĨā¤ĩā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Browse_Files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧ ā¤•ā¤°āĨ‡ā¤‚", + "Browser_does_not_support_audio_element": "ā¤†ā¤Ēā¤•ā¤ž ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤° ā¤ŽāĨ‡ā¤‚ ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¤ā¤¤āĨā¤ĩ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "Browser_does_not_support_video_element": "ā¤†ā¤Ēā¤•ā¤ž ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¤ā¤¤āĨā¤ĩ ā¤•ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž.", + "Browser_does_not_support_recording_video": "ā¤†ā¤Ēā¤•ā¤ž ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž", + "Bugsnag_api_key": "ā¤Ŧā¤—ā¤¸āĨā¤¨ā¤žā¤— ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€", + "Build_Environment": "ā¤Ēā¤°āĨā¤¯ā¤žā¤ĩā¤°ā¤Ŗ ā¤•ā¤ž ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "bulk-register-user": "ā¤ĨāĨ‹ā¤• ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤ā¤", + "bulk-register-user_description": "ā¤Ŧā¤Ąā¤ŧāĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Bundles": "ā¤Ŧā¤‚ā¤Ąā¤˛", + "Busiest_day": "ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤ĩāĨā¤¯ā¤¸āĨā¤¤ ā¤Ļā¤ŋā¤¨", + "Busiest_time": "ā¤ĩāĨā¤¯ā¤¸āĨā¤¤ā¤¤ā¤Ž ā¤¸ā¤Žā¤¯", + "Business_Hour": "ā¤ĩāĨā¤¯ā¤ĩā¤¸ā¤žā¤¯ ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "Business_Hour_Removed": "ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤¸ā¤Žā¤¯ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Business_Hours": "ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˜ā¤‚ā¤ŸāĨ‡", + "Business_hours_enabled": "ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Business_hours_updated": "ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤", + "busy": "ā¤ĩāĨā¤¯ā¤¸āĨā¤¤", + "Busy": "ā¤ĩāĨā¤¯ā¤¸āĨā¤¤", + "Buy": "ā¤–ā¤°āĨ€ā¤Ļā¤¨ā¤ž", + "By": "ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž", + "by": "ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž", + "cache_cleared": "ā¤•āĨˆā¤ļ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Calendar_MeetingUrl_Regex": "ā¤ŽāĨ€ā¤Ÿā¤ŋā¤‚ā¤— ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤°āĨ‡ā¤—āĨā¤˛ā¤° ā¤ā¤•āĨā¤¸ā¤ĒāĨā¤°āĨ‡ā¤ļā¤¨", + "Calendar_MeetingUrl_Regex_Description": "ā¤˜ā¤Ÿā¤¨ā¤ž ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨ€ā¤Ÿā¤ŋā¤‚ā¤— ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤­ā¤ŋā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤ĩāĨˆā¤§ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤ĩā¤žā¤˛āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤Žā¤ŋā¤˛ā¤žā¤¨ ā¤¸ā¤ŽāĨ‚ā¤š ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ HTML ā¤ā¤¨āĨā¤•āĨ‹ā¤ĄāĨ‡ā¤Ą ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤ĄāĨ€ā¤•āĨ‹ā¤Ą ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Calendar_settings": "ā¤•āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—", + "Call": "ā¤ĒāĨā¤•ā¤žā¤°ā¤¨ā¤ž", + "Call_again": "ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤ĢāĨ‹ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Call_back": "ā¤ĩā¤žā¤Ēā¤¸ ā¤ŦāĨā¤˛ā¤žā¤“", + "Call_not_found": "ā¤•āĨ‰ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛āĨ€", + "Call_not_found_error": "ā¤ā¤¸ā¤ž ā¤¤ā¤Ŧ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤Ŧ ā¤•āĨ‰ā¤˛ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Žā¤žā¤¨āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤¯ā¤ž ā¤†ā¤Ēā¤•āĨ‹ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§āĨ€ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤ā¤‚ ā¤† ā¤°ā¤šāĨ€ ā¤šāĨˆā¤‚āĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤•āĨ‰ā¤˛ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤¸āĨā¤°āĨ‹ā¤¤ ā¤•āĨ€ ā¤œā¤žā¤‚ā¤š ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚, ā¤¯ā¤ž ā¤¯ā¤Ļā¤ŋ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤Ŧā¤¨āĨ€ ā¤°ā¤šā¤¤āĨ€ ā¤šāĨˆ ā¤¤āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤Ŧā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Calling": "ā¤•āĨ‰ā¤˛ā¤ŋā¤‚ā¤—", + "Call_Center": "ā¤†ā¤ĩā¤žā¤œ ā¤šāĨˆā¤¨ā¤˛", + "Call_Center_Description": "ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤ĩāĨ‰ā¤¯ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Call_ended": "ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤", + "Calls": "ā¤•āĨ‰ā¤˛", + "Calls_in_queue": "{{calls}} ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "Call_declined": "ā¤•āĨ‰ā¤˛ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤!", + "Call_history_provides_a_record_of_when_calls_took_place_and_who_joined": "ā¤•āĨ‰ā¤˛ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤‡ā¤¸ ā¤Ŧā¤žā¤¤ ā¤•ā¤ž ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•āĨ‰ā¤˛ ā¤•ā¤Ŧ ā¤šāĨā¤ˆ ā¤”ā¤° ā¤•āĨŒā¤¨ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨā¤†āĨ¤", + "Call_Information": "ā¤•āĨ‰ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤ž", + "Call_provider": "ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž", + "Call_Already_Ended": "ā¤•āĨ‰ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤šāĨā¤•āĨ€ ā¤šāĨˆ", + "Call_number": "ā¤•āĨ‰ā¤˛ ā¤¨ā¤‚ā¤Ŧā¤°", + "Call_number_premium_only": "ā¤•āĨ‰ā¤˛ ā¤¨ā¤‚ā¤Ŧā¤° (ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ĒāĨā¤˛ā¤žā¤¨)", + "call-management": "ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨", + "call-management_description": "ā¤ŦāĨˆā¤ ā¤• ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Call_ongoing": "ā¤•āĨ‰ā¤˛ ā¤œā¤žā¤°āĨ€ ā¤šāĨˆ", + "Call_started": "ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤šāĨā¤ˆ", + "Call_unavailable_for_federation": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‰ā¤˛ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Call_was_not_answered": "ā¤•āĨ‰ā¤˛ ā¤•ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Caller": "ā¤•āĨ‹ā¤˛ā¤°", + "Caller_Id": "ā¤•āĨ‰ā¤˛ā¤° ā¤†ā¤ˆā¤ĄāĨ€", + "Camera_access_not_allowed": "ā¤•āĨˆā¤Žā¤°ā¤ž ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤ĨāĨ€, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ€ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤œā¤žā¤‚ā¤šāĨ‡ā¤‚āĨ¤", + "Cam_on": "ā¤•āĨˆā¤Ž ā¤‘ā¤¨", + "Cam_off": "ā¤•āĨˆā¤Ž ā¤Ŧā¤‚ā¤Ļ", + "can-audit": "ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "can-audit_description": "ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "can-audit-log": "ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤˛āĨ‰ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "can-audit-log_description": "ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤˛āĨ‰ā¤— ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", "Cancel": "ā¤°ā¤ĻāĨā¤Ļ ā¤•ā¤°ā¤¨ā¤ž", "Cancel_message_input": "ā¤°ā¤ĻāĨā¤Ļ ā¤•ā¤°ā¤¨ā¤ž", + "Canceled": "ā¤°ā¤ĻāĨā¤Ļ", + "Canned_Response_Created": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤Ŧā¤¨ā¤žā¤ˆ ā¤—ā¤ˆ", + "Canned_Response_Updated": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•āĨ€ ā¤—ā¤ˆ", + "Canned_Response_Delete_Warning": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤žāĨ¤", + "Canned_Response_Removed": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Canned_Response_Sharing_Department_Description": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤‡ā¤¸ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Canned_Response_Sharing_Private_Description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤†ā¤Ē ā¤”ā¤° ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤šāĨ€ ā¤‡ā¤¸ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Canned_Response_Sharing_Public_Description": "ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤‡ā¤¸ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Canned_Responses": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤‚", + "Canned_Responses_Enable": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨā¤¤āĨā¤¤ā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Create_department": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_direct_message": "ā¤¸āĨ€ā¤§ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_tag": "ā¤ŸāĨˆā¤— ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_trigger": "ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_SLA_policy": "SLA ā¤¨āĨ€ā¤¤ā¤ŋ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Cannot_invite_users_to_direct_rooms": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨ€ā¤§āĨ‡ ā¤°āĨ‚ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", + "Cannot_open_conversation_with_yourself": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤†ā¤Ē ā¤¸āĨ‡ ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤­āĨ‡ā¤œā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", + "Cannot_share_your_location": "ā¤†ā¤Ēā¤•ā¤ž ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸ā¤žā¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž...", + "Cannot_disable_while_on_call": "ā¤•āĨ‰ā¤˛ ā¤•āĨ‡ ā¤ĻāĨŒā¤°ā¤žā¤¨ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ŧā¤Ļā¤˛ ā¤¸ā¤•ā¤¤āĨ‡", + "Cant_join": "ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡", + "CAS": "ā¤•āĨˆā¤¸", + "CAS_Description": "ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤°āĨ€ā¤¯ ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨ‡ā¤ĩā¤ž ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤ˆ ā¤ĒāĨā¤°āĨ‹ā¤ŸāĨ‹ā¤•āĨ‰ā¤˛ ā¤Ēā¤° ā¤•ā¤ˆ ā¤¸ā¤žā¤‡ā¤ŸāĨ‹ā¤‚ ā¤Ēā¤° ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°āĨ‡ā¤ĄāĨ‡ā¤‚ā¤ļā¤ŋā¤¯ā¤˛āĨā¤¸ ā¤•āĨ‡ ā¤ā¤• ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "CAS_autoclose": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‰ā¤Ēā¤…ā¤Ē ā¤¸āĨā¤ĩā¤¤ā¤ƒ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "CAS_base_url": "ā¤ā¤¸ā¤ā¤¸ā¤“ ā¤ŦāĨ‡ā¤¸ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "CAS_base_url_Description": "ā¤†ā¤Ēā¤•āĨ€ ā¤Ŧā¤žā¤šā¤°āĨ€ SSO ā¤¸āĨ‡ā¤ĩā¤ž ā¤•ā¤ž ā¤†ā¤§ā¤žā¤° URL ā¤œāĨˆā¤¸āĨ‡: `https://sso.example.undef/sso/`", + "CAS_button_color": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ŧā¤Ÿā¤¨ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤°ā¤‚ā¤—", + "CAS_button_label_color": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ŧā¤Ÿā¤¨ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤°ā¤‚ā¤—", + "CAS_button_label_text": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ŧā¤Ÿā¤¨ ā¤˛āĨ‡ā¤Ŧā¤˛", + "CAS_Creation_User_Enabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "CAS_Creation_User_Enabled_Description": "CAS ā¤Ÿā¤ŋā¤•ā¤Ÿ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤•ā¤°ā¤žā¤ ā¤—ā¤ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸āĨ‡ CAS ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚āĨ¤", "CAS_enabled": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "CAS_Login_Layout": "CAS ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤˛āĨ‡ā¤†ā¤‰ā¤Ÿ", + "CAS_login_url": "ā¤ā¤¸ā¤ā¤¸ā¤“ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "CAS_login_url_Description": "ā¤†ā¤Ēā¤•āĨ€ ā¤Ŧā¤žā¤šā¤°āĨ€ SSO ā¤¸āĨ‡ā¤ĩā¤ž ā¤•ā¤ž ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ URL ā¤œāĨˆā¤¸āĨ‡: `https://sso.example.undef/sso/login`", + "CAS_popup_height": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‰ā¤Ēā¤…ā¤Ē ā¤Šā¤‚ā¤šā¤žā¤ˆ", + "CAS_popup_width": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‰ā¤Ēā¤…ā¤Ē ā¤šāĨŒā¤Ąā¤ŧā¤žā¤ˆ", + "CAS_Sync_User_Data_Enabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•āĨ‹ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "CAS_Sync_User_Data_Enabled_Description": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° ā¤Ŧā¤žā¤šā¤°āĨ€ CAS ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•āĨ‹ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤“ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤ŋā¤‚ā¤•āĨā¤°ā¤¨ā¤žā¤‡ā¤œā¤ŧ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚: ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤ā¤ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤¸ā¤Žā¤¨āĨā¤ĩā¤¯ā¤ŋā¤¤ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "CAS_Sync_User_Data_FieldMap": "ā¤—āĨā¤Ŗ ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°", + "CAS_Sync_User_Data_FieldMap_Description": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤“ā¤‚ (ā¤Žā¤žā¤¨) ā¤¸āĨ‡ ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤ā¤ (ā¤•āĨā¤‚ā¤œāĨ€) ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸ JSON ā¤‡ā¤¨ā¤ĒāĨā¤Ÿ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤ '%' ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤‚ā¤˛ā¤—āĨā¤¨ ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤ŽāĨ‚ā¤˛āĨā¤¯ ā¤¸āĨā¤ŸāĨā¤°ā¤ŋā¤‚ā¤— ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤•āĨā¤ˇāĨ‡ā¤Ēā¤ŋā¤¤ ā¤šāĨ‹ā¤‚ā¤—āĨ‡āĨ¤\nā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ, `{\"ā¤ˆā¤ŽāĨ‡ā¤˛\":\"%ā¤ˆā¤ŽāĨ‡ā¤˛%\", \"ā¤¨ā¤žā¤Ž\":\"%ā¤Ēā¤šā¤˛ā¤ž ā¤¨ā¤žā¤Ž%, %ā¤…ā¤‚ā¤¤ā¤ŋā¤Žā¤¨ā¤žā¤Ž%\"}`\n \nā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤° ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤ĒāĨā¤°ā¤•āĨā¤ˇāĨ‡ā¤Ēā¤ŋā¤¤ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆāĨ¤ CAS 1.0 ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‡ā¤ĩā¤˛ `ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž` ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆāĨ¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤ā¤ ā¤šāĨˆā¤‚: ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž, ā¤¨ā¤žā¤Ž, ā¤ˆā¤ŽāĨ‡ā¤˛, ā¤•ā¤Žā¤°āĨ‡; ā¤°āĨ‚ā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ ā¤Ēā¤° ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤ā¤• ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€ ā¤šāĨˆ, ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤: `{\"rooms\": \"%team%,%department%\"}` ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ ā¤Ēā¤° CAS ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ€ ā¤ŸāĨ€ā¤Ž ā¤”ā¤° ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤", + "CAS_trust_username": "CAS ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ēā¤° ā¤­ā¤°āĨ‹ā¤¸ā¤ž ā¤•ā¤°āĨ‡ā¤‚", + "CAS_trust_username_description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, Rocket.Chat ā¤•āĨ‹ ā¤­ā¤°āĨ‹ā¤¸ā¤ž ā¤šāĨ‹ā¤—ā¤ž ā¤•ā¤ŋ CAS ā¤•ā¤ž ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž Rocket.Chat ā¤Ēā¤° ā¤‰ā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤šāĨˆāĨ¤\nā¤¯ā¤Ļā¤ŋ ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž CAS ā¤Ēā¤° ā¤Ŧā¤Ļā¤˛ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤‡ā¤¸ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆ, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤¯ā¤š ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ CAS ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤•ā¤° Rocket.Chat ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤Ēā¤° ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛āĨ‡ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤­āĨ€ ā¤ĻāĨ‡ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "CAS_version": "ā¤•āĨˆā¤¸ ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "CAS_version_Description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤†ā¤Ēā¤•āĨ€ CAS SSO ā¤¸āĨ‡ā¤ĩā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ CAS ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Categories": "ā¤ļāĨā¤°āĨ‡ā¤Ŗā¤ŋā¤¯ā¤žā¤", + "Categories*": "ā¤ļāĨā¤°āĨ‡ā¤Ŗā¤ŋā¤¯ā¤žā¤*", + "CDN_JSCSS_PREFIX": "ā¤œāĨ‡ā¤ā¤¸/ā¤¸āĨ€ā¤ā¤¸ā¤ā¤¸ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ€ā¤ĄāĨ€ā¤ā¤¨ ā¤‰ā¤Ēā¤¸ā¤°āĨā¤—", + "CDN_PREFIX": "ā¤¸āĨ€ā¤ĄāĨ€ā¤ā¤¨ ā¤‰ā¤Ēā¤¸ā¤°āĨā¤—", + "CDN_PREFIX_ALL": "ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ€ā¤ĄāĨ€ā¤ā¤¨ ā¤‰ā¤Ēā¤¸ā¤°āĨā¤— ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Certificates_and_Keys": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤° ā¤”ā¤° ā¤šā¤žā¤Ŧā¤ŋā¤¯ā¤žā¤", + "changed_room_announcement_to__room_announcement_": "ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž ā¤•āĨ‹ ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž: {{room_announcement}}", + "changed_room_description_to__room_description_": "ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤•āĨ‹ ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž: {{room_description}}", + "change-livechat-room-visitor": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚", + "change-livechat-room-visitor_description": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Change_Room_Type": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž", + "Changing_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž", + "channel": "ā¤šāĨˆā¤¨ā¤˛", + "Channel": "ā¤šāĨˆā¤¨ā¤˛", + "Channel_already_exist": "ā¤šāĨˆā¤¨ā¤˛ `#%s` ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆāĨ¤", + "Channel_already_exist_static": "ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ.", + "Channel_already_Unarchived": "`#%s` ā¤¨ā¤žā¤Ž ā¤ĩā¤žā¤˛ā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤…ā¤¨ā¤žā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ", + "Channel_Archived": "`#%s` ā¤¨ā¤žā¤Ž ā¤ĩā¤žā¤˛ā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Channel_created": "ā¤šāĨˆā¤¨ā¤˛ `#%s` ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž.", + "Channel_doesnt_exist": "ā¤šāĨˆā¤¨ā¤˛ `#%s` ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "Channel_Export": "ā¤šāĨˆā¤¨ā¤˛ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤", + "Channel_name": "ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Channel_Name_Placeholder": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "Channel_to_listen_on": "ā¤¸āĨā¤¨ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨˆā¤¨ā¤˛", + "Channel_Unarchived": "`#%s` ā¤¨ā¤žā¤Ž ā¤ĩā¤žā¤˛ā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤…ā¤¨ā¤žā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Channels": "ā¤šāĨˆā¤¨ā¤˛", + "Channels_added": "ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ ā¤—ā¤", + "Channels_are_where_your_team_communicate": "ā¤šāĨˆā¤¨ā¤˛ ā¤ĩāĨ‡ ā¤šāĨˆā¤‚ ā¤œā¤šā¤žā¤‚ ā¤†ā¤Ēā¤•āĨ€ ā¤ŸāĨ€ā¤Ž ā¤¸ā¤‚ā¤ĩā¤žā¤Ļ ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆ", + "Channels_list": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€", + "Channel_what_is_this_channel_about": "ā¤¯ā¤š ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ŋā¤¸ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ?", + "Chart": "ā¤šā¤žā¤°āĨā¤Ÿ", + "Chat_button": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤Ÿā¤¨", + "Chat_close": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Chat_closed": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ", + "Chat_closed_by_agent": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Chat_closed_successfully": "ā¤šāĨˆā¤Ÿ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤‚ā¤Ļ ā¤šāĨā¤ˆ", + "Chat_History": "ā¤šāĨˆā¤Ÿ ā¤•ā¤ž ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸", + "Chat_Now": "ā¤…ā¤­āĨ€ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "chat_on_hold_due_to_inactivity": "ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ā¤¤ā¤ž ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ ā¤¯ā¤š ā¤šāĨˆā¤Ÿ ā¤°āĨā¤•āĨ€ ā¤šāĨā¤ˆ ā¤šāĨˆ", + "Chat_On_Hold": "ā¤šāĨˆā¤Ÿ ā¤‘ā¤¨-ā¤šāĨ‹ā¤˛āĨā¤Ą", + "Chat_On_Hold_Successfully": "ā¤‡ā¤¸ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤‘ā¤¨-ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤ž", + "Chat_queued": "ā¤šāĨˆā¤Ÿ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋā¤Ŧā¤ĻāĨā¤§", + "Chat_removed": "ā¤šāĨˆā¤Ÿ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Chat_resumed": "ā¤šāĨˆā¤Ÿ ā¤Ģā¤ŋā¤° ā¤¸āĨ‡ ā¤ļāĨā¤°āĨ‚ ā¤šāĨā¤ˆ", + "Chat_start": "ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­", + "Chat_started": "ā¤šāĨˆā¤Ÿ ā¤ļāĨā¤°āĨ‚ ā¤šāĨā¤ˆ", + "Chat_taken": "ā¤šāĨˆā¤Ÿ ā¤˛ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Chat_window": "ā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹", + "Chatops_Enabled": "ā¤šāĨˆā¤ŸāĨ‰ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Chatops_Title": "ā¤šāĨˆā¤ŸāĨ‰ā¤ĒāĨā¤¸ ā¤ĒāĨˆā¤¨ā¤˛", + "Chatops_Username": "ā¤šāĨˆā¤ŸāĨ‰ā¤ĒāĨā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "Chat_Duration": "ā¤šāĨˆā¤Ÿ ā¤•āĨ€ period", + "Chats_removed": "ā¤šāĨˆā¤Ÿ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆā¤‚", + "Check_All": "ā¤¸ā¤­āĨ€ ā¤šāĨ‡ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Check_if_the_spelling_is_correct": "ā¤œā¤žā¤‚ā¤šāĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•āĨā¤¯ā¤ž ā¤ĩā¤°āĨā¤¤ā¤¨āĨ€ ā¤¸ā¤šāĨ€ ā¤šāĨˆ", + "Check_Progress": "ā¤ĒāĨā¤°ā¤—ā¤¤ā¤ŋ ā¤•āĨ€ ā¤œā¤žā¤ā¤š ā¤•ā¤°āĨ‡ā¤‚", + "Check_device_activity": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤—ā¤¤ā¤ŋā¤ĩā¤ŋā¤§ā¤ŋ ā¤•āĨ€ ā¤œā¤žā¤ā¤š ā¤•ā¤°āĨ‡ā¤‚", + "Choose_a_room": "ā¤ā¤• ā¤•ā¤Žā¤°ā¤ž ā¤šāĨā¤¨āĨ‡ā¤‚", + "Choose_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šāĨā¤¨āĨ‡ā¤‚", + "Choose_the_alias_that_will_appear_before_the_username_in_messages": "ā¤ĩā¤š ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤œāĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤—ā¤žāĨ¤", + "Choose_the_username_that_this_integration_will_post_as": "ā¤ĩā¤š ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤œā¤ŋā¤¸ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¯ā¤š ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž.", + "Choose_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨā¤¨āĨ‡ā¤‚", + "Clean_History_unavailable_for_federation": "ā¤Žā¤šā¤žā¤¸ā¤‚ā¤˜ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤ĩā¤šāĨā¤› ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤…ā¤¨āĨā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆ", + "Clean_Usernames": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°āĨ‡ā¤‚", + "clean-channel-history": "ā¤¸āĨā¤ĩā¤šāĨā¤› ā¤šāĨˆā¤¨ā¤˛ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸", + "clean-channel-history_description": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "clear": "ā¤¸āĨā¤Ēā¤ˇāĨā¤Ÿ", + "Clear_all_unreads_question": "ā¤¸ā¤­āĨ€ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°āĨ‡ā¤‚?", + "clear_cache_now": "ā¤…ā¤­āĨ€ ā¤•āĨˆā¤ļ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°āĨ‡ā¤‚", + "Clear_filters": "ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°āĨ‡ā¤‚", + "clear_history": "ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤Žā¤ŋā¤Ÿā¤ž ā¤ĻāĨ‡ā¤‚", + "Clear_livechat_session_when_chat_ended": "ā¤šāĨˆā¤Ÿ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤¸ā¤¤āĨā¤° ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°āĨ‡ā¤‚", + "clear-oembed-cache": "OEmbed ā¤•āĨˆā¤ļ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°āĨ‡ā¤‚", + "clear-oembed-cache_description": "OEmbed ā¤•āĨˆā¤ļ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Click_here": "ā¤¯ā¤šā¤žā¤ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Click_here_for_more_details_or_contact_sales_for_a_new_license": "ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚ ā¤¯ā¤ž ā¤¨ā¤ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ {{email}} ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Click_here_for_more_info": "ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Click_here_to_clear_the_selection": "ā¤šā¤¯ā¤¨ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Click_here_to_enter_your_encryption_password": "ā¤…ā¤Ēā¤¨ā¤ž ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Click_here_to_view_and_copy_your_password": "ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤”ā¤° ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Click_the_messages_you_would_like_to_send_by_email": "ā¤‰ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤ŋā¤¨āĨā¤šāĨ‡ā¤‚ ā¤†ā¤Ē ā¤ˆ-ā¤ŽāĨ‡ā¤˛ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Click_to_join": "ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚!", + "Click_to_load": "ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Client_ID": "ā¤—āĨā¤°ā¤žā¤šā¤• ID", "Client_Secret": "ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ Secret", + "Client": "ā¤—āĨā¤°ā¤žā¤šā¤•", + "Clients_will_refresh_in_a_few_seconds": "ā¤—āĨā¤°ā¤žā¤šā¤• ā¤•āĨā¤› ā¤šāĨ€ ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡", + "close": "ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨ā¤ž", + "Close": "ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨ā¤ž", + "Close_chat": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Close_room_description": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤šāĨˆā¤‚. ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤œā¤žā¤°āĨ€ ā¤°ā¤–ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "close-livechat-room": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "close-livechat-room_description": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‹ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "close-others-livechat-room": "ā¤…ā¤¨āĨā¤¯ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "close-others-livechat-room_description": "ā¤…ā¤¨āĨā¤¯ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Close_Window": "ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹ ā¤Ŧā¤‚ā¤Ļ", + "Closed": "ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨā¤†", + "Closed_At": "ā¤Ēā¤° ā¤Ŧā¤‚ā¤Ļ ā¤šāĨā¤†", + "Closed_automatically": "ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Closed_automatically_because_chat_was_onhold_for_seconds": "ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤šāĨˆā¤Ÿ {{onHoldTime}} ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤ĨāĨ€", + "Closed_automatically_chat_queued_too_long": "ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ (ā¤•ā¤¤ā¤žā¤° ā¤•ā¤ž ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤Žā¤¯ ā¤Ēā¤žā¤° ā¤šāĨ‹ ā¤—ā¤¯ā¤ž)", + "Closed_by_visitor": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Wrap_up_conversation": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "These_options_affect_this_conversation_only_To_set_default_selections_go_to_My_Account_Omnichannel": "ā¤¯āĨ‡ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•āĨ‡ā¤ĩā¤˛ ā¤‡ā¤¸ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚. ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šā¤¯ā¤¨ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤ŽāĨ‡ā¤°ā¤ž ā¤–ā¤žā¤¤ā¤ž > ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤œā¤žā¤ā¤āĨ¤", + "This_option_affect_this_conversation_only_To_set_default_selection_go_to_My_Account_Omnichannel": "ā¤¯ā¤š ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•āĨ‡ā¤ĩā¤˛ ā¤‡ā¤¸ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ. ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šā¤¯ā¤¨ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤ŽāĨ‡ā¤°ā¤ž ā¤–ā¤žā¤¤ā¤ž > ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤œā¤žā¤ā¤āĨ¤", + "Closing_chat": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "Closing_chat_message": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Cloud": "ā¤Ŧā¤žā¤Ļā¤˛", + "Cloud_Apply_Offline_License": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°āĨ‡ā¤‚", + "Cloud_Change_Offline_License": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚", + "Cloud_License_applied_successfully": "ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤˛ā¤žā¤—āĨ‚ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž!", + "Cloud_Invalid_license": "ā¤…ā¤ĩāĨˆā¤§ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸!", + "Cloud_Apply_license": "ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°āĨ‡ā¤‚", + "Cloud_connectivity": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿā¤ŋā¤ĩā¤ŋā¤ŸāĨ€", + "Cloud_address_to_send_registration_to": "ā¤…ā¤Ēā¤¨ā¤ž ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•ā¤ž ā¤Ēā¤¤ā¤žāĨ¤", + "Cloud_click_here": "ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ, [ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ (ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚)]({{cloudConsoleUrl}}) ā¤Ēā¤° ā¤œā¤žā¤ā¤‚āĨ¤", + "Cloud_console": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤‚ā¤¸āĨ‹ā¤˛", + "Cloud_error_code": "ā¤•āĨ‹ā¤Ą: {{errorCode}}", + "Cloud_error_in_authenticating": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨā¤ˆ", + "Cloud_Info": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Cloud_login_to_cloud": "Rocket.Chat ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Cloud_logout": "ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Cloud_manually_input_token": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Cloud_register_error": "ā¤†ā¤Ēā¤•āĨ‡ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•āĨ‹ ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ā¤• ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤šāĨā¤ˆ ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤Ŧā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤¨: ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Cloud_Register_manually": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "Cloud_register_offline_finish_helper": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĒāĨ‚ā¤°āĨ€ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤†ā¤Ēā¤•āĨ‹ ā¤•āĨā¤› ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤ĒāĨā¤°ā¤¸āĨā¤¤āĨā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤‡ā¤¸āĨ‡ ā¤¯ā¤šā¤žā¤‚ ā¤ĒāĨ‡ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Cloud_register_offline_helper": "ā¤¯ā¤Ļā¤ŋ ā¤ā¤¯ā¤°ā¤—āĨˆā¤Ē ā¤¯ā¤ž ā¤¨āĨ‡ā¤Ÿā¤ĩā¤°āĨā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤šāĨˆ ā¤¤āĨ‹ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•āĨ‹ ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤šā¤Žā¤žā¤°āĨ‡ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤Ēā¤° ā¤œā¤žā¤ā¤‚āĨ¤", + "Cloud_register_success": "ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆ!", + "Cloud_registration_required": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•", + "Cloud_registration_required_description": "ā¤ā¤¸ā¤ž ā¤˛ā¤—ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤•āĨ‡ ā¤ĻāĨŒā¤°ā¤žā¤¨ ā¤†ā¤Ēā¤¨āĨ‡ ā¤…ā¤Ēā¤¨ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨā¤¨ā¤žāĨ¤", + "Cloud_registration_required_link_text": "ā¤…ā¤Ēā¤¨ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Cloud_resend_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĻāĨā¤Ŧā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Cloud_Service_Agree_PrivacyTerms": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤ž ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚ ā¤…ā¤¨āĨā¤Ŧā¤‚ā¤§", + "Cloud_Service_Agree_PrivacyTerms_Description": "ā¤ŽāĨˆā¤‚ [ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚](https://rocket.chat/terms) ā¤”ā¤° [ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¨āĨ€ā¤¤ā¤ŋ](https://rocket.chat/privacy) ā¤¸āĨ‡ ā¤¸ā¤šā¤Žā¤¤ ā¤šāĨ‚ā¤‚", + "Cloud_Service_Agree_PrivacyTerms_Login_Disabled_Warning": "ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤ļā¤°āĨā¤¤āĨ‹ā¤‚ (ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤ĩā¤ŋā¤œā¤ŧā¤žā¤°āĨā¤Ą > ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ > ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤ž ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚ ā¤…ā¤¨āĨā¤Ŧā¤‚ā¤§) ā¤•āĨ‹ ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "Cloud_status_page_description": "ā¤¯ā¤Ļā¤ŋ ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤ž ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤† ā¤°ā¤šāĨ€ ā¤šāĨˆ ā¤¤āĨ‹ ā¤†ā¤Ē ā¤šā¤Žā¤žā¤°āĨ‡ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ēā¤° ā¤œāĨā¤žā¤žā¤¤ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤œā¤žā¤‚ā¤š ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Cloud_token_instructions": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤Ēā¤° ā¤œā¤žā¤ā¤‚āĨ¤ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤¯ā¤ž ā¤ā¤• ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤ā¤‚ ā¤”ā¤° ā¤¸āĨā¤ĩ-ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤°ā¤œā¤ŋā¤¸āĨā¤Ÿā¤° ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ‹ ā¤šā¤ŋā¤Ēā¤•ā¤žā¤ā¤", + "Cloud_troubleshooting": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤¨ā¤ŋā¤ĩā¤žā¤°ā¤Ŗ", + "Cloud_update_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Cloud_what_is_it": "ā¤¯ā¤š ā¤•āĨā¤¯ā¤ž ā¤šāĨˆ?", + "Copy_Link": "ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛ā¤ŋā¤Ēā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "Copy_password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "Cloud_what_is_it_additional": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤…ā¤˛ā¤žā¤ĩā¤ž ā¤†ā¤Ē Rocket.Chat ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤¸āĨ‡ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸, ā¤Ŧā¤ŋā¤˛ā¤ŋā¤‚ā¤— ā¤”ā¤° ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤‚ā¤—āĨ‡āĨ¤", + "Cloud_what_is_it_description": "Rocket.Chat ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸āĨā¤ĩ-ā¤šāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ Rocket.Chat ā¤ĩā¤°āĨā¤•ā¤¸āĨā¤ĒāĨ‡ā¤¸ ā¤•āĨ‹ ā¤šā¤Žā¤žā¤°āĨ‡ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•āĨ€ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Cloud_what_is_it_services_like": "ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤ ā¤œāĨˆā¤¸āĨ‡:", + "Cloud_workspace_connected": "ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° Rocket.Chat Cloud ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤ž ā¤šāĨˆāĨ¤ ā¤¯ā¤šā¤žā¤‚ ā¤…ā¤Ēā¤¨āĨ‡ Rocket.Chat ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤–ā¤žā¤¤āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤†ā¤Ē ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤œāĨˆā¤¸āĨ€ ā¤•āĨā¤› ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•ā¤° ā¤¸ā¤•āĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Cloud_workspace_connected_plus_account": "ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤…ā¤Ŧ Rocket.Chat ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤ā¤• ā¤–ā¤žā¤¤ā¤ž ā¤¸ā¤‚ā¤Ŧā¤ĻāĨā¤§ ā¤šāĨˆāĨ¤", + "Cloud_workspace_connected_without_account": "ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤…ā¤Ŧ Rocket.Chat ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤šā¤žā¤šāĨ‡ā¤‚, ā¤¤āĨ‹ ā¤†ā¤Ē Rocket.Chat ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤–ā¤žā¤¤āĨ‡ ā¤¸āĨ‡ ā¤œāĨ‹ā¤Ąā¤ŧ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Cloud_workspace_disconnect": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤…ā¤Ŧ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤¤āĨ‹ ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ Rocket.Chat Cloud ā¤¸āĨ‡ ā¤Ąā¤ŋā¤¸āĨā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Cloud_workspace_support": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‹ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤ž ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°āĨ‡ā¤ļā¤žā¤¨āĨ€ ā¤šāĨ‹ ā¤°ā¤šāĨ€ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤Ŧā¤¨āĨ€ ā¤°ā¤šā¤¤āĨ€ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ā¤Ÿā¤ŋā¤•ā¤Ÿ ā¤–āĨ‹ā¤˛āĨ‡ā¤‚āĨ¤", + "Collaborative": "ā¤¸ā¤šā¤¯āĨ‹ā¤—ā¤žā¤¤āĨā¤Žā¤•", + "Collapse": "ā¤—ā¤ŋā¤° ā¤œā¤žā¤¨ā¤ž", + "Collapse_Embedded_Media_By_Default": "ā¤ā¤‚ā¤ŦāĨ‡ā¤ĄāĨ‡ā¤Ą ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤•āĨ‹ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤‚ā¤•āĨā¤ˇā¤ŋā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "color": "ā¤°ā¤‚ā¤—", + "Color": "ā¤°ā¤‚ā¤—", + "Colors": "ā¤°ā¤‚ā¤— ā¤•āĨ€", + "Commands": "ā¤†ā¤ĻāĨ‡ā¤ļ", + "Comment_to_leave_on_closing_session": "ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤¸ā¤¤āĨā¤° ā¤Ēā¤° ā¤œā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "Comment": "ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€", + "Common_Access": "ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯ ā¤Ēā¤šāĨā¤‚ā¤š", + "Commit": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤ĻāĨā¤§", + "Community": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯", + "Free_Edition": "ā¤¨ā¤ŋā¤ļāĨā¤˛āĨā¤• ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "Composer_not_available_phone_calls": "ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤•āĨ‰ā¤˛ ā¤Ēā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "Condensed": "ā¤¸ā¤‚ā¤˜ā¤¨ā¤ŋā¤¤", + "Condition": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Commit_details": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤ĻāĨā¤§ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "Completed": "ā¤ĒāĨā¤°ā¤ž ā¤šāĨ‹ā¤¨ā¤žāĨ¤", + "Computer": "ā¤•ā¤‚ā¤ĒāĨā¤¯āĨ‚ā¤Ÿā¤°", + "Conference_call_apps": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤ā¤ĒāĨā¤¸", + "Conference_call_has_ended": "_ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆ._", + "Conference_name": "ā¤¸ā¤ŽāĨā¤ŽāĨ‡ā¤˛ā¤¨ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Configure_Incoming_Mail_IMAP": "ā¤‡ā¤¨ā¤•ā¤Žā¤ŋā¤‚ā¤— ā¤ŽāĨ‡ā¤˛ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚ (IMAP)", + "Configure_Outgoing_Mail_SMTP": "ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ŽāĨ‡ā¤˛ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚ (ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€)", + "Configure_video_conference_to_make_it_available_on_this_workspace": "ā¤‡ā¤¸āĨ‡ ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤•ā¤°ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Confirm": "ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°ā¤¨ā¤ž", + "Confirm_new_encryption_password": "ā¤¨ā¤¯āĨ‡ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "Confirm_new_password": "ā¤¨ā¤ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "Confirm_New_Password_Placeholder": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¨ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "Confirm_password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•āĨ€ā¤œā¤ŋā¤¯āĨ‡", + "Confirm_your_password": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "Confirm_configuration_update_description": "ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤”ā¤° ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ŧā¤°ā¤•ā¤°ā¤žā¤° ā¤°ā¤–ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤

    ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ : ā¤¯ā¤Ļā¤ŋ ā¤¯ā¤š ā¤ĩā¤žā¤¸āĨā¤¤ā¤ĩ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤‚ ā¤”ā¤° ā¤¸ā¤‚ā¤šā¤žā¤° ā¤ĩā¤ŋā¤ĩā¤žā¤ĻāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤Ŧā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Confirm_configuration_update": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "Confirm_new_workspace_description": "ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤”ā¤° ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤

    ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ : ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤Ēā¤° ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Confirm_new_workspace": "ā¤¨ā¤ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "Confirmation": "ā¤ĒāĨā¤ˇāĨā¤ŸāĨ€ā¤•ā¤°ā¤Ŗ", + "Configure_video_conference": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Configuration_update_confirmed": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•āĨ€ ā¤—ā¤ˆ", + "Configuration_update": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨", + "Connect": "ā¤œāĨ‹ā¤Ąā¤ŧā¤¨ā¤ž", + "Connected": "ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤šāĨā¤", + "Connect_SSL_TLS": "ā¤ā¤¸ā¤ā¤¸ā¤ā¤˛/ā¤ŸāĨ€ā¤ā¤˛ā¤ā¤¸ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧāĨ‡ā¤‚", + "Connection_Closed": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤Ŧā¤‚ā¤Ļ", + "Connection_Reset": "ā¤¸ā¤ŽāĨā¤Ŧā¤¨āĨā¤§ ā¤Ģā¤ŋā¤°ā¤¸āĨ‡ ā¤Ŧā¤¨ā¤žā¤¨ā¤ž", + "Connection_error": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "Connection_failed": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĩā¤ŋā¤Ģā¤˛", + "Connectivity_Services": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿā¤ŋā¤ĩā¤ŋā¤ŸāĨ€ ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤", + "Consulting": "CONSULTING", + "Consumer_Packaged_Goods": "ā¤‰ā¤Ēā¤­āĨ‹ā¤•āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨˆā¤• ā¤•āĨ€ ā¤—ā¤ˆ ā¤ĩā¤¸āĨā¤¤āĨā¤ā¤‚", + "Contact": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•", + "Contacts": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•", + "Contact_Name": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¨ā¤žā¤Ž", + "Contact_Center": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤°", + "Contact_Chat_History": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤šāĨˆā¤Ÿ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸", + "Contains_Security_Fixes": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤¸āĨā¤§ā¤žā¤° ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆā¤‚", + "Contact_Manager": "ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Contact_not_found": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Contact_Profile": "ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Contact_Info": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Content": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€", + "Continue": "ā¤œā¤žā¤°āĨ€ ā¤°ā¤–ā¤¨ā¤ž", + "Continuous_sound_notifications_for_new_livechat_room": "ā¤¨ā¤ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤ŋā¤°ā¤‚ā¤¤ā¤° ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚", + "convert-team": "ā¤ŸāĨ€ā¤Ž ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "convert-team_description": "ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Conversation": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Conversation_closed": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ŧā¤‚ā¤Ļ: {{comment}}.", + "Conversation_closed_without_comment": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ŧā¤‚ā¤Ļ", + "Conversation_closing_tags": "ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤ŸāĨˆā¤—", + "Conversation_closing_tags_description": "ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤ŸāĨˆā¤— ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤Ēā¤° ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤ĒāĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤¸ā¤žā¤‡ā¤¨ ā¤•ā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Conversation_finished": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤–ā¤ŧā¤¤āĨā¤Ž", + "Conversation_finished_message": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Conversation_finished_text": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤Ēā¤žā¤ ", + "conversation_with_s": "%s ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Conversations": "ā¤Ŧā¤žā¤¤ ā¤šā¤ŋā¤Ÿ", + "Conversations_per_day": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤Ļā¤ŋā¤¨ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Convert": "ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž", + "Convert_Ascii_Emojis": "ASCII ā¤•āĨ‹ ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚", + "Convert_to_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤¨ā¤ĩā¤°āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Converting_channel_to_a_team": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤ā¤• ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¸ā¤­āĨ€ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤°ā¤–ā¤ž ā¤œā¤žā¤ā¤—ā¤ž.", + "Converted__roomName__to_team": "#{{roomName}} ā¤•āĨ‹ ā¤ā¤• ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Converted__roomName__to_channel": "#{{roomName}} ā¤•āĨ‹ ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Converted__roomName__to_a_team": "#{{roomName}} ā¤•āĨ‹ ā¤ā¤• ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Converted__roomName__to_a_channel": "#{{roomName}} ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Converting_team_to_channel": "ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Copied": "ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Copy": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛ā¤ŋā¤Ēā¤ŋ", + "Copy_text": "ā¤Ēā¤žā¤  ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "Copy_to_clipboard": "ā¤•āĨā¤˛ā¤ŋā¤Ēā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤Ēā¤° ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "COPY_TO_CLIPBOARD": "ā¤•āĨā¤˛ā¤ŋā¤Ēā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤Ēā¤° ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "could-not-access-webdav": "WebDAV ā¤¤ā¤• ā¤¨ā¤šāĨ€ā¤‚ ā¤Ēā¤šāĨā¤‚ā¤š ā¤¸ā¤•ā¤ž", + "Count": "count ā¤•ā¤°ā¤¨ā¤ž", + "Counters": "ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤°", + "Country": "ā¤ĻāĨ‡ā¤ļ", + "Country_Afghanistan": "ā¤…ā¤Ģā¤ŧā¤—ā¤ŧā¤žā¤¨ā¤ŋā¤¸āĨā¤¤ā¤žā¤¨", + "Country_Albania": "ā¤…ā¤˛āĨā¤Ŧā¤žā¤¨ā¤ŋā¤¯ā¤ž", + "Country_Algeria": "ā¤ā¤˛ā¤œāĨ€ā¤°ā¤ŋā¤¯ā¤ž", + "Country_American_Samoa": "ā¤…ā¤ŽāĨ‡ā¤°ā¤ŋā¤•āĨ€ ā¤¸ā¤ŽāĨ‹ā¤†", + "Country_Andorra": "ā¤ā¤‚ā¤ĄāĨ‹ā¤°ā¤ž", + "Country_Angola": "ā¤…ā¤‚ā¤—āĨ‹ā¤˛ā¤ž", + "Country_Anguilla": "ā¤ā¤‚ā¤—āĨā¤‡ā¤˛ā¤ž", + "Country_Antarctica": "ā¤…ā¤‚ā¤Ÿā¤žā¤°āĨā¤•ā¤Ÿā¤ŋā¤•ā¤ž", + "Country_Antigua_and_Barbuda": "ā¤…ā¤ŖāĨā¤ŸāĨ€ā¤—āĨā¤† ā¤”ā¤° ā¤Ŧā¤žā¤°ā¤ŦāĨ‚ā¤Ąā¤ž", + "Country_Argentina": "ā¤…ā¤°āĨā¤œāĨ‡ā¤‚ā¤ŸāĨ€ā¤¨ā¤ž", + "Country_Armenia": "ā¤†ā¤°āĨā¤ŽāĨ€ā¤¨ā¤ŋā¤¯ā¤ž", + "Country_Aruba": "ā¤…ā¤°āĨ‚ā¤Ŧā¤ž", + "Country_Australia": "ā¤‘ā¤¸āĨā¤ŸāĨā¤°āĨ‡ā¤˛ā¤ŋā¤¯ā¤ž", + "Country_Austria": "ā¤‘ā¤¸āĨā¤ŸāĨā¤°ā¤ŋā¤¯ā¤ž", + "Country_Azerbaijan": "ā¤†ā¤œā¤ŧā¤°ā¤Ŧā¤žā¤‡ā¤œā¤žā¤¨", + "Country_Bahamas": "ā¤Ŧā¤šā¤žā¤Žā¤ž", + "Country_Bahrain": "ā¤Ŧā¤šā¤°āĨ€ā¤¨", + "Country_Bangladesh": "ā¤Ŧā¤žā¤‚ā¤—āĨā¤˛ā¤žā¤ĻāĨ‡ā¤ļ", + "Country_Barbados": "ā¤Ŧā¤žā¤°ā¤Ŧā¤žā¤ĄāĨ‹ā¤¸", + "Country_Belarus": "ā¤ŦāĨ‡ā¤˛āĨ‹ā¤°āĨ‚ā¤¸", + "Country_Belgium": "ā¤ŦāĨ‡ā¤˛āĨā¤œā¤ŋā¤¯ā¤Ž", + "Country_Belize": "ā¤ŦāĨ‡ā¤˛āĨ€ā¤œā¤ŧ", + "Country_Benin": "ā¤ŦāĨ‡ā¤¨ā¤ŋā¤¨", + "Country_Bermuda": "ā¤Ŧā¤°ā¤ŽāĨ‚ā¤Ąā¤ž", + "Country_Bhutan": "ā¤­āĨ‚ā¤Ÿā¤žā¤¨", + "Country_Bolivia": "ā¤ŦāĨ‹ā¤˛āĨ€ā¤ĩā¤ŋā¤¯ā¤ž", + "Country_Bosnia_and_Herzegovina": "ā¤ŦāĨ‹ā¤¸āĨā¤¨ā¤ŋā¤¯ā¤ž ā¤”ā¤° ā¤šā¤°āĨā¤œāĨ‡ā¤—āĨ‹ā¤ĩā¤ŋā¤¨ā¤ž", + "Country_Botswana": "ā¤ŦāĨ‹ā¤¤āĨā¤¸ā¤ĩā¤žā¤¨ā¤ž", + "Country_Bouvet_Island": "ā¤Ŧā¤žā¤‰ā¤ĩāĨ‡ā¤Ÿ ā¤ĻāĨā¤ĩāĨ€ā¤Ē", + "Country_Brazil": "ā¤ŦāĨā¤°ā¤žā¤œā¤ŧā¤ŋā¤˛", + "Country_British_Indian_Ocean_Territory": "ā¤ŦāĨā¤°ā¤ŋā¤ŸāĨ‡ā¤¨ ā¤”ā¤° ā¤­ā¤žā¤°ā¤¤āĨ€ā¤¯ ā¤¸ā¤ŽāĨā¤ĻāĨā¤°āĨ€ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Country_Brunei_Darussalam": "ā¤ŦāĨā¤°āĨ‚ā¤¨āĨ‡ā¤‡āĨā¤° ā¤Ļā¤žā¤°ā¤ā¤¸āĨā¤¸ā¤˛ā¤žā¤Ž", + "Country_Bulgaria": "ā¤ŦāĨā¤˛āĨā¤—ā¤žā¤°ā¤ŋā¤¯ā¤ž", + "Country_Burkina_Faso": "ā¤ŦāĨā¤°āĨā¤•ā¤ŋā¤¨ā¤ž ā¤Ģā¤žā¤¸āĨ‹", + "Country_Burundi": "ā¤ŦāĨā¤¸āĨā¤°āĨā¤¨āĨā¤ĻāĨ€", + "Country_Cambodia": "ā¤•ā¤‚ā¤ŦāĨ‹ā¤Ąā¤ŋā¤¯ā¤ž", + "Country_Cameroon": "ā¤•āĨˆā¤Žā¤°āĨ‚ā¤¨", + "Country_Canada": "ā¤•ā¤¨ā¤žā¤Ąā¤ž", + "Country_Cape_Verde": "ā¤•āĨ‡ā¤Ē ā¤ĩā¤°āĨā¤Ą", + "Country_Cayman_Islands": "ā¤•āĨ‡ā¤Žā¤¨ ā¤ĻāĨā¤ĩāĨ€ā¤Ēā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Central_African_Republic": "ā¤•āĨ‡ā¤¨āĨā¤ĻāĨā¤°āĨ€ā¤¯ ā¤…ā¤Ģā¤ŧāĨā¤°āĨ€ā¤•āĨ€ ā¤—ā¤Ŗā¤°ā¤žā¤œāĨā¤¯", + "Country_Chad": "ā¤•ā¤žā¤—ā¤ŧā¤œā¤ŧ ā¤•ā¤ž ā¤ŸāĨā¤•ā¤Ąā¤ŧā¤ž", + "Country_Chile": "ā¤šā¤ŋā¤˛āĨ€", + "Country_China": "ā¤šāĨ€ā¤¨", + "Country_Christmas_Island": "ā¤•āĨā¤°ā¤ŋā¤¸ā¤Žā¤¸ ā¤ĻāĨā¤ĩāĨ€ā¤Ē", + "Country_Cocos_Keeling_Islands": "ā¤•āĨ‹ā¤•āĨ‹ā¤¸ (ā¤•āĨ€ā¤˛ā¤ŋā¤‚ā¤—) ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Colombia": "ā¤•āĨ‹ā¤˛ā¤‚ā¤Ŧā¤ŋā¤¯ā¤ž", + "Country_Comoros": "ā¤•āĨ‹ā¤ŽāĨ‹ā¤°āĨ‹ā¤¸", + "Country_Congo": "ā¤•ā¤žā¤‚ā¤—āĨ‹", + "Country_Congo_The_Democratic_Republic_of_The": "ā¤•ā¤žā¤‚ā¤—āĨ‹, ā¤˛āĨ‹ā¤•ā¤¤ā¤žā¤‚ā¤¤āĨā¤°ā¤ŋā¤• ā¤—ā¤Ŗā¤°ā¤žā¤œāĨā¤¯", + "Country_Cook_Islands": "ā¤•āĨā¤• ā¤ĻāĨā¤ĩāĨ€ā¤Ēā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Costa_Rica": "ā¤•āĨ‹ā¤¸āĨā¤Ÿā¤ž ā¤°ā¤ŋā¤•ā¤ž", + "Country_Cote_Divoire": "ā¤šā¤žā¤ĨāĨ€ā¤Ļā¤žā¤‚ā¤¤ ā¤•ā¤ž ā¤•ā¤ŋā¤¨ā¤žā¤°ā¤ž", + "Country_Croatia": "ā¤•āĨā¤°āĨ‹ā¤ā¤ļā¤ŋā¤¯ā¤ž", + "Country_Cuba": "ā¤•āĨā¤¯āĨ‚ā¤Ŧā¤ž", + "Country_Cyprus": "ā¤¸ā¤žā¤‡ā¤ĒāĨā¤°ā¤¸", + "Country_Czech_Republic": "ā¤šāĨ‡ā¤• ā¤°ā¤ŋā¤Ēā¤ŦāĨā¤˛ā¤ŋā¤•", + "Country_Denmark": "ā¤ĄāĨ‡ā¤¨ā¤Žā¤žā¤°āĨā¤•", + "Country_Djibouti": "ā¤œā¤ŧā¤ŋā¤ŦāĨ‚ā¤ŸāĨ€", + "Country_Dominica": "ā¤ĄāĨ‹ā¤Žā¤ŋā¤¨ā¤ŋā¤•ā¤ž", + "Country_Dominican_Republic": "ā¤ĄāĨ‹ā¤Žā¤ŋā¤¨ā¤ŋā¤•ā¤¨ ā¤—ā¤Ŗā¤°ā¤žā¤œāĨā¤¯", + "Country_Ecuador": "ā¤‡ā¤•āĨā¤ĩāĨ‡ā¤ĄāĨ‹ā¤°", + "Country_Egypt": "ā¤Žā¤ŋā¤¸āĨā¤°", + "Country_El_Salvador": "ā¤…ā¤˛ ā¤¸ā¤žā¤˛āĨā¤ĩā¤žā¤ĄāĨ‹ā¤°", + "Country_Equatorial_Guinea": "ā¤­āĨ‚ā¤Žā¤§āĨā¤¯ā¤ĩā¤°āĨā¤¤āĨ€ ā¤—ā¤ŋā¤¨āĨ€", + "Country_Eritrea": "ā¤‡ā¤°ā¤ŋā¤ŸāĨā¤°ā¤ŋā¤¯ā¤ž", + "Country_Estonia": "ā¤ā¤¸āĨā¤¤āĨ‹ā¤¨ā¤ŋā¤¯ā¤ž", + "Country_Ethiopia": "ā¤‡ā¤Ĩā¤ŋā¤¯āĨ‹ā¤Ēā¤ŋā¤¯ā¤ž", + "Country_Falkland_Islands_Malvinas": "ā¤Ģā¤ŧāĨ‰ā¤•ā¤˛āĨˆā¤‚ā¤Ą ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤¸ā¤ŽāĨ‚ā¤š (ā¤Žā¤žā¤˛āĨā¤ĩā¤ŋā¤¨ā¤žā¤¸)", + "Country_Faroe_Islands": "ā¤Ģā¤ŧāĨˆā¤°āĨ‹ ā¤ĻāĨā¤ĩāĨ€ā¤Ē", + "Country_Fiji": "ā¤Ģā¤ŧā¤ŋā¤œāĨ€", + "Country_Finland": "ā¤Ģā¤ŋā¤¨ā¤˛āĨˆā¤‚ā¤Ą", + "Country_France": "ā¤ĢāĨā¤°ā¤žā¤‚ā¤¸", + "Country_French_Guiana": "ā¤ĢāĨā¤°āĨ‡ā¤‚ā¤š ā¤—ā¤¯ā¤žā¤¨ā¤ž", + "Country_French_Polynesia": "ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤š ā¤ĒāĨ‹ā¤˛ā¤ŋā¤¨āĨ‡ā¤ļā¤ŋā¤¯ā¤ž", + "Country_French_Southern_Territories": "ā¤Ļā¤•āĨā¤ˇā¤ŋā¤ŖāĨ€ ā¤ĢāĨā¤°ā¤žā¤ā¤¸ā¤ŋā¤¸āĨ€ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Country_Gabon": "ā¤—āĨˆā¤ŦāĨ‰ā¤¨", + "Country_Gambia": "ā¤—ā¤žā¤ŽāĨā¤Ŧā¤ŋā¤¯ā¤ž", + "Country_Georgia": "ā¤œāĨ‰ā¤°āĨā¤œā¤ŋā¤¯ā¤ž", + "Country_Germany": "ā¤œā¤°āĨā¤Žā¤¨āĨ€", + "Country_Ghana": "ā¤˜ā¤žā¤¨ā¤ž", + "Country_Gibraltar": "ā¤œā¤ŋā¤ŦāĨā¤°ā¤žā¤˛āĨā¤Ÿā¤°", + "Country_Greece": "ā¤¯āĨ‚ā¤¨ā¤žā¤¨", + "Country_Greenland": "ā¤—āĨā¤°āĨ€ā¤¨ā¤˛āĨˆā¤‚ā¤Ą", + "Country_Grenada": "ā¤—āĨā¤°āĨ‡ā¤¨āĨ‡ā¤Ąā¤ž", + "Country_Guadeloupe": "ā¤—āĨā¤ĩā¤žā¤ĄāĨ‡ā¤˛āĨ‹ā¤Ē", + "Country_Guam": "ā¤—āĨā¤†ā¤Ž", + "Country_Guatemala": "ā¤—āĨā¤ĩā¤žā¤ŸāĨ‡ā¤Žā¤žā¤˛ā¤ž", + "Country_Guinea": "ā¤—ā¤ŋā¤¨āĨ€", + "Country_Guinea_bissau": "ā¤—ā¤ŋā¤¨āĨ€-ā¤Ŧā¤ŋā¤¸ā¤žā¤Š", + "Country_Guyana": "ā¤—āĨā¤¯ā¤žā¤¨ā¤ž", + "Country_Haiti": "ā¤šāĨˆā¤¤āĨ€", + "Country_Heard_Island_and_Mcdonald_Islands": "ā¤šā¤°āĨā¤Ą ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤”ā¤° ā¤ŽāĨˆā¤•ā¤ĄāĨ‹ā¤¨ā¤žā¤˛āĨā¤Ą ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Holy_See_Vatican_City_State": "ā¤šāĨ‹ā¤˛āĨ€ ā¤¸āĨ€ (ā¤ĩāĨ‡ā¤Ÿā¤ŋā¤•ā¤¨ ā¤¸ā¤ŋā¤ŸāĨ€ ā¤°ā¤žā¤œāĨā¤¯)", + "Country_Honduras": "ā¤šāĨ‹ā¤‚ā¤ĄāĨā¤°ā¤¸", + "Country_Hong_Kong": "ā¤šā¤žā¤‚ā¤—ā¤•ā¤žā¤‚ā¤—", + "Country_Hungary": "ā¤šā¤‚ā¤—ā¤°āĨ€", + "Country_Iceland": "ā¤†ā¤‡ā¤¸ā¤˛āĨˆā¤‚ā¤Ą", + "Country_India": "ā¤­ā¤žā¤°ā¤¤", + "Country_Indonesia": "ā¤‡ā¤‚ā¤ĄāĨ‹ā¤¨āĨ‡ā¤ļā¤ŋā¤¯ā¤ž", + "Country_Iran_Islamic_Republic_of": "ā¤ˆā¤°ā¤žā¤¨ (ā¤‡ā¤¸āĨā¤˛ā¤žā¤Žā¤ŋā¤• ā¤°ā¤ŋā¤Ēā¤ŦāĨā¤˛ā¤ŋā¤• ā¤‘ā¤Ģ", + "Country_Iraq": "ā¤‡ā¤°ā¤žā¤•", + "Country_Ireland": "ā¤†ā¤¯ā¤°ā¤˛āĨˆā¤‚ā¤Ą", + "Country_Israel": "ā¤‡ā¤œā¤°ā¤žā¤‡ā¤˛", + "Country_Italy": "ā¤‡ā¤Ÿā¤˛āĨ€", + "Country_Jamaica": "ā¤œā¤ŽāĨˆā¤•ā¤ž", + "Country_Japan": "ā¤œā¤žā¤Ēā¤žā¤¨", + "Country_Jordan": "ā¤œāĨ‰ā¤°āĨā¤Ąā¤¨", + "Country_Kazakhstan": "ā¤•ā¤œā¤žā¤–ā¤¸āĨā¤¤ā¤žā¤¨", + "Country_Kenya": "ā¤•āĨ‡ā¤¨āĨā¤¯ā¤ž", + "Country_Kiribati": "ā¤•ā¤ŋā¤°ā¤ŋā¤Ŧā¤žā¤¤āĨ€", + "Country_Korea_Democratic_Peoples_Republic_of": "ā¤•āĨ‹ā¤°ā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤œā¤žā¤¤ā¤žā¤¤āĨā¤°ā¤ŋā¤• ā¤œā¤¨ā¤ĩā¤žā¤ĻāĨ€ ā¤—ā¤Ŗā¤¤ā¤‚ā¤¤āĨā¤°", + "Country_Korea_Republic_of": "ā¤•āĨ‹ā¤°ā¤ŋā¤¯ā¤ž ā¤—ā¤Ŗā¤°ā¤žā¤œāĨā¤¯", + "Country_Kuwait": "ā¤•āĨā¤ĩāĨˆā¤Ÿ", + "Country_Kyrgyzstan": "ā¤•ā¤ŋā¤°āĨā¤—ā¤ŋā¤œā¤ŧā¤¸āĨā¤¤ā¤žā¤¨", + "Country_Lao_Peoples_Democratic_Republic": "ā¤˛ā¤žā¤“ ā¤ĒāĨ€ā¤ĒāĨā¤˛āĨā¤¸ ā¤ĄāĨ‡ā¤ŽāĨ‹ā¤•āĨā¤°āĨ‡ā¤Ÿā¤ŋā¤• ā¤°ā¤ŋā¤Ēā¤ŦāĨā¤˛ā¤ŋā¤•", + "Country_Latvia": "ā¤˛ā¤žā¤¤ā¤ĩā¤ŋā¤¯ā¤ž", + "Country_Lebanon": "ā¤˛āĨ‡ā¤Ŧā¤¨ā¤žā¤¨", + "Country_Lesotho": "ā¤˛ā¤ŋā¤¸āĨ‹ā¤ŸāĨ‹", + "Country_Liberia": "ā¤˛ā¤žā¤‡ā¤ŦāĨ‡ā¤°ā¤ŋā¤¯ā¤ž", + "Country_Libyan_Arab_Jamahiriya": "ā¤˛āĨ€ā¤Ŧā¤ŋā¤¯ā¤ž ā¤•ā¤ž ā¤…ā¤°ā¤Ŧ ā¤œā¤Žā¤šā¤ŋā¤°ā¤ŋā¤¯ā¤ž", + "Country_Liechtenstein": "ā¤˛ā¤ŋā¤•ā¤ŸāĨ‡ā¤‚ā¤¸āĨā¤Ÿā¤žā¤‡ā¤¨", + "Country_Lithuania": "ā¤˛ā¤ŋā¤ĨāĨā¤†ā¤¨ā¤ŋā¤¯ā¤ž", + "Country_Luxembourg": "ā¤˛ā¤•āĨā¤¸ā¤Žā¤Ŧā¤°āĨā¤—", + "Country_Macao": "ā¤Žā¤•ā¤žā¤“", + "Country_Macedonia_The_Former_Yugoslav_Republic_of": "ā¤ŽāĨˆā¤¸āĨ‡ā¤ĄāĨ‹ā¤¨ā¤ŋā¤¯ā¤ž, ā¤ĒāĨ‚ā¤°āĨā¤ĩ ā¤¯āĨ‚ā¤—āĨ‹ā¤¸āĨā¤˛ā¤žā¤ĩ ā¤—ā¤Ŗā¤°ā¤žā¤œāĨā¤¯", + "Country_Madagascar": "ā¤ŽāĨ‡ā¤Ąā¤žā¤—ā¤žā¤¸āĨā¤•ā¤°", + "Country_Malawi": "ā¤Žā¤˛ā¤žā¤ĩāĨ€", + "Country_Malaysia": "ā¤Žā¤˛āĨ‡ā¤ļā¤ŋā¤¯ā¤ž", + "Country_Maldives": "ā¤Žā¤žā¤˛ā¤ĻāĨ€ā¤ĩ", + "Country_Mali": "ā¤ĩāĨ‡ ā¤ĨāĨ‡", + "Country_Malta": "ā¤Žā¤žā¤˛āĨā¤Ÿā¤ž", + "Country_Marshall_Islands": "ā¤Žā¤žā¤°āĨā¤ļā¤˛ ā¤ĻāĨā¤ĩāĨ€ā¤Ēā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Martinique": "ā¤Žā¤žā¤°āĨā¤ŸāĨ€ā¤¨ā¤ŋā¤•", + "Country_Mauritania": "ā¤ŽāĨ‰ā¤°ā¤ŋā¤Ÿā¤žā¤¨ā¤ŋā¤¯ā¤ž", + "Country_Mauritius": "ā¤ŽāĨ‰ā¤°āĨ€ā¤ļā¤¸", + "Country_Mayotte": "ā¤ŽāĨˆā¤¯ā¤Ÿ", + "Country_Mexico": "ā¤ŽāĨ‡ā¤•āĨā¤¸ā¤ŋā¤•āĨ‹", + "Country_Micronesia_Federated_States_of": "ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤¨āĨ‡ā¤ļā¤ŋā¤¯ā¤ž, ā¤¸ā¤‚ā¤˜āĨ€ā¤¯ ā¤°ā¤žā¤œāĨā¤¯", + "Country_Moldova_Republic_of": "ā¤ŽāĨ‹ā¤˛āĨā¤ĻāĨ‹ā¤ĩā¤ž, ā¤—ā¤Ŗā¤°ā¤žā¤œāĨā¤¯", + "Country_Monaco": "ā¤ŽāĨ‹ā¤¨ā¤žā¤•āĨ‹", + "Country_Mongolia": "ā¤Žā¤‚ā¤—āĨ‹ā¤˛ā¤ŋā¤¯ā¤ž", + "Country_Montserrat": "ā¤ŽāĨ‹ā¤‚ā¤ŸāĨ‡ā¤¸āĨ‡ā¤°ā¤žā¤Ÿ", + "Country_Morocco": "ā¤ŽāĨ‹ā¤°ā¤•āĨā¤•āĨ‹", + "Country_Mozambique": "ā¤ŽāĨ‹ā¤œā¤ŧā¤žā¤ŽāĨā¤Ŧā¤ŋā¤•", + "Country_Myanmar": "ā¤ŽāĨā¤¯ā¤žā¤‚ā¤Žā¤žā¤°", + "Country_Namibia": "ā¤¨ā¤žā¤Žā¤ŋā¤Ŧā¤ŋā¤¯ā¤ž", + "Country_Nauru": "ā¤¨ā¤žā¤‰ā¤°āĨ‚", + "Country_Nepal": "ā¤¨āĨ‡ā¤Ēā¤žā¤˛", + "Country_Netherlands": "ā¤¨āĨ€ā¤Ļā¤°ā¤˛āĨˆā¤‚ā¤Ą", + "Country_Netherlands_Antilles": "ā¤¨āĨ€ā¤Ļā¤°ā¤˛āĨˆā¤‚ā¤ĄāĨā¤¸ ā¤ā¤‚ā¤Ÿā¤žā¤‡ā¤˛āĨā¤¸", + "If_you_dont_have_one_send_an_email_to_omni_rocketchat_to_get_yours": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤•āĨ‹ā¤ˆ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤¤āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ [omni@rocket.chat](mailto:omni@rocket.chat) ā¤Ēā¤° ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚āĨ¤", + "Country_New_Caledonia": "ā¤¨ā¤¯ā¤ž ā¤•āĨ‡ā¤˛ā¤ĄāĨ‹ā¤¨ā¤ŋā¤¯ā¤ž", + "Country_New_Zealand": "ā¤¨āĨā¤¯āĨ‚ā¤œā¤ŧāĨ€ā¤˛āĨˆā¤‚ā¤Ą", + "Country_Nicaragua": "ā¤¨ā¤ŋā¤•ā¤žā¤°ā¤žā¤—āĨā¤†", + "Country_Niger": "ā¤¨ā¤žā¤‡ā¤œā¤°", + "Country_Nigeria": "ā¤¨ā¤žā¤‡ā¤œāĨ€ā¤°ā¤ŋā¤¯ā¤ž", + "Country_Niue": "ā¤¨ā¤ŋā¤¯āĨ‚", + "Country_Norfolk_Island": "ā¤¨āĨ‰ā¤°ā¤Ģā¤ŧāĨ‰ā¤• ā¤ĻāĨā¤ĩāĨ€ā¤Ē", + "Country_Northern_Mariana_Islands": "ā¤‰ā¤¤āĨā¤¤ā¤°āĨ€ ā¤Žā¤°āĨ€ā¤¯ā¤žā¤¨ā¤ž ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Norway": "ā¤¨āĨ‰ā¤°āĨā¤ĩāĨ‡", + "Country_Oman": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤Žā¤¨", + "Country_Pakistan": "ā¤Ēā¤žā¤•ā¤ŋā¤¸āĨā¤¤ā¤žā¤¨", + "Country_Palau": "ā¤Ēā¤˛ā¤žā¤‰", + "Country_Palestinian_Territory_Occupied": "ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤Ģā¤ŧā¤ŋā¤˛ā¤ŋā¤¸āĨā¤¤āĨ€ā¤¨ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Country_Panama": "ā¤Ēā¤¨ā¤žā¤Žā¤ž", + "Country_Papua_New_Guinea": "ā¤Ēā¤žā¤ĒāĨā¤† ā¤¨āĨā¤¯āĨ‚ ā¤—ā¤ŋā¤¨āĨ€", + "Country_Paraguay": "ā¤Ēā¤°ā¤žā¤—āĨā¤†", + "Country_Peru": "ā¤ĒāĨ‡ā¤°āĨ‚", + "Country_Philippines": "ā¤Ģā¤ŋā¤˛ā¤ŋā¤ĒāĨ€ā¤‚ā¤¸", + "Country_Pitcairn": "ā¤Ēā¤ŋā¤Ÿā¤•āĨ‡ā¤°āĨā¤¨", + "Country_Poland": "ā¤ĒāĨ‹ā¤˛āĨˆā¤‚ā¤Ą", + "Country_Portugal": "ā¤ĒāĨā¤°āĨā¤¤ā¤—ā¤žā¤˛", + "Country_Puerto_Rico": "ā¤ĒāĨā¤¯āĨ‚ā¤°āĨā¤ŸāĨ‹ ā¤°ā¤ŋā¤•āĨ‹", + "Country_Qatar": "ā¤•ā¤¤ā¤°", + "Country_Reunion": "ā¤°āĨ€ā¤¯āĨ‚ā¤¨ā¤ŋā¤¯ā¤¨", + "Country_Romania": "ā¤°āĨ‹ā¤Žā¤žā¤¨ā¤ŋā¤¯ā¤ž", + "Country_Russian_Federation": "ā¤°āĨ‚ā¤¸āĨ€ ā¤¸ā¤‚ā¤˜", + "Country_Rwanda": "ā¤°ā¤ĩā¤žā¤‚ā¤Ąā¤ž", + "Country_Saint_Helena": "Saint Helena", + "Country_Saint_Kitts_and_Nevis": "ā¤¸ā¤‚ā¤¤ ā¤•ā¤ŋā¤ŸāĨā¤ŸāĨā¤¸ ā¤”ā¤° ā¤¨āĨ‡ā¤ĩā¤ŋā¤¸", + "Country_Saint_Lucia": "ā¤¸āĨ‡ā¤‚ā¤Ÿ ā¤˛āĨ‚ā¤¸ā¤ŋā¤¯ā¤ž", + "Country_Saint_Pierre_and_Miquelon": "ā¤¸āĨ‡ā¤‚ā¤Ÿ ā¤Ēā¤ŋā¤¯ā¤°āĨ‡ ā¤”ā¤° ā¤Žā¤ŋā¤•āĨ‡ā¤˛āĨ‰ā¤¨", + "Country_Saint_Vincent_and_The_Grenadines": "ā¤¸ā¤‚ā¤¤ ā¤ĩā¤ŋā¤‚ā¤¸āĨ‡ā¤‚ā¤Ÿ ā¤…ā¤ā¤Ą ā¤ĨāĨ‡ ā¤—āĨā¤°āĨ‡ā¤¨ā¤ĄāĨ€ā¤¨āĨ‡ā¤¸", + "Country_Samoa": "ā¤¸ā¤ŽāĨ‹ā¤†", + "Country_San_Marino": "ā¤¸āĨˆā¤¨ ā¤Žā¤žā¤°ā¤ŋā¤¨āĨ‹", + "Country_Sao_Tome_and_Principe": "ā¤¸ā¤žā¤“ ā¤ŸāĨ‹ā¤ŽāĨ‡ ā¤”ā¤° ā¤ĒāĨā¤°ā¤ŋā¤‚ā¤¸ā¤ŋā¤ĒāĨ‡", + "Country_Saudi_Arabia": "ā¤¸ā¤Šā¤ĻāĨ€ ā¤…ā¤°ā¤Ŧ", + "Country_Senegal": "ā¤¸āĨ‡ā¤¨āĨ‡ā¤—ā¤˛", + "Country_Serbia_and_Montenegro": "ā¤¸ā¤°āĨā¤Ŧā¤ŋā¤¯ā¤ž ā¤”ā¤° ā¤ŽāĨ‹ā¤‚ā¤ŸāĨ‡ā¤¨āĨ‡ā¤—āĨā¤°āĨ‹", + "inline_code": "ā¤‡ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤•āĨ‹ā¤Ą", + "Country_Seychelles": "ā¤¸āĨ‡ā¤ļā¤˛āĨā¤¸", + "Country_Sierra_Leone": "ā¤¸āĨ‡ā¤°ā¤ž ā¤˛ā¤ŋā¤“ā¤¨", + "Country_Singapore": "ā¤¸ā¤ŋā¤‚ā¤—ā¤žā¤ĒāĨā¤°", + "Country_Slovakia": "ā¤¸āĨā¤˛āĨ‹ā¤ĩā¤žā¤•ā¤ŋā¤¯ā¤ž", + "Country_Slovenia": "ā¤¸āĨā¤˛āĨ‹ā¤ĩāĨ‡ā¤¨ā¤ŋā¤¯ā¤ž", + "Country_Solomon_Islands": "ā¤¸āĨ‹ā¤˛āĨ‹ā¤Žā¤¨ ā¤‡ā¤¸āĨā¤˛āĨˆā¤‚ā¤Ąā¤¸", + "Country_Somalia": "ā¤¸āĨ‹ā¤Žā¤žā¤˛ā¤ŋā¤¯ā¤ž", + "Country_South_Africa": "ā¤Ļā¤•āĨā¤ˇā¤ŋā¤Ŗ ā¤…ā¤ĢāĨā¤°āĨ€ā¤•ā¤ž", + "Country_South_Georgia_and_The_South_Sandwich_Islands": "ā¤Ļā¤•āĨā¤ˇā¤ŋā¤Ŗ ā¤œāĨ‰ā¤°āĨā¤œā¤ŋā¤¯ā¤ž ā¤”ā¤° ā¤Ļā¤•āĨā¤ˇā¤ŋā¤Ŗ ā¤¸āĨˆā¤‚ā¤Ąā¤ĩā¤ŋā¤š ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Spain": "ā¤¸āĨā¤ĒāĨ‡ā¤¨", + "Country_Sri_Lanka": "ā¤ļāĨā¤°āĨ€ā¤˛ā¤‚ā¤•ā¤ž", + "Country_Sudan": "ā¤¸āĨ‚ā¤Ąā¤žā¤¨", + "Country_Suriname": "ā¤¸āĨ‚ā¤°āĨ€ā¤¨ā¤žā¤Ž", + "Country_Svalbard_and_Jan_Mayen": "ā¤¸āĨā¤ĩā¤žā¤˛ā¤Ŧā¤žā¤°āĨā¤Ą ā¤”ā¤° ā¤œā¤žā¤¨ ā¤Žā¤žā¤¯āĨ‡ā¤¨", + "Country_Swaziland": "ā¤¸āĨā¤ĩā¤žā¤œāĨ€ā¤˛āĨˆā¤‚ā¤Ą", + "Country_Sweden": "ā¤¸āĨā¤ĩāĨ€ā¤Ąā¤¨", + "Country_Switzerland": "ā¤¸āĨā¤ĩā¤ŋā¤ŸāĨā¤œā¤ŧā¤°ā¤˛āĨˆā¤‚ā¤Ą", + "Country_Syrian_Arab_Republic": "ā¤¸āĨ€ā¤°ā¤ŋā¤¯ā¤žā¤ˆ ā¤…ā¤°ā¤Ŧ ā¤—ā¤Ŗā¤°ā¤žā¤œāĨā¤¯", + "Country_Taiwan_Province_of_China": "ā¤¤ā¤žā¤‡ā¤ĩā¤žā¤¨, ā¤šāĨ€ā¤¨ ā¤ĒāĨā¤°ā¤žā¤‚ā¤¤", + "Country_Tajikistan": "ā¤¤ā¤œā¤žā¤•ā¤ŋā¤¸āĨā¤¤ā¤žā¤¨", + "Country_Tanzania_United_Republic_of": "ā¤¤ā¤‚ā¤œā¤žā¤¨ā¤ŋā¤¯ā¤ž, ā¤¸ā¤‚ā¤¯āĨā¤•āĨā¤¤ ā¤—ā¤Ŗā¤°ā¤žā¤œāĨā¤¯", + "Country_Thailand": "ā¤Ĩā¤žā¤ˆā¤˛āĨˆā¤‚ā¤Ą", + "Country_Timor_leste": "ā¤¤ā¤ŋā¤ŽāĨ‹ā¤° ā¤¨āĨ‡ ā¤Ēā¤ĸā¤ŧā¤ž", + "Country_Togo": "ā¤šā¤˛ ā¤ĻāĨ‡ā¤¨ā¤ž", + "Country_Tokelau": "ā¤ŸāĨ‹ā¤•āĨ‡ā¤˛ā¤žā¤Š", + "Country_Tonga": "ā¤Ēā¤šāĨā¤ā¤šā¤ž", + "Country_Trinidad_and_Tobago": "ā¤¤āĨā¤°ā¤ŋā¤¨ā¤ŋā¤Ļā¤žā¤Ļ ā¤”ā¤° ā¤ŸāĨ‹ā¤ŦāĨˆā¤—āĨ‹", + "Country_Tunisia": "ā¤ŸāĨā¤¯āĨ‚ā¤¨āĨ€ā¤ļā¤ŋā¤¯ā¤ž", + "Country_Turkey": "ā¤Ÿā¤°āĨā¤•āĨ€", + "Country_Turkmenistan": "ā¤¤āĨā¤°āĨā¤•ā¤ŽāĨ‡ā¤¨ā¤ŋā¤¸āĨā¤¤ā¤žā¤¨", + "Country_Turks_and_Caicos_Islands": "ā¤¤āĨā¤°āĨā¤• ā¤”ā¤° ā¤•āĨˆā¤•āĨ‹ā¤¸ ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Tuvalu": "ā¤¤āĨā¤ĩā¤žā¤˛āĨ‚", + "Country_Uganda": "ā¤¯āĨā¤—ā¤žā¤‚ā¤Ąā¤ž", + "Country_Ukraine": "ā¤¯āĨ‚ā¤•āĨā¤°āĨ‡ā¤¨", + "Country_United_Arab_Emirates": "ā¤¸ā¤‚ā¤¯āĨā¤•āĨā¤¤ ā¤…ā¤°ā¤Ŧ ā¤…ā¤ŽāĨ€ā¤°ā¤žā¤¤", + "Country_United_Kingdom": "ā¤¯āĨ‚ā¤¨ā¤žā¤‡ā¤ŸāĨ‡ā¤Ą ā¤•ā¤ŋā¤‚ā¤—ā¤Ąā¤Ž", + "Country_United_States": "ā¤¸ā¤‚ā¤¯āĨā¤•āĨā¤¤ ā¤°ā¤žā¤œāĨā¤¯ ā¤…ā¤ŽāĨ‡ā¤°ā¤ŋā¤•ā¤ž", + "Country_United_States_Minor_Outlying_Islands": "ā¤¸ā¤‚ā¤¯āĨā¤•āĨā¤¤ ā¤°ā¤žā¤œāĨā¤¯ ā¤…ā¤ŽāĨ‡ā¤°ā¤ŋā¤•ā¤ž ā¤•āĨ‡ ā¤›āĨ‹ā¤ŸāĨ‡ ā¤ĻāĨ‚ā¤°ā¤¸āĨā¤Ĩ ā¤ĻāĨā¤ĩāĨ€ā¤Ēā¤¸ā¤ŽāĨ‚ā¤š", + "Country_Uruguay": "ā¤‰ā¤°āĨā¤—āĨā¤ĩāĨ‡", + "Country_Uzbekistan": "ā¤‰ā¤œā¤ŧāĨā¤ŦāĨ‡ā¤•ā¤ŋā¤¸āĨā¤¤ā¤žā¤¨", + "Country_Vanuatu": "ā¤ĩā¤žā¤¨āĨā¤…ā¤¤āĨ", + "Country_Venezuela": "ā¤ĩāĨ‡ā¤¨āĨ‡ā¤œā¤ŧāĨā¤ā¤˛ā¤ž", + "Country_Viet_Nam": "ā¤ĩā¤ŋā¤¯ā¤¤ā¤¨ā¤žā¤Ž", + "Country_Virgin_Islands_British": "ā¤ĩā¤°āĨā¤œā¤ŋā¤¨ ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤¸ā¤ŽāĨ‚ā¤š, ā¤ŦāĨā¤°ā¤ŋā¤Ÿā¤ŋā¤ļ", + "Country_Virgin_Islands_US": "ā¤ĩā¤°āĨā¤œā¤ŋā¤¨ ā¤ĻāĨā¤ĩāĨ€ā¤Ē ā¤¸ā¤ŽāĨ‚ā¤š, ā¤¯āĨ‚.ā¤ā¤¸.", + "Country_Wallis_and_Futuna": "ā¤ĩā¤žā¤˛āĨ€ ā¤”ā¤° ā¤Ģā¤ŧāĨā¤¯āĨā¤ŸāĨā¤¨ā¤ž", + "Country_Western_Sahara": "ā¤Ēā¤ļāĨā¤šā¤ŋā¤ŽāĨ€ ā¤¸ā¤šā¤žā¤°ā¤ž", + "Country_Yemen": "ā¤¯ā¤Žā¤¨", + "Country_Zambia": "ā¤œā¤žā¤ŽāĨā¤Ŧā¤ŋā¤¯ā¤ž", + "Country_Zimbabwe": "ā¤œā¤ŧā¤ŋā¤ŽāĨā¤Ŧā¤žā¤ŦāĨā¤ĩāĨ‡", + "Create": "ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_canned_response": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤Ŧā¤¨ā¤žā¤ā¤", + "Create_custom_field": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_a_public_channel_that_new_workspace_members_can_join": "ā¤ā¤• ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤ā¤‚ ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤¸ā¤•āĨ‡ā¤‚āĨ¤", + "Create_A_New_Channel": "ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_new": "ā¤¨ā¤¯ā¤ž ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ", + "Create_new_members": "ā¤¨ā¤ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_unique_rules_for_this_channel": "ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤¨ā¤ŋā¤¯ā¤Ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_unit": "ā¤‡ā¤•ā¤žā¤ˆ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "create-c": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "create-c_description": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "create-d": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "create-d_description": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "create-invite-links": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "create-invite-links_description": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "create-p": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "create-p_description": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "create-personal-access-tokens": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "create-personal-access-tokens_description": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "create-team": "ā¤ŸāĨ€ā¤Ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "create-team_description": "ā¤ŸāĨ€ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "create-user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤‡ā¤¯āĨ‡", + "create-user_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Created": "ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤Ĩā¤ž", + "Created_as": "ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Created_at": "ā¤Ēā¤° ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Created_at_s_by_s": "%s ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž % s ā¤Ēā¤° ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Created_at_s_by_s_triggered_by_s": "%s ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž %s ā¤Ēā¤° ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž , %s ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Created_by": "ā¤•āĨ‡ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤¨ā¤žā¤ˆ ā¤—ā¤ˆ", + "CRM_Integration": "ā¤¸āĨ€ā¤†ā¤°ā¤ā¤Ž ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "CROWD_Allow_Custom_Username": "Rocket.Chat ā¤ŽāĨ‡ā¤‚ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "CROWD_Reject_Unauthorized": "ā¤…ā¤¨ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Crowd_Remove_Orphaned_Users": "ā¤…ā¤¨ā¤žā¤Ĩ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤", + "Crowd_sync_interval_Description": "ā¤¤āĨā¤˛āĨā¤¯ā¤•ā¤žā¤˛ā¤¨ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤•ā¤ž ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛. ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ `ā¤šā¤° 24 ā¤˜ā¤‚ā¤ŸāĨ‡` ā¤¯ā¤ž `ā¤¸ā¤ĒāĨā¤¤ā¤žā¤š ā¤•āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤Ļā¤ŋā¤¨`, ā¤…ā¤§ā¤ŋā¤• ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ [ā¤•āĨā¤°āĨ‹ā¤¨ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤Ēā¤žā¤°āĨā¤¸ā¤°](http://bunkat.github.io/later/parsers.html#text) ā¤Ēā¤°", + "Current_Chats": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤šāĨˆā¤Ÿ", + "Current_File": "ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛", + "Current_Import_Operation": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤†ā¤¯ā¤žā¤¤ ā¤Ēā¤°ā¤ŋā¤šā¤žā¤˛ā¤¨", + "Current_Status": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Currently_we_dont_support_joining_servers_with_this_many_people": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤šā¤Ž ā¤‡ā¤¤ā¤¨āĨ‡ ā¤¸ā¤žā¤°āĨ‡ ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤•ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚", "Custom": "ā¤•ā¤¸āĨā¤Ÿā¤Ž", + "Custom CSS": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨ€ā¤ā¤¸ā¤ā¤¸", + "Custom_agent": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "Custom_dates": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¤ā¤ŋā¤Ĩā¤ŋā¤¯ā¤žā¤", + "Custom_Emoji": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€", + "Custom_Emoji_Add": "ā¤¨ā¤¯ā¤ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Custom_Emoji_Added_Successfully": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Custom_Emoji_Delete_Warning": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž.", + "Custom_Emoji_Error_Invalid_Emoji": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤‡ā¤ŽāĨ‹ā¤œāĨ€", + "Custom_Emoji_Error_Name_Or_Alias_Already_In_Use": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤¯ā¤ž ā¤‰ā¤¸ā¤•ā¤ž ā¤•āĨ‹ā¤ˆ ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆāĨ¤", + "Custom_Emoji_Error_Same_Name_And_Alias": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤‰ā¤¨ā¤•āĨ‡ ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤…ā¤˛ā¤—-ā¤…ā¤˛ā¤— ā¤šāĨ‹ā¤¨āĨ‡ ā¤šā¤žā¤šā¤ŋā¤.", + "Custom_Emoji_Has_Been_Deleted": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "Custom_Emoji_Info": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Custom_Emoji_Updated_Successfully": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Custom_Fields": "ā¤¤ā¤Ÿā¤•ā¤° ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Custom_Field_Removed": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Custom_Field_Not_Found": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Custom_Integration": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Custom_OAuth_has_been_added": "ā¤•ā¤¸āĨā¤Ÿā¤Ž OAuth ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Custom_OAuth_has_been_removed": "ā¤•ā¤¸āĨā¤Ÿā¤Ž OAuth ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Custom_oauth_helper": "ā¤…ā¤Ēā¤¨ā¤ž OAuth ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯, ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤•āĨ‰ā¤˛ā¤ŦāĨˆā¤• URL ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—

     %ā¤ā¤¸
    .", + "Custom_oauth_unique_name": "ā¤•ā¤¸āĨā¤Ÿā¤Ž OAuth ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤¨ā¤žā¤Ž", + "Custom_roles": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤", + "Custom_roles_upsell_add_custom_roles_workspace": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤…ā¤¨āĨā¤°āĨ‚ā¤Ē ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Custom_roles_upsell_add_custom_roles_workspace_description": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤ ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋ ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤ĩā¤žā¤¤ā¤žā¤ĩā¤°ā¤Ŗ ā¤Žā¤ŋā¤˛āĨ‡, ā¤¸ā¤­āĨ€ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Custom_Script_Logged_In": "ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ", + "Custom_Script_Logged_In_Description": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤œāĨ‹ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤”ā¤° ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ēā¤° ā¤šā¤˛āĨ‡ā¤—āĨ€āĨ¤ (ā¤œā¤Ŧ ā¤­āĨ€ ā¤†ā¤Ē ā¤šāĨˆā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤†ā¤Ē ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚)", + "Custom_Script_Logged_Out": "ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ", + "Custom_Script_Logged_Out_Description": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤œāĨ‹ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤šā¤˛āĨ‡ā¤—āĨ€ ā¤”ā¤° ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤œāĨ‹ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤ (ā¤œā¤Ŧ ā¤­āĨ€ ā¤†ā¤Ē ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‡ā¤œ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚)", + "Custom_Script_On_Logout": "ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤Ģā¤ŧāĨā¤˛āĨ‹ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ", + "Custom_Script_On_Logout_Description": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤œāĨ‹ ā¤•āĨ‡ā¤ĩā¤˛ ā¤¨ā¤ŋā¤ˇāĨā¤Ēā¤žā¤Ļā¤¨ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤ĒāĨā¤°ā¤ĩā¤žā¤š ā¤Ēā¤° ā¤šā¤˛āĨ‡ā¤—āĨ€", + "Custom_Scripts": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ", + "Custom_Sound_Add": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Custom_Sound_Delete_Warning": "ā¤•ā¤ŋā¤¸āĨ€ ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž.", + "Custom_Sound_Edit": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Custom_Sound_Error_Invalid_Sound": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤§āĨā¤ĩā¤¨ā¤ŋ", + "Custom_Sound_Error_Name_Already_In_Use": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤¨ā¤žā¤Ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ.", + "Custom_Sound_Has_Been_Deleted": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ.", + "Custom_Sound_Info": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Custom_Sound_Saved_Successfully": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤—ā¤ˆ", + "Custom_Status": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Custom_Translations": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "Custom_Translations_Description": "ā¤ā¤• ā¤ĩāĨˆā¤§ JSON ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤ ā¤œā¤šā¤žā¤‚ ā¤•āĨā¤‚ā¤œāĨ€ ā¤ā¤¸āĨ€ ā¤­ā¤žā¤ˇā¤žā¤ā¤‚ ā¤šāĨˆā¤‚ ā¤œā¤ŋā¤¨ā¤ŽāĨ‡ā¤‚ ā¤•āĨā¤‚ā¤œāĨ€ ā¤”ā¤° ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤•ā¤ž ā¤ļā¤ŦāĨā¤Ļā¤•āĨ‹ā¤ļ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `{\"en\": {\"ā¤šāĨˆā¤¨ā¤˛\": \"ā¤•ā¤Žā¤°āĨ‡\"},\"pt\": {\"ā¤šāĨˆā¤¨ā¤˛\": \"ā¤¸ā¤˛ā¤žā¤¸\"}}`", + "Custom_User_Status": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Custom_User_Status_Add": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Custom_User_Status_Added_Successfully": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤œāĨ‹ā¤Ąā¤ŧāĨ€ ā¤—ā¤ˆ", + "Custom_User_Status_Delete_Warning": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤žāĨ¤", + "Custom_User_Status_Edit": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Custom_User_Status_Error_Invalid_User_Status": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Custom_User_Status_Error_Name_Already_In_Use": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¨ā¤žā¤Ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆāĨ¤", + "Custom_User_Status_Has_Been_Deleted": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ", + "Custom_User_Status_Info": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Custom_User_Status_Updated_Successfully": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•āĨ€ ā¤—ā¤ˆ", + "Customer_without_registered_email": "ā¤—āĨā¤°ā¤žā¤šā¤• ā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Customize": "ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Customize_Content": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "CustomSoundsFilesystem": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž", + "CustomSoundsFilesystem_Description": "ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤§āĨā¤ĩā¤¨ā¤ŋā¤¯ā¤žā¤ ā¤•āĨˆā¤¸āĨ‡ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "Daily_Active_Users": "ā¤ĻāĨˆā¤¨ā¤ŋā¤• ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Dashboard": "ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą", + "Data_modified": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤", + "Data_processing_consent_text": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ā¤ŋā¤‚ā¤— ā¤¸ā¤šā¤Žā¤¤ā¤ŋ ā¤Ēā¤žā¤ ", + "Data_processing_consent_text_description": "ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¯ā¤š ā¤¸ā¤Žā¤ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‡ ā¤ĻāĨŒā¤°ā¤žā¤¨ ā¤—āĨā¤°ā¤žā¤šā¤• ā¤•āĨ€ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ā¤•ā¤¤āĨā¤°, ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤”ā¤° ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Date": "ā¤¤ā¤žā¤°āĨ€ā¤–", + "Date_From": "ā¤¸āĨ‡", + "Date_to": "ā¤•āĨ‹", + "DAU_value": "ā¤ĄāĨ€ā¤ā¤¯āĨ‚ {{price}}", + "days": "ā¤Ļā¤ŋā¤¨", + "Days": "ā¤Ļā¤ŋā¤¨", + "DB_Migration": "ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤Žā¤žā¤‡ā¤—āĨā¤°āĨ‡ā¤ļā¤¨", + "DB_Migration_Date": "ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤Žā¤žā¤‡ā¤—āĨā¤°āĨ‡ā¤ļā¤¨ ā¤¤ā¤ŋā¤Ĩā¤ŋ", + "DDP_Rate_Limiter": "ā¤ĄāĨ€ā¤ĄāĨ€ā¤ĒāĨ€ ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤ž", + "DDP_Rate_Limit_Connection_By_Method_Enabled": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤¸ā¤•āĨā¤ˇā¤Ž", + "DDP_Rate_Limit_Connection_By_Method_Interval_Time": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛ ā¤¸ā¤Žā¤¯", + "DDP_Rate_Limit_Connection_By_Method_Requests_Allowed": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤¨āĨā¤°āĨ‹ā¤§āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ", + "DDP_Rate_Limit_Connection_Enabled": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤¸ā¤•āĨā¤ˇā¤Ž", + "DDP_Rate_Limit_Connection_Interval_Time": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛ ā¤¸ā¤Žā¤¯", + "DDP_Rate_Limit_Connection_Requests_Allowed": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤¨āĨā¤°āĨ‹ā¤§āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ", + "DDP_Rate_Limit_IP_Enabled": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤¸ā¤•āĨā¤ˇā¤Ž", + "DDP_Rate_Limit_IP_Interval_Time": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛ ā¤¸ā¤Žā¤¯", + "DDP_Rate_Limit_IP_Requests_Allowed": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤¨āĨā¤°āĨ‹ā¤§āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ", + "DDP_Rate_Limit_User_By_Method_Enabled": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤¸ā¤•āĨā¤ˇā¤Ž", + "DDP_Rate_Limit_User_By_Method_Interval_Time": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛ ā¤¸ā¤Žā¤¯", + "DDP_Rate_Limit_User_By_Method_Requests_Allowed": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤¨āĨā¤°āĨ‹ā¤§āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ", + "DDP_Rate_Limit_User_Enabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤¸ā¤•āĨā¤ˇā¤Ž", + "DDP_Rate_Limit_User_Interval_Time": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛ ā¤¸ā¤Žā¤¯", + "DDP_Rate_Limit_User_Requests_Allowed": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ€ā¤Žā¤ž: ā¤…ā¤¨āĨā¤°āĨ‹ā¤§āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ", + "Deactivate": "ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "Decline": "ā¤—ā¤ŋā¤°ā¤žā¤ĩā¤Ÿ", + "default": "ā¤—ā¤˛ā¤¤āĨ€ ā¤•ā¤°ā¤¨ā¤ž", + "Default": "ā¤—ā¤˛ā¤¤āĨ€ ā¤•ā¤°ā¤¨ā¤ž", + "Default_provider": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž", + "Default_value": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤Žā¤žā¤¨", + "Delete": "ā¤Žā¤ŋā¤Ÿā¤žā¤¨ā¤ž", + "Deleting": "ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Delete_account": "ā¤–ā¤žā¤¤ā¤ž ā¤šā¤Ÿā¤ž ā¤ĻāĨ‹", + "Delete_account?": "ā¤–ā¤žā¤¤ā¤ž ā¤šā¤Ÿā¤ž ā¤ĻāĨ‹?", + "Delete_all_closed_chats": "ā¤¸ā¤­āĨ€ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨˆā¤Ÿ ā¤šā¤Ÿā¤žā¤ā¤‚", + "Delete_Department?": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤šā¤Ÿā¤žā¤ā¤‚?", + "Delete_File_Warning": "ā¤•ā¤ŋā¤¸āĨ€ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤ĩā¤š ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤Ÿ ā¤œā¤žā¤ā¤—āĨ€. ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Delete_message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤‚", + "Delete_my_account": "ā¤ŽāĨ‡ā¤°ā¤ž ā¤ā¤•ā¤žā¤‰ā¤‚ā¤Ÿ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‹", + "Delete_Role_Warning": "ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Delete_Room_Warning": "ā¤•ā¤ŋā¤¸āĨ€ ā¤°āĨ‚ā¤Ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤­āĨ€ā¤¤ā¤° ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Delete_User_Warning": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤‰ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ€ ā¤šā¤Ÿ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Delete_User_Warning_Delete": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤‰ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ€ ā¤šā¤Ÿ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Delete_User_Warning_Keep": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤‰ā¤¨ā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĻāĨƒā¤ļāĨā¤¯ā¤Žā¤žā¤¨ ā¤°ā¤šāĨ‡ā¤‚ā¤—āĨ‡. ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Delete_User_Warning_Unlink": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤‰ā¤¨ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "delete-c": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤šā¤Ÿā¤žā¤ā¤", + "delete-c_description": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "delete-d": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤ā¤", + "delete-d_description": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "delete-message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤‚", + "delete-message_description": "ā¤ā¤• ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤­āĨ€ā¤¤ā¤° ā¤ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "delete-own-message": "ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤ā¤", + "delete-own-message_description": "ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "delete-p": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤šā¤Ÿā¤žā¤ā¤", + "delete-p_description": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "delete-team": "ā¤ŸāĨ€ā¤Ž ā¤šā¤Ÿā¤žā¤ā¤", + "delete-team_description": "ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "delete-user": "ā¤‰ā¤Ēā¤­āĨ‹ā¤•āĨā¤¤ā¤ž ā¤Žā¤ŋā¤Ÿā¤žā¤¯āĨ‡ā¤‚", + "delete-user_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Deleted": "ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž!", + "Deleted_user": "ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤šāĨā¤† ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Deleted__roomName__": "#{{roomName}} ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Deleted__roomName__room": "#{{roomName}} ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Department": "ā¤ĩā¤ŋā¤­ā¤žā¤—", + "Department_archived": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤", + "Department_name": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Department_not_found": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Department_removed": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Department_Removal_Disabled": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤šā¤Ÿā¤žā¤ā¤‚ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Department_unarchived": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤…ā¤¨ā¤žā¤°ā¤•āĨā¤ˇā¤ŋā¤¤", + "Departments": "ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚", + "Deployment_ID": "ā¤Ēā¤°ā¤ŋā¤¨ā¤ŋā¤¯āĨ‹ā¤œā¤¨ ā¤†ā¤ˆā¤ĄāĨ€", + "Deployment": "ā¤¤āĨˆā¤¨ā¤žā¤¤āĨ€", + "Description": "ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "Desktop": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē", + "Desktop_apps": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤ā¤ĒāĨā¤¸", + "Desktop_Notification_Test": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Desktop_Notifications": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚", "Desktop_Notifications_Default_Alert": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", + "Desktop_Notifications_Disabled": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚. ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‹ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤…ā¤Ēā¤¨āĨ€ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤‚ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚āĨ¤", + "Desktop_Notifications_Duration": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž period", + "Desktop_Notifications_Duration_Description": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ‡ā¤•ā¤‚ā¤ĄāĨ¤ ā¤¯ā¤š OS X ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤° ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤•ā¤° ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤“ā¤ā¤¸ ā¤ā¤•āĨā¤¸ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤° ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ 0 ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Desktop_Notifications_Enabled": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚", + "Desktop_Notifications_Not_Enabled": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "Unselected_by_default": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤šā¤¯ā¤¨ā¤ŋā¤¤", + "Unseen_features": "ā¤…ā¤¨ā¤ĻāĨ‡ā¤–āĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤ā¤‚", + "Details": "ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "Device_Changes_Not_Available": "ā¤‡ā¤¸ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤ŽāĨ‡ā¤‚ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚. ā¤—ā¤žā¤°ā¤‚ā¤ŸāĨ€ā¤•āĨƒā¤¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤•āĨƒā¤Ēā¤¯ā¤ž Rocket.Chat ā¤•āĨ‡ ā¤†ā¤§ā¤ŋā¤•ā¤žā¤°ā¤ŋā¤• ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤ā¤Ē ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Device_Changes_Not_Available_Insecure_Context": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•āĨ‡ā¤ĩā¤˛ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­āĨ‹ā¤‚ ā¤Ēā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚ (ā¤œāĨˆā¤¸āĨ‡ https://)", + "Device_Management": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨", + "Device_Management_Allow_Login_Email_preference": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Device_Management_Allow_Login_Email_preference_Description": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤…ā¤Ēā¤¨āĨ€ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¤ā¤Ŧ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—āĨ€ ā¤œā¤Ŧ ā¤Ŧā¤žā¤°-ā¤Ŧā¤žā¤° ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤¸āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ŧā¤žā¤°-ā¤Ŧā¤žā¤° ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¨ā¤ž ā¤Ēā¤Ąā¤ŧā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Device_Management_Client": "ā¤—āĨā¤°ā¤žā¤šā¤•", + "Device_Management_Description": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤”ā¤° ā¤Ēā¤šāĨā¤‚ā¤š ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚.", + "Device_Management_Device": "ā¤‰ā¤Ēā¤•ā¤°ā¤Ŗ", + "line": "ā¤°āĨ‡ā¤–ā¤ž", + "Device_Management_Device_Unknown": "ā¤…ā¤œāĨā¤žā¤žā¤¤", + "Device_Management_Email_Subject": "[ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¨ā¤žā¤Ž] - ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤šā¤˛ā¤ž", + "Device_Management_Email_Body": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚: `

    {ā¤˛āĨ‰ā¤—ā¤ŋā¤¨_ā¤Ąā¤ŋā¤ŸāĨ‡ā¤•āĨā¤ŸāĨ‡ā¤Ą}

    [ā¤¨ā¤žā¤Ž] ([ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž]) {Logged_In_Via}

    {ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸_ā¤ŽāĨˆā¤¨āĨ‡ā¤œā¤ŽāĨ‡ā¤‚ā¤Ÿ_ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ}: [ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤°ā¤‡ā¤¨āĨā¤ĢāĨ‹]
    {ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸_ā¤ŽāĨˆā¤¨āĨ‡ā¤œā¤ŽāĨ‡ā¤‚ā¤Ÿ_ā¤“ā¤ā¤¸}: [osInfo]
    {ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸_ā¤ŽāĨˆā¤¨āĨ‡ā¤œā¤ŽāĨ‡ā¤‚ā¤Ÿ_ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸}: [ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ā¤‡ā¤¨āĨā¤ĢāĨ‹]
    {ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸_ā¤ŽāĨˆā¤¨āĨ‡ā¤œā¤ŽāĨ‡ā¤‚ā¤Ÿ_ā¤†ā¤ˆā¤ĒāĨ€}: [ā¤†ā¤ˆā¤ĒāĨ€ā¤‡ā¤¨āĨā¤ĢāĨ‹]

    [ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ]

    {ā¤…ā¤Ēā¤¨āĨ‡ ā¤–ā¤žā¤¤āĨ‡ ā¤Ēā¤° ā¤Ēā¤šāĨā¤‚ā¤š}

    {Or_Copy_And_Paste_This_URL_Into_A_Tab_Of_Your_Browser}
    [ā¤¸ā¤žā¤‡ā¤Ÿ URL]

    {Thank_You_For_Choosing_RocketChat}

    `", + "Device_Management_Enable_Login_Emails": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Device_Management_Enable_Login_Emails_Description": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤° ā¤Ŧā¤žā¤° ā¤‰ā¤¨ā¤•āĨ‡ ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤šā¤˛ā¤¨āĨ‡ ā¤Ēā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Device_Management_IP": "ā¤†ā¤ˆ ā¤ĒāĨ€", + "Device_Management_OS": "ā¤†ā¤Ē", + "Device_ID": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤†ā¤ˆā¤ĄāĨ€", + "Device_Info": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Device_Logged_Out": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "Device_Logout_Text": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸āĨ‡ ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤ž ā¤”ā¤° ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤¸ā¤¤āĨā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‰ā¤¸āĨ€ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤¸āĨ‡ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤° ā¤¸ā¤•āĨ‡ā¤—ā¤žāĨ¤", + "Devices": "ā¤‰ā¤Ēā¤•ā¤°ā¤Ŗ", + "Devices_Set": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿ", + "Device_settings": "ā¤‰ā¤Ēā¤•ā¤°ā¤Ŗ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸", + "Dialed_number_doesnt_exist": "ā¤Ąā¤žā¤¯ā¤˛ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤¨ā¤‚ā¤Ŧā¤° ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Dialed_number_is_incomplete": "ā¤Ąā¤žā¤¯ā¤˛ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤¨ā¤‚ā¤Ŧā¤° ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Different_Style_For_User_Mentions": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤˛ā¤— ā¤ļāĨˆā¤˛āĨ€", + "Livechat_Facebook_API_Key": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€", + "Direct": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤•āĨā¤ˇ", + "Direction": "ā¤Ļā¤ŋā¤ļā¤ž", + "Livechat_Facebook_API_Secret": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤°ā¤šā¤¸āĨā¤¯", + "Direct_Message": "ā¤¸āĨ€ā¤§ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Livechat_Facebook_Enabled": "ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Direct_message_creation_description": "ā¤†ā¤Ē ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šāĨˆā¤Ÿ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤šāĨˆā¤‚. ā¤œā¤ŋā¤¨ ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤†ā¤Ē ā¤Ŧā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤‰ā¤¨ ā¤¸ā¤­āĨ€ ā¤•āĨ‹ ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤ā¤• ā¤šāĨ€ ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ēā¤° ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", + "Direct_message_someone": "ā¤•ā¤ŋā¤¸āĨ€ ā¤•āĨ‹ ā¤¸āĨ€ā¤§ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Direct_message_you_have_joined": "ā¤†ā¤Ē ā¤ā¤• ā¤¨ā¤ ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤ŽāĨˆā¤¸āĨ‡ā¤œ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤šāĨˆā¤‚", + "Direct_Messages": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Direct_Reply": "ā¤¸āĨ€ā¤§ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤°", + "Direct_Reply_Advice": "ā¤†ā¤Ē ā¤¸āĨ€ā¤§āĨ‡ ā¤‡ā¤¸ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚. ā¤ĨāĨā¤°āĨ‡ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤¨ ā¤•ā¤°āĨ‡ā¤‚.", + "Direct_Reply_Debug": "ā¤¸āĨ€ā¤§ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤Ąā¤ŋā¤Ŧā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Direct_Reply_Debug_Description": "[ā¤¸ā¤žā¤ĩā¤§ā¤žā¤¨] ā¤Ąā¤ŋā¤Ŧā¤— ā¤ŽāĨ‹ā¤Ą ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤†ā¤Ēā¤•ā¤ž 'ā¤ĒāĨā¤˛āĨ‡ā¤¨ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą' ā¤ā¤Ąā¤Žā¤ŋā¤¨ ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "Direct_Reply_Delete": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤šā¤Ÿā¤žā¤ā¤", + "Direct_Reply_Delete_Description": "[ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚!] ā¤¯ā¤Ļā¤ŋ ā¤¯ā¤š ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤¸ā¤­āĨ€ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨āĨ€ā¤¯ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¯ā¤šā¤žā¤‚ ā¤¤ā¤• ā¤•ā¤ŋ ā¤ĩāĨ‡ ā¤­āĨ€ ā¤œāĨ‹ ā¤¸āĨ€ā¤§āĨ‡ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤ˆ-ā¤ŽāĨ‡ā¤˛ ā¤ŽāĨ‡ā¤˛ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤–ā¤žā¤˛āĨ€ ā¤°ā¤šā¤¤ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤‡ā¤¸āĨ‡ ā¤Žā¤¨āĨā¤ˇāĨā¤¯āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž \"ā¤¸ā¤Žā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°\" ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Direct_Reply_Enable": "ā¤¸āĨ€ā¤§ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Direct_Reply_Enable_Description": "[ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚!] ā¤¯ā¤Ļā¤ŋ \"ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤°ā¤ŋā¤ĒāĨā¤˛ā¤žā¤ˆ\" ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ, ā¤¤āĨ‹ Rocket.Chat ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ŽāĨ‡ā¤˛ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤•āĨ‹ ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤ ā¤¸ā¤­āĨ€ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤ˆ-ā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤Ēā¤ĸā¤ŧāĨ‡ ā¤—ā¤ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ \"ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤°ā¤ŋā¤ĒāĨā¤˛ā¤žā¤ˆ\" ā¤•āĨ‡ā¤ĩā¤˛ ā¤¤ā¤­āĨ€ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤ ā¤œā¤Ŧ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤ŽāĨ‡ā¤˛ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ Rocket.Chat ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨˆ ā¤”ā¤° ā¤Žā¤¨āĨā¤ˇāĨā¤¯āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž \"ā¤¸ā¤Žā¤žā¤¨ā¤žā¤‚ā¤¤ā¤° ā¤ŽāĨ‡ā¤‚\" ā¤Ēā¤ĸā¤ŧā¤ž/ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "Direct_Reply_Frequency": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤œā¤žā¤ā¤š ā¤†ā¤ĩāĨƒā¤¤āĨā¤¤ā¤ŋ", + "Direct_Reply_Frequency_Description": "(ā¤Žā¤ŋā¤¨ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚, ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ/ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž 2)", + "Direct_Reply_Host": "ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤°ā¤ŋā¤ĒāĨā¤˛ā¤žā¤ˆ ā¤šāĨ‹ā¤¸āĨā¤Ÿ", + "Direct_Reply_IgnoreTLS": "ā¤ŸāĨ€ā¤ā¤˛ā¤ā¤¸ ā¤Ēā¤° ā¤§āĨā¤¯ā¤žā¤¨ ā¤¨ ā¤ĻāĨ‡ā¤‚", + "Direct_Reply_Password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "Direct_Reply_Port": "ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ_ā¤°ā¤ŋā¤ĒāĨā¤˛ā¤žā¤ˆ_ā¤ĒāĨ‹ā¤°āĨā¤Ÿ", + "Direct_Reply_Protocol": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤•āĨā¤ˇ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĒāĨā¤°āĨ‹ā¤ŸāĨ‹ā¤•āĨ‰ā¤˛", + "Direct_Reply_Separator": "ā¤¸āĨ‡ā¤Ēā¤°āĨ‡ā¤Ÿā¤°", + "Direct_Reply_Separator_Description": "[ā¤•āĨ‡ā¤ĩā¤˛ ā¤¤ā¤­āĨ€ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤Ŧ ā¤†ā¤Ē ā¤ āĨ€ā¤•-ā¤ āĨ€ā¤• ā¤œā¤žā¤¨ā¤¤āĨ‡ ā¤šāĨ‹ā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤•āĨā¤¯ā¤ž ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚, ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚]\nā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤”ā¤° ā¤ŸāĨˆā¤— ā¤­ā¤žā¤— ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤ĩā¤ŋā¤­ā¤žā¤œā¤•", + "Direct_Reply_Username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "Direct_Reply_Username_Description": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸ā¤‚ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚, ā¤ŸāĨˆā¤—ā¤ŋā¤‚ā¤— ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤‡ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤˛ā¤ŋā¤–ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "Directory": "ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž", + "Disable": "ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨ā¤ž", + "Disable_Facebook_integration": "ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Disable_Notifications": "ā¤¨āĨ‹ā¤ŸāĨ€ā¤Ģā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Disable_two-factor_authentication": "TOTP ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Disable_two-factor_authentication_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", "Disabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Disallow_reacting": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ ā¤ĻāĨ‡ā¤‚", + "Disallow_reacting_Description": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤ĻāĨ‡ā¤¤ā¤ž", + "Discard": "ā¤–ā¤žā¤°ā¤ŋā¤œ ā¤•ā¤°ā¤¨ā¤ž", + "Disconnect": "ā¤Ąā¤ŋā¤¸āĨā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ", + "Discover_public_channels_and_teams_in_the_workspace_directory": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤”ā¤° ā¤ŸāĨ€ā¤ŽāĨ‡ā¤‚ ā¤–āĨ‹ā¤œāĨ‡ā¤‚āĨ¤", + "Discussion": "ā¤Ŧā¤šā¤¸", + "Discussion_Description": "ā¤šā¤°āĨā¤šā¤žā¤ā¤ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤ĒāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ā¤• ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤¤ā¤°āĨ€ā¤•ā¤ž ā¤šāĨˆ ā¤œāĨ‹ ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤ĒāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤­ā¤žā¤— ā¤˛āĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Discussion_description": "ā¤•āĨā¤¯ā¤ž ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ ā¤‡ā¤¸ā¤•ā¤ž ā¤…ā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤°ā¤–ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ā¤•ā¤°āĨ‡ā¤‚! ā¤ā¤• ā¤šā¤°āĨā¤šā¤ž ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤¸āĨ‡, ā¤†ā¤Ēā¤•āĨ‡ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤šāĨā¤¨āĨ‡ ā¤—ā¤ ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤ā¤• ā¤‰ā¤Ē-ā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤ĻāĨ‹ā¤¨āĨ‹ā¤‚ ā¤˛ā¤ŋā¤‚ā¤• ā¤šāĨ‹ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Discussion_first_message_disabled_due_to_e2e": "ā¤†ā¤Ē ā¤‡ā¤¸ā¤•āĨ‡ ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤‡ā¤¸ ā¤šā¤°āĨā¤šā¤ž ā¤ŽāĨ‡ā¤‚ ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨ā¤ž ā¤ļāĨā¤°āĨ‚ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Discussion_first_message_title": "ā¤†ā¤Ēā¤•ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Discussion_name": "ā¤šā¤°āĨā¤šā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Discussion_start": "ā¤šā¤°āĨā¤šā¤ž ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Discussion_target_channel": "ā¤ŽāĨ‚ā¤˛ ā¤šāĨˆā¤¨ā¤˛ ā¤¯ā¤ž ā¤¸ā¤ŽāĨ‚ā¤š", + "Discussion_target_channel_description": "ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤œāĨ‹ ā¤†ā¤Ē ā¤œāĨ‹ ā¤ĒāĨ‚ā¤›ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤‰ā¤¸ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤šāĨ‹", + "Discussion_target_channel_prefix": "ā¤†ā¤Ē ā¤ā¤• ā¤šā¤°āĨā¤šā¤ž ā¤Ŧā¤¨ā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "Discussion_title": "ā¤šā¤°āĨā¤šā¤ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Discussions_unavailable_for_federation": "ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤°āĨā¤šā¤žā¤ā¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "discussion-created": "{{message}}", + "Discussions": "ā¤šā¤°āĨā¤šā¤žā¤ā¤", + "Display": "ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤¨", + "Display_avatars": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Display_Avatars_Sidebar": "ā¤¸ā¤žā¤‡ā¤Ąā¤Ŧā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Display_chat_permissions": "ā¤šāĨˆā¤Ÿ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Display_mentions_counter": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤•āĨā¤ˇ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŦāĨˆā¤œ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Display_offline_form": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤ĢāĨ‰ā¤°āĨā¤Ž ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Display_setting_permissions": "ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Display_unread_counter": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤°āĨ‚ā¤Ž ā¤•āĨ‹ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Displays_action_text": "ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤Ēā¤žā¤  ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Do_It_Later": "ā¤‡ā¤¸āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤°āĨ‡ā¤‚", + "Do_not_display_unread_counter": "ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤° ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Do_not_provide_this_code_to_anyone": "ā¤¯ā¤š ā¤•āĨ‹ā¤Ą ā¤•ā¤ŋā¤¸āĨ€ ā¤•āĨ‹ ā¤¨ ā¤ĻāĨ‡ā¤‚.", + "Do_Nothing": "ā¤•āĨā¤› ā¤­āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Do_you_have_any_notes_for_this_conversation": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤‡ā¤¸ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤¨āĨ‹ā¤ŸāĨā¤¸ ā¤šāĨˆā¤‚?", + "Do_you_want_to_accept": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Do_you_want_to_change_to_s_question": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē %s ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Documentation": "ā¤ĒāĨā¤°ā¤˛āĨ‡ā¤–ā¤¨", + "Document_Domain": "ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "Domain": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Domain_added": "ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Domain_removed": "ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Domains": "ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "Domains_allowed_to_embed_the_livechat_widget": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤œāĨ‡ā¤Ÿ ā¤•āĨ‹ ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĩā¤žā¤˛āĨ‡ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€āĨ¤ ā¤¸ā¤­āĨ€ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", + "Done": "ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "Dont_ask_me_again": "ā¤ŽāĨā¤ā¤¸āĨ‡ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤Žā¤¤ ā¤ĒāĨ‚ā¤›āĨ‹!", + "Dont_ask_me_again_list": "ā¤ŽāĨā¤ā¤¸āĨ‡ ā¤ĻāĨā¤Ŧā¤žā¤°ā¤ž ā¤¸āĨ‚ā¤šāĨ€ ā¤Žā¤¤ ā¤ĒāĨ‚ā¤›āĨ‹", + "Download": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨ā¤ž", + "Download_Destkop_App": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤ā¤Ē ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Download_Info": "ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Download_My_Data": "ā¤ŽāĨ‡ā¤°ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚ (HTML)", + "Download_Pending_Avatars": "ā¤˛ā¤‚ā¤Ŧā¤ŋā¤¤ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Download_Pending_Files": "ā¤˛ā¤‚ā¤Ŧā¤ŋā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Download_Snippet": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨ā¤ž", + "Downloading_file_from_external_URL": "ā¤Ŧā¤žā¤šā¤°āĨ€ URL ā¤¸āĨ‡ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "Drop_to_upload_file": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Dry_run": "ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤­āĨā¤¯ā¤žā¤¸", + "Dry_run_description": "ā¤ĒāĨā¤°āĨ‡ā¤ˇā¤• ā¤•āĨ‡ ā¤¸ā¤Žā¤žā¤¨ ā¤Ēā¤¤āĨ‡ ā¤Ēā¤° ā¤•āĨ‡ā¤ĩā¤˛ ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩāĨˆā¤§ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤.", + "Duplicate_archived_channel_name": "`#%s` ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤ā¤• ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "Markdown_Headers": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤Žā¤žā¤°āĨā¤•ā¤Ąā¤žā¤‰ā¤¨ ā¤šāĨ‡ā¤Ąā¤° ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Markdown_Marked_Breaks": "ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤ŦāĨā¤°āĨ‡ā¤• ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Duplicate_archived_private_group_name": "'%s' ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤ā¤• ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "Duplicate_channel_name": "'%s' ā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "Markdown_Marked_GFM": "ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤œāĨ€ā¤ā¤Ģā¤ā¤Ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Duplicate_file_name_found": "ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤Ÿ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤žā¤Ž ā¤Žā¤ŋā¤˛ā¤ž.", + "Markdown_Marked_Pedantic": "ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤ĒāĨ‡ā¤ĄāĨ‡ā¤‚ā¤Ÿā¤ŋā¤• ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Markdown_Marked_SmartLists": "ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤¸āĨā¤Žā¤žā¤°āĨā¤Ÿ ā¤¸āĨ‚ā¤šā¤ŋā¤¯ā¤žā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Duplicate_private_group_name": "'%s' ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤ā¤• ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "Markdown_Marked_Smartypants": "ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤¸āĨā¤Žā¤žā¤°āĨā¤Ÿā¤ĒāĨˆā¤‚ā¤Ÿ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Duplicated_Email_address_will_be_ignored": "ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤Ÿ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤āĨ‡ ā¤Ēā¤° ā¤§āĨā¤¯ā¤žā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž.", + "Markdown_Marked_Tables": "ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤¤ā¤žā¤˛ā¤ŋā¤•ā¤žā¤ā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "duplicated-account": "ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤Ÿ ā¤–ā¤žā¤¤ā¤ž", + "E2E Encryption": "E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨", + "E2E_Encryption_enabled_for_room": "#{{roomName}} ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "E2E_Encryption_disabled_for_room": "#{{roomName}} ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Markdown_Parser": "ā¤Žā¤žā¤°āĨā¤•ā¤Ąā¤žā¤‰ā¤¨ ā¤Ēā¤žā¤°āĨā¤¸ā¤°", + "Markdown_SupportSchemesForLink": "ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Žā¤žā¤°āĨā¤•ā¤Ąā¤žā¤‰ā¤¨ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤ā¤", + "E2E Encryption_Description": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‹ ā¤¨ā¤ŋā¤œāĨ€ ā¤°ā¤–āĨ‡ā¤‚, ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨā¤ ā¤•ā¤ŋ ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ‡ā¤ˇā¤• ā¤”ā¤° ā¤‡ā¤šāĨā¤›ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨ€ ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤Ēā¤ĸā¤ŧ ā¤¸ā¤•āĨ‡ā¤‚āĨ¤", + "Markdown_SupportSchemesForLink_Description": "ā¤…ā¤¨āĨā¤Žā¤¤ ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€", + "E2E_enable": "E2E ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "E2E_disable": "E2E ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "E2E_Enable_alert": "ā¤¯ā¤š ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤…ā¤­āĨ€ ā¤ŦāĨ€ā¤Ÿā¤ž ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ! ā¤•āĨƒā¤Ēā¤¯ā¤ž github.com/RocketChat/Rocket.Chat/issues ā¤Ēā¤° ā¤Ŧā¤— ā¤•āĨ€ ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤‡ā¤¨ā¤¸āĨ‡ ā¤…ā¤ĩā¤—ā¤¤ ā¤°ā¤šāĨ‡ā¤‚:
    - ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤°āĨā¤š ā¤‘ā¤Ēā¤°āĨ‡ā¤ļā¤¨ ā¤¸āĨ‡ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛āĨ‡ā¤‚ā¤—āĨ‡āĨ¤
    - ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ā¤ĒāĨā¤¸ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ (ā¤ĩāĨ‡ ā¤‡ā¤¸āĨ‡ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚)āĨ¤
    - ā¤ŦāĨ‰ā¤Ÿ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¤ā¤Ŧ ā¤¤ā¤• ā¤¨ā¤šāĨ€ā¤‚ ā¤ĻāĨ‡ā¤– ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡ ā¤œā¤Ŧ ā¤¤ā¤• ā¤ĩāĨ‡ ā¤‡ā¤¸ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤˛ā¤žā¤—āĨ‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤āĨ‡āĨ¤
    - ā¤‡ā¤¸ ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤‚ā¤—āĨ‡.", + "E2E_Enable_description": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•ā¤ž ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤”ā¤° ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤‚", + "E2E_Enabled": "E2E ā¤¸ā¤•āĨā¤ˇā¤Ž", + "E2E_Enabled_Default_DirectRooms": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "E2E_Enabled_Default_PrivateRooms": "ā¤¨ā¤ŋā¤œāĨ€ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "E2E_Encryption_Password_Change": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚", + "E2E_Encryption_Password_Explanation": "ā¤…ā¤Ŧ ā¤†ā¤Ē ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤”ā¤° ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ŧā¤¨ā¤ž ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤†ā¤Ē ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤¯ā¤ž ā¤ĄāĨ€ā¤ā¤Ž ā¤•āĨ‹ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤­āĨ€ ā¤Ŧā¤Ļā¤˛ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤

    ā¤¯ā¤š ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤šāĨˆ ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤¨ā¤•āĨ‹ā¤Ą/ā¤ĄāĨ€ā¤•āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤œā¤žā¤ā¤—āĨ€āĨ¤ ā¤‡ā¤¸ ā¤•ā¤žā¤°ā¤Ŗ ā¤¸āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•ā¤ŋā¤¸āĨ€ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ēā¤° ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¨āĨā¤¯ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸āĨ‹ā¤‚ ā¤Ēā¤° ā¤Ļā¤°āĨā¤œ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž ā¤œā¤ŋā¤¨ ā¤Ēā¤° ā¤†ā¤Ē e2e ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "E2E_key_reset_email": "E2E ā¤•āĨā¤‚ā¤œāĨ€ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž", + "E2E_message_encrypted_placeholder": "ā¤¯ā¤š ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤šāĨˆ. ā¤‡ā¤¸āĨ‡ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ€ ā¤–ā¤žā¤¤ā¤ž ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤¨āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨā¤‚ā¤œāĨ€ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€āĨ¤", + "E2E_password_request_text": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤”ā¤° ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤…ā¤Ēā¤¨ā¤ž ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤
    ā¤†ā¤Ēā¤•āĨ‡ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤Ēā¤° ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤¨ā¤•āĨ‹ā¤Ą/ā¤ĄāĨ€ā¤•āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤¯ā¤š ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž, ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "E2E_password_reveal_text": "ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤¨ā¤ŋā¤œāĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤”ā¤° ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ŧā¤¨ā¤žā¤ā¤‚āĨ¤

    ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚, ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤¨āĨā¤•āĨ‹ā¤Ą/ā¤ĄāĨ€ā¤•āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤œā¤žā¤ā¤—āĨ€āĨ¤ e2e ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¨āĨā¤¯ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ēā¤° ā¤Ļā¤°āĨā¤œ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤ ā¤”ā¤° ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨āĨ‡ā¤‚

    ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¸āĨ‡, ā¤œā¤ŋā¤¸ ā¤Ēā¤° ā¤†ā¤Ēā¤¨āĨ‡ ā¤Ļā¤°āĨā¤œ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ, ā¤•ā¤­āĨ€ ā¤­āĨ€ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚āĨ¤ ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤–ā¤ŧā¤žā¤°ā¤ŋā¤œ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤¯ā¤žā¤Ļ ā¤°ā¤–āĨ‡ā¤‚āĨ¤

    ā¤†ā¤Ēā¤•ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤šāĨˆ: {{randomPassword}}", + "E2E_Reset_Email_Content": "ā¤†ā¤Ē ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤šāĨ‹ ā¤—ā¤ ā¤šāĨˆā¤‚. ā¤œā¤Ŧ ā¤†ā¤Ē ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ Rocket.Chat ā¤ā¤• ā¤¨ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤”ā¤° ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‡ ā¤¤ā¤• ā¤†ā¤Ēā¤•āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤Ŧā¤šā¤žā¤˛ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨˆā¤‚āĨ¤ E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨ€ ā¤ĒāĨā¤°ā¤•āĨƒā¤¤ā¤ŋ ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ, Rocket.Chat ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‡ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤Ŧā¤šā¤žā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "E2E_Reset_Key_Explanation": "ā¤¯ā¤š ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤†ā¤Ēā¤•āĨ€ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ E2E ā¤•āĨā¤‚ā¤œāĨ€ ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤—ā¤ž ā¤”ā¤° ā¤†ā¤Ēā¤•āĨ‹ ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤•ā¤° ā¤ĻāĨ‡ā¤—ā¤žāĨ¤
    ā¤œā¤Ŧ ā¤†ā¤Ē ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ Rocket.Chat ā¤†ā¤Ēā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤¨ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤”ā¤° ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‡ ā¤¤ā¤• ā¤†ā¤Ēā¤•āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤Ŧā¤šā¤žā¤˛ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨˆā¤‚āĨ¤
    E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨ€ ā¤ĒāĨā¤°ā¤•āĨƒā¤¤ā¤ŋ ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ, Rocket.Chat ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‡ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤Ŧā¤šā¤žā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "E2E_Reset_Other_Key_Warning": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ E2E ā¤•āĨā¤‚ā¤œāĨ€ ā¤•āĨ‹ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤œā¤Ŧ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°āĨ‡ā¤—ā¤ž, ā¤¤āĨ‹ Rocket.Chat ā¤ā¤• ā¤¨ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤”ā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‡ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤Ŧā¤šā¤žā¤˛ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨ‹ā¤‚ā¤—āĨ‡āĨ¤ E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨ€ ā¤ĒāĨā¤°ā¤•āĨƒā¤¤ā¤ŋ ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ, Rocket.Chat ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‡ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤Ŧā¤šā¤žā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "E2E_unavailable_for_federation": "E2E ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "ECDH_Enabled": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ēā¤°ā¤ŋā¤ĩā¤šā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĻāĨ‚ā¤¸ā¤°āĨ€ ā¤Ēā¤°ā¤¤ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Edit": "ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨ ā¤•ā¤°ā¤¨ā¤ž", + "Edit_Business_Hour": "ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤¸ā¤Žā¤¯ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Canned_Response": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Canned_Responses": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Custom_Field": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Department": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Federated_User_Not_Allowed": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤¸ā¤‚ā¤­ā¤ĩ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Message_AllowSnippeting": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨā¤¨ā¤ŋā¤ĒāĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Edit_Invite": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_previous_message": "`%s` - ā¤Ēā¤ŋā¤›ā¤˛ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Priority": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_SLA_Policy": "SLA ā¤¨āĨ€ā¤¤ā¤ŋ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", "Edit_Status": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Tag": "ā¤ŸāĨˆā¤— ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Trigger": "ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Edit_Unit": "ā¤‡ā¤•ā¤žā¤ˆ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Message_Attachments_GroupAttach": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤Ŧā¤Ÿā¤¨", + "Message_Attachments_GroupAttachDescription": "ā¤¯ā¤š ā¤†ā¤‡ā¤•ā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤• ā¤ĩā¤ŋā¤¸āĨā¤¤ā¤žā¤° ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤ŽāĨ‡ā¤¨āĨ‚ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ā¤°āĨā¤—ā¤¤ ā¤¸ā¤ŽāĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤•ā¤Ž ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤¸āĨā¤ĒāĨ‡ā¤¸ ā¤˛āĨ‡ā¤¤ā¤ž ā¤šāĨˆ.", + "Edit_User": "ā¤¯āĨ‚ā¤œā¤° ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‹", + "edit-livechat-room-customfields": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-livechat-room-customfields_description": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-message_description": "ā¤ā¤• ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤­āĨ€ā¤¤ā¤° ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-other-user-active-status": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-other-user-active-status_description": "ā¤…ā¤¨āĨā¤¯ ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¯ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-other-user-avatar": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-other-user-avatar_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ.", + "edit-other-user-e2ee": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-other-user-e2ee_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋāĨ¤", + "edit-other-user-info": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-other-user-info_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋāĨ¤", + "edit-other-user-password": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-other-user-password_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‹ ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋāĨ¤ ā¤…ā¤¨āĨā¤¯-ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž-ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "edit-other-user-totp": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• TOTP ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-other-user-totp_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ŸāĨ‚ ā¤ĢāĨˆā¤•āĨā¤Ÿā¤° ā¤ŸāĨ€ā¤“ā¤ŸāĨ€ā¤ĒāĨ€ ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-privileged-setting": "ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤žā¤§ā¤ŋā¤•ā¤žā¤° ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-privileged-setting_description": "ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-team": "ā¤ŸāĨ€ā¤Ž ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-team_description": "ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-team-channel": "ā¤ŸāĨ€ā¤Ž ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-team-channel_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-team-member": "ā¤ŸāĨ€ā¤Ž ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-team-member_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-room": "ā¤•ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-room_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤¨ā¤žā¤Ž, ā¤ĩā¤ŋā¤ˇā¤¯, ā¤ĒāĨā¤°ā¤•ā¤žā¤° (ā¤¨ā¤ŋā¤œāĨ€ ā¤¯ā¤ž ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ) ā¤”ā¤° ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ (ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¯ā¤ž ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤) ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-room-avatar": "ā¤•ā¤•āĨā¤ˇ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-room-avatar_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ.", + "edit-room-retention-policy": "ā¤•ā¤•āĨā¤ˇ ā¤•āĨ€ ā¤…ā¤ĩā¤§ā¤žā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edit-room-retention-policy_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤…ā¤ĩā¤§ā¤žā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡, ā¤‰ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "edit-omnichannel-contact": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Use_Legacy_Message_Template": "ā¤˛āĨ€ā¤—āĨ‡ā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "multi_line": "ā¤Žā¤˛āĨā¤ŸāĨ€ ā¤˛ā¤žā¤‡ā¤¨", + "edit-omnichannel-contact_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Edit_Contact_Profile": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "edited": "ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤", + "Editing_room": "ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨ ā¤•ā¤•āĨā¤ˇ", + "Editing_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨", + "Editor": "ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤•", + "Message_ShowEditedStatus": "ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Education": "ā¤ļā¤ŋā¤•āĨā¤ˇā¤ž", + "Message_ShowFormattingTips": "ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤ŽāĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¯āĨā¤•āĨā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Email": "ā¤ˆā¤ŽāĨ‡ā¤˛", + "Email_Description": "Rocket.Chat ā¤•āĨ‡ ā¤…ā¤‚ā¤Ļā¤° ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨āĨ¤", + "Email_address_to_send_offline_messages": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž", + "Email_already_exists": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "Email_body": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ŦāĨ‰ā¤ĄāĨ€", + "Email_Change_Disabled": "ā¤†ā¤Ēā¤•āĨ‡ Rocket.Chat ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ", + "Email_Changed_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - `[ā¤ˆā¤ŽāĨ‡ā¤˛]` ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n- ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[Site_Name]` ā¤”ā¤° `[Site_URL]`āĨ¤", + "Email_Changed_Email_Subject": "[ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¨ā¤žā¤Ž] - ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Email_changed_section": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤Ŧā¤Ļā¤˛ ā¤—ā¤¯ā¤ž", + "Email_Footer_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[Site_Name]` ā¤”ā¤° `[Site_URL]`āĨ¤", + "Email_from": "ā¤¸āĨ‡", + "Email_Header_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[Site_Name]` ā¤”ā¤° `[Site_URL]`āĨ¤", + "Email_Inbox": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸", + "Email_Inboxes": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸", + "Email_Inbox_has_been_added": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Email_Inbox_has_been_removed": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Email_Notification_Mode": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚", + "Email_Notification_Mode_All": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–/ā¤ĄāĨ€ā¤ā¤Ž", "Email_Notification_Mode_Disabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Email_notification_show_message": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Email_Notifications_Change_Disabled": "ā¤†ā¤Ēā¤•āĨ‡ Rocket.Chat ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤ĻāĨ€ ā¤šāĨˆā¤‚", + "Email_or_username": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¯ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Email_Placeholder": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ā¤ĄāĨā¤°āĨ‡ā¤¸ ā¤‡ā¤‚ā¤Ÿā¤° ā¤•ā¤°āĨ‡ā¤‚...", + "Email_Placeholder_any": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤āĨ‡ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "email_plain_text_only": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤¸ā¤žā¤Ļā¤ž ā¤Ēā¤žā¤  ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "email_style_description": "ā¤¨āĨ‡ā¤¸āĨā¤ŸāĨ‡ā¤Ą ā¤šā¤¯ā¤¨ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤¸āĨ‡ ā¤Ŧā¤šāĨ‡ā¤‚", + "email_style_label": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ļāĨˆā¤˛āĨ€", + "Email_subject": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĩā¤ŋā¤ˇā¤¯", + "Email_verified": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤šāĨā¤†", + "Email_sent": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤ž", + "Emoji": "ā¤‡ā¤ŽāĨ‹ā¤œāĨ€", + "Emoji_picker": "ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤Ēā¤ŋā¤•ā¤°", + "EmojiCustomFilesystem": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž", + "EmojiCustomFilesystem_Description": "ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤•āĨˆā¤¸āĨ‡ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Empty_no_agent_selected": "ā¤–ā¤žā¤˛āĨ€, ā¤•āĨ‹ā¤ˆ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚", + "Empty_title": "ā¤–ā¤ŧā¤žā¤˛āĨ€ ā¤ļāĨ€ā¤°āĨā¤ˇā¤•", "Enable": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_Auto_Away": "ā¤‘ā¤ŸāĨ‹ ā¤…ā¤ĩāĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_CSP": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€-ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž-ā¤¨āĨ€ā¤¤ā¤ŋ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_CSP_Description": "ā¤‡ā¤¸ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•āĨ‹ ā¤¤ā¤Ŧ ā¤¤ā¤• ā¤…ā¤•āĨā¤ˇā¤Ž ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤Ŧ ā¤¤ā¤• ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤•āĨ‹ā¤ˆ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ŧā¤ŋā¤˛āĨā¤Ą ā¤¨ ā¤šāĨ‹ ā¤”ā¤° ā¤‡ā¤¨ā¤˛ā¤žā¤‡ā¤¨-ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤ā¤ ā¤¨ ā¤† ā¤°ā¤šāĨ€ ā¤šāĨ‹ā¤‚", + "Extra_CSP_Domains": "ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤¸āĨ€ā¤ā¤¸ā¤ĒāĨ€ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "Extra_CSP_Domains_Description": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€-ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž-ā¤¨āĨ€ā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "Enable_Desktop_Notifications": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_inquiry_fetch_by_stream": "ā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤ĒāĨ‚ā¤›ā¤¤ā¤žā¤› ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤˛ā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_omnichannel_auto_close_abandoned_rooms": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ ā¤—ā¤ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_Password_History": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_Password_History_Description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤šā¤žā¤˛ ā¤šāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤•āĨā¤› ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤ĄāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Enable_Svg_Favicon": "ā¤ā¤¸ā¤ĩāĨ€ā¤œāĨ€ ā¤Ģā¤ŧāĨ‡ā¤ĩā¤ŋā¤•āĨ‰ā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_two-factor_authentication": "TOTP ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_two-factor_authentication_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Enable_unlimited_apps": "ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", "Enabled": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "Encrypted": "ā¤•āĨ‚ā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Encrypted_channel_Description": "ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤šāĨˆā¤¨ā¤˛āĨ¤ ā¤–āĨ‹ā¤œ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°āĨ‡ā¤—āĨ€ ā¤”ā¤° ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤–ā¤ž ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "Encrypted_key_title": "ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚ (e2ee-ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ)", + "Encrypted_message": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Encrypted_setting_changed_successfully": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Encrypted_not_available": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Encryption_key_saved_successfully": "ā¤†ā¤Ēā¤•āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤—ā¤ˆ ā¤ĨāĨ€.", + "EncryptionKey_Change_Disabled": "ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ€ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨā¤‚ā¤œāĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸āĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤†ā¤Ēā¤•āĨ€ ā¤¨ā¤ŋā¤œāĨ€ ā¤•āĨā¤‚ā¤œāĨ€ ā¤‡ā¤¸ ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤Ēā¤° ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤ ā¤¨ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤…ā¤Ēā¤¨āĨ€ ā¤¨ā¤ŋā¤œāĨ€ ā¤•āĨā¤‚ā¤œāĨ€ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€ ā¤¯ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž ā¤œā¤šā¤žā¤‚ ā¤•āĨā¤‚ā¤œāĨ€ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤˛āĨ‹ā¤Ą ā¤šāĨˆāĨ¤", + "End": "ā¤…ā¤‚ā¤¤", + "End_suspicious_sessions": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¸ā¤‚ā¤Ļā¤ŋā¤—āĨā¤§ ā¤¸ā¤¤āĨā¤° ā¤•āĨ‹ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "End_call": "ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "End_conversation": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Expand_view": "ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤•ā¤ž ā¤ĩā¤ŋā¤¸āĨā¤¤ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Explore": "ā¤…ā¤¨āĨā¤ĩāĨ‡ā¤ˇā¤Ŗ ā¤•ā¤°ā¤¨ā¤ž", + "Explore_marketplace": "ā¤Ŧā¤žā¤œā¤ŧā¤žā¤° ā¤•ā¤ž ā¤…ā¤¨āĨā¤ĩāĨ‡ā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "Explore_the_marketplace_to_find_awesome_apps": "Rocket.Chat ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ļā¤žā¤¨ā¤Ļā¤žā¤° ā¤ā¤ĒāĨā¤¸ ā¤ĸāĨ‚ā¤‚ā¤ĸā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ŧā¤žā¤œā¤ŧā¤žā¤° ā¤•ā¤ž ā¤…ā¤¨āĨā¤ĩāĨ‡ā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "Export": "ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤", + "End_Call": "ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "End_OTR": "ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Engagement": "ā¤¸ā¤—ā¤žā¤ˆ", + "Engagement_Dashboard": "ā¤¸ā¤—ā¤žā¤ˆ ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą", + "Enrich_your_workspace": "ā¤¸ā¤šā¤­ā¤žā¤—ā¤ŋā¤¤ā¤ž ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤°ā¤ŋā¤ĒāĨā¤°āĨ‡ā¤•āĨā¤ˇāĨā¤¯ ā¤•āĨ‹ ā¤¸ā¤ŽāĨƒā¤ĻāĨā¤§ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚, ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤”ā¤° ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩāĨā¤¯ā¤žā¤ĩā¤šā¤žā¤°ā¤ŋā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤†ā¤‚ā¤•ā¤Ąā¤ŧāĨ‹ā¤‚ ā¤•ā¤ž ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤“ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛.", + "Ensure_secure_workspace_access": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤¤ā¤• ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤Ēā¤šāĨā¤‚ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Enter": "ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤•ā¤°ā¤¨ā¤ž", + "Enter_a_custom_message": "ā¤ā¤• ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_a_department_name": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_a_name": "ā¤¨ā¤žā¤Ž ā¤Ąā¤žā¤˛āĨ‡ā¤‚", + "Enter_a_regex": "ā¤°āĨ‡ā¤—āĨ‡ā¤•āĨā¤¸ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_a_room_name": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_a_tag": "ā¤ā¤• ā¤ŸāĨˆā¤— ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_a_username": "ā¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_Alternative": "ā¤ĩāĨˆā¤•ā¤˛āĨā¤Ēā¤ŋā¤• ā¤ŽāĨ‹ā¤Ą (ā¤ā¤‚ā¤Ÿā¤° + Ctrl/Alt/Shift/CMD ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤­āĨ‡ā¤œāĨ‡ā¤‚)", + "Enter_authentication_code": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_Behaviour": "ā¤•āĨā¤‚ā¤œāĨ€ ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤° ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_Behaviour_Description": "ā¤¯ā¤Ļā¤ŋ ā¤ā¤‚ā¤Ÿā¤° ā¤•āĨā¤‚ā¤œāĨ€ ā¤ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤—āĨ€ ā¤¯ā¤ž ā¤˛ā¤žā¤‡ā¤¨ ā¤ŦāĨā¤°āĨ‡ā¤• ā¤•ā¤°āĨ‡ā¤—āĨ€ ā¤¤āĨ‹ ā¤¯ā¤š ā¤Ŧā¤Ļā¤˛ ā¤œā¤žā¤ā¤—ā¤ž", + "Enter_E2E_password": "E2E ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_name_here": "ā¤¯ā¤šā¤žā¤‚ ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_Normal": "ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯ ā¤ŽāĨ‹ā¤Ą (ā¤ā¤‚ā¤Ÿā¤° ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤­āĨ‡ā¤œāĨ‡ā¤‚)", + "Enter_to": "ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤°āĨā¤œ", + "Enter_your_E2E_password": "ā¤…ā¤Ēā¤¨ā¤ž E2E ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Enter_your_password_to_delete_your_account": "ā¤…ā¤Ēā¤¨ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Enter_your_username_to_delete_your_account": "ā¤…ā¤Ēā¤¨ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Premium_capabilities": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤•āĨā¤ˇā¤Žā¤¤ā¤žā¤ā¤‚", + "Premium_Departments_title": "ā¤—āĨā¤°ā¤žā¤šā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛ā¤—ā¤žā¤ā¤‚ ā¤”ā¤° ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļā¤•ā¤¤ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤§ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Premium_Departments_description_upgrade": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤•āĨ‡ā¤ĩā¤˛ ā¤ā¤• ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤Ŧā¤¨ā¤ž ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¸āĨ€ā¤Žā¤žā¤ā¤‚ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤”ā¤° ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤¸āĨā¤Ēā¤°ā¤šā¤žā¤°āĨā¤œ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Premium_Departments_description_free_trial": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤ā¤• ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤Ŧā¤¨ā¤ž ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤…ā¤¨āĨ‡ā¤• ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤œ ā¤šāĨ€ ā¤¨ā¤ŋā¤ƒā¤ļāĨā¤˛āĨā¤• ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚!", + "Premium_License": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸", + "Premium_only": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž", + "Entertainment": "ā¤Žā¤¨āĨ‹ā¤°ā¤‚ā¤œā¤¨", + "Error": "ā¤—ā¤˛ā¤¤āĨ€", + "Error_something_went_wrong": "ā¤‰ā¤Ģā¤ŧ! ā¤•āĨā¤› ā¤—ā¤˛ā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤žāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ĒāĨā¤¨ā¤ƒ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚ ā¤¯ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Error_404": "ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ 404", + "Error_changing_password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "Error_loading_pages": "ā¤ĒāĨ‡ā¤œ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "Error_login_blocked_for_ip": "ā¤‡ā¤¸ ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Error_login_blocked_for_user": "ā¤‡ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances": "ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ: ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤•ā¤ˆ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤ŖāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤šā¤˛ā¤žā¤¨āĨ‡ ā¤Ēā¤° ā¤“ā¤ĒāĨā¤˛āĨ‰ā¤— ā¤ŸāĨ‡ā¤˛ā¤ŋā¤‚ā¤— ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ", + "Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances_details": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ēā¤•ā¤ž MongoDB ā¤°āĨ‡ā¤ĒāĨā¤˛ā¤ŋā¤•ā¤žā¤¸āĨ‡ā¤Ÿ ā¤ŽāĨ‹ā¤Ą ā¤Ēā¤° ā¤šāĨˆ ā¤”ā¤° MONGO_OPLOG_URL ā¤Ēā¤°āĨā¤¯ā¤žā¤ĩā¤°ā¤Ŗ ā¤šā¤° ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤¸ā¤šāĨ€ ā¤ĸā¤‚ā¤— ā¤¸āĨ‡ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤šāĨˆ", + "Error_sending_livechat_offline_message": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "Error_sending_livechat_transcript": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "Error_Site_URL": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Error_Site_URL_description": "ā¤•āĨƒā¤Ēā¤¯ā¤ž, ā¤…ā¤Ēā¤¨āĨ€ \"ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛\" ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤Ēā¤žā¤ā¤‚ [ā¤¯ā¤šā¤žā¤‚](https://go.rocket.chat/i/invalid-site-url)", + "error-action-not-allowed": "{{action}} ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-agent-offline": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨˆ", + "error-agent-status-service-offline": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨˆ ā¤¯ā¤ž ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ā¤ĩā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-application-not-found": "ā¤…ā¤¨āĨā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "error-archived-duplicate-name": "'{{room_name}}' ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤ā¤• ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤šāĨˆā¤¨ā¤˛ ā¤šāĨˆ", + "error-avatar-invalid-url": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤…ā¤ĩā¤¤ā¤žā¤° URL: {{url}}", + "error-avatar-url-handling": "{{username}} ā¤•āĨ‡ ā¤˛ā¤ŋā¤ URL ({{url}}) ā¤¸āĨ‡ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤¸ā¤‚ā¤­ā¤žā¤˛ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "error-business-hours-are-closed": "ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨˆā¤‚", + "error-business-hour-finish-time-before-start-time": "ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ ā¤•ā¤ž ā¤¸ā¤Žā¤¯ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤¸ā¤Žā¤¯ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤•ā¤ž ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "error-business-hour-finish-time-equals-start-time": "ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤”ā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ ā¤•ā¤ž ā¤¸ā¤Žā¤¯ ā¤ā¤• ā¤¸ā¤Žā¤žā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž", + "error-blocked-username": "{{field}} ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤šāĨˆ ā¤”ā¤° ā¤‡ā¤¸ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž!", + "error-canned-response-not-found": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛āĨ€", + "error-cannot-delete-app-user": "ā¤ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤‡ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤ā¤Ē ā¤•āĨ‹ ā¤…ā¤¨ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "error-cant-add-federated-users": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤—āĨˆā¤°-ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", + "error-cant-invite-for-direct-room": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤¸āĨ€ā¤§āĨ‡ ā¤°āĨ‚ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", + "error-channels-setdefault-is-same": "ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ€ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ĩā¤šāĨ€ ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤‡ā¤¸āĨ‡ ā¤Ŧā¤Ļā¤˛ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "error-channels-setdefault-missing-default-param": "ā¤ŦāĨ‰ā¤ĄāĨ€ā¤Ēā¤°ā¤Ž 'ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ' ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "error-could-not-change-email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤ž", + "error-could-not-change-name": "ā¤¨ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤ž", + "error-could-not-change-username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤ž", + "error-comment-is-required": "ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "error-custom-field-name-already-exists": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¨ā¤žā¤Ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "error-delete-protected-role": "ā¤¸ā¤‚ā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", + "error-department-not-found": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "error-department-removal-disabled": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¨ā¤ŋā¤ˇāĨā¤•ā¤žā¤¸ā¤¨ ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚", + "error-direct-message-file-upload-not-allowed": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤žā¤ā¤žā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-duplicate-channel-name": "'{{channel_name}}' ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "error-duplicate-priority-name": "ā¤¸ā¤Žā¤žā¤¨ ā¤¨ā¤žā¤Ž ā¤ĩā¤žā¤˛āĨ€ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "error-edit-permissions-not-allowed": "ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-email-domain-blacklisted": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤ŦāĨā¤˛āĨˆā¤•ā¤˛ā¤ŋā¤¸āĨā¤ŸāĨ‡ā¤Ą ā¤šāĨˆ", + "error-email-body-not-initialized": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•ā¤ž ā¤ŽāĨā¤–āĨā¤¯ ā¤­ā¤žā¤— ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž. ā¤°ā¤ŋā¤š ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤Ēā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤šāĨ‡ā¤Ąā¤° ā¤”ā¤° ā¤ĢāĨā¤Ÿā¤° ā¤•āĨ‹ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤•ā¤°āĨ‡ā¤‚", + "error-email-send-failed": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ: {{message}}", + "error-essential-app-disabled": "ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ: ā¤ā¤• Rocket.Chat ā¤ā¤Ē ā¤œāĨ‹ ā¤‡ā¤¸ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ, ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚", + "error-failed-to-delete-department": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "error-field-unavailable": "{{field}} ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ :(", + "error-file-too-large": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ŧā¤šāĨā¤¤ ā¤Ŧā¤Ąā¤ŧāĨ€ ā¤šāĨˆ", + "error-forwarding-chat": "ā¤šāĨˆā¤Ÿ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤•āĨā¤› ā¤—ā¤˛ā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤Ŧā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "error-forwarding-chat-same-department": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤”ā¤° ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤•ā¤•āĨā¤ˇ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¸ā¤Žā¤žā¤¨ ā¤šāĨˆā¤‚", + "error-forwarding-department-target-not-allowed": "ā¤˛ā¤•āĨā¤ˇāĨā¤¯ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‹ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ.", + "error-guests-cant-have-other-roles": "ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤•āĨ‹ā¤ˆ ā¤…ā¤¨āĨā¤¯ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€.", + "error-import-file-extract-error": "ā¤†ā¤¯ā¤žā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤ŋā¤•ā¤žā¤˛ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛.", + "error-import-file-is-empty": "ā¤†ā¤¯ā¤žā¤¤ā¤ŋā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤–ā¤žā¤˛āĨ€ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤¤ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ.", + "error-import-file-missing": "ā¤†ā¤¯ā¤žā¤¤ ā¤•āĨ€ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤Ēā¤Ĩ ā¤Ēā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛āĨ€āĨ¤", + "error-importer-not-defined": "ā¤†ā¤¯ā¤žā¤¤ā¤• ā¤•āĨ‹ ā¤¸ā¤šāĨ€ ā¤ĸā¤‚ā¤— ā¤¸āĨ‡ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤ž, ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤†ā¤¯ā¤žā¤¤ ā¤ĩā¤°āĨā¤— ā¤—āĨā¤Ž ā¤šāĨˆāĨ¤", + "error-input-is-not-a-valid-field": "{{input}} ā¤Žā¤žā¤¨āĨā¤¯ {{field}} ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-insufficient-permission": "ā¤—ā¤˛ā¤¤āĨ€! ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤‡ā¤¸ ā¤‘ā¤Ēā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‹ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• '{{permission}}' ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-inquiry-taken": "ā¤ĒāĨ‚ā¤›ā¤¤ā¤žā¤› ā¤šāĨ‹ ā¤šāĨā¤•āĨ€ ā¤šāĨˆ", + "error-invalid-account": "ā¤…ā¤ĩāĨˆā¤§ ā¤–ā¤žā¤¤ā¤ž", + "error-invalid-actionlink": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤˛ā¤ŋā¤‚ā¤•", + "error-invalid-arguments": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¤ā¤°āĨā¤•", + "error-invalid-asset": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ", + "error-invalid-channel": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆā¤¨ā¤˛.", + "error-invalid-channel-start-with-chars": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆā¤¨ā¤˛. @ ā¤¯ā¤ž # ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "error-invalid-custom-field": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "error-invalid-custom-field-name": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¨ā¤žā¤Ž. ā¤•āĨ‡ā¤ĩā¤˛ ā¤…ā¤•āĨā¤ˇā¤°āĨ‹ā¤‚, ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žā¤“ā¤‚, ā¤šā¤žā¤‡ā¤Ģā¤ŧā¤¨ ā¤”ā¤° ā¤…ā¤‚ā¤Ąā¤°ā¤¸āĨā¤•āĨ‹ā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "error-invalid-custom-field-value": "{{field}} ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤Žā¤žā¤¨", + "error-invalid-date": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤• ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•āĨ€ ā¤—ā¤ˆ.", + "error-invalid-dates": "ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤• ā¤¸āĨ‡ ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤• ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž", + "error-invalid-description": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "error-invalid-domain": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "error-invalid-email": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ˆā¤ŽāĨ‡ā¤˛ {{email}}", + "error-invalid-email-address": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž", + "error-invalid-email-inbox": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸", + "error-email-inbox-not-found": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "error-invalid-file-height": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Šā¤‚ā¤šā¤žā¤ˆ", + "error-invalid-file-type": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "error-invalid-file-width": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šāĨŒā¤Ąā¤ŧā¤žā¤ˆ", + "error-invalid-from-address": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤ā¤• ā¤…ā¤Žā¤žā¤¨āĨā¤¯ FROM ā¤Ēā¤¤ā¤ž ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž.", + "error-invalid-inquiry": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĒāĨ‚ā¤›ā¤¤ā¤žā¤›", + "error-invalid-integration": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "error-invalid-message": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "error-invalid-method": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĩā¤ŋā¤§ā¤ŋ", + "error-invalid-name": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¨ā¤žā¤Ž", + "error-invalid-password": "ā¤…ā¤ĩāĨˆā¤§ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "error-invalid-param": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĒāĨˆā¤°ā¤žā¤ŽāĨ€ā¤Ÿā¤°", + "error-invalid-params": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĒāĨˆā¤°ā¤žā¤ŽāĨ€ā¤Ÿā¤°", + "error-invalid-permission": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "error-invalid-port-number": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤¨ā¤‚ā¤Ŧā¤°", + "error-invalid-priority": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž", + "error-invalid-redirectUri": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿā¤¯āĨ‚ā¤°āĨ€", + "error-invalid-role": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž", + "error-invalid-room": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤Žā¤°ā¤ž", + "error-invalid-room-name": "{{room_name}} ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĩāĨˆā¤§ ā¤¨ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-invalid-room-type": "{{type}} ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "error-invalid-settings": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•āĨ€ ā¤—ā¤ˆā¤‚", + "error-invalid-subscription": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž", + "error-invalid-token": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ŸāĨ‹ā¤•ā¤¨", + "error-invalid-triggerWords": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤ļā¤ŦāĨā¤Ļ", + "error-invalid-urls": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "error-invalid-user": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "error-invalid-username": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "error-invalid-value": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ŽāĨ‚ā¤˛āĨā¤¯", + "error-invalid-webhook-response": "ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¨āĨ‡ 200 ā¤•āĨ‡ ā¤…ā¤˛ā¤žā¤ĩā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĻāĨ€", + "error-license-user-limit-reached": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤š ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "error-logged-user-not-in-room": "ā¤†ā¤Ē `%s` ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "error-max-departments-number-reached": "ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¨āĨā¤Žā¤¤ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤š ā¤—ā¤āĨ¤ ā¤¨ā¤ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ sales@rocket.chat ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "error-max-guests-number-reached": "ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¨āĨā¤Žā¤¤ ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤š ā¤—ā¤ ā¤šāĨˆā¤‚āĨ¤ ā¤¨ā¤ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ sales@rocket.chat ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "error-max-number-simultaneous-chats-reached": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ā¤• ā¤¸ā¤žā¤Ĩ ā¤šāĨˆā¤Ÿ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤—ā¤ˆ ā¤šāĨˆāĨ¤", + "error-max-rooms-per-guest-reached": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤š ā¤—ā¤ˆ ā¤šāĨˆāĨ¤", + "error-mac-limit-reached": "ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Žā¤žā¤¸ā¤ŋā¤• ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤—ā¤ˆ ā¤šāĨˆāĨ¤", + "error-message-deleting-blocked": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤šāĨˆ", + "error-message-editing-blocked": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨ ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤šāĨˆ", + "error-message-size-exceeded": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•ā¤ž ā¤†ā¤•ā¤žā¤° Message_MaxAllowedSize ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤šāĨˆ", + "error-missing-unsubscribe-link": "ā¤†ā¤Ēā¤•āĨ‹ [ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚] ā¤˛ā¤ŋā¤‚ā¤• ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "error-no-tokens-for-this-user": "ā¤‡ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "error-no-agents-online-in-department": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-no-message-for-unread": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "error-not-allowed": "ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚", + "error-not-authorized": "ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "error-office-hours-are-closed": "ā¤•ā¤žā¤°āĨā¤¯ā¤žā¤˛ā¤¯ ā¤¸ā¤Žā¤¯ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨˆ.", + "Estimated_due_time": "ā¤…ā¤¨āĨā¤Žā¤žā¤¨ā¤ŋā¤¤ ā¤¨ā¤ŋā¤¯ā¤¤ ā¤¸ā¤Žā¤¯", + "error-password-in-history": "ā¤Ļā¤°āĨā¤œ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ēā¤šā¤˛āĨ‡ ā¤‡ā¤¸āĨā¤¤āĨ‡ā¤Žā¤žā¤˛ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤šāĨā¤•ā¤ž ā¤šāĨˆ", + "error-password-policy-not-met": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤°āĨ‚ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Estimated_due_time_in_minutes": "ā¤…ā¤¨āĨā¤Žā¤žā¤¨ā¤ŋā¤¤ ā¤¨ā¤ŋā¤¯ā¤¤ ā¤¸ā¤Žā¤¯ (ā¤Žā¤ŋā¤¨ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¯)", + "error-password-policy-not-met-maxLength": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤˛ā¤‚ā¤Ŧā¤žā¤ˆ ā¤•āĨ€ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤°āĨ‚ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ (ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤šāĨā¤¤ ā¤˛ā¤‚ā¤Ŧā¤ž ā¤šāĨˆ)", + "error-password-policy-not-met-minLength": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ā¤˛ā¤‚ā¤Ŧā¤žā¤ˆ ā¤•āĨ€ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž (ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤šāĨā¤¤ ā¤›āĨ‹ā¤Ÿā¤ž ā¤šāĨˆ)", + "error-password-policy-not-met-oneLowercase": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤˛āĨ‹ā¤…ā¤°ā¤•āĨ‡ā¤¸ ā¤ĩā¤°āĨā¤Ŗ ā¤•āĨ€ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "error-password-policy-not-met-oneNumber": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žā¤¤āĨā¤Žā¤• ā¤ĩā¤°āĨā¤Ŗ ā¤•āĨ€ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "error-password-policy-not-met-oneSpecial": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ā¤ĩā¤°āĨā¤Ŗ ā¤•āĨ€ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Please_go_to_the_Administration_page_then_Livechat_Facebook": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ēā¤° ā¤œā¤žā¤ā¤‚, ā¤Ģā¤ŋā¤° ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ > ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤• ā¤Ēā¤° ā¤œā¤žā¤ā¤‚", + "error-password-policy-not-met-oneUppercase": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤Ŧā¤Ąā¤ŧāĨ‡ ā¤…ā¤•āĨā¤ˇā¤° ā¤•āĨ€ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "error-password-policy-not-met-repeatingCharacters": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤ĩā¤°āĨā¤œā¤ŋā¤¤ ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ĩā¤°āĨā¤ŖāĨ‹ā¤‚ ā¤•āĨ€ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤°āĨ‚ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ (ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤ā¤•-ā¤ĻāĨ‚ā¤¸ā¤°āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤—ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤žā¤¨ ā¤ĩā¤°āĨā¤ŖāĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤šāĨā¤¤ ā¤¸ā¤žā¤°āĨ‡ ā¤šāĨˆā¤‚)", + "error-password-same-as-current": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‡ ā¤¸ā¤Žā¤žā¤¨ ā¤šāĨ€ ā¤Ļā¤°āĨā¤œ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "error-personal-access-tokens-are-current-disabled": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚", + "error-pinning-message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤ŋā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤ž", + "error-push-disabled": "ā¤ĒāĨā¤ļ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ", + "error-remove-last-owner": "ā¤¯ā¤š ā¤†ā¤–ā¤ŋā¤°āĨ€ ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤šāĨˆ. ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤‡ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤¸āĨā¤ĩā¤žā¤ŽāĨ€ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "error-returning-inquiry": "ā¤ĒāĨ‚ā¤›ā¤¤ā¤žā¤› ā¤•āĨ‹ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨŒā¤Ÿā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "error-role-in-use": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤¯ā¤š ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ", + "error-role-name-required": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "error-room-does-not-exist": "ā¤¯ā¤š ā¤•ā¤Žā¤°ā¤ž ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-role-already-present": "ā¤‡ā¤¸ ā¤¨ā¤žā¤Ž ā¤•āĨ€ ā¤ā¤• ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "error-room-already-closed": "ā¤•ā¤Žā¤°ā¤ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨˆ", + "error-room-is-not-closed": "ā¤•ā¤Žā¤°ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-room-onHold": "ā¤—ā¤˛ā¤¤āĨ€! ā¤•ā¤Žā¤°ā¤ž ā¤°āĨā¤•ā¤ž ā¤šāĨā¤† ā¤šāĨˆ", + "error-room-is-already-on-hold": "ā¤—ā¤˛ā¤¤āĨ€! ā¤•ā¤Žā¤°ā¤ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤šāĨˆ", + "error-room-not-on-hold": "ā¤—ā¤˛ā¤¤āĨ€! ā¤•ā¤Žā¤°ā¤ž ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-selected-agent-room-agent-are-same": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤”ā¤° ā¤°āĨ‚ā¤Ž ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¸ā¤Žā¤žā¤¨ ā¤šāĨˆā¤‚", + "error-starring-message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤˜āĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤œā¤ž ā¤¸ā¤•ā¤ž", + "error-tags-must-be-assigned-before-closing-chat": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ŸāĨˆā¤— ā¤…ā¤¸ā¤žā¤‡ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "error-the-field-is-required": "ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą {{field}} ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ.", + "error-this-is-not-a-livechat-room": "ā¤¯ā¤š ā¤ā¤• ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-this-is-a-premium-feature": "ā¤¯ā¤š ā¤ā¤• ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ĢāĨ€ā¤šā¤° ā¤¸āĨ‡ ā¤šāĨˆ", + "error-token-already-exists": "ā¤‡ā¤¸ ā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤ā¤• ā¤ŸāĨ‹ā¤•ā¤¨ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "error-token-does-not-exists": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-too-many-requests": "ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ, ā¤Ŧā¤šāĨā¤¤ ā¤¸ā¤žā¤°āĨ‡ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§. ā¤•āĨƒā¤ĒāĨā¤¯ā¤ž ā¤§āĨ€ā¤°āĨ‡ā¤‚ ā¤•ā¤°āĨ‹āĨ¤ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ {{seconds}} ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€āĨ¤", + "error-transcript-already-requested": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛ā¤ŋā¤Ēā¤ŋ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤šāĨā¤•ā¤ž ā¤šāĨˆ", + "error-unpinning-message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤¨ā¤Ēā¤ŋā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤ž", + "error-user-deactivated": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-user-has-no-roles": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ€ ā¤•āĨ‹ā¤ˆ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-user-is-not-activated": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-user-is-not-agent": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ā¤• ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-user-is-offline": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨˆ", + "error-user-limit-exceeded": "ā¤†ā¤Ē ā¤œā¤ŋā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ #channel_name ā¤Ēā¤° ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚, ā¤‰ā¤¨ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤¸āĨ€ā¤Žā¤ž ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤šāĨˆ", + "error-user-not-belong-to-department": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‡ā¤¸ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-user-not-in-room": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-user-registration-disabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ", + "error-user-registration-secret": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤•āĨ‡ā¤ĩā¤˛ ā¤—āĨā¤ĒāĨā¤¤ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤šāĨˆ", + "error-validating-department-chat-closing-tags": "ā¤œā¤Ŧ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‹ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŸāĨˆā¤— ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ ā¤¤āĨ‹ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤ŸāĨˆā¤— ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "error-no-permission-team-channel": "ā¤†ā¤Ēā¤•āĨ‹ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "error-no-owner-channel": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤šāĨ€ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "error-unable-to-update-priority": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", + "error-you-are-last-owner": "ā¤†ā¤Ē ā¤†ā¤–ā¤ŋā¤°āĨ€ ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤šāĨˆā¤‚. ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤•ā¤Žā¤°ā¤ž ā¤›āĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤¨ā¤ ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "error-saving-sla": "SLA ā¤¸ā¤šāĨ‡ā¤œā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ā¤• ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤šāĨā¤ˆ", + "error-duplicated-sla": "ā¤¸ā¤Žā¤žā¤¨ ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤¨ā¤ŋā¤¯ā¤¤ ā¤¸ā¤Žā¤¯ ā¤ĩā¤žā¤˛ā¤ž ā¤ā¤• SLA ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "error-cannot-place-chat-on-hold": "ā¤†ā¤Ē ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤°ā¤– ā¤¸ā¤•ā¤¤āĨ‡", + "error-contact-sent-last-message-so-cannot-place-on-hold": "ā¤œā¤Ŧ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¨āĨ‡ ā¤†ā¤–ā¤ŋā¤°āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œ ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨ‹ ā¤¤āĨ‹ ā¤†ā¤Ē ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤°ā¤– ā¤¸ā¤•ā¤¤āĨ‡", + "error-unserved-rooms-cannot-be-placed-onhold": "ā¤Ēā¤°āĨ‹ā¤¸āĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤°ā¤–ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", + "Workspace_exceeded_MAC_limit_disclaimer": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•āĨ‹ā¤‚ ā¤•āĨ€ ā¤Žā¤žā¤¸ā¤ŋā¤• ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‹ ā¤Ēā¤žā¤° ā¤•ā¤° ā¤—ā¤¯ā¤ž ā¤šāĨˆ. ā¤‡ā¤¸ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤•āĨ‡ ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤Ŧā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "You_do_not_have_permission_to_do_this": "ā¤¤āĨā¤Žā¤•āĨ‹ ā¤¯ā¤š ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤‡ā¤œā¤žā¤œā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "You_do_not_have_permission_to_execute_this_command": "ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤¨ā¤ŋā¤ˇāĨā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤°āĨā¤¯ā¤žā¤ĒāĨā¤¤ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚: `/{{command}}`", + "You_have_reached_the_limit_active_costumers_this_month": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤Žā¤šāĨ€ā¤¨āĨ‡ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤—āĨā¤°ā¤žā¤šā¤•āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤—ā¤ ā¤šāĨˆā¤‚", + "Errors_and_Warnings": "ā¤¤āĨā¤°āĨā¤Ÿā¤ŋā¤¯ā¤žā¤ ā¤”ā¤° ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨ā¤ŋā¤¯ā¤žā¤", + "Esc_to": "Esc ā¤•āĨ‹", + "Estimated_wait_time": "ā¤…ā¤¨āĨā¤Žā¤žā¤¨ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯", + "Estimated_wait_time_in_minutes": "ā¤…ā¤¨āĨā¤Žā¤žā¤¨ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯ (ā¤Žā¤ŋā¤¨ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤¯)", + "Event_notifications": "ā¤˜ā¤Ÿā¤¨ā¤ž ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚", + "Event_notifications_description": "ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤•āĨ‡ ā¤†ā¤Ē ā¤ā¤Ē ā¤•āĨ‹ ā¤†ā¤—ā¤žā¤ŽāĨ€ ā¤˜ā¤Ÿā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤°āĨ‹ā¤•āĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Event_Trigger": "ā¤‡ā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤°", + "Event_Trigger_Description": "ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•ā¤ŋā¤¸ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤•ā¤ž ā¤ˆā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤‡ā¤¸ ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤‡ā¤‚ā¤ŸāĨ€ā¤—āĨā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‹ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤—ā¤ž", + "every_5_minutes": "ā¤šā¤° 5 ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_10_seconds": "ā¤šā¤° 10 ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_30_seconds": "ā¤šā¤° 30 ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_10_minutes": "ā¤šā¤° 10 ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_30_minutes": "ā¤šā¤° 30 ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_day": "ā¤šā¤° ā¤Ļā¤ŋā¤¨ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_hour": "ā¤šā¤° ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_minute": "ā¤šā¤° ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_second": "ā¤šā¤° ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_six_hours": "ā¤šā¤° ā¤›ā¤š ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_12_hours": "ā¤šā¤° 12 ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_24_hours": "ā¤šā¤° 24 ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "every_48_hours": "ā¤šā¤° 48 ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤°", + "Everyone_can_access_this_channel": "ā¤šā¤° ā¤•āĨ‹ā¤ˆ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Exact": "ā¤ā¤•ā¤Ļā¤Ž ā¤¸ā¤šāĨ€", + "Example_payload": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤ĒāĨ‡ā¤˛āĨ‹ā¤Ą", + "Example_s": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: %s", + "except_pinned": "(ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤›āĨ‹ā¤Ąā¤ŧā¤•ā¤° ā¤œā¤ŋā¤¨āĨā¤šāĨ‡ā¤‚ ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ)", + "Exclude_Botnames": "ā¤ŦāĨ‰ā¤ŸāĨā¤¸ ā¤•āĨ‹ ā¤Ŧā¤žā¤šā¤° ā¤¨ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "Exclude_Botnames_Description": "ā¤‰ā¤¨ ā¤ŦāĨ‰ā¤ŸāĨā¤¸ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤šā¤žā¤°-ā¤ĒāĨā¤°ā¤¸ā¤žā¤° ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤ŋā¤¨ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤‰ā¤Ēā¤°āĨ‹ā¤•āĨā¤¤ ā¤°āĨ‡ā¤—āĨā¤˛ā¤° ā¤ā¤•āĨā¤¸ā¤ĒāĨā¤°āĨ‡ā¤ļā¤¨ ā¤¸āĨ‡ ā¤ŽāĨ‡ā¤˛ ā¤–ā¤žā¤¤ā¤ž ā¤šāĨ‹āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤, ā¤¤āĨ‹ ā¤ŦāĨ‰ā¤ŸāĨā¤¸ ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤ŋā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Exclude_pinned": "ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ŧā¤žā¤šā¤° ā¤¨ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "Execute_Synchronization_Now": "ā¤…ā¤­āĨ€ ā¤¸ā¤ŋā¤‚ā¤•āĨā¤°āĨ‹ā¤¨ā¤žā¤‡ā¤œā¤ŧāĨ‡ā¤ļā¤¨ ā¤¨ā¤ŋā¤ˇāĨā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Exit_Full_Screen": "ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤¸āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤¨ā¤ŋā¤•ā¤˛āĨ‡ā¤‚", + "Expand": "ā¤Ŧā¤ĸā¤ŧā¤žā¤¨ā¤ž", + "Experimental_Feature_Alert": "ā¤¯ā¤š ā¤ā¤• ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤—ā¤ŋā¤• ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤šāĨˆ! ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤§āĨā¤¯ā¤žā¤¨ ā¤°ā¤–āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¯ā¤š ā¤­ā¤ĩā¤ŋā¤ˇāĨā¤¯ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤•āĨ‡ ā¤Ŧā¤Ļā¤˛ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ, ā¤ŸāĨ‚ā¤Ÿ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤¯ā¤ž ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤­āĨ€ ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Expired": "ā¤–ā¤¤āĨā¤Ž ā¤šāĨ‹ ā¤šāĨā¤•ā¤ž", + "Expiration": "ā¤¸ā¤Žā¤¯ ā¤¸āĨ€ā¤Žā¤ž ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ", + "Expiration_(Days)": "ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ (ā¤Ļā¤ŋā¤¨)", + "Export_as_file": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Export_Messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Export_My_Data": "ā¤ŽāĨ‡ā¤°ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚ (JSON)", + "expression": "ā¤…ā¤­ā¤ŋā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ", + "Extended": "ā¤ĩā¤ŋā¤¸āĨā¤¤ā¤žā¤°ā¤ŋā¤¤", + "Extensions": "ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨", + "Extension_Number": "ā¤ĩā¤ŋā¤¸āĨā¤¤ā¤žā¤°ā¤Ŗ ā¤•āĨā¤°ā¤Žā¤žā¤‚ā¤•", + "Extension_Status": "ā¤ĩā¤ŋā¤¸āĨā¤¤ā¤žā¤° ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "External": "ā¤Ŧā¤žā¤šā¤°āĨ€", + "External_Domains": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "External_Queue_Service_URL": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤•ā¤¤ā¤žā¤° ā¤¸āĨ‡ā¤ĩā¤ž ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "External_Service": "ā¤Ŧā¤žā¤šāĨā¤¯ ā¤¸āĨ‡ā¤ĩā¤ž", + "External_Users": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚", + "Extremely_likely": "ā¤Ŧā¤šāĨā¤¤ ā¤œāĨā¤¯ā¤žā¤Ļā¤ž ā¤¸ā¤‚ā¤­ā¤žā¤ĩā¤¨ā¤ž", + "Facebook": "ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤•", + "Facebook_Page": "ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤• ā¤ĒāĨ‡ā¤œ", + "Failed": "ā¤…ā¤¸ā¤Ģā¤˛", + "Failed_to_activate_invite_token": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failed_to_add_monitor": "ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failed_To_Download_Files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failed_to_generate_invite_link": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failed_To_Load_Import_Data": "ā¤†ā¤¯ā¤žā¤¤ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failed_To_Load_Import_History": "ā¤†ā¤¯ā¤žā¤¤ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failed_To_Load_Import_Operation": "ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failed_To_Start_Import": "ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failed_to_validate_invite_token": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛", + "Failure": "ā¤…ā¤¸ā¤Ģā¤˛ā¤¤ā¤ž", + "False": "ā¤…ā¤¸ā¤¤āĨā¤¯", + "Fallback_forward_department": "ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ģā¤ŧāĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤ĩā¤ŋā¤­ā¤žā¤—", + "Fallback_forward_department_description": "ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤Ģā¤ŧāĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‹ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆ ā¤œāĨ‹ ā¤‡ā¤¸ ā¤¸ā¤Žā¤¯ ā¤•āĨ‹ā¤ˆ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤‡ā¤¸ ā¤Ēā¤° ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤—ā¤ž", + "Favorite": "ā¤Ēā¤¸ā¤‚ā¤ĻāĨ€ā¤Ļā¤ž", + "Favorite_Rooms": "ā¤Ēā¤¸ā¤‚ā¤ĻāĨ€ā¤Ļā¤ž ā¤•ā¤Žā¤°āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Favorites": "ā¤Ēā¤¸ā¤‚ā¤ĻāĨ€ā¤Ļā¤ž", + "Feature_preview": "ā¤Ģā¤ŧāĨ€ā¤šā¤° ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨", + "Feature_preview_page_description": "ā¤ĢāĨ€ā¤šā¤° ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ēā¤° ā¤†ā¤Ēā¤•ā¤ž ā¤¸āĨā¤ĩā¤žā¤—ā¤¤ ā¤šāĨˆ! ā¤¯ā¤šā¤žā¤‚, ā¤†ā¤Ē ā¤¨ā¤ĩāĨ€ā¤¨ā¤¤ā¤Ž ā¤…ā¤¤āĨā¤¯ā¤žā¤§āĨā¤¨ā¤ŋā¤• ā¤¸āĨā¤ĩā¤ŋā¤§ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤œāĨ‹ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤•ā¤žā¤¸ ā¤•āĨ‡ ā¤…ā¤§āĨ€ā¤¨ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤†ā¤§ā¤ŋā¤•ā¤žā¤°ā¤ŋā¤• ā¤¤āĨŒā¤° ā¤Ēā¤° ā¤œā¤žā¤°āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤•āĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤‚āĨ¤\n\nā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¯āĨ‡ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤…ā¤­āĨ€ ā¤­āĨ€ ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤šā¤°ā¤Ŗ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤¸āĨā¤Ĩā¤ŋā¤° ā¤¯ā¤ž ā¤ĒāĨ‚ā¤°āĨ€ ā¤¤ā¤°ā¤š ā¤•ā¤žā¤°āĨā¤¯ā¤žā¤¤āĨā¤Žā¤• ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "featured": "ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤", + "Featured": "ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤", + "Feature_depends_on_selected_call_provider_to_be_enabled_from_administration_settings": "ā¤¯ā¤š ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ (ā¤ā¤Ąā¤Žā¤ŋā¤¨ -> ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤¨āĨā¤ĢāĨā¤°āĨ‡ā¤‚ā¤¸) ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤°āĨ‹ā¤•āĨā¤¤ ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤Ēā¤° ā¤¨ā¤ŋā¤°āĨā¤­ā¤° ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Feature_Depends_on_Livechat_Visitor_navigation_as_a_message_to_be_enabled": "ā¤¯ā¤š ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ \"ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤­āĨ‡ā¤œāĨ‡ā¤‚\" ā¤Ēā¤° ā¤¨ā¤ŋā¤°āĨā¤­ā¤° ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Feature_Limiting": "ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Features": "ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤ā¤", + "Federation": "ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨", + "Federation_Description": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤•-ā¤ĻāĨ‚ā¤¸ā¤°āĨ‡ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤‚ā¤šā¤žā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Federation_Enable": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Federation_Example_matrix_server": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: ā¤ŽāĨˆā¤ŸāĨā¤°ā¤ŋā¤•āĨā¤¸.ā¤‘ā¤°āĨā¤—", + "Federation_Federated_room_search": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤–āĨ‹ā¤œ", + "Federation_Public_key": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤•āĨā¤‚ā¤œāĨ€", + "Federation_Search_federated_rooms": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‡ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Federation_slash_commands": "ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤•ā¤ž ā¤†ā¤ĻāĨ‡ā¤ļ", + "FEDERATION_Discovery_Method": "ā¤–āĨ‹ā¤œ ā¤ĩā¤ŋā¤§ā¤ŋ", + "FEDERATION_Discovery_Method_Description": "ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ DNS ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤Ēā¤° ā¤šā¤Ŧ ā¤¯ā¤ž SRV ā¤”ā¤° TXT ā¤ĒāĨā¤°ā¤ĩā¤ŋā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "FEDERATION_Domain": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "FEDERATION_Domain_Alert": "ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤‡ā¤¸āĨ‡ ā¤¨ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚, ā¤šā¤Ž ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤‚ā¤­ā¤žā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "FEDERATION_Domain_Description": "ā¤ĩā¤š ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚ ā¤œā¤ŋā¤¸ā¤¸āĨ‡ ā¤¯ā¤š ā¤¸ā¤°āĨā¤ĩā¤° ā¤˛ā¤ŋā¤‚ā¤• ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤ - ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤: @rocket.chat.", + "FEDERATION_Enabled": "ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤•āĨ‹ ā¤ā¤•āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸āĨ¤", + "FEDERATION_Enabled_Alert": "ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤¸ā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ ā¤ĒāĨā¤°ā¤—ā¤¤ā¤ŋ ā¤Ēā¤° ā¤šāĨˆāĨ¤ ā¤‡ā¤¸ ā¤¸ā¤Žā¤¯ ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļā¤¨ ā¤ĒāĨā¤°ā¤Ŗā¤žā¤˛āĨ€ ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ€ ā¤…ā¤¨āĨā¤ļā¤‚ā¤¸ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "FEDERATION_Public_Key": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤•āĨā¤‚ā¤œāĨ€", + "FEDERATION_Public_Key_Description": "ā¤¯ā¤š ā¤ĩā¤š ā¤•āĨā¤‚ā¤œāĨ€ ā¤šāĨˆ ā¤œā¤ŋā¤¸āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸ā¤žā¤Ĩā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤žā¤ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "FEDERATION_Status": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "FEDERATION_Test_Setup": "ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤ž", + "FEDERATION_Test_Setup_Error": "ā¤†ā¤Ēā¤•āĨ‡ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤†ā¤Ēā¤•ā¤ž ā¤¸ā¤°āĨā¤ĩā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ ā¤¸ā¤•ā¤ž, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ€ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ€ ā¤¸ā¤ŽāĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "FEDERATION_Test_Setup_Success": "ā¤†ā¤Ēā¤•ā¤ž ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤•ā¤žā¤Ž ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤…ā¤¨āĨā¤¯ ā¤¸ā¤°āĨā¤ĩā¤° ā¤†ā¤Ēā¤•āĨ‹ ā¤ĸāĨ‚ā¤‚ā¤ĸ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚!", + "Retry_Count": "count ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Federation_Matrix": "ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ V2", "Federation_Matrix_enabled": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "Federation_Matrix_Enabled_Alert": "ā¤ŽāĨˆā¤ŸāĨā¤°ā¤ŋā¤•āĨā¤¸ ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¯ā¤šā¤žā¤‚ ā¤Ēā¤žā¤ˆ ā¤œā¤ž ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆ (ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ, ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩāĨ€ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤¨ā¤ƒ ā¤†ā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨ā¤ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ)", + "Federation_Matrix_Federated": "ā¤¸ā¤‚ā¤˜āĨ€ā¤¯", + "Federation_Matrix_Federated_Description": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤Ŧā¤¨ā¤žā¤•ā¤° ā¤†ā¤Ē ā¤¨ ā¤¤āĨ‹ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡ ā¤”ā¤° ā¤¨ ā¤šāĨ€ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ", + "Federation_Matrix_Federated_Description_disabled": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ.", + "Federation_Matrix_id": "ā¤ā¤Ēā¤¸āĨ‡ā¤ĩā¤ž ā¤†ā¤ˆā¤ĄāĨ€", + "Federation_Matrix_hs_token": "ā¤šāĨ‹ā¤Žā¤¸ā¤°āĨā¤ĩā¤° ā¤ŸāĨ‹ā¤•ā¤¨", + "Federation_Matrix_as_token": "ā¤ā¤Ēā¤¸ā¤°āĨā¤ĩā¤ŋā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨", + "Federation_Matrix_homeserver_url": "ā¤šāĨ‹ā¤Žā¤¸ā¤°āĨā¤ĩā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Federation_Matrix_homeserver_url_alert": "ā¤šā¤Ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤¨ā¤, ā¤–ā¤žā¤˛āĨ€ ā¤šāĨ‹ā¤Žā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ€ ā¤…ā¤¨āĨā¤ļā¤‚ā¤¸ā¤ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Federation_Matrix_homeserver_domain": "ā¤šāĨ‹ā¤Žā¤¸ā¤°āĨā¤ĩā¤° ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "Federation_Matrix_homeserver_domain_alert": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•āĨ‡ā¤ĩā¤˛ ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤…ā¤˛ā¤žā¤ĩā¤ž ā¤¤āĨ€ā¤¸ā¤°āĨ‡ ā¤Ēā¤•āĨā¤ˇ ā¤•āĨ‡ ā¤—āĨā¤°ā¤žā¤šā¤•āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šāĨ‹ā¤Žā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤¨ā¤šāĨ€ā¤‚ ā¤œāĨā¤Ąā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "Federation_Matrix_bridge_url": "ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Federation_Matrix_bridge_localpart": "ā¤ā¤Ēā¤¸ā¤°āĨā¤ĩā¤ŋā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤˛āĨ‹ā¤•ā¤˛ā¤Ēā¤žā¤°āĨā¤Ÿ", + "Federation_Matrix_registration_file": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤Ģā¤ŧā¤žā¤‡ā¤˛", + "Federation_Matrix_registration_file_Alert": "ā¤Žā¤šā¤¤āĨā¤ĩā¤ĒāĨ‚ā¤°āĨā¤Ŗ: ā¤…ā¤˛āĨā¤Ēā¤•ā¤žā¤˛ā¤ŋā¤• ā¤˜ā¤Ÿā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤‰ā¤¨ ā¤¸ā¤­āĨ€ ā¤¸ā¤°āĨā¤ĩā¤°āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤Ÿā¤žā¤‡ā¤Ēā¤ŋā¤‚ā¤— ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤° ā¤˛āĨ‡ā¤—ā¤ž ā¤œā¤ŋā¤¨ā¤¸āĨ‡ ā¤†ā¤Ē ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤šāĨā¤ ā¤šāĨˆā¤‚āĨ¤ ā¤‡ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ€ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ (.yaml ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤œā¤ŋā¤¸āĨ‡ ā¤†ā¤Ē Rocket.Chat ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚) ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤šāĨ‹ā¤Ž ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤°), ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚:
    de.sorunome.msc2409.push_epheral: true", + "Federation_Matrix_error_applying_room_roles": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤¨āĨ‡ā¤Ÿā¤ĩā¤°āĨā¤• ā¤Ēā¤° ā¤°āĨ‚ā¤Ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤•āĨā¤› ā¤—ā¤˛ā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "Federation_Matrix_giving_same_permission_warning": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤œāĨˆā¤¸āĨ‡ ā¤šāĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤žā¤§ā¤ŋā¤•ā¤žā¤° ā¤ĻāĨ‡ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚, ā¤†ā¤Ē ā¤‡ā¤¸ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤ ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ēā¤•āĨ€ ā¤†ā¤—āĨ‡ ā¤Ŧā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤‡ā¤šāĨā¤›ā¤ž ā¤šāĨˆ?", + "Federation_Matrix_losing_privileges": "ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤žā¤§ā¤ŋā¤•ā¤žā¤° ā¤–āĨ‹ā¤¨ā¤ž", + "Federation_Matrix_losing_privileges_warning": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡, ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤†ā¤Ē ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•āĨ‹ ā¤Ēā¤Ļā¤žā¤ĩā¤¨ā¤¤ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤žā¤§ā¤ŋā¤•ā¤žā¤° ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨˆā¤‚ ā¤¤āĨ‹ ā¤†ā¤Ē ā¤¯ā¤š ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤žā¤§ā¤ŋā¤•ā¤žā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤ ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤…ā¤Ŧ ā¤­āĨ€ ā¤†ā¤—āĨ‡ ā¤Ŧā¤ĸā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Federation_Matrix_not_allowed_to_change_moderator": "ā¤†ā¤Ēā¤•āĨ‹ ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤Ÿā¤° ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Federation_Matrix_not_allowed_to_change_owner": "ā¤†ā¤Ēā¤•āĨ‹ ā¤¸āĨā¤ĩā¤žā¤ŽāĨ€ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Federation_Matrix_join_public_rooms_is_premium": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧāĨ‡ā¤‚ ā¤ā¤• ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤šāĨˆ", + "Federation_Matrix_max_size_of_public_rooms_users": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ĻāĨ‚ā¤°ā¤¸āĨā¤Ĩ ā¤¸ā¤°āĨā¤ĩā¤° ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤•ā¤•āĨā¤ˇ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Federation_Matrix_max_size_of_public_rooms_users_desc": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ĻāĨ‚ā¤°ā¤¸āĨā¤Ĩ ā¤¸ā¤°āĨā¤ĩā¤° ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤•ā¤•āĨā¤ˇ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤Ēā¤° ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žāĨ¤ ā¤…ā¤§ā¤ŋā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤ĩā¤žā¤˛āĨ‡ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤œā¤°ā¤…ā¤‚ā¤Ļā¤žā¤œ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Federation_Matrix_max_size_of_public_rooms_users_Alert": "ā¤§āĨā¤¯ā¤žā¤¨ ā¤°ā¤–āĨ‡ā¤‚, ā¤†ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤œā¤ŋā¤¤ā¤¨ā¤ž ā¤Ŧā¤Ąā¤ŧā¤ž ā¤•ā¤Žā¤°ā¤ž ā¤ĻāĨ‡ā¤‚ā¤—āĨ‡, ā¤‰ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤¤ā¤¨ā¤ž ā¤šāĨ€ ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤Žā¤¯ ā¤˛ā¤—āĨ‡ā¤—ā¤ž, ā¤¸ā¤žā¤Ĩ ā¤šāĨ€ ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤¨ ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤šāĨ‹ā¤—āĨ€āĨ¤ ā¤”ā¤° ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚", + "Field": "ā¤ŽāĨˆā¤Ļā¤žā¤¨", + "Field_removed": "ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Field_required": "ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "File": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛", + "File_Downloads_Started": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤šāĨ‹ ā¤—ā¤", + "File_exceeds_allowed_size_of_bytes": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤†ā¤•ā¤žā¤° {{size}} ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤šāĨˆāĨ¤", + "File_name_Placeholder": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĸāĨ‚ā¤‚ā¤ĸāĨ‹...", + "File_not_allowed_direct_messages": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤žā¤ā¤žā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ.", + "File_Path": "ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ā¤Ēā¤Ĩ", + "file_pruned": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•āĨ€ ā¤›ā¤ā¤Ÿā¤žā¤ˆ ā¤•āĨ€ ā¤—ā¤ˆ", + "File_removed_by_automatic_prune": "ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤›ā¤ā¤Ÿā¤žā¤ˆ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", + "File_removed_by_prune": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•āĨ‹ ā¤ĒāĨā¤°āĨ‚ā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "File_Type": "ā¤Ģā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "File_type_is_not_accepted": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ.", + "File_uploaded": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ", + "File_Upload_Disabled": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "File_uploaded_successfully": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ", + "File_URL": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "FileType": "ā¤Ģā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚", + "Files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚", + "Files_only": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤¸ā¤‚ā¤˛ā¤—āĨā¤¨ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤šā¤Ÿā¤žā¤ā¤, ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤°ā¤–āĨ‡ā¤‚", + "FileSize_Bytes": "{{fileSize}} ā¤Ŧā¤žā¤‡ā¤ŸāĨā¤¸", + "FileSize_KB": "{{fileSize}} ā¤•āĨ‡ā¤ŦāĨ€", + "FileSize_MB": "{{fileSize}} ā¤ā¤Žā¤ŦāĨ€", + "FileUpload": "ā¤Ģā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą", + "FileUpload_Description": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤”ā¤° ā¤­ā¤‚ā¤Ąā¤žā¤°ā¤Ŗ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚.", + "FileUpload_Cannot_preview_file": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", + "FileUpload_Disabled": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚.", + "FileUpload_Enable_json_web_token_for_files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ Json ā¤ĩāĨ‡ā¤Ŧ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "FileUpload_Enable_json_web_token_for_files_description": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• JWT ā¤œāĨ‹ā¤Ąā¤ŧā¤¤ā¤ž ā¤šāĨˆ", + "FileUpload_Restrict_to_room_members": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤¤ā¤• ā¤šāĨ€ ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤°ā¤–āĨ‡ā¤‚", + "FileUpload_Restrict_to_room_members_Description": "ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤Ēā¤° ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ā¤ĩā¤˛ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤¤ā¤• ā¤šāĨ€ ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤°ā¤–āĨ‡ā¤‚", + "FileUpload_Enabled": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤¸ā¤•āĨā¤ˇā¤Ž", + "FileUpload_Enabled_Direct": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤¸ā¤•āĨā¤ˇā¤Ž", + "FileUpload_Error": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "FileUpload_File_Empty": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤–ā¤žā¤˛āĨ€", + "FileUpload_FileSystemPath": "ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤Ēā¤Ĩ", + "FileUpload_GoogleStorage_AccessId": "Google ā¤¸ā¤‚ā¤—āĨā¤°ā¤šā¤Ŗ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤†ā¤ˆā¤ĄāĨ€", + "FileUpload_GoogleStorage_AccessId_Description": "ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤†ā¤ˆā¤ĄāĨ€ ā¤†ā¤Ž ā¤¤āĨŒā¤° ā¤Ēā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ, ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤: \"`example-test@example.iam.gserviceaccount.com`\"", + "FileUpload_GoogleStorage_Bucket": "Google ā¤¸ā¤‚ā¤—āĨā¤°ā¤šā¤Ŗ ā¤Ŧā¤•āĨ‡ā¤Ÿ ā¤¨ā¤žā¤Ž", + "FileUpload_GoogleStorage_Bucket_Description": "ā¤Ŧā¤•āĨ‡ā¤Ÿ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤œā¤ŋā¤¸ ā¤Ēā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤œā¤žā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤.", + "FileUpload_GoogleStorage_ProjectId": "ā¤ĒāĨā¤°āĨ‹ā¤œāĨ‡ā¤•āĨā¤Ÿ ā¤†ā¤ˆā¤ĄāĨ€", + "FileUpload_GoogleStorage_ProjectId_Description": "Google ā¤ĄāĨ‡ā¤ĩā¤˛ā¤Ēā¤° ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤¸āĨ‡ ā¤ĒāĨā¤°āĨ‹ā¤œāĨ‡ā¤•āĨā¤Ÿ ā¤†ā¤ˆā¤ĄāĨ€", + "FileUpload_GoogleStorage_Proxy_Avatars": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤ĩā¤¤ā¤žā¤°", + "FileUpload_GoogleStorage_Proxy_Avatars_Description": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¤ā¤• ā¤¸āĨ€ā¤§āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤ŋā¤¤ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ", + "FileUpload_GoogleStorage_Proxy_Uploads": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą", + "FileUpload_GoogleStorage_Proxy_Uploads_Description": "ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¤ā¤• ā¤¸āĨ€ā¤§āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ŸāĨā¤°ā¤žā¤‚ā¤¸ā¤Žā¤ŋā¤ļā¤¨", + "FileUpload_GoogleStorage_Secret": "ā¤—āĨ‚ā¤—ā¤˛ ā¤¸āĨā¤ŸāĨ‹ā¤°āĨ‡ā¤œ ā¤¸āĨ€ā¤•āĨā¤°āĨ‡ā¤Ÿ", + "FileUpload_GoogleStorage_Secret_Description": "ā¤•āĨƒā¤Ēā¤¯ā¤ž [ā¤‡ā¤¨ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚](https://github.com/CulturalMe/meteor-slingshot#google-cloud) ā¤•ā¤ž ā¤Ēā¤žā¤˛ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž ā¤¯ā¤šā¤žā¤‚ ā¤ĒāĨ‡ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "FileUpload_json_web_token_secret_for_files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą JSON ā¤ĩāĨ‡ā¤Ŧ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤°ā¤šā¤¸āĨā¤¯", + "FileUpload_json_web_token_secret_for_files_description": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą JSON ā¤ĩāĨ‡ā¤Ŧ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸āĨ€ā¤•āĨā¤°āĨ‡ā¤Ÿ (ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤šā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ)", + "FileUpload_MaxFileSize": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤†ā¤•ā¤žā¤° (ā¤Ŧā¤žā¤‡ā¤ŸāĨā¤¸ ā¤ŽāĨ‡ā¤‚)", + "FileUpload_MaxFileSizeDescription": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤•ā¤žā¤° ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸āĨ‡ -1 ā¤Ēā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "FileUpload_MediaType_NotAccepted__type__": "ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚: {{type}}", + "FileUpload_MediaType_NotAccepted": "ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚", + "FileUpload_MediaTypeBlackList": "ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "FileUpload_MediaTypeBlackListDescription": "ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€āĨ¤ ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°āĨ‹ā¤‚ ā¤Ēā¤° ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "FileUpload_MediaTypeWhiteList": "ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "FileUpload_MediaTypeWhiteListDescription": "ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€āĨ¤ ā¤¸ā¤­āĨ€ ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸āĨ‡ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤‚āĨ¤", + "FileUpload_ProtectFiles": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤°ā¤–āĨ‡ā¤‚", + "FileUpload_ProtectFilesDescription": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤ŋā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤šāĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤—āĨ€", + "FileUpload_ProtectFilesEnabled_JWTNotSet": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤šāĨˆā¤‚, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ JWT ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŸāĨā¤ĩā¤ŋā¤˛ā¤ŋā¤¯āĨ‹ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤š ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆāĨ¤ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē -> ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "FileUpload_RotateImages": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤Ēā¤° ā¤›ā¤ĩā¤ŋā¤¯ā¤žā¤ ā¤˜āĨā¤Žā¤žā¤ā¤", + "FileUpload_RotateImages_Description": "ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤›ā¤ĩā¤ŋ ā¤—āĨā¤Ŗā¤ĩā¤¤āĨā¤¤ā¤ž ā¤šā¤žā¤¨ā¤ŋ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆ", + "FileUpload_S3_Acl": "ā¤ā¤¸āĨ€ā¤ā¤˛", + "FileUpload_S3_AWSAccessKeyId": "ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤•āĨ€ ā¤šā¤žā¤ŦāĨ€", + "FileUpload_S3_AWSSecretAccessKey": "ā¤—āĨā¤ĒāĨā¤¤ ā¤•āĨā¤‚ā¤œāĨ€", + "FileUpload_S3_Bucket": "ā¤Ŧā¤žā¤˛āĨā¤ŸāĨ€ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "FileUpload_S3_BucketURL": "ā¤Ŧā¤•āĨ‡ā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "FileUpload_S3_CDN": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ€ā¤ĄāĨ€ā¤ā¤¨ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "FileUpload_S3_ForcePathStyle": "ā¤Ŧā¤˛ ā¤Ēā¤Ĩ ā¤ļāĨˆā¤˛āĨ€", + "FileUpload_S3_Proxy_Avatars": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤ĩā¤¤ā¤žā¤°", + "FileUpload_S3_Proxy_Avatars_Description": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¤ā¤• ā¤¸āĨ€ā¤§āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤ŋā¤¤ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ", + "FileUpload_S3_Proxy_Uploads": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą", + "FileUpload_S3_Proxy_Uploads_Description": "ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¤ā¤• ā¤¸āĨ€ā¤§āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ŸāĨā¤°ā¤žā¤‚ā¤¸ā¤Žā¤ŋā¤ļā¤¨", + "FileUpload_S3_Region": "ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "FileUpload_S3_SignatureVersion": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "FileUpload_S3_URLExpiryTimeSpan": "ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ ā¤¸ā¤Žā¤¯ period", + "FileUpload_S3_URLExpiryTimeSpan_Description": "ā¤ĩā¤š ā¤¸ā¤Žā¤¯ ā¤œā¤ŋā¤¸ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ Amazon S3 ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤œāĨ‡ā¤¨ā¤°āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ URL ā¤Žā¤žā¤¨āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤‚ā¤—āĨ‡ (ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚)āĨ¤ ā¤¯ā¤Ļā¤ŋ 5 ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤¸āĨ‡ ā¤•ā¤Ž ā¤Ēā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤‡ā¤¸ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‹ ā¤…ā¤¨ā¤ĻāĨ‡ā¤–ā¤ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "FileUpload_Storage_Type": "ā¤­ā¤ŖāĨā¤Ąā¤žā¤°ā¤Ŗ ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "FileUpload_Webdav_Password": "ā¤ĩāĨ‡ā¤Ŧā¤ĄāĨ€ā¤ā¤ĩāĨ€ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "FileUpload_Webdav_Proxy_Avatars": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤ĩā¤¤ā¤žā¤°", + "FileUpload_Webdav_Proxy_Avatars_Description": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¤ā¤• ā¤¸āĨ€ā¤§āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤ŋā¤¤ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ", + "FileUpload_Webdav_Proxy_Uploads": "ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą", + "FileUpload_Webdav_Proxy_Uploads_Description": "ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¤ā¤• ā¤¸āĨ€ā¤§āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ŸāĨā¤°ā¤žā¤‚ā¤¸ā¤Žā¤ŋā¤ļā¤¨", + "FileUpload_Webdav_Server_URL": "WebDAV ā¤¸ā¤°āĨā¤ĩā¤° ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "FileUpload_Webdav_Upload_Folder_Path": "ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤Ēā¤Ĩ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "FileUpload_Webdav_Upload_Folder_Path_Description": "WebDAV ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤Ēā¤Ĩ ā¤œā¤ŋā¤¸ ā¤Ēā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤œā¤žā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤", + "FileUpload_Webdav_Username": "ā¤ĩāĨ‡ā¤Ŧā¤ĄāĨ€ā¤ā¤ĩāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "Filter": "ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤°", + "Filter_by_category": "ā¤ļāĨā¤°āĨ‡ā¤ŖāĨ€ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Filter_by_Custom_Fields": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Filter_By_Price": "ā¤•āĨ€ā¤Žā¤¤ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Filter_By_Status": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤°āĨ‡ā¤‚", "Filters": "ā¤Ģā¤ŋā¤˛āĨā¤Ÿā¤°", + "Filters_applied": "ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤ŋā¤ ā¤—ā¤", + "Financial_Services": "ā¤ĩā¤ŋā¤¤āĨā¤¤āĨ€ā¤¯ ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤‚", + "Finish": "ā¤–ā¤¤āĨā¤Ž ā¤•ā¤°ā¤¨ā¤ž", + "Finish_Registration": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "First_Channel_After_Login": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤Ēā¤šā¤˛ā¤ž ā¤šāĨˆā¤¨ā¤˛", + "First_response_time": "ā¤ĒāĨā¤°ā¤Ĩā¤Ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤Žā¤¯", + "Flags": "ā¤ā¤‚ā¤ĄāĨ‡", + "Follow_message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•ā¤ž ā¤Ēā¤žā¤˛ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Follow_social_profiles": "ā¤šā¤Žā¤žā¤°āĨ‡ ā¤¸ā¤žā¤Žā¤žā¤œā¤ŋā¤• ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤…ā¤¨āĨā¤¸ā¤°ā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚, ā¤šā¤ŽāĨ‡ā¤‚ ā¤œāĨ€ā¤Ĩā¤Ŧ ā¤Ēā¤° ā¤ĢāĨ‹ā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤šā¤Žā¤žā¤°āĨ‡ ā¤ŸāĨā¤°āĨ‡ā¤˛āĨ‹ ā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤Ēā¤° ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤ā¤Ē ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĩā¤ŋā¤šā¤žā¤° ā¤¸ā¤žā¤ā¤ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Following": "ā¤…ā¤—ā¤˛āĨ‡", + "Fonts": "ā¤ĢāĨ‹ā¤‚ā¤ŸāĨā¤¸", + "Food_and_Drink": "ā¤­āĨ‹ā¤œā¤¨ ā¤ĒāĨ‡ā¤¯", + "Footer": "ā¤Ģā¤ŧāĨā¤Ÿā¤Ŧā¤žā¤˛", + "Footer_Direct_Reply": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤•āĨā¤ˇ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤Ēā¤žā¤Ļā¤˛āĨ‡ā¤–", + "For_more_details_please_check_our_docs": "ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤šā¤Žā¤žā¤°āĨ‡ ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚āĨ¤", + "For_your_security_you_must_enter_your_current_password_to_continue": "ā¤†ā¤Ēā¤•āĨ€ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤œā¤žā¤°āĨ€ ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "Force_Disable_OpLog_For_Cache": "ā¤•āĨˆā¤ļ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤“ā¤Ēā¤˛āĨ‰ā¤— ā¤•āĨ‹ ā¤Ŧā¤˛ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Force_Disable_OpLog_For_Cache_Description": "ā¤•āĨˆā¤ļ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤­āĨ€ ā¤‰ā¤¸āĨ‡ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ OpLog ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "Force_Screen_Lock": "ā¤Ŧā¤˛ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Force_Screen_Lock_After": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤ĢāĨ‹ā¤°āĨā¤¸ ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Force_Screen_Lock_After_description": "ā¤¨ā¤ĩāĨ€ā¤¨ā¤¤ā¤Ž ā¤¸ā¤¤āĨā¤° ā¤•āĨ€ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤¸ā¤Žā¤¯, ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚āĨ¤", + "Force_Screen_Lock_description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ā¤Ē ā¤•āĨ‹ ā¤…ā¤¨ā¤˛āĨ‰ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤ŋā¤¨/ā¤Ŧā¤žā¤¯āĨ‹ā¤ŽāĨ‡ā¤ŸāĨā¤°āĨ€/ā¤ĢāĨ‡ā¤¸ā¤†ā¤ˆā¤ĄāĨ€ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ŧā¤žā¤§āĨā¤¯ ā¤•ā¤°āĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Force_SSL": "ā¤ā¤¸ā¤ā¤¸ā¤ā¤˛ ā¤•āĨ‹ ā¤Ŧā¤žā¤§āĨā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "Force_SSL_Description": "*ā¤¸ā¤žā¤ĩā¤§ā¤žā¤¨!* _Force SSL_ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤­āĨ€ ā¤­āĨ€ ā¤°ā¤ŋā¤ĩā¤°āĨā¤¸ ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤°ā¤ŋā¤ĩā¤°āĨā¤¸ ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤†ā¤Ēā¤•āĨ‹ ā¤ĩā¤šā¤žā¤‚ ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤¯ā¤š ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤šāĨ‡ā¤°āĨ‹ā¤•āĨ‚ ā¤œāĨˆā¤¸āĨ‡ ā¤Ēā¤°ā¤ŋā¤¨ā¤ŋā¤¯āĨ‹ā¤œā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ, ā¤œāĨ‹ ā¤°ā¤ŋā¤ĩā¤°āĨā¤¸ ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤Ēā¤° ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Force_visitor_to_accept_data_processing_consent": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤•āĨ‹ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ā¤ŋā¤‚ā¤— ā¤¸ā¤šā¤Žā¤¤ā¤ŋ ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ŧā¤žā¤§āĨā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "Force_visitor_to_accept_data_processing_consent_description": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤šā¤Žā¤¤ā¤ŋ ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤šāĨˆā¤Ÿā¤ŋā¤‚ā¤— ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "Force_visitor_to_accept_data_processing_consent_enabled_alert": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ā¤ŋā¤‚ā¤— ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤Žā¤āĨŒā¤¤ā¤ž ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ā¤ŋā¤‚ā¤— ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ ā¤•āĨ€ ā¤Ēā¤žā¤°ā¤Ļā¤°āĨā¤ļāĨ€ ā¤¸ā¤Žā¤ ā¤Ēā¤° ā¤†ā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤‡ā¤¸ ā¤ĩā¤œā¤š ā¤¸āĨ‡, ā¤†ā¤Ēā¤•āĨ‹ ā¤¨āĨ€ā¤šāĨ‡ ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤­ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€ ā¤œāĨ‹ ā¤†ā¤Ēā¤•āĨ€ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ā¤•ā¤¤āĨā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ ā¤Ŧā¤¤ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•āĨ€ ā¤œā¤žā¤ā¤—āĨ€āĨ¤", + "force-delete-message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤Ŧā¤˛ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤šā¤Ÿā¤žā¤ā¤‚", + "force-delete-message_description": "ā¤¸ā¤­āĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§āĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ļā¤°ā¤•ā¤ŋā¤¨ā¤žā¤° ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨā¤ ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Font_size": "ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤†ā¤•ā¤žā¤°", + "Forgot_password": "ā¤…ā¤Ēā¤¨ā¤ž ā¤•āĨ‚ā¤Ÿ ā¤ļā¤ŦāĨā¤Ļ ā¤­āĨ‚ā¤˛ ā¤—ā¤?", + "Forgot_Password_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ā¤ŋ URL ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `[Forgot_Password_Url]`āĨ¤\n - `[ā¤¨ā¤žā¤Ž]`, `[fname]`, `[lname]` ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¨ā¤žā¤Ž, ā¤ĒāĨā¤°ā¤Ĩā¤Ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n - `[ā¤ˆā¤ŽāĨ‡ā¤˛]` ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n - ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[Site_Name]` ā¤”ā¤° `[Site_URL]`āĨ¤", + "Forgot_Password_Email": "ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Forgot_Password_Email_Subject": "[ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¨ā¤žā¤Ž] - ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ā¤ŋ", + "Forgot_password_section": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤­āĨ‚ā¤˛ ā¤—ā¤", + "Format": "ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē", + "Forward": "ā¤†ā¤—āĨ‡", + "Forward_chat": "ā¤šāĨˆā¤Ÿ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Forward_message": "ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Forward_to_department": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‹ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Forward_to_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Forwarding": "ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Free": "ā¤ŽāĨā¤•āĨā¤¤", + "Free_Extension_Numbers": "ā¤¨ā¤ŋā¤ƒā¤ļāĨā¤˛āĨā¤• ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤¨ā¤‚ā¤Ŧā¤°", + "Free_Apps": "ā¤ŽāĨā¤•āĨā¤¤ ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨āĨā¤¸", + "Frequently_Used": "ā¤Ŧā¤šāĨā¤§ā¤ž ā¤ĒāĨā¤°ā¤¯āĨā¤•āĨā¤¤", + "Friday": "ā¤ļāĨā¤•āĨā¤°ā¤ĩā¤žā¤°", + "From": "ā¤¸āĨ‡", + "From_Email": "ā¤ˆ - ā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‡", + "From_email_warning": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ : ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤†ā¤Ēā¤•āĨ€ ā¤ŽāĨ‡ā¤˛ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ‡ ā¤…ā¤§āĨ€ā¤¨ ā¤šāĨˆāĨ¤", + "Full_Name": "ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤žā¤Ž", + "Full_Screen": "ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨", + "Gaming": "ā¤œāĨā¤†", + "General": "ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯", + "General_Description": "ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚.", + "General_Settings": "ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸", + "Generate_new_key": "ā¤ā¤• ā¤¨ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€ ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Generate_New_Link": "ā¤¨ā¤¯ā¤ž ā¤˛ā¤ŋā¤‚ā¤• ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Generating_key": "ā¤•āĨā¤‚ā¤œāĨ€ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°ā¤¨ā¤ž", + "Copy_link": "ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛ā¤ŋā¤Ēā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "get-password-policy-forbidRepeatingCharacters": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤…ā¤•āĨā¤ˇā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¨āĨ‡ ā¤šā¤žā¤šā¤ŋā¤", + "get-password-policy-forbidRepeatingCharactersCount": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ {{forbidRepeatingCharactersCount}} ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ĩ ā¤ĩā¤žā¤˛āĨ‡ ā¤…ā¤•āĨā¤ˇā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¨āĨ‡ ā¤šā¤žā¤šā¤ŋā¤", + "get-password-policy-maxLength": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž {{maxLength}} ā¤…ā¤•āĨā¤ˇā¤° ā¤˛ā¤‚ā¤Ŧā¤ž ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "get-password-policy-minLength": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž {{minLength}} ā¤…ā¤•āĨā¤ˇā¤° ā¤˛ā¤‚ā¤Ŧā¤ž ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "get-password-policy-mustContainAtLeastOneLowercase": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤˛āĨ‹ā¤…ā¤°ā¤•āĨ‡ā¤¸ ā¤…ā¤•āĨā¤ˇā¤° ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "get-password-policy-mustContainAtLeastOneNumber": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤¨ā¤‚ā¤Ŧā¤° ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "get-password-policy-mustContainAtLeastOneSpecialCharacter": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ā¤…ā¤•āĨā¤ˇā¤° ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "get-password-policy-mustContainAtLeastOneUppercase": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤Ŧā¤Ąā¤ŧā¤ž ā¤…ā¤•āĨā¤ˇā¤° ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "get-password-policy-minLength-label": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž {{limit}} ā¤…ā¤•āĨā¤ˇā¤°", + "get-password-policy-maxLength-label": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž {{limit}} ā¤…ā¤•āĨā¤ˇā¤°", + "get-password-policy-forbidRepeatingCharactersCount-label": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž. {{limit}} ā¤ĻāĨ‹ā¤šā¤°ā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤…ā¤•āĨā¤ˇā¤°", + "get-password-policy-mustContainAtLeastOneLowercase-label": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤›āĨ‹ā¤Ÿā¤ž ā¤…ā¤•āĨā¤ˇā¤°", + "get-password-policy-mustContainAtLeastOneUppercase-label": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤Ŧā¤Ąā¤ŧā¤ž ā¤…ā¤•āĨā¤ˇā¤°", + "get-password-policy-mustContainAtLeastOneNumber-label": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤¨ā¤‚ā¤Ŧā¤°", + "get-password-policy-mustContainAtLeastOneSpecialCharacter-label": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•", + "get-server-info": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "get-server-info_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "github_no_public_email": "ā¤†ā¤Ēā¤•āĨ‡ GitHub ā¤–ā¤žā¤¤āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "github_HEAD": "ā¤¸ā¤ŋā¤°", + "Give_a_unique_name_for_the_custom_oauth": "ā¤•ā¤¸āĨā¤Ÿā¤Ž OAuth ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤¨ā¤žā¤Ž ā¤ĻāĨ‡ā¤‚", + "strike": "ā¤šā¤Ąā¤ŧā¤¤ā¤žā¤˛", + "Give_the_application_a_name_This_will_be_seen_by_your_users": "ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤•āĨ‹ ā¤ā¤• ā¤¨ā¤žā¤Ž ā¤ĻāĨ‡ā¤‚. ā¤¯ā¤š ā¤†ā¤Ēā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤—ā¤ž.", + "Global": "ā¤ĩāĨˆā¤ļāĨā¤ĩā¤ŋā¤•", + "Global Policy": "ā¤ĩāĨˆā¤ļāĨā¤ĩā¤ŋā¤• ā¤¨āĨ€ā¤¤ā¤ŋ", + "Global_purge_override_warning": "ā¤ā¤• ā¤ĩāĨˆā¤ļāĨā¤ĩā¤ŋā¤• ā¤…ā¤ĩā¤§ā¤žā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤˛ā¤žā¤—āĨ‚ ā¤šāĨˆāĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē \"ā¤“ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ą ā¤—āĨā¤˛āĨ‹ā¤Ŧā¤˛ ā¤°ā¤ŋā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤ĒāĨ‰ā¤˛ā¤ŋā¤¸āĨ€\" ā¤•āĨ‹ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤° ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤†ā¤Ē ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĩā¤šāĨ€ ā¤ĒāĨ‰ā¤˛ā¤ŋā¤¸āĨ€ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤œāĨ‹ ā¤—āĨā¤˛āĨ‹ā¤Ŧā¤˛ ā¤ĒāĨ‰ā¤˛ā¤ŋā¤¸āĨ€ ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤–āĨā¤¤ ā¤šāĨˆāĨ¤", + "Global_Search": "ā¤ĩāĨˆā¤ļāĨā¤ĩā¤ŋā¤• ā¤–āĨ‹ā¤œ", + "Go_to_your_workspace": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤Ēā¤° ā¤œā¤žā¤ā¤", + "Go_to_accessibility_and_appearance": "ā¤Ēā¤šāĨā¤‚ā¤š ā¤”ā¤° ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤Ēā¤° ā¤œā¤žā¤ā¤‚", + "Google_Meet_Premium_only": "Google ā¤ŽāĨ€ā¤Ÿ (ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž)", + "Google_Play": "ā¤—āĨ‚ā¤—ā¤˛ ā¤ĒāĨā¤˛āĨ‡", + "Hold_Call": "ā¤•āĨ‰ā¤˛ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Hold_Call_Premium_only": "ā¤•āĨ‰ā¤˛ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤•ā¤°āĨ‡ā¤‚ (ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ĒāĨā¤˛ā¤žā¤¨)", + "GoogleCloudStorage": "ā¤—āĨ‚ā¤—ā¤˛ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨā¤ŸāĨ‹ā¤°āĨ‡ā¤œ", + "GoogleNaturalLanguage_ServiceAccount_Description": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤•āĨā¤‚ā¤œāĨ€ JSON ā¤Ģā¤ŧā¤žā¤‡ā¤˛. ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ [ā¤¯ā¤šā¤žā¤‚] (https://cloud.google.com/ā¤ĒāĨā¤°ā¤žā¤•āĨƒā¤¤ā¤ŋā¤•-ā¤­ā¤žā¤ˇā¤ž/docs/common/auth#set_up_a_service_account) ā¤Ēā¤žā¤ˆ ā¤œā¤ž ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆ", + "GoogleTagManager_id": "Google ā¤ŸāĨˆā¤— ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤†ā¤ˆā¤ĄāĨ€", + "Got_it": "ā¤¸ā¤Žā¤ ā¤—ā¤¯ā¤ž", + "Government": "ā¤¸ā¤°ā¤•ā¤žā¤°", + "Grandfathered_app": "ā¤Ļā¤žā¤Ļā¤žā¤œāĨ€ ā¤ā¤Ē - ā¤ā¤Ē ā¤¸āĨ€ā¤Žā¤ž ā¤ŽāĨ‡ā¤‚ ā¤—ā¤ŋā¤¨ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤‡ā¤¸ ā¤ā¤Ē ā¤Ēā¤° ā¤¸āĨ€ā¤Žā¤ž ā¤˛ā¤žā¤—āĨ‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ", + "Graphql_CORS": "ā¤—āĨā¤°ā¤žā¤Ģā¤•āĨā¤¯āĨ‚ā¤ā¤˛ ā¤•āĨ‰ā¤°āĨā¤¸", + "Graphql_Enabled": "ā¤—āĨā¤°ā¤žā¤Ģā¤•āĨā¤¯āĨ‚ā¤ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Graphql_Subscription_Port": "ā¤—āĨā¤°ā¤žā¤Ģā¤•āĨā¤¯āĨ‚ā¤ā¤˛ ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤ĒāĨ‹ā¤°āĨā¤Ÿ", + "Grid_view": "ā¤œā¤žā¤˛ā¤• ā¤ĻāĨƒā¤ļāĨā¤¯", + "Snippet_Messages": "ā¤¸āĨā¤¨ā¤ŋā¤ĒāĨ‡ā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Group": "ā¤¸ā¤ŽāĨ‚ā¤š", + "Group_by": "ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Group_by_Type": "ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "snippet-message": "ā¤¸āĨā¤¨ā¤ŋā¤ĒāĨ‡ā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "snippet-message_description": "ā¤¸āĨā¤¨ā¤ŋā¤ĒāĨ‡ā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Group_discussions": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤šā¤°āĨā¤šā¤ž", + "Group_favorites": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ēā¤¸ā¤‚ā¤ĻāĨ€ā¤Ļā¤ž", + "Group_mentions_disabled_x_members": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤šāĨˆ ā¤•ā¤ŋ `@all` ā¤”ā¤° `@here` ā¤•āĨ‹ ā¤‰ā¤¨ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤œā¤ŋā¤¨ā¤ŽāĨ‡ā¤‚ {{total}} ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤šāĨˆā¤‚āĨ¤", + "Group_mentions_only": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤•ā¤ž ā¤•āĨ‡ā¤ĩā¤˛ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤šāĨˆ", + "Grouping": "ā¤¸ā¤ŽāĨ‚ā¤šā¤¨", + "Guest": "ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ", + "Hash": "ā¤šāĨˆā¤ļ", + "Header": "ā¤šāĨˆā¤Ąā¤°", + "Header_and_Footer": "ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤”ā¤° ā¤ĒāĨƒā¤ˇāĨā¤ ā¤žā¤‚ā¤•", + "Pharmaceutical": "ā¤Ģā¤žā¤°āĨā¤Žā¤žā¤¸āĨā¤¯āĨā¤Ÿā¤ŋā¤•ā¤˛", + "Healthcare": "ā¤¸āĨā¤ĩā¤žā¤¸āĨā¤ĨāĨā¤¯ ā¤ĻāĨ‡ā¤–ā¤­ā¤žā¤˛", + "Helpers": "ā¤¸ā¤šā¤žā¤¯ā¤•āĨ‹ā¤‚", + "Here_is_your_authentication_code": "ā¤¯ā¤šā¤žā¤‚ ā¤†ā¤Ēā¤•ā¤ž ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ā¤Ą ā¤šāĨˆ:", + "Hex_Color_Preview": "ā¤šāĨ‡ā¤•āĨā¤¸ ā¤°ā¤‚ā¤— ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨", + "Hi": "ā¤¨ā¤Žā¤¸āĨā¤¤āĨ‡", + "Hi_username": "ā¤¨ā¤Žā¤¸āĨā¤¤āĨ‡ [ā¤¨ā¤žā¤Ž]", + "Hidden": "ā¤›ā¤ŋā¤Ēā¤ž ā¤šāĨā¤†", + "Hide": "ā¤›ā¤ŋā¤Ēā¤žā¤¨ā¤ž", + "Hide_counter": "ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤° ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "Hide_flextab": "ā¤ĒāĨā¤°ā¤žā¤¸ā¤‚ā¤—ā¤ŋā¤• ā¤Ŧā¤žā¤° ā¤•āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°ā¤•āĨ‡ ā¤‰ā¤¸āĨ‡ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Hide_Group_Warning": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤¸ā¤ŽāĨ‚ā¤š \"%s\" ā¤•āĨ‹ ā¤›ā¤ŋā¤Ēā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Hide_Livechat_Warning": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ \"%s\" ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šāĨˆā¤Ÿ ā¤›ā¤ŋā¤Ēā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Hide_On_Workspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤Ēā¤° ā¤›āĨā¤ĒāĨ‡ā¤‚", + "Hide_Private_Warning": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ \"%s\" ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šā¤°āĨā¤šā¤ž ā¤›ā¤ŋā¤Ēā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Hide_roles": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Hide_room": "ā¤›ā¤ŋā¤Ēā¤žā¤¨ā¤ž", + "Hide_Room_Warning": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤šāĨˆā¤¨ā¤˛ \"%s\" ā¤•āĨ‹ ā¤›ā¤ŋā¤Ēā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Hide_System_Messages": "ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Hide_Unread_Room_Status": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Hide_usernames": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Hide_video": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "High": "ā¤‰ā¤šāĨā¤š", + "Highest": "ā¤‰ā¤šāĨā¤šā¤¤ā¤Ž", + "Highlights": "ā¤šā¤žā¤‡ā¤˛ā¤žā¤‡ā¤Ÿ", + "Highlights_How_To": "ā¤œā¤Ŧ ā¤•āĨ‹ā¤ˆ ā¤•ā¤ŋā¤¸āĨ€ ā¤ļā¤ŦāĨā¤Ļ ā¤¯ā¤ž ā¤ĩā¤žā¤•āĨā¤¯ā¤žā¤‚ā¤ļ ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤‰ā¤¸āĨ‡ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤¸āĨ‡ ā¤¯ā¤šā¤žā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤ ā¤†ā¤Ē ā¤ļā¤ŦāĨā¤ĻāĨ‹ā¤‚ ā¤¯ā¤ž ā¤ĩā¤žā¤•āĨā¤¯ā¤žā¤‚ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤šā¤žā¤‡ā¤˛ā¤žā¤‡ā¤Ÿ ā¤ļā¤ŦāĨā¤Ļ ā¤•āĨ‡ā¤¸ ā¤¸ā¤‚ā¤ĩāĨ‡ā¤ĻāĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤āĨ‡.", + "Highlights_List": "ā¤ļā¤ŦāĨā¤ĻāĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤žā¤‡ā¤˛ā¤žā¤‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "History": "ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸", + "Hold_Time": "ā¤¸ā¤Žā¤¯ ā¤Ēā¤•ā¤Ąā¤ŧ", + "Hold": "ā¤Ēā¤•ā¤Ąā¤ŧā¤¨ā¤ž", + "Hold_Premium_only": "ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤•ā¤°āĨ‡ā¤‚ (ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤ā¤‚)", "Home": "ā¤šāĨ‹ā¤Ž", + "Homepage": "ā¤ŽāĨā¤–ā¤ĒāĨƒā¤ˇāĨā¤ ", + "Homepage_Custom_Content_Default_Message": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤‡ā¤¸ ā¤¸ā¤Ģā¤ŧāĨ‡ā¤Ļ ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤¸āĨā¤¤āĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ html ā¤¸ā¤ŽāĨā¤Žā¤ŋā¤˛ā¤ŋā¤¤ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Host": "ā¤ŽāĨ‡ā¤œā¤ŧā¤Ŧā¤žā¤¨", + "Hospitality_Businness": "ā¤–ā¤žā¤¤ā¤ŋā¤°ā¤Ļā¤žā¤°āĨ€ ā¤•ā¤ž ā¤ĩāĨā¤¯ā¤ĩā¤¸ā¤žā¤¯", + "hours": "ā¤˜ā¤‚ā¤ŸāĨ‡", + "Hours": "ā¤˜ā¤‚ā¤ŸāĨ‡", + "How_and_why_we_collect_usage_data": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•āĨˆā¤¸āĨ‡ ā¤”ā¤° ā¤•āĨā¤¯āĨ‹ā¤‚ ā¤ā¤•ā¤¤āĨā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ", "How_friendly_was_the_chat_agent": "ā¤šāĨˆā¤Ÿ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•ā¤ŋā¤¤ā¤¨ā¤ž ā¤ĻāĨ‹ā¤¸āĨā¤¤ā¤žā¤¨ā¤ž ā¤Ĩā¤ž?", "How_knowledgeable_was_the_chat_agent": "ā¤šāĨˆā¤Ÿ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•ā¤ŋā¤¤ā¤¨ā¤ž ā¤œā¤žā¤¨ā¤•ā¤žā¤° ā¤Ĩā¤ž?", + "How_long_to_wait_after_agent_goes_offline": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‡ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨ‹ ā¤œā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤•ā¤ŋā¤¤ā¤¨āĨ€ ā¤ĻāĨ‡ā¤° ā¤¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€", + "How_long_to_wait_to_consider_visitor_abandonment": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤Ēā¤°ā¤ŋā¤¤āĨā¤¯ā¤žā¤— ā¤Ēā¤° ā¤ĩā¤ŋā¤šā¤žā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤Ŧ ā¤¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€?", + "How_long_to_wait_to_consider_visitor_abandonment_in_seconds": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤Ēā¤°ā¤ŋā¤¤āĨā¤¯ā¤žā¤— ā¤Ēā¤° ā¤ĩā¤ŋā¤šā¤žā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤Ŧ ā¤¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€?", "How_responsive_was_the_chat_agent": "ā¤šāĨˆā¤Ÿ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•ā¤ŋā¤¤ā¤¨ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤°ā¤Ļā¤žā¤¯āĨ€ ā¤Ĩā¤ž?", "How_satisfied_were_you_with_this_chat": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤Ÿ ā¤¸āĨ‡ ā¤•ā¤ŋā¤¤ā¤¨āĨ‡ ā¤¸ā¤‚ā¤¤āĨā¤ˇāĨā¤Ÿ ā¤ĨāĨ‡?", + "How_to_handle_open_sessions_when_agent_goes_offline": "ā¤œā¤Ŧ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨ‹ ā¤œā¤žā¤ ā¤¤āĨ‹ ā¤–āĨā¤˛āĨ‡ ā¤¸ā¤¤āĨā¤° ā¤•āĨ‹ ā¤•āĨˆā¤¸āĨ‡ ā¤¸ā¤‚ā¤­ā¤žā¤˛āĨ‡ā¤‚", + "Http_timeout": "HTTP ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ (ā¤Žā¤ŋā¤˛āĨ€ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚)", + "Http_timeout_value": "5000", + "HTML": "ā¤ā¤šā¤ŸāĨ€ā¤ā¤Žā¤ā¤˛", + "Icon": "ā¤†ā¤‡ā¤•ā¤¨", + "I_Saved_My_Password": "ā¤ŽāĨˆā¤‚ā¤¨āĨ‡ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤šāĨ‡ā¤œ ā¤˛ā¤ŋā¤¯ā¤ž", + "Idle_Time_Limit": "ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤Žā¤¯ ā¤¸āĨ€ā¤Žā¤ž", + "Idle_Time_Limit_Description": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤¤ā¤• ā¤•āĨ€ ā¤¸ā¤Žā¤¯ā¤žā¤ĩā¤§ā¤ŋāĨ¤ ā¤Žā¤žā¤¨ ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤.", + "if_they_are_from": "(ā¤¯ā¤Ļā¤ŋ ā¤ĩāĨ‡ %s ā¤¸āĨ‡ ā¤šāĨˆā¤‚)", + "If_this_email_is_registered": "ā¤¯ā¤Ļā¤ŋ ā¤¯ā¤š ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤šā¤Ž ā¤†ā¤Ēā¤•ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤¤ā¤°āĨ€ā¤•āĨ‡ ā¤Ēā¤° ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚ā¤—āĨ‡āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‹ ā¤ļāĨ€ā¤˜āĨā¤° ā¤šāĨ€ ā¤•āĨ‹ā¤ˆ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĩā¤žā¤Ēā¤¸ ā¤†ā¤ā¤‚ ā¤”ā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "If_you_didnt_ask_for_reset_ignore_this_email": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤¨āĨ‡ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤šā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‹ ā¤…ā¤¨ā¤ĻāĨ‡ā¤–ā¤ž ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "If_you_didnt_try_to_login_in_your_account_please_ignore_this_email": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤¨āĨ‡ ā¤…ā¤Ēā¤¨āĨ‡ ā¤–ā¤žā¤¤āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤‡ā¤¸ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‹ ā¤…ā¤¨ā¤ĻāĨ‡ā¤–ā¤ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Iframe_Integration": "ā¤†ā¤ˆā¤ĢāĨā¤°āĨ‡ā¤Ž ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Iframe_Integration_receive_enable": "ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Iframe_Integration_receive_enable_Description": "ā¤ŽāĨ‚ā¤˛ ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹ ā¤•āĨ‹ Rocket.Chat ā¤Ēā¤° ā¤†ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚āĨ¤", + "Iframe_Integration_receive_origin": "ā¤ŽāĨ‚ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Iframe_Integration_receive_origin_Description": "ā¤ĒāĨā¤°āĨ‹ā¤ŸāĨ‹ā¤•āĨ‰ā¤˛ ā¤‰ā¤Ēā¤¸ā¤°āĨā¤— ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ŽāĨ‚ā¤˛, ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤˛ā¤— ā¤•ā¤ŋā¤ ā¤—ā¤, ā¤œā¤ŋā¤¨āĨā¤šāĨ‡ā¤‚ ā¤†ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ ā¤œāĨˆā¤¸āĨ‡āĨ¤ ā¤•ā¤šāĨ€ā¤‚ ā¤¸āĨ‡ ā¤­āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `https://localhost, http://localhost`, ā¤¯ā¤ž *āĨ¤", + "Iframe_Integration_send_enable": "ā¤­āĨ‡ā¤œāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Iframe_Integration_send_enable_Description": "ā¤ˆā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤ŽāĨ‚ā¤˛ ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹ ā¤Ēā¤° ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Iframe_Integration_send_target_origin": "ā¤˛ā¤•āĨā¤ˇāĨā¤¯ ā¤‰ā¤¤āĨā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Iframe_Integration_send_target_origin_Description": "ā¤ĒāĨā¤°āĨ‹ā¤ŸāĨ‹ā¤•āĨ‰ā¤˛ ā¤‰ā¤Ēā¤¸ā¤°āĨā¤— ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤‰ā¤¤āĨā¤Ēā¤¤āĨā¤¤ā¤ŋ, ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨŒā¤¨ ā¤¸āĨ‡ ā¤†ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ `https://localhost`, ā¤¯ā¤ž * ā¤•ā¤šāĨ€ā¤‚ ā¤­āĨ€ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤", + "Iframe_Restrict_Access": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ Iframe ā¤•āĨ‡ ā¤…ā¤‚ā¤Ļā¤° ā¤Ēā¤šāĨā¤‚ā¤š ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Iframe_Restrict_Access_Description": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤†ā¤ˆā¤ĢāĨā¤°āĨ‡ā¤Ž ā¤•āĨ‡ ā¤…ā¤‚ā¤Ļā¤° ā¤†ā¤°ā¤¸āĨ€ ā¤•āĨ‹ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž/ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆ", + "Iframe_X_Frame_Options": "ā¤ā¤•āĨā¤¸-ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤Ž-ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•āĨ‡ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē", + "Iframe_X_Frame_Options_Description": "ā¤ā¤•āĨā¤¸-ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤Ž-ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•āĨ‡ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤ĒāĨ¤ [ā¤†ā¤Ē ā¤¯ā¤šā¤žā¤‚ ā¤¸ā¤­āĨ€ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤ĻāĨ‡ā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options#Syntax)", + "Ignore": "ā¤…ā¤¨ā¤ĻāĨ‡ā¤–ā¤ž ā¤•ā¤°ā¤¨ā¤ž", + "Ignored": "ā¤…ā¤ĩā¤šāĨ‡ā¤˛ā¤¨ā¤ž ā¤•ā¤°ā¤¨ā¤ž", + "Ignore_Two_Factor_Authentication": "ā¤ŸāĨ‚ ā¤ĢāĨˆā¤•āĨā¤Ÿā¤° ā¤‘ā¤ĨāĨ‡ā¤‚ā¤Ÿā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤•āĨ‹ ā¤¨ā¤œā¤°ā¤…ā¤‚ā¤Ļā¤žā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Images": "ā¤‡ā¤ŽāĨ‡ā¤œā¤ŋā¤¸", + "IMAP_intercepter_already_running": "IMAP ā¤‡ā¤‚ā¤Ÿā¤°ā¤¸āĨ‡ā¤ĒāĨā¤Ÿā¤° ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤šā¤˛ ā¤°ā¤šā¤ž ā¤šāĨˆ", + "IMAP_intercepter_Not_running": "IMAP ā¤‡ā¤‚ā¤Ÿā¤°ā¤¸āĨ‡ā¤ĒāĨā¤Ÿā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šā¤˛ ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Impersonate_next_agent_from_queue": "ā¤•ā¤¤ā¤žā¤° ā¤¸āĨ‡ ā¤…ā¤—ā¤˛āĨ‡ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤°āĨ‚ā¤Ēā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "Impersonate_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤°āĨ‚ā¤Ēā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "Impersonate_user_description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤‰ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤¨āĨ‡ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ", + "Import": "ā¤†ā¤¯ā¤žā¤¤", + "Import_New_File": "ā¤¨ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Import_requested_successfully": "ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤ž ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Import_Type": "ā¤†ā¤¯ā¤žā¤¤ ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "Importer_Archived": "ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤", + "Importer_CSV_Information": "CSV ā¤†ā¤¯ā¤žā¤¤ā¤• ā¤•āĨ‹ ā¤ā¤• ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ€ ā¤œā¤ŧā¤ŋā¤Ē ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•āĨ€ ā¤¸ā¤‚ā¤°ā¤šā¤¨ā¤ž ā¤•āĨˆā¤¸āĨ‡ ā¤•ā¤°āĨ‡ā¤‚, ā¤‡ā¤¸ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚:", + "Importer_done": "ā¤†ā¤¯ā¤žā¤¤ ā¤ĒāĨ‚ā¤°ā¤ž ā¤šāĨ‹ ā¤—ā¤¯ā¤ž!", + "Importer_ExternalUrl_Description": "ā¤†ā¤Ē ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ēā¤šāĨā¤‚ā¤š ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ URL ā¤•ā¤ž ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:", + "Importer_finishing": "ā¤†ā¤¯ā¤žā¤¤ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨ā¤ž.", + "Importer_From_Description": "Rocket.Chat ā¤ŽāĨ‡ā¤‚ {{from}} ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Importer_From_Description_CSV": "Rocket.Chat ā¤ŽāĨ‡ā¤‚ CSV ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ā¤• ā¤œā¤ŧā¤ŋā¤Ē ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šāĨ‹ā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤.", + "Importer_HipChatEnterprise_BetaWarning": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤§āĨā¤¯ā¤žā¤¨ ā¤°ā¤–āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤‡ā¤¸ ā¤†ā¤¯ā¤žā¤¤ ā¤Ēā¤° ā¤…ā¤­āĨ€ ā¤­āĨ€ ā¤•ā¤žā¤Ž ā¤šā¤˛ ā¤°ā¤šā¤ž ā¤šāĨˆ, ā¤•āĨƒā¤Ēā¤¯ā¤ž GitHub ā¤ŽāĨ‡ā¤‚ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤•āĨ€ ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚:", + "Importer_HipChatEnterprise_Information": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ąā¤ŋā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą tar.gz ā¤šāĨ‹ā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚:", + "Importer_import_cancelled": "ā¤†ā¤¯ā¤žā¤¤ ā¤°ā¤ĻāĨā¤Ļ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž.", + "Importer_import_failed": "ā¤†ā¤¯ā¤žā¤¤ ā¤šā¤˛ā¤žā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ā¤• ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤šāĨā¤ˆ.", + "Importer_importing_channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž.", + "Importer_importing_files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž.", + "Importer_importing_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž.", + "Importer_importing_started": "ā¤†ā¤¯ā¤žā¤¤ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨ā¤ž.", + "Importer_importing_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž.", + "Importer_not_in_progress": "ā¤†ā¤¯ā¤žā¤¤ā¤• ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤šā¤˛ ā¤°ā¤šā¤ž ā¤šāĨˆ.", + "Importer_not_setup": "ā¤†ā¤¯ā¤žā¤¤ā¤• ā¤¸ā¤šāĨ€ ā¤ĸā¤‚ā¤— ā¤¸āĨ‡ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤‰ā¤¸ā¤¨āĨ‡ ā¤•āĨ‹ā¤ˆ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤˛āĨŒā¤Ÿā¤žā¤¯ā¤žāĨ¤", + "Importer_Prepare_Restart_Import": "ā¤†ā¤¯ā¤žā¤¤ ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Importer_Prepare_Start_Import": "ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Importer_Prepare_Uncheck_Archived_Channels": "ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤šāĨˆā¤¨ā¤˛ ā¤…ā¤¨ā¤šāĨ‡ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Importer_Prepare_Uncheck_Deleted_Users": "ā¤šā¤Ÿā¤žā¤ ā¤—ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤¨ā¤šāĨ‡ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Importer_progress_error": "ā¤†ā¤¯ā¤žā¤¤ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°ā¤—ā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛.", + "Importer_setup_error": "ā¤†ā¤¯ā¤žā¤¤ā¤• ā¤•āĨ‹ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ā¤• ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤šāĨā¤ˆ.", + "Importer_Slack_Users_CSV_Information": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸āĨā¤˛āĨˆā¤• ā¤•āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šāĨ‹ā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤, ā¤œāĨ‹ ā¤ā¤• CSV ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šāĨˆāĨ¤ ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚:", + "Importer_Source_File": "ā¤¸āĨā¤°āĨ‹ā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šā¤¯ā¤¨", + "importer_status_done": "ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤ĒāĨ‚ā¤°ā¤ž", + "importer_status_downloading_file": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "importer_status_file_loaded": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ", + "importer_status_finishing": "ā¤˛ā¤—ā¤­ā¤— ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "importer_status_import_cancelled": "ā¤°ā¤ĻāĨā¤Ļ", + "importer_status_import_failed": "ā¤—ā¤˛ā¤¤āĨ€", + "importer_status_importing_channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "importer_status_importing_files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "importer_status_importing_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "importer_status_importing_started": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "importer_status_importing_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "importer_status_new": "ā¤ļāĨā¤°āĨ‚ ā¤¨ā¤šāĨ€ā¤‚", + "importer_status_preparing_channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨ā¤ž", + "importer_status_preparing_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤Ēā¤ĸā¤ŧā¤¨ā¤ž", + "importer_status_preparing_started": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤Ēā¤ĸā¤ŧā¤¨ā¤ž", + "importer_status_preparing_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨ā¤ž", + "importer_status_uploading": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "importer_status_user_selection": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨˆ ā¤¯ā¤š ā¤šāĨā¤¨ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤šāĨˆā¤‚", + "Importer_Upload_FileSize_Message": "ā¤†ā¤Ēā¤•āĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ {{maxFileSize}} ā¤¤ā¤• ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤†ā¤•ā¤žā¤° ā¤•āĨ€ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "Importer_Upload_Unlimited_FileSize": "ā¤†ā¤Ēā¤•āĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤†ā¤•ā¤žā¤° ā¤•āĨ€ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "Importing_channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Importing_Data": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Importing_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Importing_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Inactivity_Time": "ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ā¤¤ā¤ž ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "In_progress": "ā¤ĒāĨā¤°ā¤—ā¤¤ā¤ŋ ā¤Ēā¤° ā¤šāĨˆ", + "inbound-voip-calls": "ā¤‡ā¤¨ā¤Ŧā¤žā¤‰ā¤‚ā¤Ą ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‰ā¤˛", + "inbound-voip-calls_description": "ā¤‡ā¤¨ā¤Ŧā¤žā¤‰ā¤‚ā¤Ą ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‰ā¤˛ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Inbox_Info": "ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Include_Offline_Agents": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "Inclusive": "ā¤¸ā¤šā¤ŋā¤¤", + "Incoming": "ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€", + "Incoming_call_from": "ā¤¸āĨ‡ ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤•āĨ‰ā¤˛", + "Incoming_Livechats": "ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋā¤Ŧā¤ĻāĨā¤§ ā¤šāĨˆā¤Ÿ", + "Incoming_WebHook": "ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤•", + "Industry": "ā¤‰ā¤ĻāĨā¤¯āĨ‹ā¤—", + "Info": "ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "initials_avatar": "ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ā¤ŋā¤• ā¤…ā¤ĩā¤¤ā¤žā¤°", + "Inline_code": "ā¤‡ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤•āĨ‹ā¤Ą", + "Install": "ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Install_anyway": "ā¤Ģā¤ŋā¤° ā¤­āĨ€ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "Install_Extension": "ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "Install_FxOs": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ģā¤ŧā¤žā¤¯ā¤°ā¤Ģā¤ŧāĨ‰ā¤•āĨā¤¸ ā¤Ēā¤° Rocket.Chat ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "Install_FxOs_done": "ā¤Žā¤šā¤žā¤¨! ā¤…ā¤Ŧ ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤šāĨ‹ā¤Žā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤Ēā¤° ā¤†ā¤‡ā¤•ā¤¨ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ Rocket.Chat ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤†ā¤¨ā¤‚ā¤Ļ ā¤˛āĨ‡ā¤‚!", + "Install_FxOs_error": "ā¤•āĨā¤ˇā¤Žā¤ž ā¤•ā¤°āĨ‡ā¤‚, ā¤¯ā¤š ā¤‡ā¤šāĨā¤›ā¤žā¤¨āĨā¤¸ā¤žā¤° ā¤•ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž! ā¤¨ā¤ŋā¤ŽāĨā¤¨ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ€:", + "Install_FxOs_follow_instructions": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ēā¤° ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛āĨ‡ā¤ļā¤¨ ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚ (ā¤¸ā¤‚ā¤•āĨ‡ā¤¤ ā¤Žā¤ŋā¤˛ā¤¨āĨ‡ ā¤Ēā¤° \"ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚\" ā¤Ļā¤Ŧā¤žā¤ā¤‚)āĨ¤", + "Installing": "ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Install_package": "ā¤ĒāĨˆā¤•āĨ‡ā¤œ ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°āĨ‡", "Installation": "ā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨ā¤ž", + "Installed": "ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤", + "Installed_at": "ā¤Ēā¤° ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Instance": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ", + "Instances": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ", + "Instances_health": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤¸āĨā¤ĩā¤žā¤¸āĨā¤ĨāĨā¤¯", + "Instance_Record": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤°ā¤ŋā¤•ā¤žā¤°āĨā¤Ą", + "Instructions": "ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļ", + "Instructions_to_your_visitor_fill_the_form_to_send_a_message": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤•āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤Ž ā¤­ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļ", + "Insert_Contact_Name": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¨ā¤žā¤Ž ā¤Ąā¤žā¤˛āĨ‡ā¤‚", + "Insert_Placeholder": "ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤° ā¤Ąā¤žā¤˛āĨ‡ā¤‚", + "Install_rocket_chat_on_your_preferred_desktop_platform": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ēā¤¸ā¤‚ā¤ĻāĨ€ā¤Ļā¤ž ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤ĒāĨā¤˛āĨ‡ā¤Ÿā¤Ģā¤ŧāĨ‰ā¤°āĨā¤Ž ā¤Ēā¤° Rocket.Chat ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Insurance": "ā¤ŦāĨ€ā¤Žā¤ž", + "Integration_added": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Integration_Advanced_Settings": "ā¤ā¤Ąā¤ĩā¤žā¤‚ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—", + "Integration_Delete_Warning": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž.", + "Integration_disabled": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Integration_History_Cleared": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Integration_Incoming_WebHook": "ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Integration_New": "ā¤¨ā¤¯ā¤ž ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "integration-scripts-disabled": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚", + "integration-scripts-isolated-vm-disabled": "\"ā¤¸ā¤ŋā¤•āĨā¤¯āĨ‹ā¤° ā¤¸āĨˆā¤‚ā¤Ąā¤ŦāĨ‰ā¤•āĨā¤¸\" ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ā¤ˆ ā¤¯ā¤ž ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤Ēā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "integration-scripts-vm2-disabled": "\"ā¤¸ā¤‚ā¤—ā¤¤ ā¤¸āĨˆā¤‚ā¤Ąā¤ŦāĨ‰ā¤•āĨā¤¸\" ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ā¤ˆ ā¤¯ā¤ž ā¤¸ā¤‚ā¤ļāĨ‹ā¤§ā¤ŋā¤¤ ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤Ēā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Integration_Outgoing_WebHook": "ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Integration_Outgoing_WebHook_History": "ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸", + "Integration_Outgoing_WebHook_History_Data_Passed_To_Trigger": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Integration_Outgoing_WebHook_History_Data_Passed_To_URL": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‹ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž", + "Integration_Outgoing_WebHook_History_Error_Stacktrace": "ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤¸āĨā¤ŸāĨˆā¤•ā¤ŸāĨā¤°āĨ‡ā¤¸", + "Integration_Outgoing_WebHook_History_Http_Response": "HTTP ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž", + "Integration_Outgoing_WebHook_History_Http_Response_Error": "HTTP ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "Integration_Outgoing_WebHook_History_Messages_Sent_From_Prepare_Script": "ā¤¤āĨˆā¤¯ā¤žā¤°āĨ€ ā¤šā¤°ā¤Ŗ ā¤¸āĨ‡ ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Integration_Outgoing_WebHook_History_Messages_Sent_From_Process_Script": "ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤šā¤°ā¤Ŗ ā¤¸āĨ‡ ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Integration_Outgoing_WebHook_History_Time_Ended_Or_Error": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¯ā¤ž ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "Integration_Outgoing_WebHook_History_Time_Triggered": "ā¤¸ā¤Žā¤¯ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤šāĨā¤†", + "Integration_Outgoing_WebHook_History_Trigger_Step": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤šā¤°ā¤Ŗ", + "Integration_Outgoing_WebHook_No_History": "ā¤‡ā¤¸ ā¤¨ā¤ŋā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤ž ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤Ļā¤°āĨā¤œ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "Integration_Retry_Count": "count ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Integration_Retry_Count_Description": "ā¤¯ā¤Ļā¤ŋ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Ēā¤° ā¤•āĨ‰ā¤˛ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤šāĨ‹ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ ā¤¤āĨ‹ ā¤•ā¤ŋā¤¤ā¤¨āĨ€ ā¤Ŧā¤žā¤° ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤?", + "Integration_Retry_Delay": "ā¤ĩā¤ŋā¤˛ā¤‚ā¤Ŧ ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Integration_Retry_Delay_Description": "ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤ŋā¤¸ ā¤ĩā¤ŋā¤˛ā¤‚ā¤Ŧ ā¤ā¤˛āĨā¤—āĨ‹ā¤°ā¤ŋā¤Ļā¤Ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤? 10 ^ x ā¤¯ā¤ž 2 ^ x ā¤¯ā¤ž x * 2", + "Integration_Retry_Failed_Url_Calls": "ā¤ĩā¤ŋā¤Ģā¤˛ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Integration_Retry_Failed_Url_Calls_Description": "ā¤¯ā¤Ļā¤ŋ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Ēā¤° ā¤•āĨ‰ā¤˛ ā¤†ā¤‰ā¤Ÿ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤°ā¤šā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤•āĨā¤¯ā¤ž ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ ā¤‰ā¤šā¤ŋā¤¤ ā¤¸ā¤Žā¤¯ ā¤¤ā¤• ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤?", + "Integration_Run_When_Message_Is_Edited": "ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨āĨ‹ā¤‚ ā¤Ēā¤° ā¤šā¤˛ā¤žā¤ā¤", + "Integration_Run_When_Message_Is_Edited_Description": "ā¤•āĨā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤šā¤˛ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤? ā¤‡ā¤¸āĨ‡ ā¤—ā¤˛ā¤¤ ā¤Ēā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ā¤ĩā¤˛ **ā¤¨ā¤** ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤šā¤˛āĨ‡ā¤—ā¤žāĨ¤", + "Integration_updated": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "Integration_Word_Trigger_Placement": "ā¤•ā¤šāĨ€ā¤‚ ā¤­āĨ€ ā¤ļā¤ŦāĨā¤Ļ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤ŽāĨ‡ā¤‚ā¤Ÿ", + "Integration_Word_Trigger_Placement_Description": "ā¤•āĨā¤¯ā¤ž ā¤ļāĨā¤°āĨā¤†ā¤¤ ā¤•āĨ‡ ā¤…ā¤˛ā¤žā¤ĩā¤ž ā¤ĩā¤žā¤•āĨā¤¯ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤šāĨ€ā¤‚ ā¤­āĨ€ ā¤°ā¤–āĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤Ēā¤° ā¤ļā¤ŦāĨā¤Ļ ā¤•āĨ‹ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤?", + "Integrations": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Integrations_for_all_channels": "ā¤¸ā¤­āĨ€ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤Ēā¤° ā¤¸āĨā¤¨ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ all_public_channels , ā¤¸ā¤­āĨ€ ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤Ēā¤° ā¤¸āĨā¤¨ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ all_private_groups , ā¤”ā¤° ā¤¸ā¤­āĨ€ ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤¨ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ all_direct_messages ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Integrations_Outgoing_Type_FileUploaded": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ", + "Integrations_Outgoing_Type_RoomArchived": "ā¤•ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤", + "Integrations_Outgoing_Type_RoomCreated": "ā¤•ā¤•āĨā¤ˇ ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž (ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤”ā¤° ā¤¨ā¤ŋā¤œāĨ€)", + "Integrations_Outgoing_Type_RoomJoined": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤ž ā¤•ā¤•āĨā¤ˇ", + "Integrations_Outgoing_Type_RoomLeft": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ŧā¤žā¤¯ā¤žā¤‚ ā¤•ā¤Žā¤°ā¤ž", + "Integrations_Outgoing_Type_SendMessage": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž", + "Integrations_Outgoing_Type_UserCreated": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "InternalHubot": "ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤§ā¤žā¤°āĨ€ā¤Ļā¤žā¤°", + "InternalHubot_EnableForChannels": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "InternalHubot_EnableForDirectMessages": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "InternalHubot_EnableForPrivateGroups": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "InternalHubot_PathToLoadCustomScripts": "ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤°", + "InternalHubot_reload": "ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤ĒāĨā¤¨ā¤ƒ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "InternalHubot_ScriptsToLoad": "ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ", + "InternalHubot_ScriptsToLoad_Description": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤¸āĨ‡ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "InternalHubot_Username_Description": "ā¤¯ā¤š ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤ŦāĨ‰ā¤Ÿ ā¤•ā¤ž ā¤ĩāĨˆā¤§ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤", + "Invalid Canned Response": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž", + "Invalid_confirm_pass": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸āĨ‡ ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤ā¤ž", + "Invalid_Department": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĩā¤ŋā¤­ā¤žā¤—", + "Invalid_email": "ā¤Ļā¤°āĨā¤œ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆ", + "Invalid_Export_File": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĩāĨˆā¤§ %s ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ.", + "Invalid_field": "ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤–ā¤ŧā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤", + "Invalid_Import_File_Type": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤†ā¤¯ā¤žā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĒāĨā¤°ā¤•ā¤žā¤°.", + "Invalid_name": "ā¤¨ā¤žā¤Ž ā¤–ā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "Invalid_notification_setting_s": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—: %s", + "Invalid_OAuth_client": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ OAuth ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ", + "Invalid_or_expired_invite_token": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¯ā¤ž ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤ŸāĨ‹ā¤•ā¤¨", + "Invalid_pass": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤–ā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "Invalid_password": "ā¤…ā¤ĩāĨˆā¤§ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "Invalid_reason": "ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•ā¤ž ā¤•ā¤žā¤°ā¤Ŗ ā¤–ā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "Invalid_room_name": "%s ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Invalid_secret_URL_message": "ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆ.", + "Invalid_setting_s": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—: %s", + "Invalid_two_factor_code": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• ā¤•āĨ‹ā¤Ą", + "Invalid_username": "ā¤Ļā¤°āĨā¤œ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆ", + "invisible": "ā¤…ā¤ĻāĨƒā¤ļāĨā¤¯", + "Invisible": "ā¤…ā¤ĻāĨƒā¤ļāĨā¤¯", + "Invitation": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ", + "Invitation_Email_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ā¤•ā¤°āĨā¤¤ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `[ā¤ˆā¤ŽāĨ‡ā¤˛]`āĨ¤\n - ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[Site_Name]` ā¤”ā¤° `[Site_URL]`āĨ¤", + "Invitation_HTML": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ HTML", + "Invitation_HTML_Default": "

    ā¤†ā¤Ēā¤•āĨ‹ [Site_Name] ā¤Ēā¤° ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ

    [Site_URL] ā¤Ēā¤° ā¤œā¤žā¤ā¤ ā¤”ā¤° ā¤†ā¤œ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¸ā¤°āĨā¤ĩāĨ‹ā¤¤āĨā¤¤ā¤Ž ā¤“ā¤Ēā¤¨ ā¤¸āĨ‹ā¤°āĨā¤¸ ā¤šāĨˆā¤Ÿ ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨ ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤!

    ", + "Invitation_Subject": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤ĩā¤ŋā¤ˇā¤¯", + "Invitation_Subject_Default": "ā¤†ā¤Ēā¤•āĨ‹ [Site_Name] ā¤Ēā¤° ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Invite": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Invites": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ", + "Invite_and_add_members_to_this_workspace_to_start_communicating": "ā¤¸ā¤‚ā¤šā¤žā¤° ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", + "Invite_Link": "ā¤˛ā¤ŋā¤‚ā¤• ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "link": "ā¤œāĨ‹ā¤Ąā¤ŧā¤¨ā¤ž", + "Invite_link_generated": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Invite_removed": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Invite_user_to_join_channel": "ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Invite_user_to_join_channel_all_from": "ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ [#ā¤šāĨˆā¤¨ā¤˛] ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Invite_user_to_join_channel_all_to": "ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ [#ā¤šāĨˆā¤¨ā¤˛] ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Invite_Users": "ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‹", + "IP": "ā¤†ā¤ˆ ā¤ĒāĨ€", + "IP_Address": "ā¤†ā¤ˆā¤ĒāĨ€ ā¤Ēā¤¤ā¤ž", + "IRC_Channel_Join": "JOIN ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤•ā¤ž ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤ŸāĨ¤", + "IRC_Channel_Leave": "ā¤Ēā¤žā¤°āĨā¤Ÿ ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤•ā¤ž ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤ŸāĨ¤", + "IRC_Channel_Users": "NAMES ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤•ā¤ž ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤ŸāĨ¤", + "IRC_Channel_Users_End": "NAMES ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤•āĨ‡ ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤Ÿ ā¤•ā¤ž ā¤…ā¤‚ā¤¤āĨ¤", + "IRC_Description": "ā¤‡ā¤‚ā¤Ÿā¤°ā¤¨āĨ‡ā¤Ÿ ā¤°ā¤ŋā¤˛āĨ‡ ā¤šāĨˆā¤Ÿ (ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€) ā¤ā¤• ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ-ā¤†ā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤¸ā¤ŽāĨ‚ā¤š ā¤¸ā¤‚ā¤šā¤žā¤° ā¤‰ā¤Ēā¤•ā¤°ā¤Ŗ ā¤šāĨˆāĨ¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–āĨā¤˛āĨ€ ā¤šā¤°āĨā¤šā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¨ā¤žā¤Žā¤ŋā¤¤ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤¯ā¤ž ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤”ā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤žā¤ā¤žā¤•ā¤°ā¤Ŗ ā¤•āĨā¤ˇā¤Žā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤­āĨ€ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¯ā¤š ā¤ĒāĨˆā¤•āĨ‡ā¤œ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇā¤Žā¤¤ā¤ž ā¤•āĨ€ ā¤‡ā¤¨ ā¤Ēā¤°ā¤¤āĨ‹ā¤‚ ā¤•āĨ‹ Rocket.Chat ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ā¤•āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "IRC_Enabled": "ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤•āĨ‹ ā¤ā¤•āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸āĨ¤ ā¤‡ā¤¸ ā¤Žā¤žā¤¨ ā¤•āĨ‹ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ Rocket.Chat ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤ƒ ā¤†ā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "IRC_Enabled_Alert": "ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ ā¤ĒāĨā¤°ā¤—ā¤¤ā¤ŋ ā¤Ēā¤° ā¤šāĨˆāĨ¤ ā¤‡ā¤¸ ā¤¸ā¤Žā¤¯ ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļā¤¨ ā¤ĒāĨā¤°ā¤Ŗā¤žā¤˛āĨ€ ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ€ ā¤…ā¤¨āĨā¤ļā¤‚ā¤¸ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "IRC_Federation": "ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨", + "IRC_Federation_Description": "ā¤…ā¤¨āĨā¤¯ ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "IRC_Federation_Disabled": "ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ.", + "IRC_Hostname": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤šāĨ‹ā¤¸āĨā¤Ÿ ā¤¸ā¤°āĨā¤ĩā¤°āĨ¤", + "IRC_Login_Fail": "ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤ŸāĨ¤", + "IRC_Login_Success": "ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤¸ā¤Ģā¤˛ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤Ēā¤° ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤ŸāĨ¤", + "IRC_Message_Cache_Size": "ā¤†ā¤‰ā¤Ÿā¤Ŧā¤žā¤‰ā¤‚ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨˆā¤ļ ā¤¸āĨ€ā¤Žā¤žāĨ¤", + "IRC_Port": "ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤šāĨ‹ā¤¸āĨā¤Ÿ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤Ŧā¤žā¤‡ā¤‚ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨ‹ā¤°āĨā¤ŸāĨ¤", + "IRC_Private_Message": "PRIVMSG ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤•ā¤ž ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤ŸāĨ¤", + "IRC_Quit": "ā¤†ā¤ˆā¤†ā¤°ā¤¸āĨ€ ā¤¸ā¤¤āĨā¤° ā¤›āĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤Ēā¤° ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤ŸāĨ¤", + "is_typing": "ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Issue_Links": "ā¤ŸāĨā¤°āĨˆā¤•ā¤° ā¤˛ā¤ŋā¤‚ā¤• ā¤œā¤žā¤°āĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "IssueLinks_Incompatible": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€: ā¤‡ā¤¸āĨ‡ ā¤”ā¤° 'ā¤šāĨ‡ā¤•āĨā¤¸ ā¤•ā¤˛ā¤° ā¤ĒāĨā¤°āĨ€ā¤ĩāĨā¤¯āĨ‚' ā¤•āĨ‹ ā¤ā¤• ā¤šāĨ€ ā¤¸ā¤Žā¤¯ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "IssueLinks_LinkTemplate": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ", + "IssueLinks_LinkTemplate_Description": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ; %s ā¤•āĨ‹ ā¤‡ā¤ļāĨā¤¯āĨ‚ ā¤¨ā¤‚ā¤Ŧā¤° ā¤¸āĨ‡ ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž.", + "It_Will_Hide_All_Other_Content_Blocks_In_The_Homepage": "ā¤¯ā¤š ā¤ŽāĨā¤–ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨āĨā¤¯ ā¤¸ā¤­āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤›ā¤ŋā¤Ēā¤ž ā¤ĻāĨ‡ā¤—ā¤ž", + "It_Will_Show_All_Other_Content_Blocks_In_The_Homepage": "ā¤¯ā¤š ā¤ŽāĨā¤–ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ēā¤° ā¤…ā¤¨āĨā¤¯ ā¤¸ā¤­āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤Ļā¤ŋā¤–ā¤žā¤ā¤—ā¤ž", + "It_works": "ā¤¯ā¤š ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "It_Security": "ā¤†ā¤ˆā¤ŸāĨ€ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž", + "Italic": "ā¤¤ā¤ŋā¤°ā¤›ā¤ž", + "italics": "ā¤¤ā¤ŋā¤°āĨā¤›ā¤ž", + "Items_per_page:": "ā¤†ā¤‡ā¤Ÿā¤Ž ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤ĒāĨ‡ā¤œ:", + "Jitsi_included_with_Community": "ā¤œā¤ŋā¤¤āĨā¤¸āĨ€, ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ļā¤žā¤Žā¤ŋā¤˛", + "Job_Title": "ā¤¨āĨŒā¤•ā¤°āĨ€ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Join": "ā¤œāĨ‹ā¤Ąā¤ŧā¤¨ā¤ž", + "Join_with_password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤œāĨā¤Ąā¤ŧāĨ‡ā¤‚", + "Join_audio_call": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "Join_call": "ā¤•āĨ‰ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "Join_Chat": "ā¤šāĨˆā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "Join_conference": "ā¤¸ā¤ŽāĨā¤ŽāĨ‡ā¤˛ā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "Join_default_channels": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧāĨ‡ā¤‚", + "Join_the_Community": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "Join_the_given_channel": "ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧāĨ‡ā¤‚", + "Join_rooms": "ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧāĨ‡ā¤‚", + "Join_video_call": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "Join_my_room_to_start_the_video_call": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŽāĨ‡ā¤°āĨ‡ ā¤•ā¤Žā¤°āĨ‡ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧāĨ‡ā¤‚", + "join-without-join-code": "ā¤Ŧā¤ŋā¤¨ā¤ž ā¤œāĨ‰ā¤‡ā¤¨ ā¤•āĨ‹ā¤Ą ā¤•āĨ‡ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "join-without-join-code_description": "ā¤œāĨ‰ā¤‡ā¤¨ ā¤•āĨ‹ā¤Ą ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤ĩā¤žā¤˛āĨ‡ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‰ā¤‡ā¤¨ ā¤•āĨ‹ā¤Ą ā¤•āĨ‹ ā¤Ŧā¤žā¤¯ā¤Ēā¤žā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Joined": "ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤—ā¤", + "joined": "ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤—ā¤", + "Joined_at": "ā¤Ēā¤° ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨā¤", + "JSON": "JSON", + "Jump": "ā¤•āĨ‚ā¤Ļā¤¨ā¤ž", + "Jump_to_first_unread": "ā¤Ēā¤šā¤˛āĨ‡ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤Ēā¤° ā¤œā¤žā¤ā¤", + "Jump_to_message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤° ā¤œā¤žā¤ā¤‚", + "Jump_to_recent_messages": "ā¤šā¤žā¤˛ ā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤œā¤žā¤ā¤", + "Just_invited_people_can_access_this_channel": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤˛āĨ‹ā¤— ā¤šāĨ€ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤š ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "kick-user-from-any-c-room": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤˛ā¤žā¤¤ ā¤Žā¤žā¤°āĨ‹", + "kick-user-from-any-c-room_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤¨ā¤ŋā¤•ā¤žā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "kick-user-from-any-p-room": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤˛ā¤žā¤¤ ā¤Žā¤žā¤°āĨ‹", + "kick-user-from-any-p-room_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤¨ā¤ŋā¤•ā¤žā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Katex_Dollar_Syntax": "ā¤ĄāĨ‰ā¤˛ā¤° ā¤¸ā¤ŋā¤‚ā¤ŸāĨˆā¤•āĨā¤¸ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Katex_Dollar_Syntax_Description": "$$katex ā¤ŦāĨā¤˛āĨ‰ā¤•$$ ā¤”ā¤° $inline katex$ ā¤¸ā¤ŋā¤‚ā¤ŸāĨˆā¤•āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Katex_Enabled": "ā¤•āĨ‡ā¤ŸāĨ‡ā¤•āĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Katex_Enabled_Description": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤—ā¤Ŗā¤ŋā¤¤ ā¤Ÿā¤žā¤‡ā¤Ēā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‡ ā¤˛ā¤ŋā¤ [katex](http://ā¤–ā¤žā¤¨.github.io/KaTeX/) ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Katex_Parenthesis_Syntax": "ā¤•āĨ‹ā¤ˇāĨā¤ ā¤• ā¤¸ā¤ŋā¤‚ā¤ŸāĨˆā¤•āĨā¤¸ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Katex_Parenthesis_Syntax_Description": "\\[katex ā¤ŦāĨā¤˛āĨ‰ā¤•\\] ā¤”ā¤° \\(ā¤‡ā¤¨ā¤˛ā¤žā¤‡ā¤¨ katex\\) ā¤¸ā¤ŋā¤‚ā¤ŸāĨˆā¤•āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Keep_default_user_settings": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤°ā¤–āĨ‡ā¤‚", + "Keyboard_Shortcuts_Edit_Previous_Message": "ā¤Ēā¤ŋā¤›ā¤˛ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Keyboard_Shortcuts_Keys_1": "ā¤•ā¤Žā¤žā¤‚ā¤Ą (ā¤¯ā¤ž Ctrl) + p ā¤¯ā¤ž ā¤•ā¤Žā¤žā¤‚ā¤Ą (ā¤¯ā¤ž Ctrl) + k", + "Keyboard_Shortcuts_Keys_2": "ā¤Šā¤Ēā¤° ā¤•āĨ€ ā¤“ā¤° ā¤¤āĨ€ā¤°", + "Keyboard_Shortcuts_Keys_3": "ā¤•ā¤Žā¤žā¤‚ā¤Ą (ā¤¯ā¤ž Alt) + ā¤Ŧā¤žā¤¯ā¤žā¤ ā¤¤āĨ€ā¤°", + "Keyboard_Shortcuts_Keys_4": "ā¤•ā¤Žā¤žā¤‚ā¤Ą (ā¤¯ā¤ž Alt) + ā¤Šā¤Ēā¤° ā¤¤āĨ€ā¤°", + "Keyboard_Shortcuts_Keys_5": "ā¤•ā¤Žā¤žā¤‚ā¤Ą (ā¤¯ā¤ž Alt) + ā¤Ļā¤žā¤¯ā¤žā¤‚ ā¤¤āĨ€ā¤°", + "Keyboard_Shortcuts_Keys_6": "ā¤•ā¤Žā¤žā¤‚ā¤Ą (ā¤¯ā¤ž Alt) + ā¤Ąā¤žā¤‰ā¤¨ ā¤ā¤°āĨ‹", + "Keyboard_Shortcuts_Keys_7": "ā¤ļā¤ŋā¤ĢāĨā¤Ÿ + ā¤ā¤‚ā¤Ÿā¤°", + "Keyboard_Shortcuts_Keys_8": "ā¤ļā¤ŋā¤ĢāĨā¤Ÿ (ā¤¯ā¤ž Ctrl) + ESC", + "Keyboard_Shortcuts_Mark_all_as_read": "ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ (ā¤¸ā¤­āĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚) ā¤Ēā¤ ā¤ŋā¤¤ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Keyboard_Shortcuts_Move_To_Beginning_Of_Message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ€ ā¤ļāĨā¤°āĨā¤†ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤ā¤", + "Keyboard_Shortcuts_Move_To_End_Of_Message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤ā¤", + "Keyboard_Shortcuts_New_Line_In_Message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛ā¤ŋā¤–āĨ‡ā¤‚ ā¤‡ā¤¨ā¤ĒāĨā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ˆ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ", + "Keyboard_Shortcuts_Open_Channel_Slash_User_Search": "ā¤šāĨˆā¤¨ā¤˛/ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–āĨ‹ā¤œ ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Keyboard_Shortcuts_Title": "ā¤•āĨā¤‚ā¤œāĨ€ā¤Ēā¤Ÿā¤˛ ā¤…ā¤˛āĨā¤Ē ā¤Žā¤žā¤°āĨā¤—", + "Knowledge_Base": "ā¤œāĨā¤žā¤žā¤¨ā¤§ā¤žā¤°", + "Label": "ā¤˛āĨ‡ā¤Ŧā¤˛", + "Language": "ā¤­ā¤žā¤ˇā¤ž", + "Language_Bulgarian": "ā¤Ŧā¤˛āĨā¤—āĨ‡ā¤°ā¤ŋā¤¯ā¤žā¤ˆ", + "Language_Chinese": "ā¤šāĨ€ā¤¨āĨ€", + "Language_Czech": "ā¤šāĨ‡ā¤•", + "Language_Danish": "ā¤Ļā¤žā¤¨ā¤ŋā¤ļ", + "Language_Dutch": "ā¤Ąā¤š", + "Language_English": "ā¤…ā¤‚ā¤—āĨā¤°āĨ‡ā¤œā¤ŧāĨ€", + "Language_Estonian": "ā¤ā¤¸āĨā¤¤āĨ‹ā¤¨ā¤ŋā¤¯ā¤žā¤ĩā¤žā¤¸āĨ€", + "Language_Finnish": "ā¤Ģā¤ŋā¤¨ā¤ŋā¤ļ", + "Language_French": "ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤š", + "Language_German": "ā¤œā¤°āĨā¤Žā¤¨", + "Language_Greek": "ā¤¯āĨ‚ā¤¨ā¤žā¤¨āĨ€", + "Language_Hungarian": "ā¤šā¤‚ā¤—āĨ‡ā¤°āĨ€", + "Language_Italian": "ā¤‡ā¤¤ā¤žā¤˛ā¤ĩāĨ€", + "Language_Japanese": "ā¤œā¤žā¤Ēā¤žā¤¨āĨ€", + "Language_Latvian": "ā¤˛ā¤žā¤¤āĨā¤ĩāĨ€ā¤¯ā¤žā¤ĩā¤žā¤¸āĨ€", + "Language_Lithuanian": "ā¤˛ā¤ŋā¤ĨāĨā¤†ā¤¨ā¤ŋā¤¯ā¤žā¤ˆ", + "Language_Not_set": "ā¤•āĨ‹ā¤ˆ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ā¤¨ā¤šāĨ€ā¤‚", + "Language_Polish": "ā¤ĒāĨ‹ā¤˛ā¤ŋā¤ļ", + "Language_Portuguese": "ā¤ĒāĨā¤°āĨā¤¤ā¤—ā¤žā¤˛āĨ€", + "Language_Romanian": "ā¤°āĨ‹ā¤Žā¤žā¤¨ā¤ŋā¤¯ā¤žā¤ˆ", + "Language_Russian": "ā¤°āĨ‚ā¤¸āĨ€", + "Language_Slovak": "ā¤¸āĨā¤˛āĨ‹ā¤ĩā¤žā¤•", + "Language_Slovenian": "ā¤¸āĨā¤˛āĨ‹ā¤ĩāĨ‡ā¤¨ā¤ŋā¤¯ā¤žā¤ˆ", + "Language_Spanish": "ā¤¸āĨā¤ĒāĨˆā¤¨ā¤ŋā¤ļ", + "Language_Swedish": "ā¤¸āĨā¤ĩāĨ€ā¤Ąā¤ŋā¤ļ", + "Language_Version": "ā¤…ā¤‚ā¤—āĨā¤°āĨ‡ā¤œāĨ€ ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "Last_7_days": "ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ 7 ā¤Ļā¤ŋā¤¨", + "Last_15_days": "ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ 15 ā¤Ļā¤ŋā¤¨", + "Last_30_days": "ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ 30 ā¤Ļā¤ŋā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚", + "Last_90_days": "ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ 90 ā¤Ļā¤ŋā¤¨", + "Last_6_months": "ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ 6 ā¤Žā¤šāĨ€ā¤¨āĨ‡", + "Last_year": "ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ ā¤¸ā¤žā¤˛", + "Last_active": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "Last_Call": "ā¤†ā¤–ā¤ŋā¤°āĨ€ ā¤•āĨ‰ā¤˛", + "Last_Chat": "ā¤†ā¤–ā¤ŋā¤°āĨ€ ā¤šāĨˆā¤Ÿ", + "Last_Heartbeat_Time": "ā¤†ā¤–ā¤ŋā¤°āĨ€ ā¤Ļā¤ŋā¤˛ ā¤•āĨ€ ā¤§ā¤Ąā¤ŧā¤•ā¤¨ ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "Last_login": "ā¤†ā¤–ā¤°āĨ€ ā¤˛āĨ‰ā¤—ā¤‡ā¤¨", + "Last_Message": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Last_Message_At": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤°", + "Last_seen": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤Ŧā¤žā¤° ā¤ĻāĨ‡ā¤–ā¤ž ā¤—ā¤¯ā¤ž", + "Last_Status": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Last_token_part": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸ā¤žā¤‚ā¤•āĨ‡ā¤¤ā¤ŋā¤• ā¤­ā¤žā¤—", + "Last_Updated": "ā¤†ā¤–ā¤°āĨ€ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ", + "Launched_successfully": "ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤˛āĨ‰ā¤¨āĨā¤š ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Layout": "ā¤˛āĨ‡ā¤†ā¤‰ā¤Ÿ", + "Layout_Login_Hide_Logo": "ā¤˛āĨ‹ā¤—āĨ‹ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Layout_Login_Hide_Logo_Description": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‡ā¤œ ā¤Ēā¤° ā¤˛āĨ‹ā¤—āĨ‹ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤.", + "Layout_Login_Hide_Title": "ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Layout_Login_Hide_Title_Description": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‡ā¤œ ā¤Ēā¤° ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤›ā¤ŋā¤Ēā¤žā¤ā¤.", + "Layout_Login_Hide_Powered_By": "\"ā¤‡ā¤¸ā¤•āĨ‡ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤ŋā¤¤\" ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "Layout_Login_Hide_Powered_By_Description": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‡ā¤œ ā¤Ēā¤° \"ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž\" ā¤›āĨā¤Ēā¤žā¤ā¤‚āĨ¤", + "Layout_Login_Template": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ŸāĨ‡ā¤ŽāĨā¤ĒāĨā¤˛āĨ‡ā¤Ÿ", + "Layout_Login_Template_Description": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‡ā¤œ ā¤•ā¤ž ā¤¸āĨā¤ĩā¤°āĨ‚ā¤Ē ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚.", + "Layout_Login_Template_Vertical": "ā¤–ā¤Ąā¤ŧā¤ž", + "Layout_Login_Template_Horizontal": "ā¤•āĨā¤ˇāĨˆā¤¤ā¤ŋā¤œ", + "Layout_Description": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•ā¤ž ā¤¸āĨā¤ĩā¤°āĨ‚ā¤Ē ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚.", + "Layout_Home_Body": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤ŦāĨā¤˛āĨ‰ā¤•", + "Layout_Home_Page_Content": "ā¤˛āĨ‡ā¤†ā¤‰ā¤Ÿ/ā¤šāĨ‹ā¤Ž ā¤ĒāĨ‡ā¤œ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€", + "Layout_Home_Page_Content_Title": "ā¤ŽāĨā¤– ā¤ĒāĨƒā¤ˇāĨā¤  ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€", + "Layout_Home_Title": "ā¤—āĨƒā¤š ā¤ļāĨ€ā¤°āĨā¤ˇā¤•", + "Layout_Legal_Notice": "ā¤•ā¤žā¤¨āĨ‚ā¤¨āĨ€ ā¤¨āĨ‹ā¤Ÿā¤ŋā¤¸", + "Layout_Login_Terms": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚", + "Layout_Login_Terms_Content": "ā¤†ā¤—āĨ‡ ā¤Ŧā¤ĸā¤ŧā¤•ā¤° ā¤†ā¤Ē ā¤šā¤Žā¤žā¤°āĨ€ ā¤¸āĨ‡ā¤ĩā¤ž ā¤•āĨ€ ā¤ļā¤°āĨā¤¤āĨ‹ā¤‚ , ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¨āĨ€ā¤¤ā¤ŋ ā¤”ā¤° ā¤•ā¤žā¤¨āĨ‚ā¤¨āĨ€ ā¤¨āĨ‹ā¤Ÿā¤ŋā¤¸ ā¤¸āĨ‡ ā¤¸ā¤šā¤Žā¤¤ ā¤šāĨˆā¤‚āĨ¤", + "Layout_Privacy_Policy": "ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¨āĨ€ā¤¤ā¤ŋ", + "Layout_Show_Home_Button": "ā¤¸ā¤žā¤‡ā¤Ąā¤Ŧā¤žā¤° ā¤šāĨ‡ā¤Ąā¤° ā¤Ēā¤° ā¤šāĨ‹ā¤Ž ā¤ĒāĨ‡ā¤œ ā¤Ŧā¤Ÿā¤¨ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Layout_Custom_Content_Description": "ā¤¯ā¤šā¤žā¤‚ ā¤†ā¤Ēā¤•āĨ€ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤šāĨˆāĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤Ēā¤° ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤‡ā¤¸āĨ‡ ā¤ā¤• ā¤¸ā¤ĢāĨ‡ā¤Ļ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•āĨ‡ ā¤…ā¤‚ā¤Ļā¤° ā¤°ā¤–ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤¯ā¤ž ā¤šāĨ‹ā¤Žā¤ĒāĨ‡ā¤œ ā¤Ēā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¸ā¤­āĨ€ ā¤œā¤—ā¤š ā¤˛āĨ‡ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Layout_Home_Custom_Block_Visible": "ā¤ŽāĨā¤–ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ēā¤° ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Layout_Custom_Body_Only": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Layout_Custom_Body_Only_Description": "ā¤¯ā¤š ā¤ŽāĨā¤–ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨āĨā¤¯ ā¤¸ā¤­āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤›ā¤ŋā¤Ēā¤ž ā¤ĻāĨ‡ā¤—ā¤žāĨ¤", + "Layout_Sidenav_Footer": "ā¤¸ā¤žā¤‡ā¤Ą ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤Ģā¤ŧāĨā¤Ÿā¤°", + "Layout_Sidenav_Footer_Dark": "ā¤¸ā¤žā¤‡ā¤Ą ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤Ģā¤ŧāĨā¤Ÿā¤° - ā¤Ąā¤žā¤°āĨā¤• ā¤ĨāĨ€ā¤Ž", + "Layout_Sidenav_Footer_description": "ā¤Ģā¤ŧāĨā¤Ÿā¤° ā¤•ā¤ž ā¤†ā¤•ā¤žā¤° 260 x 70px ā¤šāĨˆ", + "Layout_Sidenav_Footer_Dark_description": "ā¤Ģā¤ŧāĨā¤Ÿā¤° ā¤•ā¤ž ā¤†ā¤•ā¤žā¤° 260 x 70px ā¤šāĨˆ", + "Layout_Terms_of_Service": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤•āĨ€ ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚", + "LDAP": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€", + "LDAP_Description": "ā¤˛ā¤žā¤‡ā¤Ÿā¤ĩāĨ‡ā¤Ÿ ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤ŸāĨā¤°āĨ€ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ĒāĨā¤°āĨ‹ā¤ŸāĨ‹ā¤•āĨ‰ā¤˛ ā¤•ā¤ŋā¤¸āĨ€ ā¤•āĨ‹ ā¤­āĨ€ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¯ā¤ž ā¤•ā¤‚ā¤Ēā¤¨āĨ€ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤Ŧā¤¨ā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "LDAP_Documentation": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧāĨ€ā¤•ā¤°ā¤Ŗ", + "LDAP_Connection": "ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§", + "LDAP_Connection_Authentication": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ", + "LDAP_Connection_Encryption": "ā¤•āĨ‚ā¤Ÿā¤˛āĨ‡ā¤–ā¤¨", + "LDAP_Connection_Timeouts": "ā¤¸ā¤Žā¤¯ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ", + "LDAP_UserSearch": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–āĨ‹ā¤œ", + "LDAP_UserSearch_Filter": "ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "LDAP_UserSearch_GroupFilter": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤°", + "LDAP_DataSync": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸ā¤ŋā¤‚ā¤•", + "LDAP_DataSync_DataMap": "ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°ā¤Ŗ", + "LDAP_DataSync_Avatar": "ā¤…ā¤ĩā¤¤ā¤žā¤°", + "LDAP_DataSync_Advanced": "ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤¸ā¤ŋā¤‚ā¤•", + "LDAP_DataSync_CustomFields": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_DataSync_Roles": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_DataSync_Channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_DataSync_Teams": "ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_DataSync_BackgroundSync": "ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤¸ā¤Žā¤¨āĨā¤ĩā¤¯ā¤¨", + "LDAP_Server_Type": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "LDAP_Server_Type_AD": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž", + "LDAP_Server_Type_Other": "ā¤…ā¤¨āĨā¤¯", + "LDAP_Name_Field": "ā¤¨ā¤žā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "LDAP_Email_Field": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "LDAP_Update_Data_On_Login": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Update_Data_On_OAuth_Login": "OAuth ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Advanced_Sync": "ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤¸ā¤ŋā¤‚ā¤•", "LDAP_Authentication": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Authentication_Password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "LDAP_Authentication_UserDN": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ€.ā¤ā¤¨", + "LDAP_Authentication_UserDN_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤Ēā¤° ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤˛āĨā¤•ā¤…ā¤Ē ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤\n ā¤¯ā¤š ā¤†ā¤Žā¤¤āĨŒā¤° ā¤Ēā¤° ā¤¤āĨƒā¤¤āĨ€ā¤¯-ā¤Ēā¤•āĨā¤ˇ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤ā¤• ā¤¸āĨ‡ā¤ĩā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤ĒāĨ‚ā¤°āĨā¤Ŗā¤¤ā¤ƒ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚, ā¤œāĨˆā¤¸āĨ‡ `cn=Administrator,cn=Users,dc=Example,dc=com`.", + "LDAP_Avatar_Field": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "You_have_to_set_an_API_token_first_in_order_to_use_the_integration": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤Ēā¤šā¤˛āĨ‡ ā¤ā¤• ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "LDAP_Avatar_Field_Description": " ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¸ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‹ *ā¤…ā¤ĩā¤¤ā¤žā¤°* ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤Ēā¤šā¤˛āĨ‡ `ā¤Ĩā¤‚ā¤Ŧā¤¨āĨ‡ā¤˛ā¤ĢāĨ‹ā¤ŸāĨ‹` ā¤”ā¤° `ā¤œāĨ‡ā¤ĒāĨ€ā¤ˆā¤œāĨ€ā¤ĢāĨ‹ā¤ŸāĨ‹` ā¤•āĨ‹ ā¤Ģā¤ŧāĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤‚āĨ¤", + "LDAP_Background_Sync": "ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤¸ā¤Žā¤¨āĨā¤ĩā¤¯ā¤¨", + "LDAP_Background_Sync_Avatars": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤¸ā¤ŋā¤‚ā¤•", + "LDAP_Background_Sync_Avatars_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤…ā¤˛ā¤— ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "LDAP_Background_Sync_Avatars_Interval": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤¸ā¤ŋā¤‚ā¤• ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛", + "LDAP_Background_Sync_Import_New_Users": "ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤¸ā¤ŋā¤‚ā¤• ā¤¨ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Background_Sync_Import_New_Users_Description": "ā¤‰ā¤¨ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤—ā¤ž (ā¤†ā¤Ēā¤•āĨ‡ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤Žā¤žā¤¨ā¤Ļā¤‚ā¤Ą ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤°) ā¤œāĨ‹ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "LDAP_Background_Sync_Interval": "ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤¸ā¤ŋā¤‚ā¤• ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛", + "LDAP_Background_Sync_Interval_Description": "ā¤¤āĨā¤˛āĨā¤¯ā¤•ā¤žā¤˛ā¤¨ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤•ā¤ž ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛. ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ `ā¤šā¤° 24 ā¤˜ā¤‚ā¤ŸāĨ‡` ā¤¯ā¤ž `ā¤¸ā¤ĒāĨā¤¤ā¤žā¤š ā¤•āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤Ļā¤ŋā¤¨`, ā¤…ā¤§ā¤ŋā¤• ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ [ā¤•āĨā¤°āĨ‹ā¤¨ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤Ēā¤žā¤°āĨā¤¸ā¤°](http://bunkat.github.io/later/parsers.html#text) ā¤Ēā¤°", + "LDAP_Background_Sync_Keep_Existant_Users_Updated": "ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤ŦāĨˆā¤•ā¤—āĨā¤°ā¤žā¤‰ā¤‚ā¤Ą ā¤¸ā¤ŋā¤‚ā¤• ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Background_Sync_Keep_Existant_Users_Updated_Description": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• **ā¤¸ā¤ŋā¤‚ā¤• ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛** ā¤Ēā¤° ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸āĨ‡ ā¤†ā¤¯ā¤žā¤¤ā¤ŋā¤¤ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤…ā¤ĩā¤¤ā¤žā¤°, ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤‡ā¤¤āĨā¤¯ā¤žā¤Ļā¤ŋ (ā¤†ā¤Ēā¤•āĨ‡ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤°) ā¤•āĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤", + "LDAP_Background_Sync_Merge_Existent_Users": "ā¤ŦāĨˆā¤•ā¤—āĨā¤°ā¤žā¤‰ā¤‚ā¤Ą ā¤¸ā¤ŋā¤‚ā¤• ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Žā¤°āĨā¤œ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "LDAP_Background_Sync_Merge_Existent_Users_Description": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ (ā¤†ā¤Ēā¤•āĨ‡ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤Žā¤žā¤¨ā¤Ļā¤‚ā¤Ą ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤°) ā¤•āĨ‹ ā¤Žā¤°āĨā¤œ ā¤•ā¤° ā¤ĻāĨ‡ā¤—ā¤ž ā¤œāĨ‹ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤­āĨ€ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆā¤‚āĨ¤ ā¤‡ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸ā¤ŋā¤‚ā¤• ā¤ŸāĨˆā¤Ŧ ā¤ŽāĨ‡ā¤‚ 'ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Žā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚' ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "LDAP_BaseDN": "ā¤ŦāĨ‡ā¤¸ ā¤ĄāĨ€.ā¤ā¤¨", + "LDAP_BaseDN_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤Ŧā¤ŸāĨā¤°āĨ€ ā¤•ā¤ž ā¤ĒāĨ‚ā¤°āĨā¤Ŗā¤¤ā¤ƒ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤¨ā¤žā¤Ž (ā¤ĄāĨ€ā¤ā¤¨) ā¤œā¤ŋā¤¸āĨ‡ ā¤†ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤”ā¤° ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–āĨ‹ā¤œā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤†ā¤Ē ā¤œā¤ŋā¤¤ā¤¨āĨ‡ ā¤šā¤žā¤šāĨ‡ā¤‚ ā¤‰ā¤¤ā¤¨āĨ‡ ā¤œāĨ‹ā¤Ąā¤ŧ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚; ā¤šā¤žā¤˛ā¤žā¤ā¤•ā¤ŋ, ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤¸ā¤ŽāĨ‚ā¤š ā¤•āĨ‹ ā¤‰ā¤¸āĨ€ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤†ā¤§ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤ ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤¸ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆā¤‚āĨ¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `ou=ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž+ou=ā¤ĒāĨā¤°āĨ‹ā¤œāĨ‡ā¤•āĨā¤ŸāĨā¤¸,dc=ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ,dc=com`āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤•āĨ‡ā¤ĩā¤˛ ā¤‰ā¤¨ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨ€ ā¤Ļā¤žā¤¯ā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤šāĨ‹ā¤‚ā¤—āĨ‡āĨ¤ ā¤šā¤Ž ā¤…ā¤¨āĨā¤ļā¤‚ā¤¸ā¤ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž ā¤ŸāĨā¤°āĨ€ ā¤•āĨ‡ ā¤ļāĨ€ā¤°āĨā¤ˇ ā¤¸āĨā¤¤ā¤° ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤†ā¤§ā¤žā¤° ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‹ ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–āĨ‹ā¤œ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "LDAP_CA_Cert": "ā¤¸āĨ€ā¤ ā¤¸ā¤°āĨā¤Ÿā¤ŋā¤Ģā¤ŋā¤•āĨ‡ā¤Ÿ", + "LDAP_Connect_Timeout": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ (ā¤ā¤Žā¤ā¤¸)", + "LDAP_DataSync_AutoLogout": "ā¤‘ā¤ŸāĨ‹ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "LDAP_Default_Domain": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "LDAP_Default_Domain_Description": "ā¤¯ā¤Ļā¤ŋ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤‰ā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž ā¤œā¤šā¤žā¤‚ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸āĨ‡ ā¤†ā¤¯ā¤žā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤žāĨ¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‹ `username@default_domain` ā¤¯ā¤ž `unique_id@default_domain` ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤Žā¤žā¤‰ā¤‚ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤\n ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ`", "LDAP_Enable": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Enable_Description": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "LDAP_Enable_LDAP_Groups_To_RC_Teams": "LDAP ā¤¸āĨ‡ Rocket.Chat ā¤¤ā¤• ā¤ŸāĨ€ā¤Ž ā¤ŽāĨˆā¤Ēā¤ŋā¤‚ā¤— ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Encryption": "ā¤•āĨ‚ā¤Ÿā¤˛āĨ‡ā¤–ā¤¨", + "LDAP_Encryption_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤¸ā¤‚ā¤šā¤žā¤° ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤ŖāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ `ā¤ĒāĨā¤˛āĨ‡ā¤¨` (ā¤•āĨ‹ā¤ˆ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¨ā¤šāĨ€ā¤‚), `ā¤ā¤¸ā¤ā¤¸ā¤ā¤˛/ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ā¤ā¤¸` (ā¤ļāĨā¤°āĨā¤†ā¤¤ ā¤¸āĨ‡ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą), ā¤”ā¤° `ā¤¸āĨā¤Ÿā¤žā¤°āĨā¤Ÿā¤ŸāĨ€ā¤ā¤˛ā¤ā¤¸` (ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤¸ā¤‚ā¤šā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą) ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆā¤‚āĨ¤", + "LDAP_Find_User_After_Login": "ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĸāĨ‚ā¤‚ā¤ĸāĨ‡ā¤‚", + "LDAP_Find_User_After_Login_Description": "ā¤Ŧā¤žā¤‡ā¤‚ā¤Ą ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ĄāĨ€ā¤ā¤¨ ā¤•āĨ€ ā¤–āĨ‹ā¤œ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤¤ā¤žā¤•ā¤ŋ ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•āĨ‡ ā¤•ā¤ŋ ā¤ā¤ĄāĨ€ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤Ļā¤ŋā¤ ā¤œā¤žā¤¨āĨ‡ ā¤Ēā¤° ā¤Ŧā¤žā¤‡ā¤‚ā¤Ą ā¤–ā¤žā¤˛āĨ€ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•āĨ‹ ā¤°āĨ‹ā¤•ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Ģā¤˛ ā¤°ā¤šā¤žāĨ¤", + "LDAP_Group_Filter_Enable": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Group_Filter_Enable_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚\n ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ *memberOf* ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž OpenLDAP ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‹ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—āĨ€", + "LDAP_Group_Filter_Group_Id_Attribute": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤†ā¤ˆā¤ĄāĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž", + "LDAP_Group_Filter_Group_Id_Attribute_Description": "ā¤œāĨˆā¤¸āĨ‡ **ā¤“ā¤Ēā¤¨ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€:** `ā¤¸āĨ€ā¤ā¤¨`", + "LDAP_Group_Filter_Group_Member_Attribute": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž", + "LDAP_Group_Filter_Group_Member_Attribute_Description": "ā¤œāĨˆā¤¸āĨ‡ **ā¤“ā¤Ēā¤¨ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€:** `ā¤¯āĨ‚ā¤¨āĨ€ā¤•ā¤ŽāĨ‡ā¤ŽāĨā¤Ŧā¤°`", + "LDAP_Group_Filter_Group_Member_Format": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē", + "LDAP_Group_Filter_Group_Member_Format_Description": "ā¤œāĨˆā¤¸āĨ‡ **OpenLDAP:** `uid=#{username},ou=users,o=Company,c=com`", + "LDAP_Group_Filter_Group_Name": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤¨ā¤žā¤Ž", + "LDAP_Group_Filter_Group_Name_Description": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤œā¤ŋā¤¸ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤šāĨˆ", + "LDAP_Group_Filter_ObjectClass": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤‘ā¤ŦāĨā¤œāĨ‡ā¤•āĨā¤Ÿā¤•āĨā¤˛ā¤žā¤¸", + "LDAP_Group_Filter_ObjectClass_Description": "*ā¤‘ā¤ŦāĨā¤œāĨ‡ā¤•āĨā¤Ÿā¤•āĨā¤˛ā¤žā¤¸* ā¤œāĨ‹ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ€ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤\n ā¤œāĨˆā¤¸āĨ‡ **OpenLDAP:** `groupOfUniqueNames`", + "LDAP_Groups_To_Rocket_Chat_Teams": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸āĨ‡ ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤¤ā¤• ā¤ŸāĨ€ā¤Ž ā¤ŽāĨˆā¤Ēā¤ŋā¤‚ā¤—āĨ¤", + "LDAP_Host": "ā¤ŽāĨ‡ā¤œā¤ŧā¤Ŧā¤žā¤¨", + "LDAP_Host_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤šāĨ‹ā¤¸āĨā¤Ÿ, ā¤‰ā¤Ļā¤ž. `ldap.example.com` ā¤¯ā¤ž `10.0.0.30`.", + "LDAP_Idle_Timeout": "ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤Žā¤¯ā¤Ŧā¤žā¤šāĨā¤¯ (ā¤ā¤Žā¤ā¤¸)", + "LDAP_Idle_Timeout_Description": "ā¤¨ā¤ĩāĨ€ā¤¨ā¤¤ā¤Ž ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‘ā¤Ēā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¤ā¤• ā¤•ā¤ŋā¤¤ā¤¨āĨ‡ ā¤Žā¤ŋā¤˛āĨ€ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤ (ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤‘ā¤Ēā¤°āĨ‡ā¤ļā¤¨ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤–āĨ‹ā¤˛āĨ‡ā¤—ā¤ž)", + "LDAP_Import_Users_Description": "ā¤¯ā¤š ā¤ŸāĨā¤°āĨ‚ ā¤¸ā¤ŋā¤‚ā¤• ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤­āĨ€ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤—āĨ€\n *ā¤¸ā¤žā¤ĩā¤§ā¤žā¤¨!* ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤†ā¤¯ā¤žā¤¤ ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–āĨ‹ā¤œ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "LDAP_Internal_Log_Level": "ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤˛āĨ‰ā¤— ā¤¸āĨā¤¤ā¤°", + "LDAP_Login_Fallback": "ā¤Ģā¤ŧāĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Login_Fallback_Description": "ā¤¯ā¤Ļā¤ŋ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤Ēā¤° ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤¸ā¤Ģā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ/ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤–ā¤žā¤¤ā¤ž ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤•ā¤ŋā¤¸āĨ€ ā¤•ā¤žā¤°ā¤Ŗ ā¤¸āĨ‡ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤Ąā¤žā¤‰ā¤¨ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤Žā¤Ļā¤Ļ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "LDAP_Merge_Existing_Users": "ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤Žā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Merge_Existing_Users_Description": "*ā¤¸ā¤žā¤ĩā¤§ā¤žā¤¨!* ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸āĨ‡ ā¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤”ā¤° ā¤¸ā¤Žā¤žā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤ĩā¤žā¤˛ā¤ž ā¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ ā¤¤āĨ‹ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤”ā¤° ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "LDAP_Port": "ā¤Ēā¤¤āĨā¤¤ā¤¨", + "LDAP_Port_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨ‹ā¤°āĨā¤ŸāĨ¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤: ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ā¤ā¤¸ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `389` ā¤¯ā¤ž `636`", + "LDAP_Prevent_Username_Changes": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž Rocket.Chat ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤°āĨ‹ā¤•āĨ‡ā¤‚", + "LDAP_Query_To_Get_User_Teams": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤•āĨā¤ĩāĨ‡ā¤°āĨ€", + "LDAP_Reconnect": "ā¤°ā¤ŋā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ", + "LDAP_Reconnect_Description": "ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤¨ ā¤¨ā¤ŋā¤ˇāĨā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤•ā¤ŋā¤¸āĨ€ ā¤•ā¤žā¤°ā¤Ŗ ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤Ŧā¤žā¤§ā¤ŋā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤ĒāĨā¤¨: ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Reject_Unauthorized": "ā¤…ā¤¨ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Reject_Unauthorized_Description": "ā¤œā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž, ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤†ā¤Žā¤¤āĨŒā¤° ā¤Ēā¤° ā¤¸āĨā¤ĩ-ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "LDAP_Search_Page_Size": "ā¤ĒāĨƒā¤ˇāĨā¤  ā¤†ā¤•ā¤žā¤° ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "LDAP_Search_Page_Size_Description": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ēā¤° ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°ā¤ĩā¤ŋā¤ˇāĨā¤Ÿā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤ĩā¤žā¤Ēā¤¸ ā¤†ā¤ā¤—āĨ€", + "LDAP_Search_Size_Limit": "ā¤–āĨ‹ā¤œ ā¤†ā¤•ā¤žā¤° ā¤¸āĨ€ā¤Žā¤ž", + "LDAP_Search_Size_Limit_Description": "ā¤ĩā¤žā¤Ēā¤¸ ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤ĒāĨā¤°ā¤ĩā¤ŋā¤ˇāĨā¤Ÿā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž.\n **ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚** ā¤¯ā¤š ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž **ā¤–āĨ‹ā¤œ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤†ā¤•ā¤žā¤°** ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤šāĨ‹ā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤", + "LDAP_Sync_Custom_Fields": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_CustomFieldMap": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤ŽāĨˆā¤Ēā¤ŋā¤‚ā¤—", + "LDAP_Sync_AutoLogout_Enabled": "ā¤‘ā¤ŸāĨ‹ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_AutoLogout_Interval": "ā¤‘ā¤ŸāĨ‹ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛", + "LDAP_Sync_Now": "ā¤…ā¤­āĨ€ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_Now_Description": "ā¤¯ā¤š ā¤…ā¤—ā¤˛āĨ‡ ā¤ļāĨ‡ā¤ĄāĨā¤¯āĨ‚ā¤˛ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤ŋā¤‚ā¤• ā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤ŋā¤ ā¤Ŧā¤ŋā¤¨ā¤ž, ā¤…ā¤Ŧ **ā¤ŦāĨˆā¤•ā¤—āĨā¤°ā¤žā¤‰ā¤‚ā¤Ą ā¤¸ā¤ŋā¤‚ā¤•** ā¤‘ā¤Ēā¤°āĨ‡ā¤ļā¤¨ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤° ā¤ĻāĨ‡ā¤—ā¤žāĨ¤\nā¤¯ā¤š ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤…ā¤¤āĨā¤˛āĨā¤¯ā¤•ā¤žā¤˛ā¤ŋā¤• ā¤šāĨˆ, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛āĨ‰ā¤— ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚āĨ¤", + "LDAP_Sync_User_Active_State": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_User_Active_State_Both": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤”ā¤° ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_User_Active_State_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ Rocket.Chat ā¤Ēā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¯ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤ ā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚āĨ¤ 'pwdAccountLockedTime' ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¯ā¤š ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž ā¤•ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ ā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚āĨ¤", + "LDAP_Sync_User_Active_State_Disable": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_User_Active_State_Nothing": "ā¤•āĨā¤› ā¤­āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "LDAP_Sync_User_Avatar": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_User_Data_Roles": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_User_Data_Channels": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤‘ā¤ŸāĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_User_Data_Channels_Admin": "ā¤šāĨˆā¤¨ā¤˛ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤•", + "LDAP_Sync_User_Data_Channels_Admin_Description": "ā¤œā¤Ŧ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨā¤ĩā¤¤ā¤ƒ ā¤¨ā¤ŋā¤°āĨā¤Žā¤ŋā¤¤ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤œāĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤ĻāĨŒā¤°ā¤žā¤¨ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤¯ā¤š ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤Ŧā¤¨ ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "LDAP_Sync_User_Data_Channels_BaseDN": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤—āĨā¤°āĨā¤Ē ā¤ŦāĨ‡ā¤¸ā¤ĄāĨ€ā¤ā¤¨", + "LDAP_Sync_User_Data_Channels_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ‡ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤­āĨ€ ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤¤: ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚āĨ¤", + "LDAP_Sync_User_Data_Channels_Enforce_AutoChannels": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤¤ā¤ƒ ā¤šā¤Ÿā¤žā¤ā¤", + "LDAP_Sync_User_Data_Channels_Enforce_AutoChannels_Description": "**ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚**: ā¤‡ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž ā¤œā¤ŋā¤¸ā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ! ā¤‡ā¤¸āĨ‡ ā¤•āĨ‡ā¤ĩā¤˛ ā¤¤ā¤­āĨ€ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤œā¤žā¤¨ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤•āĨā¤¯ā¤ž ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "LDAP_Sync_User_Data_Channels_Filter": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤°", + "LDAP_Sync_User_Data_Channels_Filter_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤–āĨ‹ā¤œ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¯ā¤š ā¤œā¤žā¤ā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•āĨ‹ā¤ˆ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ ā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚āĨ¤", + "LDAP_Sync_User_Data_ChannelsMap": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤šāĨˆā¤¨ā¤˛ ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°", + "LDAP_Sync_User_Data_ChannelsMap_Default": "// ā¤‰ā¤Ēā¤°āĨ‹ā¤•āĨā¤¤ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ‹ ā¤‘ā¤ŸāĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Sync_User_Data_ChannelsMap_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ‹ ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤Ēā¤° ā¤ŽāĨˆā¤Ē ā¤•ā¤°āĨ‡ā¤‚āĨ¤\n ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤¤āĨŒā¤° ā¤Ēā¤°, `{\"ā¤•ā¤°āĨā¤Žā¤šā¤žā¤°āĨ€\":\"ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯\"}` ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤•ā¤°āĨā¤Žā¤šā¤žā¤°āĨ€ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤—ā¤žāĨ¤", + "LDAP_Sync_User_Data_Roles_AutoRemove": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤¸āĨā¤ĩā¤¤ā¤ƒ ā¤šā¤Ÿā¤žā¤ā¤", + "LDAP_Sync_User_Data_Roles_AutoRemove_Description": "**ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚**: ā¤‡ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡ ā¤¯ā¤Ļā¤ŋ ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤žā¤‡ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ! ā¤¯ā¤š ā¤•āĨ‡ā¤ĩā¤˛ ā¤‰ā¤¨ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤—ā¤ž ā¤œāĨ‹ ā¤¨āĨ€ā¤šāĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤° ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ā¤°āĨā¤—ā¤¤ ā¤¸āĨ‡ā¤Ÿ ā¤•āĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤‚āĨ¤", + "LDAP_Sync_User_Data_Roles_BaseDN": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤—āĨā¤°āĨā¤Ē ā¤ŦāĨ‡ā¤¸ā¤ĄāĨ€ā¤ā¤¨", + "LDAP_Sync_User_Data_Roles_BaseDN_Description": "LDAP BaseDN ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤–āĨ‹ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "LDAP_Sync_User_Data_Roles_Filter": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤°", + "LDAP_Sync_User_Data_Roles_Filter_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤–āĨ‹ā¤œ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¯ā¤š ā¤œā¤žā¤ā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•āĨ‹ā¤ˆ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ ā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚āĨ¤", + "LDAP_Sync_User_Data_RolesMap": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸ā¤ŽāĨ‚ā¤š ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°", + "LDAP_Sync_User_Data_RolesMap_Description": "LDAP ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ‹ Rocket.Chat ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤“ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨˆā¤Ē ā¤•ā¤°āĨ‡ā¤‚\n ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤¤āĨŒā¤° ā¤Ēā¤°, `{\"ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ-ā¤ā¤Ąā¤Žā¤ŋā¤¨\":\"ā¤ā¤Ąā¤Žā¤ŋā¤¨\", \"ā¤ŸāĨ‡ā¤•-ā¤¸ā¤ĒāĨ‹ā¤°āĨā¤Ÿ\":\"ā¤¸ā¤ĒāĨ‹ā¤°āĨā¤Ÿ\", \"ā¤ŽāĨˆā¤¨āĨ‡ā¤œā¤°\":[\"ā¤˛āĨ€ā¤Ąā¤°\", \"ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤Ÿā¤°\"]}` ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ-ā¤ā¤Ąā¤Žā¤ŋā¤¨ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤—āĨā¤°āĨā¤Ē ā¤•āĨ‹ ā¤ŽāĨˆā¤Ē ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ ā¤•āĨ€ \"ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤•\" ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž.", + "LDAP_Teams_BaseDN": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤ŸāĨ€ā¤ŽāĨ‡ā¤‚ ā¤ŦāĨ‡ā¤¸ā¤ĄāĨ€ā¤ā¤¨", + "LDAP_Teams_BaseDN_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤ŦāĨ‡ā¤¸ā¤ĄāĨ€ā¤ā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "LDAP_Teams_Name_Field": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤ŸāĨ€ā¤Ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž", + "LDAP_Teams_Name_Field_Description": "LDAP ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤œā¤ŋā¤¸ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— Rocket.Chat ā¤•āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤¤āĨ‹ ā¤†ā¤Ē ā¤ā¤• ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤‚ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "LDAP_Timeout": "ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ (ā¤ā¤Žā¤ā¤¸)", + "LDAP_Timeout_Description": "ā¤•āĨ‹ā¤ˆ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤˛āĨŒā¤Ÿā¤žā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤–āĨ‹ā¤œ ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¤ā¤¨āĨ‡ ā¤ŽāĨ€ā¤˛ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "LDAP_Unique_Identifier_Field": "ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤Ēā¤šā¤šā¤žā¤¨ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "LDAP_Unique_Identifier_Field_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤”ā¤° ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤˛ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¸ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤†ā¤Ē ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤¸āĨ‡ ā¤ŽāĨ‚ā¤˛āĨā¤¯ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤•ā¤ˆ ā¤Žā¤žā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤\n ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤Žā¤žā¤¨ `ā¤‘ā¤ŦāĨā¤œāĨ‡ā¤•āĨā¤ŸGUID,ibm-entryUUID,GUID,dominoUNID,nsuniqueId,uidNumber` ā¤šāĨˆ", + "LDAP_User_Found": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Žā¤ŋā¤˛ā¤ž", + "LDAP_User_Search_AttributesToQuery": "ā¤•āĨā¤ĩāĨ‡ā¤°āĨ€ ā¤•āĨ‡ ā¤—āĨā¤Ŗ", + "LDAP_User_Search_AttributesToQuery_Description": "ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤ĒāĨā¤°ā¤ļāĨā¤¨āĨ‹ā¤‚ ā¤Ēā¤° ā¤•āĨŒā¤¨ ā¤¸āĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤ā¤ ā¤˛āĨŒā¤Ÿā¤žā¤ˆ ā¤œā¤žā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤, ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤šā¤° ā¤šāĨ€ā¤œā¤ŧ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ. `*` ā¤¸ā¤­āĨ€ ā¤¨ā¤ŋā¤¯ā¤Žā¤ŋā¤¤ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤¨ā¤ŋā¤§ā¤ŋā¤¤āĨā¤ĩ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤”ā¤° `+` ā¤¸ā¤­āĨ€ ā¤Ēā¤°ā¤ŋā¤šā¤žā¤˛ā¤¨ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤¨ā¤ŋā¤§ā¤ŋā¤¤āĨā¤ĩ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• Rocket.Chat ā¤¸ā¤ŋā¤‚ā¤• ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ€ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤•āĨ‹ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤•ā¤°ā¤¨ā¤ž ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "LDAP_User_Search_Field": "ā¤–āĨ‹ā¤œ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "LDAP_User_Search_Field_Description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤œāĨ‹ ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ€ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆāĨ¤ ā¤…ā¤§ā¤ŋā¤•ā¤žā¤‚ā¤ļ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž ā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤š ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą `sAMAccountName` ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤¯ā¤š ā¤…ā¤¨āĨā¤¯ LDAP ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨āĨ‹ā¤‚, ā¤œāĨˆā¤¸āĨ‡ OpenLDAP, ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `uid` ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤†ā¤Ē ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ€ ā¤‡ā¤šāĨā¤›ā¤ŋā¤¤ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `ā¤ŽāĨ‡ā¤˛` ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤\n ā¤†ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤œāĨˆā¤¸āĨ‡ ā¤•ā¤ˆ ā¤Ēā¤šā¤šā¤žā¤¨ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤•ā¤ˆ ā¤Žā¤žā¤¨āĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "LDAP_User_Search_Filter": "ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤°", + "LDAP_User_Search_Filter_Description": "ā¤¯ā¤Ļā¤ŋ ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•āĨ‡ā¤ĩā¤˛ ā¤‡ā¤¸ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤¸āĨ‡ ā¤ŽāĨ‡ā¤˛ ā¤–ā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤šāĨ€ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ€ ā¤œā¤žā¤ā¤—āĨ€āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤•āĨ‹ā¤ˆ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤†ā¤§ā¤žā¤° ā¤•āĨ‡ ā¤Ļā¤žā¤¯ā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤‚ā¤—āĨ‡āĨ¤\n ā¤œāĨˆā¤¸āĨ‡ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `memberOf=cn=ROCKET_CHAT,ou=ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯ ā¤¸ā¤ŽāĨ‚ā¤š`āĨ¤\n ā¤œāĨˆā¤¸āĨ‡ OpenLDAP (ā¤ā¤•āĨā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸ā¤ŋā¤Ŧā¤˛ ā¤ŽāĨˆā¤š ā¤¸ā¤°āĨā¤š) ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `ou:dn:=ROCKET_CHAT`āĨ¤", "LDAP_User_Search_Scope": "ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "LDAP_Username_Field": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "LDAP_Username_Field_Description": "ā¤¨ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¸ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— *ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž* ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž. ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨ‡ā¤œ ā¤Ēā¤° ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤‚āĨ¤\n ā¤†ā¤Ē ā¤ŸāĨ‡ā¤ŽāĨā¤ĒāĨā¤˛āĨ‡ā¤Ÿ ā¤ŸāĨˆā¤— ā¤•ā¤ž ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤œāĨˆā¤¸āĨ‡ `#{givenName}.#{sn}`.\n ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤Žā¤žā¤¨ `sAMAccountName` ā¤šāĨˆāĨ¤", + "LDAP_Username_To_Search": "ā¤–āĨ‹ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "LDAP_Validate_Teams_For_Each_Login": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŽāĨˆā¤Ēā¤ŋā¤‚ā¤— ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "LDAP_Validate_Teams_For_Each_Login_Description": "ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•āĨā¤¯ā¤ž ā¤šā¤° ā¤Ŧā¤žā¤° Rocket.Chat ā¤Ēā¤° ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤‡ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤•āĨ‡ā¤ĩā¤˛ ā¤‰ā¤¨ā¤•āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° ā¤šāĨ€ ā¤˛āĨ‹ā¤Ą ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Lead_capture_email_regex": "ā¤˛āĨ€ā¤Ą ā¤•āĨˆā¤ĒāĨā¤šā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤°āĨ‡ā¤—āĨ‡ā¤•āĨā¤¸", + "Lead_capture_phone_regex": "ā¤˛āĨ€ā¤Ą ā¤•āĨˆā¤ĒāĨā¤šā¤° ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤°āĨ‡ā¤—āĨ‡ā¤•āĨā¤¸", + "Learn_more": "ā¤”ā¤° ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_agents": "ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_canned_responses": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_contacts": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_current_chats": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_custom_fields": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_conversations": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_departments": "ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_managers": "ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_monitors": "ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_SLA_policies": "SLA ā¤¨āĨ€ā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_tags": "ā¤ŸāĨˆā¤— ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_triggers": "ā¤ŸāĨā¤°ā¤ŋā¤—ā¤°āĨā¤¸ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_units": "ā¤‡ā¤•ā¤žā¤‡ā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Learn_more_about_voice_channel": "ā¤ĩāĨ‰ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Least_recent_updated": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤šā¤žā¤˛ ā¤šāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Learn_how_to_unlock_the_myriad_possibilities_of_rocket_chat": "ā¤œā¤žā¤¨āĨ‡ā¤‚ ā¤•ā¤ŋ Rocket.Chat ā¤•āĨ€ ā¤…ā¤¸ā¤‚ā¤–āĨā¤¯ ā¤¸ā¤‚ā¤­ā¤žā¤ĩā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤•āĨˆā¤¸āĨ‡ ā¤…ā¤¨ā¤˛āĨ‰ā¤• ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤āĨ¤", + "Leave": "ā¤›āĨā¤ŸāĨā¤ŸāĨ€", + "Leave_a_comment": "ā¤ā¤• ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Leave_Group_Warning": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤¸ā¤ŽāĨ‚ā¤š \"%s\" ā¤›āĨ‹ā¤Ąā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Leave_Livechat_Warning": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ \"%s\" ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤›āĨ‹ā¤Ąā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Leave_Private_Warning": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ \"%s\" ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šā¤°āĨā¤šā¤ž ā¤›āĨ‹ā¤Ąā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Leave_room": "ā¤›āĨā¤ŸāĨā¤ŸāĨ€", + "Leave_Room_Warning": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤šāĨˆā¤¨ā¤˛ \"%s\" ā¤›āĨ‹ā¤Ąā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Leave_the_current_channel": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤šāĨˆā¤¨ā¤˛ ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Leave_the_description_field_blank_if_you_dont_want_to_show_the_role": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤¤āĨ‹ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤‚", + "leave-c": "ā¤šāĨˆā¤¨ā¤˛ ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "leave-c_description": "ā¤šāĨˆā¤¨ā¤˛ ā¤›āĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "leave-p": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "leave-p_description": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤›āĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Lets_get_you_new_one_": "ā¤†ā¤‡ā¤ ā¤†ā¤Ēā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤˛āĨ‡ā¤•ā¤° ā¤†ā¤ā¤‚!", + "License": "ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸", + "Line": "ā¤°āĨ‡ā¤–ā¤ž", + "Link": "ā¤œāĨ‹ā¤Ąā¤ŧā¤¨ā¤ž", + "Link_Preview": "ā¤˛ā¤ŋā¤‚ā¤• ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨", + "List_of_Channels": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€", + "List_of_departments_for_forward": "ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤Ŗ ā¤šāĨ‡ā¤¤āĨ ā¤…ā¤¨āĨā¤Žā¤¤ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ (ā¤ĩāĨˆā¤•ā¤˛āĨā¤Ēā¤ŋā¤•)", + "List_of_departments_for_forward_description": "ā¤‰ā¤¨ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ€ ā¤ā¤• ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤¸āĨ‚ā¤šāĨ€ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚ ā¤œāĨ‹ ā¤‡ā¤¸ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¸āĨ‡ ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "List_of_departments_to_apply_this_business_hour": "ā¤‡ā¤¸ ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤•āĨ‹ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€", + "List_of_Direct_Messages": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€", + "List_view": "ā¤˛ā¤ŋā¤¸āĨā¤Ÿ ā¤ĩāĨā¤¯āĨ‚", + "Livechat": "ā¤¸āĨ€ā¤§āĨ€ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Livechat_abandoned_rooms_action": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤Ēā¤°ā¤ŋā¤¤āĨā¤¯ā¤žā¤— ā¤•āĨ‹ ā¤•āĨˆā¤¸āĨ‡ ā¤¸ā¤‚ā¤­ā¤žā¤˛āĨ‡ā¤‚", + "Livechat_abandoned_rooms_closed_custom_message": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤œā¤Ŧ ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ā¤¤ā¤ž ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ ā¤•ā¤Žā¤°ā¤ž ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ", + "Livechat_agents": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "Livechat_Agents": "ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚", + "Livechat_allow_manual_on_hold": "ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Livechat_allow_manual_on_hold_Description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤Žā¤ŋā¤˛āĨ‡ā¤—ā¤ž", + "Livechat_allow_manual_on_hold_upon_agent_engagement_only": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¸ā¤‚ā¤˛ā¤—āĨā¤¨ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤šāĨ€ ā¤šāĨˆā¤Ÿ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤šā¤¤āĨ€ ā¤šāĨˆ", + "Livechat_allow_manual_on_hold_upon_agent_engagement_only_Description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤¤ā¤­āĨ€ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚ ā¤¯ā¤Ļā¤ŋ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ĩā¤šāĨ€ ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤¨āĨ‡ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤ž ā¤šāĨˆāĨ¤", + "Livechat_AllowedDomainsList": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤…ā¤¨āĨā¤Žā¤¤ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "Livechat_Appearance": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Livechat_auto_close_on_hold_chats_custom_message": "ā¤‘ā¤¨ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Livechat_auto_close_on_hold_chats_custom_message_Description": "ā¤œā¤Ŧ ā¤‘ā¤¨-ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤•ā¤Žā¤°ā¤ž ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ", + "Livechat_auto_close_on_hold_chats_timeout": "ā¤‘ā¤¨ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤•āĨā¤¯āĨ‚ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤•ā¤ŋā¤¤ā¤¨āĨ€ ā¤ĻāĨ‡ā¤° ā¤¤ā¤• ā¤‡ā¤‚ā¤¤ā¤œā¤žā¤° ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž?", + "Livechat_auto_close_on_hold_chats_timeout_Description": "ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤šāĨˆā¤Ÿ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¤ā¤• ā¤‘ā¤¨ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¤ā¤¨āĨ€ ā¤ĻāĨ‡ā¤° ā¤¤ā¤• ā¤°ā¤šāĨ‡ā¤—āĨ€āĨ¤ ā¤¸ā¤Žā¤¯ ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚", + "Livechat_auto_transfer_chat_timeout": "ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤¤āĨā¤¤ā¤°ā¤ŋā¤¤ ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ (ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚)āĨ¤", + "Livechat_auto_transfer_chat_timeout_Description": "ā¤¯ā¤š ā¤‡ā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤¤ā¤­āĨ€ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤Ŧ ā¤šāĨˆā¤Ÿ ā¤…ā¤­āĨ€ ā¤ļāĨā¤°āĨ‚ ā¤šāĨā¤ˆ ā¤šāĨ‹. ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤šā¤˛āĨ€ ā¤Ŧā¤žā¤° ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ, ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤¨ā¤ŋā¤—ā¤°ā¤žā¤¨āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤•āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Livechat_business_hour_type": "ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° (ā¤ā¤•ā¤˛ ā¤¯ā¤ž ā¤ā¤•ā¤žā¤§ā¤ŋā¤•)", + "Livechat_chat_transcript_sent": "ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž: {{transcript}}", + "Livechat_close_chat": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Livechat_custom_fields_options_placeholder": "ā¤ĒāĨ‚ā¤°āĨā¤ĩ-ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤Žā¤žā¤¨ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¤ā¤¤āĨā¤ĩāĨ‹ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤°ā¤ŋā¤•āĨā¤¤ ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Livechat_custom_fields_public_description": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤…ā¤¨āĨā¤ĒāĨā¤°ā¤¯āĨ‹ā¤—āĨ‹ā¤‚, ā¤œāĨˆā¤¸āĨ‡ ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ, ā¤†ā¤Ļā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Livechat_Dashboard": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą", + "Livechat_DepartmentOfflineMessageToChannel": "ā¤‡ā¤¸ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‡ ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Livechat_enable_message_character_limit": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĩā¤°āĨā¤Ŗ ā¤¸āĨ€ā¤Žā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Livechat_enabled": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Livechat_forward_open_chats": "ā¤–āĨā¤˛āĨ€ ā¤šāĨā¤ˆ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Livechat_forward_open_chats_timeout": "ā¤šāĨˆā¤Ÿ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ÿā¤žā¤‡ā¤Žā¤†ā¤‰ā¤Ÿ (ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚)āĨ¤", + "Livechat_guest_count": "ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤°", + "Livechat_Inquiry_Already_Taken": "ā¤“ā¤ŽāĨā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨ‚ā¤›ā¤¤ā¤žā¤› ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤˛āĨ‡ ā¤˛āĨ€ ā¤—ā¤ˆ ā¤šāĨˆ", + "Livechat_Installation": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤‡ā¤‚ā¤¸āĨā¤Ÿā¤žā¤˛āĨ‡ā¤ļā¤¨", + "Livechat_last_chatted_agent_routing": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤Ŧā¤žā¤° ā¤šāĨˆā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž", + "Livechat_last_chatted_agent_routing_Description": "ā¤¯ā¤Ļā¤ŋ ā¤šāĨˆā¤Ÿ ā¤ļāĨā¤°āĨ‚ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆ ā¤¤āĨ‹ ā¤˛ā¤žā¤¸āĨā¤Ÿ-ā¤šāĨˆā¤Ÿ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤‰ā¤¸ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤šāĨˆā¤Ÿ ā¤†ā¤ĩā¤‚ā¤Ÿā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤¨āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤‰ā¤¸āĨ€ ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ€ ā¤ĨāĨ€āĨ¤", + "Livechat_managers": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•", + "Livechat_Managers": "ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•āĨ‹ā¤‚", + "Livechat_max_queue_wait_time_action": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ā¤Ēā¤° ā¤•ā¤¤ā¤žā¤°ā¤Ŧā¤ĻāĨā¤§ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤•āĨˆā¤¸āĨ‡ ā¤¸ā¤‚ā¤­ā¤žā¤˛āĨ‡ā¤‚", + "Livechat_maximum_queue_wait_time": "ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯", + "Livechat_maximum_queue_wait_time_description": "ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤°ā¤–ā¤¨āĨ‡ ā¤•ā¤ž ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤Žā¤¯ (ā¤Žā¤ŋā¤¨ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚)āĨ¤ -1 ā¤•ā¤ž ā¤Žā¤¤ā¤˛ā¤Ŧ ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤šāĨˆ", + "Livechat_message_character_limit": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĩā¤°āĨā¤Ŗ ā¤¸āĨ€ā¤Žā¤ž", + "Livechat_monitors": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤°", + "Livechat_Monitors": "ā¤Ēā¤° ā¤¨ā¤œā¤ŧā¤° ā¤°ā¤–ā¤¤ā¤ž ā¤šāĨˆ", + "Livechat_offline": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨", + "Livechat_offline_message_sent": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž", + "Livechat_OfflineMessageToChannel_enabled": "ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Omnichannel_chat_closed_due_to_inactivity": "ā¤šāĨˆā¤Ÿ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ ā¤—ā¤ˆ ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤šā¤ŽāĨ‡ā¤‚ {{timeout}} ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ {{guest}} ā¤¸āĨ‡ ā¤•āĨ‹ā¤ˆ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Omnichannel_on_hold_chat_resumed": "ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤šāĨˆā¤Ÿ ā¤Ģā¤ŋā¤° ā¤¸āĨ‡ ā¤ļāĨā¤°āĨ‚: {{comment}}", + "Omnichannel_on_hold_chat_automatically": "{{guest}} ā¤¸āĨ‡ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤šāĨˆā¤Ÿ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤‘ā¤¨ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤¸āĨ‡ ā¤Ģā¤ŋā¤° ā¤¸āĨ‡ ā¤ļāĨā¤°āĨ‚ ā¤šāĨ‹ ā¤—ā¤ˆ ā¤ĨāĨ€", + "Omnichannel_on_hold_chat_resumed_manually": "ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤‘ā¤¨ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤¸āĨ‡ {{user}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ģā¤ŋā¤° ā¤¸āĨ‡ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤ž", + "Omnichannel_On_Hold_due_to_inactivity": "ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤ž ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤šā¤ŽāĨ‡ā¤‚ {{timeout}} ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ {{guest}} ā¤¸āĨ‡ ā¤•āĨ‹ā¤ˆ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž ā¤Ĩā¤ž", + "Omnichannel_On_Hold_manually": "ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ {{user}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤ž", + "Omnichannel_onHold_Chat": "ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–āĨ‡ā¤‚", + "Omnichannel_quick_actions": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¤āĨā¤ĩā¤°ā¤ŋā¤¤ ā¤•ā¤žā¤°āĨā¤¯ā¤ĩā¤žā¤šāĨ€", + "Omnichannel_sorting_disclaimer": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤ĒāĨ‹ā¤‚ ā¤•āĨ‹ {{sortingMechanism}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤•āĨā¤°ā¤Žā¤Ŧā¤ĻāĨā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ, ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤•ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Livechat_online": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤‘ā¤¨-ā¤˛ā¤žā¤‡ā¤¨", + "Omnichannel_placed_chat_on_hold": "ā¤šāĨˆā¤Ÿ ā¤‘ā¤¨ ā¤šāĨ‹ā¤˛āĨā¤Ą: {{comment}}", + "Omnichannel_hide_conversation_after_closing": "ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Omnichannel_hide_conversation_after_closing_description": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤†ā¤Ēā¤•āĨ‹ ā¤šāĨ‹ā¤Ž ā¤Ēā¤° ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Livechat_Queue": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤¤ā¤žā¤°", "Livechat_registration_form": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ", + "Livechat_registration_form_message": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨā¤°ā¤Ēā¤¤āĨā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Livechat_room_count": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Livechat_Routing_Method": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤°āĨ‚ā¤Ÿā¤ŋā¤‚ā¤— ā¤ĩā¤ŋā¤§ā¤ŋ", + "Livechat_status": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Livechat_Take_Confirm": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤‡ā¤¸ ā¤—āĨā¤°ā¤žā¤šā¤• ā¤•āĨ‹ ā¤˛āĨ‡ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Livechat_title": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ļāĨ€ā¤°āĨā¤ˇā¤•", + "Livechat_title_color": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤°ā¤‚ā¤—", + "Livechat_transcript_already_requested_warning": "ā¤‡ā¤¸ ā¤šāĨˆā¤Ÿ ā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤šāĨā¤•ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨ€ ā¤­āĨ‡ā¤œ ā¤ĻāĨ€ ā¤œā¤žā¤ā¤—āĨ€āĨ¤", + "Livechat_transcript_has_been_requested": "ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž. ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤•āĨā¤› ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤˛ā¤— ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚.", + "Livechat_email_transcript_has_been_requested": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ. ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤•āĨā¤› ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤˛ā¤— ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚.", + "Livechat_transcript_request_has_been_canceled": "ā¤šāĨˆā¤Ÿ ā¤ŸāĨā¤°ā¤žā¤‚ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤°ā¤ĻāĨā¤Ļ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "Livechat_transcript_sent": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž", + "Livechat_transfer_return_to_the_queue": "{{from}} ā¤¨āĨ‡ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨŒā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž", + "Livechat_transfer_return_to_the_queue_with_a_comment": "{{from}} ā¤¨āĨ‡ ā¤ā¤• ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨŒā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž: {{comment}}", + "Livechat_transfer_return_to_the_queue_auto_transfer_unanswered_chat": "{{from}} ā¤¨āĨ‡ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤žā¤Ēā¤¸ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤¯ā¤š {{period}} ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤¤ā¤• ā¤…ā¤¨āĨā¤¤āĨā¤¤ā¤°ā¤ŋā¤¤ ā¤ĨāĨ€", + "Livechat_transfer_to_agent": "{{from}} ā¤¨āĨ‡ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ {{to}} ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž", + "Livechat_transfer_to_agent_with_a_comment": "{{from}} ā¤¨āĨ‡ ā¤ā¤• ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ {{to}} ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž: {{comment}}", + "Livechat_transfer_to_agent_auto_transfer_unanswered_chat": "{{from}} ā¤¨āĨ‡ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ {{to}} ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤¯ā¤š {{period}} ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤¤ā¤• ā¤…ā¤¨āĨā¤¤āĨā¤¤ā¤°ā¤ŋā¤¤ ā¤ĨāĨ€", + "Livechat_transfer_to_department": "{{to}} ā¤¨āĨ‡ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž {{to}}", + "Livechat_transfer_to_department_with_a_comment": "{{to}} ā¤¨āĨ‡ ā¤ā¤• ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤žāĨ¤", + "Livechat_transfer_failed_fallback": "ā¤ŽāĨ‚ā¤˛ ā¤ĩā¤ŋā¤­ā¤žā¤— ({{from}} ) ā¤ŽāĨ‡ā¤‚ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤ ā¤šāĨˆā¤Ÿ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• {{to}} ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤šāĨ‹ ā¤—ā¤ˆ", + "Livechat_Triggers": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤°", + "Livechat_user_sent_chat_transcript_to_visitor": "{{agent}} ā¤¨āĨ‡ ā¤šāĨˆā¤Ÿ ā¤ŸāĨā¤°ā¤žā¤‚ā¤¸ā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•āĨ‹ {{guest}} ā¤•āĨ‹ ā¤­āĨ‡ā¤œā¤ž", + "Livechat_Users": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Livechat_Calls": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤•āĨ‰ā¤˛", + "Livechat_visitor_email_and_transcript_email_do_not_match": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤•ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤”ā¤° ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤āĨ‡", + "Livechat_visitor_transcript_request": "{{guest}} ā¤¨āĨ‡ ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž", + "LiveStream & Broadcasting": "ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤”ā¤° ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ", + "LiveStream & Broadcasting_Description": "Rocket.Chat ā¤”ā¤° YouTube ā¤˛ā¤žā¤‡ā¤ĩ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤¯ā¤š ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤šāĨˆā¤¨ā¤˛ ā¤Žā¤žā¤˛ā¤ŋā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤…ā¤‚ā¤Ļā¤° ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•āĨˆā¤Žā¤°ā¤ž ā¤Ģā¤ŧāĨ€ā¤Ą ā¤•āĨ‹ ā¤˛ā¤žā¤‡ā¤ĩ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Livestream": "ā¤˛ā¤žā¤‡ā¤ĩ ā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž", + "Livestream_close": "ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Livestream_enable_audio_only": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤ŽāĨ‹ā¤Ą ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Livestream_enabled": "ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Livestream_not_found": "ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Livestream_unavailable_for_federation": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛ā¤ŋā¤ĩāĨ‡ā¤¸āĨā¤ŸāĨā¤°ā¤Ž ā¤…ā¤¨āĨā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆ", + "Livestream_popout": "ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Livestream_source_changed_succesfully": "ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤¸āĨā¤°āĨ‹ā¤¤ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Livestream_switch_to_room": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤Ēā¤° ā¤¸āĨā¤ĩā¤ŋā¤š ā¤•ā¤°āĨ‡ā¤‚", + "Livestream_url": "ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤¸āĨā¤°āĨ‹ā¤¤ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Livestream_url_incorrect": "ā¤˛ā¤žā¤‡ā¤ĩā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤—ā¤ŧā¤˛ā¤¤ ā¤šāĨˆ", + "Livestream_live_now": "ā¤…ā¤Ŧ ā¤¸āĨ€ā¤§ā¤ž ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ!", + "Load_Balancing": "ā¤­ā¤žā¤° ā¤•ā¤ž ā¤¸ā¤‚ā¤¤āĨā¤˛ā¤¨", + "Load_more": "ā¤”ā¤° ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Load_Rotation": "ā¤˛āĨ‹ā¤Ą ā¤°āĨ‹ā¤ŸāĨ‡ā¤ļā¤¨", + "Loading": "ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Loading_more_from_history": "ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¸āĨ‡ ā¤”ā¤° ā¤…ā¤§ā¤ŋā¤• ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Loading_suggestion": "ā¤¸āĨā¤ā¤žā¤ĩ ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "Loading...": "ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ...", + "Local": "ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯", + "Local_Domains": "ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "Local_Password": "ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "Local_Time": "ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤¸ā¤Žā¤¯", + "Local_Timezone": "ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤¸ā¤Žā¤¯ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Local_Time_time": "ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤¸ā¤Žā¤¯: {{time}}", + "Localization": "ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ā¤•ā¤°ā¤Ŗ", + "Location": "ā¤œā¤—ā¤š", + "Log_Exceptions_to_Channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤ĩā¤žā¤Ļ ā¤˛āĨ‰ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Log_Exceptions_to_Channel_Description": "ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤œāĨ‹ ā¤¸ā¤­āĨ€ ā¤•āĨˆā¤ĒāĨā¤šā¤° ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤…ā¤Ēā¤ĩā¤žā¤Ļ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤ ā¤…ā¤Ēā¤ĩā¤žā¤ĻāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¨ā¤œā¤ŧā¤°ā¤…ā¤‚ā¤Ļā¤žā¤œ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", + "Log_File": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤”ā¤° ā¤˛ā¤žā¤‡ā¤¨ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Log_Level": "ā¤›ā¤žā¤‚ā¤Ÿā¤¨āĨ‡ ā¤•ā¤ž ā¤¸āĨā¤¤ā¤°", + "Log_Package": "ā¤ĒāĨˆā¤•āĨ‡ā¤œ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Log_Trace_Methods": "ā¤ŸāĨā¤°āĨ‡ā¤¸ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤•āĨ‰ā¤˛", + "Log_Trace_Methods_Filter": "ā¤ŸāĨā¤°āĨ‡ā¤¸ ā¤ĩā¤ŋā¤§ā¤ŋ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤°", + "Log_Trace_Methods_Filter_Description": "ā¤¯ā¤šā¤žā¤‚ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤ŽāĨ‚ā¤˛āĨā¤¯ā¤žā¤‚ā¤•ā¤¨ ā¤°āĨ‡ā¤—ā¤ā¤•āĨā¤¸ā¤ĒāĨ€ (`ā¤¨ā¤¯ā¤ž ā¤°āĨ‡ā¤—ā¤ā¤•āĨā¤¸ā¤ĒāĨ€('ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ')`) ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤•āĨ‰ā¤˛ ā¤•ā¤ž ā¤ŸāĨā¤°āĨ‡ā¤¸ ā¤Ļā¤ŋā¤–ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸āĨ‡ ā¤–ā¤žā¤˛āĨ€ ā¤°ā¤–āĨ‡ā¤‚āĨ¤", + "Log_Trace_Subscriptions": "ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤•āĨ‰ā¤˛ ā¤ŸāĨā¤°āĨ‡ā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Log_Trace_Subscriptions_Filter": "ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤ŸāĨā¤°āĨ‡ā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Log_Trace_Subscriptions_Filter_Description": "ā¤¯ā¤šā¤žā¤‚ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤ŽāĨ‚ā¤˛āĨā¤¯ā¤žā¤‚ā¤•ā¤¨ ā¤°āĨ‡ā¤—ā¤ā¤•āĨā¤¸ā¤ĒāĨ€ (`ā¤¨ā¤¯ā¤ž ā¤°āĨ‡ā¤—ā¤ā¤•āĨā¤¸ā¤ĒāĨ€('ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ')`) ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤•āĨ‰ā¤˛ ā¤•ā¤ž ā¤ŸāĨā¤°āĨ‡ā¤¸ ā¤Ļā¤ŋā¤–ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸āĨ‡ ā¤–ā¤žā¤˛āĨ€ ā¤°ā¤–āĨ‡ā¤‚āĨ¤", + "Log_View_Limit": "ā¤˛āĨ‰ā¤— ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤¸āĨ€ā¤Žā¤ž", + "Logged_Out_Banner_Text": "ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨āĨ‡ ā¤‡ā¤¸ ā¤‰ā¤Ēā¤•ā¤°ā¤Ŗ ā¤Ēā¤° ā¤†ā¤Ēā¤•ā¤ž ā¤¸ā¤¤āĨā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤žāĨ¤ ā¤œā¤žā¤°āĨ€ ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Logged_out_of_other_clients_successfully": "ā¤…ā¤¨āĨā¤¯ ā¤—āĨā¤°ā¤žā¤šā¤•āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "Login": "ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Log_in_to_sync": "ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Login_Attempts": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤ĩā¤ŋā¤Ģā¤˛", + "Login_Detected": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤šā¤˛ā¤ž", + "Logged_In_Via": "ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Login_Logs": "ā¤˛āĨ‰ā¤—ā¤‡ā¤¨ ā¤˛āĨ‰ā¤—āĨā¤¸", + "Login_Logs_ClientIp": "ā¤ĩā¤ŋā¤Ģā¤˛ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤˛āĨ‰ā¤— ā¤Ēā¤° ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤†ā¤ˆā¤ĒāĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Login_Logs_Enabled": "ā¤˛āĨ‰ā¤— (ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤Ēā¤°) ā¤ĩā¤ŋā¤Ģā¤˛ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸", + "Login_Logs_ForwardedForIp": "ā¤ĩā¤ŋā¤Ģā¤˛ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤˛āĨ‰ā¤— ā¤Ēā¤° ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤†ā¤ˆā¤ĒāĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Login_Logs_UserAgent": "ā¤ĩā¤ŋā¤Ģā¤˛ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤˛āĨ‰ā¤— ā¤Ēā¤° UserAgent ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Login_Logs_Username": "ā¤ĩā¤ŋā¤Ģā¤˛ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤˛āĨ‰ā¤— ā¤Ēā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Login_with": "%s ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Logistics": "ā¤°ā¤¸ā¤Ļ", + "Logout": "ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ", + "Logout_Others": "ā¤…ā¤¨āĨā¤¯ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Logout_Device": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Log_out_devices_remotely": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‚ā¤°ā¤¸āĨā¤Ĩ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "logout-device-management": "ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨", + "logout-device-management_description": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤¸āĨ‡ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "logout-other-user": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "logout-other-user_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Logs": "ā¤˛āĨ‰ā¤—āĨā¤¸", + "Logs_Description": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¸ā¤°āĨā¤ĩā¤° ā¤˛āĨ‰ā¤— ā¤•āĨˆā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Longest_chat_duration": "ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤˛ā¤‚ā¤ŦāĨ€ ā¤šāĨˆā¤Ÿ period", + "Longest_reaction_time": "ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤˛ā¤‚ā¤Ŧā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤Žā¤¯", + "Longest_response_time": "ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤˛ā¤‚ā¤Ŧā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤Žā¤¯", + "Looked_for": "ā¤ĸā¤ŧāĨ‚ā¤ĸā¤ŧā¤ž", + "Low": "ā¤•ā¤Ž", + "Lowest": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤¤ā¤Ž", + "Mail_Message_Invalid_emails": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤ā¤• ā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤ŋā¤ ā¤šāĨˆā¤‚: %s", + "Mail_Message_Missing_subject": "ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĩā¤ŋā¤ˇā¤¯ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž.", + "Mail_Message_Missing_to": "ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž ā¤¯ā¤ž ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤ā¤• ā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤āĨ‡ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤šāĨ‹ā¤‚ā¤—āĨ‡āĨ¤", + "Mail_Message_No_messages_selected_select_all": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤•āĨ‹ā¤ˆ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨā¤¨ā¤ž ā¤šāĨˆ", + "Mail_Messages": "ā¤ŽāĨ‡ā¤˛ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Mail_Messages_Instructions": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°ā¤•āĨ‡ ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤•āĨŒā¤¨ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤­āĨ‡ā¤œā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Mail_Messages_Subject": "ā¤¯ā¤šā¤žā¤‚ %s ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤­ā¤žā¤— ā¤šāĨˆ", + "mail-messages": "ā¤ŽāĨ‡ā¤˛ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "mail-messages_description": "ā¤ŽāĨ‡ā¤˛ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Mailer": "ā¤ŽāĨ‡ā¤˛ā¤°", + "Mailer_body_tags": "ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤¨ā¤¸ā¤ŦāĨā¤¸ā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ [ā¤…ā¤¨ā¤¸ā¤ŦāĨā¤¸ā¤•āĨā¤°ā¤žā¤‡ā¤Ŧ] ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž āĨ¤
    ā¤†ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¨ā¤žā¤Ž, ā¤ĒāĨā¤°ā¤Ĩā¤Ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[name]`, `[fname]`, `[lname]` ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤
    ā¤†ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ [ā¤ˆā¤ŽāĨ‡ā¤˛] ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Mailing": "ā¤Ąā¤žā¤•", + "Make_Admin": "ā¤ā¤Ąā¤Žā¤ŋā¤¨ ā¤Ŧā¤¨ā¤žā¤“", + "Make_sure_you_have_a_copy_of_your_codes_1": "ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•āĨ‹ā¤Ą ā¤•āĨ€ ā¤ā¤• ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤šāĨˆ:", + "Make_sure_you_have_a_copy_of_your_codes_2": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤• ā¤ā¤Ē ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤–āĨ‹ ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤†ā¤Ē ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¨ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤ā¤• ā¤•āĨ‹ā¤Ą ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Manage": "ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "manage-agent-extension-association": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤ā¤¸āĨ‹ā¤¸ā¤ŋā¤ā¤ļā¤¨ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "manage-agent-extension-association_description": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤ā¤¸āĨ‹ā¤¸ā¤ŋā¤ā¤ļā¤¨ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-apps": "ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤", + "manage-apps_description": "ā¤¸ā¤­āĨ€ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-assets": "ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "manage-assets_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-cloud": "ā¤Ŧā¤žā¤Ļā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-cloud_description": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Manage_Devices": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-email-inbox": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-email-inbox_description": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-emoji": "ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-emoji_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "messages_pruned": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤ā¤Ÿ ā¤•āĨ€ ā¤—ā¤ˆ", + "manage-incoming-integrations": "ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ā¤•āĨ€ā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-incoming-integrations_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤ā¤•āĨ€ā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-integrations": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-integrations_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-agents": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-agents_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-canned-responses": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-canned-responses_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-departments": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-departments_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-managers": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-managers_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-monitors": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤°āĨā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-monitors_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-priorities": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-priorities_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-sla": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ SLA ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-sla_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤ā¤¸ā¤ā¤˛ā¤ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-tags": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ŸāĨˆā¤— ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-tags_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ŸāĨˆā¤— ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-livechat-units": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤‡ā¤•ā¤žā¤‡ā¤¯āĨ‹ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "manage-livechat-units_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤‡ā¤•ā¤žā¤‡ā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-oauth-apps": "OAuth ā¤ā¤ĒāĨā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-oauth-apps_description": "ā¤¸ā¤°āĨā¤ĩā¤° OAuth ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-outgoing-integrations": "ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-outgoing-integrations_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ā¤•āĨ€ā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-own-incoming-integrations": "ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•āĨ‡ ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ā¤•āĨ€ā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-own-incoming-integrations_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•āĨ‡ ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¯ā¤ž ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤”ā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-own-integrations": "ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•āĨ‡ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-own-integrations_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•ā¤ž ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¯ā¤ž ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤”ā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-own-outgoing-integrations": "ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•āĨ‡ ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ā¤•āĨ€ā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-own-outgoing-integrations_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•āĨ‡ ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¯ā¤ž ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤”ā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-selected-settings": "ā¤•āĨā¤› ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚", + "manage-selected-settings_description": "ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ‹ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤œāĨ‹ ā¤¸āĨā¤Ēā¤ˇāĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ", + "manage-sounds": "ā¤§āĨā¤ĩā¤¨ā¤ŋā¤¯ā¤žā¤ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-sounds_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤§āĨā¤ĩā¤¨ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-the-app": "ā¤ā¤Ē ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-user-status": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-user-status_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-voip-call-settings": "ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‰ā¤˛ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-voip-call-settings_description": "ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‰ā¤˛ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-voip-contact-center-settings": "ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-voip-contact-center-settings_description": "ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Manage_Omnichannel": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Manage_workspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Manager_added": "ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Manager_removed": "ā¤ŽāĨˆā¤¨āĨ‡ā¤œā¤° ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Managers": "ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•āĨ‹ā¤‚", + "Manage_server_list": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‚ā¤šāĨ€ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Manage_servers": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Manage_which_devices": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•āĨŒā¤¨ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤•ā¤°ā¤Ŗ ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨ‹ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤†ā¤ˆā¤ĄāĨ€, ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤œāĨˆā¤¸āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆ ā¤”ā¤° ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤•āĨ‹ ā¤ĻāĨ‚ā¤°ā¤¸āĨā¤Ĩ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤•āĨā¤ˇā¤Žā¤¤ā¤ž ā¤­āĨ€ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆāĨ¤", + "Management_Server": "ā¤¤ā¤žā¤°ā¤žā¤‚ā¤•ā¤¨ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤‡ā¤‚ā¤Ÿā¤°ā¤Ģā¤ŧāĨ‡ā¤¸ (ā¤ā¤ā¤Žā¤†ā¤ˆ)", + "Managing_assets": "ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨", + "Managing_integrations": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨", + "Manual_Selection": "ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤šā¤¯ā¤¨", + "Manufacturing": "ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļā¤¨", + "MapView_Enabled": "ā¤ŽāĨˆā¤Ēā¤ĩāĨā¤¯āĨ‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "MapView_Enabled_Description": "ā¤ŽāĨˆā¤Ēā¤ĩāĨā¤¯āĨ‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤šāĨˆā¤Ÿ ā¤‡ā¤¨ā¤ĒāĨā¤Ÿ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‡ ā¤Ļā¤žā¤ˆā¤‚ ā¤“ā¤° ā¤ā¤• ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸ā¤žā¤ā¤ž ā¤Ŧā¤Ÿā¤¨ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "MapView_GMapsAPIKey": "ā¤—āĨ‚ā¤—ā¤˛ ā¤¸āĨā¤ŸāĨ‡ā¤Ÿā¤ŋā¤• ā¤ŽāĨˆā¤ĒāĨā¤¸ ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€", + "MapView_GMapsAPIKey_Description": "ā¤‡ā¤¸āĨ‡ Google ā¤ĄāĨ‡ā¤ĩā¤˛ā¤Ēā¤°āĨā¤¸ ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤¸āĨ‡ ā¤¨ā¤ŋā¤ƒā¤ļāĨā¤˛āĨā¤• ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Mark_all_as_read": "`%s` - ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ (ā¤¸ā¤­āĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚) ā¤Ēā¤ĸā¤ŧāĨ‡ ā¤—ā¤ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Mark_as_read": "ā¤Ēā¤ĸā¤ŧāĨ‡ ā¤šāĨā¤ ā¤•ā¤ž ā¤šā¤ŋā¤šāĨā¤¨", + "Mark_as_unread": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Mark_read": "ā¤Ēā¤ĸā¤ŧā¤ž ā¤šāĨā¤† ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Mark_unread": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤šā¤ŋā¤¨āĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‹", + "Marketplace": "ā¤Ŧā¤žā¤œā¤žā¤°", + "Marketplace_app_last_updated": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤Ŧā¤žā¤° ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž {{lastUpdated}}", + "Marketplace_view_marketplace": "ā¤Ŧā¤žā¤œā¤ŧā¤žā¤° ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "Marketplace_error": "ā¤‡ā¤‚ā¤Ÿā¤°ā¤¨āĨ‡ā¤Ÿ ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤¯ā¤ž ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "MAU_value": "ā¤šā¤ŽāĨ‡ā¤ļā¤ž {{price}}", + "Max_length_is": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤˛ā¤‚ā¤Ŧā¤žā¤ˆ %s ā¤šāĨˆ", + "Max_number_incoming_livechats_displayed": "ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤ĩā¤¸āĨā¤¤āĨā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Max_number_incoming_livechats_displayed_description": "(ā¤ĩāĨˆā¤•ā¤˛āĨā¤Ēā¤ŋā¤•) ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤†ā¤‡ā¤Ÿā¤ŽāĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žāĨ¤", + "Max_number_of_chats_per_agent": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž. ā¤ā¤• ā¤¸ā¤žā¤Ĩ ā¤šāĨˆā¤Ÿ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Max_number_of_chats_per_agent_description": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž. ā¤ā¤• ā¤¸ā¤žā¤Ĩ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤šāĨˆā¤Ÿ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤­ā¤žā¤— ā¤˛āĨ‡ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Max_number_of_uses": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Max_Retry": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤ĒāĨā¤¨ā¤ƒ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸", + "Maximum": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž", + "Maximum_number_of_guests_reached": "ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤œāĨā¤¯ā¤žā¤Ļā¤ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨ‡ā¤šā¤Žā¤žā¤¨ ā¤Ēā¤šāĨā¤‚ā¤šāĨ‡", + "Me": "ā¤ŽāĨā¤āĨ‡", + "Media": "ā¤Žā¤ŋā¤Ąā¤ŋā¤¯ā¤ž", + "Medium": "ā¤Žā¤§āĨā¤¯ā¤Ž", + "Members": "ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚", + "Members_List": "ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€", + "mention-all": "ā¤¸ā¤­āĨ€ ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°āĨ‡ā¤‚", + "mention-all_description": "@all ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Mentions_all_room_members": "ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Mentions_online_room_members": "ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Mentions_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Mentions_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤šāĨˆ", + "Mentions_you": "ā¤†ā¤Ēā¤•ā¤ž ā¤œā¤ŋā¤•āĨā¤° ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨ‚ā¤‚", + "mention-here": "ā¤¯ā¤šā¤žā¤‚ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°āĨ‡ā¤‚", + "mention-here_description": "@ā¤¯ā¤šā¤žā¤ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Mentions": "ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤šāĨˆ", + "Mentions_default": "ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– (ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ)", + "Mentions_only": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤šāĨˆ", + "Mentions_with_@_symbol": "@ ā¤šā¤ŋā¤¨āĨā¤š ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–", + "Mentions_with_@_symbol_description": "ā¤˛ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤¸ā¤‚ā¤šā¤žā¤° ā¤•āĨ€ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨā¤, ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤¯ā¤ž ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤”ā¤° ā¤šā¤žā¤‡ā¤˛ā¤žā¤‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤\n\nā¤œā¤Ŧ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤ŽāĨ‡ā¤‚ \"@\" ā¤ĒāĨā¤°ā¤¤āĨ€ā¤• ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤°āĨ€ā¤Ąā¤° ā¤•āĨ€ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇā¤Žā¤¤ā¤ž ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤ ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤°āĨ€ā¤Ąā¤° ā¤Ēā¤° ā¤­ā¤°āĨ‹ā¤¸ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‡ā¤¨ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–āĨ‹ā¤‚ ā¤•āĨ€ ā¤†ā¤¸ā¤žā¤¨āĨ€ ā¤¸āĨ‡ ā¤ĩāĨā¤¯ā¤žā¤–āĨā¤¯ā¤ž ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤‰ā¤¨ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Merge_Channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤Žā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Message_Description": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚.", + "Message_AllowBadWordsFilter": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤ŦāĨā¤°āĨ‡ ā¤ļā¤ŦāĨā¤ĻāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Message_AllowConvertLongMessagesToAttachment": "ā¤˛ā¤‚ā¤ŦāĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Message_AllowDeleting": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Message_AllowDeleting_BlockDeleteInMinutes": "(ā¤ā¤¨) ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Message_AllowDeleting_BlockDeleteInMinutes_Description": "ā¤…ā¤ĩā¤°āĨ‹ā¤§ā¤¨ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ 0 ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚.", + "Message_AllowDirectMessagesToYourself": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Message_AllowEditing": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Message_AllowEditing_BlockEditInMinutes": "(n) ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨ ā¤•āĨ‹ ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Message_AllowEditing_BlockEditInMinutesDescription": "ā¤…ā¤ĩā¤°āĨ‹ā¤§ā¤¨ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ 0 ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚.", + "Message_AllowPinning": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Message_AllowPinning_Description": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤Ēā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚āĨ¤", + "Message_AllowStarring": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤¤ā¤žā¤°ā¤žā¤‚ā¤•ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Message_AllowUnrecognizedSlashCommand": "ā¤…ā¤œāĨā¤žā¤žā¤¤ ā¤¸āĨā¤˛āĨˆā¤ļ ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Message_Already_Sent": "ā¤¯ā¤š ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤­āĨ‡ā¤œā¤ž ā¤œā¤ž ā¤šāĨā¤•ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Message_AlwaysSearchRegExp": "ā¤šā¤ŽāĨ‡ā¤ļā¤ž RegExp ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Message_AlwaysSearchRegExp_Description": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ€ ā¤­ā¤žā¤ˇā¤ž [MongoDB ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤¸ā¤°āĨā¤š](https://docs.mongodb.org/manual/reference/text-search-ā¤­ā¤žā¤ˇā¤žā¤“ā¤‚/#text-search-ā¤­ā¤žā¤ˇā¤žā¤“ā¤‚) ā¤Ēā¤° ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤šā¤Ž `True` ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤ļā¤‚ā¤¸ā¤ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Message_Attachments": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤•", + "Message_Attachments_Thumbnails_Enabled": "ā¤ŦāĨˆā¤‚ā¤Ąā¤ĩā¤ŋā¤Ĩ ā¤•āĨ‹ ā¤Ŧā¤šā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤›ā¤ĩā¤ŋ ā¤Ĩā¤‚ā¤Ŧā¤¨āĨ‡ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Message_Attachments_Thumbnails_Width": "ā¤Ĩā¤‚ā¤Ŧā¤¨āĨ‡ā¤˛ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤šāĨŒā¤Ąā¤ŧā¤žā¤ˆ (ā¤Ēā¤ŋā¤•āĨā¤¸āĨ‡ā¤˛ ā¤ŽāĨ‡ā¤‚)", + "Message_Attachments_Thumbnails_Height": "ā¤Ĩā¤‚ā¤Ŧā¤¨āĨ‡ā¤˛ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤Šā¤‚ā¤šā¤žā¤ˆ (ā¤Ēā¤ŋā¤•āĨā¤¸āĨ‡ā¤˛ ā¤ŽāĨ‡ā¤‚)", + "Message_with_attachment": "ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Report_sent": "ā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤­āĨ‡ā¤œāĨ€ ā¤—ā¤ˆ", + "Message_Attachments_Thumbnails_EnabledDesc": "ā¤ŦāĨˆā¤‚ā¤Ąā¤ĩā¤ŋā¤Ĩ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ‹ ā¤•ā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŽāĨ‚ā¤˛ ā¤›ā¤ĩā¤ŋ ā¤•āĨ‡ ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ēā¤° ā¤Ĩā¤‚ā¤Ŧā¤¨āĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤¸āĨā¤¤āĨā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤ ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤•āĨ‡ ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤†ā¤—āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤†ā¤‡ā¤•ā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤ŽāĨ‚ā¤˛ ā¤°ā¤ŋā¤œā¤ŧāĨ‰ā¤˛āĨā¤¯āĨ‚ā¤ļā¤¨ ā¤ĩā¤žā¤˛āĨ€ ā¤›ā¤ĩā¤ŋā¤¯ā¤žā¤‚ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤œā¤ž ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "Message_Attachments_Strip_Exif": "ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤¸āĨ‡ EXIF ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤šā¤Ÿā¤žā¤ā¤", + "Message_Attachments_Strip_ExifDescription": "ā¤›ā¤ĩā¤ŋ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ (jpeg, tiff, ā¤†ā¤Ļā¤ŋ) ā¤¸āĨ‡ EXIF ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩāĨā¤¯ā¤žā¤ĒāĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ EXIF ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "Message_Audio": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Message_Audio_bitRate": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ŧā¤ŋā¤Ÿ ā¤Ļā¤°", + "Message_AudioRecorderEnabled": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ąā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Message_AudioRecorderEnabled_Description": "'ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą' ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ā¤°āĨā¤—ā¤¤ 'ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹/ā¤ā¤Žā¤ĒāĨ€3' ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤• ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤šāĨ‹ā¤¨ā¤ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆāĨ¤", + "Message_Audio_Recording_Disabled": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ąā¤ŋā¤‚ā¤— ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•āĨ€ ā¤—ā¤ˆ", + "Message_auditing": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Message_auditing_log": "ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤˛āĨ‰ā¤—", + "Message_BadWordsFilterList": "ā¤ŦāĨā¤°āĨ‡ ā¤ļā¤ŦāĨā¤ĻāĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤žā¤˛āĨ€ ā¤¸āĨ‚ā¤šāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Message_BadWordsFilterListDescription": "ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŦāĨā¤°āĨ‡ ā¤ļā¤ŦāĨā¤ĻāĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Message_BadWordsWhitelist": "ā¤ŦāĨā¤˛āĨˆā¤•ā¤˛ā¤ŋā¤¸āĨā¤Ÿ ā¤¸āĨ‡ ā¤ļā¤ŦāĨā¤Ļ ā¤šā¤Ÿā¤žā¤ā¤", + "Message_BadWordsWhitelistDescription": "ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ļā¤ŦāĨā¤ĻāĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Message_Characther_Limit": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĩā¤°āĨā¤Ŗ ā¤¸āĨ€ā¤Žā¤ž", + "Message_Code_highlight": "ā¤•āĨ‹ā¤Ą ā¤šā¤žā¤‡ā¤˛ā¤žā¤‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤­ā¤žā¤ˇā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€", + "Message_Code_highlight_Description": "ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤­ā¤žā¤ˇā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ (ā¤¸ā¤­āĨ€ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ ā¤­ā¤žā¤ˇā¤žā¤ā¤‚ [highlight.js](https://github.com/highlightjs/highlight.js/tree/11.6.0#supported-ā¤­ā¤žā¤ˇā¤žā¤ā¤‚) ā¤Ēā¤°) ā¤œā¤ŋā¤¨ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ‹ā¤Ą ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•āĨ‹ ā¤šā¤žā¤‡ā¤˛ā¤žā¤‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "Message_CustomDomain_AutoLink": "ā¤‘ā¤ŸāĨ‹ ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤ļāĨā¤ĩāĨ‡ā¤¤ā¤¸āĨ‚ā¤šāĨ€", + "Message_CustomDomain_AutoLink_Description": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē `https://internaltool.intranet` ā¤¯ā¤ž `internaltool.intranet` ā¤œāĨˆā¤¸āĨ‡ ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‹ ā¤‘ā¤ŸāĨ‹ ā¤˛ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤†ā¤Ēā¤•āĨ‹ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤ŽāĨ‡ā¤‚ `ā¤‡ā¤‚ā¤ŸāĨā¤°ā¤žā¤¨āĨ‡ā¤Ÿ` ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž, ā¤•ā¤ˆ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤•āĨ‹ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "message_counter": "{{counter}} ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Message_DateFormat": "ā¤¤ā¤žā¤°ā¤ŋā¤– ā¤•ā¤ž ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē", + "Message_DateFormat_Description": "ā¤¯ā¤š ā¤­āĨ€ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚: [Moment.js](http://momentjs.com/docs/#/displaying/format/)", + "Message_deleting_blocked": "ā¤¯ā¤š ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤Ŧ ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž", + "Message_editing": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨", + "Message_ErasureType": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Žā¤ŋā¤Ÿā¤žā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "Message_ErasureType_Delete": "ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤ā¤", + "Message_ErasureType_Description": "ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤‰ā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤•āĨā¤¯ā¤ž ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨˆ ā¤œāĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤šā¤Ÿā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤\n - **ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤”ā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤°ā¤–āĨ‡ā¤‚:** ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤”ā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤…ā¤¨āĨā¤¯ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤°ā¤–ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤\n - **ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤ā¤‚:** ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤”ā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤œā¤žā¤ā¤‚ā¤—āĨ€ ā¤”ā¤° ā¤…ā¤Ŧ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤¨ā¤ž ā¤¸ā¤‚ā¤­ā¤ĩ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤žāĨ¤\n - **ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤”ā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤˛ā¤ŋā¤‚ā¤• ā¤šā¤Ÿā¤žā¤ā¤‚:** ā¤¯ā¤š ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤”ā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ Rocket.Cat ā¤ŦāĨ‰ā¤Ÿ ā¤•āĨ‹ ā¤¸āĨŒā¤‚ā¤Ē ā¤ĻāĨ‡ā¤—ā¤ž ā¤”ā¤° ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Message_ErasureType_Keep": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤”ā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤°ā¤–āĨ‡ā¤‚", + "Message_ErasureType_Unlink": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤”ā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤˛ā¤ŋā¤‚ā¤• ā¤šā¤Ÿā¤žā¤ā¤", + "Message_GlobalSearch": "ā¤ĩāĨˆā¤ļāĨā¤ĩā¤ŋā¤• ā¤–āĨ‹ā¤œ", + "Message_GroupingPeriod": "ā¤¸ā¤ŽāĨ‚ā¤šāĨ€ā¤•ā¤°ā¤Ŗ period (ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚)", + "Message_GroupingPeriodDescription": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤ŽāĨ‚ā¤šāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž ā¤¯ā¤Ļā¤ŋ ā¤ĻāĨ‹ā¤¨āĨ‹ā¤‚ ā¤ā¤• ā¤šāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤ŦāĨ€ā¤¤ā¤ž ā¤šāĨā¤† ā¤¸ā¤Žā¤¯ ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤¸ā¤Žā¤¯ ā¤¸āĨ‡ ā¤•ā¤Ž ā¤Ĩā¤žāĨ¤", + "Message_has_been_edited": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_has_been_edited_at": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ {{date}} ā¤Ēā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_has_been_edited_by": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ {{username}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_has_been_edited_by_at": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ {{username}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž {{date}} ā¤Ēā¤° ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_has_been_forwarded": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_has_been_pinned": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤ŋā¤¨ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_has_been_starred": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¤ā¤žā¤°ā¤žā¤‚ā¤•ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_has_been_unpinned": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤¨ā¤Ēā¤ŋā¤¨ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_has_been_unstarred": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤¤ā¤žā¤°ā¤žā¤‚ā¤•ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Message_HideType_au": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ ā¤—ā¤\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_added_user_to_team": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_mute_unmute": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ/ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "Message_HideType_r": "\"ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_rm": "\"ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_allowed_reacting": "\"ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_archived": "\"ā¤•ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_changed_avatar": "\"ā¤•ā¤•āĨā¤ˇ ā¤•ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ŧā¤Ļā¤˛ ā¤—ā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_changed_privacy": "\"ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤Ŧā¤Ļā¤˛ ā¤—ā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_changed_topic": "\"ā¤•ā¤•āĨā¤ˇ ā¤•ā¤ž ā¤ĩā¤ŋā¤ˇā¤¯ ā¤Ŧā¤Ļā¤˛ ā¤—ā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_disallowed_reacting": "\"ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_enabled_encryption": "\"ā¤•ā¤•āĨā¤ˇ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_disabled_encryption": "\"ā¤•ā¤•āĨā¤ˇ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤…ā¤•āĨā¤ˇā¤Ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_set_read_only": "\"ā¤°āĨ‚ā¤Ž ā¤¸āĨ‡ā¤Ÿ ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_removed_read_only": "\"ā¤•ā¤Žā¤°ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤˛āĨ‡ā¤–ā¤¨ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_room_unarchived": "\"ā¤•ā¤•āĨā¤ˇ ā¤…ā¤¨ā¤žā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_ru": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¨ā¤ŋā¤•ā¤žā¤˛āĨ‡ ā¤—ā¤\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_removed_user_from_team": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ ā¤¨ā¤ŋā¤•ā¤žā¤˛ā¤ž ā¤—ā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_subscription_role_added": "\"ā¤•āĨā¤¯ā¤ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤ĨāĨ€\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_subscription_role_removed": "\"ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤…ā¤Ŧ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_uj": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨā¤Ąā¤ŧāĨ‡ā¤‚\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_ujt": "\"ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_ul": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "Message_HideType_ult": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ŧā¤žā¤ā¤ ā¤ŸāĨ€ā¤Ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_user_added_room_to_team": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤•ā¤Žā¤°ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_user_converted_to_channel": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤ŸāĨ€ā¤Ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "Message_HideType_user_converted_to_team": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤šāĨˆā¤¨ā¤˛\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "Message_HideType_user_deleted_room_from_team": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤•ā¤Žā¤°ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_user_removed_room_from_team": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨āĨ‡ ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Žā¤°ā¤ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "Message_HideType_changed_description": "\"ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤Ŧā¤Ļā¤˛ ā¤—ā¤¯ā¤ž\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_changed_announcement": "\"ā¤•ā¤•āĨā¤ˇ ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤ŽāĨ‡ā¤‚\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_ut": "\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤ŽāĨā¤Žā¤ŋā¤˛ā¤ŋā¤¤ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_HideType_wm": "\"ā¤¸āĨā¤ĩā¤žā¤—ā¤¤\" ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Message_Id": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤ˆā¤ĄāĨ€", + "Message_Ignored": "ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤¨ā¤œā¤°ā¤…ā¤‚ā¤Ļā¤žā¤œ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "message-impersonate": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤°āĨ‚ā¤Ēā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "message-impersonate_description": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤°āĨ‚ā¤Ēā¤Ŗ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Message_info": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Message_KeepHistory": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤°ā¤–āĨ‡ā¤‚", + "Message_MaxAll": "ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤šāĨˆā¤¨ā¤˛ ā¤†ā¤•ā¤žā¤°", + "Message_MaxAllowedSize": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤…ā¤¨āĨā¤Žā¤¤ ā¤ĩā¤°āĨā¤Ŗ", + "Message_pinning": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤ŋā¤¨ ā¤•ā¤°ā¤¨ā¤ž", + "message_pruned": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•ā¤žā¤Ÿ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Message_QuoteChainLimit": "ā¤œā¤‚ā¤œāĨ€ā¤°ā¤Ļā¤žā¤° ā¤‰ā¤ĻāĨā¤§ā¤°ā¤ŖāĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Message_Read_Receipt_Enabled": "ā¤Ēā¤ĸā¤ŧāĨ€ ā¤—ā¤ˆ ā¤°ā¤¸āĨ€ā¤ĻāĨ‡ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Message_Read_Receipt_Store_Users": "ā¤ĩā¤ŋā¤¸āĨā¤¤āĨƒā¤¤ ā¤Ēā¤ ā¤¨ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ā¤ŋā¤¯ā¤žā¤", + "Message_Read_Receipt_Store_Users_Description": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ€ ā¤Ēā¤ĸā¤ŧāĨ€ ā¤—ā¤ˆ ā¤°ā¤¸āĨ€ā¤ĻāĨ‡ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆ", + "Message_removed": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Message_is_removed": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Message_sent_by_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Message_ShowDeletedStatus": "ā¤šā¤Ÿā¤žā¤ˆ ā¤—ā¤ˆ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Message_Formatting_Toolbox": "ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤ŽāĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ŸāĨ‚ā¤˛ā¤ŦāĨ‰ā¤•āĨā¤¸", + "Message_composer_toolbox_primary_actions": "ā¤¸ā¤‚ā¤—āĨ€ā¤¤ā¤•ā¤žā¤° ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤", + "Message_composer_toolbox_secondary_actions": "ā¤¸ā¤‚ā¤—āĨ€ā¤¤ā¤•ā¤žā¤° ā¤Žā¤žā¤§āĨā¤¯ā¤Žā¤ŋā¤• ā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤", + "Message_starring": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤­ā¤ŋā¤¨āĨ€ā¤¤", + "Message_Time": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "Message_TimeAndDateFormat": "ā¤¸ā¤Žā¤¯ ā¤”ā¤° ā¤Ļā¤ŋā¤¨ā¤žā¤‚ā¤• ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē", + "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": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ŧā¤šāĨā¤¤ ā¤˛ā¤‚ā¤Ŧā¤ž ā¤šāĨˆ", + "Message_UserId": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ēā¤šā¤šā¤žā¤¨", + "Message_view_mode_info": "ā¤‡ā¤¸ā¤¸āĨ‡ ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤Ēā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤˛āĨ€ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤œā¤—ā¤š ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤Ŧā¤Ļā¤˛ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Message_VideoRecorderEnabled": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ąā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Message_Video_Recording_Disabled": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ąā¤ŋā¤‚ā¤— ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•āĨ€ ā¤—ā¤ˆ", + "MessageBox_view_mode": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤ŽāĨ‹ā¤Ą", + "Message_VideoRecorderEnabledDescription": "'ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą' ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ā¤°āĨā¤—ā¤¤ 'ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹/ā¤ĩāĨ‡ā¤Ŧā¤ā¤Ž' ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤• ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤šāĨ‹ā¤¨ā¤ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆāĨ¤", + "messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚", + "Messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚", + "Messages_selected": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤¯ā¤¨ā¤ŋā¤¤", + "Messages_sent": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤", + "Messages_that_are_sent_to_the_Incoming_WebHook_will_be_posted_here": "ā¤‡ā¤¨ā¤•ā¤Žā¤ŋā¤‚ā¤— ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤Ēā¤° ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¯ā¤šā¤žā¤‚ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Meta": "ā¤ŽāĨ‡ā¤Ÿā¤ž", + "Meta_Description": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ŽāĨ‡ā¤Ÿā¤ž ā¤—āĨā¤Ŗ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚.", + "Meta_custom": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ŽāĨ‡ā¤Ÿā¤ž ā¤ŸāĨˆā¤—", + "Meta_fb_app_id": "ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤• ā¤ā¤Ē ā¤†ā¤ˆā¤ĄāĨ€", + "Meta_google-site-verification": "Google ā¤¸ā¤žā¤‡ā¤Ÿ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨", + "Meta_language": "ā¤­ā¤žā¤ˇā¤ž", + "Meta_msvalidate01": "MSValidate.01", + "Meta_robots": "ā¤°āĨ‹ā¤ŦāĨ‹ā¤ŸāĨ‹ā¤‚", + "meteor_status_connected": "ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤šāĨā¤", + "meteor_status_connecting": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨ‹ ā¤°ā¤šā¤ž ā¤šāĨˆ...", + "meteor_status_failed": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤°ā¤šā¤ž", + "meteor_status_offline": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤ŽāĨ‹ā¤ĄāĨ¤", + "meteor_status_reconnect_in": "ā¤ā¤• ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨ‚ā¤...", + "meteor_status_try_now_offline": "ā¤ĒāĨā¤¨ā¤ƒ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "meteor_status_try_now_waiting": "ā¤…ā¤Ŧ ā¤•āĨ‹ā¤ļā¤ŋā¤ļ ā¤•ā¤°āĨ‹", + "meteor_status_waiting": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤ŽāĨ‡ā¤‚,", + "Method": "ā¤¤ā¤°āĨ€ā¤•ā¤ž", + "Mic_on": "ā¤Žā¤žā¤‡ā¤• ā¤‘ā¤¨", + "Microphone": "ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤Ģā¤ŧāĨ‹ā¤¨", + "Microphone_access_not_allowed": "ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤ĨāĨ€, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ€ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤œā¤žā¤‚ā¤šāĨ‡ā¤‚āĨ¤", + "Mic_off": "ā¤Žā¤žā¤‡ā¤• ā¤Ŧā¤‚ā¤Ļ", + "Min_length_is": "ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ā¤˛ā¤‚ā¤Ŧā¤žā¤ˆ %s ā¤šāĨˆ", + "Minimum": "ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž", + "Minimum_balance": "ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ā¤ļāĨ‡ā¤ˇ", + "minute": "ā¤Žā¤ŋā¤¨ā¤Ÿ", + "minutes": "ā¤Žā¤ŋā¤¨ā¤Ÿ", + "Missing_configuration": "ā¤…ā¤¨āĨā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨", + "Mobex_sms_gateway_address": "ā¤ŽāĨ‹ā¤ŦāĨ‡ā¤•āĨā¤¸ ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡ ā¤Ēā¤¤ā¤ž", + "Mobex_sms_gateway_address_desc": "ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤†ā¤Ēā¤•āĨ€ ā¤ŽāĨ‹ā¤ŦāĨ‡ā¤•āĨā¤¸ ā¤¸āĨ‡ā¤ĩā¤ž ā¤•ā¤ž ā¤†ā¤ˆā¤ĒāĨ€ ā¤¯ā¤ž ā¤šāĨ‹ā¤¸āĨā¤ŸāĨ¤ ā¤œāĨˆā¤¸āĨ‡ `http://192.168.1.1:1401` ā¤¯ā¤ž `https://www.example.com:1401`", + "Mobex_sms_gateway_from_number": "ā¤¸āĨ‡", + "Mobex_sms_gateway_from_number_desc": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤¨ā¤¯ā¤ž ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤­āĨ‡ā¤œā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ŽāĨ‚ā¤˛ ā¤Ēā¤¤ā¤ž/ā¤ĢāĨ‹ā¤¨ ā¤¨ā¤‚ā¤Ŧā¤°", + "Mobex_sms_gateway_from_numbers_list": "ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤‚ā¤Ŧā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€", + "Mobex_sms_gateway_from_numbers_list_desc": "ā¤Ŧā¤ŋā¤˛āĨā¤•āĨā¤˛ ā¤¨ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‚ā¤šāĨ€, ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤ 123456789, 123456788, 123456888", + "Mobex_sms_gateway_password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "Mobex_sms_gateway_restful_address": "ā¤ŽāĨ‹ā¤ŦāĨ‡ā¤•āĨā¤¸ ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤°āĨ‡ā¤¸āĨā¤Ÿ ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤Ēā¤¤ā¤ž", + "Mobex_sms_gateway_restful_address_desc": "ā¤†ā¤Ēā¤•āĨ‡ Mobex REST API ā¤•ā¤ž IP ā¤¯ā¤ž ā¤šāĨ‹ā¤¸āĨā¤ŸāĨ¤ ā¤œāĨˆā¤¸āĨ‡ `http://192.168.1.1:8080` ā¤¯ā¤ž `https://www.example.com:8080`", + "Mobex_sms_gateway_username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "Mobile": "ā¤—ā¤¤ā¤ŋā¤Žā¤žā¤¨", + "Mobile_apps": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤•āĨā¤ˇāĨā¤§ā¤ž", + "Mobile_Description": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤‰ā¤Ēā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤° ā¤•āĨ‹ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "mobile-upload-file": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤‰ā¤Ēā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤Ēā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "mobile-upload-file_description": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤‰ā¤Ēā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤Ēā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", "Mobile_Push_Notifications_Default_Alert": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", + "Moderation": "ā¤¸ā¤‚ā¤¯ā¤Ž", + "Moderation_Show_reports": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Moderation_Go_to_message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤° ā¤œā¤žā¤ā¤", + "Moderation_Delete_message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤‚", + "Moderation_Dismiss_and_delete": "ā¤–ā¤ŧā¤žā¤°ā¤ŋā¤œ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤šā¤Ÿā¤žā¤ā¤‚", + "Moderation_Delete_this_message": "ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤‚", + "Moderation_Message_context_header": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Moderation_Message_deleted": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤”ā¤° ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤–ā¤žā¤°ā¤ŋā¤œ ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆā¤‚", + "Moderation_Messages_deleted": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤”ā¤° ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤–ā¤žā¤°ā¤ŋā¤œ ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆā¤‚", + "Moderation_Action_View_reports": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "Moderation_Hide_reports": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "Moderation_Dismiss_all_reports": "ā¤¸ā¤­āĨ€ ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤–ā¤žā¤°ā¤ŋā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Moderation_Deactivate_User": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "Moderation_User_deactivated": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Moderation_Delete_all_messages": "ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šā¤Ÿā¤žā¤ā¤", + "Moderation_Dismiss_reports": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤–ā¤žā¤°ā¤ŋā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Moderation_Duplicate_messages": "ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Moderation_Duplicate_messages_warning": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ˆ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤¸ā¤Žā¤žā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Moderation_Report_date": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤¤ā¤ŋā¤Ĩā¤ŋ", + "Moderation_Reported_message": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Moderation_Reports_dismissed": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤–ā¤žā¤°ā¤ŋā¤œ ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆā¤‚", + "Moderation_Message_already_deleted": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Moderation_Reset_user_avatar": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Moderation_See_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "Moderation_Avatar_reset_success": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ", + "Moderation_Dismiss_reports_confirm": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤ŸāĨ‡ā¤‚ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤œā¤žā¤ā¤‚ā¤—āĨ€ ā¤”ā¤° ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž.", + "Moderation_Dismiss_all_reports_confirm": "ā¤¸ā¤­āĨ€ ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤ŸāĨ‡ā¤‚ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤œā¤žā¤ā¤‚ā¤—āĨ€ ā¤”ā¤° ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤‚ā¤—āĨ‡.", + "Moderation_Are_you_sure_you_want_to_delete_this_message": "ā¤¯ā¤š ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‰ā¤¸ā¤•āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤•āĨā¤ˇ ā¤¸āĨ‡ ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž ā¤”ā¤° ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤–ā¤žā¤°ā¤ŋā¤œ ā¤•ā¤° ā¤ĻāĨ€ ā¤œā¤žā¤ā¤—āĨ€āĨ¤", + "Moderation_Are_you_sure_you_want_to_reset_the_avatar": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•āĨ‹ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤‰ā¤¨ā¤•ā¤ž ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿ ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Moderation_Are_you_sure_you_want_to_deactivate_this_user": "ā¤ĒāĨā¤¨ā¤ƒ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤—ā¤žāĨ¤ ā¤¸ā¤­āĨ€ ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤Žā¤°āĨ‡ ā¤¸āĨ‡ ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Moderation_Are_you_sure_you_want_to_delete_all_reported_messages_from_this_user": "ā¤‡ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤Žā¤°āĨ‡ ā¤¸āĨ‡ ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž ā¤”ā¤° ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤–ā¤žā¤°ā¤ŋā¤œ ā¤•ā¤° ā¤ĻāĨ€ ā¤œā¤žā¤ā¤—āĨ€āĨ¤", + "Moderation_User_deleted_warning": "ā¤œā¤ŋā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤ž ā¤Ĩā¤ž ā¤ĩā¤š ā¤…ā¤Ŧ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤¯ā¤ž ā¤‰ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "Monday": "ā¤¸āĨ‹ā¤Žā¤ĩā¤žā¤°", + "Mongo_storageEngine": "ā¤ŽāĨ‹ā¤‚ā¤—āĨ‹ ā¤¸āĨā¤ŸāĨ‹ā¤°āĨ‡ā¤œ ā¤‡ā¤‚ā¤œā¤¨", + "Mongo_version": "ā¤Žā¤žā¤¨ā¤—āĨ‹ ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "MongoDB": "MongoDB", + "MongoDB_Deprecated": "MongoDB ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤", + "MongoDB_version_s_is_deprecated_please_upgrade_your_installation": "MongoDB ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ %s ā¤…ā¤ĒāĨā¤°ā¤šā¤˛ā¤ŋā¤¤ ā¤šāĨˆ, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨ā¤ž ā¤‡ā¤‚ā¤¸āĨā¤Ÿā¤žā¤˛āĨ‡ā¤ļā¤¨ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Monitor_added": "ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "Monitor_new_and_suspicious_logins": "ā¤¨ā¤ ā¤”ā¤° ā¤¸ā¤‚ā¤Ļā¤ŋā¤—āĨā¤§ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•āĨ€ ā¤¨ā¤ŋā¤—ā¤°ā¤žā¤¨āĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "Monitor_history_for_changes_on": "ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤•āĨ€ ā¤¨ā¤ŋā¤—ā¤°ā¤žā¤¨āĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "Monitor_removed": "ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Monitors": "ā¤Ēā¤° ā¤¨ā¤œā¤ŧā¤° ā¤°ā¤–ā¤¤ā¤ž ā¤šāĨˆ", + "Monthly_Active_Users": "ā¤Žā¤žā¤¸ā¤ŋā¤• ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "More": "ā¤…ā¤§ā¤ŋā¤•", + "More_channels": "ā¤…ā¤§ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛", + "More_direct_messages": "ā¤…ā¤§ā¤ŋā¤• ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "More_groups": "ā¤…ā¤§ā¤ŋā¤• ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š", + "More_unreads": "ā¤…ā¤§ā¤ŋā¤• ā¤…ā¤Ēā¤ ā¤ŋā¤¤", + "More_options": "ā¤…ā¤§ā¤ŋā¤• ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē", + "Most_popular_channels_top_5": "ā¤¸ā¤°āĨā¤ĩā¤žā¤§ā¤ŋā¤• ā¤˛āĨ‹ā¤•ā¤ĒāĨā¤°ā¤ŋā¤¯ ā¤šāĨˆā¤¨ā¤˛ (ā¤ļāĨ€ā¤°āĨā¤ˇ 5)", + "Most_recent_updated": "ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Most_recent_requested": "ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤šā¤žā¤˛ ā¤šāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Move_beginning_message": "`%s` - ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ€ ā¤ļāĨā¤°āĨā¤†ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤ā¤", + "Move_end_message": "`%s` - ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤ā¤", + "Move_queue": "ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤ā¤", + "Msgs": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "multi": "ā¤Ŧā¤šāĨ", + "Multi_line": "ā¤Žā¤˛āĨā¤ŸāĨ€ ā¤˛ā¤žā¤‡ā¤¨", + "Multiple_monolith_instances_alert": "ā¤†ā¤Ē ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤•ā¤ˆ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸āĨ‡ā¤¸ ā¤•ā¤ž ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤¨ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚ - ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•āĨā¤› ā¤¸āĨā¤ĩā¤ŋā¤§ā¤žā¤ā¤ ā¤Ąā¤ŋā¤œā¤ŧā¤žā¤‡ā¤¨ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤° ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Mute": "ā¤†ā¤ĩā¤žā¤œā¤ŧ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨ā¤ž", + "Mute_and_dismiss": "ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤–ā¤ŧā¤žā¤°ā¤ŋā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Mute_all_notifications": "ā¤¸ā¤­āĨ€ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Mute_Focused_Conversations": "ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤°ā¤ŋā¤¤ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤ĒāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Mute_Group_Mentions": "@ā¤¸ā¤­āĨ€ ā¤”ā¤° @ā¤¯ā¤šā¤žā¤‚ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Mute_someone_in_room": "ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¸āĨ€ ā¤•āĨ‹ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Mute_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Mute_microphone": "ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "mute-user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "mute-user_description": "ā¤‰ā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Muted": "ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤", + "My Data": "ā¤ŽāĨ‡ā¤°āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "My_Account": "ā¤ŽāĨ‡ā¤°ā¤ž ā¤–ā¤žā¤¤ā¤ž", + "My_location": "ā¤ŽāĨ‡ā¤°ā¤ž ā¤¸āĨā¤Ĩā¤žā¤¨", + "n_messages": "%s ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "N_new_messages": "%s ā¤¨ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Name": "ā¤¨ā¤žā¤Ž", + "Name_cant_be_empty": "ā¤¨ā¤žā¤Ž ā¤–ā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž", + "Name_of_agent": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Name_optional": "ā¤¨ā¤žā¤Ž: (ā¤ĩāĨˆā¤•ā¤˛āĨā¤Ēā¤ŋā¤•)", + "Name_Placeholder": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "Navigation": "ā¤Žā¤žā¤°āĨā¤—ā¤Ļā¤°āĨā¤ļā¤¨", + "Navigation_bar": "ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤Ēā¤ŸāĨā¤ŸāĨ€", + "Navigation_bar_description": "ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤Ŧā¤žā¤° ā¤•ā¤ž ā¤Ēā¤°ā¤ŋā¤šā¤¯ - ā¤ā¤• ā¤‰ā¤šāĨā¤š-ā¤¸āĨā¤¤ā¤°āĨ€ā¤¯ ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤œāĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤ļāĨ€ā¤˜āĨā¤°ā¤¤ā¤ž ā¤¸āĨ‡ ā¤ĸāĨ‚ā¤‚ā¤ĸā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤Žā¤Ļā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤œā¤ŧā¤žā¤‡ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•āĨ‰ā¤ŽāĨā¤ĒāĨˆā¤•āĨā¤Ÿ ā¤Ąā¤ŋā¤œā¤ŧā¤žā¤‡ā¤¨ ā¤”ā¤° ā¤¸ā¤šā¤œ ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ, ā¤¯ā¤š ā¤¸āĨā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤ŋā¤¤ ā¤¸ā¤žā¤‡ā¤Ąā¤Ŧā¤žā¤° ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤¸āĨ‰ā¤Ģā¤ŧāĨā¤Ÿā¤ĩāĨ‡ā¤¯ā¤° ā¤¸āĨā¤ĩā¤ŋā¤§ā¤žā¤“ā¤‚ ā¤”ā¤° ā¤…ā¤¨āĨā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤¤ā¤• ā¤†ā¤¸ā¤žā¤¨ ā¤Ēā¤šāĨā¤ā¤š ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨā¤ ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Navigation_History": "ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸", + "Next": "ā¤…ā¤—ā¤˛ā¤ž", + "Never": "ā¤•ā¤­āĨ€ ā¤¨ā¤šāĨ€ā¤‚", + "New": "ā¤¨ā¤¯ā¤ž", + "New_Application": "ā¤¨ā¤ ā¤†ā¤ĩāĨ‡ā¤Ļā¤¨", + "New_Business_Hour": "ā¤¨ā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤Ÿā¤ž", + "New_Call": "ā¤¨ā¤ˆ ā¤•āĨ‰ā¤˛", + "New_Call_Premium_Only": "ā¤¨ā¤ˆ ā¤•āĨ‰ā¤˛ (ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤ā¤‚)", + "New_chat_in_queue": "ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ˆ ā¤šāĨˆā¤Ÿ", + "New_chat_priority": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤Ŧā¤Ļā¤˛āĨ€ ā¤—ā¤ˆ: {{user}} ā¤¨āĨ‡ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤•āĨ‹ {{priority}} ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž", + "New_chat_transfer": "ā¤¨ā¤¯ā¤ž ā¤šāĨˆā¤Ÿ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤Ŗ: {{transfer}}", + "New_chat_transfer_fallback": "ā¤Ģā¤ŧāĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤: {{fallback}}", + "New_contact": "ā¤¨ā¤¯ā¤ž ā¤•āĨ‰ā¤¨āĨā¤ŸāĨā¤°āĨˆā¤•āĨā¤Ÿ", + "New_Custom_Field": "ā¤¨ā¤¯ā¤ž ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą", + "New_Department": "ā¤¨ā¤¯ā¤ž ā¤ĩā¤ŋā¤­ā¤žā¤—", + "New_discussion": "ā¤¨ā¤ˆ ā¤šā¤°āĨā¤šā¤ž", + "New_discussion_first_message": "ā¤†ā¤Žā¤¤āĨŒā¤° ā¤Ēā¤°, ā¤šā¤°āĨā¤šā¤ž ā¤ā¤• ā¤ĒāĨā¤°ā¤ļāĨā¤¨ ā¤¸āĨ‡ ā¤ļāĨā¤°āĨ‚ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ, ā¤œāĨˆā¤¸āĨ‡ \"ā¤ŽāĨˆā¤‚ ā¤ā¤• ā¤¤ā¤¸āĨā¤ĩāĨ€ā¤° ā¤•āĨˆā¤¸āĨ‡ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‚ā¤‚?\"", + "New_discussion_name": "ā¤šā¤°āĨā¤šā¤ž ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤¸ā¤žā¤°āĨā¤Ĩā¤• ā¤¨ā¤žā¤Ž", + "New_Email_Inbox": "ā¤¨ā¤¯ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸", + "New_encryption_password": "ā¤¨ā¤¯ā¤ž ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "New_integration": "ā¤¨ā¤¯ā¤ž ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "New_line_message_compose_input": "`%s` - ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛ā¤ŋā¤–āĨ‡ā¤‚ ā¤‡ā¤¨ā¤ĒāĨā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ˆ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ", + "New_Livechat_offline_message_has_been_sent": "ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "New_logs": "ā¤¨ā¤¯āĨ‡ ā¤˛āĨ‰ā¤—", + "New_Message_Notification": "ā¤¨ā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž", "New_messages": "ā¤¨ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "New_OTR_Chat": "ā¤¨ā¤ˆ ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤šāĨˆā¤Ÿ", + "New_password": "ā¤¨ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "New_Password_Placeholder": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¨ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "New_Priority": "ā¤¨ā¤ˆ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž", + "New_SLA_Policy": "ā¤¨ā¤ˆ ā¤ā¤¸ā¤ā¤˛ā¤ ā¤¨āĨ€ā¤¤ā¤ŋ", + "New_role": "ā¤¨ā¤¯āĨ€ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž", + "New_Room_Notification": "ā¤¨ā¤¯āĨ‡ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž", + "New_Tag": "ā¤¨ā¤¯ā¤ž ā¤ŸāĨˆā¤—", + "New_Trigger": "ā¤¨ā¤¯ā¤ž ā¤ŸāĨā¤°ā¤ŋā¤—ā¤°", + "New_Unit": "ā¤¨ā¤ˆ ā¤‡ā¤•ā¤žā¤ˆ", + "New_users": "ā¤¨ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "New_version_available_(s)": "ā¤¨ā¤¯ā¤ž ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆ (%s)", + "New_videocall_request": "ā¤¨ā¤¯ā¤ž ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§", + "New_visitor_navigation": "ā¤¨ā¤¯ā¤ž ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨: {{history}}", + "New_workspace_confirmed": "ā¤¨ā¤ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•āĨ€ ā¤—ā¤ˆ", + "New_workspace": "ā¤¨ā¤¯ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Newer_than": "ā¤¸āĨ‡ ā¤¨ā¤¯ā¤ž", + "Newer_than_may_not_exceed_Older_than": "\"ā¤‡ā¤¸ā¤¸āĨ‡ ā¤¨ā¤¯ā¤ž\" \"ā¤‡ā¤¸ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤¨ā¤ž\" ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž", + "Nickname": "ā¤‰ā¤Ēā¤¨ā¤žā¤Ž", + "Nickname_Placeholder": "ā¤…ā¤Ēā¤¨ā¤ž ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", "No": "ā¤¨ā¤šāĨ€ā¤‚", + "no-active-video-conf-provider": "**ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ**: ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤•āĨ‹ ā¤Ēā¤šā¤˛āĨ‡ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "No_available_agents_to_transfer": "ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "No_app_matches": "ā¤•āĨ‹ā¤ˆ ā¤ā¤Ē ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤ā¤ž", + "No_app_matches_for": "ā¤•āĨ‹ā¤ˆ ā¤ā¤Ē ā¤‡ā¤¸ā¤¸āĨ‡ ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤ā¤ž", + "No_apps_installed": "ā¤•āĨ‹ā¤ˆ ā¤ā¤ĒāĨā¤¸ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤¨ā¤šāĨ€ā¤‚", + "No_Canned_Responses": "ā¤•āĨ‹ā¤ˆ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚", + "No_Canned_Responses_Yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚", + "No_Canned_Responses_Yet-description": "ā¤…ā¤•āĨā¤¸ā¤° ā¤ĒāĨ‚ā¤›āĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ĒāĨā¤°ā¤ļāĨā¤¨āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¤āĨā¤ĩā¤°ā¤ŋā¤¤ ā¤”ā¤° ā¤¸āĨā¤¸ā¤‚ā¤—ā¤¤ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "No_channels_in_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤šāĨˆā¤¨ā¤˛ ā¤¨ā¤šāĨ€ā¤‚", + "No_agents_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚", + "No_agents_yet_description": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ļā¤°āĨā¤ļā¤•āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧā¤¨āĨ‡ ā¤”ā¤° ā¤…ā¤¨āĨā¤•āĨ‚ā¤˛ā¤ŋā¤¤ ā¤—āĨā¤°ā¤žā¤šā¤• ā¤¸āĨ‡ā¤ĩā¤ž ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", + "No_channels_yet": "ā¤†ā¤Ē ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤šā¤ŋā¤¸āĨā¤¸ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "No_chats_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤šāĨˆā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚", + "No_chats_yet_description": "ā¤†ā¤Ēā¤•āĨ€ ā¤¸ā¤­āĨ€ ā¤šāĨˆā¤Ÿ ā¤¯ā¤šā¤žā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤‚ā¤—āĨ€.", + "No_calls_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤•āĨ‰ā¤˛ ā¤¨ā¤šāĨ€ā¤‚", + "No_calls_yet_description": "ā¤†ā¤Ēā¤•āĨ€ ā¤¸ā¤­āĨ€ ā¤•āĨ‰ā¤˛āĨ‡ā¤‚ ā¤¯ā¤šā¤žā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤‚ā¤—āĨ€.", + "No_contacts_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¨ā¤šāĨ€ā¤‚", + "No_contacts_yet_description": "ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¯ā¤šā¤žā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤‚ā¤—āĨ‡.", + "No_custom_fields_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¨ā¤šāĨ€ā¤‚", + "No_custom_fields_yet_description": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤¯ā¤ž ā¤Ÿā¤ŋā¤•ā¤Ÿ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚ ā¤¯ā¤ž ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤¨ā¤ ā¤†ā¤—ā¤‚ā¤¤āĨā¤•āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĢāĨ‰ā¤°āĨā¤Ž ā¤Ēā¤° ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "No_departments_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¨ā¤šāĨ€ā¤‚", + "No_departments_yet_description": "ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚, ā¤Ÿā¤ŋā¤•ā¤Ÿ ā¤•āĨˆā¤¸āĨ‡ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤ŋā¤ ā¤œā¤žā¤ā¤‚ ā¤¯ā¤š ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤‰ā¤¨ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤¨ ā¤•āĨ€ ā¤¨ā¤ŋā¤—ā¤°ā¤žā¤¨āĨ€ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "No_managers_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤¨ā¤šāĨ€ā¤‚", + "No_managers_yet_description": "ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤¸ā¤­āĨ€ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤ŖāĨ‹ā¤‚ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ, ā¤ĩāĨ‡ ā¤¨ā¤ŋā¤—ā¤°ā¤žā¤¨āĨ€ ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "No_content_was_provided": "ā¤•āĨ‹ā¤ˆ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤žā¤¯āĨ€ ā¤—ā¤¯āĨ€", + "No_data_found": "ā¤Ąā¤žā¤Ÿā¤ž ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨā¤†", + "No_data_available_for_the_selected_period": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ period ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "No_direct_messages_yet": "ā¤•āĨ‹ā¤ˆ ā¤¸āĨ€ā¤§ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚.", + "No_Discussions_found": "ā¤•āĨ‹ā¤ˆ ā¤šā¤°āĨā¤šā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛āĨ€", + "No_discussions_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤šā¤°āĨā¤šā¤ž ā¤¨ā¤šāĨ€ā¤‚", + "No_emojis_found": "ā¤•āĨ‹ā¤ˆ ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "No_Encryption": "ā¤•āĨ‹ā¤ˆ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤¨ā¤šāĨ€ā¤‚", + "No_files_found": "ā¤•āĨ‹ā¤ˆ ā¤Ģā¤žā¤ˆā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛āĨ€", + "No_files_left_to_download": "ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ŧā¤šāĨ€", + "No_groups_yet": "ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ.", + "No_history": "ā¤•āĨ‹ā¤ˆ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¨ā¤šāĨ€ā¤‚", + "No_installed_app_matches": "ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤ā¤Ē ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤ā¤ž", + "No_integration_found": "ā¤ĒāĨā¤°ā¤Ļā¤¤āĨā¤¤ ā¤†ā¤ˆā¤ĄāĨ€ ā¤¸āĨ‡ ā¤•āĨ‹ā¤ˆ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤žāĨ¤", + "No_Limit": "ā¤•āĨ‹ā¤ˆ ā¤¸āĨ€ā¤Žā¤ž ā¤¨ā¤šāĨ€ā¤‚", + "No_livechats": "ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤•āĨ‹ā¤ˆ ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "No_marketplace_matches_for": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤ā¤ž", + "No_members_found": "ā¤•āĨ‹ā¤ˆ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "No_mentions_found": "ā¤•āĨ‹ā¤ˆ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "No_messages_found_to_prune": "ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "No_messages_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚", + "No_monitors_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "No_monitors_yet_description": "ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤°āĨā¤¸ ā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤†ā¤‚ā¤ļā¤ŋā¤• ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤ĩāĨ‡ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‡ ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ā¤”ā¤° ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤¸āĨŒā¤‚ā¤ĒāĨ€ ā¤—ā¤ˆ ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤‡ā¤•ā¤žā¤‡ā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤—ā¤¤ā¤ŋā¤ĩā¤ŋā¤§ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "No_tags_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ŸāĨˆā¤— ā¤¨ā¤šāĨ€ā¤‚", + "No_tags_yet_description": "ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤ĒāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤”ā¤° ā¤ĸāĨ‚ā¤‚ā¤ĸā¤¨ā¤ž ā¤†ā¤¸ā¤žā¤¨ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ÿā¤ŋā¤•ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ŸāĨˆā¤— ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", + "No_triggers_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤¨ā¤šāĨ€ā¤‚", + "No_triggers_yet_description": "ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤ā¤¸āĨ€ ā¤˜ā¤Ÿā¤¨ā¤žā¤ā¤ ā¤šāĨˆā¤‚ ā¤œāĨ‹ ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤œāĨ‡ā¤Ÿ ā¤•āĨ‹ ā¤–āĨ‹ā¤˛ā¤¨āĨ‡ ā¤”ā¤° ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•ā¤ž ā¤•ā¤žā¤°ā¤Ŗ ā¤Ŧā¤¨ā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "No_units_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤‡ā¤•ā¤žā¤ˆ ā¤¨ā¤šāĨ€ā¤‚", + "No_units_yet_description": "ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤ŽāĨ‚ā¤šāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤ĸā¤‚ā¤— ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤•ā¤žā¤‡ā¤¯āĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "No_pages_yet_Try_hitting_Reload_Pages_button": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ĒāĨ‡ā¤œ ā¤¨ā¤šāĨ€ā¤‚. \"ā¤°āĨ€ā¤˛āĨ‹ā¤Ą ā¤ĒāĨ‡ā¤œ\" ā¤Ŧā¤Ÿā¤¨ ā¤Ļā¤Ŧā¤žā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "No_pinned_messages": "ā¤•āĨ‹ā¤ˆ ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨā¤† ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚", + "No_previous_chat_found": "ā¤•āĨ‹ā¤ˆ ā¤Ēā¤ŋā¤›ā¤˛āĨ€ ā¤šāĨˆā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛āĨ€", + "No_release_information_provided": "ā¤•āĨ‹ā¤ˆ ā¤°ā¤ŋā¤˛āĨ€ā¤œā¤ŧ ā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤ĻāĨ€ ā¤—ā¤ˆ", + "No_requested_apps": "ā¤•āĨ‹ā¤ˆ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ā¤ŋā¤¤ ā¤ā¤ĒāĨā¤¸ ā¤¨ā¤šāĨ€ā¤‚", + "No_requests": "ā¤•āĨ‹ā¤ˆ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¨ā¤šāĨ€ā¤‚", + "No_results_found": "ā¤•āĨ‹ā¤ˆ ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "No_results_found_for": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž:", + "No_SLA_policies_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ SLA ā¤¨āĨ€ā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚", + "No_SLA_policies_yet_description": "ā¤…ā¤¨āĨā¤Žā¤žā¤¨ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤¤ā¤žā¤°āĨ‹ā¤‚ ā¤•ā¤ž ā¤•āĨā¤°ā¤Ž ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ SLA ā¤¨āĨ€ā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "No_snippet_messages": "ā¤•āĨ‹ā¤ˆ ā¤¸āĨā¤¨ā¤ŋā¤ĒāĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚", + "No_starred_messages": "ā¤•āĨ‹ā¤ˆ ā¤¤ā¤žā¤°ā¤žā¤‚ā¤•ā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚", + "No_such_command": "ā¤ā¤¸ā¤ž ā¤•āĨ‹ā¤ˆ ā¤†ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚: `/{{command}}`", + "No_Threads": "ā¤•āĨ‹ā¤ˆ ā¤¸āĨ‚ā¤¤āĨā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "no-videoconf-provider-app": "**ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ**: ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Nobody_available": "ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Node_version": "ā¤¨āĨ‹ā¤Ą ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "None": "ā¤•āĨ‹ā¤ˆ ā¤¨ā¤šāĨ€ā¤‚", + "Nonprofit": "ā¤—ā¤ŧāĨˆā¤°-ā¤˛ā¤žā¤­ā¤•ā¤žā¤°āĨ€", + "Not_authorized": "ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "Normal": "ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯", + "Not_Available": "ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Not_assigned": "ā¤¸āĨŒā¤‚ā¤Ēā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Not_enough_data": "ā¤Ēā¤°āĨā¤¯ā¤žā¤ĒāĨā¤¤ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¨ā¤šāĨ€ā¤‚", + "Not_following": "ā¤Ēā¤žā¤˛ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨā¤", + "Not_Following": "ā¤Ēā¤žā¤˛ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨā¤", + "Not_found_or_not_allowed": "ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž ā¤¯ā¤ž ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Not_Imported_Messages_Title": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤†ā¤¯ā¤žā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤ ā¤—ā¤", + "Not_in_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚", + "Not_likely": "ā¤¸ā¤‚ā¤­ā¤žā¤ĩā¤¨ā¤ž ā¤¨ā¤šāĨ€ā¤‚", + "Not_started": "ā¤ļāĨā¤°āĨ‚ ā¤¨ā¤šāĨ€ā¤‚", + "Not_verified": "ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Not_Visible_To_Workspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤Ēā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤¨ā¤šāĨ€ā¤‚ ā¤ĻāĨ‡ā¤¤ā¤ž", + "Nothing": "ā¤•āĨā¤› ā¤¨ā¤šāĨ€ā¤‚", + "Nothing_found": "ā¤•āĨā¤› ā¤­āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Notice_that_public_channels_will_be_public_and_visible_to_everyone": "ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨ‹ā¤‚ā¤—āĨ‡ ā¤”ā¤° ā¤¸ā¤­āĨ€ ā¤•āĨ‹ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Notification_Desktop_Default_For": "ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Notification_Push_Default_For": "ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Notification_RequireInteraction": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤•āĨ‹ ā¤–ā¤ŧā¤žā¤°ā¤ŋā¤œ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤šā¤­ā¤žā¤—ā¤ŋā¤¤ā¤ž ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Notification_RequireInteraction_Description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤•āĨā¤°āĨ‹ā¤Ž ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ> 50 ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤œā¤Ŧ ā¤¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‡ā¤¸ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤‡ā¤‚ā¤Ÿā¤°āĨˆā¤•āĨā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤ā¤ž ā¤¤ā¤Ŧ ā¤¤ā¤• ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤•āĨ‹ ā¤…ā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤žā¤˛ ā¤¤ā¤• ā¤Ļā¤ŋā¤–ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ *requireInteraction* ā¤ĒāĨˆā¤°ā¤žā¤ŽāĨ€ā¤Ÿā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Notifications": "ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚", + "Notifications_Max_Room_Members": "ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ŽāĨˆā¤•āĨā¤¸ ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯", + "Notifications_Max_Room_Members_Description": "ā¤œā¤Ŧ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆā¤‚ ā¤¤āĨ‹ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žāĨ¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤¸ā¤­āĨ€ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤­āĨ€ ā¤­āĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤•ā¤Žā¤°ā¤ž ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤Ŧā¤Ļā¤˛ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ (0 ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤)", + "Notifications_Muted_Description": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤¸ā¤Ŧ ā¤•āĨā¤› ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨā¤¨ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–āĨ‹ā¤‚ ā¤•āĨ‹ ā¤›āĨ‹ā¤Ąā¤ŧā¤•ā¤°, ā¤¨ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¨āĨ‡ ā¤Ēā¤° ā¤†ā¤Ēā¤•āĨ‹ ā¤¸āĨ‚ā¤šāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤°āĨ‚ā¤Ž ā¤šā¤žā¤‡ā¤˛ā¤žā¤‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤—ā¤žāĨ¤ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤“ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ą ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ€.", + "Notifications_Preferences": "ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤", + "Notifications_Sound_Volume": "ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž", + "Notify_active_in_this_room": "ā¤‡ā¤¸ ā¤•ā¤•āĨā¤ˇ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Notify_all_in_this_room": "ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤­āĨ€ ā¤•āĨ‹ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Notify_Calendar_Events": "ā¤•āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤° ā¤˜ā¤Ÿā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Now_Its_Visible_For_Everyone": "ā¤…ā¤Ŧ ā¤¯ā¤š ā¤¸ā¤Ŧā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĻāĨƒā¤ļāĨā¤¯ā¤Žā¤žā¤¨ ā¤šāĨˆ", + "Now_Its_Visible_Only_For_Admins": "ā¤…ā¤Ŧ ā¤¯ā¤š ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤•āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĻāĨƒā¤ļāĨā¤¯ā¤Žā¤žā¤¨ ā¤šāĨˆ", + "NPS_survey_enabled": "ā¤ā¤¨ā¤ĒāĨ€ā¤ā¤¸ ā¤¸ā¤°āĨā¤ĩāĨ‡ā¤•āĨā¤ˇā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "NPS_survey_enabled_Description": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤¨ā¤ĒāĨ€ā¤ā¤¸ ā¤¸ā¤°āĨā¤ĩāĨ‡ā¤•āĨā¤ˇā¤Ŗ ā¤šā¤˛ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚āĨ¤ ā¤¸ā¤°āĨā¤ĩāĨ‡ā¤•āĨā¤ˇā¤Ŗ ā¤ļāĨā¤°āĨ‚ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ 2 ā¤Žā¤šāĨ€ā¤¨āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ā¤• ā¤…ā¤˛ā¤°āĨā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤—ā¤ž", + "NPS_survey_is_scheduled_to-run-at__date__for_all_users": "ā¤ā¤¨ā¤ĒāĨ€ā¤ā¤¸ ā¤¸ā¤°āĨā¤ĩāĨ‡ā¤•āĨā¤ˇā¤Ŗ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ {{date}} ā¤Ēā¤° ā¤šā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤šāĨˆāĨ¤ 'ā¤ā¤Ąā¤Žā¤ŋā¤¨ > ā¤œā¤¨ā¤°ā¤˛ > ā¤ā¤¨ā¤ĒāĨ€ā¤ā¤¸' ā¤Ēā¤° ā¤¸ā¤°āĨā¤ĩāĨ‡ā¤•āĨā¤ˇā¤Ŗ ā¤•āĨ‹ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨ā¤ž ā¤¸ā¤‚ā¤­ā¤ĩ ā¤šāĨˆ", + "Default_Timezone_For_Reporting": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¸ā¤Žā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Default_Timezone_For_Reporting_Description": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¸ā¤Žā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤Ļā¤ŋā¤–ā¤žā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤¯ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "Default_Server_Timezone": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸ā¤Žā¤¯ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Default_Custom_Timezone": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤Žā¤¯ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Default_User_Timezone": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤¸ā¤Žā¤¯ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Num_Agents": "#ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "Number_in_seconds": "ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤‚ā¤Ŧā¤°", + "Number_of_events": "ā¤˜ā¤Ÿā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Number_of_federated_servers": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤¸ā¤°āĨā¤ĩā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Number_of_federated_users": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Number_of_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Number_of_most_recent_chats_estimate_wait_time": "ā¤…ā¤¨āĨā¤Žā¤žā¤¨ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯ ā¤•āĨ€ ā¤—ā¤Ŗā¤¨ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤žā¤˛ ā¤•āĨ€ ā¤šāĨˆā¤Ÿ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Number_of_most_recent_chats_estimate_wait_time_description": "ā¤¯ā¤š ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸āĨ‡ā¤ĩā¤ž ā¤ĩā¤žā¤˛āĨ‡ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤•āĨ‹ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆ ā¤œā¤ŋā¤¨ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤¤ā¤žā¤° ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯ ā¤•āĨ€ ā¤—ā¤Ŗā¤¨ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Number_of_users_autocomplete_suggestions": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸āĨā¤ĩā¤¤: ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¸āĨā¤ā¤žā¤ĩāĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "OAuth": "OAuth", + "OAuth_Description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸āĨ‡ ā¤Ēā¤°āĨ‡ ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĩā¤ŋā¤§ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "OAuth_Application": "OAuth ā¤†ā¤ĩāĨ‡ā¤Ļā¤¨", + "Objects": "ā¤ĩā¤¸āĨā¤¤āĨā¤“ā¤‚", + "Off": "ā¤Ŧā¤‚ā¤Ļ", + "Off_the_record_conversation": "ā¤‘ā¤Ģ-ā¤Ļ-ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Off_the_record_conversation_is_not_available_for_your_browser_or_device": "ā¤‘ā¤Ģ-ā¤Ļ-ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤†ā¤Ēā¤•āĨ‡ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¯ā¤ž ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "Office_Hours": "ā¤•ā¤žā¤°āĨā¤¯ā¤žā¤˛ā¤¯ period", + "Office_hours_enabled": "ā¤•ā¤žā¤°āĨā¤¯ā¤žā¤˛ā¤¯ ā¤¸ā¤Žā¤¯ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Office_hours_updated": "ā¤•ā¤žā¤°āĨā¤¯ā¤žā¤˛ā¤¯ ā¤¸ā¤Žā¤¯ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "offline": "ā¤‘ā¤Ģā¤˛ā¤žā¤‡ā¤¨", + "Offline": "ā¤‘ā¤Ģā¤˛ā¤žā¤‡ā¤¨", + "Offline_DM_Email": "ā¤¸āĨ€ā¤§ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĩā¤ŋā¤ˇā¤¯", + "Offline_Email_Subject_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž, ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤°āĨ‚ā¤Žā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¨ā¤žā¤Ž]`, `[ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛]`, `[ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž]` ā¤”ā¤° `[ā¤•ā¤•āĨā¤ˇ]`āĨ¤", + "Offline_form": "ā¤‘ā¤Ģā¤˛ā¤žā¤‡ā¤¨ ā¤ĢāĨ‰ā¤°āĨā¤Ž", + "Offline_form_unavailable_message": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤ĢāĨ‰ā¤°āĨā¤Ž ā¤…ā¤¨āĨā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Offline_Link_Message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤° ā¤œā¤žā¤ā¤", + "Offline_Mention_All_Email": "ā¤¸ā¤­āĨ€ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĩā¤ŋā¤ˇā¤¯ ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°āĨ‡ā¤‚", + "Offline_Mention_Email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĩā¤ŋā¤ˇā¤¯ ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°āĨ‡ā¤‚", + "Offline_message": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Offline_Message": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Offline_Message_Use_DeepLink": "ā¤ĄāĨ€ā¤Ē ā¤˛ā¤ŋā¤‚ā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Ģā¤ŧāĨ‰ā¤°āĨā¤ŽāĨ‡ā¤Ÿ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Offline_messages": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Offline_success_message": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤Ģā¤˛ā¤¤ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Offline_unavailable": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤…ā¤¨āĨā¤Ēā¤˛ā¤ŦāĨā¤§", + "Ok": "ā¤ āĨ€ā¤• ā¤šāĨˆ", + "Old Colors": "ā¤ĒāĨā¤°ā¤žā¤¨āĨ‡ ā¤°ā¤‚ā¤—", + "Old Colors (minor)": "ā¤ĒāĨā¤°ā¤žā¤¨āĨ‡ ā¤°ā¤‚ā¤— (ā¤Žā¤žā¤ŽāĨ‚ā¤˛āĨ€)", + "Older_than": "ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤ĒāĨā¤°ā¤žā¤¨ā¤ž", + "Omnichannel": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛", + "Omnichannel_Description": "ā¤—āĨā¤°ā¤žā¤šā¤•āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ā¤• ā¤šāĨ€ ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤ĩā¤žā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚, ā¤­ā¤˛āĨ‡ ā¤šāĨ€ ā¤ĩāĨ‡ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•āĨˆā¤¸āĨ‡ ā¤­āĨ€ ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤šāĨ‹ā¤‚āĨ¤", + "Omnichannel_Directory": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž", + "Omnichannel_appearance": "ā¤“ā¤ŽāĨā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Omnichannel_calculate_dispatch_service_queue_statistics": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤¤ā¤žā¤° ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‹ā¤‚ ā¤•āĨ€ ā¤—ā¤Ŗā¤¨ā¤ž ā¤”ā¤° ā¤ĒāĨā¤°āĨ‡ā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "Omnichannel_calculate_dispatch_service_queue_statistics_Description": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤”ā¤° ā¤…ā¤¨āĨā¤Žā¤žā¤¨ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤¸ā¤Žā¤¯ ā¤œāĨˆā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤¤ā¤žā¤° ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤”ā¤° ā¤­āĨ‡ā¤œā¤¨ā¤žāĨ¤ ā¤¯ā¤Ļā¤ŋ *ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤šāĨˆā¤¨ā¤˛* ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‹ ā¤…ā¤¨ā¤žā¤ĩā¤ļāĨā¤¯ā¤• ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤°āĨ‹ā¤•ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤ļā¤‚ā¤¸ā¤ž ā¤•āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Omnichannel_Contact_Center": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤°", + "Omnichannel_contact_manager_routing": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤•āĨ‹ ā¤¨ā¤ˆ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤¸āĨŒā¤‚ā¤ĒāĨ‡ā¤‚", + "Omnichannel_contact_manager_routing_Description": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤…ā¤¸ā¤žā¤‡ā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤•āĨ‹ ā¤ā¤• ā¤šāĨˆā¤Ÿ ā¤†ā¤ĩā¤‚ā¤Ÿā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆ, ā¤œā¤Ŧ ā¤¤ā¤• ā¤•ā¤ŋ ā¤šāĨˆā¤Ÿ ā¤ļāĨā¤°āĨ‚ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ", + "Omnichannel_External_Frame": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤Ž", + "Omnichannel_External_Frame_Enabled": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤Ž ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Omnichannel_External_Frame_Encryption_JWK": "ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨā¤‚ā¤œāĨ€ (JWK)", + "Omnichannel_External_Frame_Encryption_JWK_Description": "ā¤¯ā¤Ļā¤ŋ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤¯ā¤š ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•āĨ€ ā¤—ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ‹ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤”ā¤° ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤•āĨ‹ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•āĨ‹ ā¤Ąā¤ŋā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤—āĨ€", + "Omnichannel_External_Frame_URL": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤Ž ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "omnichannel_priority_change_history": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤Ŧā¤Ļā¤˛āĨ€ ā¤—ā¤ˆ: {{user}} ā¤¨āĨ‡ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤•āĨ‹ {{priority}} ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž", + "omnichannel_sla_change_history": "SLA ā¤¨āĨ€ā¤¤ā¤ŋ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤: {{user}} ā¤¨āĨ‡ SLA ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ {{sla}} ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž", + "Omnichannel_enable_department_removal": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¨ā¤ŋā¤ˇāĨā¤•ā¤žā¤¸ā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Omnichannel_enable_department_removal_alert": "ā¤šā¤Ÿā¤žā¤ ā¤—ā¤ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž, ā¤šā¤Ž ā¤‡ā¤¸ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‹ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤ļā¤‚ā¤¸ā¤ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Omnichannel_Reports_Status_Open": "ā¤–āĨā¤˛ā¤ž", + "Omnichannel_Reports_Status_Closed": "ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨā¤†", + "Omnichannel_Reports_Channels_Empty_Subtitle": "ā¤¯ā¤š ā¤šā¤žā¤°āĨā¤Ÿ ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤Ļā¤ŋā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆ.", + "Omnichannel_Reports_Departments_Empty_Subtitle": "ā¤¯ā¤š ā¤šā¤žā¤°āĨā¤Ÿ ā¤‰ā¤¨ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤œāĨ‹ ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Omnichannel_Reports_Status_Empty_Subtitle": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ļāĨā¤°āĨ‚ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨ€ ā¤¯ā¤š ā¤šā¤žā¤°āĨā¤Ÿ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤ž.", + "Omnichannel_Reports_Tags_Empty_Subtitle": "ā¤¯ā¤š ā¤šā¤žā¤°āĨā¤Ÿ ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯āĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤ŸāĨˆā¤— ā¤Ļā¤ŋā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Omnichannel_Reports_Agents_Empty_Subtitle": "ā¤¯ā¤š ā¤šā¤žā¤°āĨā¤Ÿ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•āĨŒā¤¨ ā¤¸āĨ‡ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Omnichannel_Reports_Summary": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤‘ā¤Ēā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤šā¤žā¤¸ā¤ŋā¤˛ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤…ā¤Ēā¤¨āĨ‡ ā¤ŽāĨ‡ā¤ŸāĨā¤°ā¤ŋā¤•āĨā¤¸ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "On": "ā¤Ēā¤°", + "on-hold-livechat-room": "ā¤‘ā¤¨ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤°āĨ‚ā¤Ž", + "on-hold-livechat-room_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤°āĨ‚ā¤Ž ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "on-hold-others-livechat-room": "ā¤…ā¤¨āĨā¤¯ ā¤“ā¤ŽāĨā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–āĨ‡ā¤‚", + "on-hold-others-livechat-room_description": "ā¤…ā¤¨āĨā¤¯ ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‹ ā¤°āĨ‹ā¤•ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "On_Hold": "ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤°", + "On_Hold_Chats": "ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤°", + "On_Hold_conversations": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤°āĨā¤•āĨ€ ā¤šāĨā¤ˆ ā¤šāĨˆ", + "online": "ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨", + "Online": "ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨", + "Only_authorized_users_can_write_new_messages": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨ€ ā¤¨ā¤¯āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛ā¤ŋā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Only_authorized_users_can_react_to_messages": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĻāĨ‡ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Only_from_users": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤‡ā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤•āĨ‹ ā¤›ā¤žā¤ā¤ŸāĨ‡ā¤‚ (ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤•āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤•āĨ‹ ā¤›ā¤žā¤ā¤Ÿā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤‚)", + "Only_Members_Selected_Department_Can_View_Channel": "ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤•āĨ‡ā¤ĩā¤˛ ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤šāĨ€ ā¤šāĨˆā¤Ÿ ā¤ĻāĨ‡ā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Only_On_Desktop": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤ŽāĨ‹ā¤Ą (ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤Ēā¤° ā¤ā¤‚ā¤Ÿā¤° ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤­āĨ‡ā¤œā¤¤ā¤ž ā¤šāĨˆ)", + "Only_works_with_chrome_version_greater_50": "ā¤•āĨ‡ā¤ĩā¤˛ Chrome ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ > 50 ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Only_you_can_see_this_message": "ā¤¯ā¤š ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ā¤ĩā¤˛ ā¤†ā¤Ē ā¤šāĨ€ ā¤ĻāĨ‡ā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Only_invited_users_can_acess_this_channel": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨ€ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Oops_page_not_found": "ā¤‰ā¤Ģā¤ŧ, ā¤ĒāĨ‡ā¤œ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Oops!": "ā¤‰ā¤Ģā¤ŧ", + "Person_Or_Channel": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤¯ā¤ž ā¤šāĨˆā¤¨ā¤˛", + "Open": "ā¤–āĨā¤˛ā¤ž", + "Open_call": "ā¤–āĨā¤˛ā¤ž ā¤†ā¤ĩā¤žā¤šā¤¨", + "Open_call_in_new_tab": "ā¤¨ā¤ ā¤ŸāĨˆā¤Ŧ ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‰ā¤˛ ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Open_channel_user_search": "`%s` - ā¤šāĨˆā¤¨ā¤˛/ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–āĨ‹ā¤œ ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Open_conversations": "ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Open_Days": "ā¤–āĨā¤˛āĨ‡ ā¤Ļā¤ŋā¤¨", + "Open_days_of_the_week": "ā¤¸ā¤ĒāĨā¤¤ā¤žā¤š ā¤•āĨ‡ ā¤–āĨā¤˛āĨ‡ ā¤Ļā¤ŋā¤¨", + "Open_Dialpad": "ā¤Ąā¤žā¤¯ā¤˛ā¤ĒāĨˆā¤Ą ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Open_directory": "ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤•ā¤ž ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Open_Livechats": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ĒāĨā¤°ā¤—ā¤¤ā¤ŋ ā¤Ēā¤° ā¤šāĨˆ", + "Open_Outlook": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Open_settings": "ā¤–āĨā¤˛āĨ€ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—", + "Open-source_conference_call_solution": "ā¤“ā¤Ēā¤¨-ā¤¸āĨ‹ā¤°āĨā¤¸ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨āĨ¤", + "Open_thread": "ā¤ĨāĨā¤°āĨ‡ā¤Ą ā¤–āĨ‹ā¤˛āĨ‡ā¤‚", + "Opened": "ā¤–āĨā¤˛ ā¤—ā¤¯ā¤ž", + "Opened_in_a_new_window": "ā¤ā¤• ā¤¨ā¤ˆ ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹ ā¤ŽāĨ‡ā¤‚ ā¤–āĨ‹ā¤˛ā¤ž ā¤—ā¤¯ā¤ž.", + "Opens_a_channel_group_or_direct_message": "ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛, ā¤¸ā¤ŽāĨ‚ā¤š ā¤¯ā¤ž ā¤¸āĨ€ā¤§ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤–āĨ‹ā¤˛ā¤¤ā¤ž ā¤šāĨˆ", + "Optional": "ā¤ĩāĨˆā¤•ā¤˛āĨā¤Ēā¤ŋā¤•", + "optional": "ā¤ĩāĨˆā¤•ā¤˛āĨā¤Ēā¤ŋā¤•", "Options": "ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē", + "or": "ā¤¯ā¤ž", + "Or_Copy_And_Paste_This_URL_Into_A_Tab_Of_Your_Browser": "ā¤¯ā¤ž ā¤‡ā¤¸ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‹ ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°ā¤•āĨ‡ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤•āĨ‡ ā¤ā¤• ā¤ŸāĨˆā¤Ŧ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨ‡ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Or_talk_as_anonymous": "ā¤¯ā¤ž ā¤—āĨā¤Žā¤¨ā¤žā¤Ž ā¤Ŧā¤¨ā¤•ā¤° ā¤Ŧā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Order": "ā¤†ā¤ĻāĨ‡ā¤ļ", + "Organization_Email": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤ˆā¤ŽāĨ‡ā¤˛", + "Organization_Info": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Organization_Name": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Organization_Type": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "Original": "ā¤ŽāĨ‚ā¤˛", + "OS": "ā¤†ā¤Ē", + "OS_Arch": "ā¤“ā¤ā¤¸ ā¤†ā¤°āĨā¤•", + "OS_Cpus": "ā¤“ā¤ā¤¸ ā¤¸āĨ€ā¤ĒāĨ€ā¤¯āĨ‚ ā¤—ā¤Ŗā¤¨ā¤ž", + "OS_Freemem": "ā¤“ā¤ā¤¸ ā¤ĢāĨā¤°āĨ€ ā¤ŽāĨ‡ā¤ŽāĨ‹ā¤°āĨ€", + "OS_Loadavg": "ā¤“ā¤ā¤¸ ā¤˛āĨ‹ā¤Ą ā¤”ā¤¸ā¤¤", + "OS_Platform": "ā¤“ā¤ā¤¸ ā¤ĒāĨā¤˛āĨ‡ā¤Ÿā¤Ģā¤žā¤°āĨā¤Ž", + "OS_Release": "ā¤“ā¤ā¤¸ ā¤°ā¤ŋā¤˛āĨ€ā¤œ", + "OS_Totalmem": "ā¤“ā¤ā¤¸ ā¤•āĨā¤˛ ā¤ŽāĨ‡ā¤ŽāĨ‹ā¤°āĨ€", + "OS_Type": "ā¤“ā¤ā¤¸ ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "OS_Uptime": "ā¤“ā¤ā¤¸ ā¤…ā¤Ēā¤Ÿā¤žā¤‡ā¤Ž", + "Other": "ā¤…ā¤¨āĨā¤¯", + "others": "ā¤…ā¤¨āĨā¤¯", + "Others": "ā¤…ā¤¨āĨā¤¯", + "OTR": "ā¤“ā¤ŸāĨ€ā¤†ā¤°", + "OTR_unavailable_for_federation": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "OTR_Description": "ā¤‘ā¤Ģ-ā¤Ļ-ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤šāĨˆā¤Ÿ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤, ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤—ā¤žā¤¯ā¤Ŧ ā¤šāĨ‹ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "OTR_Chat_Declined_Title": "ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤šāĨˆā¤Ÿ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤", + "OTR_Chat_Declined_Description": "%s ā¤¨āĨ‡ OTR ā¤šāĨˆā¤Ÿ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž. ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤¸ā¤šā¤ŋā¤¤ ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤•āĨˆā¤ļ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤žāĨ¤", + "OTR_Chat_Error_Title": "ā¤•āĨā¤‚ā¤œāĨ€ ā¤°āĨ€ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤ļ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ ā¤šāĨˆā¤Ÿ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤—ā¤ˆ", + "OTR_Chat_Error_Description": "ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤¸ā¤šā¤ŋā¤¤ ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤•āĨˆā¤ļ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤žāĨ¤", + "OTR_Chat_Timeout_Title": "ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤šāĨˆā¤Ÿ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "OTR_Chat_Timeout_Description": "%s ā¤¸ā¤Žā¤¯ ā¤Ēā¤° ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤šāĨˆā¤Ÿ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤°ā¤šā¤žāĨ¤ ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤¸ā¤šā¤ŋā¤¤ ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤•āĨˆā¤ļ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤žāĨ¤", + "OTR_Enable_Description": "2 ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤‘ā¤Ģ-ā¤Ļ-ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą (ā¤“ā¤ŸāĨ€ā¤†ā¤°) ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤ĻāĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤¸āĨ€ā¤§āĨ‡ ā¤†ā¤Ļā¤žā¤¨-ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤”ā¤° ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "OTR_message": "ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "OTR_is_only_available_when_both_users_are_online": "ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤•āĨ‡ā¤ĩā¤˛ ā¤¤ā¤­āĨ€ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤Ŧ ā¤ĻāĨ‹ā¤¨āĨ‹ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨ‹ā¤‚", + "outbound-voip-calls": "ā¤†ā¤‰ā¤Ÿā¤Ŧā¤žā¤‰ā¤‚ā¤Ą ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‰ā¤˛", + "outbound-voip-calls_description": "ā¤†ā¤‰ā¤Ÿā¤Ŧā¤žā¤‰ā¤‚ā¤Ą ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‰ā¤˛ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Out_of_seats": "ā¤¸āĨ€ā¤ŸāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤Ŧā¤žā¤šā¤°", + "Outgoing": "ā¤œā¤žā¤ĩā¤•", + "Outgoing_WebHook": "ā¤¨ā¤ŋā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤•", + "Outgoing_WebHook_Description": "ā¤ĩā¤žā¤¸āĨā¤¤ā¤ĩā¤ŋā¤• ā¤¸ā¤Žā¤¯ ā¤ŽāĨ‡ā¤‚ Rocket.Chat ā¤¸āĨ‡ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Outlook_authentication": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ", + "Outlook_authentication_disabled": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Outlook_authentication_description": "ā¤‡ā¤¸ ā¤Žā¤ļāĨ€ā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤•āĨā¤°āĨ‡ā¤ĄāĨ‡ā¤‚ā¤ļā¤ŋā¤¯ā¤˛ ā¤•āĨ‹ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Outlook_calendar": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤•āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤°", + "Outlook_calendar_event": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤•āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤° ā¤‡ā¤ĩāĨ‡ā¤‚ā¤Ÿ", + "Outlook_calendar_settings": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤•āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸", + "Outlook_Calendar": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤•āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤°", "Outlook_Calendar_Enabled": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "Outlook_Calendar_Exchange_Url": "ā¤ā¤•āĨā¤¸ā¤šāĨ‡ā¤‚ā¤œ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Outlook_Calendar_Exchange_Url_Description": "ā¤ˆā¤Ąā¤ŦāĨā¤˛āĨā¤¯āĨ‚ā¤ā¤¸ ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨ‹ā¤¸āĨā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛āĨ¤", + "Outlook_Calendar_Outlook_Url": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Outlook_Calendar_Outlook_Url_Description": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤ĩāĨ‡ā¤Ŧ ā¤ā¤Ē ā¤˛āĨ‰ā¤¨āĨā¤š ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Output_format": "ā¤†ā¤‰ā¤Ÿā¤ĒāĨā¤Ÿ ā¤¸āĨā¤ĩā¤°āĨ‚ā¤Ē", + "Outlook_Sync_Failed": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤‡ā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛.", + "Outlook_Sync_Success": "ā¤†ā¤‰ā¤Ÿā¤˛āĨā¤• ā¤‡ā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤¸ā¤ŋā¤‚ā¤•āĨā¤°ā¤¨ā¤žā¤‡ā¤œā¤ŧāĨ¤", + "Override_URL_to_which_files_are_uploaded_This_url_also_used_for_downloads_unless_a_CDN_is_given": "ā¤œā¤ŋā¤¸ URL ā¤Ēā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤‚ ā¤‰ā¤¸āĨ‡ ā¤“ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤‡ā¤¸ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤­āĨ€ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤Ŧ ā¤¤ā¤• ā¤•ā¤ŋ ā¤¸āĨ€ā¤ĄāĨ€ā¤ā¤¨ ā¤¨ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨ‹", + "Override_Destination_Channel": "ā¤ŽāĨā¤–āĨā¤¯ ā¤ĒāĨˆā¤°ā¤žā¤ŽāĨ€ā¤Ÿā¤° ā¤ŽāĨ‡ā¤‚ ā¤—ā¤‚ā¤¤ā¤ĩāĨā¤¯ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤…ā¤§ā¤ŋā¤˛āĨ‡ā¤–ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Owner": "ā¤Žā¤žā¤˛ā¤ŋā¤•", + "Play": "ā¤–āĨ‡ā¤˛", + "Page_not_exist_or_not_permission": "ā¤ĒāĨ‡ā¤œ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤¯ā¤ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ ā¤šāĨ‹", + "Page_not_found": "ā¤ĒāĨƒā¤ˇāĨā¤  ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Page_title": "ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•ā¤ž ā¤ļāĨ€ā¤°āĨā¤ˇā¤•", + "Page_URL": "ā¤ĒāĨ‡ā¤œ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Pages": "ā¤ĒāĨƒā¤ˇāĨā¤ āĨ‹ā¤‚", + "Parent_channel_doesnt_exist": "ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ.", + "Participants": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤­ā¤žā¤—ā¤ŋā¤¯āĨ‹ā¤‚", + "Password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "Password_Change_Disabled": "ā¤†ā¤Ēā¤•āĨ‡ Rocket.Chat ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ", + "Password_Changed_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `[ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą]`āĨ¤\n - `[ā¤¨ā¤žā¤Ž]`, `[fname]`, `[lname]` ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¨ā¤žā¤Ž, ā¤ĒāĨā¤°ā¤Ĩā¤Ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n - `[ā¤ˆā¤ŽāĨ‡ā¤˛]` ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n - ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[Site_Name]` ā¤”ā¤° `[Site_URL]`āĨ¤", + "Password_Changed_Email_Subject": "[ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¨ā¤žā¤Ž] - ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Password_changed_section": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Password_changed_successfully": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Password_History": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸", + "Password_History_Amount": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤•āĨ€ ā¤˛ā¤‚ā¤Ŧā¤žā¤ˆ", + "Password_History_Amount_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤¨: ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤°āĨ‹ā¤•ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤žā¤˛ ā¤šāĨ€ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤žāĨ¤", + "Password_must_have": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤:", + "Password_Policy": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¨āĨ€ā¤¤ā¤ŋ", + "Password_Policy_Aria_Description": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨ ā¤¸āĨ‚ā¤šāĨ€ā¤Ŧā¤ĻāĨā¤§ ā¤šāĨˆ", + "Password_must_meet_the_complexity_requirements": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ‹ ā¤œā¤Ÿā¤ŋā¤˛ā¤¤ā¤ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "Password_to_access": "ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤šāĨ‡ā¤¤āĨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "Passwords_do_not_match": "ā¤¸ā¤žā¤‚ā¤•āĨ‡ā¤¤ā¤ŋā¤• ā¤ļā¤ŦāĨā¤Ļ ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤āĨ‡", + "Past_Chats": "ā¤Ēā¤ŋā¤›ā¤˛āĨ€ ā¤šāĨˆā¤Ÿ", + "Paste_here": "ā¤¯ā¤šā¤žā¤‚ ā¤šā¤ŋā¤Ēā¤•ā¤žā¤ā¤‚...", + "Paste": "ā¤ĒāĨ‡ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Pause": "ā¤ĩā¤ŋā¤°ā¤žā¤Ž", + "Paste_error": "ā¤•āĨā¤˛ā¤ŋā¤Ēā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤¸āĨ‡ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "Paid_Apps": "ā¤¸ā¤ļāĨā¤˛āĨā¤• ā¤ā¤ĒāĨā¤¸", + "Payload": "ā¤ĒāĨ‡ā¤˛āĨ‹ā¤Ą", + "PDF": "ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ", + "pdf_success_message": "ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¤āĨˆā¤¯ā¤žā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "pdf_error_message": "ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ", + "Peer_Password": "ā¤¸ā¤šā¤•ā¤°āĨā¤ŽāĨ€ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "People": "ā¤˛āĨ‹ā¤—", + "Permalink": "ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤˛ā¤ŋā¤‚ā¤•", + "Permissions": "ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚", + "Personal_Access_Tokens": "ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤Ēā¤šāĨā¤ā¤š ā¤ŸāĨ‹ā¤•ā¤¨", + "Pexip_Premium_only": "ā¤ĒāĨ‡ā¤•āĨā¤¸ā¤ŋā¤Ē (ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž)", + "Phone": "ā¤Ģā¤ŧāĨ‹ā¤¨", + "Phone_call": "ā¤ĢāĨ‹ā¤¨ ā¤•āĨ‰ā¤˛", + "Phone_Number": "ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤¨ā¤‚ā¤Ŧā¤°", + "Thank_you_exclamation_mark": "ā¤§ā¤¨āĨā¤¯ā¤ĩā¤žā¤Ļ!", + "Thank_You_For_Choosing_RocketChat": "ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤šāĨā¤¨ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤§ā¤¨āĨā¤¯ā¤ĩā¤žā¤Ļ!", + "Phone_already_exists": "ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "Phone_number": "ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤¨ā¤‚ā¤Ŧā¤°", + "PID": "ā¤ĒāĨ€ā¤†ā¤ˆā¤ĄāĨ€", + "Pin": "ā¤¨ā¤¤āĨā¤ĨāĨ€ ā¤•ā¤°ā¤¨ā¤ž", + "Pin_Message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤ŋā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "pin-message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤ŋā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "pin-message_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Pinned_a_message": "ā¤ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž:", + "Pinned_Messages": "ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Pinned_messages_unavailable_for_federation": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤", + "pinning-not-allowed": "ā¤Ēā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "PiwikAdditionalTrackers": "ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤Ēā¤ŋā¤ĩā¤ŋā¤• ā¤¸ā¤žā¤‡ā¤ŸāĨ‡ā¤‚", + "PiwikAdditionalTrackers_Description": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤ā¤• ā¤šāĨ€ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•āĨ‹ ā¤ĩā¤ŋā¤­ā¤ŋā¤¨āĨā¤¨ ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤ŸāĨā¤°āĨˆā¤• ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤Ēā¤ŋā¤ĩā¤ŋā¤• ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤”ā¤° ā¤¸ā¤žā¤‡ā¤Ÿā¤†ā¤ˆā¤ĄāĨ€ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚: `[ { \"ā¤ŸāĨā¤°āĨˆā¤•ā¤°ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛\": \"https://my.piwik.domain2/\", \"ā¤¸ā¤žā¤‡ā¤Ÿā¤†ā¤ˆā¤ĄāĨ€\": 42 } , { \"trackerURL\" : \"https://my.piwik.domain3/\", \"siteId\" : 15 } ]`", + "PiwikAnalytics_cookieDomain": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨", + "PiwikAnalytics_cookieDomain_Description": "ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤Ēā¤° ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤ŸāĨā¤°āĨˆā¤• ā¤•ā¤°āĨ‡ā¤‚", + "PiwikAnalytics_domains": "ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤˛ā¤ŋā¤‚ā¤• ā¤›āĨā¤Ēā¤žā¤ā¤‚", + "PiwikAnalytics_domains_Description": "'ā¤†ā¤‰ā¤Ÿā¤˛ā¤ŋā¤‚ā¤•āĨā¤¸' ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤ŽāĨ‡ā¤‚, ā¤œāĨā¤žā¤žā¤¤ ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤›āĨā¤Ēā¤žā¤ā¤‚āĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ ā¤ā¤• ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤Ąā¤žā¤˛āĨ‡ā¤‚ ā¤”ā¤° ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩā¤ŋā¤­ā¤žā¤œā¤• ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "PiwikAnalytics_prependDomain": "ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤•āĨ‹ ā¤ĒāĨā¤°āĨ€ā¤ĒāĨ‡ā¤¨āĨā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "PiwikAnalytics_prependDomain_Description": "ā¤ŸāĨā¤°āĨˆā¤•ā¤ŋā¤‚ā¤— ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤¸ā¤žā¤‡ā¤Ÿ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤•āĨ‹ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤¸āĨ‡ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "PiwikAnalytics_siteId_Description": "ā¤‡ā¤¸ ā¤¸ā¤žā¤‡ā¤Ÿ ā¤•āĨ€ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ€ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤¸ā¤žā¤‡ā¤Ÿ ā¤†ā¤ˆā¤ĄāĨ€āĨ¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: 17", + "PiwikAnalytics_url_Description": "ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤œā¤šā¤žā¤‚ ā¤Ēā¤ŋā¤ĩā¤ŋā¤• ā¤¸āĨā¤Ĩā¤ŋā¤¤ ā¤šāĨˆ, ā¤‰ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤ŋā¤›ā¤˛ā¤ž ā¤¸āĨā¤˛āĨˆā¤ļ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤•ā¤°ā¤¨ā¤ž ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `https://piwik.rocket.chat/`", + "Placeholder_for_email_or_username_login_field": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¯ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°", + "Placeholder_for_password_login_confirm_field": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤° ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "Placeholder_for_password_login_field": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°", + "Platform_Windows": "ā¤–ā¤ŋā¤Ąā¤ŧā¤•ā¤ŋā¤¯ā¤žā¤", + "Platform_Linux": "ā¤˛ā¤ŋā¤¨ā¤•āĨā¤¸", + "Platform_Mac": "ā¤ŽāĨˆā¤•", + "Please_add_a_comment": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Please_add_a_comment_to_close_the_room": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤•ā¤Žā¤°ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", "Please_answer_survey": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤‡ā¤¸ ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤ĩā¤°ā¤ŋā¤¤ ā¤¸ā¤°āĨā¤ĩāĨ‡ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤•āĨā¤ˇā¤Ŗ ā¤˛āĨ‡ā¤‚", + "Please_enter_usernames": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "please_enter_valid_domain": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĄāĨ‹ā¤ŽāĨ‡ā¤¨ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Please_enter_value_for_url": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•āĨ‡ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤Žā¤žā¤¨ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Please_enter_your_new_password_below": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¨āĨ€ā¤šāĨ‡ ā¤Ąā¤žā¤˛āĨ‡ā¤‚:", + "Please_enter_your_password": "ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "Please_fill_a_label": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤˛āĨ‡ā¤Ŧā¤˛ ā¤­ā¤°āĨ‡ā¤‚", + "Please_fill_a_name": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤¨ā¤žā¤Ž ā¤­ā¤°āĨ‡ā¤‚", + "Please_fill_a_token_name": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤ĩāĨˆā¤§ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¨ā¤žā¤Ž ā¤­ā¤°āĨ‡ā¤‚", + "Please_fill_a_username": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤­ā¤°āĨ‡ā¤‚", + "Please_fill_all_the_information": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸ā¤žā¤°āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤­ā¤°āĨ‡ā¤‚", + "Please_fill_an_email": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­ā¤°āĨ‡ā¤‚", "Please_fill_name_and_email": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­ā¤°āĨ‡ā¤‚", + "Please_fill_out_reason_for_report": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ž ā¤•ā¤žā¤°ā¤Ŗ ā¤­ā¤°āĨ‡ā¤‚", + "Please_select_an_user": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨā¤¨āĨ‡ā¤‚", + "Please_select_enabled_yes_or_no": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤šāĨā¤¨āĨ‡ā¤‚", + "Please_select_visibility": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ā¤• ā¤ĻāĨƒā¤ļāĨā¤¯ā¤¤ā¤ž ā¤šāĨā¤¨āĨ‡ā¤‚", + "Please_wait": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°āĨ‡ā¤‚", + "Please_wait_activation": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°āĨ‡ā¤‚, ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤•āĨā¤› ā¤¸ā¤Žā¤¯ ā¤˛ā¤— ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ.", + "Please_wait_while_OTR_is_being_established": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°āĨ‡ā¤‚", + "Please_wait_while_your_account_is_being_deleted": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¤ā¤Ŧ ā¤¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤Ŧ ā¤¤ā¤• ā¤†ā¤Ēā¤•ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨ‹...", + "Please_wait_while_your_profile_is_being_saved": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¤ā¤Ŧ ā¤¤ā¤• ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤Ŧ ā¤¤ā¤• ā¤†ā¤Ēā¤•āĨ€ ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨ‹...", + "Policies": "ā¤¨āĨ€ā¤¤ā¤ŋā¤¯āĨ‹ā¤‚", + "Pool": "ā¤ĒāĨ‚ā¤˛", + "Port": "ā¤Ēā¤¤āĨā¤¤ā¤¨", + "Post_as": "ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Post_to": "ā¤•āĨ‹ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ", + "Post_to_Channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Post_to_s_as_s": "%s ā¤•āĨ‹ %s ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "post-readonly": "ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤", + "post-readonly_description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Powered_by_JoyPixels": "ā¤œāĨ‰ā¤¯ā¤Ēā¤ŋā¤•āĨā¤¸ā¤˛āĨā¤¸ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤ŋā¤¤", + "Powered_by_RocketChat": "ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤ŋā¤¤", + "powers-of-ten": "ā¤Ļā¤¸ ā¤•āĨ€ ā¤ļā¤•āĨā¤¤ā¤ŋā¤¯ā¤žā¤", + "powers-of-two": "ā¤ĻāĨ‹ ā¤•āĨ€ ā¤ļā¤•āĨā¤¤ā¤ŋā¤¯ā¤žā¤", + "increments-of-two": "ā¤ĻāĨ‹ ā¤•āĨ€ ā¤ĩāĨƒā¤ĻāĨā¤§ā¤ŋ", + "Preferences": "ā¤Ēā¤¸ā¤‚ā¤Ļ", + "Preferences_saved": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤ ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤—ā¤ˆā¤‚", + "Preparing_data_for_import_process": "ā¤†ā¤¯ā¤žā¤¤ ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¤āĨˆā¤¯ā¤žā¤° ā¤•ā¤°ā¤¨ā¤ž", + "Preparing_list_of_channels": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤•āĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "Preparing_list_of_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤•āĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "Preparing_list_of_users": "ā¤‰ā¤Ēā¤­āĨ‹ā¤•āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤•āĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "Presence": "ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Preview": "ā¤ĒāĨ‚ā¤°āĨā¤ĩ ā¤Ļā¤°āĨā¤ļā¤¨", + "preview-c-room": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "preview-c-room_description": "ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Previous_month": "ā¤Ēā¤ŋā¤›ā¤˛ā¤ž ā¤Žā¤šāĨ€ā¤¨ā¤ž", + "Previous_week": "ā¤Ēā¤ŋā¤›ā¤˛ā¤ž ā¤¸ā¤ĒāĨā¤¤ā¤žā¤š", + "Price": "ā¤•āĨ€ā¤Žā¤¤", + "Priorities": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤“ā¤‚", + "Priority": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž", + "Priority_saved": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤—ā¤ˆ", + "Priority_removed": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Priorities_restored": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤ ā¤Ŧā¤šā¤žā¤˛ ā¤•āĨ€ ā¤—ā¤ˆā¤‚", + "Privacy": "ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž", + "Privacy_Policy": "ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¨āĨ€ā¤¤ā¤ŋ", + "Privacy_policy": "ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¨āĨ€ā¤¤ā¤ŋ", + "Privacy_summary": "ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¸ā¤žā¤°ā¤žā¤‚ā¤ļ", + "Private": "ā¤¨ā¤ŋā¤œāĨ€", + "private": "ā¤¨ā¤ŋā¤œāĨ€", + "Private_channels": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛", + "Private_Apps": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸", + "Private_Channel": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛", + "Private_Channels": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛", + "Private_Chats": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤Ÿ", + "Private_Group": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š", + "Private_Groups": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š", + "Private_Groups_list": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€", + "Private_Team": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ŸāĨ€ā¤Ž", + "Productivity": "ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļā¤•ā¤¤ā¤ž", + "Profile": "ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛", + "Profile_details": "ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "Profile_picture": "ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĢāĨ‹ā¤ŸāĨ‹", + "Profile_saved_successfully": "ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¸ā¤šāĨ‡ā¤œāĨ€ ā¤—ā¤ˆ", + "Prometheus": "ā¤ĒāĨā¤°āĨ‹ā¤ŽāĨ‡ā¤Ĩā¤ŋā¤¯ā¤¸", + "Prometheus_API_User_Agent": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ: ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤ŸāĨā¤°āĨˆā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Prometheus_Garbage_Collector": "ā¤¨āĨ‹ā¤Ąā¤œāĨ‡ā¤ā¤¸ ā¤œāĨ€ā¤¸āĨ€ ā¤˛āĨ€ā¤œā¤ŋā¤", + "Prometheus_Garbage_Collector_Alert": "ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤¨ā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨ā¤ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "Prometheus_Reset_Interval": "ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ (ā¤ā¤Žā¤ā¤¸)", + "Protocol": "ā¤ļā¤ŋā¤ˇāĨā¤Ÿā¤žā¤šā¤žā¤°", + "Prune": "ā¤•ā¤žā¤‚ā¤Ÿ - ā¤›ā¤žā¤‚ā¤Ÿ", + "Prune_finished": "ā¤ĒāĨā¤°āĨ‚ā¤¨ ā¤–ā¤ŧā¤¤āĨā¤Ž", + "Prune_Messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤›ā¤ā¤Ÿā¤žā¤ˆ ā¤•ā¤°āĨ‡ā¤‚", + "Prune_Modal": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĩā¤žā¤•ā¤ˆ ā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤ā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚? ā¤•ā¤žā¤ŸāĨ‡ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž.", + "Prune_Warning_after": "ā¤¯ā¤š %s ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ %s ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤­āĨ€ %s ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤—ā¤žāĨ¤", + "Prune_Warning_all": "ā¤¯ā¤š %s ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤­āĨ€ %s ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤—ā¤ž!", + "Prune_Warning_before": "ā¤¯ā¤š %s ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ %s ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤­āĨ€ %s ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤—ā¤žāĨ¤", + "Prune_Warning_between": "ā¤¯ā¤š %s ā¤ŽāĨ‡ā¤‚ %s ā¤”ā¤° %s ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤•āĨ‡ ā¤¸ā¤­āĨ€ %s ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤—ā¤žāĨ¤", + "Pruning_files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤ā¤Ÿ ā¤•āĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨˆā¤‚...", + "Pruning_messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤ā¤Ÿ ā¤•āĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨˆ...", "Public": "ā¤œā¤¨ā¤¤ā¤ž", + "public": "ā¤œā¤¨ā¤¤ā¤ž", + "Public_Channel": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛", + "Public_Channels": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛", + "Public_Community": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯", + "Public_URL": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Purchase_for_free": "ā¤ŽāĨā¤Ģā¤ŧāĨā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤–ā¤°āĨ€ā¤Ļā¤žā¤°āĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "Purchase_for_price": "$%s ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–ā¤°āĨ€ā¤Ļā¤žā¤°āĨ€", + "Purchased": "ā¤–ā¤°āĨ€ā¤ĻāĨ€", + "Push": "ā¤§ā¤•āĨ‡ā¤˛ā¤¨ā¤ž", + "Push_Description": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤‰ā¤Ēā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤”ā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Push_Notifications": "ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤§ā¤•āĨā¤•ā¤ž", + "Push_apn_cert": "APN Cert", + "Push_apn_dev_cert": "APN Dev Cert", + "Push_apn_dev_key": "ā¤ā¤ĒāĨ€ā¤ā¤¨ ā¤ĻāĨ‡ā¤ĩ ā¤•āĨā¤‚ā¤œāĨ€", + "Push_apn_dev_passphrase": "ā¤ā¤ĒāĨ€ā¤ā¤¨ ā¤ĻāĨ‡ā¤ĩ ā¤Ēā¤žā¤¸ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤œā¤ŧ", + "Push_apn_key": "ā¤ā¤ĒāĨ€ā¤ā¤¨ ā¤•āĨā¤‚ā¤œāĨ€", + "Push_apn_passphrase": "ā¤ā¤ĒāĨ€ā¤ā¤¨ ā¤Ēā¤žā¤¸ā¤Ģā¤ŧāĨā¤°āĨ‡ā¤œā¤ŧ", "Push_enable": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Push_enable_gateway": "ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Push_enable_gateway_Description": "**ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€:** ā¤†ā¤Ēā¤•āĨ‹ ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤šā¤Žā¤žā¤°āĨ‡ ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° (ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤ĩā¤ŋā¤œā¤ŧā¤žā¤°āĨā¤Ą> ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€> ā¤°ā¤œā¤ŋā¤¸āĨā¤Ÿā¤° ā¤¸ā¤°āĨā¤ĩā¤°) ā¤”ā¤° ā¤šā¤Žā¤žā¤°āĨ€ ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤ļā¤°āĨā¤¤āĨ‹ā¤‚ (ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤ĩā¤ŋā¤œā¤ŧā¤žā¤°āĨā¤Ą> ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€> ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤ž ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚ ā¤…ā¤¨āĨā¤Ŧā¤‚ā¤§) ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤­ā¤˛āĨ‡ ā¤šāĨ€ ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤‰ā¤¸ ā¤Ēā¤° ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨ‹, ā¤¯ā¤Ļā¤ŋ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤¤āĨ‹ **ā¤¨ā¤šāĨ€ā¤‚** ā¤•ā¤žā¤Ž ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤", + "Push_gateway": "ā¤ĻāĨā¤ĩā¤žā¤°", + "Push_gateway_description": "ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡ ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤˛ā¤žā¤‡ā¤¨āĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Push_gcm_api_key": "ā¤œāĨ€ā¤¸āĨ€ā¤ā¤Ž ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤•āĨā¤‚ā¤œāĨ€", + "Push_gcm_project_number": "ā¤œāĨ€ā¤¸āĨ€ā¤ā¤Ž ā¤Ēā¤°ā¤ŋā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Push_production": "ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļā¤¨", + "Push_request_content_from_server": "Apple ā¤”ā¤° Google (ā¤”ā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡) ā¤¸āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤›ā¤ŋā¤Ēā¤žā¤ā¤", + "Push_request_content_from_server_Description": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤•āĨ‹ ā¤ĒāĨā¤ļ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤•ā¤°ā¤•āĨ‡ Apple/Google ā¤•āĨ‡ ā¤¸ā¤žā¤Žā¤¨āĨ‡ ā¤‰ā¤œā¤žā¤—ā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯, ā¤•āĨ‡ā¤ĩā¤˛ ā¤ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤ˆā¤ĄāĨ€ ā¤ĒāĨā¤ļ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤—ā¤¤ā¤ŋā¤ļāĨ€ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤˛ā¤žā¤ā¤—ā¤ž ā¤”ā¤° ā¤‡ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤•āĨ‹ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤ ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤‚, ā¤¯ā¤š \"ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šāĨˆ\" ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤ ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤Ēā¤° ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩāĨ€ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Push_Setting_Requires_Restart_Alert": "ā¤‡ā¤¸ ā¤Žā¤žā¤¨ ā¤•āĨ‹ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ Rocket.Chat ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤ƒ ā¤†ā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Push_show_message": "ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Push_show_username_room": "ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤¨ā¤˛/ā¤¸ā¤ŽāĨ‚ā¤š/ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Push_test_push": "ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤ž", + "Query": "ā¤¸ā¤ĩā¤žā¤˛", + "Query_description": "ā¤¯ā¤š ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•ā¤ŋā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨ā¤ž ā¤šāĨˆāĨ¤ ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤•āĨā¤ĩāĨ‡ā¤°āĨ€ ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¯ā¤š ā¤ā¤• ā¤ĩāĨˆā¤§ JSON ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤. ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: \"{\"createdAt\":{\"$gt\":{\"$date\": \"2015-01-01T00:00:00.000Z\"}}}\"", + "Query_is_not_valid_JSON": "ā¤•āĨā¤ĩāĨ‡ā¤°āĨ€ ā¤Žā¤žā¤¨āĨā¤¯ JSON ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Queue": "ā¤•ā¤¤ā¤žā¤°", + "Queued": "ā¤•ā¤¤ā¤žā¤°ā¤Ŧā¤ĻāĨā¤§", + "Queues": "ā¤ĒāĨ‚ā¤‚ā¤›", + "Queue_delay_timeout": "ā¤•ā¤¤ā¤žā¤° ā¤ĒāĨā¤°ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤ĩā¤ŋā¤˛ā¤‚ā¤Ŧ ā¤¸ā¤Žā¤¯ā¤Ŧā¤žā¤šāĨā¤¯", + "Queue_Time": "ā¤•ā¤¤ā¤žā¤° ā¤¸ā¤Žā¤¯", + "Queue_management": "ā¤•ā¤¤ā¤žā¤° ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨", + "Quick_reactions": "ā¤¤āĨā¤ĩā¤°ā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤", + "Quick_reactions_description": "ā¤œā¤Ŧ ā¤†ā¤Ēā¤•ā¤ž ā¤Žā¤žā¤‰ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤° ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ€ ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤¤āĨ€ā¤¨ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚ ā¤¤ā¤• ā¤†ā¤¸ā¤žā¤¨ ā¤Ēā¤šāĨā¤‚ā¤š ā¤Žā¤ŋā¤˛ā¤¤āĨ€ ā¤šāĨˆ", + "quote": "ā¤‰ā¤ĻāĨā¤§ā¤°ā¤Ŗ", + "Quote": "ā¤‰ā¤ĻāĨā¤§ā¤°ā¤Ŗ", + "Random": "Random", + "Rate Limiter": "ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤•", + "Rate Limiter_Description": "ā¤¸ā¤žā¤‡ā¤Ŧā¤° ā¤šā¤Žā¤˛āĨ‹ā¤‚ ā¤”ā¤° ā¤¸āĨā¤•āĨā¤°āĨˆā¤Ēā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤°āĨ‹ā¤•ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤¯ā¤ž ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§āĨ‹ā¤‚ ā¤•āĨ€ ā¤Ļā¤° ā¤•āĨ‹ ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Rate_Limiter_Limit_RegisterUser": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¨ā¤‚ā¤Ŧā¤° ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤• ā¤Ēā¤° ā¤•āĨ‰ā¤˛ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Rate_Limiter_Limit_RegisterUser_Description": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤°āĨ‡ā¤Ÿ ā¤˛ā¤ŋā¤Žā¤ŋā¤Ÿā¤° ā¤…ā¤¨āĨā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤¸ā¤Žā¤¯ ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‡ ā¤­āĨ€ā¤¤ā¤° ā¤…ā¤¨āĨā¤Žā¤¤ ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤Ŧā¤ŋā¤‚ā¤ĻāĨā¤“ā¤‚ (ā¤†ā¤°ā¤ˆā¤ā¤¸ā¤ŸāĨ€ ā¤”ā¤° ā¤°āĨ€ā¤¯ā¤˛-ā¤Ÿā¤žā¤‡ā¤Ž ā¤ā¤ĒāĨ€ā¤†ā¤ˆ) ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤•āĨ‰ā¤˛ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žāĨ¤", + "React_when_read_only": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "React_when_read_only_changed_successfully": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "Reacted_with": "ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ ā¤•āĨ€", + "Reactions": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚", + "Read_by": "ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚", + "Read_only": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤", + "Read_Receipts": "ā¤°ā¤¸āĨ€ā¤ĻāĨ‡ā¤‚ ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚", + "Readability": "ā¤Ēā¤ ā¤¨āĨ€ā¤¯ā¤¤ā¤ž", + "This_room_is_read_only": "ā¤¯ā¤š ā¤•ā¤Žā¤°ā¤ž ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨˆ", + "Only_people_with_permission_can_send_messages_here": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤˛āĨ‹ā¤— ā¤šāĨ€ ā¤¯ā¤šā¤žā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Read_only_changed_successfully": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Read_only_channel": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨˆā¤¨ā¤˛", + "Read_only_group": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤¸ā¤ŽāĨ‚ā¤š", + "Real_Estate": "ā¤°ā¤ŋā¤¯ā¤˛ ā¤ā¤¸āĨā¤ŸāĨ‡ā¤Ÿ", + "Real_Time_Monitoring": "ā¤ĩā¤žā¤¸āĨā¤¤ā¤ĩā¤ŋā¤• ā¤¸ā¤Žā¤¯ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤—ā¤°ā¤žā¤¨āĨ€", + "RealName_Change_Disabled": "ā¤†ā¤Ēā¤•āĨ‡ Rocket.Chat ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨āĨ‡ ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ", + "Reason_To_Join": "ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•ā¤ž ā¤•ā¤žā¤°ā¤Ŗ", + "Receive_alerts": "ā¤…ā¤˛ā¤°āĨā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Receive_Group_Mentions": "@ā¤¸ā¤­āĨ€ ā¤”ā¤° @ā¤¯ā¤šā¤žā¤ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Receive_login_notifications": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Receive_Login_Detection_Emails": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Receive_Login_Detection_Emails_Description": "ā¤šā¤° ā¤Ŧā¤žā¤° ā¤†ā¤Ēā¤•āĨ‡ ā¤–ā¤žā¤¤āĨ‡ ā¤Ēā¤° ā¤¨ā¤ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤šā¤˛ā¤¨āĨ‡ ā¤Ēā¤° ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Recent_Import_History": "ā¤šā¤žā¤˛ ā¤•ā¤ž ā¤†ā¤¯ā¤žā¤¤ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸", + "Record": "ā¤…ā¤­ā¤ŋā¤˛āĨ‡ā¤–", + "Records": "ā¤…ā¤­ā¤ŋā¤˛āĨ‡ā¤–", + "recording": "ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ąā¤ŋā¤‚ā¤—", + "Redirect_URI": "ā¤¯āĨ‚ā¤†ā¤°ā¤†ā¤ˆ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Redirect_URL_does_not_match": "ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤ā¤ž", + "Refresh": "ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤•ā¤°ā¤¨ā¤ž", + "Refresh_keys": "ā¤•āĨā¤‚ā¤œā¤ŋā¤¯ā¤žā¤ ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤•ā¤°āĨ‡ā¤‚", + "Refresh_oauth_services": "OAuth ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤ ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤•ā¤°āĨ‡ā¤‚", + "Refresh_your_page_after_install_to_enable_screen_sharing": "ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤ļāĨ‡ā¤¯ā¤°ā¤ŋā¤‚ā¤— ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĒāĨ‡ā¤œ ā¤•āĨ‹ ā¤°āĨ€ā¤ĢāĨā¤°āĨ‡ā¤ļ ā¤•ā¤°āĨ‡ā¤‚", + "Refreshing": "ā¤°ā¤ŋā¤ĢāĨā¤°āĨ‡ā¤ļā¤ŋā¤‚ā¤—", + "Regenerate_codes": "ā¤•āĨ‹ā¤Ą ā¤ĒāĨā¤¨: ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Regexp_validation": "ā¤¨ā¤ŋā¤¯ā¤Žā¤ŋā¤¤ ā¤…ā¤­ā¤ŋā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨", + "Register": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°ā¤ĩā¤žā¤¨ā¤ž", + "Register_new_account": "ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤°ā¤œā¤ŋā¤¸āĨā¤Ÿā¤° ā¤•ā¤°āĨ‡", + "Register_Server": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Register_Server_Info": "Rocket.Chat Technologies Corp. ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤•ā¤°ā¤žā¤ ā¤—ā¤ ā¤ĒāĨ‚ā¤°āĨā¤ĩ-ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡ ā¤”ā¤° ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Register_Server_Opt_In": "ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļ ā¤”ā¤° ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨", + "Register_Server_Registered": "ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "Register_Server_Registered_I_Agree": "ā¤ŽāĨˆā¤‚ ā¤‡ā¤¸ā¤¸āĨ‡ ā¤¸ā¤šā¤Žā¤¤ ā¤šāĨ‚ā¤‚", + "Register_Server_Registered_Livechat": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€", + "Register_Server_Registered_Marketplace": "ā¤ā¤ĒāĨā¤¸ ā¤Ŧā¤žā¤œā¤ŧā¤žā¤°", + "Register_Server_Registered_OAuth": "ā¤¸ā¤žā¤Žā¤žā¤œā¤ŋā¤• ā¤¨āĨ‡ā¤Ÿā¤ĩā¤°āĨā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ OAuth ā¤ĒāĨā¤°āĨ‰ā¤•āĨā¤¸āĨ€", + "Register_Server_Registered_Push_Notifications": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ĒāĨā¤ļ ā¤¨āĨ‹ā¤Ÿā¤ŋā¤Ģā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡", + "Register_Server_Standalone": "ā¤¸āĨā¤ŸāĨˆā¤‚ā¤Ąā¤…ā¤˛āĨ‹ā¤¨ ā¤°ā¤–āĨ‡ā¤‚, ā¤†ā¤Ēā¤•āĨ‹ ā¤‡ā¤¸ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤—āĨ€", + "Register_Server_Standalone_Own_Certificates": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤ƒ ā¤¸ā¤‚ā¤•ā¤˛ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Register_Server_Standalone_Service_Providers": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤–ā¤žā¤¤āĨ‡ ā¤Ŧā¤¨ā¤žā¤ā¤", + "Register_Server_Standalone_Update_Settings": "ā¤ĒāĨ‚ā¤°āĨā¤ĩ-ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ‹ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Register_Server_Terms_Alert": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨ‚ā¤°ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤ļā¤°āĨā¤¤āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤šā¤Žā¤¤ ā¤šāĨ‹ā¤‚", + "register-on-cloud": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤Ēā¤° ā¤°ā¤œā¤ŋā¤¸āĨā¤Ÿā¤° ā¤•ā¤°āĨ‡ā¤‚", + "register-on-cloud_description": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤Ēā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Registration": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ", + "Registration_Succeeded": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤Ģā¤˛ ā¤šāĨā¤†", + "Registration_via_Admin": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ", + "Regular_Expressions": "ā¤¨ā¤ŋā¤¯ā¤Žā¤ŋā¤¤ ā¤…ā¤­ā¤ŋā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ", + "Reject_call": "ā¤•āĨ‰ā¤˛ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Release": "ā¤ŽāĨā¤•āĨā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Releases": "ā¤ĩā¤ŋā¤œāĨā¤žā¤ĒāĨā¤¤ā¤ŋ", + "Religious": "ā¤§ā¤žā¤°āĨā¤Žā¤ŋā¤•", + "Reload": "ā¤ĒāĨā¤¨ā¤ƒ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Reload_page": "ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ĒāĨā¤¨ā¤ƒ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Reload_Pages": "ā¤ĒāĨ‡ā¤œ ā¤ĒāĨā¤¨ā¤ƒ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Remember_my_credentials": "ā¤ŽāĨ‡ā¤°āĨ€ ā¤¸ā¤žā¤– ā¤¯ā¤žā¤Ļ ā¤°ā¤–āĨ‡ā¤‚", + "Remove": "ā¤¨ā¤ŋā¤•ā¤žā¤˛ā¤¨ā¤ž", + "Remove_Admin": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤šā¤Ÿā¤žā¤ā¤", + "Remove_Association": "ā¤ā¤¸āĨ‹ā¤¸ā¤ŋā¤ā¤ļā¤¨ ā¤šā¤Ÿā¤žā¤ā¤", + "Remove_as_leader": "ā¤¨āĨ‡ā¤¤ā¤ž ā¤Ēā¤Ļ ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤“", + "Remove_as_moderator": "ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤Ÿā¤° ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šā¤Ÿā¤žā¤ā¤", + "Remove_as_owner": "ā¤¸āĨā¤ĩā¤žā¤ŽāĨ€ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šā¤Ÿā¤žā¤ā¤", + "remove-canned-responses": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨā¤¤āĨā¤¤ā¤° ā¤šā¤Ÿā¤žā¤ā¤", + "remove-canned-responses_description": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨā¤¤āĨā¤¤ā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Remove_Channel_Links": "ā¤šāĨˆā¤¨ā¤˛ ā¤˛ā¤ŋā¤‚ā¤• ā¤šā¤Ÿā¤žā¤ā¤", + "Remove_custom_oauth": "ā¤•ā¤¸āĨā¤Ÿā¤Ž OAuth ā¤šā¤Ÿā¤žā¤ā¤", + "Remove_from_room": "ā¤•ā¤Žā¤°āĨ‡ ā¤¸āĨ‡ ā¤¨ā¤ŋā¤•ā¤žā¤˛āĨ‹", + "Remove_from_team": "ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤“", + "Remove_last_admin": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Remove_someone_from_room": "ā¤•ā¤ŋā¤¸āĨ€ ā¤•āĨ‹ ā¤•ā¤Žā¤°āĨ‡ ā¤¸āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤¨ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "remove-closed-livechat-room": "ā¤Ŧā¤‚ā¤Ļ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤šā¤Ÿā¤žā¤ā¤", + "remove-closed-livechat-room_description": "ā¤Ŧā¤‚ā¤Ļ ā¤‘ā¤ŽāĨā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤°āĨ‚ā¤Ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "remove-closed-livechat-rooms": "ā¤¸ā¤­āĨ€ ā¤Ŧā¤‚ā¤Ļ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°āĨ‡ ā¤šā¤Ÿā¤žā¤ā¤", + "remove-closed-livechat-rooms_description": "ā¤¸ā¤­āĨ€ ā¤Ŧā¤‚ā¤Ļ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "remove-livechat-department": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤šā¤Ÿā¤žā¤ā¤", + "remove-livechat-department_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "remove-slackbridge-links": "ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤˛ā¤ŋā¤‚ā¤• ā¤šā¤Ÿā¤žā¤ā¤", + "remove-slackbridge-links_description": "ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤˛ā¤ŋā¤‚ā¤• ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "remove-team-channel": "ā¤ŸāĨ€ā¤Ž ā¤šāĨˆā¤¨ā¤˛ ā¤šā¤Ÿā¤žā¤ā¤", + "remove-team-channel_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "remove-user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤ā¤", + "remove-user_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤Žā¤°āĨ‡ ā¤¸āĨ‡ ā¤¨ā¤ŋā¤•ā¤žā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Removed": "ā¤¨ā¤ŋā¤•ā¤žā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Removed_User": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Removed__roomName__from_this_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ #{{roomName}} ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Removed__username__from_team": "@{{user_removed}} ā¤•āĨ‹ ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Removed__roomName__from_the_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ #{{roomName}} ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Removed__username__from_the_team": "@{{user_removed}} ā¤•āĨ‹ ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Replay": "REPLAY", + "Replied_on": "ā¤Ēā¤° ā¤‰ā¤¤āĨā¤¤ā¤° ā¤Ļā¤ŋā¤¯ā¤ž", + "Replies": "ā¤œā¤ĩā¤žā¤Ŧ", + "Reply": "ā¤œā¤ĩā¤žā¤Ŧ", + "Reply_in_direct_message": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ā¤‚", + "Reply_in_thread": "ā¤ĨāĨā¤°āĨ‡ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ā¤‚", + "Reply_via_Email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ā¤‚", + "ReplyTo": "ā¤•āĨ‹ ā¤‰ā¤¤āĨā¤¤ā¤°", + "Report": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤ĩāĨ‡ā¤Ļā¤¨", + "Reports": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤ŸāĨ‹ā¤‚", + "Report_Abuse": "ā¤ĻāĨā¤°āĨā¤Ēā¤¯āĨ‹ā¤— ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ€ ā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ĻāĨ‡ā¤‚", + "Report_exclamation_mark": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤ĩāĨ‡ā¤Ļā¤¨!", + "Report_has_been_sent": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤­āĨ‡ā¤œ ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ", + "Report_Number": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "Report_this_message_question_mark": "ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ€ ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚?", + "Report_User": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Reporting": "ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿā¤ŋā¤‚ā¤—", + "Request": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§", + "Request_comment_when_closing_conversation": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°āĨ‡ā¤‚", + "Request_comment_when_closing_conversation_description": "ā¤¯ā¤Ļā¤ŋ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ā¤• ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€āĨ¤", + "Request_tag_before_closing_chat": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ŸāĨˆā¤— ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°āĨ‡ā¤‚", + "request": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§", + "requests": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§", + "Requests": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§", + "Requested": "ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž", + "Requested_apps_will_appear_here": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ā¤ŋā¤¤ ā¤ā¤ĒāĨā¤¸ ā¤¯ā¤šā¤žā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤‚ā¤—āĨ‡", + "request-pdf-transcript": "ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°āĨ‡ā¤‚", + "request-pdf-transcript_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Requested_At": "ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Requested_By": "ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Require": "ā¤œā¤ŧā¤°āĨ‚ā¤°ā¤¤ ā¤šāĨ‹ā¤¨ā¤ž", + "Required": "ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•", + "required": "ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•", + "Require_all_tokens": "ā¤¸ā¤­āĨ€ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Require_any_token": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Require_password_change": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Resend_verification_email": "ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤¨ā¤ƒ ā¤­āĨ‡ā¤œāĨ‡", + "Reset": "ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ", + "Reset_priorities": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Reset_Connection": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Reset_E2E_Key": "E2E ā¤•āĨā¤‚ā¤œāĨ€ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Reset_password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ", + "Reset_section_settings": "ā¤Ąā¤ŋā¤ĢāĨ‰ā¤˛āĨā¤ŸāĨā¤¸ ā¤•ā¤ž ā¤ĒāĨā¤¨ā¤ƒā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨", + "Reset_TOTP": "ā¤ŸāĨ€ā¤“ā¤ŸāĨ€ā¤ĒāĨ€ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "reset-other-user-e2e-key": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž E2E ā¤•āĨā¤‚ā¤œāĨ€ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Responding": "ā¤œā¤ĩā¤žā¤Ŧ", + "Response_description_post": "ā¤–ā¤žā¤˛āĨ€ ā¤ŦāĨ‰ā¤ĄāĨ€ ā¤¯ā¤ž ā¤–ā¤žā¤˛āĨ€ ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤ĒāĨā¤°āĨ‰ā¤Ēā¤°āĨā¤ŸāĨ€ ā¤ĩā¤žā¤˛āĨ‡ ā¤ŦāĨ‰ā¤ĄāĨ€ ā¤•āĨ‹ ā¤†ā¤¸ā¤žā¤¨āĨ€ ā¤¸āĨ‡ ā¤¨ā¤œā¤°ā¤…ā¤‚ā¤Ļā¤žā¤œ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤—āĨˆā¤°-200 ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤‰ā¤šā¤ŋā¤¤ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤Šā¤Ēā¤° ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤‰ā¤Ēā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤ā¤• ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•āĨ€ ā¤œā¤žā¤ā¤—āĨ€āĨ¤ ā¤†ā¤Ē ā¤‰ā¤Ēā¤°āĨ‹ā¤•āĨā¤¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤‡ā¤¨ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤“ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ą ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Response_description_pre": "ā¤¯ā¤Ļā¤ŋ ā¤šāĨˆā¤‚ā¤Ąā¤˛ā¤° ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩā¤žā¤Ēā¤¸ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ JSON ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•āĨ‡ ā¤ŽāĨā¤–āĨā¤¯ ā¤­ā¤žā¤— ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤žā¤Ēā¤¸ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤:", + "Restart": "ā¤ĒāĨā¤¨ā¤ƒ ā¤†ā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Restart_the_server": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "restart-server": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "restart-server_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Results": "ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž", + "Resume": "ā¤Ģā¤ŋā¤° ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨ā¤ž", + "Retail": "ā¤–āĨā¤Ļā¤°ā¤ž", + "Retention_setting_changed_successfully": "ā¤…ā¤ĩā¤§ā¤žā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ ā¤ĻāĨ€ ā¤—ā¤ˆ", + "RetentionPolicy": "ā¤…ā¤ĩā¤§ā¤žā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋ", + "RetentionPolicy_Advanced_Precision": "ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤…ā¤ĩā¤§ā¤žā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "RetentionPolicy_Advanced_Precision_Cron": "ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤…ā¤ĩā¤§ā¤žā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨā¤°āĨ‰ā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "RetentionPolicy_Advanced_Precision_Cron_Description": "ā¤•āĨā¤°āĨ‰ā¤¨ ā¤œāĨ‰ā¤Ŧ ā¤ā¤•āĨā¤¸ā¤ĒāĨā¤°āĨ‡ā¤ļā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤ĒāĨā¤°āĨ‚ā¤¨ ā¤Ÿā¤žā¤‡ā¤Žā¤° ā¤•āĨ‹ ā¤•ā¤ŋā¤¤ā¤¨āĨ€ ā¤Ŧā¤žā¤° ā¤šā¤˛ā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤‡ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤ŸāĨ€ā¤• ā¤Žā¤žā¤¨ ā¤Ēā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤¤āĨ‡ā¤œā¤ŧ ā¤°ā¤ŋā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤Ÿā¤žā¤‡ā¤Žā¤° ā¤ĩā¤žā¤˛āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤Ŧā¤Ąā¤ŧāĨ‡ ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯āĨ‹ā¤‚ ā¤Ēā¤° ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ĒāĨā¤°ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤ļā¤•āĨā¤¤ā¤ŋ ā¤–ā¤°āĨā¤š ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "RetentionPolicy_AppliesToChannels": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤Ēā¤° ā¤˛ā¤žā¤—āĨ‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ", + "RetentionPolicy_AppliesToDMs": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤˛ā¤žā¤—āĨ‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ", + "RetentionPolicy_AppliesToGroups": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤Ēā¤° ā¤˛ā¤žā¤—āĨ‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ", + "RetentionPolicy_Description": "ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤žā¤¨āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤”ā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤›ā¤‚ā¤Ÿā¤žā¤ˆ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "RetentionPolicy_DoNotPruneDiscussion": "ā¤šā¤°āĨā¤šā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤ā¤Ÿ ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "RetentionPolicy_DoNotPrunePinned": "ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤‚ā¤Ÿ ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "RetentionPolicy_DoNotPruneThreads": "ā¤§ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ€ ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤ā¤Ÿ ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "RetentionPolicy_Enabled": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "RetentionPolicy_ExcludePinned": "ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ŧā¤žā¤šā¤° ā¤¨ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "RetentionPolicy_FilesOnly": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤šā¤Ÿā¤žā¤ā¤", + "RetentionPolicy_FilesOnly_Description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤šā¤Ÿā¤žā¤ˆ ā¤œā¤žā¤ā¤‚ā¤—āĨ€, ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤¯ā¤Ĩā¤žā¤ĩā¤¤ ā¤°ā¤šāĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "RetentionPolicy_MaxAge": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯āĨ", + "RetentionPolicy_MaxAge_Channels": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯āĨ", + "RetentionPolicy_MaxAge_Description": "ā¤‡ā¤¸ ā¤Žā¤žā¤¨ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤¨āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ļā¤ŋā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤›ā¤žā¤ā¤ŸāĨ‡ā¤‚", + "RetentionPolicy_MaxAge_DMs": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯āĨ", + "RetentionPolicy_MaxAge_Groups": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯āĨ", + "RetentionPolicy_Precision": "ā¤Ÿā¤žā¤‡ā¤Žā¤° ā¤Ēā¤°ā¤ŋā¤ļāĨā¤ĻāĨā¤§ā¤¤ā¤ž", + "RetentionPolicy_Precision_Description": "ā¤ĒāĨā¤°āĨ‚ā¤¨ ā¤Ÿā¤žā¤‡ā¤Žā¤° ā¤•ā¤ŋā¤¤ā¤¨āĨ€ ā¤Ŧā¤žā¤° ā¤šā¤˛ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤. ā¤‡ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤ŸāĨ€ā¤• ā¤Žā¤žā¤¨ ā¤Ēā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤¤āĨ‡ā¤œā¤ŧ ā¤°ā¤ŋā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤Ÿā¤žā¤‡ā¤Žā¤° ā¤ĩā¤žā¤˛āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤Ŧā¤Ąā¤ŧāĨ‡ ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯āĨ‹ā¤‚ ā¤Ēā¤° ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ĒāĨā¤°ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤ļā¤•āĨā¤¤ā¤ŋ ā¤–ā¤°āĨā¤š ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "RetentionPolicyRoom_Enabled": "ā¤ĒāĨā¤°ā¤žā¤¨āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤›ā¤žā¤ā¤ŸāĨ‡ā¤‚", + "RetentionPolicyRoom_ExcludePinned": "ā¤Ēā¤ŋā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ŧā¤žā¤šā¤° ā¤¨ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "RetentionPolicyRoom_FilesOnly": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ģā¤žā¤‡ā¤˛āĨ‹ā¤‚ ā¤•āĨ€ ā¤›ā¤ā¤Ÿā¤žā¤ˆ ā¤•ā¤°āĨ‡ā¤‚, ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤°ā¤–āĨ‡ā¤‚", + "RetentionPolicyRoom_MaxAge": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯āĨ ā¤Ļā¤ŋā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ (ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ: {{max}})", + "RetentionPolicyRoom_OverrideGlobal": "ā¤ĩāĨˆā¤ļāĨā¤ĩā¤ŋā¤• ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤§ā¤žā¤°ā¤Ŗ ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ ā¤“ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "RetentionPolicyRoom_ReadTheDocs": "ā¤§āĨā¤¯ā¤žā¤¨ ā¤°ā¤šāĨ‡ā¤‚! ā¤…ā¤¤āĨā¤¯ā¤§ā¤ŋā¤• ā¤¸ā¤žā¤ĩā¤§ā¤žā¤¨āĨ€ ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤‡ā¤¨ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤žā¤ĩ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¨ā¤ˇāĨā¤Ÿ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¯ā¤šā¤žā¤‚ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤šā¤žā¤˛āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤Ēā¤ĸā¤ŧāĨ‡ā¤‚āĨ¤", + "Retry": "ā¤ĒāĨā¤¨: ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Return_to_home": "ā¤˜ā¤° ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸", + "Return_to_previous_page": "ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ ā¤ĒāĨ‡ā¤œ ā¤Ēā¤° ā¤˛āĨŒā¤ŸāĨ‡ā¤‚", + "Return_to_the_queue": "ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤žā¤Ēā¤¸ ā¤˛āĨŒā¤ŸāĨ‡ā¤‚", + "Review_devices": "ā¤¸ā¤ŽāĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤•ā¤Ŧ ā¤”ā¤° ā¤•ā¤šā¤žā¤ ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨ‹ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "Ringing": "ā¤Ŧā¤œ", + "Ringtones_and_visual_indicators_notify_people_of_incoming_calls": "ā¤°ā¤ŋā¤‚ā¤—ā¤ŸāĨ‹ā¤¨ ā¤”ā¤° ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤¸ā¤‚ā¤•āĨ‡ā¤¤ā¤• ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤•āĨ‰ā¤˛ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Robot_Instructions_File_Content": "robots.txt ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€", + "Root": "ā¤œā¤Ąā¤ŧ", + "Required_action": "ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž", + "Default_Referrer_Policy": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‡ā¤Ģā¤ŧā¤°ā¤° ā¤¨āĨ€ā¤¤ā¤ŋ", + "Default_Referrer_Policy_Description": "ā¤¯ā¤š 'ā¤°āĨ‡ā¤Ģā¤ŧā¤°ā¤°' ā¤šāĨ‡ā¤Ąā¤° ā¤•āĨ‹ ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤œāĨ‹ ā¤…ā¤¨āĨā¤¯ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤ĄāĨ‡ā¤Ą ā¤ŽāĨ€ā¤Ąā¤ŋā¤¯ā¤ž ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤­āĨ‡ā¤œā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, [ā¤ā¤Žā¤ĄāĨ€ā¤ā¤¨ ā¤¸āĨ‡ ā¤¯ā¤š ā¤˛ā¤ŋā¤‚ā¤•](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy) ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚āĨ¤ ā¤¯ā¤žā¤Ļ ā¤°ā¤–āĨ‡ā¤‚, ā¤‡ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩāĨ€ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨ‚ā¤°āĨ‡ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•āĨ‹ ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤•ā¤°ā¤¨ā¤ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "No_feature_to_preview": "ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤•āĨ‹ā¤ˆ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤¨ā¤šāĨ€ā¤‚", + "No_Referrer": "ā¤°āĨ‡ā¤Ģā¤° ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "No_Referrer_When_Downgrade": "ā¤Ąā¤žā¤‰ā¤¨ā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤•āĨ‹ā¤ˆ ā¤°āĨ‡ā¤Ģā¤°ā¤° ā¤¨ā¤šāĨ€ā¤‚", + "Notes": "ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤Ŗā¤ŋā¤¯ā¤žā¤", + "Origin": "ā¤ŽāĨ‚ā¤˛", + "Origin_When_Cross_Origin": "ā¤‰ā¤¤āĨā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤œā¤Ŧ ā¤•āĨā¤°āĨ‰ā¤¸ ā¤‰ā¤¤āĨā¤Ēā¤¤āĨā¤¤ā¤ŋ", + "Same_Origin": "ā¤ĩā¤šāĨ€ ā¤ŽāĨ‚ā¤˛", + "Strict_Origin": "ā¤¸ā¤–āĨā¤¤ ā¤‰ā¤¤āĨā¤Ēā¤¤āĨā¤¤ā¤ŋ", + "Strict_Origin_When_Cross_Origin": "ā¤•āĨā¤°āĨ‰ā¤¸ ā¤ŽāĨ‚ā¤˛ ā¤œā¤Ŧ ā¤¸ā¤–āĨā¤¤ ā¤ŽāĨ‚ā¤˛", + "UIKit_Interaction_Timeout": "ā¤ā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤°ā¤šā¤ž ā¤šāĨˆ. ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚ ā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Unsafe_Url": "ā¤…ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Rocket_Chat_Alert": "ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤…ā¤˛ā¤°āĨā¤Ÿ", + "Role": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž", + "Roles": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤", + "Role_Editing": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤¨", + "Role_Mapping": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°ā¤Ŗ", + "Role_removed": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Room": "ā¤•ā¤Žā¤°ā¤ž", + "room_allowed_reacting": "{{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨā¤ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ€ ā¤—ā¤ˆ", + "room_allowed_reactions": "ā¤…ā¤¨āĨā¤Žā¤¤ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤", + "Room_announcement_changed_successfully": "ā¤•ā¤•āĨā¤ˇ ā¤•āĨ€ ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Room_archivation_state": "ā¤°ā¤žā¤œāĨā¤¯", + "Room_archivation_state_false": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "Room_archivation_state_true": "ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤", + "Room_archived": "ā¤•ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤", + "room_changed_announcement": "ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž ā¤•āĨ‹ ā¤Ŧā¤Ļā¤˛ā¤•ā¤°: {{room_announcement}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž {{user_by}} ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "room_changed_avatar": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤° {{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "room_avatar_changed": "ā¤Ŧā¤Ļā¤˛ā¤ž ā¤šāĨā¤† ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤…ā¤ĩā¤¤ā¤žā¤°", + "room_changed_description": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž: {{room_description}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž {{user_by}}", + "room_changed_privacy": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤Ŧā¤Ļā¤˛ā¤•ā¤°: {{room_type}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž {{user_by}} ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "room_changed_topic": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĩā¤ŋā¤ˇā¤¯ ā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž: {{room_topic}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž {{user_by}}", + "room_changed_type": "ā¤•ā¤Žā¤°ā¤ž ā¤Ŧā¤Ļā¤˛ā¤•ā¤° {{room_type}} ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "room_changed_topic_to": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĩā¤ŋā¤ˇā¤¯ ā¤Ŧā¤Ļā¤˛ā¤•ā¤° {{room_topic}} ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Room_default_change_to_private_will_be_default_no_more": "ā¤¯ā¤š ā¤ā¤• ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨˆā¤¨ā¤˛ ā¤šāĨˆ ā¤”ā¤° ā¤‡ā¤¸āĨ‡ ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤¯ā¤š ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤šāĨˆā¤¨ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤°ā¤šāĨ‡ā¤—ā¤žāĨ¤ ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ēā¤•āĨ€ ā¤†ā¤—āĨ‡ ā¤Ŧā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤‡ā¤šāĨā¤›ā¤ž ā¤šāĨˆ?", + "Room_description_changed_successfully": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "room_disallowed_reacting": "{{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨā¤ ā¤•ā¤Žā¤°ā¤ž ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "room_disallowed_reactions": "ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤", + "Room_Edit": "ā¤•ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Room_has_been_archived": "ā¤•ā¤Žā¤°ā¤ž ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤° ā¤˛ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Room_has_been_converted": "ā¤•ā¤Žā¤°ā¤ž ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Room_has_been_created": "ā¤•ā¤•āĨā¤ˇ ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Room_has_been_removed": "ā¤•ā¤Žā¤°ā¤ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Room_has_been_unarchived": "ā¤•ā¤Žā¤°ā¤ž ā¤…ā¤¨ā¤žā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Room_Info": "ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "room_is_blocked": "ā¤¯ā¤š ā¤•ā¤Žā¤°ā¤ž ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤šāĨˆ", + "room_account_deactivated": "ā¤¯ā¤š ā¤–ā¤žā¤¤ā¤ž ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "room_is_read_only": "ā¤¯ā¤š ā¤•ā¤Žā¤°ā¤ž ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨˆ", + "room_name": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Room_name_changed": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤•ā¤°: {{room_name}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž {{user_by}} ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Room_name_changed_to": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤•ā¤° {{room_name}} ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Room_name_changed_successfully": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Room_not_exist_or_not_permission": "ā¤•ā¤Žā¤°ā¤ž ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤¯ā¤ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ ā¤šāĨ‹", + "Room_not_found": "ā¤•ā¤Žā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Room_password_changed_successfully": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "room_removed_read_only": "ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‹ ā¤˛ā¤ŋā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ {{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ€ ā¤—ā¤ˆ", + "room_set_read_only": "{{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‹ ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "room_removed_read_only_permission": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", + "room_set_read_only_permission": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤Žā¤°ā¤ž ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Room_topic_changed_successfully": "ā¤•ā¤•āĨā¤ˇ ā¤•ā¤ž ā¤ĩā¤ŋā¤ˇā¤¯ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Room_type_changed_successfully": "ā¤•ā¤Žā¤°āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Room_type_of_default_rooms_cant_be_changed": "ā¤¯ā¤š ā¤ā¤• ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤•ā¤Žā¤°ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤‡ā¤¸ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤Ŧā¤Ļā¤˛ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨āĨ‡ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤Ēā¤°ā¤žā¤Žā¤°āĨā¤ļ ā¤˛āĨ‡ā¤‚āĨ¤", + "Room_unarchived": "ā¤•ā¤Žā¤°ā¤ž ā¤…ā¤¨ā¤žā¤°ā¤•āĨā¤ˇā¤ŋā¤¤", + "Room_updated_successfully": "ā¤•ā¤Žā¤°ā¤ž ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž!", + "Room_uploaded_file_list": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚ ā¤¸āĨ‚ā¤šāĨ€", + "Room_uploaded_file_list_empty": "ā¤•āĨ‹ā¤ˆ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚.", + "Rooms": "ā¤•ā¤Žā¤°ā¤ž", + "Rooms_added_successfully": "ā¤•ā¤Žā¤°āĨ‡ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ ā¤—ā¤", + "Routing": "ā¤Žā¤žā¤°āĨā¤—", + "Run_only_once_for_each_visitor": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‡ā¤ĩā¤˛ ā¤ā¤• ā¤Ŧā¤žā¤° ā¤šā¤˛ā¤žā¤ā¤", + "run-import": "ā¤†ā¤¯ā¤žā¤¤ ā¤šā¤˛ā¤žā¤ā¤", + "run-import_description": "ā¤†ā¤¯ā¤žā¤¤ā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤šā¤˛ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "run-migration": "ā¤Žā¤žā¤‡ā¤—āĨā¤°āĨ‡ā¤ļā¤¨ ā¤šā¤˛ā¤žā¤ā¤", + "run-migration_description": "ā¤Žā¤žā¤‡ā¤—āĨā¤°āĨ‡ā¤ļā¤¨ ā¤šā¤˛ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Running_Instances": "ā¤šā¤˛ ā¤°ā¤šāĨ‡ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ", + "Runtime_Environment": "ā¤•āĨā¤°ā¤Ž ā¤Ēā¤°āĨā¤¯ā¤žā¤ĩā¤°ā¤Ŗ", + "S_new_messages_since_s": "%s ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¸āĨ‡ %s ā¤¨ā¤¯āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Same_As_Token_Sent_Via": "\"ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž\" ā¤•āĨ‡ ā¤¸ā¤Žā¤žā¤¨", + "Same_Style_For_Mentions": "ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩā¤šāĨ€ ā¤ļāĨˆā¤˛āĨ€", + "SAML": "ā¤ā¤¸ā¤ā¤ā¤Žā¤ā¤˛", + "SAML_Description": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤”ā¤° ā¤ĒāĨā¤°ā¤žā¤§ā¤ŋā¤•ā¤°ā¤Ŗ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•āĨ‡ ā¤†ā¤Ļā¤žā¤¨-ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤…ā¤­ā¤ŋā¤•ā¤Ĩā¤¨ ā¤Žā¤žā¤°āĨā¤•ā¤…ā¤Ē ā¤­ā¤žā¤ˇā¤ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "SAML_Allowed_Clock_Drift": "ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤¸āĨ‡ ā¤…ā¤¨āĨā¤Žā¤¤ ā¤•āĨā¤˛āĨ‰ā¤• ā¤ĄāĨā¤°ā¤ŋā¤ĢāĨā¤Ÿ", + "SAML_Allowed_Clock_Drift_Description": "ā¤Ēā¤šā¤šā¤žā¤¨ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤•āĨ€ ā¤˜ā¤Ąā¤ŧāĨ€ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤˜ā¤Ąā¤ŧā¤ŋā¤¯āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤ĨāĨ‹ā¤Ąā¤ŧāĨ€ ā¤†ā¤—āĨ‡ ā¤Ŧā¤ĸā¤ŧ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆāĨ¤ ā¤†ā¤Ē ā¤ĨāĨ‹ā¤Ąā¤ŧāĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤˜ā¤Ąā¤ŧāĨ€ ā¤•āĨ‡ ā¤Ŧā¤šā¤žā¤ĩ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤‡ā¤¸ā¤•ā¤ž ā¤Žā¤žā¤¨ ā¤•ā¤ˆ ā¤Žā¤ŋā¤˛āĨ€ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą (ā¤ā¤Žā¤ā¤¸) ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Žā¤žā¤¨ ā¤‰ā¤¸ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤¸ā¤Žā¤¯ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤ŋā¤¸ ā¤Ēā¤° ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "SAML_AuthnContext_Template": "AuthnContext ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ", + "SAML_AuthnContext_Template_Description": "ā¤†ā¤Ē ā¤¯ā¤šā¤žā¤‚ AuthnRequest ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ ā¤¸āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ĩāĨ‡ā¤°ā¤ŋā¤ā¤Ŧā¤˛ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤\n \n ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤‘ā¤ĨāĨā¤¨ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, {{AuthnContextClassRef}} ā¤ŸāĨˆā¤— ā¤•āĨ‹ ā¤ĄāĨā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° {{\\_\\_authnContext\\_\\}} ā¤ĩāĨ‡ā¤°ā¤ŋā¤ā¤Ŧā¤˛ ā¤•āĨ‹ ā¤¨ā¤ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ ā¤¸āĨ‡ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚āĨ¤", + "SAML_AuthnRequest_Template": "AuthnRequest ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ", + "SAML_AuthnRequest_Template_Description": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚:\n- **\\_\\_newId\\_\\_**: ā¤¯ā¤žā¤ĻāĨƒā¤šāĨā¤›ā¤ŋā¤• ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤†ā¤ˆā¤ĄāĨ€ ā¤¸āĨā¤ŸāĨā¤°ā¤ŋā¤‚ā¤—\n- **\\_\\_ā¤¤ā¤¤āĨā¤•ā¤žā¤˛\\_\\_**: ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤Ÿā¤žā¤‡ā¤Žā¤¸āĨā¤ŸāĨˆā¤ŽāĨā¤Ē\n- **\\_\\_ā¤•āĨ‰ā¤˛ā¤ŦāĨˆā¤•ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛\\_\\_**: ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛āĨ¤\n- **\\_\\_entryPoint\\_\\_**: {{Custom Entry Point}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_ā¤œā¤žā¤°āĨ€ā¤•ā¤°āĨā¤¤ā¤ž\\_\\_**: {{Custom Issuer}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_identifierFormatTag\\_\\_**: ā¤¯ā¤Ļā¤ŋ ā¤ĩāĨˆā¤§ {{Identifier Format}} ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ {{NameID Policy Template}} ā¤•āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•āĨ€ ā¤—ā¤ˆ ā¤šāĨˆāĨ¤\n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_authnContextTag\\_\\_**: ā¤¯ā¤Ļā¤ŋ ā¤ĩāĨˆā¤§ {{Custom Authn Context}} ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ {{AuthnContext Template}} ā¤•āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•āĨ€ ā¤—ā¤ˆ ā¤šāĨˆāĨ¤\n- **\\_\\_authnContextComparison\\_\\_**: {{Authn Context Compare}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_authnContext\\_\\_**: {{Custom Authn Context}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨.", + "SAML_Connection": "ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§", + "SAML_General": "ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯", + "SAML_Custom_Authn_Context": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­", + "SAML_Custom_Authn_Context_Comparison": "ā¤ĒāĨā¤°ā¤žā¤Žā¤žā¤Ŗā¤ŋā¤• ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ ā¤¤āĨā¤˛ā¤¨ā¤ž", + "SAML_Custom_Authn_Context_description": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤Žā¤žā¤Ŗā¤ŋā¤• ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸āĨ‡ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤‚āĨ¤\n \n ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤ĒāĨā¤°ā¤žā¤Žā¤žā¤Ŗā¤ŋā¤• ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨ€ā¤§āĨ‡ {{AuthnContext Template}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚āĨ¤", + "SAML_Custom_Cert": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤°", + "SAML_Custom_Debug": "ā¤Ąā¤ŋā¤Ŧā¤— ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_EMail_Field": "ā¤ˆ-ā¤ŽāĨ‡ā¤˛ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "SAML_Custom_Entry_point": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ĒāĨā¤°ā¤ĩāĨ‡ā¤ļ ā¤Ŧā¤ŋā¤‚ā¤ĻāĨ", + "SAML_Custom_Generate_Username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_IDP_SLO_Redirect_URL": "ā¤†ā¤ˆā¤ĄāĨ€ā¤ĒāĨ€ ā¤ā¤¸ā¤ā¤˛ā¤“ ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "SAML_Custom_Immutable_Property": "ā¤…ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨āĨ€ā¤¯ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¨ā¤žā¤Ž", + "SAML_Custom_Immutable_Property_EMail": "ā¤ˆā¤ŽāĨ‡ā¤˛", + "SAML_Custom_Immutable_Property_Username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "SAML_Custom_Issuer": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤œā¤žā¤°āĨ€ā¤•ā¤°āĨā¤¤ā¤ž", + "SAML_Custom_Logout_Behaviour": "ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤°", + "SAML_Custom_Logout_Behaviour_End_Only_RocketChat": "ā¤•āĨ‡ā¤ĩā¤˛ Rocket.Chat ā¤¸āĨ‡ ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_Logout_Behaviour_Terminate_SAML_Session": "SAML-ā¤¸ā¤¤āĨā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_mail_overwrite": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ŽāĨ‡ā¤˛ ā¤•āĨ‹ ā¤…ā¤§ā¤ŋā¤˛āĨ‡ā¤–ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ (ā¤†ā¤ˆā¤ĄāĨ€ā¤ĒāĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚)", + "SAML_Custom_name_overwrite": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤žā¤Ž ā¤…ā¤§ā¤ŋā¤˛āĨ‡ā¤–ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ (ā¤†ā¤ˆā¤ĄāĨ€ā¤ĒāĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚)", + "SAML_Custom_Private_Key": "ā¤¨ā¤ŋā¤œāĨ€ ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€", + "SAML_Custom_Provider": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž", + "SAML_Custom_Public_Cert": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤° ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€", + "SAML_Custom_signature_validation_all": "ā¤¸ā¤­āĨ€ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_signature_validation_assertion": "ā¤…ā¤­ā¤ŋā¤•ā¤Ĩā¤¨ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_signature_validation_either": "ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤•āĨ‹ ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_signature_validation_response": "ā¤Žā¤žā¤¨āĨā¤¯ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤°", + "SAML_Custom_signature_validation_type": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨ ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "SAML_Custom_signature_validation_type_description": "ā¤¯ā¤Ļā¤ŋ ā¤•āĨ‹ā¤ˆ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤° ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤¤āĨ‹ ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤…ā¤¨ā¤ĻāĨ‡ā¤–ā¤ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "SAML_Custom_user_data_fieldmap": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°", + "SAML_Custom_user_data_fieldmap_description": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤ā¤¸ā¤ā¤ā¤Žā¤ā¤˛ (ā¤ā¤• ā¤Ŧā¤žā¤° ā¤Žā¤ŋā¤˛ ā¤œā¤žā¤¨āĨ‡ ā¤Ēā¤°) ā¤ŽāĨ‡ā¤‚ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą (ā¤œāĨˆā¤¸āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛) ā¤•āĨˆā¤¸āĨ‡ ā¤ĒāĨ‰ā¤ĒāĨā¤¯āĨā¤˛āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤\nā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤¤āĨŒā¤° ā¤Ēā¤°, `{\"name\":\"cn\", \"email\":\"mail\"}` cn ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤¸āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋ ā¤•ā¤ž ā¤Žā¤žā¤¨ā¤ĩ ā¤Ēā¤ ā¤¨āĨ€ā¤¯ ā¤¨ā¤žā¤Ž ā¤šāĨā¤¨āĨ‡ā¤—ā¤ž, ā¤”ā¤° ā¤ŽāĨ‡ā¤˛ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤¸āĨ‡ ā¤‰ā¤¨ā¤•ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤šāĨā¤¨āĨ‡ā¤—ā¤žāĨ¤\nRocket.Chat ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą: `ā¤¨ā¤žā¤Ž`, `ā¤ˆā¤ŽāĨ‡ā¤˛` ā¤”ā¤° `ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž`, ā¤Ŧā¤žā¤•āĨ€ ā¤¸ā¤Ŧ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤\n`{\"ā¤ˆā¤ŽāĨ‡ā¤˛\": \"ā¤ŽāĨ‡ā¤˛\",\"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž\": {\"ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ąā¤¨ā¤žā¤Ž\": \"ā¤ŽāĨ‡ā¤˛\",\"ā¤°āĨ‡ā¤—āĨ‡ā¤•āĨā¤¸\": \"(.*)@.+$\",\"ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ\": \"ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž-ā¤°āĨ‡ā¤—āĨ‡ā¤•āĨā¤¸\"}, \" ā¤¨ā¤žā¤Ž\": { \"ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ąā¤¨ā¤žā¤Ž\": [\"ā¤Ēā¤šā¤˛ā¤ž ā¤¨ā¤žā¤Ž\", \"ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¨ā¤žā¤Ž\"], \"ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ\": \"{{firstName}} {{lastName}}\"}, \"{{identifier}}\": \"uid\"}`", + "SAML_Custom_user_data_custom_fieldmap": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°", + "SAML_Custom_user_data_custom_fieldmap_description": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ SAML ā¤ŽāĨ‡ā¤‚ ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ą ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤•āĨˆā¤¸āĨ‡ ā¤ĒāĨ‰ā¤ĒāĨā¤¯āĨā¤˛āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤ ā¤œā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚ (ā¤ā¤• ā¤Ŧā¤žā¤° ā¤Žā¤ŋā¤˛ ā¤œā¤žā¤¨āĨ‡ ā¤Ēā¤°)āĨ¤", + "SAML_Custom_Username_Field": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤¨ā¤žā¤Ž", + "SAML_Custom_Username_Normalize": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_Username_Normalize_Lowercase": "ā¤˛āĨ‹ā¤…ā¤°ā¤•āĨ‡ā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤", + "SAML_Custom_Username_Normalize_None": "ā¤•āĨ‹ā¤ˆ ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯āĨ€ā¤•ā¤°ā¤Ŗ ā¤¨ā¤šāĨ€ā¤‚", + "SAML_Default_User_Role": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž", + "SAML_Default_User_Role_Description": "ā¤†ā¤Ē ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤¨ā¤ŋā¤°āĨā¤Ļā¤ŋā¤ˇāĨā¤Ÿ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "SAML_Identifier_Format": "ā¤Ēā¤šā¤šā¤žā¤¨ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē", + "SAML_Identifier_Format_Description": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸āĨ‡ NameID ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸āĨ‡ ā¤–ā¤žā¤˛āĨ€ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤‚āĨ¤", + "SAML_LogoutRequest_Template": "ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ", + "SAML_LogoutRequest_Template_Description": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚:\n- **\\_\\_newId\\_\\_**: ā¤¯ā¤žā¤ĻāĨƒā¤šāĨā¤›ā¤ŋā¤• ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤†ā¤ˆā¤ĄāĨ€ ā¤¸āĨā¤ŸāĨā¤°ā¤ŋā¤‚ā¤—\n- **\\_\\_ā¤¤ā¤¤āĨā¤•ā¤žā¤˛\\_\\_**: ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤Ÿā¤žā¤‡ā¤Žā¤¸āĨā¤ŸāĨˆā¤ŽāĨā¤Ē\n- **\\_\\_idpSLORedirectURL\\_\\_**: ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤ˆā¤ĄāĨ€ā¤ĒāĨ€ ā¤¸ā¤ŋā¤‚ā¤—ā¤˛ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛āĨ¤\n- **\\_\\_ā¤œā¤žā¤°āĨ€ā¤•ā¤°āĨā¤¤ā¤ž\\_\\_**: {{Custom Issuer}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_nameID\\_\\_**: ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤Ēā¤° ā¤†ā¤ˆā¤ĄāĨ€ā¤ĒāĨ€ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ NameIDāĨ¤\n- **\\_\\_sessionIndex\\_\\_**: ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤Ēā¤° ā¤†ā¤ˆā¤ĄāĨ€ā¤ĒāĨ€ ā¤¸āĨ‡ ā¤¸āĨ‡ā¤ļā¤¨ ā¤‡ā¤‚ā¤ĄāĨ‡ā¤•āĨā¤¸ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "SAML_LogoutResponse_Template": "ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ", + "SAML_LogoutResponse_Template_Description": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚:\n- **\\_\\_newId\\_\\_**: ā¤¯ā¤žā¤ĻāĨƒā¤šāĨā¤›ā¤ŋā¤• ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤†ā¤ˆā¤ĄāĨ€ ā¤¸āĨā¤ŸāĨā¤°ā¤ŋā¤‚ā¤—\n- **\\_\\_inResponseToId\\_\\_**: ā¤†ā¤ˆā¤ĄāĨ€ā¤ĒāĨ€ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•āĨ€ ā¤†ā¤ˆā¤ĄāĨ€\n- **\\_\\_ā¤¤ā¤¤āĨā¤•ā¤žā¤˛\\_\\_**: ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤Ÿā¤žā¤‡ā¤Žā¤¸āĨā¤ŸāĨˆā¤ŽāĨā¤Ē\n- **\\_\\_idpSLORedirectURL\\_\\_**: ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤ˆā¤ĄāĨ€ā¤ĒāĨ€ ā¤¸ā¤ŋā¤‚ā¤—ā¤˛ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛āĨ¤\n- **\\_\\_ā¤œā¤žā¤°āĨ€ā¤•ā¤°āĨā¤¤ā¤ž\\_\\_**: {{Custom Issuer}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_nameID\\_\\_**: IdP ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ NameIDāĨ¤\n- **\\_\\_sessionIndex\\_\\_**: IdP ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ sessionIndexāĨ¤", + "SAML_Metadata_Certificate_Template_Description": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚:\n- **\\_\\_ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤°\\_\\_**: ā¤Ļā¤žā¤ĩā¤ž ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨ā¤ŋā¤œāĨ€ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤°āĨ¤", + "SAML_Metadata_Template": "ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ", + "SAML_Metadata_Template_Description": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚:\n- **\\_\\_sloLocation\\_\\_**: ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤¸ā¤ŋā¤‚ā¤—ā¤˛ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛āĨ¤\n- **\\_\\_ā¤œā¤žā¤°āĨ€ā¤•ā¤°āĨā¤¤ā¤ž\\_\\_**: {{Custom Issuer}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_identifierFormat\\_\\_**: {{Identifier Format}} ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•ā¤ž ā¤Žā¤žā¤¨āĨ¤\n- **\\_\\_certificateTag\\_\\_**: ā¤¯ā¤Ļā¤ŋ ā¤•āĨ‹ā¤ˆ ā¤¨ā¤ŋā¤œāĨ€ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ {{Metadata Certificate Template}} ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤—ā¤ž, ā¤…ā¤¨āĨā¤¯ā¤Ĩā¤ž ā¤‡ā¤¸āĨ‡ ā¤…ā¤¨ā¤ĻāĨ‡ā¤–ā¤ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤\n- **\\_\\_ā¤•āĨ‰ā¤˛ā¤ŦāĨˆā¤•ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛\\_\\_**: ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨ‰ā¤˛ā¤ŦāĨˆā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛āĨ¤", + "SAML_MetadataCertificate_Template": "ā¤ŽāĨ‡ā¤Ÿā¤žā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤° ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ", + "SAML_NameIdPolicy_Template": "NameID ā¤¨āĨ€ā¤¤ā¤ŋ ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ", + "SAML_NameIdPolicy_Template_Description": "ā¤†ā¤Ē ā¤¯ā¤šā¤žā¤‚ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤ŸāĨ‡ā¤ŽāĨā¤Ēā¤˛āĨ‡ā¤Ÿ ā¤¸āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤ĩāĨ‡ā¤°ā¤ŋā¤ā¤Ŧā¤˛ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "SAML_Role_Attribute_Name": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "SAML_Role_Attribute_Name_Description": "ā¤¯ā¤Ļā¤ŋ ā¤¯ā¤š ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤¤ā¤ž SAML ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤Ēā¤° ā¤Ēā¤žā¤ˆ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤‡ā¤¸ā¤•āĨ‡ ā¤Žā¤žā¤¨āĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "SAML_Role_Attribute_Sync": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Role_Attribute_Sync_Description": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° SAML ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚ (ā¤¸āĨā¤Ĩā¤žā¤¨āĨ€ā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤§ā¤ŋā¤˛āĨ‡ā¤–ā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ)āĨ¤", + "SAML_Section_1_User_Interface": "ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤•āĨā¤¤ā¤ž ā¤‡ā¤‚ā¤Ÿā¤°ā¤Ģā¤ŧāĨ‡ā¤¸", + "SAML_Section_2_Certificate": "ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤Ēā¤¤āĨā¤°", + "SAML_Section_3_Behavior": "ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤°", + "SAML_Section_4_Roles": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤", + "SAML_Section_5_Mapping": "ā¤Žā¤žā¤¨ā¤šā¤ŋā¤¤āĨā¤°ā¤Ŗ", + "SAML_Section_6_Advanced": "ā¤ĩā¤ŋā¤•ā¤¸ā¤ŋā¤¤", + "SAML_Custom_channels_update": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° ā¤°āĨ‚ā¤Ž ā¤¸ā¤ŦāĨā¤¸ā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_channels_update_description": "ā¤¯ā¤š ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° SAML ā¤Ļā¤žā¤ĩāĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤­āĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•ā¤ž ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤šāĨˆāĨ¤", + "SAML_Custom_include_private_channels_update": "ā¤°āĨ‚ā¤Ž ā¤¸ā¤ŦāĨā¤¸ā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤œāĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "SAML_Custom_include_private_channels_update_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ SAML ā¤Ļā¤žā¤ĩāĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¨ā¤ŋā¤œāĨ€ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Saturday": "ā¤ļā¤¨ā¤ŋā¤ĩā¤žā¤°", + "Save": "ā¤Ŧā¤šā¤žā¤¨ā¤ž", + "Save_changes": "ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Save_Mobile_Bandwidth": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ŦāĨˆā¤‚ā¤Ąā¤ĩā¤ŋā¤ĄāĨā¤Ĩ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "Save_to_enable_this_action": "ā¤‡ā¤¸ ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "Save_To_Webdav": "WebDAV ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "Save_your_encryption_password": "ā¤…ā¤Ēā¤¨ā¤ž ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "save-all-canned-responses": "ā¤¸ā¤­āĨ€ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "save-all-canned-responses_description": "ā¤¸ā¤­āĨ€ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤šāĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "save-canned-responses": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "save-canned-responses_description": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨā¤¤āĨā¤¤ā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤šāĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "save-department-canned-responses": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "save-department-canned-responses_description": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨā¤¤āĨā¤¤ā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤šāĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "save-others-livechat-room-info": "ā¤…ā¤¨āĨā¤¯ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤šāĨ‡ā¤œāĨ‡ā¤‚", + "save-others-livechat-room-info_description": "ā¤…ā¤¨āĨā¤¯ ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¸ā¤šāĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Saved": "ā¤Ŧā¤šā¤žā¤¯ā¤ž", + "Saving": "ā¤¸ā¤šāĨ‡ā¤œā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Scan_QR_code": "Google Authenticator, Authy ā¤¯ā¤ž Duo ā¤œāĨˆā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤Žā¤žā¤Ŗā¤• ā¤ā¤Ē ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ QR ā¤•āĨ‹ā¤Ą ā¤•āĨ‹ ā¤¸āĨā¤•āĨˆā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤¯ā¤š 6 ā¤…ā¤‚ā¤•āĨ‹ā¤‚ ā¤•ā¤ž ā¤•āĨ‹ā¤Ą ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤œā¤ŋā¤¸āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "Scan_QR_code_alternative_s": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤•āĨā¤¯āĨ‚ā¤†ā¤° ā¤•āĨ‹ā¤Ą ā¤•āĨ‹ ā¤¸āĨā¤•āĨˆā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤†ā¤Ē ā¤‡ā¤¸ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤•āĨ‹ā¤Ą ā¤Ļā¤°āĨā¤œ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:", "Scope": "ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Score": "ā¤…ā¤‚ā¤•", + "Screen_Lock": "ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤˛āĨ‰ā¤• ā¤šāĨˆ", + "Screen_Share": "ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤ļāĨ‡ā¤¯ā¤°", + "Script": "ā¤˛ā¤ŋā¤–āĨ€ ā¤šāĨā¤ˆ ā¤•ā¤šā¤žā¤¨āĨ€", + "Script_Enabled": "ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Script_Engine": "ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤¸āĨˆā¤‚ā¤Ąā¤ŦāĨ‰ā¤•āĨā¤¸", + "Script_Engine_Description": "ā¤ĒāĨā¤°ā¤žā¤¨āĨ€ ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•āĨ‹ ā¤ āĨ€ā¤• ā¤¸āĨ‡ ā¤šā¤˛ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤‚ā¤—ā¤¤ ā¤¸āĨˆā¤‚ā¤Ąā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆ, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤¸ā¤­āĨ€ ā¤¨ā¤ˆ ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤•āĨ‹ ā¤‡ā¤¸ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤¸āĨˆā¤‚ā¤Ąā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤", + "Script_Engine_vm2": "ā¤¸ā¤‚ā¤—ā¤¤ ā¤¸āĨˆā¤‚ā¤Ąā¤ŦāĨ‰ā¤•āĨā¤¸ (ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤)", + "Script_Engine_isolated_vm": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤¸āĨˆā¤‚ā¤Ąā¤ŦāĨ‰ā¤•āĨā¤¸", + "Search": "ā¤–āĨ‹ā¤œ", + "Searchable": "ā¤–āĨ‹ā¤œ ā¤¸ā¤•ā¤¨āĨ‡", + "Search_Apps": "ā¤ā¤ĒāĨā¤¸ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Installed_Apps": "ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤ā¤ĒāĨā¤¸ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Private_apps": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Requested_Apps": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ā¤ŋā¤¤ ā¤ā¤ĒāĨā¤¸ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Premium_Apps": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ā¤ĒāĨā¤¸ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_by_file_name": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_by_username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_by_category": "ā¤ļāĨā¤°āĨ‡ā¤ŖāĨ€ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Chat_History": "ā¤šāĨˆā¤Ÿ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_current_provider_not_active": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤–āĨ‹ā¤œ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Search_Description": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤–āĨ‹ā¤œ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤–āĨ‹ā¤œ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§āĨ€ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Search_Devices_Users": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤¯ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Files": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĸāĨ‚ā¤‚ā¤ĸāĨ‹", + "Search_for_a_more_general_term": "ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤žā¤Žā¤žā¤¨āĨā¤¯ ā¤ļā¤ŦāĨā¤Ļ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_for_a_more_specific_term": "ā¤…ā¤§ā¤ŋā¤• ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤ļā¤ŦāĨā¤Ļ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Integrations": "ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_message_search_failed": "ā¤–āĨ‹ā¤œ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤ĩā¤ŋā¤Ģā¤˛ ā¤°ā¤šā¤ž", + "Search_Messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_on_marketplace": "ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤Ēā¤° ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Page_Size": "ā¤ĒāĨƒā¤ˇāĨā¤  ā¤†ā¤•ā¤žā¤°", + "Search_Private_Groups": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Provider": "ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_rooms": "ā¤•ā¤Žā¤°āĨ‡ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Rooms": "ā¤•ā¤Žā¤°āĨ‡ ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Search_Users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–āĨ‹ā¤œāĨ‡ā¤‚", + "Seats_Available": "{{seatsLeft}} ā¤¸āĨ€ā¤ŸāĨ‡ā¤‚ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚", + "Seats_usage": "ā¤¸āĨ€ā¤ŸāĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—", + "seconds": "ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą", + "Secret_token": "ā¤—āĨā¤ĒāĨā¤¤ ā¤ŸāĨ‹ā¤•ā¤¨", + "Secure_SaaS_solution": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ SaaS ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨.", + "Security": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž", + "See_all_themes": "ā¤¸ā¤­āĨ€ ā¤ĨāĨ€ā¤Ž ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "See_documentation": "ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "See_Paid_Plan": "ā¤¸ā¤ļāĨā¤˛āĨā¤• ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "See_Pricing": "ā¤ŽāĨ‚ā¤˛āĨā¤¯ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤Ŗ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "See_full_profile": "ā¤ĒāĨ‚ā¤°āĨ€ ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "See_history": "ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "See_on_Engagement_Dashboard": "ā¤ā¤‚ā¤—āĨ‡ā¤œā¤ŽāĨ‡ā¤‚ā¤Ÿ ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤Ēā¤° ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", "Select_a_department": "ā¤ā¤• ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Select_a_room": "ā¤ā¤• ā¤•ā¤Žā¤°ā¤ž ā¤šāĨā¤¨āĨ‡ā¤‚", + "Select_a_user": "ā¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨā¤¨āĨ‡ā¤‚", + "Select_a_webdav_server": "ā¤ā¤• WebDAV ā¤¸ā¤°āĨā¤ĩā¤° ā¤šāĨā¤¨āĨ‡ā¤‚", + "Select_an_avatar": "ā¤ā¤• ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤šāĨā¤¨āĨ‡ā¤‚", + "Select_an_option": "ā¤•āĨ‹ā¤ˆ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤šāĨā¤¨āĨ‡ā¤‚", + "Select_at_least_one_user": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Select_at_least_two_users": "ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ĻāĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨā¤¨āĨ‡ā¤‚", "Select_department": "ā¤ā¤• ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Select_file": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Select_role": "ā¤ā¤• ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤šāĨā¤¨āĨ‡ā¤‚", + "Select_service_to_login": "ā¤…ā¤Ēā¤¨āĨ€ ā¤¤ā¤¸āĨā¤ĩāĨ€ā¤° ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤¯ā¤ž ā¤¸āĨ€ā¤§āĨ‡ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤‚ā¤ĒāĨā¤¯āĨ‚ā¤Ÿā¤° ā¤¸āĨ‡ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤¸āĨ‡ā¤ĩā¤ž ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Select_tag": "ā¤ā¤• ā¤ŸāĨˆā¤— ā¤šāĨā¤¨āĨ‡ā¤‚", + "Select_the_channels_you_want_the_user_to_be_removed_from": "ā¤‰ā¤¨ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤ŋā¤¨ā¤¸āĨ‡ ā¤†ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Select_the_teams_channels_you_would_like_to_delete": "ā¤‰ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤ŋā¤¸āĨ‡ ā¤†ā¤Ē ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤œā¤ŋā¤¨āĨā¤šāĨ‡ā¤‚ ā¤†ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨā¤¨āĨ‡ā¤‚ā¤—āĨ‡ ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‡ ā¤œā¤žā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Select_atleast_one_channel_to_forward_the_messsage_to": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤šāĨā¤¨āĨ‡ā¤‚", + "Select_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Select_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Selected_agents": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "Selected_by_default": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤¯ā¤¨ā¤ŋā¤¤", + "Selected_departments": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤ĩā¤ŋā¤­ā¤žā¤—", + "Selected_first_reply_unselected_following_replies": "ā¤Ēā¤šā¤˛āĨ‡ ā¤‰ā¤¤āĨā¤¤ā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤¯ā¤¨ā¤ŋā¤¤, ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤‰ā¤¤āĨā¤¤ā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤šā¤¯ā¤¨ā¤ŋā¤¤", + "Selected_monitors": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤°āĨā¤¸", + "Selecting_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°ā¤¨ā¤ž", "Send": "ā¤­āĨ‡ā¤œā¤¨ā¤ž", + "Send_a_message": "ā¤ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‹", + "Send_a_test_mail_to_my_user": "ā¤ŽāĨ‡ā¤°āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ā¤• ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_a_test_push_to_my_user": "ā¤ŽāĨ‡ā¤°āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ā¤• ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ĒāĨā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_confirmation_email": "ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_data_into_RocketChat_in_realtime": "ā¤ĩā¤žā¤¸āĨā¤¤ā¤ĩā¤ŋā¤• ā¤¸ā¤Žā¤¯ ā¤ŽāĨ‡ā¤‚ Rocket.Chat ā¤ŽāĨ‡ā¤‚ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤­āĨ‡ā¤œāĨ‡ā¤‚āĨ¤", + "Send_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_Email_SMTP_Warning": "ā¤‡ā¤¸ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‹ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ SMTP ā¤ˆā¤ŽāĨ‡ā¤˛ā¤ŋā¤‚ā¤— ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "Send_invitation_email": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_invitation_email_error": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤•āĨ‹ā¤ˆ ā¤ĩāĨˆā¤§ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ.", + "Send_invitation_email_info": "ā¤†ā¤Ē ā¤ā¤• ā¤¸ā¤žā¤Ĩ ā¤…ā¤¨āĨ‡ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤­āĨ‡ā¤œ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚.", + "Send_invitation_email_success": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤Ēā¤¤āĨ‡ ā¤Ēā¤° ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œ ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ:", + "Send_it_as_attachment_instead_question": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤‡ā¤¸āĨ‡ ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤­āĨ‡ā¤œāĨ‡ā¤‚?", + "Send_me_the_code_again": "ā¤ŽāĨā¤āĨ‡ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤•āĨ‹ā¤Ą ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on": "ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_agent_message": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_chat_close": "ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_chat_queued": "ā¤šāĨˆā¤Ÿ ā¤•ā¤¤ā¤žā¤° ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_chat_start": "ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_chat_taken": "ā¤˛āĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤Ÿ ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_forwarding": "ā¤…ā¤—āĨā¤°āĨ‡ā¤ˇā¤Ŗ ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_lead_capture": "ā¤˛āĨ€ā¤Ą ā¤•āĨˆā¤ĒāĨā¤šā¤° ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_offline_messages": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_request_on_visitor_message": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_Test": "ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_Test_Email": "ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_via_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_via_Email_as_attachment": "ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Export_as_PDF": "ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Export_enabled_at_the_end_of_the_conversation": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Send_Visitor_navigation_history_as_a_message": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_visitor_navigation_history_on_request": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤Ēā¤° ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_welcome_email": "ā¤¸āĨā¤ĩā¤žā¤—ā¤¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Send_your_JSON_payloads_to_this_URL": "ā¤…ā¤Ēā¤¨āĨ‡ JSON ā¤ĒāĨ‡ā¤˛āĨ‹ā¤Ą ā¤‡ā¤¸ URL ā¤Ēā¤° ā¤­āĨ‡ā¤œāĨ‡ā¤‚āĨ¤", + "send-mail": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‹", + "send-mail_description": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "send-many-messages": "ā¤…ā¤¨āĨ‡ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "send-many-messages_description": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą 5 ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ€ ā¤Ļā¤° ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‹ ā¤Ŧā¤žā¤¯ā¤Ēā¤žā¤¸ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "send-omnichannel-chat-transcript": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "send-omnichannel-chat-transcript_description": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Sender_Info": "ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Sending": "ā¤­āĨ‡ā¤œā¤¨ā¤ž...", + "Sending_Invitations": "ā¤¨ā¤ŋā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤­āĨ‡ā¤œā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Sending_your_mail_to_s": "ā¤†ā¤Ēā¤•ā¤ž ā¤ŽāĨ‡ā¤˛ %s ā¤Ēā¤° ā¤­āĨ‡ā¤œā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Sent_an_attachment": "ā¤ā¤• ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤­āĨ‡ā¤œā¤ž", + "Sent_from": "ā¤ĒāĨā¤°āĨ‡ā¤ˇā¤•", + "Separate_multiple_words_with_commas": "ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤ļā¤ŦāĨā¤ĻāĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Served_By": "ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸āĨ‡ā¤ĩā¤ž", + "Server": "ā¤¸ā¤°āĨā¤ĩā¤°", + "Server_already_added": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤œā¤ž ā¤šāĨā¤•ā¤ž ā¤šāĨˆ", + "Server_doesnt_exist": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Servers": "ā¤¸ā¤°āĨā¤ĩā¤°", + "Server_Configuration": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨", + "Server_File_Path": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ēā¤Ĩ", + "Server_Folder_Path": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤Ēā¤Ĩ", + "Server_Info": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Server_name": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Server_Type": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "Service": "ā¤¸āĨ‡ā¤ĩā¤ž", + "Service_account_key": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤•āĨā¤‚ā¤œāĨ€", + "Set_as_favorite": "ā¤Ēā¤¸ā¤‚ā¤ĻāĨ€ā¤Ļā¤ž ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Set_as_leader": "ā¤¨āĨ‡ā¤¤ā¤ž ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Set_as_moderator": "ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤Ÿā¤° ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Set_as_owner": "ā¤¸āĨā¤ĩā¤žā¤ŽāĨ€ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Upload_app": "ā¤ā¤Ē ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Set_random_password_and_send_by_email": "ā¤¯ā¤žā¤ĻāĨƒā¤šāĨā¤›ā¤ŋā¤• ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "set-leader": "ā¤¨āĨ‡ā¤¤ā¤ž ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "set-leader_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤˛āĨ€ā¤Ąā¤° ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "set-moderator": "ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤Ÿā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "set-moderator_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤Ÿā¤° ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "set-owner": "ā¤¸āĨā¤ĩā¤žā¤ŽāĨ€ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "set-owner_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤¸āĨā¤ĩā¤žā¤ŽāĨ€ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "set-react-when-readonly": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "set-react-when-readonly_description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤Ēā¤° ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤•āĨā¤ˇā¤Žā¤¤ā¤ž ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "set-readonly": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "set-readonly_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Settings": "ā¤¸ā¤Žā¤žā¤¯āĨ‹ā¤œā¤¨", + "Settings_updated": "ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Setup_SMTP": "ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Setup_Wizard": "ā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨ā¤ž ā¤ĩā¤ŋā¤œā¤ŧā¤žā¤°āĨā¤Ą", + "Setup_Wizard_Description": "ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ŦāĨā¤¨ā¤ŋā¤¯ā¤žā¤ĻāĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤œāĨˆā¤¸āĨ‡ ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤ĻāĨ‡ā¤ļāĨ¤", + "Setup_Wizard_Info": "ā¤šā¤Ž ā¤†ā¤Ēā¤•ā¤ž ā¤Ēā¤šā¤˛ā¤ž ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡, ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•āĨ‹ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° ā¤¨ā¤ŋā¤ƒā¤ļāĨā¤˛āĨā¤• ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤†ā¤Ļā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤†ā¤Ēā¤•ā¤ž ā¤Žā¤žā¤°āĨā¤—ā¤Ļā¤°āĨā¤ļā¤¨ ā¤•ā¤°āĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Share": "ā¤ļāĨ‡ā¤¯ā¤° ā¤•ā¤°ā¤¨ā¤ž", + "Share_Location_Title": "ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸ā¤žā¤ā¤ž ā¤•ā¤°āĨ‡ā¤‚?", + "Share_screen": "ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤¸ā¤žā¤ā¤ž ā¤•ā¤°ā¤¨ā¤ž", + "New_CannedResponse": "ā¤¨ā¤ˆ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž", + "Edit_CannedResponse": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤¸ā¤‚ā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Sharing": "ā¤ļāĨ‡ā¤¯ā¤°ā¤ŋā¤‚ā¤—", + "Shared_Location": "ā¤¸ā¤žā¤ā¤ž ā¤¸āĨā¤Ĩā¤žā¤¨", + "Shared_Secret": "ā¤¸ā¤žā¤ā¤ž ā¤°ā¤šā¤¸āĨā¤¯", + "Shortcut": "ā¤›āĨ‹ā¤Ÿā¤ž ā¤°ā¤žā¤¸āĨā¤¤ā¤ž", + "shortcut_name": "ā¤ļāĨ‰ā¤°āĨā¤Ÿā¤•ā¤Ÿ ā¤¨ā¤žā¤Ž", + "Should_be_a_URL_of_an_image": "ā¤•ā¤ŋā¤¸āĨ€ ā¤›ā¤ĩā¤ŋ ā¤•ā¤ž URL ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤.", + "Should_exists_a_user_with_this_username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤.", + "Show_agent_email": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_agent_info": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_all": "ā¤¸ā¤Ŧ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Show_Avatars": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_counter": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤šā¤ŋā¤šāĨā¤¨ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Show_default_content": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_email_field": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_mentions": "ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ŦāĨˆā¤œ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_more": "ā¤”ā¤° ā¤Ļā¤ŋā¤–ā¤žā¤“", + "Show_name_field": "ā¤¨ā¤žā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "show_offline_users": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Show_on_offline_page": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤ĒāĨ‡ā¤œ ā¤Ēā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Show_on_registration_page": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤Ēā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_only_online": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_Only_This_Content": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤¯ā¤šāĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_preregistration_form": "ā¤ĒāĨā¤°āĨ€-ā¤°ā¤œā¤ŋā¤¸āĨā¤ŸāĨā¤°āĨ‡ā¤ļā¤¨ ā¤ĢāĨ‰ā¤°āĨā¤Ž ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_queue_list_to_all_agents": "ā¤¸ā¤­āĨ€ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤¤ā¤žā¤° ā¤¸āĨ‚ā¤šāĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "Show_room_counter_on_sidebar": "ā¤¸ā¤žā¤‡ā¤Ąā¤Ŧā¤žā¤° ā¤Ēā¤° ā¤ļāĨ‹ ā¤°āĨ‚ā¤Ž ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤°", + "Show_Setup_Wizard": "ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤ĩā¤ŋā¤œā¤ŧā¤žā¤°āĨā¤Ą ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_the_keyboard_shortcut_list": "ā¤•āĨā¤‚ā¤œāĨ€ā¤Ēā¤Ÿā¤˛ ā¤ļāĨ‰ā¤°āĨā¤Ÿā¤•ā¤Ÿ ā¤¸āĨ‚ā¤šāĨ€ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_To_Workspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤Ēā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_video": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤Ļā¤ŋā¤–ā¤žā¤“", + "Showing": "ā¤Ļā¤ŋā¤–ā¤ž", + "Showing_archived_results": "

    %s ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž ā¤Ļā¤ŋā¤–ā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ

    ", + "Showing_current_of_total": "{{total}} ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ {{current}} ā¤Ļā¤ŋā¤–ā¤žā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Showing_online_users": "ā¤Ļā¤ŋā¤–ā¤žā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ: {{total_showing}} , ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨: {{online}}, ā¤•āĨā¤˛: {{total}} ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Showing_results": "

    %s ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž ā¤Ļā¤ŋā¤–ā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ

    ", + "Showing_results_of": "%s - %s ā¤•āĨ‡ %s ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Ž ā¤Ļā¤ŋā¤–ā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Show_usernames": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_roles": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤", + "Show_or_hide_the_user_roles_of_message_authors": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛āĨ‡ā¤–ā¤•āĨ‹ā¤‚ ā¤•āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤Ļā¤ŋā¤–ā¤žā¤ā¤ ā¤¯ā¤ž ā¤›ā¤ŋā¤Ēā¤žā¤ā¤āĨ¤", + "Show_or_hide_the_username_of_message_authors": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛āĨ‡ā¤–ā¤•āĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤ŋā¤–ā¤žā¤ā¤ ā¤¯ā¤ž ā¤›ā¤ŋā¤Ēā¤žā¤ā¤āĨ¤", + "Sidebar": "ā¤¸ā¤žā¤‡ā¤Ą ā¤Ŧā¤žā¤°", + "Sidebar_list_mode": "ā¤¸ā¤žā¤‡ā¤Ąā¤Ŧā¤žā¤° ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‚ā¤šāĨ€ ā¤ŽāĨ‹ā¤Ą", + "Sign_in_to_start_talking": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Sign_in_with__provider__": "{{provider}} ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "since_creation": "%s ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¸āĨ‡", + "Site_Name": "ā¤œā¤—ā¤š ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Site_Url": "ā¤¸ā¤žā¤‡ā¤Ÿ URL", + "Site_Url_Description": "ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ: `https://chat.domain.com/`", + "Size": "ā¤†ā¤•ā¤žā¤°", + "Skin_tone": "ā¤¤āĨā¤ĩā¤šā¤ž ā¤•ā¤ž ā¤°ā¤‚ā¤—", "Skip": "ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "SLA_Policy": "ā¤ā¤¸ā¤ā¤˛ā¤ ā¤¨āĨ€ā¤¤ā¤ŋ", + "SLA_Policies": "ā¤ā¤¸ā¤ā¤˛ā¤ ā¤¨āĨ€ā¤¤ā¤ŋā¤¯ā¤žā¤‚", + "SLA_removed": "ā¤ā¤¸ā¤ā¤˛ā¤ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Slack_Users": "ā¤¸āĨā¤˛āĨˆā¤• ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨ€ā¤ā¤¸ā¤ĩāĨ€", + "SlackBridge_APIToken": "ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤ŸāĨ‹ā¤•ā¤¨ (ā¤ĩā¤ŋā¤°ā¤žā¤¸ā¤¤)", + "SlackBridge_UseLegacy": "ā¤˛āĨ€ā¤—āĨ‡ā¤¸āĨ€ ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "SlackBridge_APIToken_Description": "ā¤†ā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ ā¤ā¤• ā¤ā¤ĒāĨ€ā¤†ā¤ˆ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧā¤•ā¤° ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤¸āĨā¤˛āĨˆā¤• ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "SlackBridge_BotToken": "ā¤ŦāĨ‰ā¤Ÿ ā¤ŸāĨ‹ā¤•ā¤¨", + "SlackBridge_BotToken_Description": "ā¤†ā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ ā¤ā¤• ā¤ŦāĨ‰ā¤Ÿ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧā¤•ā¤° ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤¸āĨā¤˛āĨˆā¤• ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "SlackBridge_AppToken": "ā¤ā¤Ē ā¤ŸāĨ‹ā¤•ā¤¨", + "SlackBridge_AppToken_Description": "ā¤†ā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ ā¤ā¤• ā¤ā¤Ē ā¤ŸāĨ‹ā¤•ā¤¨ ā¤œāĨ‹ā¤Ąā¤ŧā¤•ā¤° ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤¸āĨā¤˛āĨˆā¤• ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "SlackBridge_SigningSecret": "ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤—āĨā¤ĒāĨā¤¤", + "SlackBridge_SigningSecret_Description": "ā¤†ā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ ā¤ā¤• ā¤šā¤¸āĨā¤¤ā¤žā¤•āĨā¤ˇā¤° ā¤°ā¤šā¤¸āĨā¤¯ ā¤œāĨ‹ā¤Ąā¤ŧā¤•ā¤° ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤¸āĨā¤˛āĨˆā¤• ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Slackbridge_channel_links_removed_successfully": "ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤šāĨˆā¤¨ā¤˛ ā¤˛ā¤ŋā¤‚ā¤• ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤šāĨˆā¤‚āĨ¤", + "SlackBridge_Description": "ā¤¸āĨā¤˛āĨˆā¤• ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĩā¤žā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ Rocket.Chat ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "SlackBridge_error": "ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ %s ā¤Ēā¤° ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤•āĨ‹ ā¤ā¤• ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤Žā¤ŋā¤˛āĨ€: %s", + "SlackBridge_finish": "ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤¨āĨ‡ %s ā¤Ēā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•ā¤ž ā¤†ā¤¯ā¤žā¤¤ ā¤ĒāĨ‚ā¤°ā¤ž ā¤•ā¤° ā¤˛ā¤ŋā¤¯ā¤ž ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸ā¤­āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤¨ā¤ƒ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "SlackBridge_Out_All": "ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤†ā¤‰ā¤Ÿ ā¤‘ā¤˛", + "SlackBridge_Out_All_Description": "ā¤‰ā¤¨ ā¤¸ā¤­āĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚ ā¤œāĨ‹ ā¤¸āĨā¤˛āĨˆā¤• ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤ŦāĨ‰ā¤Ÿ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "SlackBridge_Out_Channels": "ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤†ā¤‰ā¤Ÿ ā¤šāĨˆā¤¨ā¤˛", + "SlackBridge_Out_Channels_Description": "ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•āĨŒā¤¨ ā¤¸āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨā¤˛āĨˆā¤• ā¤•āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĩā¤žā¤Ēā¤¸ ā¤­āĨ‡ā¤œāĨ‡ā¤‚ā¤—āĨ‡", + "SlackBridge_Out_Enabled": "ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤†ā¤‰ā¤Ÿ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "SlackBridge_Out_Enabled_Description": "ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•āĨā¤¯ā¤ž ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤•āĨ‹ ā¤­āĨ€ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨā¤˛āĨˆā¤• ā¤•āĨ‹ ā¤ĩā¤žā¤Ēā¤¸ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤šā¤žā¤šā¤ŋā¤", + "SlackBridge_Remove_Channel_Links_Description": "ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤”ā¤° ā¤¸āĨā¤˛āĨˆā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤˛ā¤ŋā¤‚ā¤• ā¤šā¤Ÿā¤žā¤ā¤‚āĨ¤ ā¤Ŧā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤¨ā¤˛ ā¤¨ā¤žā¤ŽāĨ‹ā¤‚ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤˛ā¤ŋā¤‚ā¤• ā¤Ģā¤ŋā¤° ā¤¸āĨ‡ ā¤Ŧā¤¨ā¤žā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "SlackBridge_start": "@%s ā¤¨āĨ‡ `#%s` ā¤Ēā¤° ā¤¸āĨā¤˛āĨˆā¤•ā¤ŦāĨā¤°ā¤ŋā¤œ ā¤†ā¤¯ā¤žā¤¤ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆāĨ¤ ā¤œā¤Ŧ ā¤¯ā¤š ā¤ĒāĨ‚ā¤°ā¤ž ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤ž ā¤¤āĨ‹ ā¤šā¤Ž ā¤†ā¤Ēā¤•āĨ‹ ā¤Ŧā¤¤ā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Slash_Gimme_Description": "ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ āŧŧツ ◕_◕ āŧŊツ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Slash_LennyFace_Description": "ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ( ͥ° ͜ʖ ͥ°) ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ", + "Slash_Shrug_Description": "ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ¯\\_(ツ)_/¯ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Slash_Status_Description": "ā¤…ā¤Ēā¤¨ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Slash_Status_Params": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Slash_Tableflip_Description": "ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ (â•¯Â°â–ĄÂ°īŧ‰â•¯ī¸ĩ â”ģ━â”ģ", + "Slash_TableUnflip_Description": "ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ â”Ŧ─â”Ŧīģŋ ノ( ゜-゜ノ)", + "Slash_Topic_Description": "ā¤ĩā¤ŋā¤ˇā¤¯ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Slash_Topic_Params": "ā¤ĩā¤ŋā¤ˇā¤¯ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Smarsh": "Smarsh", + "Smarsh_Description": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸ā¤‚ā¤šā¤žā¤° ā¤•āĨ‹ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨.", + "Smarsh_Email": "ā¤¸āĨā¤Žā¤°āĨā¤ļ ā¤ˆā¤ŽāĨ‡ā¤˛", + "Smarsh_Email_Description": ".eml ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤Žā¤°āĨā¤ļ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤žāĨ¤", + "Smarsh_Enabled": "ā¤¸āĨā¤Žā¤°āĨā¤ļ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Smarsh_Enabled_Description": "ā¤•āĨā¤¯ā¤ž ā¤¸āĨā¤Žā¤°āĨā¤ļ ā¤ˆā¤ā¤Žā¤ā¤˛ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ ā¤¯ā¤ž ā¤¨ā¤šāĨ€ā¤‚ (ā¤ˆā¤ŽāĨ‡ā¤˛ -> ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤•āĨ‡ ā¤¤ā¤šā¤¤ 'ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‡' ā¤­ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤œā¤°āĨ‚ā¤°ā¤¤ ā¤šāĨˆ)āĨ¤", + "Smarsh_Interval": "ā¤¸āĨā¤Žā¤°āĨā¤ļ ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛", + "Smarsh_Interval_Description": "ā¤šāĨˆā¤Ÿ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž (ā¤ˆā¤ŽāĨ‡ā¤˛ -> ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤•āĨ‡ ā¤¤ā¤šā¤¤ 'ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‡' ā¤­ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ)āĨ¤", + "Smarsh_MissingEmail_Email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤—āĨā¤Ž ā¤šāĨˆ", + "Smarsh_MissingEmail_Email_Description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–ā¤žā¤¤āĨ‡ ā¤•ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤—ā¤žā¤¯ā¤Ŧ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤‰ā¤¸āĨ‡ ā¤Ļā¤ŋā¤–ā¤žā¤¯ā¤ž ā¤œā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤†ā¤Ž ā¤¤āĨŒā¤° ā¤Ēā¤° ā¤ŦāĨ‰ā¤Ÿ ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Smarsh_Timezone": "ā¤¸āĨā¤Žā¤°āĨā¤ļ ā¤Ÿā¤žā¤‡ā¤Žā¤œā¤ŧāĨ‹ā¤¨", + "Smileys_and_People": "ā¤¸āĨā¤Žā¤žā¤‡ā¤˛āĨ€ā¤œā¤ŧ ā¤”ā¤° ā¤˛āĨ‹ā¤—", + "SMS": "ā¤ā¤¸ā¤ā¤Žā¤ā¤¸", + "SMS_Description": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤° ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤”ā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "SMS_Default_Omnichannel_Department": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤ŋā¤­ā¤žā¤— (ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ)", + "SMS_Default_Omnichannel_Department_Description": "ā¤¯ā¤Ļā¤ŋ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤‡ā¤¸ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ļāĨā¤°āĨ‚ ā¤•āĨ€ ā¤—ā¤ˆ ā¤¸ā¤­āĨ€ ā¤¨ā¤ˆ ā¤†ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤šāĨˆā¤Ÿ ā¤‡ā¤¸ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤­āĨ‡ā¤œ ā¤ĻāĨ€ ā¤œā¤žā¤ā¤‚ā¤—āĨ€āĨ¤\nā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤•āĨā¤ĩāĨ‡ā¤°āĨ€ ā¤ĒāĨˆā¤°ā¤žā¤ŽāĨ€ā¤Ÿā¤° ā¤Ēā¤žā¤¸ ā¤•ā¤°ā¤•āĨ‡ ā¤‡ā¤¸ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤“ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤\nā¤œāĨˆā¤¸āĨ‡ `https://{{SERVER_URL}}/api/v1/livechat/sms-incoming/twilio?department={{Department Id or Name}}`āĨ¤\nā¤¨āĨ‹ā¤Ÿ: ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ē ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤¯ā¤š ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤", + "SMS_Enabled": "ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "SMS_Twilio_NotConfigured": "ā¤ŸāĨā¤ĩā¤ŋā¤˛ā¤ŋā¤¯āĨ‹ ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤ ā¤‡ā¤¸āĨ‡ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ -> ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤Ēā¤° ā¤œā¤žā¤ā¤‚", + "SMS_Twilio_InvalidCredentials": "ā¤ŸāĨā¤ĩā¤ŋā¤˛ā¤ŋā¤¯āĨ‹ ā¤ā¤¸ā¤ā¤Žā¤ā¤¸ ā¤•āĨā¤°āĨ‡ā¤ĄāĨ‡ā¤‚ā¤ļā¤ŋā¤¯ā¤˛ ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆā¤‚, ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤­āĨ‡ā¤œ ā¤¸ā¤•ā¤¤āĨ‡", + "SMTP": "ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€", + "SMTP_Host": "ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤šāĨ‹ā¤¸āĨā¤Ÿ", + "SMTP_Password": "ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "SMTP_Port": "ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤ĒāĨ‹ā¤°āĨā¤Ÿ", + "SMTP_Server_Not_Setup_Title": "SMTP ā¤¸ā¤°āĨā¤ĩā¤° ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨā¤† ā¤šāĨˆ", + "SMTP_Server_Not_Setup_Description": "ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤­āĨ‡ā¤œā¤¨ā¤ž ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤¯ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤œāĨ‹ā¤Ąā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨ā¤ž ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤ˆā¤ŽāĨ‡ā¤˛ā¤ŋā¤‚ā¤— ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "SMTP_Test_Button": "ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "SMTP_Username": "ā¤ā¤¸ā¤ā¤Žā¤ŸāĨ€ā¤ĒāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "Snippet_Added": "%s ā¤Ēā¤° ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Snippet_name": "ā¤¸āĨā¤¨ā¤ŋā¤ĒāĨ‡ā¤Ÿ ā¤¨ā¤žā¤Ž", + "Snippeted_a_message": "ā¤ā¤• ā¤¸āĨā¤¨ā¤ŋā¤ĒāĨ‡ā¤Ÿ {{snippetLink}} ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Social_Network": "ā¤¸ā¤žā¤Žā¤žā¤œā¤ŋā¤• ā¤¨āĨ‡ā¤Ÿā¤ĩā¤°āĨā¤•", + "Some_ideas_to_get_you_started": "ā¤†ā¤Ēā¤•āĨ‹ ā¤†ā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤› ā¤ĩā¤ŋā¤šā¤žā¤°", + "Something_went_wrong": "ā¤•āĨā¤› ā¤—ā¤˛ā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "Something_went_wrong_try_again_later": "ā¤•āĨā¤› ā¤—ā¤˛ā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž, ā¤Ŧā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Something_went_wrong_while_executing_command": "ā¤•ā¤Žā¤žā¤‚ā¤Ą ā¤¨ā¤ŋā¤ˇāĨā¤Ēā¤žā¤Ļā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤•āĨā¤› ā¤—ā¤˛ā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž: `/{{command}}`", + "Sorry_page_you_requested_does_not_exist_or_was_deleted": "ā¤•āĨā¤ˇā¤Žā¤ž ā¤•ā¤°āĨ‡ā¤‚, ā¤†ā¤Ēā¤•āĨ‡ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ā¤ŋā¤¤ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤¯ā¤ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ!", + "Sort": "ā¤•āĨā¤°ā¤Ž ā¤¸āĨ‡ ā¤˛ā¤—ā¤žā¤¨ā¤ž", + "Sort_By": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤•āĨā¤°ā¤Žā¤Ŧā¤ĻāĨā¤§ ā¤•ā¤°āĨ‡ā¤‚", + "Sorting_mechanism": "ā¤›ā¤ā¤Ÿā¤žā¤ˆ ā¤¤ā¤‚ā¤¤āĨā¤°", + "Service_level_agreements": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤¸āĨā¤¤ā¤° ā¤…ā¤¨āĨā¤Ŧā¤‚ā¤§", + "Sort_by_activity": "ā¤—ā¤¤ā¤ŋā¤ĩā¤ŋā¤§ā¤ŋ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤•āĨā¤°ā¤Žā¤Ŧā¤ĻāĨā¤§ ā¤•ā¤°āĨ‡ā¤‚", + "Sound": "ā¤†ā¤ĩā¤žā¤œā¤ŧ", + "Sounds": "ā¤§āĨā¤ĩā¤¨ā¤ŋ", + "Sound_File_mp3": "ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ (ā¤ā¤Žā¤ĒāĨ€3)", + "Sound File": "ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤Ģā¤ŧā¤žā¤‡ā¤˛", + "Source": "ā¤¸āĨā¤°āĨ‹ā¤¤", + "Speakers": "ā¤ĩā¤•āĨā¤¤ā¤žā¤“ā¤‚", + "spy-voip-calls": "ā¤œā¤žā¤¸āĨ‚ā¤¸ ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‰ā¤˛", + "spy-voip-calls_description": "ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‰ā¤˛ ā¤•āĨ€ ā¤œā¤žā¤¸āĨ‚ā¤¸āĨ€ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "SSL": "ā¤ā¤¸ā¤ā¤¸ā¤ā¤˛", + "Star": "ā¤¤ā¤žā¤°ā¤ž", + "Star_Message": "ā¤¸ā¤ŋā¤¤ā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Starred_Messages": "ā¤¤ā¤žā¤°ā¤žā¤‚ā¤•ā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Start": "ā¤ļāĨā¤°āĨ‚", + "Start_a_call": "ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Start_a_free_trial": "ā¤¨ā¤ŋā¤ƒā¤ļāĨā¤˛āĨā¤• ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Start_audio_call": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Start_call": "ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", "Start_Chat": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ļāĨā¤°āĨ‚ ", + "Start_conference_call": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Start_free_trial": "ā¤¨ā¤ŋā¤ļāĨā¤˛āĨā¤• ā¤†ā¤œā¤Žā¤žā¤‡ā¤ļ ā¤ļāĨā¤°āĨ ā¤•ā¤°āĨ‡ā¤‚", + "Start_of_conversation": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ€ ā¤ļāĨā¤°āĨā¤†ā¤¤", + "Start_OTR": "ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Start_video_call": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚", + "Start_video_conference": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚?", + "Start_with_s_for_user_or_s_for_channel_Eg_s_or_s": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ %s ā¤¯ā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ %s ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤œāĨˆā¤¸āĨ‡: %s ā¤¯ā¤ž %s", + "start-discussion": "ā¤šā¤°āĨā¤šā¤ž ā¤šā¤˛ā¤žā¤¨ā¤ž", + "start-discussion_description": "ā¤šā¤°āĨā¤šā¤ž ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "start-discussion-other-user": "ā¤šā¤°āĨā¤šā¤ž ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°āĨ‡ā¤‚ (ā¤…ā¤¨āĨā¤¯-ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž)", + "start-discussion-other-user_description": "ā¤šā¤°āĨā¤šā¤ž ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ, ā¤œāĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨ‡ ā¤­āĨ€ ā¤šā¤°āĨā¤šā¤ž ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆ", + "Started": "ā¤ļāĨā¤°āĨ‚ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž", + "Started_a_video_call": "ā¤ā¤• ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤•āĨ€", + "Started_At": "ā¤‡ā¤¸ ā¤¸ā¤Žā¤¯ ā¤Ēā¤° ā¤ļāĨā¤°āĨ‚ ā¤•ā¤ŋā¤¯ā¤ž", + "Statistics": "ā¤†ā¤‚ā¤•ā¤Ąā¤ŧāĨ‡", + "Statistics_reporting": "Rocket.Chat ā¤Ēā¤° ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‡ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Statistics_reporting_Description": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‡ ā¤­āĨ‡ā¤œā¤•ā¤°, ā¤†ā¤Ē ā¤šā¤ŽāĨ‡ā¤‚ ā¤¯ā¤š ā¤Ēā¤šā¤šā¤žā¤¨ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤Žā¤Ļā¤Ļ ā¤•ā¤°āĨ‡ā¤‚ā¤—āĨ‡ ā¤•ā¤ŋ Rocket.Chat ā¤•āĨ‡ ā¤•ā¤ŋā¤¤ā¤¨āĨ‡ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤¤āĨˆā¤¨ā¤žā¤¤ ā¤šāĨˆā¤‚, ā¤¸ā¤žā¤Ĩ ā¤šāĨ€ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤•ā¤ŋā¤¤ā¤¨ā¤ž ā¤…ā¤šāĨā¤›ā¤ž ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤° ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨˆ, ā¤¤ā¤žā¤•ā¤ŋ ā¤šā¤Ž ā¤‡ā¤¸āĨ‡ ā¤”ā¤° ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤Ŧā¤¨ā¤ž ā¤¸ā¤•āĨ‡ā¤‚āĨ¤ ā¤šā¤ŋā¤‚ā¤¤ā¤ž ā¤¨ ā¤•ā¤°āĨ‡ā¤‚, ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤­āĨ‡ā¤œāĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ ā¤”ā¤° ā¤šā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤¸ā¤­āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ ā¤°ā¤–āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Stats_Active_Guests": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ", + "Stats_Active_Users": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_App_Users": "Rocket.Chat ā¤ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Avg_Channel_Users": "ā¤”ā¤¸ā¤¤ ā¤šāĨˆā¤¨ā¤˛ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Avg_Private_Group_Users": "ā¤”ā¤¸ā¤¤ ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Away_Users": "ā¤ĻāĨ‚ā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Max_Room_Users": "ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤•ā¤Žā¤°āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Non_Active_Users": "ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Offline_Users": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Online_Users": "ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Total_Active_Apps": "ā¤•āĨā¤˛ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤ā¤ĒāĨā¤¸", + "Stats_Total_Active_Incoming_Integrations": "ā¤•āĨā¤˛ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤†ā¤ĩā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Stats_Total_Active_Outgoing_Integrations": "ā¤•āĨā¤˛ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Stats_Total_Channels": "ā¤šāĨˆā¤¨ā¤˛", + "Stats_Total_Connected_Users": "ā¤•āĨā¤˛ ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤šāĨā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Stats_Total_Direct_Messages": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Stats_Total_Incoming_Integrations": "ā¤•āĨā¤˛ ā¤†ā¤ĩā¤• ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Stats_Total_Installed_Apps": "ā¤•āĨā¤˛ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤ā¤ĒāĨā¤¸", + "Stats_Total_Integrations": "ā¤•āĨā¤˛ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Stats_Total_Integrations_With_Script_Enabled": "ā¤¸āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤Ÿ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Stats_Total_Livechat_Rooms": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°āĨ‡", + "Stats_Total_Messages": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚", + "Stats_Total_Messages_Channel": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚", + "Stats_Total_Messages_Direct": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚", + "Stats_Total_Messages_Livechat": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚", + "Stats_Total_Messages_PrivateGroup": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚", + "Stats_Total_Messages_Discussions": "ā¤šā¤°āĨā¤šā¤žā¤“ā¤‚ ā¤ŽāĨ‡ā¤‚", + "Stats_Total_Outgoing_Integrations": "ā¤•āĨā¤˛ ā¤†ā¤‰ā¤Ÿā¤—āĨ‹ā¤‡ā¤‚ā¤— ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Stats_Total_Private_Groups": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤š", + "Stats_Total_Rooms": "ā¤•ā¤Žā¤°ā¤ž", + "Stats_Total_Uploads": "ā¤•āĨā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą", + "Stats_Total_Uploads_Size": "ā¤•āĨā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤†ā¤•ā¤žā¤°", + "Stats_Total_Users": "ā¤•āĨā¤˛ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Status": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "StatusMessage": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "StatusMessage_Change_Disabled": "ā¤†ā¤Ēā¤•āĨ‡ Rocket.Chat ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨āĨ‡ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ", + "StatusMessage_Changed_Successfully": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤Ļā¤˛ā¤ž ā¤—ā¤¯ā¤ž.", + "StatusMessage_Placeholder": "ā¤†ā¤Ē ā¤…ā¤­āĨ€ ā¤•āĨā¤¯ā¤ž ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚?", + "StatusMessage_Too_Long": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ 120 ā¤…ā¤•āĨā¤ˇā¤°āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤›āĨ‹ā¤Ÿā¤ž ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤.", + "Step": "ā¤•ā¤Ļā¤Ž", + "Stop_call": "ā¤•āĨ‰ā¤˛ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‹", + "Stop_Recording": "ā¤°ā¤ŋā¤•āĨ‰ā¤°āĨā¤Ąā¤ŋā¤‚ā¤— ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Store_Last_Message": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Store_Last_Message_Sent_per_Room": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤•ā¤Žā¤°āĨ‡ ā¤Ēā¤° ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Stream_Cast": "ā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤•ā¤žā¤¸āĨā¤Ÿ", + "Stream_Cast_Address": "ā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤•ā¤žā¤¸āĨā¤Ÿ ā¤Ēā¤¤ā¤ž", + "Stream_Cast_Address_Description": "ā¤†ā¤Ēā¤•āĨ‡ ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤¸āĨ‡ā¤‚ā¤ŸāĨā¤°ā¤˛ ā¤¸āĨā¤ŸāĨā¤°āĨ€ā¤Ž ā¤•ā¤žā¤¸āĨā¤Ÿ ā¤•ā¤ž ā¤†ā¤ˆā¤ĒāĨ€ ā¤¯ā¤ž ā¤šāĨ‹ā¤¸āĨā¤ŸāĨ¤ ā¤œāĨˆā¤¸āĨ‡ `192.168.1.1:3000` ā¤¯ā¤ž `ā¤˛āĨ‹ā¤•ā¤˛ā¤šāĨ‹ā¤¸āĨā¤Ÿ:4000`", + "Strike": "ā¤šā¤Ąā¤ŧā¤¤ā¤žā¤˛", + "Style": "ā¤ļāĨˆā¤˛āĨ€", + "Subject": "ā¤ĩā¤ŋā¤ˇā¤¯", + "Submit": "ā¤œā¤Žā¤ž ā¤•ā¤°ā¤¨ā¤ž", + "Subscribe": "ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤˛āĨ‡ā¤‚", + "Success": "ā¤¸ā¤Ģā¤˛ā¤¤ā¤ž", + "Success_message": "ā¤¸ā¤Ģā¤˛ā¤¤ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Successfully_downloaded_file_from_external_URL_should_start_preparing_soon": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¸āĨ‡ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤—ā¤ˆ ā¤šāĨˆ, ā¤œā¤˛āĨā¤Ļ ā¤šāĨ€ ā¤¤āĨˆā¤¯ā¤žā¤°āĨ€ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤° ā¤ĻāĨ‡ā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤", + "Suggestion_from_recent_messages": "ā¤šā¤žā¤˛ ā¤•āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤¸āĨā¤ā¤žā¤ĩ", + "Sunday": "ā¤°ā¤ĩā¤ŋā¤ĩā¤žā¤°", + "Support": "ā¤¸ā¤šā¤žā¤¯ā¤¤ā¤ž", "Survey": "ā¤¸ā¤°āĨā¤ĩāĨ‡ā¤•āĨā¤ˇā¤Ŗ", "Survey_instructions": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤ĒāĨā¤°ā¤ļāĨā¤¨ ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ€ ā¤¸ā¤‚ā¤¤āĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤°āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚, 1 ā¤Žā¤¤ā¤˛ā¤Ŧ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤ĒāĨ‚ā¤°āĨ€ ā¤¤ā¤°ā¤š ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤¤āĨā¤ˇāĨā¤Ÿ ā¤šāĨˆā¤‚ ā¤”ā¤° 5 ā¤•ā¤ž ā¤…ā¤°āĨā¤Ĩ ā¤šāĨˆ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤ĒāĨ‚ā¤°āĨ€ ā¤¤ā¤°ā¤š ā¤¸āĨ‡ ā¤¸ā¤‚ā¤¤āĨā¤ˇāĨā¤Ÿ ā¤šāĨˆā¤‚āĨ¤", + "Symbols": "ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•", + "Sync": "ā¤¸ā¤žā¤Ĩ-ā¤¸ā¤žā¤Ĩ ā¤•ā¤°ā¤¨ā¤ž", + "Sync / Import": "ā¤¸ā¤ŋā¤‚ā¤•/ā¤†ā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Sync_in_progress": "ā¤¤āĨā¤˛āĨā¤¯ā¤•ā¤žā¤˛ā¤¨ ā¤ĒāĨā¤°ā¤—ā¤¤ā¤ŋ ā¤Ēā¤° ā¤šāĨˆ", + "Sync_Interval": "ā¤…ā¤‚ā¤¤ā¤°ā¤žā¤˛ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨ā¤ž", + "Sync_success": "ā¤¸ā¤Žā¤¨āĨā¤ĩā¤¯ā¤¨ ā¤¸ā¤Ģā¤˛", + "Sync_Users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "sync-auth-services-users": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "sync-auth-services-users_description": "ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "System_messages": "ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Tag": "ā¤ŸāĨˆā¤—", + "Tags": "ā¤ŸāĨˆā¤—", + "Tag_removed": "ā¤ŸāĨˆā¤— ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Tag_already_exists": "ā¤ŸāĨˆā¤— ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "Take_it": "ā¤‡ā¤¸āĨ‡ ā¤˛āĨ‡ā¤‚!", + "Take_rocket_chat_with_you_with_mobile_applications": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ Rocket.Chat ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤˛āĨ‡ ā¤œā¤žā¤ā¤‚āĨ¤", + "Taken_at": "ā¤Ēā¤° ā¤˛ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Talk_Time": "ā¤Ŧā¤žā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "Talk_to_an_expert": "ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤œāĨā¤ž ā¤¸āĨ‡ ā¤Ŧā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Talk_to_sales": "ā¤Ŧā¤ŋā¤•āĨā¤°āĨ€ ā¤¸āĨ‡ ā¤Ŧā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Talk_to_your_workspace_administrator_about_enabling_video_conferencing": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤¨āĨā¤ĢāĨā¤°āĨ‡ā¤‚ā¤¸ā¤ŋā¤‚ā¤— ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤Ŧā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Talk_to_your_workspace_admin_to_address_this_issue": "ā¤‡ā¤¸ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤•āĨ‡ ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¸āĨ‡ ā¤Ŧā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Target user not allowed to receive messages": "ā¤˛ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "TargetRoom": "ā¤˛ā¤•āĨā¤ˇāĨā¤¯ ā¤•ā¤•āĨā¤ˇ", + "TargetRoom_Description": "ā¤ĩā¤š ā¤•ā¤Žā¤°ā¤ž ā¤œā¤šā¤žā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡ ā¤œāĨ‹ ā¤‡ā¤¸ ā¤˜ā¤Ÿā¤¨ā¤ž ā¤•āĨ‡ ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤Žā¤¸āĨā¤ĩā¤°āĨ‚ā¤Ē ā¤¨ā¤ŋā¤•ā¤žā¤˛ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤šāĨˆā¤‚āĨ¤ ā¤•āĨ‡ā¤ĩā¤˛ ā¤ā¤• ā¤˛ā¤•āĨā¤ˇāĨā¤¯ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤šāĨˆ ā¤”ā¤° ā¤ĩā¤š ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤°ā¤šā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤", + "Team": "ā¤ŸāĨ€ā¤Ž", + "Team_Add_existing_channels": "ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Team_Add_existing": "ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Team_Auto-join": "ā¤‘ā¤ŸāĨ‹ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "Team_Channels": "ā¤ŸāĨ€ā¤Ž ā¤šāĨˆā¤¨ā¤˛", + "Team_Delete_Channel_modal_content_danger": "ā¤‡ā¤¸āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž.", + "Team_Delete_Channel_modal_content": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šāĨ‡ā¤‚ā¤—āĨ‡?", + "Team_has_been_created": "ā¤ŸāĨ€ā¤Ž ā¤Ŧā¤¨ā¤žā¤ˆ ā¤—ā¤ˆ ā¤šāĨˆ", + "Team_has_been_deleted": "ā¤ŸāĨ€ā¤Ž ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ", + "Team_Info": "ā¤ŸāĨ€ā¤Ž ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Team_Mapping": "ā¤ŸāĨ€ā¤Ž ā¤ŽāĨˆā¤Ēā¤ŋā¤‚ā¤—", + "Team_Name": "ā¤ŸāĨ€ā¤Ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Team_Remove_from_team_modal_content": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ {{teamName}} ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šāĨ‡ā¤‚ā¤—āĨ‡? ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤ĩā¤žā¤Ēā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‡ ā¤œā¤žā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž.", + "Team_Remove_from_team": "ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ ā¤šā¤Ÿā¤žā¤“", + "Team_what_is_this_team_about": "ā¤¯ā¤š ā¤ŸāĨ€ā¤Ž ā¤•ā¤ŋā¤¸ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ", + "Teams": "ā¤ŸāĨ€ā¤ŽāĨ‡ā¤‚", + "Teams_about_the_channels": "ā¤”ā¤° ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚?", + "Teams_channels_didnt_leave": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤†ā¤Ē ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚:", + "Teams_channels_last_owner_delete_channel_warning": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤šāĨˆā¤‚. ā¤ā¤• ā¤Ŧā¤žā¤° ā¤œā¤Ŧ ā¤†ā¤Ē ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‡ ā¤œā¤žā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Teams_channels_last_owner_leave_channel_warning": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤šāĨˆā¤‚. ā¤ā¤• ā¤Ŧā¤žā¤° ā¤œā¤Ŧ ā¤†ā¤Ē ā¤ŸāĨ€ā¤Ž ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤…ā¤‚ā¤Ļā¤° ā¤°ā¤–ā¤ž ā¤œā¤žā¤ā¤—ā¤ž ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤†ā¤Ē ā¤‡ā¤¸āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Teams_leaving_team": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚.", + "Teams_channels": "ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤šāĨˆā¤¨ā¤˛", + "Teams_convert_channel_to_team": "ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤•ā¤¨ā¤ĩā¤°āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Teams_delete_team_choose_channels": "ā¤ĩāĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤œā¤ŋā¤¨āĨā¤šāĨ‡ā¤‚ ā¤†ā¤Ē ā¤šā¤Ÿā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤œā¤ŋā¤¨āĨā¤šāĨ‡ā¤‚ ā¤†ā¤Ē ā¤°ā¤–ā¤¨āĨ‡ ā¤•ā¤ž ā¤¨ā¤ŋā¤°āĨā¤Ŗā¤¯ ā¤˛āĨ‡ā¤‚ā¤—āĨ‡, ā¤ĩāĨ‡ ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤°ā¤šāĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Teams_delete_team_public_notice": "ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤…ā¤­āĨ€ ā¤­āĨ€ ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤°ā¤šāĨ‡ā¤‚ā¤—āĨ‡ ā¤”ā¤° ā¤¸ā¤­āĨ€ ā¤•āĨ‹ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Teams_delete_team_Warning": "ā¤ā¤• ā¤Ŧā¤žā¤° ā¤œā¤Ŧ ā¤†ā¤Ē ā¤•ā¤ŋā¤¸āĨ€ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤¸ā¤­āĨ€ ā¤šāĨˆā¤Ÿ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤”ā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Teams_delete_team": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤šāĨˆā¤‚.", + "Teams_deleted_channels": "ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šāĨˆā¤¨ā¤˛ ā¤šā¤Ÿā¤žā¤ ā¤œā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚:", + "Teams_Errors_Already_exists": "ā¤ŸāĨ€ā¤Ž `{{name}}` ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆāĨ¤", + "Teams_Errors_team_name": "ā¤†ā¤Ē ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ \"{{name}}\" ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡āĨ¤", + "Teams_move_channel_to_team": "ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤ā¤", + "Teams_move_channel_to_team_description_first": "ā¤•ā¤ŋā¤¸āĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤…ā¤‚ā¤Ļā¤° ā¤˛āĨ‡ ā¤œā¤žā¤¨āĨ‡ ā¤•ā¤ž ā¤Žā¤¤ā¤˛ā¤Ŧ ā¤šāĨˆ ā¤•ā¤ŋ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤¸ā¤‚ā¤Ļā¤°āĨā¤­ ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤œā¤žā¤ā¤—ā¤ž, ā¤šā¤žā¤˛ā¤žā¤‚ā¤•ā¤ŋ, ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤¸ā¤Ļā¤¸āĨā¤¯, ā¤œāĨ‹ ā¤¸ā¤‚ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚, ā¤‰ā¤¨ā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤…ā¤­āĨ€ ā¤­āĨ€ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤šāĨ‹ā¤—āĨ€, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Teams_move_channel_to_team_description_second": "ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤¸ā¤žā¤°ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤…ā¤­āĨ€ ā¤­āĨ€ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤˛ā¤ŋā¤•āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Teams_move_channel_to_team_description_third": "ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤”ā¤° ā¤¯ā¤šā¤žā¤‚ ā¤¤ā¤• ā¤•ā¤ŋ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤Žā¤žā¤˛ā¤ŋā¤•, ā¤¯ā¤Ļā¤ŋ ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ€ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤¨ā¤šāĨ€ā¤‚ ā¤Ēā¤ž ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Teams_move_channel_to_team_description_fourth": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚ ā¤•ā¤ŋ ā¤ŸāĨ€ā¤Ž ā¤•ā¤ž ā¤Žā¤žā¤˛ā¤ŋā¤• ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤¸ā¤•āĨ‡ā¤—ā¤žāĨ¤", + "Teams_move_channel_to_team_confirm_description": "ā¤‡ā¤¸ ā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤° ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ, ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤†ā¤—āĨ‡ ā¤Ŧā¤ĸā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Teams_New_Title": "ā¤ŸāĨ€ā¤Ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Teams_New_Name_Label": "ā¤¨ā¤žā¤Ž", + "Teams_Info": "ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‚ā¤šā¤¨ā¤ž", + "Teams_kept_channels": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‡ ā¤œā¤žā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž:", + "Teams_kept__username__channels": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤‰ā¤¨ ā¤Ēā¤° {{username}} ā¤°ā¤–ā¤ž ā¤œā¤žā¤ā¤—ā¤ž:", + "Teams_leave_channels": "ā¤‰ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤šā¤¯ā¤¨ ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤ŋā¤¸āĨ‡ ā¤†ā¤Ē ā¤›āĨ‹ā¤Ąā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Teams_leave": "ā¤ŸāĨ€ā¤Ž ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Teams_left_team_successfully": "ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤›āĨ‹ā¤Ąā¤ŧ ā¤Ļā¤ŋā¤¯ā¤ž", + "Teams_members": "ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯", + "Teams_New_Add_members_Label": "ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Teams_New_Broadcast_Description": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨ€ ā¤¨ā¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛ā¤ŋā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ ā¤¸ā¤•āĨ‡ā¤‚ā¤—āĨ‡", + "Teams_New_Broadcast_Label": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ", + "Teams_New_Description_Label": "ā¤ĩā¤ŋā¤ˇā¤¯", + "Teams_New_Description_Placeholder": "ā¤¯ā¤š ā¤ŸāĨ€ā¤Ž ā¤•ā¤ŋā¤¸ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ", + "Teams_New_Encrypted_Description_Disabled": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤¨ā¤ŋā¤œāĨ€ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆ", + "Teams_New_Encrypted_Description_Enabled": "ā¤ā¤‚ā¤Ą-ā¤ŸāĨ‚-ā¤ā¤‚ā¤Ą ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤ŸāĨ€ā¤ŽāĨ¤ ā¤–āĨ‹ā¤œ ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ŸāĨ‡ā¤Ą ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°āĨ‡ā¤—āĨ€ ā¤”ā¤° ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤–ā¤ž ā¤¸ā¤•ā¤¤āĨ€ ā¤šāĨˆā¤‚āĨ¤", + "Teams_New_Encrypted_Label": "ā¤•āĨ‚ā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Teams_New_Private_Description_Disabled": "ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Teams_New_Private_Description_Enabled": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤˛āĨ‹ā¤— ā¤šāĨ€ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Teams_New_Private_Label": "ā¤¨ā¤ŋā¤œāĨ€", + "Teams_New_Read_only_Description": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤˛ā¤ŋā¤– ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Teams_Public_Team": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤ŸāĨ€ā¤Ž", + "Teams_Private_Team": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ŸāĨ€ā¤Ž", + "Teams_removing_member": "ā¤¸ā¤Ļā¤¸āĨā¤¯ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¯ā¤ž ā¤œā¤ž ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Teams_removing__username__from_team": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ {{username}} ā¤šā¤Ÿā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "Teams_removing__username__from_team_and_channels": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤”ā¤° ā¤‡ā¤¸ā¤•āĨ‡ ā¤¸ā¤­āĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤¸āĨ‡ {{username}} ā¤šā¤Ÿā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Teams_Select_a_team": "ā¤ā¤• ā¤ŸāĨ€ā¤Ž ā¤šāĨā¤¨āĨ‡ā¤‚", + "Teams_Search_teams": "ā¤–āĨ‹ā¤œ ā¤Ļā¤˛", + "Teams_New_Read_only_Label": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤", + "Technology_Services": "ā¤ĒāĨā¤°āĨŒā¤ĻāĨā¤¯āĨ‹ā¤—ā¤ŋā¤•āĨ€ ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤", + "Terms": "ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚", + "Terms_of_use": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ€ ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚", + "Test_Connection": "ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨", + "Test_Desktop_Notifications": "ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "Test_LDAP_Search": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤–āĨ‹ā¤œ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "test-admin-options": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĒāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē", + "test-admin-options_description": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤œāĨˆā¤¸āĨ‡ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĒāĨˆā¤¨ā¤˛ ā¤Ēā¤° ā¤ĩā¤ŋā¤•ā¤˛āĨā¤ĒāĨ‹ā¤‚ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋāĨ¤", + "test-push-notifications": "ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "test-push-notifications_description": "ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Texts": "ā¤—āĨā¤°ā¤‚ā¤ĨāĨ‹ā¤‚", "Thank_you_for_your_feedback": "ā¤†ā¤Ēā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•ā¤ž ā¤§ā¤¨āĨā¤¯ā¤ĩā¤žā¤Ļ", + "The_application_name_is_required": "ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "The_application_will_be_able_to": "<1>{{appName}} ā¤¯ā¤š ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤—ā¤ž:", + "The_channel_name_is_required": "ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "The_emails_are_being_sent": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚.", + "The_empty_room__roomName__will_be_removed_automatically": "ā¤–ā¤žā¤˛āĨ€ ā¤•ā¤Žā¤°ā¤ž {{roomName}} ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "The_field_is_required": "ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą %s ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ.", + "The_image_resize_will_not_work_because_we_can_not_detect_ImageMagick_or_GraphicsMagick_installed_in_your_server": "ā¤›ā¤ĩā¤ŋ ā¤•ā¤ž ā¤†ā¤•ā¤žā¤° ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤•ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°āĨ‡ā¤—ā¤ž ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤šā¤Ž ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ImageMagick ā¤¯ā¤ž ā¤—āĨā¤°ā¤žā¤Ģā¤ŧā¤ŋā¤•āĨā¤¸Magick ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤˛ā¤—ā¤ž ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "The_message_is_a_discussion_you_will_not_be_able_to_recover": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ā¤• ā¤šā¤°āĨā¤šā¤ž ā¤šāĨˆ ā¤†ā¤Ē ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡!", + "The_mobile_notifications_were_disabled_to_all_users_go_to_Admin_Push_to_enable_the_Push_Gateway_again": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤ĨāĨ€ā¤‚, ā¤ĒāĨā¤ļ ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡ ā¤•āĨ‹ ā¤Ģā¤ŋā¤° ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ \"ā¤ā¤Ąā¤Žā¤ŋā¤¨ > ā¤ĒāĨā¤ļ\" ā¤Ēā¤° ā¤œā¤žā¤ā¤‚", + "The_necessary_browser_permissions_for_location_sharing_are_not_granted": "ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸ā¤žā¤ā¤žā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•āĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤‚", + "The_peer__peer__does_not_exist": "ā¤¸ā¤šā¤•ā¤°āĨā¤ŽāĨ€ {{peer}} ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "The_redirectUri_is_required": "ā¤°āĨ€ā¤Ąā¤žā¤¯ā¤°āĨ‡ā¤•āĨā¤Ÿā¤¯āĨ‚ā¤°āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "The_selected_user_is_not_a_monitor": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "The_selected_user_is_not_an_agent": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ā¤ˆ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "The_server_will_restart_in_s_seconds": "ā¤¸ā¤°āĨā¤ĩā¤° %s ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤¨ā¤°ā¤žā¤°ā¤‚ā¤­ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤ž", + "The_setting_s_is_configured_to_s_and_you_are_accessing_from_s": "ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— %s ā¤•āĨ‹ %s ā¤Ēā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤†ā¤Ē %s ā¤¸āĨ‡ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚!", + "The_user_s_will_be_removed_from_role_s": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž %s ā¤•āĨ‹ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž %s ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "The_user_will_be_removed_from_s": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ %s ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "The_user_wont_be_able_to_type_in_s": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž %s ā¤Ÿā¤žā¤‡ā¤Ē ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤—ā¤ž", + "The_workspace_has_exceeded_the_monthly_limit_of_active_contacts": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•āĨ‹ā¤‚ ā¤•āĨ€ ā¤Žā¤žā¤¸ā¤ŋā¤• ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‹ ā¤Ēā¤žā¤° ā¤•ā¤° ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "Theme": "ā¤ĩā¤ŋā¤ˇā¤¯", + "Themes": "ā¤ĩā¤ŋā¤ˇā¤¯-ā¤ĩā¤¸āĨā¤¤āĨ", + "Choose_theme_description": "ā¤ĩā¤š ā¤‡ā¤‚ā¤Ÿā¤°ā¤Ģā¤ŧāĨ‡ā¤¸ ā¤¸āĨā¤ĩā¤°āĨ‚ā¤Ē ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤œāĨ‹ ā¤†ā¤Ēā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨā¤•āĨā¤¤ ā¤šāĨ‹āĨ¤", + "theme-color-attention-color": "ā¤§āĨā¤¯ā¤žā¤¨ ā¤ĻāĨ‡ā¤‚ ā¤°ā¤‚ā¤—", + "theme-color-component-color": "ā¤˜ā¤Ÿā¤• ā¤°ā¤‚ā¤—", + "theme-color-content-background-color": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤°ā¤‚ā¤—", + "theme-color-custom-scrollbar-color": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤•āĨā¤°āĨ‰ā¤˛ā¤Ŧā¤žā¤° ā¤°ā¤‚ā¤—", + "theme-color-error-color": "ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤°ā¤‚ā¤—", + "theme-color-info-font-color": "ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤°ā¤‚ā¤—", + "theme-color-link-font-color": "ā¤˛ā¤ŋā¤‚ā¤• ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤°ā¤‚ā¤—", + "theme-color-pending-color": "ā¤˛ā¤‚ā¤Ŧā¤ŋā¤¤ ā¤°ā¤‚ā¤—", + "theme-color-primary-action-color": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤°ā¤‚ā¤—", + "theme-color-primary-background-color": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤°ā¤‚ā¤—", + "theme-color-primary-font-color": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤°ā¤‚ā¤—", + "theme-color-rc-color-alert": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", + "theme-color-rc-color-alert-light": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ", + "theme-color-rc-color-alert-message-primary": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•", + "theme-color-rc-color-alert-message-primary-background": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ", + "theme-color-rc-color-alert-message-secondary": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Žā¤žā¤§āĨā¤¯ā¤Žā¤ŋā¤•", + "theme-color-rc-color-alert-message-secondary-background": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ā¤• ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ", + "theme-color-rc-color-alert-message-warning": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", + "theme-color-rc-color-alert-message-warning-background": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€ ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ", + "theme-color-rc-color-announcement-text": "ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž ā¤Ēā¤žā¤  ā¤•ā¤ž ā¤°ā¤‚ā¤—", + "theme-color-rc-color-announcement-background": "ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤°ā¤‚ā¤—", + "theme-color-rc-color-announcement-text-hover": "ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž ā¤Ēā¤žā¤  ā¤°ā¤‚ā¤— ā¤šāĨ‹ā¤ĩā¤°", + "theme-color-rc-color-announcement-background-hover": "ā¤˜āĨ‹ā¤ˇā¤Ŗā¤ž ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤°ā¤‚ā¤— ā¤šāĨ‹ā¤ĩā¤°", + "theme-color-rc-color-button-primary": "ā¤Ŧā¤Ÿā¤¨ ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•", + "theme-color-rc-color-button-primary-light": "ā¤Ŧā¤Ÿā¤¨ ā¤ĒāĨā¤°ā¤žā¤‡ā¤Žā¤°āĨ€ ā¤˛ā¤žā¤‡ā¤Ÿ", + "theme-color-rc-color-content": "ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€", + "theme-color-rc-color-error": "ā¤—ā¤˛ā¤¤āĨ€", + "theme-color-rc-color-error-light": "ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ", + "theme-color-rc-color-link-active": "ā¤˛ā¤ŋā¤‚ā¤• ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "theme-color-rc-color-primary": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•", + "theme-color-rc-color-primary-background": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ", + "theme-color-rc-color-primary-dark": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤…ā¤‚ā¤§āĨ‡ā¤°ā¤ž", + "theme-color-rc-color-primary-darkest": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤…ā¤‚ā¤§ā¤•ā¤žā¤°ā¤Žā¤¯", + "theme-color-rc-color-primary-light": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ", + "theme-color-rc-color-primary-light-medium": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž", + "theme-color-rc-color-primary-lightest": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤šā¤˛āĨā¤•ā¤ž", + "theme-color-rc-color-success": "ā¤¸ā¤Ģā¤˛ā¤¤ā¤ž", + "theme-color-rc-color-success-light": "ā¤¸ā¤Ģā¤˛ā¤¤ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ", + "theme-color-secondary-action-color": "ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ā¤• ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤°ā¤‚ā¤—", + "theme-color-secondary-background-color": "ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ā¤• ā¤ĒāĨƒā¤ˇāĨā¤ ā¤­āĨ‚ā¤Žā¤ŋ ā¤°ā¤‚ā¤—", + "theme-color-secondary-font-color": "ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ā¤• ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤°ā¤‚ā¤—", + "theme-color-selection-color": "ā¤šā¤¯ā¤¨ ā¤°ā¤‚ā¤—", + "theme-color-status-away": "ā¤ĻāĨ‚ā¤° ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤°ā¤‚ā¤—", + "theme-color-status-busy": "ā¤ĩāĨā¤¯ā¤¸āĨā¤¤ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤°ā¤‚ā¤—", + "theme-color-status-offline": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤°ā¤‚ā¤—", + "theme-color-status-online": "ā¤‘ā¤¨ā¤˛ā¤žā¤‡ā¤¨ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•ā¤ž ā¤°ā¤‚ā¤—", + "theme-color-success-color": "ā¤¸ā¤Ģā¤˛ā¤¤ā¤ž ā¤•ā¤ž ā¤°ā¤‚ā¤—", + "theme-color-transparent-dark": "ā¤Ēā¤žā¤°ā¤Ļā¤°āĨā¤ļāĨ€ ā¤…ā¤‚ā¤§āĨ‡ā¤°ā¤ž", + "theme-color-transparent-darker": "ā¤Ēā¤žā¤°ā¤Ļā¤°āĨā¤ļāĨ€ ā¤—ā¤šā¤°ā¤ž", + "theme-color-transparent-lightest": "ā¤Ēā¤žā¤°ā¤Ļā¤°āĨā¤ļāĨ€ ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤šā¤˛āĨā¤•ā¤ž", + "theme-color-unread-notification-color": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤°ā¤‚ā¤—", + "theme-custom-css": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨ€ā¤ā¤¸ā¤ā¤¸", + "theme-font-body-font-family": "ā¤ŦāĨ‰ā¤ĄāĨ€ ā¤Ģā¤ŧāĨ‰ā¤¨āĨā¤Ÿ ā¤Ēā¤°ā¤ŋā¤ĩā¤žā¤°", + "There_are_no_agents_added_to_this_department_yet": "ā¤‡ā¤¸ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "There_are_no_applications": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ OAuth ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "There_are_no_applications_installed": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ Rocket.Chat ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤", + "There_are_no_available_monitors": "ā¤•āĨ‹ā¤ˆ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "There_are_no_departments_added_to_this_tag_yet": "ā¤‡ā¤¸ ā¤ŸāĨˆā¤— ā¤ŽāĨ‡ā¤‚ ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "There_are_no_departments_added_to_this_unit_yet": "ā¤‡ā¤¸ ā¤‡ā¤•ā¤žā¤ˆ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤¨ā¤šāĨ€ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "There_are_no_departments_available": "ā¤•āĨ‹ā¤ˆ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "There_are_no_integrations": "ā¤•āĨ‹ā¤ˆ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "There_are_no_monitors_added_to_this_unit_yet": "ā¤‡ā¤¸ ā¤‡ā¤•ā¤žā¤ˆ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "There_are_no_personal_access_tokens_created_yet": "ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤•āĨ‹ā¤ˆ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤—ā¤¤ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "There_are_no_rooms_for_the_given_search_criteria": "ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤–āĨ‹ā¤œ ā¤Žā¤žā¤¨ā¤Ļā¤‚ā¤Ą ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‹ā¤ˆ ā¤œā¤—ā¤š ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "There_are_no_users_in_this_role": "ā¤‡ā¤¸ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ.", + "There_is_no_video_conference_history_in_this_room": "ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "There_is_one_or_more_apps_in_an_invalid_state_Click_here_to_review": "ā¤ā¤• ā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤ā¤ĒāĨā¤¸ ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤‚. ā¤¸ā¤ŽāĨ€ā¤•āĨā¤ˇā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚.", + "There_has_been_an_error_installing_the_app": "ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤šāĨā¤ˆ ā¤šāĨˆ", + "These_notes_will_be_available_in_the_call_summary": "ā¤¯āĨ‡ ā¤¨āĨ‹ā¤ŸāĨā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸ā¤žā¤°ā¤žā¤‚ā¤ļ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨ‹ā¤‚ā¤—āĨ‡", + "This_agent_was_already_selected": "ā¤¯ā¤š ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤šāĨ‹ ā¤šāĨā¤•ā¤ž ā¤Ĩā¤ž", + "this_app_is_included_with_subscription": "ā¤¯ā¤š ā¤ā¤Ē {{bundleName}} ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆ", + "This_cant_be_undone": "ā¤‡ā¤¸āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž.", + "This_conversation_is_already_closed": "ā¤¯ā¤š ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ ā¤šāĨā¤•āĨ€ ā¤šāĨˆ.", + "This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password": "ā¤¯ā¤š ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤šāĨā¤•ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ. ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚.", + "This_feature_is_currently_in_alpha": "ā¤¯ā¤š ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤Ģā¤ŋā¤˛ā¤šā¤žā¤˛ ā¤…ā¤˛āĨā¤Ģā¤ŧā¤ž ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ!", + "This_is_a_desktop_notification": "ā¤¯ā¤š ā¤ā¤• ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤šāĨˆ", + "This_is_a_deprecated_feature_alert": "ā¤¯ā¤š ā¤ā¤• ā¤Ŧā¤šā¤ŋā¤ˇāĨā¤•āĨƒā¤¤ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤šāĨˆ. ā¤¯ā¤š ā¤‰ā¤ŽāĨā¤ŽāĨ€ā¤Ļ ā¤•āĨ‡ ā¤ŽāĨā¤¤ā¤žā¤Ŧā¤ŋā¤• ā¤•ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤—ā¤ž ā¤”ā¤° ā¤¨ā¤ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛āĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "Zapier_integration_has_been_deprecated": "ā¤œāĨˆā¤Ēā¤ŋā¤¯ā¤° ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ ā¤…ā¤ĒāĨā¤°ā¤šā¤˛ā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤¯ā¤š ā¤…ā¤ĒāĨ‡ā¤•āĨā¤ˇā¤ž ā¤•āĨ‡ ā¤…ā¤¨āĨā¤°āĨ‚ā¤Ē ā¤•ā¤žā¤Ž ā¤¨ ā¤•ā¤°āĨ‡ ā¤”ā¤° ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ ā¤šāĨ‹", + "Install_Zapier_from_marketplace": "ā¤ĩāĨā¤¯ā¤ĩā¤§ā¤žā¤¨āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤Ŧā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤¸āĨ‡ ā¤œāĨˆā¤Ēā¤ŋā¤¯ā¤° ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "This_is_a_push_test_messsage": "ā¤¯ā¤š ā¤ā¤• ā¤ĒāĨā¤ļ ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šāĨˆ", + "This_message_was_rejected_by__peer__peer": "ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ {{peer}} ā¤¸ā¤šā¤•ā¤°āĨā¤ŽāĨ€ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤žāĨ¤", + "This_monitor_was_already_selected": "ā¤¯ā¤š ā¤ŽāĨ‰ā¤¨āĨ€ā¤Ÿā¤° ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤Ĩā¤ž", + "This_month": "ā¤‡ā¤¸ ā¤Žā¤šāĨ€ā¤¨āĨ‡", + "This_room_has_been_archived_by__username_": "ā¤¯ā¤š ā¤•ā¤Žā¤°ā¤ž {{username}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "This_room_has_been_unarchived_by__username_": "ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‹ {{username}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "This_room_has_been_archived": "ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤•āĨā¤ˇ", + "This_room_has_been_unarchived": "ā¤…ā¤¨ā¤žā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤•ā¤Žā¤°ā¤ž", + "This_server_will_be_available_while_your_session_is_active": "ā¤¯ā¤š ā¤¸ā¤°āĨā¤ĩā¤° ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤¤āĨā¤° ā¤•āĨ‡ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤°ā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤ĻāĨŒā¤°ā¤žā¤¨ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤°ā¤šāĨ‡ā¤—ā¤ž", + "This_week": "ā¤‡ā¤¸ ā¤¸ā¤ĒāĨā¤¤ā¤žā¤š", + "thread": "ā¤§ā¤žā¤—ā¤ž", + "Thread_message": "*{{username}} ā¤•āĨ‡* ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ēā¤° ā¤Ÿā¤ŋā¤ĒāĨā¤Ēā¤ŖāĨ€ ā¤•āĨ€ ā¤—ā¤ˆ: _ {{msg}} _", + "Threads": "ā¤§ā¤žā¤—āĨ‡", + "Threads_Description": "ā¤ĨāĨā¤°āĨ‡ā¤ĄāĨā¤¸ ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤‡ā¤°āĨā¤Ļ-ā¤—ā¤ŋā¤°āĨā¤Ļ ā¤¸ā¤‚ā¤—ā¤ ā¤ŋā¤¤ ā¤šā¤°āĨā¤šā¤ž ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Threads_unavailable_for_federation": "ā¤ĢāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĨāĨā¤°āĨ‡ā¤ĄāĨā¤¸ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "Thursday": "ā¤—āĨā¤°āĨā¤ĩā¤žā¤°", + "Time_in_minutes": "ā¤¸ā¤Žā¤¯ ā¤Žā¤ŋā¤¨ā¤ŸāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚", + "Time_in_seconds": "ā¤¸ā¤Žā¤¯ ā¤¸āĨ‡ā¤•ā¤‚ā¤Ą ā¤ŽāĨ‡ā¤‚", + "Timeout": "ā¤¸ā¤Žā¤¯ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤", + "Timeouts": "ā¤¸ā¤Žā¤¯ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ā¤ŋ", + "Timezone": "ā¤¸ā¤Žā¤¯ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Title": "ā¤ļāĨ€ā¤°āĨā¤ˇā¤•", + "Title_bar_color": "ā¤Ÿā¤žā¤‡ā¤Ÿā¤˛ ā¤Ŧā¤žā¤° ā¤•ā¤ž ā¤°ā¤‚ā¤—", + "Title_bar_color_offline": "ā¤Ÿā¤žā¤‡ā¤Ÿā¤˛ ā¤Ŧā¤žā¤° ā¤•ā¤ž ā¤°ā¤‚ā¤— ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨", + "Title_offline": "ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨", + "To": "ā¤•āĨ‹", + "To_additional_emails": "ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤", + "To_install_RocketChat_Livechat_in_your_website_copy_paste_this_code_above_the_last_body_tag_on_your_site": "ā¤…ā¤Ēā¤¨āĨ€ ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ ā¤ŽāĨ‡ā¤‚ Rocket.Chat ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤¸āĨā¤Ĩā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤‡ā¤¸ ā¤•āĨ‹ā¤Ą ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ€ ā¤¸ā¤žā¤‡ā¤Ÿ ā¤Ēā¤° ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž </body> ā¤ŸāĨˆā¤— ā¤•āĨ‡ ā¤Šā¤Ēā¤° ā¤•āĨ‰ā¤ĒāĨ€ ā¤”ā¤° ā¤ĒāĨ‡ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "To_prevent_seeing_this_message_again_allow_popups_from_workspace_URL": "ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤°āĨ‹ā¤•ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ēā¤•āĨ€ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ URL ā¤¸āĨ‡ ā¤ĒāĨ‰ā¤Ē-ā¤…ā¤Ē ā¤–āĨ‹ā¤˛ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆā¤‚:", + "to_see_more_details_on_how_to_integrate": "ā¤ā¤•āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤¤ā¤°āĨ€ā¤•āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤• ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤", + "To_users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤", + "Today": "ā¤†ā¤œ", + "Toggle_original_translated": "ā¤ŽāĨ‚ā¤˛/ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļā¤ŋā¤¤ ā¤ŸāĨ‰ā¤—ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "toggle-room-e2e-encryption": "ā¤•ā¤•āĨā¤ˇ E2E ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤ŸāĨ‰ā¤—ā¤˛ ā¤•ā¤°āĨ‡ā¤‚", + "toggle-room-e2e-encryption_description": "e2e ā¤ā¤¨āĨā¤•āĨā¤°ā¤ŋā¤ĒāĨā¤ļā¤¨ ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‹ ā¤ŸāĨ‰ā¤—ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Token": "ā¤ŸāĨ‹ā¤•ā¤¨", + "Token_Access": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸", + "Token_Controlled_Access": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¨ā¤ŋā¤¯ā¤‚ā¤¤āĨā¤°ā¤ŋā¤¤ ā¤Ēā¤šāĨā¤‚ā¤š", + "Token_has_been_removed": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Token_required": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "Tokens_Minimum_Needed_Balance": "ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤ŸāĨ‹ā¤•ā¤¨ ā¤ŦāĨˆā¤˛āĨ‡ā¤‚ā¤¸", + "Tokens_Minimum_Needed_Balance_Description": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤ŸāĨ‹ā¤•ā¤¨ ā¤Ēā¤° ā¤¨āĨā¤¯āĨ‚ā¤¨ā¤¤ā¤Ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤ļāĨ‡ā¤ˇ ā¤°ā¤žā¤ļā¤ŋ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤¸āĨ€ā¤Žā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤°ā¤ŋā¤•āĨā¤¤ ā¤¯ā¤ž \"0\"āĨ¤", + "Tokens_Minimum_Needed_Balance_Placeholder": "ā¤¸ā¤‚ā¤¤āĨā¤˛ā¤¨ ā¤ŽāĨ‚ā¤˛āĨā¤¯", + "Tokens_Required": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "Tokens_Required_Input_Description": "ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤¸āĨ‡ ā¤…ā¤˛ā¤— ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤ā¤• ā¤¯ā¤ž ā¤…ā¤§ā¤ŋā¤• ā¤ŸāĨ‹ā¤•ā¤¨ ā¤Ēā¤°ā¤ŋā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤¨ā¤žā¤Ž ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Tokens_Required_Input_Error": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤ŸāĨ‹ā¤•ā¤¨.", + "Tokens_Required_Input_Placeholder": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤¸ā¤‚ā¤Ēā¤¤āĨā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¨ā¤žā¤Ž", + "Topic": "ā¤ĩā¤ŋā¤ˇā¤¯", + "Top_5_agents_with_the_most_conversations": "ā¤¸ā¤°āĨā¤ĩā¤žā¤§ā¤ŋā¤• ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ĩā¤žā¤˛āĨ‡ ā¤ļāĨ€ā¤°āĨā¤ˇ 5 ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "Total": "ā¤•āĨā¤˛", + "Total_abandoned_chats": "ā¤•āĨā¤˛ ā¤›āĨ‹ā¤Ąā¤ŧāĨ€ ā¤—ā¤ˆ ā¤šāĨˆā¤Ÿ", + "Total_conversations": "ā¤•āĨā¤˛ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Total_Discussions": "ā¤šā¤°āĨā¤šā¤žā¤ā¤", + "Total_messages": "ā¤•āĨā¤˛ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Total_rooms": "ā¤•āĨā¤˛ ā¤•ā¤Žā¤°āĨ‡", + "Total_Threads": "ā¤§ā¤žā¤—āĨ‡", + "Total_visitors": "ā¤•āĨā¤˛ ā¤†ā¤—ā¤‚ā¤¤āĨā¤•", + "TOTP Invalid [totp-invalid]": "ā¤•āĨ‹ā¤Ą ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤…ā¤Žā¤žā¤¨āĨā¤¯", + "TOTP_reset_email": "ā¤ĻāĨ‹ ā¤•ā¤žā¤°ā¤• TOTP ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž", + "TOTP_Reset_Other_Key_Warning": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŸāĨ‚ ā¤ĢāĨˆā¤•āĨā¤Ÿā¤° TOTP ā¤•āĨ‹ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤¯āĨ‚ā¤œā¤° ā¤Ŧā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚ ā¤ŸāĨ‚ ā¤ĢāĨˆā¤•āĨā¤Ÿā¤° ā¤•āĨ‹ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤° ā¤¸ā¤•āĨ‡ā¤—ā¤žāĨ¤", + "totp-disabled": "ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤…ā¤Ēā¤¨āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ 2FA ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "totp-invalid": "ā¤•āĨ‹ā¤Ą ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤…ā¤Žā¤žā¤¨āĨā¤¯", + "totp-required": "ā¤ŸāĨ€ā¤“ā¤ŸāĨ€ā¤ĒāĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•", + "Transcript": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛ā¤ŋā¤Ēā¤ŋ", + "Transcript_Enabled": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤¸āĨ‡ ā¤ĒāĨ‚ā¤›āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤•āĨā¤¯ā¤ž ā¤ĩāĨ‡ ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤ā¤• ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤šā¤žā¤šāĨ‡ā¤‚ā¤—āĨ‡", + "Transcript_message": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨ‚ā¤›ā¤¨āĨ‡ ā¤Ēā¤° ā¤Ļā¤ŋā¤–ā¤žā¤¨āĨ‡ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Transcript_of_your_livechat_conversation": "ā¤†ā¤Ēā¤•āĨ€ ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤–āĨ¤", + "Transcript_Request": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤…ā¤¨āĨā¤°āĨ‹ā¤§", + "onboarding.form.registeredServerForm.continueStandalone": "ā¤¸āĨā¤ŸāĨˆā¤‚ā¤Ąā¤…ā¤˛āĨ‹ā¤¨ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤°āĨ€ ā¤°ā¤–āĨ‡ā¤‚", + "transfer-livechat-guest": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ŽāĨ‡ā¤šā¤Žā¤žā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "transfer-livechat-guest_description": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ŽāĨ‡ā¤šā¤Žā¤žā¤¨āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Transferred": "ā¤¤ā¤Ŧā¤žā¤Ļā¤˛ā¤ž", + "Translate": "ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "Translated": "ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "Translate_to": "ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤", + "Translations": "ā¤…ā¤¨āĨā¤ĩā¤žā¤Ļ", + "Travel_and_Places": "ā¤¯ā¤žā¤¤āĨā¤°ā¤ž ā¤ā¤ĩā¤‚ ā¤¸āĨā¤Ĩā¤žā¤¨", + "Trigger_removed": "ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Trigger_Words": "ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤ļā¤ŦāĨā¤Ļ", + "Trigger": "ā¤šā¤žā¤˛āĨ‚ ā¤•ā¤° ā¤ĻāĨ‡ā¤¨ā¤ž", + "Triggers": "ā¤šā¤˛ā¤žā¤¤ā¤ž ā¤šāĨˆ", + "Troubleshoot": "ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤¨ā¤ŋā¤ĩā¤žā¤°ā¤Ŗ", + "Troubleshoot_Description": "ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤° ā¤¸ā¤Žā¤¸āĨā¤¯ā¤ž ā¤¨ā¤ŋā¤ĩā¤žā¤°ā¤Ŗ ā¤•āĨˆā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Troubleshoot_Disable_Data_Exporter_Processor": "ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ā¤• ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ā¤° ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Troubleshoot_Disable_Data_Exporter_Processor_Alert": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤¸āĨ‡ ā¤¸ā¤­āĨ€ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§āĨ‹ā¤‚ ā¤•āĨ€ ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ā¤ŋā¤‚ā¤— ā¤°āĨ‹ā¤• ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆ, ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤‰ā¤¨āĨā¤šāĨ‡ā¤‚ ā¤…ā¤Ēā¤¨ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛ā¤ŋā¤‚ā¤• ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž!", + "Troubleshoot_Disable_Instance_Broadcast": "ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Troubleshoot_Disable_Instance_Broadcast_Alert": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— Rocket.Chat ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸ ā¤•āĨ‹ ā¤…ā¤¨āĨā¤¯ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸ ā¤Ēā¤° ā¤‡ā¤ĩāĨ‡ā¤‚ā¤Ÿ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤¸āĨ‡ ā¤°āĨ‹ā¤•ā¤¤āĨ€ ā¤šāĨˆ, ā¤‡ā¤¸ā¤¸āĨ‡ ā¤¸ā¤ŋā¤‚ā¤•ā¤ŋā¤‚ā¤— ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤ā¤‚ ā¤”ā¤° ā¤ĻāĨā¤°āĨā¤ĩāĨā¤¯ā¤ĩā¤šā¤žā¤° ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ!", + "Troubleshoot_Disable_Livechat_Activity_Monitor": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤—ā¤¤ā¤ŋā¤ĩā¤ŋā¤§ā¤ŋ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Troubleshoot_Disable_Livechat_Activity_Monitor_Alert": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤¸ā¤¤āĨā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤ĒāĨā¤°āĨ‹ā¤¸āĨ‡ā¤¸ā¤ŋā¤‚ā¤— ā¤•āĨ‹ ā¤°āĨ‹ā¤• ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤¸āĨ‡ ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‡ ā¤¸ā¤šāĨ€ ā¤ĸā¤‚ā¤— ā¤¸āĨ‡ ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¨ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤° ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚!", + "Troubleshoot_Disable_Notifications": "ā¤¨āĨ‹ā¤ŸāĨ€ā¤Ģā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Troubleshoot_Disable_Notifications_Alert": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ĒāĨā¤°ā¤Ŗā¤žā¤˛āĨ€ ā¤•āĨ‹ ā¤ĒāĨ‚ā¤°āĨ€ ā¤¤ā¤°ā¤š ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆ; ā¤§āĨā¤ĩā¤¨ā¤ŋā¤¯ā¤žā¤, ā¤ĄāĨ‡ā¤¸āĨā¤•ā¤ŸāĨ‰ā¤Ē ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚, ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤”ā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ŧā¤‚ā¤Ļ ā¤šāĨ‹ ā¤œā¤žā¤ā¤‚ā¤—āĨ‡!", + "Troubleshoot_Disable_Presence_Broadcast": "ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Troubleshoot_Disable_Presence_Broadcast_Alert": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤Ēā¤šā¤˛āĨ‡ ā¤˛āĨ‹ā¤Ą ā¤¸āĨ‡ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ€ ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤°ā¤–ā¤¤āĨ‡ ā¤šāĨā¤, ā¤‰ā¤¨ā¤•āĨ‡ ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤•āĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛ā¤žā¤ĩ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤¸ā¤­āĨ€ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤ŖāĨ‹ā¤‚ ā¤•āĨ‹ ā¤°āĨ‹ā¤•ā¤¤āĨ€ ā¤šāĨˆ!", + "Troubleshoot_Disable_Sessions_Monitor": "ā¤¸ā¤¤āĨā¤° ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤° ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Troubleshoot_Disable_Sessions_Monitor_Alert": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤¤āĨā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤•āĨ‹ ā¤°āĨ‹ā¤• ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤¸āĨ‡ ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‡ ā¤¸ā¤šāĨ€ ā¤ĸā¤‚ā¤— ā¤¸āĨ‡ ā¤•ā¤žā¤Ž ā¤•ā¤°ā¤¨ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤° ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚!", + "Troubleshoot_Disable_Teams_Mention": "ā¤…ā¤•āĨā¤ˇā¤Ž ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–", + "Troubleshoot_Disable_Teams_Mention_Alert": "ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ŸāĨ€ā¤Ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆ. ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤ŸāĨ€ā¤Ž ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡ ā¤”ā¤° ā¤‰ā¤¸ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡āĨ¤", + "Troubleshoot_Force_Caching_Version": "ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¨āĨ‡ā¤Ÿā¤ĩā¤°āĨā¤•ā¤ŋā¤‚ā¤— ā¤•āĨˆā¤ļ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ŧā¤žā¤§āĨā¤¯ ā¤•ā¤°āĨ‡ā¤‚", + "Troubleshoot_Force_Caching_Version_Alert": "ā¤¯ā¤Ļā¤ŋ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Žā¤žā¤¨ ā¤–ā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤”ā¤° ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ ā¤ĩā¤žā¤˛āĨ‡ ā¤¸āĨ‡ ā¤­ā¤ŋā¤¨āĨā¤¨ ā¤šāĨˆ ā¤¤āĨ‹ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤•āĨˆā¤ļ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚ā¤—āĨ‡āĨ¤ ā¤¯ā¤š ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤˛ā¤‚ā¤ŦāĨ‡ ā¤¸ā¤Žā¤¯ ā¤¤ā¤• ā¤¸āĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤•āĨ€ ā¤œā¤žā¤¨āĨ€ ā¤šā¤žā¤šā¤ŋā¤ ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤¯ā¤š ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤¨ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ€ ā¤šāĨˆ, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤‡ā¤¸āĨ‡ ā¤œā¤˛āĨā¤Ļ ā¤¸āĨ‡ ā¤œā¤˛āĨā¤Ļ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "True": "ā¤¸ā¤¤āĨā¤¯", + "Try_now": "ā¤…ā¤Ŧ ā¤•āĨ‹ā¤ļā¤ŋā¤ļ ā¤•ā¤°āĨ‹", + "Try_searching_in_the_marketplace_instead": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤–āĨ‹ā¤œā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "Tuesday": "ā¤Žā¤‚ā¤—ā¤˛ā¤ĩā¤žā¤°", + "Turn_OFF": "ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Turn_ON": "ā¤šā¤žā¤˛āĨ‚ ā¤•ā¤°āĨ‹", + "Turn_on_video": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤šā¤žā¤˛āĨ‚ ā¤•ā¤°āĨ‡ā¤‚", + "Turn_on_answer_chats": "ā¤‰ā¤¤āĨā¤¤ā¤° ā¤šāĨˆā¤Ÿ ā¤šā¤žā¤˛āĨ‚ ā¤•ā¤°āĨ‡ā¤‚", + "Turn_on_answer_calls": "ā¤•āĨ‰ā¤˛ ā¤•ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤ĻāĨ‡ā¤¨ā¤ž ā¤šā¤žā¤˛āĨ‚ ā¤•ā¤°āĨ‡ā¤‚", + "Turn_on_microphone": "ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤šā¤žā¤˛āĨ‚ ā¤•ā¤°āĨ‡ā¤‚", + "Turn_off_microphone": "ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Turn_off_answer_chats": "ā¤‰ā¤¤āĨā¤¤ā¤° ā¤šāĨˆā¤Ÿ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Turn_off_answer_calls": "ā¤‰ā¤¤āĨā¤¤ā¤° ā¤•āĨ‰ā¤˛ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Turn_off_video": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Two Factor Authentication": "ā¤ĻāĨ‹ ā¤¤ā¤°āĨ€ā¤•āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ", + "Two-factor_authentication": "ā¤ŸāĨ€ā¤“ā¤ŸāĨ€ā¤ĒāĨ€ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ", + "Two-factor_authentication_disabled": "ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Two-factor_authentication_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ", + "Two-factor_authentication_email_is_currently_disabled": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ", + "Two-factor_authentication_enabled": "ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Two-factor_authentication_is_currently_disabled": "ā¤ŸāĨ€ā¤“ā¤ŸāĨ€ā¤ĒāĨ€ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĻāĨ‹-ā¤•ā¤žā¤°ā¤• ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ", + "Two-factor_authentication_native_mobile_app_warning": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€: ā¤ā¤• ā¤Ŧā¤žā¤° ā¤œā¤Ŧ ā¤†ā¤Ē ā¤‡ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤˛āĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤ŽāĨ‚ā¤˛ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ā¤ĒāĨā¤¸ (ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ+) ā¤Ēā¤° ā¤¤ā¤Ŧ ā¤¤ā¤• ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡ ā¤œā¤Ŧ ā¤¤ā¤• ā¤ĩāĨ‡ 2FA ā¤˛ā¤žā¤—āĨ‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤ĻāĨ‡ā¤¤āĨ‡āĨ¤", + "Type": "ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "typing": "ā¤Ÿā¤žā¤‡ā¤Ēā¤ŋā¤‚ā¤—", + "Types": "ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "Types_and_Distribution": "ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤”ā¤° ā¤ĩā¤ŋā¤¤ā¤°ā¤Ŗ", "Type_your_email": "ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤°āĨ‡ā¤‚", + "Type_your_job_title": "ā¤…ā¤Ēā¤¨āĨ€ ā¤¨āĨŒā¤•ā¤°āĨ€ ā¤•ā¤ž ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤°āĨ‡ā¤‚", "Type_your_message": "ā¤…ā¤Ēā¤¨ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤°āĨ‡ā¤‚", "Type_your_name": "ā¤…ā¤Ēā¤¨ā¤ž ā¤¨ā¤žā¤Ž ā¤˛ā¤ŋā¤–āĨ‡ā¤‚", + "Type_your_password": "ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤°āĨ‡ā¤‚", + "Type_your_username": "ā¤…ā¤Ēā¤¨ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤°āĨ‡ā¤‚", + "UI_Allow_room_names_with_special_chars": "ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤¨ā¤žā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇ ā¤ĩā¤°āĨā¤ŖāĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤‚", + "UI_Click_Direct_Message": "ā¤¸āĨ€ā¤§ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚", + "UI_Click_Direct_Message_Description": "ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ŸāĨˆā¤Ŧ ā¤–āĨ‹ā¤˛ā¤¨ā¤ž ā¤›āĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚, ā¤‡ā¤¸ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ ā¤¸āĨ€ā¤§āĨ‡ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤Ēā¤° ā¤œā¤žā¤ā¤", + "UI_DisplayRoles": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "UI_Group_Channels_By_Type": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤¸ā¤ŽāĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "UI_Merge_Channels_Groups": "ā¤¨ā¤ŋā¤œāĨ€ ā¤¸ā¤ŽāĨ‚ā¤šāĨ‹ā¤‚ ā¤•āĨ‹ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Žā¤ŋā¤˛ā¤žā¤ā¤‚", + "UI_Show_top_navbar_embedded_layout": "ā¤ā¤ŽāĨā¤ŦāĨ‡ā¤ĄāĨ‡ā¤Ą ā¤˛āĨ‡ā¤†ā¤‰ā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ļāĨ€ā¤°āĨā¤ˇ ā¤¨āĨ‡ā¤ĩā¤Ŧā¤žā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ā¤‚", + "UI_Unread_Counter_Style": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•ā¤žā¤‰ā¤‚ā¤Ÿā¤° ā¤ļāĨˆā¤˛āĨ€", + "UI_Use_Name_Avatar": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨ‚ā¤°āĨ‡ ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤…ā¤•āĨā¤ˇā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "UI_Use_Real_Name": "ā¤ĩā¤žā¤¸āĨā¤¤ā¤ĩā¤ŋā¤• ā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "unable-to-get-file": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", + "Unable_to_load_active_connections": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¸ā¤Žā¤°āĨā¤Ĩ", + "Unarchive": "ā¤¸ā¤‚ā¤—āĨā¤°ā¤š ā¤¸āĨ‡ ā¤¨ā¤ŋā¤•ā¤žā¤˛āĨ‡ā¤‚", + "unarchive-room": "ā¤•ā¤•āĨā¤ˇ ā¤•āĨ‹ ā¤…ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "unarchive-room_description": "ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Unassigned": "ā¤¸āĨŒā¤‚ā¤ĒāĨ‡ ā¤¨ā¤šāĨ€ā¤‚ ā¤—ā¤", + "unauthorized": "ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚", + "Unavailable": "ā¤…ā¤¨āĨā¤Ēā¤˛ā¤ŦāĨā¤§", + "Unblock": "ā¤…ā¤¨ā¤ŦāĨā¤˛āĨ‰ā¤•", + "Unblock_User": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤…ā¤¨ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Uncheck_All": "ā¤¸ā¤Ŧ ā¤•āĨ‹ ā¤…ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Uncollapse": "ā¤–āĨ‹ā¤˛ā¤¨ā¤ž", + "Undefined": "ā¤…ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤", + "Unfavorite": "ā¤¨ā¤žā¤Ēā¤¸ā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Unfollow_message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤…ā¤¨ā¤Ģā¤ŧāĨ‰ā¤˛āĨ‹ ā¤•ā¤°āĨ‡ā¤‚", + "Unignore": "ā¤…ā¤¨ā¤ĻāĨ‡ā¤–ā¤ž ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Uninstall": "ā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨ā¤ž ā¤°ā¤ĻāĨā¤Ļ ā¤•ā¤°āĨ‡ā¤‚", + "Units": "ā¤‡ā¤•ā¤žā¤‡ā¤¯āĨ‹ā¤‚", + "Unit_removed": "ā¤‡ā¤•ā¤žā¤ˆ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ", + "Unique_ID_change_detected_description": "ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ€ ā¤Ēā¤šā¤šā¤žā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤Ŧā¤Ļā¤˛ ā¤—ā¤ˆ ā¤šāĨˆ. ā¤ā¤¸ā¤ž ā¤¤ā¤Ŧ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤Ŧ ā¤¸ā¤žā¤‡ā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¯ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤¸āĨā¤ŸāĨā¤°ā¤ŋā¤‚ā¤— ā¤Ŧā¤Ļā¤˛ ā¤ĻāĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ ā¤¯ā¤ž ā¤œā¤Ŧ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤ĄāĨ‡ā¤Ÿā¤žā¤ŦāĨ‡ā¤¸ ā¤•āĨ€ ā¤ā¤• ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤¸āĨ‡ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ŧā¤¨ā¤žā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤

    ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤†ā¤—āĨ‡ ā¤Ŧā¤ĸā¤ŧā¤¨ā¤ž ā¤šā¤žā¤šāĨ‡ā¤‚ā¤—āĨ‡ ā¤¯ā¤ž ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤”ā¤° ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤†ā¤ˆā¤ĄāĨ€ ā¤Ŧā¤¨ā¤žā¤¨ā¤ž ā¤šā¤žā¤šāĨ‡ā¤‚ā¤—āĨ‡?", + "Unique_ID_change_detected_learn_more_link": "ā¤”ā¤° ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨āĨ‡ā¤‚", + "Unique_ID_change_detected": "ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤†ā¤ˆā¤ĄāĨ€ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤¨ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤šā¤˛ā¤ž", + "Unknown_Import_State": "ā¤…ā¤œāĨā¤žā¤žā¤¤ ā¤†ā¤¯ā¤žā¤¤ ā¤°ā¤žā¤œāĨā¤¯", + "Unknown_User": "ā¤…ā¤œāĨā¤žā¤žā¤¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Unlimited": "ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤", + "Unmute": "ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ", + "Unmute_someone_in_room": "ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¸āĨ€ ā¤•āĨ‹ ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Unmute_user": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Unnamed": "ā¤…ā¤œāĨā¤žā¤žā¤¤", + "Unpin": "ā¤…ā¤¨ā¤Ēā¤ŋā¤¨", + "Unpin_Message": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤…ā¤¨ā¤Ēā¤ŋā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "unpinning-not-allowed": "ā¤…ā¤¨ā¤Ēā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Unprioritized": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤°ā¤šā¤ŋā¤¤", + "Unread": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤—", + "Unread_Count": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ count", + "Unread_Count_DM": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤—ā¤Ŗā¤¨ā¤ž", + "Unread_Count_Omni": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤—ā¤Ŗā¤¨ā¤ž", + "Unread_Messages": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Unread_on_top": "ā¤ļāĨ€ā¤°āĨā¤ˇ ā¤Ēā¤° ā¤…ā¤Ēā¤ ā¤ŋā¤¤", + "Unread_Rooms": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•ā¤Žā¤°āĨ‡", + "Unread_Rooms_Mode": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‹ā¤Ą", + "Unread_Requested_First": "ā¤Ēā¤šā¤˛āĨ‡ ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Unread_Requested_Last": "ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤Ŧā¤žā¤° ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Unread_Tray_Icon_Alert": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤ŸāĨā¤°āĨ‡ ā¤šā¤ŋā¤šāĨā¤¨ ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", + "Unstar_Message": "ā¤¤ā¤žā¤°ā¤ž ā¤šā¤Ÿā¤žā¤ā¤", + "Unmute_microphone": "ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Update": "ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨", + "Update_EnableChecker": "ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤šāĨ‡ā¤•ā¤° ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Update_EnableChecker_Description": "Rocket.Chat ā¤ĄāĨ‡ā¤ĩā¤˛ā¤Ēā¤°āĨā¤¸ ā¤¸āĨ‡ ā¤¨ā¤ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ/ā¤Žā¤šā¤¤āĨā¤ĩā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤œā¤žā¤ā¤š ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤¨ā¤ ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤ŽāĨ‡ā¤‚ ā¤ā¤• ā¤Ŧā¤žā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤ŦāĨˆā¤¨ā¤° ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤”ā¤° ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤•āĨˆā¤Ÿ ā¤ŦāĨ‰ā¤Ÿ ā¤¸āĨ‡ ā¤ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆ, ā¤ĻāĨ‹ā¤¨āĨ‹ā¤‚ ā¤šāĨ€ ā¤•āĨ‡ā¤ĩā¤˛ ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤•āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĻāĨƒā¤ļāĨā¤¯ā¤Žā¤žā¤¨ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Update_every": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤•āĨ‹ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "Update_LatestAvailableVersion": "ā¤¨ā¤ĩāĨ€ā¤¨ā¤¤ā¤Ž ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Update_to_version": "{{version}} ā¤Ēā¤° ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Update_your_RocketChat": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Updated_at": "ā¤Ēā¤° ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Upgrade_tab_upgrade_your_plan": "ā¤…ā¤Ēā¤¨āĨ€ ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤•āĨ‹ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Upload": "ā¤Ąā¤žā¤˛ā¤¨ā¤ž", + "Uploads": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą", + "Upload_private_app": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤Ē ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Upload_file_description": "ā¤Ģā¤žā¤‡ā¤˛ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "Upload_file_name": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", "Upload_file_question": "ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚?", + "Upload_Folder_Path": "ā¤Ģā¤ŧāĨ‹ā¤˛āĨā¤Ąā¤° ā¤Ēā¤Ĩ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Upload_From": "{{name}} ā¤¸āĨ‡ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Upload_user_avatar": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "Uploading_file": "ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤šāĨ‹ ā¤°ā¤šāĨ€ ā¤šāĨˆ...", + "Uptime": "ā¤…ā¤Ēā¤Ÿā¤žā¤‡ā¤Ž", + "URL": "ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "URLs": "ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Usage": "ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤—", + "Use": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—", + "Use_account_preference": "ā¤–ā¤žā¤¤ā¤ž ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_Emojis": "ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_Global_Settings": "ā¤ĩāĨˆā¤ļāĨā¤ĩā¤ŋā¤• ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_initials_avatar": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤†ā¤°ā¤‚ā¤­ā¤ŋā¤• ā¤…ā¤•āĨā¤ˇā¤°āĨ‹ā¤‚ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_minor_colors": "ā¤›āĨ‹ā¤ŸāĨ‡ ā¤°ā¤‚ā¤— ā¤ĒāĨˆā¤˛āĨ‡ā¤Ÿ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚ (ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤ŽāĨā¤– ā¤°ā¤‚ā¤— ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ā¤¤āĨ‡ ā¤šāĨˆā¤‚)", + "Use_Room_configuration": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨ‹ ā¤…ā¤§ā¤ŋā¤˛āĨ‡ā¤–ā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤°āĨ‚ā¤Ž ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "Use_Server_configuration": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_service_avatar": "%s ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_this_response": "ā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_response": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_this_username": "ā¤‡ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_uploaded_avatar": "ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_url_for_avatar": "ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Use_User_Preferences_or_Global_Settings": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤žā¤ā¤ ā¤¯ā¤ž ā¤ĩāĨˆā¤ļāĨā¤ĩā¤ŋā¤• ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "User": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "User_menu": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤¸āĨ‚ā¤šāĨ€", + "User Search": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–āĨ‹ā¤œ", + "User Search (Group Validation)": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–āĨ‹ā¤œ (ā¤¸ā¤ŽāĨ‚ā¤š ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨)", + "User__username__is_now_a_leader_of__room_name_": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{username}} ā¤…ā¤Ŧ {{room_name}} ā¤•ā¤ž ā¤˛āĨ€ā¤Ąā¤° ā¤šāĨˆ", + "User__username__is_now_a_moderator_of__room_name_": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{username}} ā¤…ā¤Ŧ {{room_name}} ā¤•ā¤ž ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤Ÿā¤° ā¤šāĨˆ", + "User__username__is_now_an_owner_of__room_name_": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{username}} ā¤…ā¤Ŧ {{room_name}} ā¤•ā¤ž ā¤¸āĨā¤ĩā¤žā¤ŽāĨ€ ā¤šāĨˆ", + "User__username__muted_in_room__roomName__": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{username}} ā¤•āĨ‹ ā¤•ā¤•āĨā¤ˇ {{roomName}} ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User__username__removed_from__room_name__leaders": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{username}} ā¤•āĨ‹ {{room_name}} ā¤˛āĨ€ā¤Ąā¤°āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "User__username__removed_from__room_name__moderators": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{username}} ā¤•āĨ‹ {{room_name}} ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤Ÿā¤° ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "User__username__removed_from__room_name__owners": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{username}} ā¤•āĨ‹ {{room_name}} ā¤¸āĨā¤ĩā¤žā¤Žā¤ŋā¤¯āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "User__username__unmuted_in_room__roomName__": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{username}} ā¤•āĨ‹ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ {{roomName}}", + "User_added": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "User_added_by": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{user_added}} ā¤•āĨ‹ {{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤žāĨ¤", + "User_added_to": "ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž {{user_added}}", + "User_added_successfully": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤œāĨ‹ā¤Ąā¤ŧā¤ž ā¤—ā¤¯ā¤ž", + "User_and_group_mentions_only": "ā¤•āĨ‡ā¤ĩā¤˛ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤”ā¤° ā¤¸ā¤ŽāĨ‚ā¤š ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤šāĨˆ", + "User_cant_be_empty": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–ā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž", + "User_created_successfully!": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤Ŧā¤¨ā¤ž!", + "User_default": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ", + "User_doesnt_exist": "`@%s` ā¤¨ā¤žā¤Ž ā¤¸āĨ‡ ā¤•āĨ‹ā¤ˆ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "User_e2e_key_was_reset": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž E2E ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤ĨāĨ€āĨ¤", + "User_has_been_activated": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_has_been_deactivated": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_has_been_deleted": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_has_been_ignored": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤¨ā¤œā¤°ā¤…ā¤‚ā¤Ļā¤žā¤œ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_has_been_muted_in_s": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ %s ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_has_been_removed_from_s": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ %s ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_has_been_removed_from_team": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ŸāĨ€ā¤Ž ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_has_been_unignored": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤…ā¤Ŧ ā¤…ā¤¨ā¤ĻāĨ‡ā¤–ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "User_Info": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "User_Interface": "ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤•āĨā¤¤ā¤ž ā¤‡ā¤‚ā¤Ÿā¤°ā¤Ģā¤ŧāĨ‡ā¤¸", + "User_is_blocked": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤šāĨˆ", + "User_is_no_longer_an_admin": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤Ŧ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "User_is_now_an_admin": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤…ā¤Ŧ ā¤ā¤• ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤šāĨˆ", + "User_is_unblocked": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤…ā¤¨ā¤ŦāĨā¤˛āĨ‰ā¤• ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_joined_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧ ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "User_joined_conversation": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤—ā¤ ā¤šāĨˆā¤‚", + "User_joined_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨā¤", + "User_joined_the_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨ‡ ā¤œāĨā¤Ąā¤ŧāĨ‡", + "User_joined_the_conversation": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨā¤", + "User_joined_the_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨā¤", + "user_joined_otr": "ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤šāĨˆā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "user_key_refreshed_successfully": "ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤šāĨ‹ ā¤—ā¤ˆ", + "user_requested_otr_key_refresh": "ā¤•āĨā¤‚ā¤œāĨ€ ā¤¤ā¤žā¤œā¤ŧā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ.", "User_left": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤›āĨ‹ā¤Ąā¤ŧ ā¤Ļā¤ŋā¤¯ā¤ž", + "User_left_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤Ļā¤ŋā¤¯ā¤ž", + "User_left_this_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤Ļā¤ŋā¤¯ā¤ž", + "User_left_this_team": "ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤Ļā¤ŋā¤¯ā¤ž", + "User_logged_out": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤˛āĨ‰ā¤— ā¤†ā¤‰ā¤Ÿ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "User_management": "ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤•āĨā¤¤ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨", + "User_mentions_only": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ā¤ĩā¤˛ ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ", + "User_muted": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "User_muted_by": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{user_muted}} ā¤•āĨ‹ {{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "User_has_been_muted": "ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž {{user_muted}}", + "User_not_found": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "User_not_found_or_incorrect_password": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤—ā¤ŧā¤˛ā¤¤ ā¤šāĨˆ", + "User_or_channel_name": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¯ā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "User_Presence": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ€ ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "User_removed": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "User_removed_by": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{user_removed}} ā¤•āĨ‹ {{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤žāĨ¤", + "User_has_been_removed": "ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž {{user_removed}}", + "User_sent_a_message_on_channel": "{{username}} ā¤¨āĨ‡ {{channel}} ā¤Ēā¤° ā¤ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤ž", + "User_sent_a_message_to_you": "{{username}} ā¤¨āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤ž ā¤šāĨˆ", + "user_sent_an_attachment": "{{user}} ā¤¨āĨ‡ ā¤ā¤• ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤­āĨ‡ā¤œā¤ž", + "User_Settings": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—", + "User_started_a_new_conversation": "{{username}} ā¤¨āĨ‡ ā¤ā¤• ā¤¨ā¤ˆ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ļāĨā¤°āĨ‚ ā¤•āĨ€", + "User_unmuted_by": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž {{user_unmuted}} ā¤•āĨ‹ {{user_by}} ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤žāĨ¤", + "User_has_been_unmuted": "ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž {{user_unmuted}}", + "User_unmuted_in_room": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "User_updated_successfully": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "User_uploaded_a_file_on_channel": "{{username}} ā¤¨āĨ‡ {{channel}} ā¤Ēā¤° ā¤ā¤• ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€", + "User_uploaded_a_file_to_you": "{{username}} ā¤¨āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤­āĨ‡ā¤œāĨ€ ā¤šāĨˆ", + "User_uploaded_file": "ā¤ā¤• ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ", + "User_uploaded_image": "ā¤ā¤• ā¤›ā¤ĩā¤ŋ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•āĨ€ ā¤—ā¤ˆ", + "user-generate-access-token": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "user-generate-access-token_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "UserData_EnableDownload": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "UserData_FileSystemPath": "ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤Ēā¤Ĩ (ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛āĨ‡ā¤‚)", + "view-livechat-facebook": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤• ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "UserData_FileSystemZipPath": "ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤Ēā¤Ĩ (ā¤¸ā¤‚ā¤ĒāĨ€ā¤Ąā¤ŧā¤ŋā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛)", + "view-livechat-facebook_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤• ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "UserData_MessageLimitPerRequest": "ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤¸āĨ€ā¤Žā¤ž", + "UserData_ProcessingFrequency": "ā¤ĒāĨā¤°ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤†ā¤ĩāĨƒā¤¤āĨā¤¤ā¤ŋ (ā¤Žā¤ŋā¤¨ā¤Ÿ)", + "UserDataDownload": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą", + "UserDataDownload_Description": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤¯ā¤ž ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤°āĨ‡ā¤ļā¤¨āĨ¤", + "UserDataDownload_CompletedRequestExisted_Text": "ā¤†ā¤Ēā¤•āĨ€ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤šāĨ‹ ā¤šāĨā¤•āĨ€ ā¤ĨāĨ€. ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤–ā¤žā¤¤ā¤ž ā¤œā¤žā¤‚ā¤šāĨ‡ā¤‚āĨ¤", + "UserDataDownload_CompletedRequestExistedWithLink_Text": "ā¤†ā¤Ēā¤•āĨ€ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤œā¤¨ā¤°āĨ‡ā¤Ÿ ā¤šāĨ‹ ā¤šāĨā¤•āĨ€ ā¤ĨāĨ€. ā¤‡ā¤¸āĨ‡ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "UserDataDownload_EmailBody": "ā¤†ā¤Ēā¤•āĨ€ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤…ā¤Ŧ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤šāĨˆāĨ¤ ā¤‡ā¤¸āĨ‡ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "UserDataDownload_EmailSubject": "ā¤†ā¤Ēā¤•āĨ€ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤šāĨˆ", + "UserDataDownload_Requested": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ā¤ŋā¤¤ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "UserDataDownload_Requested_Text": "ā¤†ā¤Ēā¤•āĨ€ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤šāĨ‹ ā¤œā¤žā¤ā¤—āĨ€. ā¤¤āĨˆā¤¯ā¤žā¤° ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤‡ā¤¸āĨ‡ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ā¤• ā¤˛ā¤ŋā¤‚ā¤• ā¤†ā¤Ēā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤āĨ‡ ā¤Ēā¤° ā¤­āĨ‡ā¤œā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤žā¤Žā¤¨āĨ‡ ā¤šā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤¤ā¤žā¤°ā¤Ŧā¤ĻāĨā¤§ {{pending_operations}} ā¤šāĨˆā¤‚āĨ¤", + "UserDataDownload_RequestExisted_Text": "ā¤†ā¤Ēā¤•āĨ€ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤œāĨ‡ā¤¨ā¤°āĨ‡ā¤Ÿ ā¤•āĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨˆ. ā¤¤āĨˆā¤¯ā¤žā¤° ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤‡ā¤¸āĨ‡ ā¤Ąā¤žā¤‰ā¤¨ā¤˛āĨ‹ā¤Ą ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ā¤• ā¤˛ā¤ŋā¤‚ā¤• ā¤†ā¤Ēā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤āĨ‡ ā¤Ēā¤° ā¤­āĨ‡ā¤œā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤žā¤Žā¤¨āĨ‡ ā¤šā¤˛ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤¤ā¤žā¤°ā¤Ŧā¤ĻāĨā¤§ {{pending_operations}} ā¤šāĨˆā¤‚āĨ¤", + "Username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "Username_already_exist": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤•āĨ‹ā¤ˆ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤.", + "Username_and_message_must_not_be_empty": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤–ā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤.", + "Username_cant_be_empty": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤–ā¤žā¤˛āĨ€ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž", + "Username_Change_Disabled": "ā¤†ā¤Ēā¤•āĨ‡ Rocket.Chat ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤¨āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ", + "Username_denied_the_OTR_session": "{{username}} ā¤¨āĨ‡ ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤¸ā¤¤āĨā¤° ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž", + "Username_description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤ĻāĨ‚ā¤¸ā¤°āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤†ā¤Ēā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤– ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Username_doesnt_exist": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž `%s` ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ.", + "Username_ended_the_OTR_session": "{{username}} ā¤¨āĨ‡ ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤¸ā¤¤āĨā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž", + "Username_invalid": "%s ā¤ĩāĨˆā¤§ ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ,
    ā¤•āĨ‡ā¤ĩā¤˛ ā¤…ā¤•āĨā¤ˇā¤°āĨ‹ā¤‚, ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žā¤“ā¤‚, ā¤Ŧā¤ŋā¤‚ā¤ĻāĨā¤“ā¤‚, ā¤šā¤žā¤‡ā¤Ģā¤ŧā¤¨ ā¤”ā¤° ā¤…ā¤‚ā¤Ąā¤°ā¤¸āĨā¤•āĨ‹ā¤° ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Username_is_already_in_here": "`@%s` ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤¯ā¤šā¤žā¤‚ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆāĨ¤", + "Username_Placeholder": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "Username_title": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Username_has_been_updated": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Username_wants_to_start_otr_Do_you_want_to_accept": "{{username}} ā¤“ā¤ŸāĨ€ā¤†ā¤° ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤¸āĨā¤ĩāĨ€ā¤•ā¤žā¤° ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Username_name_email": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž, ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤ˆ-ā¤ŽāĨ‡ā¤˛", + "Users": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚", + "Users must use Two Factor Authentication": "ā¤¯āĨ‚ā¤œā¤°āĨā¤¸ ā¤•āĨ‹ ā¤ŸāĨ‚ ā¤ĢāĨˆā¤•āĨā¤Ÿā¤° ā¤‘ā¤ĨāĨ‡ā¤‚ā¤Ÿā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤•ā¤ž ā¤‡ā¤¸āĨā¤¤āĨ‡ā¤Žā¤žā¤˛ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "Users_added": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤œāĨ‹ā¤Ąā¤ŧ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Users_and_rooms": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤”ā¤° ā¤•ā¤Žā¤°āĨ‡", + "Users_by_time_of_day": "ā¤Ļā¤ŋā¤¨ ā¤•āĨ‡ ā¤¸ā¤Žā¤¯ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Users_in_role": "ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Users_key_has_been_reset": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ€ ā¤•āĨā¤‚ā¤œāĨ€ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ", + "Users_reacted": "ā¤œā¤ŋā¤¨ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤¨āĨ‡ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĻāĨ€", + "Users_TOTP_has_been_reset": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž TOTP ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Uses": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—", + "Uses_left": "ā¤Ŧā¤žā¤ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—", + "UTC_Timezone": "ā¤¯āĨ‚ā¤ŸāĨ€ā¤¸āĨ€ ā¤¸ā¤Žā¤¯ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤°", + "Utilities": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤ŋā¤¤ā¤žā¤“ā¤‚", + "UTF8_Names_Slugify": "UTF8 ā¤¨ā¤žā¤Ž Slugify", + "UTF8_User_Names_Validation": "UTF8 ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨", + "UTF8_User_Names_Validation_Description": "ā¤°āĨ‡ā¤—ā¤ā¤•āĨā¤¸ā¤ĒāĨ€ ā¤œā¤ŋā¤¸ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "UTF8_Channel_Names_Validation": "UTF8 ā¤šāĨˆā¤¨ā¤˛ ā¤¨ā¤žā¤Ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨", + "UTF8_Channel_Names_Validation_Description": "ā¤°āĨ‡ā¤—ā¤ā¤•āĨā¤¸ā¤ĒāĨ€ ā¤œā¤ŋā¤¸ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤šāĨˆā¤¨ā¤˛ ā¤¨ā¤žā¤ŽāĨ‹ā¤‚ ā¤•āĨ‹ ā¤Žā¤žā¤¨āĨā¤¯ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "Videocall_enabled": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "Validate_email_address": "ā¤ˆ - ā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "Validation": "ā¤Žā¤žā¤¨āĨā¤¯ā¤•ā¤°ā¤Ŗ", + "Value_messages": "{{price}} ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Value_users": "{{price}} ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Verification": "ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨", + "Verification_Description": "ā¤†ā¤Ē ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤ĒāĨā¤˛āĨ‡ā¤¸ā¤šāĨ‹ā¤˛āĨā¤Ąā¤°āĨā¤¸ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚:\n - ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨ URL ā¤•āĨ‡ ā¤˛ā¤ŋā¤ `[Verification_Url]`āĨ¤\n - `[ā¤¨ā¤žā¤Ž]`, `[fname]`, `[lname]` ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤¨ā¤žā¤Ž, ā¤ĒāĨā¤°ā¤Ĩā¤Ž ā¤¨ā¤žā¤Ž ā¤¯ā¤ž ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤¨ā¤žā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n - `[ā¤ˆā¤ŽāĨ‡ā¤˛]` ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤\n - ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤¨ā¤žā¤Ž ā¤”ā¤° ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨā¤°ā¤Žā¤ļā¤ƒ `[Site_Name]` ā¤”ā¤° `[Site_URL]`āĨ¤", + "Verification_Email": "ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Verification_email_body": "ā¤•āĨƒā¤Ēā¤¯ā¤ž, ā¤…ā¤Ēā¤¨āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤āĨ‡ ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤Ŧā¤Ÿā¤¨ ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Verification_email_sent": "ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨ ā¤ĩā¤ŋā¤ĻāĨā¤¯āĨā¤¤ā¤Ąā¤žā¤• ā¤­āĨ‡ā¤œ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "Verification_Email_Subject": "[ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¨ā¤žā¤Ž] - ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨", + "Verified": "ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤", + "Verify": "ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Verify_your_email": "ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Version": "ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "Version_version": "ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ {{version}}", + "App_Request_Admin_Message": "ā¤¨ā¤Žā¤¸āĨā¤¤āĨ‡ {{admin_name}}, {{user_name}} ā¤¨āĨ‡ ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤° {{app_name}} ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸ā¤Ŧā¤Žā¤ŋā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆāĨ¤\n \n ā¤¯ā¤š ā¤ĩā¤š ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤šāĨˆ ā¤œā¤ŋā¤¸ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤¨āĨā¤šāĨ‹ā¤‚ā¤¨āĨ‡ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤•ā¤ŋā¤¯ā¤ž:\n>{{message}}\n \n ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤¨āĨ‡ ā¤”ā¤° {{app_name}} ā¤ā¤Ē ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤, [ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚]({{learn_more}})āĨ¤", + "App_version_incompatible_tooltip": "ā¤ā¤Ē Rocket.Chat ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤…ā¤¸ā¤‚ā¤—ā¤¤ ā¤šāĨˆ", + "App_request_enduser_message": "ā¤†ā¤Ēā¤•āĨ‡ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ā¤ŋā¤¤ ā¤ā¤Ē, {{appName}}, ā¤…ā¤­āĨ€ ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤° ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤\n [ā¤¯ā¤šā¤žā¤‚ ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚]({{learnmore}}) ā¤ā¤Ē ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤¨ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤āĨ¤", + "App_requests_by_workspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤ā¤Ē ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¯ā¤šā¤žā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "Video_Conference_Description": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨ‰ā¤¨āĨā¤ĢāĨā¤°āĨ‡ā¤‚ā¤¸ā¤ŋā¤‚ā¤— ā¤•āĨ‰ā¤˛ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧā¤ŋā¤—ā¤° ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Video_Chat_Window": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤šāĨˆā¤Ÿ", + "Video_Conference": "ā¤•ā¤žā¤‚ā¤ĢāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛", + "Video_Call_unavailable_for_this_type_of_room": "ā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤•āĨ‡ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Video_Conferences": "ā¤¸ā¤ŽāĨā¤ŽāĨ‡ā¤˛ā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤ŦāĨā¤˛ā¤žā¤ĩā¤ž", + "Video_Conference_Info": "ā¤ŦāĨˆā¤ ā¤• ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Video_Conference_Url": "ā¤ŽāĨ€ā¤Ÿā¤ŋā¤‚ā¤— ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "video-conf-provider-not-configured": "**ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ**: ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤•āĨ‹ ā¤Ēā¤šā¤˛āĨ‡ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Video_message": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Videocall_declined": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤.", + "Video_and_Audio_Call": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤”ā¤° ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛", + "video_conference_started": "_ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤ŋā¤¯ā¤ž._", + "video_conference_started_by": "**{{username}}** _ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤šāĨā¤ˆāĨ¤_", + "video_conference_ended": "_ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆ._", + "video_conference_ended_by": "**{{username}}** _ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨā¤ˆāĨ¤_", + "video_livechat_started": "_ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤•āĨ€._", + "video_livechat_missed": "_ā¤ā¤• ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤•āĨ€ ā¤œā¤ŋā¤¸ā¤•ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤žāĨ¤_", + "video_direct_calling": "_ā¤•āĨ‰ā¤˛ ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨˆāĨ¤_", + "video_direct_ended": "_ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž ā¤šāĨˆ._", + "video_direct_ended_by": "**{{username}}** _ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨā¤ˆāĨ¤_", + "video_direct_missed": "_ā¤ā¤• ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤šāĨā¤ˆ ā¤œā¤ŋā¤¸ā¤•ā¤ž ā¤‰ā¤¤āĨā¤¤ā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤žāĨ¤_", + "video_direct_started": "_ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤žā¤°ā¤‚ā¤­ ā¤•ā¤ŋā¤¯ā¤ž._", + "VideoConf_Default_Provider": "ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž", + "VideoConf_Default_Provider_Description": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤ā¤•ā¤žā¤§ā¤ŋā¤• ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤ž ā¤ā¤ĒāĨā¤¸ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤šāĨˆā¤‚, ā¤¤āĨ‹ ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¨ā¤ ā¤•āĨ‰ā¤¨āĨā¤Ģā¤ŧāĨā¤°āĨ‡ā¤‚ā¤¸ ā¤•āĨ‰ā¤˛ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¸ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤", + "VideoConf_Enable_Channels": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "VideoConf_Enable_Groups": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "VideoConf_Enable_DMs": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "VideoConf_Enable_Teams": "ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "VideoConf_Mobile_Ringing": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤°ā¤ŋā¤‚ā¤—ā¤ŋā¤‚ā¤— ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "VideoConf_Mobile_Ringing_Description": "ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤°, ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨ€ā¤§āĨ‡ ā¤•āĨ‰ā¤˛ ā¤‰ā¤¨ā¤•āĨ‡ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ēā¤° ā¤Ģā¤ŧāĨ‹ā¤¨ ā¤•āĨ‰ā¤˛ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤¨ā¤žā¤ˆ ā¤ĻāĨ‡ā¤—āĨ€āĨ¤", + "VideoConf_Mobile_Ringing_Alert": "ā¤¯ā¤š ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤…ā¤­āĨ€ ā¤ĒāĨā¤°ā¤žā¤¯āĨ‹ā¤—ā¤ŋā¤• ā¤šā¤°ā¤Ŗ ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ ā¤”ā¤° ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤¯ā¤š ā¤…ā¤­āĨ€ ā¤¤ā¤• ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ā¤Ē ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ĒāĨ‚ā¤°āĨ€ ā¤¤ā¤°ā¤š ā¤¸āĨ‡ ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ ā¤¨ ā¤šāĨ‹āĨ¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤¯ā¤š ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤¤ā¤ŋā¤°ā¤ŋā¤•āĨā¤¤ ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤­āĨ‡ā¤œāĨ‡ā¤—ā¤žāĨ¤", + "videoconf-ring-users": "ā¤•āĨ‰ā¤˛ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤°ā¤ŋā¤‚ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "videoconf-ring-users_description": "ā¤•āĨ‰ā¤˛ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤°ā¤ŋā¤‚ā¤— ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "Video_record": "ā¤šā¤˛ā¤šā¤ŋā¤¤āĨā¤° ā¤†ā¤˛āĨ‡ā¤–", + "Videos": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹", + "View_mode": "ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤ŽāĨ‹ā¤Ą", + "View_All": "ā¤¸ā¤­āĨ€ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "View_channels": "ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-agent-canned-responses": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ€ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-agent-canned-responses_description": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤•āĨ€ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-agent-extension-association": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤ā¤¸āĨ‹ā¤¸ā¤ŋā¤ā¤ļā¤¨ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-agent-extension-association_description": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤ā¤¸āĨ‹ā¤¸ā¤ŋā¤ā¤ļā¤¨ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-all-canned-responses": "ā¤¸ā¤­āĨ€ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-all-canned-responses_description": "ā¤¸ā¤­āĨ€ ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-import-operations": "ā¤†ā¤¯ā¤žā¤¤ ā¤Ēā¤°ā¤ŋā¤šā¤žā¤˛ā¤¨ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-import-operations_description": "ā¤†ā¤¯ā¤žā¤¤ ā¤Ēā¤°ā¤ŋā¤šā¤žā¤˛ā¤¨ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-omnichannel-contact-center": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤° ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-omnichannel-contact-center_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•āĨ‡ā¤‚ā¤ĻāĨā¤° ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤”ā¤° ā¤‰ā¤¸ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "View_Logs": "ā¤˛āĨ‰ā¤—āĨā¤¸ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "View_original": "ā¤ŽāĨ‚ā¤˛ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "View_the_Logs_for": "ā¤‡ā¤¸ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛āĨ‰ā¤— ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚: \"{{name}}\"", + "view-all-teams": "ā¤¸ā¤­āĨ€ ā¤ŸāĨ€ā¤ŽāĨ‡ā¤‚ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-all-teams_description": "ā¤¸ā¤­āĨ€ ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-all-team-channels": "ā¤¸ā¤­āĨ€ ā¤ŸāĨ€ā¤Ž ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-all-team-channels_description": "ā¤¸ā¤­āĨ€ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-broadcast-member-list": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤•ā¤•āĨā¤ˇ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-broadcast-member-list_description": "ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-c-room": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-c-room_description": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-canned-responses": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-canned-responses_description": "ā¤Ąā¤ŋā¤ŦāĨā¤Ŧā¤žā¤Ŧā¤‚ā¤Ļ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-d-room": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-d-room_description": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-device-management": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-device-management_description": "ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-engagement-dashboard": "ā¤¸ā¤šā¤­ā¤žā¤—ā¤ŋā¤¤ā¤ž ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-engagement-dashboard_description": "ā¤¸ā¤šā¤­ā¤žā¤—ā¤ŋā¤¤ā¤ž ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-federation-data": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-federation-data_description": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "View_full_conversation": "ā¤ĒāĨ‚ā¤°āĨ€ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-full-other-user-info": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ€ ā¤ĒāĨ‚ā¤°āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-full-other-user-info_description": "ā¤–ā¤žā¤¤ā¤ž ā¤¨ā¤ŋā¤°āĨā¤Žā¤žā¤Ŗ ā¤¤ā¤ŋā¤Ĩā¤ŋ, ā¤…ā¤‚ā¤¤ā¤ŋā¤Ž ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤†ā¤Ļā¤ŋ ā¤¸ā¤šā¤ŋā¤¤ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤ĒāĨ‚ā¤°āĨ€ ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋāĨ¤", + "view-history": "ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-history_description": "ā¤šāĨˆā¤¨ā¤˛ ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-join-code": "ā¤œāĨ‰ā¤‡ā¤¨ ā¤•āĨ‹ā¤Ą ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-join-code_description": "ā¤šāĨˆā¤¨ā¤˛ ā¤œāĨ‰ā¤‡ā¤¨ ā¤•āĨ‹ā¤Ą ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-joined-room": "ā¤¸ā¤ŽāĨā¤Žā¤ŋā¤˛ā¤ŋā¤¤ ā¤•ā¤•āĨā¤ˇ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-joined-room_description": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-l-room": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°āĨ‡ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-l-room_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°āĨ‡ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-analytics": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤¨ā¤žā¤˛ā¤ŋā¤Ÿā¤ŋā¤•āĨā¤¸ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-analytics_description": "ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤ĩā¤ŋā¤ļāĨā¤˛āĨ‡ā¤ˇā¤Ŗ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-appearance": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-appearance_description": "ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-business-hours": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-business-hours_description": "ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤ĩāĨā¤¯ā¤žā¤ĩā¤¸ā¤žā¤¯ā¤ŋā¤• ā¤˜ā¤‚ā¤ŸāĨ‡ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-current-chats": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤šāĨˆā¤Ÿ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-current-chats_description": "ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤šāĨˆā¤Ÿ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-customfields": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-customfields_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-departments": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-departments_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩā¤ŋā¤­ā¤žā¤—āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-installation": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤‡ā¤‚ā¤¸āĨā¤Ÿā¤žā¤˛āĨ‡ā¤ļā¤¨ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-installation_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸āĨā¤Ĩā¤žā¤Ēā¤¨ā¤ž ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-manager": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤• ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-manager_description": "ā¤…ā¤¨āĨā¤¯ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-monitor": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤°āĨā¤¸ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-queue": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤¤ā¤žā¤° ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-queue_description": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤¤ā¤žā¤° ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-real-time-monitoring": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤°āĨ€ā¤¯ā¤˛-ā¤Ÿā¤žā¤‡ā¤Ž ā¤ŽāĨ‰ā¤¨ā¤ŋā¤Ÿā¤°ā¤ŋā¤‚ā¤— ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-room-closed-by-another-agent": "ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤°āĨ‚ā¤Ž ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-room-closed-by-another-agent_description": "ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-room-closed-same-department": "ā¤‰ā¤¸āĨ€ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤°āĨ‚ā¤Ž ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-room-closed-same-department_description": "ā¤‰ā¤¸āĨ€ ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ŽāĨ‡ā¤‚ ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-room-customfields": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤•āĨā¤ˇ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-room-customfields_description": "ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤°āĨ‚ā¤Ž ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-rooms": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°āĨ‡ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-rooms_description": "ā¤…ā¤¨āĨā¤¯ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°āĨ‡ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-triggers": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-triggers_description": "ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤ŸāĨā¤°ā¤ŋā¤—ā¤° ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-webhooks": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-livechat-webhooks_description": "ā¤˛ā¤žā¤‡ā¤ĩ ā¤šāĨˆā¤Ÿ ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-livechat-unit": "ā¤˛ā¤žā¤‡ā¤ĩā¤šāĨˆā¤Ÿ ā¤‡ā¤•ā¤žā¤‡ā¤¯ā¤žā¤ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-logs": "ā¤˛āĨ‰ā¤—āĨā¤¸ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-logs_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤˛āĨ‰ā¤— ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-other-user-channels": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-other-user-channels_description": "ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸āĨā¤ĩā¤žā¤Žā¤ŋā¤¤āĨā¤ĩ ā¤ĩā¤žā¤˛āĨ‡ ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-outside-room": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤•ā¤•āĨā¤ˇ ā¤•ā¤ž ā¤ĻāĨƒā¤ļāĨā¤¯", + "view-outside-room_description": "ā¤ŽāĨŒā¤œāĨ‚ā¤Ļā¤ž ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤šā¤° ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-p-room": "ā¤¨ā¤ŋā¤œāĨ€ ā¤•ā¤•āĨā¤ˇ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-p-room_description": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-privileged-setting": "ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤žā¤§ā¤ŋā¤•ā¤žā¤° ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-privileged-setting_description": "ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-moderation-console": "ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-moderation-console_description": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•ā¤ž ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤•ā¤‚ā¤¸āĨ‹ā¤˛ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "manage-moderation-actions": "ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "manage-moderation-actions_description": "ā¤ŽāĨ‰ā¤Ąā¤°āĨ‡ā¤ļā¤¨ ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤‡ā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡, ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤°ā¤ĩā¤žā¤ˆ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ", + "view-room-administration": "ā¤•ā¤•āĨā¤ˇ ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-room-administration_description": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤•, ā¤¨ā¤ŋā¤œāĨ€ ā¤”ā¤° ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤•āĨā¤ˇ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‡ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋāĨ¤ ā¤‡ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤¯ā¤ž ā¤¸ā¤‚ā¤—āĨā¤°ā¤š ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤•āĨā¤ˇā¤Žā¤¤ā¤ž ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "view-statistics": "ā¤¸ā¤žā¤‚ā¤–āĨā¤¯ā¤ŋā¤•āĨ€ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-statistics_description": "ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‡ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤œāĨˆā¤¸āĨ‡ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž, ā¤•ā¤Žā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž, ā¤‘ā¤Ēā¤°āĨ‡ā¤Ÿā¤ŋā¤‚ā¤— ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "view-user-administration": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨ ā¤ĻāĨ‡ā¤–āĨ‡ā¤‚", + "view-user-administration_description": "ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–ā¤žā¤¤āĨ‹ā¤‚ ā¤•āĨ‡ ā¤†ā¤‚ā¤ļā¤ŋā¤•, ā¤•āĨ‡ā¤ĩā¤˛ ā¤Ēā¤ĸā¤ŧā¤¨āĨ‡ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤¸āĨ‚ā¤šāĨ€ ā¤ĻāĨƒā¤ļāĨā¤¯ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋāĨ¤ ā¤‡ā¤¸ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤Ēā¤šāĨā¤‚ā¤š ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Viewing_room_administration": "ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•ā¤ž ā¤•ā¤Žā¤°ā¤ž ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨", + "Visibility": "ā¤ĻāĨƒā¤ļāĨā¤¯ā¤¤ā¤ž", + "Visible": "ā¤ĻāĨƒā¤ļāĨā¤¯ā¤Žā¤žā¤¨", + "Visible_To_Workspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤Ēā¤° ā¤ĻāĨƒā¤ļāĨā¤¯ā¤Žā¤žā¤¨", + "Visit_Site_Url_and_try_the_best_open_source_chat_solution_available_today": "[Site_URL] ā¤Ēā¤° ā¤œā¤žā¤ā¤ ā¤”ā¤° ā¤†ā¤œ ā¤šāĨ€ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¸ā¤°āĨā¤ĩāĨ‹ā¤¤āĨā¤¤ā¤Ž ā¤“ā¤Ēā¤¨ ā¤¸āĨ‹ā¤°āĨā¤¸ ā¤šāĨˆā¤Ÿ ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨ ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤!", + "Visitor": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤•", + "Visitor_Email": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤ˆ-ā¤ŽāĨ‡ā¤˛", + "Visitor_Info": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Visitor_message": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Visitor_Name": "ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "Visitor_Name_Placeholder": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚...", + "Visitor_not_found": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Visitor_does_not_exist": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ!", + "Visitor_Navigation": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤¨āĨ‡ā¤ĩā¤ŋā¤—āĨ‡ā¤ļā¤¨", + "Visitor_page_URL": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤ĒāĨƒā¤ˇāĨā¤  URL", + "Visitor_time_on_site": "ā¤¸ā¤žā¤‡ā¤Ÿ ā¤Ēā¤° ā¤†ā¤—ā¤‚ā¤¤āĨā¤• ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "Voice_Call": "ā¤†ā¤ĩā¤žā¤œ ā¤•āĨ‰ā¤˛", + "VoIP_Enable_Keep_Alive_For_Unstable_Networks": "ā¤ā¤¸ā¤†ā¤ˆā¤ĒāĨ€ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤°ā¤–āĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "VoIP_Enable_Keep_Alive_For_Unstable_Networks_Description": "ā¤¸ā¤Žā¤¯-ā¤¸ā¤Žā¤¯ ā¤Ēā¤° ā¤ā¤¸ā¤†ā¤ˆā¤ĒāĨ€ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤•ā¤° ā¤•ā¤ˆ ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤ā¤¸ā¤†ā¤ˆā¤ĒāĨ€ ā¤—āĨ‡ā¤Ÿā¤ĩāĨ‡ ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ€ ā¤¨ā¤ŋā¤—ā¤°ā¤žā¤¨āĨ€ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤…ā¤¸āĨā¤Ĩā¤ŋā¤° ā¤¨āĨ‡ā¤Ÿā¤ĩā¤°āĨā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ.", + "VoIP_Enabled": "ā¤§āĨā¤ĩā¤¨ā¤ŋ ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "VoIP_Enabled_Description": "ā¤†ā¤‰ā¤Ÿā¤Ŧā¤žā¤‰ā¤‚ā¤Ą ā¤”ā¤° ā¤‡ā¤¨ā¤•ā¤Žā¤ŋā¤‚ā¤— ā¤•āĨ‰ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‹ ā¤—āĨā¤°ā¤žā¤šā¤•āĨ‹ā¤‚ ā¤¸āĨ‡ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "VoIP_Extension": "ā¤ĩāĨ€ā¤“ā¤†ā¤‡ā¤ĒāĨ€ ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨", + "Voip_Server_Configuration": "ā¤¤ā¤žā¤°ā¤žā¤‚ā¤•ā¤¨ ā¤ĩāĨ‡ā¤Ŧā¤¸āĨ‰ā¤•āĨ‡ā¤Ÿ ā¤¸ā¤°āĨā¤ĩā¤°", + "VoIP_Server_Websocket_Port": "ā¤ĩāĨ‡ā¤Ŧā¤¸āĨ‰ā¤•āĨ‡ā¤Ÿ ā¤ĒāĨ‹ā¤°āĨā¤Ÿ", + "VoIP_Server_Name": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "VoIP_Server_Websocket_Path": "ā¤ĩāĨ‡ā¤Ŧā¤¸āĨ‹ā¤•āĨ‡ā¤Ÿ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "VoIP_Retry_Count": "count ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚", + "VoIP_Retry_Count_Description": "ā¤¯ā¤š ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤–āĨ‹ ā¤œā¤žā¤¨āĨ‡ ā¤Ēā¤° ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤•ā¤ŋā¤¤ā¤¨āĨ€ ā¤Ŧā¤žā¤° ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤—ā¤žāĨ¤", + "VoIP_Management_Server": "ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤¸ā¤°āĨā¤ĩā¤°", + "VoIP_Management_Server_Host": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤šāĨ‹ā¤¸āĨā¤Ÿ", + "VoIP_Management_Server_Port": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĒāĨ‹ā¤°āĨā¤Ÿ", + "VoIP_Management_Server_Name": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "VoIP_Management_Server_Username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "VoIP_Management_Server_Password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "Voip_call_started": "ā¤Ēā¤° ā¤•āĨ‰ā¤˛ ā¤ļāĨā¤°āĨ‚ ā¤šāĨā¤ˆ", + "Voip_call_duration": "ā¤•āĨ‰ā¤˛ {{period}} ā¤¤ā¤• ā¤šā¤˛āĨ€", + "Voip_call_declined": "ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ĢāĨ‹ā¤¨ ā¤•ā¤žā¤Ÿ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Voip_call_on_hold": "ā¤•āĨ‰ā¤˛ ā¤•āĨ‹ ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤Ēā¤° ā¤°ā¤–ā¤ž ā¤—ā¤¯ā¤ž", + "Voip_call_unhold": "ā¤Ēā¤° ā¤•āĨ‰ā¤˛ ā¤Ģā¤ŋā¤° ā¤¸āĨ‡ ā¤ļāĨā¤°āĨ‚ ā¤šāĨā¤ˆ", + "Voip_call_ended": "ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤—ā¤ˆ", + "Voip_call_ended_unexpectedly": "ā¤•āĨ‰ā¤˛ ā¤…ā¤ĒāĨā¤°ā¤¤āĨā¤¯ā¤žā¤ļā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨā¤ˆ: {{reason}}", + "Voip_call_wrapup": "ā¤•āĨ‰ā¤˛ ā¤°āĨˆā¤Ēā¤…ā¤Ē ā¤¨āĨ‹ā¤ŸāĨā¤¸ ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ ā¤—ā¤: {{comment}}", + "VoIP_JWT_Secret": "ā¤—āĨā¤ĒāĨā¤¤ ā¤•āĨā¤‚ā¤œāĨ€ (JWT)", + "VoIP_JWT_Secret_description": "ā¤¸ā¤žā¤ĻāĨ‡ ā¤Ēā¤žā¤  ā¤•āĨ‡ ā¤Ŧā¤œā¤žā¤¯ JWT ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤°āĨā¤ĩā¤° ā¤¸āĨ‡ ā¤•āĨā¤˛ā¤žā¤‡ā¤‚ā¤Ÿ ā¤¤ā¤• ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤¸ā¤žā¤ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤—āĨā¤ĒāĨā¤¤ ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤•āĨ‹ā¤ˆ ā¤—āĨā¤ĒāĨā¤¤ ā¤•āĨā¤‚ā¤œāĨ€ ā¤¸āĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤•āĨ€ ā¤—ā¤ˆ ā¤šāĨˆ ā¤¤āĨ‹ ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ ā¤¸ā¤žā¤ĻāĨ‡ ā¤Ēā¤žā¤  ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤­āĨ‡ā¤œā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Voip_is_disabled": "ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ", + "Voip_is_disabled_description": "ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤•āĨ€ ā¤¸āĨ‚ā¤šāĨ€ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‹ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤°ā¤¨ā¤ž ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ, ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤ŸāĨˆā¤Ŧ ā¤ŽāĨ‡ā¤‚ ā¤ā¤¸ā¤ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "VoIP_Toggle": "ā¤ĩāĨ€ā¤“ā¤†ā¤ˆā¤ĒāĨ€ ā¤¸ā¤•āĨā¤ˇā¤Ž/ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "Chat_opened_by_visitor": "ā¤ĩā¤ŋā¤œā¤ŧā¤ŋā¤Ÿā¤° ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤šāĨˆā¤Ÿ ā¤–āĨ‹ā¤˛āĨ€ ā¤—ā¤ˆ", + "Wait_activation_warning": "ā¤‡ā¤¸ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤° ā¤¸ā¤•āĨ‡ā¤‚, ā¤†ā¤Ēā¤•ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤", + "Waiting_for_answer": "ā¤œā¤ĩā¤žā¤Ŧ ā¤•ā¤ž ā¤‡ā¤‚ā¤¤ā¤œā¤ŧā¤žā¤° ā¤°ā¤šā¤ž ā¤šāĨ‚ā¤", + "Waiting_queue": "ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤¤ā¤žā¤°", + "Waiting_queue_message": "ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•ā¤¤ā¤žā¤° ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "Waiting_queue_message_description": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤œāĨ‹ ā¤†ā¤—ā¤‚ā¤¤āĨā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛ā¤—ā¤¨āĨ‡ ā¤Ēā¤° ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤ŋā¤¤ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤ž", + "Waiting_Time": "ā¤‡ā¤‚ā¤¤ā¤œā¤ŧā¤žā¤° ā¤•ā¤ž ā¤¸ā¤Žā¤¯", + "Waiting_for_server_connection": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž ā¤•āĨ€ ā¤œā¤ž ā¤°ā¤šāĨ€ ā¤šāĨˆ", + "Warning": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨āĨ€", + "Warnings": "ā¤šāĨ‡ā¤¤ā¤žā¤ĩā¤¨ā¤ŋā¤¯ā¤žā¤", + "WAU_value": "ā¤ŽāĨˆā¤‚ ā¤•ā¤ĻāĨā¤° ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨ‚ā¤‚ {{value}}", + "We_appreciate_your_feedback": "ā¤šā¤Ž ā¤†ā¤Ēā¤•āĨ‡ ā¤Ģā¤ŧāĨ€ā¤Ąā¤ŦāĨˆā¤• ā¤•āĨ€ ā¤¸ā¤°ā¤žā¤šā¤¨ā¤ž ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚", "We_are_offline_Sorry_for_the_inconvenience": "ā¤šā¤Ž ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤šāĨˆā¤‚āĨ¤ ā¤…ā¤¸āĨā¤ĩā¤ŋā¤§ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤–āĨ‡ā¤Ļ ā¤šāĨˆāĨ¤", + "We_Could_not_retrive_any_data": "ā¤šā¤Ž ā¤•āĨ‹ā¤ˆ ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤¸ā¤•āĨ‡", + "We_have_sent_password_email": "ā¤šā¤Žā¤¨āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤ž ā¤šāĨˆāĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‹ ā¤ļāĨ€ā¤˜āĨā¤° ā¤šāĨ€ ā¤•āĨ‹ā¤ˆ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĩā¤žā¤Ēā¤¸ ā¤†ā¤ā¤‚ ā¤”ā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "We_have_sent_registration_email": "ā¤šā¤Žā¤¨āĨ‡ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤ž ā¤šāĨˆāĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‹ ā¤ļāĨ€ā¤˜āĨā¤° ā¤šāĨ€ ā¤•āĨ‹ā¤ˆ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĩā¤žā¤Ēā¤¸ ā¤†ā¤ā¤‚ ā¤”ā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Webdav Integration": "ā¤ĩāĨ‡ā¤Ŧā¤Ąā¤žā¤ĩ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "Webdav Integration_Description": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤°āĨā¤ĩā¤° ā¤Ēā¤° ā¤Ļā¤¸āĨā¤¤ā¤žā¤ĩāĨ‡ā¤œā¤ŧ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡, ā¤Ŧā¤Ļā¤˛ā¤¨āĨ‡ ā¤”ā¤° ā¤¸āĨā¤Ĩā¤žā¤¨ā¤žā¤‚ā¤¤ā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤°āĨ‚ā¤Ēā¤°āĨ‡ā¤–ā¤žāĨ¤ Nextcloud ā¤œāĨˆā¤¸āĨ‡ WebDAV ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‹ ā¤˛ā¤ŋā¤‚ā¤• ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "WebDAV_Accounts": "ā¤ĩāĨ‡ā¤Ŧā¤ĄāĨ€ā¤ā¤ĩāĨ€ ā¤–ā¤žā¤¤āĨ‡", + "Webdav_add_new_account": "ā¤¨ā¤¯ā¤ž WebDAV ā¤–ā¤žā¤¤ā¤ž ā¤œāĨ‹ā¤Ąā¤ŧāĨ‡ā¤‚", + "Webdav_Integration_Enabled": "ā¤ĩāĨ‡ā¤Ŧā¤Ąā¤žā¤ĩ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¸ā¤•āĨā¤ˇā¤Ž", + "WebDAV_Integration_Not_Allowed": "WebDAV ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Webdav_Password": "ā¤ĩāĨ‡ā¤Ŧā¤ĄāĨ€ā¤ā¤ĩāĨ€ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "Webdav_Server_URL": "WebDAV ā¤¸ā¤°āĨā¤ĩā¤° ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Webdav_Username": "ā¤ĩāĨ‡ā¤Ŧā¤ĄāĨ€ā¤ā¤ĩāĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "Webdav_account_removed": "WebDAV ā¤–ā¤žā¤¤ā¤ž ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "webdav-account-saved": "WebDAV ā¤–ā¤žā¤¤ā¤ž ā¤¸ā¤šāĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž", + "webdav-account-updated": "WebDAV ā¤–ā¤žā¤¤ā¤ž ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "webdav-server-not-found": "WebDAV ā¤¸ā¤°āĨā¤ĩā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "Webhook_Details": "ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤ĩā¤ŋā¤ĩā¤°ā¤Ŗ", + "Webhook_URL": "ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛", + "Webhook_URL_not_set": "ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤¸āĨ‡ā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Webhooks": "ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤•", + "WebRTC": "ā¤ĩāĨ‡ā¤Ŧā¤†ā¤°ā¤ŸāĨ€ā¤¸āĨ€", + "WebRTC_Description": "ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤”ā¤°/ā¤¯ā¤ž ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤¸ā¤žā¤Žā¤—āĨā¤°āĨ€ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚, ā¤¸ā¤žā¤Ĩ ā¤šāĨ€ ā¤•ā¤ŋā¤¸āĨ€ ā¤Ŧā¤ŋā¤šāĨŒā¤˛ā¤ŋā¤ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤°āĨ‹ā¤‚ ā¤•āĨ‡ ā¤ŦāĨ€ā¤š ā¤Žā¤¨ā¤Žā¤žā¤¨ā¤ž ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "WebRTC_Call": "ā¤ĩāĨ‡ā¤Ŧā¤†ā¤°ā¤ŸāĨ€ā¤¸āĨ€ ā¤•āĨ‰ā¤˛", + "WebRTC_Call_unavailable_for_federation": "ā¤Ģā¤ŧāĨ‡ā¤Ąā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤°āĨ‚ā¤Ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ WebRTC ā¤•āĨ‰ā¤˛ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "WebRTC_direct_audio_call_from_%s": "%s ā¤¸āĨ‡ ā¤¸āĨ€ā¤§ā¤ž ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛", + "WebRTC_direct_video_call_from_%s": "%s ā¤¸āĨ‡ ā¤¸āĨ€ā¤§ā¤ž ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛", + "WebRTC_Enable_Channel": "ā¤¸ā¤žā¤°āĨā¤ĩā¤œā¤¨ā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "WebRTC_Enable_Direct": "ā¤¸āĨ€ā¤§āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļāĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "WebRTC_Enable_Private": "ā¤¨ā¤ŋā¤œāĨ€ ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚", + "WebRTC_group_audio_call_from_%s": "%s ā¤¸āĨ‡ ā¤¸ā¤ŽāĨ‚ā¤š ā¤‘ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛", + "WebRTC_group_video_call_from_%s": "%s ā¤¸āĨ‡ ā¤¸ā¤ŽāĨ‚ā¤š ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛", + "WebRTC_monitor_call_from_%s": "%s ā¤¸āĨ‡ ā¤•āĨ‰ā¤˛ ā¤•āĨ€ ā¤¨ā¤ŋā¤—ā¤°ā¤žā¤¨āĨ€ ā¤•ā¤°āĨ‡ā¤‚", + "WebRTC_Servers": "ā¤¸āĨā¤Ÿā¤¨/ā¤Ÿā¤°āĨā¤¨ ā¤¸ā¤°āĨā¤ĩā¤°", + "WebRTC_Servers_Description": "ā¤…ā¤˛āĨā¤Ēā¤ĩā¤ŋā¤°ā¤žā¤Ž ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤˛ā¤— ā¤•ā¤ŋā¤ ā¤—ā¤ STUN ā¤”ā¤° TURN ā¤¸ā¤°āĨā¤ĩā¤°āĨ‹ā¤‚ ā¤•āĨ€ ā¤ā¤• ā¤¸āĨ‚ā¤šāĨ€āĨ¤\n ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž, ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤”ā¤° ā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•āĨ‹ `username:password@stun:host:port` ā¤¯ā¤ž `username:password@turn:host:port` ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "WebRTC_call_ended_message": "ā¤•āĨ‰ā¤˛ {{endTime}} ā¤Ēā¤° ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨā¤ˆ - {{callDuration}} ā¤¤ā¤• ā¤šā¤˛āĨ€", + "WebRTC_call_declined_message": "ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤•āĨ‰ā¤˛ ā¤…ā¤¸āĨā¤ĩāĨ€ā¤•āĨƒā¤¤.", + "Website": "ā¤ĩāĨ‡ā¤Ŧā¤¸ā¤žā¤‡ā¤Ÿ", + "Wednesday": "ā¤ŦāĨā¤§ā¤ĩā¤žā¤°", + "Weekly_Active_Users": "ā¤¸ā¤žā¤ĒāĨā¤¤ā¤žā¤šā¤ŋā¤• ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Welcome": "ā¤¸āĨā¤ĩā¤žā¤—ā¤¤ ā¤šāĨˆ %s .", + "Welcome_to": "[ā¤¸ā¤žā¤‡ā¤Ÿ_ā¤¨ā¤žā¤Ž] ā¤ŽāĨ‡ā¤‚ ā¤†ā¤Ēā¤•ā¤ž ā¤¸āĨā¤ĩā¤žā¤—ā¤¤ ā¤šāĨˆ", + "Welcome_to_workspace": "{{Site_Name}} ā¤ŽāĨ‡ā¤‚ ā¤†ā¤Ēā¤•ā¤ž ā¤¸āĨā¤ĩā¤žā¤—ā¤¤ ā¤šāĨˆ", + "Welcome_to_the": "ā¤†ā¤Ēā¤•ā¤ž ā¤¸āĨā¤ĩā¤žā¤—ā¤¤ ā¤šāĨˆ", + "When": "ā¤•ā¤Ŧ", + "When_a_line_starts_with_one_of_there_words_post_to_the_URLs_below": "ā¤œā¤Ŧ ā¤•āĨ‹ā¤ˆ ā¤Ēā¤‚ā¤•āĨā¤¤ā¤ŋ ā¤‡ā¤¨ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ ā¤•ā¤ŋā¤¸āĨ€ ā¤ā¤• ā¤ļā¤ŦāĨā¤Ļ ā¤¸āĨ‡ ā¤ļāĨā¤°āĨ‚ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Ēā¤° ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "When_is_the_chat_busier?": "ā¤šāĨˆā¤Ÿ ā¤•ā¤Ŧ ā¤ĩāĨā¤¯ā¤¸āĨā¤¤ ā¤šāĨˆ?", + "Where_are_the_messages_being_sent?": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•ā¤šā¤žā¤‚ ā¤­āĨ‡ā¤œāĨ‡ ā¤œā¤ž ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚?", + "Why_did_you_chose__score__": "ā¤†ā¤Ēā¤¨āĨ‡ {{score}} ā¤•āĨā¤¯āĨ‹ā¤‚ ā¤šāĨā¤¨ā¤ž?", + "Why_do_you_want_to_report_question_mark": "ā¤†ā¤Ē ā¤°ā¤ŋā¤ĒāĨ‹ā¤°āĨā¤Ÿ ā¤•āĨā¤¯āĨ‹ā¤‚ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚?", + "Will_Appear_In_From": "ā¤†ā¤Ēā¤•āĨ‡ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤ĒāĨā¤°āĨ‡ā¤ˇā¤•: ā¤ļāĨ€ā¤°āĨā¤ˇā¤• ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤—ā¤žāĨ¤", + "will_be_able_to": "ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¯āĨ‹ā¤—āĨā¤¯ ā¤šāĨ‹ā¤—ā¤ž", + "Will_be_available_here_after_saving": "ā¤¸āĨ‡ā¤ĩ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¯ā¤šā¤žā¤‚ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨ‹ā¤—ā¤ž.", + "Without_priority": "ā¤Ŧā¤ŋā¤¨ā¤ž ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤•ā¤¤ā¤ž ā¤•āĨ‡", + "Without_SLA": "ā¤ā¤¸ā¤ā¤˛ā¤ ā¤•āĨ‡ ā¤Ŧā¤ŋā¤¨ā¤ž", + "Workspace_now_using_device_management": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤…ā¤Ŧ ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Worldwide": "ā¤ĻāĨā¤¨ā¤ŋā¤¯ā¤ž ā¤­ā¤°", + "Would_you_like_to_return_the_inquiry": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤ĒāĨ‚ā¤›ā¤¤ā¤žā¤› ā¤ĩā¤žā¤Ēā¤¸ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šāĨ‡ā¤‚ā¤—āĨ‡?", + "Would_you_like_to_return_the_queue": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‹ ā¤ĩā¤žā¤Ēā¤¸ ā¤•ā¤¤ā¤žā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‡ ā¤œā¤žā¤¨ā¤ž ā¤šā¤žā¤šāĨ‡ā¤‚ā¤—āĨ‡? ā¤¸ā¤žā¤°āĨ€ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•ā¤ž ā¤‡ā¤¤ā¤ŋā¤šā¤žā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤°ā¤–ā¤ž ā¤œā¤žā¤ā¤—ā¤ž.", + "Would_you_like_to_place_chat_on_hold": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤Ÿ ā¤•āĨ‹ ā¤‘ā¤¨-ā¤šāĨ‹ā¤˛āĨā¤Ą ā¤°ā¤–ā¤¨ā¤ž ā¤šā¤žā¤šāĨ‡ā¤‚ā¤—āĨ‡?", + "Wrap_up_the_call": "ā¤•āĨ‰ā¤˛ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Wrap_Up_Notes": "ā¤¸ā¤Žā¤žā¤Ēā¤¨ ā¤¨āĨ‹ā¤ŸāĨā¤¸", + "Workspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨", "Yes": "ā¤šā¤žā¤", - "You": "ā¤†ā¤Ē" + "Yes_archive_it": "ā¤šā¤žā¤, ā¤‡ā¤¸āĨ‡ ā¤¸ā¤‚ā¤—āĨā¤°ā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚!", + "Yes_clear_all": "ā¤šā¤žā¤, ā¤¸ā¤Ŧ ā¤¸ā¤žā¤Ģā¤ŧ ā¤•ā¤°āĨ‡ā¤‚!", + "Yes_continue": "ā¤šā¤žā¤, ā¤œā¤žā¤°āĨ€ ā¤°ā¤–āĨ‡ā¤‚!", + "Yes_deactivate_it": "ā¤šā¤žā¤, ā¤‡ā¤¸āĨ‡ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤°āĨ‡ā¤‚!", + "Yes_delete_it": "ā¤šā¤žā¤, ā¤‡ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤‚!", + "Yes_hide_it": "ā¤šā¤žā¤, ā¤›āĨā¤Ēā¤žā¤“!", + "Yes_leave_it": "ā¤šā¤žā¤, ā¤›āĨ‹ā¤Ąā¤ŧāĨ‹!", + "Yes_mute_user": "ā¤šā¤žā¤, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤ŽāĨā¤¯āĨ‚ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚!", + "Yes_prune_them": "ā¤šā¤žā¤, ā¤‰ā¤¨ā¤•āĨ€ ā¤•ā¤žā¤Ÿ-ā¤›ā¤žā¤ā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚!", + "Yes_remove_user": "ā¤šā¤žā¤, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‹ ā¤šā¤Ÿā¤ž ā¤ĻāĨ‡ā¤‚!", + "Yes_unarchive_it": "ā¤šā¤žā¤, ā¤‡ā¤¸āĨ‡ ā¤…ā¤¸ā¤‚ā¤—āĨā¤°ā¤šāĨ€ā¤¤ ā¤•ā¤°āĨ‡ā¤‚!", + "yesterday": "ā¤•ā¤˛", + "Yesterday": "ā¤•ā¤˛", + "You": "ā¤†ā¤Ē", + "You_reacted_with": "ā¤†ā¤Ēā¤¨āĨ‡ {{emoji}} ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ ā¤•āĨ€", + "Users_reacted_with": "{{users}} ā¤¨āĨ‡ {{emoji}} ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ ā¤•āĨ€", + "Users_and_more_reacted_with": "{{user}} ā¤”ā¤° {{counter}} ā¤”ā¤° ā¤…ā¤§ā¤ŋā¤• ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤¨āĨ‡ {{emoji}} ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ ā¤•āĨ€", + "You_and_users_Reacted_with": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤”ā¤° {{users}} ā¤¨āĨ‡ {{emoji}} ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ ā¤•āĨ€", + "You_users_and_more_Reacted_with": "ā¤†ā¤Ēā¤¨āĨ‡, {{user}} ā¤”ā¤° {{counter}} ā¤¨āĨ‡ {{emoji}} ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĩāĨā¤¯ā¤•āĨā¤¤ ā¤•āĨ€", + "You_are_converting_team_to_channel": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤ā¤• ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ēā¤°ā¤ŋā¤ĩā¤°āĨā¤¤ā¤ŋā¤¤ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "you_are_in_preview_mode_of": "ā¤†ā¤Ē ā¤šāĨˆā¤¨ā¤˛ # {{room_name}} ā¤•āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤ŽāĨ‹ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤‚", + "you_are_in_preview": "ā¤†ā¤Ē ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤ŽāĨ‹ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤‚", + "you_are_in_preview_please_insert_the_password": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ąā¤žā¤˛āĨ‡ā¤‚", + "you_are_in_preview_mode_of_incoming_livechat": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤šāĨˆā¤Ÿ ā¤•āĨ‡ ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤žā¤ĩā¤˛āĨ‹ā¤•ā¤¨ ā¤ŽāĨ‹ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆā¤‚", + "You_are_logged_in_as": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤‡ā¤¸ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ", + "You_are_not_authorized_to_view_this_page": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ĒāĨƒā¤ˇāĨā¤  ā¤•āĨ‹ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤§ā¤ŋā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤", + "You_can_change_a_different_avatar_too": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨ‡ ā¤ĒāĨ‹ā¤¸āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤ŋā¤ ā¤—ā¤ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•āĨ‹ ā¤“ā¤ĩā¤°ā¤°ā¤žā¤‡ā¤Ą ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "You_can_close_this_window_now": "ā¤…ā¤Ŧ ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ĩā¤ŋā¤‚ā¤ĄāĨ‹ ā¤•āĨ‹ ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚.", + "You_can_search_using_RegExp_eg": "ā¤†ā¤Ē ā¤°āĨ‡ā¤—āĨā¤˛ā¤° ā¤ā¤•āĨā¤¸ā¤ĒāĨā¤°āĨ‡ā¤ļā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤–āĨ‹ā¤œ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤‰ā¤Ļā¤žā¤šā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ /^text$/i", + "You_can_try_to": "ā¤†ā¤Ē ā¤•āĨ‹ā¤ļā¤ŋā¤ļ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "You_can_use_an_emoji_as_avatar": "ā¤†ā¤Ē ā¤‡ā¤ŽāĨ‹ā¤œāĨ€ ā¤•āĨ‹ ā¤…ā¤ĩā¤¤ā¤žā¤° ā¤•āĨ‡ ā¤¤āĨŒā¤° ā¤Ēā¤° ā¤­āĨ€ ā¤‡ā¤¸āĨā¤¤āĨ‡ā¤Žā¤žā¤˛ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚.", + "You_can_use_webhooks_to_easily_integrate_livechat_with_your_CRM": "ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤¸āĨ€ā¤†ā¤°ā¤ā¤Ž ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‹ ā¤†ā¤¸ā¤žā¤¨āĨ€ ā¤¸āĨ‡ ā¤ā¤•āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩāĨ‡ā¤Ŧā¤šāĨā¤• ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "You_cant_leave_a_livechat_room_Please_use_the_close_button": "ā¤†ā¤Ē ā¤ā¤• ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤•ā¤Žā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤¸ā¤•ā¤¤āĨ‡āĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž, ā¤Ŧā¤‚ā¤Ļ ā¤•ā¤°āĨ‡ā¤‚ ā¤Ŧā¤Ÿā¤¨ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "You_followed_this_message": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•ā¤ž ā¤…ā¤¨āĨā¤¸ā¤°ā¤Ŗ ā¤•ā¤ŋā¤¯ā¤ž.", + "You_have_a_new_message": "ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤†ā¤¯ā¤ž ā¤šāĨˆ", + "You_have_been_muted": "ā¤†ā¤Ēā¤•āĨ‹ ā¤ŽāĨŒā¤¨ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ ā¤”ā¤° ā¤†ā¤Ē ā¤‡ā¤¸ ā¤•ā¤Žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤ŦāĨ‹ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤¸ā¤•ā¤¤āĨ‡", + "You_have_been_removed_from__roomName_": "ā¤†ā¤Ēā¤•āĨ‹ ā¤•ā¤Žā¤°āĨ‡ {{roomName}} ā¤¸āĨ‡ ā¤¨ā¤ŋā¤•ā¤žā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "You_have_joined_a_new_call_with": "ā¤†ā¤Ē ā¤ā¤• ā¤¨ā¤ˆ ā¤•āĨ‰ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨā¤ ā¤šāĨˆā¤‚", + "You_have_n_codes_remaining": "ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ {{number}} ā¤•āĨ‹ā¤Ą ā¤ļāĨ‡ā¤ˇ ā¤šāĨˆā¤‚āĨ¤", + "You_have_not_verified_your_email": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ.", + "You_have_successfully_unsubscribed": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤šā¤Žā¤žā¤°āĨ€ ā¤ŽāĨ‡ā¤˛ā¤ŋā¤‚ā¤— ā¤¸āĨ‚ā¤šāĨ€ ā¤¸āĨ‡ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤° ā¤ĻāĨ€ ā¤šāĨˆāĨ¤", + "You_must_join_to_view_messages_in_this_channel": "ā¤‡ā¤¸ ā¤šāĨˆā¤¨ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤ĻāĨ‡ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤ĩā¤ļāĨā¤¯ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤", + "You_need_confirm_email": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°ā¤¨āĨ€ ā¤šāĨ‹ā¤—āĨ€!", + "You_need_install_an_extension_to_allow_screen_sharing": "ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤ļāĨ‡ā¤¯ā¤°ā¤ŋā¤‚ā¤— ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤ā¤•āĨā¤¸ā¤ŸāĨ‡ā¤‚ā¤ļā¤¨ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "You_need_to_change_your_password": "ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤Ļā¤˛ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "You_need_to_type_in_your_password_in_order_to_do_this": "ā¤ā¤¸ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž!", + "You_need_to_type_in_your_username_in_order_to_do_this": "ā¤ā¤¸ā¤ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž ā¤Ÿā¤žā¤‡ā¤Ē ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž!", + "You_need_to_verifiy_your_email_address_to_get_notications": "ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "You_need_to_write_something": "ā¤¤āĨā¤ŽāĨā¤šāĨ‡ā¤‚ ā¤•āĨā¤› ā¤˛ā¤ŋā¤–ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž!", + "You_reached_the_maximum_number_of_guest_users_allowed_by_your_license": "ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤…ā¤¨āĨā¤Žā¤¤ ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤š ā¤—ā¤ ā¤šāĨˆā¤‚āĨ¤", + "You_should_inform_one_url_at_least": "ā¤†ā¤Ēā¤•āĨ‹ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž ā¤ā¤• ā¤¯āĨ‚ā¤†ā¤°ā¤ā¤˛ ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤.", + "You_should_name_it_to_easily_manage_your_integrations": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤ā¤•āĨ€ā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤•āĨ‹ ā¤†ā¤¸ā¤žā¤¨āĨ€ ā¤¸āĨ‡ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤‡ā¤¸āĨ‡ ā¤¨ā¤žā¤Ž ā¤ĻāĨ‡ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤", + "You_unfollowed_this_message": "ā¤†ā¤Ēā¤¨āĨ‡ ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤…ā¤¨ā¤Ģā¤ŧāĨ‰ā¤˛āĨ‹ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆ.", + "You_will_be_asked_for_permissions": "ā¤†ā¤Ēā¤¸āĨ‡ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤Žā¤žā¤‚ā¤—āĨ€ ā¤œā¤žā¤ā¤‚ā¤—āĨ€", + "You_will_not_be_able_to_recover": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡!", + "You_will_not_be_able_to_recover_email_inbox": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡", + "You_will_not_be_able_to_recover_file": "ā¤†ā¤Ē ā¤‡ā¤¸ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤•āĨ‹ ā¤ĒāĨā¤¨ā¤°āĨā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤Ēā¤žā¤ā¤‚ā¤—āĨ‡!", + "You_wont_receive_email_notifications_because_you_have_not_verified_your_email": "ā¤†ā¤Ēā¤•āĨ‹ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤‚ā¤—āĨ€ ā¤•āĨā¤¯āĨ‹ā¤‚ā¤•ā¤ŋ ā¤†ā¤Ēā¤¨āĨ‡ ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "Your_e2e_key_has_been_reset": "ā¤†ā¤Ēā¤•āĨ€ e2e ā¤•āĨā¤‚ā¤œāĨ€ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ.", + "Your_email_address_has_changed": "ā¤†ā¤Ēā¤•ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "Your_email_has_been_queued_for_sending": "ā¤†ā¤Ēā¤•ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤¤ā¤žā¤°ā¤Ŧā¤ĻāĨā¤§ ā¤šāĨˆ", + "Your_entry_has_been_deleted": "ā¤†ā¤Ēā¤•āĨ€ ā¤ĒāĨā¤°ā¤ĩā¤ŋā¤ˇāĨā¤Ÿā¤ŋ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ.", + "Your_file_has_been_deleted": "ā¤†ā¤Ēā¤•āĨ€ ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤šā¤Ÿā¤ž ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆ.", + "Your_invite_link_will_expire_after__usesLeft__uses": "ā¤†ā¤Ēā¤•ā¤ž ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• {{usesLeft}} ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Your_invite_link_will_expire_on__date__": "ā¤†ā¤Ēā¤•ā¤ž ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• {{date}} ā¤•āĨ‹ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "ā¤†ā¤Ēā¤•ā¤ž ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• {{date}} ā¤•āĨ‹ ā¤¯ā¤ž {{usesLeft}} ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ‡ ā¤Ŧā¤žā¤Ļ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Your_invite_link_will_never_expire": "ā¤†ā¤Ēā¤•ā¤ž ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• ā¤•ā¤­āĨ€ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž.", + "your_message": "ā¤†ā¤Ēā¤•ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "your_message_optional": "ā¤†ā¤Ēā¤•ā¤ž ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ (ā¤ĩāĨˆā¤•ā¤˛āĨā¤Ēā¤ŋā¤•)", + "Your_new_email_is_email": "ā¤†ā¤Ēā¤•ā¤ž ā¤¨ā¤¯ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤ā¤ž [ā¤ˆā¤ŽāĨ‡ā¤˛] ā¤šāĨˆāĨ¤", + "Your_password_is_wrong": "ā¤†ā¤Ēā¤•ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤—ā¤ŧā¤˛ā¤¤ ā¤šāĨˆ!", + "Your_password_was_changed_by_an_admin": "ā¤†ā¤Ēā¤•ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤Ļā¤˛ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤ž.", + "Your_push_was_sent_to_s_devices": "ā¤†ā¤Ēā¤•ā¤ž ā¤ĒāĨā¤ļ %s ā¤Ąā¤ŋā¤ĩā¤žā¤‡ā¤¸ ā¤Ēā¤° ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž ā¤Ĩā¤ž", + "Your_request_to_join__roomName__has_been_made_it_could_take_up_to_15_minutes_to_be_processed": "{{roomName}} ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ, ā¤‡ā¤¸āĨ‡ ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤ŋā¤¤ ā¤šāĨ‹ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ 15 ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤¤ā¤• ā¤•ā¤ž ā¤¸ā¤Žā¤¯ ā¤˛ā¤— ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤œā¤Ŧ ā¤¯ā¤š ā¤œā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤šāĨ‹ā¤—ā¤ž ā¤¤āĨ‹ ā¤†ā¤Ēā¤•āĨ‹ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "Your_question": "ā¤†ā¤Ēā¤•ā¤ž ā¤ĒāĨā¤°ā¤ļāĨā¤¨", + "Your_server_link": "ā¤†ā¤Ēā¤•ā¤ž ā¤¸ā¤°āĨā¤ĩā¤° ā¤˛ā¤ŋā¤‚ā¤•", + "Your_temporary_password_is_password": "ā¤†ā¤Ēā¤•ā¤ž ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą [ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą] ā¤šāĨˆāĨ¤", + "Your_TOTP_has_been_reset": "ā¤†ā¤Ēā¤•ā¤ž ā¤ŸāĨ‚ ā¤ĢāĨˆā¤•āĨā¤Ÿā¤° ā¤ŸāĨ€ā¤“ā¤ŸāĨ€ā¤ĒāĨ€ ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "Your_web_browser_blocked_Rocket_Chat_from_opening_tab": "ā¤†ā¤Ēā¤•āĨ‡ ā¤ĩāĨ‡ā¤Ŧ ā¤ŦāĨā¤°ā¤žā¤‰ā¤œā¤ŧā¤° ā¤¨āĨ‡ Rocket.Chat ā¤•āĨ‹ ā¤¨ā¤¯ā¤ž ā¤ŸāĨˆā¤Ŧ ā¤–āĨ‹ā¤˛ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤°āĨ‹ā¤• ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "Your_workspace_is_ready": "ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤šāĨˆ 🎉", + "Zapier": "Zapier", + "registration.page.login.errors.wrongCredentials": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž ā¤¯ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤—ā¤ŧā¤˛ā¤¤ ā¤šāĨˆ", + "registration.page.login.errors.invalidEmail": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ˆā¤ŽāĨ‡ā¤˛", + "registration.page.login.errors.loginBlockedForIp": "ā¤‡ā¤¸ ā¤†ā¤ˆā¤ĒāĨ€ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "registration.page.login.errors.loginBlockedForUser": "ā¤‡ā¤¸ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤ĩā¤°āĨā¤ĻāĨā¤§ ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ", + "registration.page.login.errors.licenseUserLimitReached": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¤ā¤• ā¤Ēā¤šāĨā¤ā¤š ā¤—ā¤¯ā¤ž ā¤šāĨˆ.", + "registration.page.login.errors.AppUserNotAllowedToLogin": "ā¤ā¤Ē ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤¸āĨ€ā¤§āĨ‡ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆāĨ¤", + "registration.page.registration.waitActivationWarning": "ā¤‡ā¤¸ā¤¸āĨ‡ ā¤Ēā¤šā¤˛āĨ‡ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤° ā¤¸ā¤•āĨ‡ā¤‚, ā¤†ā¤Ēā¤•ā¤ž ā¤–ā¤žā¤¤ā¤ž ā¤•ā¤ŋā¤¸āĨ€ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤ŋā¤āĨ¤", + "registration.page.login.register": "ā¤…ā¤Ŧ ā¤¯ā¤šā¤žā¤‚? <1>ā¤ā¤• ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "registration.page.login.forgot": "ā¤…ā¤Ēā¤¨ā¤ž ā¤•āĨ‚ā¤Ÿ ā¤ļā¤ŦāĨā¤Ļ ā¤­āĨ‚ā¤˛ ā¤—ā¤?", + "registration.page.register.back": "ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤œā¤žā¤ā¤‚", + "registration.page.emailVerification.subTitle": "ā¤‡ā¤¸ ā¤¸ā¤°āĨā¤ĩā¤° ā¤•āĨ‹ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤¤āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨ ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤œā¤žā¤‚ā¤šāĨ‡ā¤‚āĨ¤", + "registration.page.emailVerification.sent": "ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤¨ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž, ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤…ā¤Ēā¤¨ā¤ž ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤œā¤žā¤‚ā¤šāĨ‡ā¤‚āĨ¤", + "registration.page.resetPassword.sent": "ā¤¯ā¤Ļā¤ŋ ā¤¯ā¤š ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤šāĨˆ, ā¤¤āĨ‹ ā¤šā¤Ž ā¤†ā¤Ēā¤•ā¤ž ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤¤ā¤°āĨ€ā¤•āĨ‡ ā¤Ēā¤° ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚ā¤—āĨ‡āĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‹ ā¤ļāĨ€ā¤˜āĨā¤° ā¤šāĨ€ ā¤•āĨ‹ā¤ˆ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤ĩā¤žā¤Ēā¤¸ ā¤†ā¤ā¤‚ ā¤”ā¤° ā¤ĒāĨā¤¨ā¤ƒ ā¤ĒāĨā¤°ā¤¯ā¤žā¤¸ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "registration.page.resetPassword.sendInstructions": "ā¤¨ā¤ŋā¤°āĨā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "registration.page.resetPassword.errors.invalidEmail": "ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤ˆā¤ŽāĨ‡ā¤˛", + "registration.page.poweredBy": "<1>Rocket.Chat ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤ŋā¤¤", + "registration.page.guest.chooseHowToJoin": "ā¤šāĨā¤¨āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤•āĨˆā¤¸āĨ‡ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨ā¤ž ā¤šā¤žā¤šā¤¤āĨ‡ ā¤šāĨˆā¤‚", + "registration.page.guest.loginWithRocketChat": "Rocket.Chat ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "registration.page.guest.continueAsGuest": "ā¤…ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤°āĨ€ ā¤°ā¤–āĨ‡ā¤‚", + "registration.component.welcome": "<1>Rocket.Chat ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤†ā¤Ēā¤•ā¤ž ā¤¸āĨā¤ĩā¤žā¤—ā¤¤ ā¤šāĨˆ", + "registration.component.login": "ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°āĨ‡ā¤‚", + "registration.component.login.userNotFound": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Žā¤ŋā¤˛ā¤ž", + "registration.component.login.incorrectPassword": "ā¤—ā¤˛ā¤¤ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "registration.component.switchLanguage": "<1>{{name}} ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚", + "registration.component.resetPassword": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤°āĨ€ā¤¸āĨ‡ā¤Ÿ", + "registration.component.form.emailOrUsername": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¯ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "registration.component.form.username": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "registration.component.form.name": "ā¤¨ā¤žā¤Ž", + "registration.component.form.nameOptional": "ā¤¨ā¤žā¤Ž: (ā¤ĩāĨˆā¤•ā¤˛āĨā¤Ēā¤ŋā¤•", + "registration.component.form.createAnAccount": "ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "registration.component.form.userAlreadyExist": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤•āĨ‹ā¤ˆ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤.", + "registration.component.form.emailAlreadyExists": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤šāĨ€ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ", + "registration.component.form.usernameAlreadyExists": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•ā¤ž ā¤¨ā¤žā¤Ž ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤•āĨ‹ā¤ˆ ā¤…ā¤¨āĨā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤•āĨā¤¤ā¤žā¤¨ā¤žā¤Ž ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤.", + "registration.component.form.invalidEmail": "ā¤Ļā¤°āĨā¤œ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤…ā¤Žā¤žā¤¨āĨā¤¯ ā¤šāĨˆ", + "registration.component.form.email": "ā¤ˆā¤ŽāĨ‡ā¤˛", + "registration.component.form.emailPlaceholder": "example@example.com", + "registration.component.form.password": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "registration.component.form.divider": "ā¤¯ā¤ž", + "registration.component.form.submit": "ā¤œā¤Žā¤ž ā¤•ā¤°ā¤¨ā¤ž", + "registration.component.form.requiredField": "ā¤¯ā¤š ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "registration.component.form.joinYourTeam": "ā¤…ā¤Ēā¤¨āĨ€ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "registration.component.form.reasonToJoin": "ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•ā¤ž ā¤•ā¤žā¤°ā¤Ŗ", + "registration.component.form.invalidConfirmPass": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤¸āĨ‡ ā¤ŽāĨ‡ā¤˛ ā¤¨ā¤šāĨ€ā¤‚ ā¤–ā¤žā¤¤ā¤ž", + "registration.component.form.confirmPassword": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°āĨ‡ā¤‚", + "registration.component.form.confirmation": "ā¤ĒāĨā¤ˇāĨā¤ŸāĨ€ā¤•ā¤°ā¤Ŗ", + "registration.component.form.sendConfirmationEmail": "ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "registration.component.form.register": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°ā¤ĩā¤žā¤¨ā¤ž", + "onboarding.component.form.requiredField": "ā¤¯ā¤š ā¤Ģā¤ŧāĨ€ā¤˛āĨā¤Ą ā¤†ā¤ĩā¤ļāĨā¤¯ā¤• ā¤šāĨˆ", + "onboarding.component.form.steps": "{{stepCount}} ā¤•ā¤ž ā¤šā¤°ā¤Ŗ {{currentStep}}", + "onboarding.component.form.action.back": "ā¤ĒāĨ€ā¤›āĨ‡", + "onboarding.component.form.action.next": "ā¤…ā¤—ā¤˛ā¤ž", + "onboarding.component.form.action.skip": "ā¤‡ā¤¸ ā¤¸āĨā¤ŸāĨ‡ā¤Ē ā¤•āĨ‹ ā¤›āĨ‹ā¤Ąā¤ŧ ā¤ĻāĨ‡ā¤‚", + "onboarding.component.form.action.register": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°ā¤ĩā¤žā¤¨ā¤ž", + "onboarding.component.form.action.registerWorkspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.component.form.action.registerOffline": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.component.form.action.confirm": "ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤•ā¤°ā¤¨ā¤ž", + "onboarding.component.form.action.pasteHere": "ā¤¯ā¤šā¤žā¤‚ ā¤šā¤ŋā¤Ēā¤•ā¤žā¤ā¤‚...", + "onboarding.component.form.action.completeRegistration": "ā¤ĒāĨ‚ā¤°ā¤ž ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ", + "onboarding.component.form.termsAndConditions": "ā¤ŽāĨˆā¤‚ <1>ā¤¨ā¤ŋā¤¯ā¤Ž ā¤ā¤ĩā¤‚ ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚ ā¤”ā¤° <3>ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¨āĨ€ā¤¤ā¤ŋ ā¤¸āĨ‡ ā¤¸ā¤šā¤Žā¤¤ ā¤šāĨ‚ā¤‚", + "onboarding.component.emailCodeFallback": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨā¤†? <1>ā¤ĒāĨā¤¨ā¤ƒ ā¤­āĨ‡ā¤œāĨ‡ā¤‚ ā¤¯ā¤ž <3>ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ŧā¤Ļā¤˛āĨ‡ā¤‚āĨ¤", + "onboarding.page.form.title": "ā¤†ā¤‡ā¤ ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤˛āĨ‰ā¤¨āĨā¤š ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.page.emailConfirmed.title": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ€ ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ!", + "onboarding.page.emailConfirmed.subtitle": "ā¤†ā¤Ē ā¤…ā¤Ēā¤¨āĨ‡ Rocket.Chat ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤Ēā¤° ā¤ĩā¤žā¤Ēā¤¸ ā¤˛āĨŒā¤Ÿ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚ - ā¤šā¤Žā¤¨āĨ‡ ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤˛āĨ‰ā¤¨āĨā¤š ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤šāĨˆāĨ¤", + "onboarding.page.checkYourEmail.title": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ€ ā¤œā¤žā¤ā¤š ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.page.checkYourEmail.subtitle": "ā¤†ā¤Ēā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤¸ā¤Ģā¤˛ā¤¤ā¤žā¤ĒāĨ‚ā¤°āĨā¤ĩā¤• ā¤­āĨ‡ā¤œ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤<1>ā¤…ā¤Ēā¤¨ā¤ž ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤‡ā¤¨ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤œā¤žā¤‚ā¤šāĨ‡ā¤‚āĨ¤<1>ā¤˛ā¤ŋā¤‚ā¤• 30 ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "onboarding.page.confirmationProcess.title": "ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋ ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤šāĨˆ", + "onboarding.page.cloudDescription.title": "ā¤†ā¤‡ā¤ ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤”ā¤° <1>14-ā¤Ļā¤ŋā¤ĩā¤¸āĨ€ā¤¯ ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤˛āĨ‰ā¤¨āĨā¤š ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.page.cloudDescription.tryGold": "14 ā¤Ļā¤ŋā¤¨āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤Žā¤žā¤°ā¤ž ā¤¸ā¤°āĨā¤ĩāĨ‹ā¤¤āĨā¤¤ā¤Ž ā¤—āĨ‹ā¤˛āĨā¤Ą ā¤ĒāĨā¤˛ā¤žā¤¨ ā¤¨ā¤ŋā¤ƒā¤ļāĨā¤˛āĨā¤• ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤", + "onboarding.page.cloudDescription.numberOfIntegrations": "1,000 ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ", + "onboarding.page.cloudDescription.availability": "ā¤‰ā¤šāĨā¤š ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ā¤¤ā¤ž", + "onboarding.page.cloudDescription.auditing": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤ĒāĨˆā¤¨ā¤˛/ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤˛āĨ‰ā¤—", + "onboarding.page.cloudDescription.engagement": "ā¤¸ā¤—ā¤žā¤ˆ ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą", + "onboarding.page.cloudDescription.ldap": "ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€ ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤¸ā¤ŋā¤‚ā¤•", + "onboarding.page.cloudDescription.omnichannel": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž", + "onboarding.page.cloudDescription.sla": "ā¤ā¤¸ā¤ā¤˛ā¤: ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž", + "onboarding.page.cloudDescription.push": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚", + "onboarding.page.cloudDescription.goldIncludes": "* ā¤—āĨ‹ā¤˛āĨā¤Ąā¤¨ ā¤ĒāĨā¤˛ā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤¨āĨā¤¯ ā¤ĒāĨā¤˛ā¤žā¤¨ ā¤•āĨ€ ā¤¸ā¤­āĨ€ ā¤¸āĨā¤ĩā¤ŋā¤§ā¤žā¤ā¤ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨˆā¤‚", + "onboarding.page.alreadyHaveAccount": "ā¤•āĨā¤¯ā¤ž ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤Ēā¤šā¤˛āĨ‡ ā¤¸āĨ‡ ā¤ā¤• ā¤–ā¤žā¤¤ā¤ž ā¤ŽāĨŒā¤œāĨ‚ā¤Ļ ā¤šāĨˆ? <1>ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "onboarding.page.invalidLink.title": "ā¤†ā¤Ēā¤•ā¤ž ā¤˛ā¤ŋā¤‚ā¤• ā¤…ā¤Ŧ ā¤Žā¤žā¤¨āĨā¤¯ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "onboarding.page.invalidLink.content": "ā¤ā¤¸ā¤ž ā¤˛ā¤—ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤†ā¤Ē ā¤Ēā¤šā¤˛āĨ‡ ā¤šāĨ€ ā¤†ā¤Žā¤‚ā¤¤āĨā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤° ā¤šāĨā¤•āĨ‡ ā¤šāĨˆā¤‚. ā¤¯ā¤š ā¤ā¤•ā¤˛ ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¤āĨˆā¤¯ā¤žā¤° ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤¨ā¤ ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "onboarding.page.invalidLink.button.text": "ā¤¨ā¤ ā¤˛ā¤ŋā¤‚ā¤• ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.page.requestTrial.title": "<1>30-ā¤Ļā¤ŋā¤ĩā¤¸āĨ€ā¤¯ ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•ā¤ž ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.page.requestTrial.subtitle": "30 ā¤Ļā¤ŋā¤¨āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤Žā¤žā¤°āĨ€ ā¤¸ā¤°āĨā¤ĩāĨ‹ā¤¤āĨā¤¤ā¤Ž ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤¨ā¤ŋā¤ƒā¤ļāĨā¤˛āĨā¤• ā¤†ā¤œā¤ŧā¤Žā¤žā¤ā¤", + "onboarding.page.magicLinkEmail.title": "ā¤šā¤Žā¤¨āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤ā¤• ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤˛ā¤ŋā¤‚ā¤• ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•ā¤ŋā¤¯ā¤ž ā¤šāĨˆ", + "onboarding.page.magicLinkEmail.subtitle": "ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤žā¤‡ā¤¨ ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤Žā¤¨āĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤­āĨ€ ā¤œāĨ‹ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤ž ā¤šāĨˆ ā¤‰ā¤¸ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤˛ā¤ŋā¤‚ā¤• ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤ <1>ā¤˛ā¤ŋā¤‚ā¤• 30 ā¤Žā¤ŋā¤¨ā¤Ÿ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤šāĨ‹ ā¤œā¤žā¤ā¤—ā¤žāĨ¤", + "onboarding.form.adminInfoForm.title": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "onboarding.form.adminInfoForm.subtitle": "ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ĒāĨā¤°āĨ‹ā¤Ģā¤ŧā¤žā¤‡ā¤˛ ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤šā¤ŽāĨ‡ā¤‚ ā¤‡ā¤¸ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "onboarding.form.adminInfoForm.fields.fullName.label": "ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤žā¤Ž", + "onboarding.form.adminInfoForm.fields.fullName.placeholder": "ā¤Ēā¤šā¤˛ā¤ž ā¤”ā¤° ā¤†ā¤–ā¤ŋā¤°āĨ€ ā¤¨ā¤žā¤Ž", + "onboarding.form.adminInfoForm.fields.username.label": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "onboarding.form.adminInfoForm.fields.username.placeholder": "@ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¨ā¤žā¤Ž", + "onboarding.form.adminInfoForm.fields.email.label": "ā¤ˆā¤ŽāĨ‡ā¤˛", + "onboarding.form.adminInfoForm.fields.email.placeholder": "ā¤ˆā¤ŽāĨ‡ā¤˛", + "onboarding.form.adminInfoForm.fields.password.label": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą", + "onboarding.form.adminInfoForm.fields.password.placeholder": "ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "onboarding.form.adminInfoForm.fields.keepPosted.label": "ā¤ŽāĨā¤āĨ‡ Rocket.Chat ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤Ŧā¤¤ā¤žā¤¤āĨ‡ ā¤°ā¤šāĨ‡ā¤‚", + "onboarding.form.awaitConfirmationForm.title": "ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž", + "onboarding.form.awaitConfirmationForm.content.securityCode": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‹ā¤Ą", + "onboarding.form.awaitConfirmationForm.content.sentEmail": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ā¤• ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ <1>{{emailAddress}} ā¤Ēā¤° ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤ ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‹ā¤Ą ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‹ā¤Ą ā¤¸āĨ‡ ā¤ŽāĨ‡ā¤˛ ā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "onboarding.form.organizationInfoForm.title": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•āĨ€ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "onboarding.form.organizationInfoForm.subtitle": "ā¤šā¤ŽāĨ‡ā¤‚ ā¤¯ā¤š ā¤œā¤žā¤¨ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž ā¤•ā¤ŋ ā¤†ā¤Ē ā¤•āĨŒā¤¨ ā¤šāĨˆā¤‚.", + "onboarding.form.organizationInfoForm.fields.organizationName.label": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "onboarding.form.organizationInfoForm.fields.organizationName.placeholder": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•ā¤ž ā¤¨ā¤žā¤Ž", + "onboarding.form.organizationInfoForm.fields.organizationType.label": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤•ā¤žā¤°", + "onboarding.form.organizationInfoForm.fields.organizationType.placeholder": "ā¤šāĨā¤¨ā¤¨ā¤ž", + "onboarding.form.organizationInfoForm.fields.organizationIndustry.label": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤‰ā¤ĻāĨā¤¯āĨ‹ā¤—", + "onboarding.form.organizationInfoForm.fields.organizationIndustry.placeholder": "ā¤šāĨā¤¨ā¤¨ā¤ž", + "onboarding.form.organizationInfoForm.fields.organizationSize.label": "ā¤¸ā¤‚ā¤—ā¤ ā¤¨ ā¤•ā¤ž ā¤†ā¤•ā¤žā¤°", + "onboarding.form.organizationInfoForm.fields.organizationSize.placeholder": "ā¤šāĨā¤¨ā¤¨ā¤ž", + "onboarding.form.organizationInfoForm.fields.country.label": "ā¤ĻāĨ‡ā¤ļ", + "onboarding.form.organizationInfoForm.fields.country.placeholder": "ā¤šāĨā¤¨ā¤¨ā¤ž", + "onboarding.form.registerOfflineForm.title": "ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.form.registerOfflineForm.copyStep.description": "ā¤¯ā¤Ļā¤ŋ ā¤•ā¤ŋā¤¸āĨ€ ā¤•ā¤žā¤°ā¤Ŗ ā¤¸āĨ‡ ā¤†ā¤Ēā¤•ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤‡ā¤‚ā¤Ÿā¤°ā¤¨āĨ‡ā¤Ÿ ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ ā¤Ēā¤žā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤‡ā¤¨ ā¤šā¤°ā¤ŖāĨ‹ā¤‚ ā¤•ā¤ž ā¤Ēā¤žā¤˛ā¤¨ ā¤•ā¤°āĨ‡ā¤‚:<1>1. ā¤¯ā¤šā¤žā¤‚ ā¤œā¤žā¤ā¤‚: <2>cloud.rocket.chat > ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤”ā¤° \"<3>ā¤¸āĨā¤ĩā¤¯ā¤‚-ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚\"<4>2 ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤ “<5>ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤œā¤žā¤°āĨ€ ā¤°ā¤–āĨ‡ā¤‚”<6>3 ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤ Cloud.rocket.chat ā¤ŽāĨ‡ā¤‚ <7>ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤¸ā¤‚ā¤ĩā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚, ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤ŦāĨ‰ā¤•āĨā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤ŸāĨ‹ā¤•ā¤¨ ā¤ĒāĨ‡ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.form.registerOfflineForm.pasteStep.description": "1. <1>cloud.rocket.chat ā¤ŽāĨ‡ā¤‚ ā¤œāĨ‡ā¤¨ā¤°āĨ‡ā¤ŸāĨ‡ā¤Ą ā¤ŸāĨ‡ā¤•āĨā¤¸āĨā¤Ÿ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤…ā¤Ēā¤¨āĨ€ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ĒāĨā¤°ā¤•āĨā¤°ā¤ŋā¤¯ā¤ž ā¤ĒāĨ‚ā¤°āĨ€ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¨āĨ€ā¤šāĨ‡ ā¤ĒāĨ‡ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.form.registerOfflineForm.fields.registrationToken.inputLabel": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ŸāĨ‹ā¤•ā¤¨", + "onboarding.form.registeredServerForm.title": "ā¤…ā¤Ēā¤¨ā¤ž ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.form.registeredServerForm.included.push": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤", + "onboarding.form.registeredServerForm.included.externalProviders": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤ĒāĨā¤°ā¤Ļā¤žā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ā¤•āĨ€ā¤•ā¤°ā¤Ŗ (ā¤ĩāĨā¤šā¤žā¤ŸāĨā¤¸ā¤ā¤Ē, ā¤ĢāĨ‡ā¤¸ā¤ŦāĨā¤•, ā¤ŸāĨ‡ā¤˛āĨ€ā¤—āĨā¤°ā¤žā¤Ž, ā¤ŸāĨā¤ĩā¤ŋā¤Ÿā¤°)", + "onboarding.form.registeredServerForm.included.apps": "ā¤Ŧā¤žā¤œā¤ŧā¤žā¤° ā¤ā¤ĒāĨā¤¸ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š", + "onboarding.form.registeredServerForm.fields.accountEmail.inputLabel": "ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤ˆā¤ŽāĨ‡ā¤˛", + "onboarding.form.registeredServerForm.fields.accountEmail.inputPlaceholder": "ā¤œā¤žā¤°āĨ€ ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ąā¤žā¤˛āĨ‡ā¤‚", + "onboarding.form.registeredServerForm.keepInformed": "ā¤ŽāĨā¤āĨ‡ ā¤¸ā¤Žā¤žā¤šā¤žā¤°āĨ‹ā¤‚ ā¤”ā¤° ā¤˜ā¤Ÿā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‚ā¤šā¤ŋā¤¤ ā¤°ā¤–āĨ‡ā¤‚", + "onboarding.form.registeredServerForm.registerLater": "ā¤Ŧā¤žā¤Ļ ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚", + "onboarding.form.registeredServerForm.notConnectedToInternet": "ā¤¸ā¤°āĨā¤ĩā¤° ā¤‡ā¤‚ā¤Ÿā¤°ā¤¨āĨ‡ā¤Ÿ ā¤¸āĨ‡ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ, ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‘ā¤Ģā¤ŧā¤˛ā¤žā¤‡ā¤¨ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "onboarding.form.registeredServerForm.registrationEngagement": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ, ā¤Žā¤šā¤¤āĨā¤ĩā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤•ā¤Žā¤œāĨ‹ā¤°ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤”ā¤° ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤•āĨ‹ā¤ˆ ā¤¸ā¤‚ā¤ĩāĨ‡ā¤Ļā¤¨ā¤ļāĨ€ā¤˛ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĄāĨ‡ā¤Ÿā¤ž ā¤¸ā¤žā¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ; Rocket.Chat ā¤Ēā¤° ā¤­āĨ‡ā¤œāĨ‡ ā¤—ā¤ ā¤†ā¤ā¤•ā¤Ąā¤ŧāĨ‡ ā¤†ā¤Ēā¤•āĨ‹ ā¤ĒāĨā¤°ā¤ļā¤žā¤¸ā¤¨ ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤­āĨ€ā¤¤ā¤° ā¤Ļā¤ŋā¤–ā¤žā¤ˆ ā¤ĻāĨ‡ā¤‚ā¤—āĨ‡āĨ¤", + "onboarding.form.registeredServerForm.registrationKeepInformed": "ā¤‡ā¤¸ ā¤ĢāĨ‰ā¤°āĨā¤Ž ā¤•āĨ‹ ā¤¸ā¤Ŧā¤Žā¤ŋā¤Ÿ ā¤•ā¤°ā¤•āĨ‡ ā¤†ā¤Ē ā¤šā¤Žā¤žā¤°āĨ€ <1>ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¨āĨ€ā¤¤ā¤ŋ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤°, Rocket.Chat ā¤‰ā¤¤āĨā¤Ēā¤žā¤ĻāĨ‹ā¤‚, ā¤˜ā¤Ÿā¤¨ā¤žā¤“ā¤‚ ā¤”ā¤° ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸ā¤šā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤†ā¤Ē ā¤•ā¤ŋā¤¸āĨ€ ā¤­āĨ€ ā¤¸ā¤Žā¤¯ ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤ĩā¤žā¤Ēā¤¸ ā¤˛āĨ‡ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "onboarding.form.standaloneServerForm.title": "ā¤¸āĨā¤ŸāĨˆā¤‚ā¤Ąā¤…ā¤˛āĨ‹ā¤¨ ā¤¸ā¤°āĨā¤ĩā¤° ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ", + "onboarding.form.standaloneServerForm.servicesUnavailable": "ā¤•āĨā¤› ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤ ā¤…ā¤¨āĨā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨ‹ā¤‚ā¤—āĨ€ ā¤¯ā¤ž ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤¸āĨ‡ā¤Ÿā¤…ā¤Ē ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨ‹ā¤—āĨ€", + "onboarding.form.standaloneServerForm.publishOwnApp": "ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤…ā¤Ēā¤¨ā¤ž ā¤¸āĨā¤ĩā¤¯ā¤‚ ā¤•ā¤ž ā¤ā¤Ē Google Play ā¤”ā¤° App Store ā¤Ēā¤° ā¤¸ā¤‚ā¤•ā¤˛ā¤ŋā¤¤ ā¤”ā¤° ā¤ĒāĨā¤°ā¤•ā¤žā¤ļā¤ŋā¤¤ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž", + "onboarding.form.standaloneServerForm.manuallyIntegrate": "ā¤Ŧā¤žā¤šā¤°āĨ€ ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤ā¤•āĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Something_Went_Wrong": "ā¤•āĨā¤› ā¤—ā¤˛ā¤¤ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "Toolbox_room_actions": "ā¤ĒāĨā¤°ā¤žā¤Ĩā¤Žā¤ŋā¤• ā¤•ā¤•āĨā¤ˇ ā¤•āĨā¤°ā¤ŋā¤¯ā¤žā¤ā¤", + "Theme_light": "ā¤°āĨ‹ā¤ļā¤¨āĨ€", + "Theme_light_description": "ā¤ĻāĨƒā¤ˇāĨā¤Ÿā¤ŋā¤Ŧā¤žā¤§ā¤ŋā¤¤ ā¤ĩāĨā¤¯ā¤•āĨā¤¤ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤§ā¤ŋā¤• ā¤¸āĨā¤˛ā¤­ ā¤”ā¤° ā¤…ā¤šāĨā¤›āĨ€ ā¤°āĨ‹ā¤ļā¤¨āĨ€ ā¤ĩā¤žā¤˛āĨ‡ ā¤ĩā¤žā¤¤ā¤žā¤ĩā¤°ā¤Ŗ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤• ā¤…ā¤šāĨā¤›ā¤ž ā¤ĩā¤ŋā¤•ā¤˛āĨā¤ĒāĨ¤", + "Theme_dark": "ā¤…ā¤ā¤§āĨ‡ā¤°ā¤ž", + "Theme_dark_description": "ā¤¸āĨā¤•āĨā¤°āĨ€ā¤¨ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤‰ā¤¤āĨā¤¸ā¤°āĨā¤œā¤ŋā¤¤ ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ ā¤•āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤•āĨ‹ ā¤•ā¤Ž ā¤•ā¤°ā¤•āĨ‡ ā¤•ā¤Ž ā¤°āĨ‹ā¤ļā¤¨āĨ€ ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤‚ ā¤†ā¤‚ā¤–āĨ‹ā¤‚ ā¤•ā¤ž ā¤¤ā¤¨ā¤žā¤ĩ ā¤”ā¤° ā¤Ĩā¤•ā¤žā¤¨ ā¤•ā¤Ž ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Enable_of_limit_apps_currently_enabled": "** ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ {{limit}} {{context}} ā¤ā¤ĒāĨā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ {{limit}} ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚āĨ¤**\n \nā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž {{limit}} {{context}} ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤\n \n**{{appName}} ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤** ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ {{context}} ā¤ā¤Ē ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚ ā¤¯ā¤ž ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Enable_of_limit_apps_currently_enabled_exceeded": "** ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ {{limit}} {{context}} ā¤ā¤ĒāĨā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ {{limit}} ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚āĨ¤**\n \nā¤¸ā¤žā¤ŽāĨā¤Ļā¤žā¤¯ā¤ŋā¤• ā¤ā¤Ē ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤Ēā¤žā¤° ā¤šāĨ‹ ā¤—ā¤ˆ ā¤šāĨˆ.\n \nā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž {{limit}} {{context}} ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤\n \n**{{appName}} ā¤Ąā¤ŋā¤Ģā¤ŧāĨ‰ā¤˛āĨā¤Ÿ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ā¤—ā¤žāĨ¤** ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž {{exceed}} ā¤…ā¤¨āĨā¤¯ {{context}} ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž ā¤¯ā¤ž ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ĒāĨā¤˛ā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "Workspaces_on_Community_edition_install_app": "ā¤¸ā¤žā¤ŽāĨā¤Ļā¤žā¤¯ā¤ŋā¤• ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž {{limit}} {{context}} ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ĒāĨā¤˛ā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Apps_Currently_Enabled": "{{limit}} {{context}} ā¤ŽāĨ‡ā¤‚ ā¤¸āĨ‡ {{limit}} ā¤ā¤ĒāĨā¤¸ ā¤ĩā¤°āĨā¤¤ā¤Žā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆā¤‚", + "Disable_another_app": "ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤•ā¤ŋā¤¸āĨ€ ā¤…ā¤¨āĨā¤¯ ā¤ā¤Ē ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°āĨ‡ā¤‚ ā¤¯ā¤ž ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ĒāĨā¤˛ā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Upload_anyway": "ā¤Ģā¤ŋā¤° ā¤­āĨ€ ā¤…ā¤Ēā¤˛āĨ‹ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "App_limit_reached": "ā¤ā¤Ē ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤ĒāĨ‚ā¤°āĨ€ ā¤šāĨ‹ ā¤—ā¤ˆ", + "App_limit_exceeded": "ā¤ā¤Ē ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤Ēā¤žā¤° ā¤šāĨ‹ ā¤—ā¤ˆ", + "Private_apps_limit_reached": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤ĒāĨ‚ā¤°āĨ€ ā¤šāĨ‹ ā¤—ā¤ˆ", + "Private_apps_limit_exceeded": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤Ēā¤žā¤° ā¤šāĨ‹ ā¤—ā¤ˆ", + "Disable_at_least_more_apps": "ā¤‡ā¤¸ ā¤ā¤Ē ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ēā¤•āĨ‹ ā¤•ā¤Ž ā¤¸āĨ‡ ā¤•ā¤Ž {{numberOfExceededApps}} ā¤…ā¤¨āĨā¤¯ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤ž ā¤¯ā¤ž ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ĒāĨā¤˛ā¤žā¤¨ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "Community_Private_apps_limit_exceeded": "ā¤¸ā¤žā¤ŽāĨā¤Ļā¤žā¤¯ā¤ŋā¤• ā¤ā¤Ē ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤Ēā¤žā¤° ā¤šāĨ‹ ā¤—ā¤ˆ ā¤šāĨˆ.", + "Theme_match_system": "ā¤Žā¤ŋā¤˛ā¤žā¤¨ ā¤ĒāĨā¤°ā¤Ŗā¤žā¤˛āĨ€", + "Theme_match_system_description": "ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤†ā¤Ēā¤•āĨ‡ ā¤¸ā¤ŋā¤¸āĨā¤Ÿā¤Ž ā¤•āĨ‡ ā¤¸āĨā¤ĩā¤°āĨ‚ā¤Ē ā¤•ā¤ž ā¤Žā¤ŋā¤˛ā¤žā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Theme_high_contrast": "ā¤šā¤žā¤ˆ ā¤•āĨ‰ā¤¨āĨā¤ŸāĨā¤°ā¤žā¤¸āĨā¤Ÿ", + "Theme_high_contrast_description": "ā¤ŦāĨ‹ā¤˛āĨā¤Ą ā¤°ā¤‚ā¤—āĨ‹ā¤‚ ā¤”ā¤° ā¤¤āĨ€ā¤ĩāĨā¤° ā¤ĩā¤ŋā¤°āĨ‹ā¤§ā¤žā¤­ā¤žā¤¸āĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž ā¤¤ā¤žā¤¨ā¤ĩā¤žā¤˛ā¤ž ā¤ĩā¤ŋā¤­āĨ‡ā¤Ļā¤¨ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤Ēā¤šāĨā¤‚ā¤š ā¤ĒāĨā¤°ā¤Ļā¤žā¤¨ ā¤•ā¤°ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Highlighted_chosen_word": "ā¤šā¤¯ā¤¨ā¤ŋā¤¤ ā¤ļā¤ŦāĨā¤Ļ ā¤Ēā¤° ā¤ĒāĨā¤°ā¤•ā¤žā¤ļ ā¤Ąā¤žā¤˛ā¤ž ā¤—ā¤¯ā¤ž", + "Join_your_team": "ā¤…ā¤Ēā¤¨āĨ€ ā¤ŸāĨ€ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤ļā¤žā¤Žā¤ŋā¤˛ ā¤šāĨ‹ā¤‚", + "Create_a_password": "ā¤ā¤• ā¤Ēā¤žā¤¸ā¤ĩā¤°āĨā¤Ą ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Create_an_account": "ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤ā¤‚", + "Get_all_apps": "ā¤ĩāĨ‡ ā¤¸ā¤­āĨ€ ā¤ā¤ĒāĨā¤¸ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤œā¤ŋā¤¨ā¤•āĨ€ ā¤†ā¤Ēā¤•āĨ€ ā¤ŸāĨ€ā¤Ž ā¤•āĨ‹ ā¤†ā¤ĩā¤ļāĨā¤¯ā¤•ā¤¤ā¤ž ā¤šāĨˆ", + "Workspaces_on_community_edition_trial_on": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž 5 ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ā¤ĒāĨā¤¸ ā¤”ā¤° 3 ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤‡ā¤¨ ā¤¸āĨ€ā¤Žā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤œ ā¤šāĨ€ ā¤¨ā¤ŋā¤ƒā¤ļāĨā¤˛āĨā¤• ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤ļāĨā¤°āĨ‚ ā¤•ā¤°āĨ‡ā¤‚!", + "Workspaces_on_community_edition_trial_off": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž 5 ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ā¤ĒāĨā¤¸ ā¤”ā¤° 3 ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¸āĨ€ā¤Žā¤žā¤ā¤‚ ā¤šā¤Ÿā¤žā¤¨āĨ‡ ā¤”ā¤° ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤¸āĨā¤Ēā¤°ā¤šā¤žā¤°āĨā¤œ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "No_private_apps_installed": "ā¤•āĨ‹ā¤ˆ ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤¨ā¤šāĨ€ā¤‚", + "Private_apps_are_side-loaded": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤žā¤‡ā¤Ą-ā¤˛āĨ‹ā¤ĄāĨ‡ā¤Ą ā¤šāĨˆā¤‚ ā¤”ā¤° ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤Ēā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆā¤‚āĨ¤", + "Chat_transcript": "ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤–", + "Conversational_transcript": "ā¤¸ā¤‚ā¤ĩā¤žā¤ĻāĨ€ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤–", + "Conversations_by_agents": "ā¤ā¤œāĨ‡ā¤‚ā¤ŸāĨ‹ā¤‚ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Conversations_by_channel": "ā¤šāĨˆā¤¨ā¤˛ ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Conversations_by_department": "ā¤ĩā¤ŋā¤­ā¤žā¤— ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Conversations_by_status": "ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Conversations_by_tag": "ā¤ŸāĨˆā¤— ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤", + "Send_conversation_transcript_via_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Always_send_the_transcript_to_contacts_at_the_end_of_the_conversations": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œāĨ‡ā¤‚āĨ¤", + "Export_conversation_transcript_as_PDF": "ā¤ĩā¤žā¤°āĨā¤¤ā¤žā¤˛ā¤žā¤Ē ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤•āĨ‹ ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Omnichannel_transcript_email": "ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œāĨ‡ā¤‚.", + "Accounts_Default_User_Preferences_omnichannelTranscriptEmail_Description": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•āĨ‹ā¤‚ ā¤•āĨ‹ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œāĨ‡ā¤‚āĨ¤", + "Omnichannel_transcript_pdf": "ā¤šāĨˆā¤Ÿ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤•āĨ‹ ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Accounts_Default_User_Preferences_omnichannelTranscriptPDF_Description": "ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‡ ā¤…ā¤‚ā¤¤ ā¤ŽāĨ‡ā¤‚ ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤•āĨ‹ ā¤šā¤ŽāĨ‡ā¤ļā¤ž ā¤ĒāĨ€ā¤ĄāĨ€ā¤ā¤Ģ ā¤•āĨ‡ ā¤°āĨ‚ā¤Ē ā¤ŽāĨ‡ā¤‚ ā¤¨ā¤ŋā¤°āĨā¤¯ā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Contact_email": "ā¤ˆ - ā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡", + "Customer": "ā¤—āĨā¤°ā¤žā¤šā¤•", + "Time": "ā¤¸ā¤Žā¤¯", + "Omnichannel_Agent": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤ā¤œāĨ‡ā¤‚ā¤Ÿ", + "This_attachment_is_not_supported": "ā¤…ā¤¨āĨā¤˛ā¤—āĨā¤¨ā¤• ā¤ĒāĨā¤°ā¤žā¤°āĨ‚ā¤Ē ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Send_transcript": "ā¤ĒāĨā¤°ā¤¤ā¤ŋā¤˛āĨ‡ā¤– ā¤­āĨ‡ā¤œāĨ‡ā¤‚", + "Undo_request": "ā¤…ā¤¨āĨā¤°āĨ‹ā¤§ ā¤ĒāĨ‚ā¤°āĨā¤ĩā¤ĩā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "No_permission": "ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤¨ā¤šāĨ€ā¤‚", + "Community_cap_description": "ā¤¸ā¤žā¤ŽāĨā¤Ļā¤žā¤¯ā¤ŋā¤• ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ 200 ā¤¸ā¤Žā¤ĩā¤°āĨā¤¤āĨ€ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆāĨ¤ ā¤¯ā¤Ļā¤ŋ ā¤¯ā¤š ā¤¸āĨ€ā¤Žā¤ž ā¤Ēā¤žā¤° ā¤šāĨ‹ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆ ā¤¤āĨ‹ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ā¤•-ā¤ĻāĨ‚ā¤¸ā¤°āĨ‡ ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤–ā¤¨ā¤ž ā¤¸ā¤‚ā¤­ā¤ĩ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤žāĨ¤ ā¤‡ā¤¸ā¤¸āĨ‡ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤­āĨ‡ā¤œā¤¨āĨ‡ ā¤”ā¤° ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤Ēā¤° ā¤•āĨ‹ā¤ˆ ā¤ĒāĨā¤°ā¤­ā¤žā¤ĩ ā¤¨ā¤šāĨ€ā¤‚ ā¤Ēā¤Ąā¤ŧā¤¤ā¤ž ā¤šāĨˆ.", + "Premium_cap_description": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤“ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸āĨ‡ā¤ĩā¤ž ā¤¸āĨ€ā¤Žā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "Service_status": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "More_about_Premium_plans": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤• ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€", + "Presence_service_cap": "ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸āĨ‡ā¤ĩā¤ž ā¤•āĨˆā¤Ē", + "User_Status": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "User_status_menu": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ŽāĨ‡ā¤¨āĨ‚", + "Active_connections": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨", + "Presence_service": "ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸āĨ‡ā¤ĩā¤ž", + "Presence_broadcast_disabled": "ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ", + "Presence_broadcast_disabled_Description": "ā¤‡ā¤¸ā¤¸āĨ‡ ā¤Ēā¤¤ā¤ž ā¤šā¤˛ā¤¤ā¤ž ā¤šāĨˆ ā¤•ā¤ŋ ā¤•āĨā¤¯ā¤ž ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤ĒāĨā¤°ā¤¸ā¤žā¤°ā¤Ŗ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆāĨ¤ ā¤ā¤¸ā¤ž ā¤¤ā¤Ŧ ā¤šāĨ‹ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ā¤œā¤Ŧ ā¤†ā¤Ēā¤•āĨ‡ ā¤Ēā¤žā¤¸ ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ ā¤”ā¤° 200 ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤¸ā¤Žā¤ĩā¤°āĨā¤¤āĨ€ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤šāĨˆā¤‚āĨ¤", + "New_custom_status": "ā¤¨ā¤ˆ ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "Service_disabled": "ā¤¸āĨ‡ā¤ĩā¤ž ā¤…ā¤Ŧ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ", + "Service_disabled_description": "ā¤œā¤Ŧ ā¤¤ā¤• ā¤ā¤• ā¤šāĨ€ ā¤¸ā¤Žā¤¯ ā¤ŽāĨ‡ā¤‚ 200 ā¤¸āĨ‡ ā¤•ā¤Ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤¨ ā¤šāĨ‹ā¤‚ ā¤¤ā¤Ŧ ā¤¤ā¤• ā¤†ā¤Ē ā¤‡ā¤¸āĨ‡ ā¤ĻāĨ‹ā¤Ŧā¤žā¤°ā¤ž ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡", + "User_status_disabled": "ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤¨ ā¤•āĨ‹ ā¤Ŧā¤¨ā¤žā¤ ā¤°ā¤–ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤ĻāĨ€ ā¤—ā¤ˆ ā¤šāĨˆāĨ¤", + "User_status_disabled_learn_more": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤…ā¤•āĨā¤ˇā¤Ž", + "User_status_disabled_learn_more_description": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤• ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤•āĨ‡ ā¤•ā¤žā¤°ā¤Ŗ, ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤•āĨ€ ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤•āĨ‹ ā¤¸ā¤‚ā¤­ā¤žā¤˛ā¤¨āĨ‡ ā¤ĩā¤žā¤˛āĨ€ ā¤¸āĨ‡ā¤ĩā¤ž ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆāĨ¤ ā¤ĩāĨā¤¯ā¤ĩā¤¸āĨā¤Ĩā¤žā¤Ēā¤• ā¤‡ā¤¸āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤ŽāĨ‡ā¤‚ ā¤ŽāĨˆā¤¨āĨā¤¯āĨā¤…ā¤˛ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤ĒāĨā¤¨ā¤ƒ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Go_to_workspace_settings": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸āĨ‡ā¤Ÿā¤ŋā¤‚ā¤—āĨā¤¸ ā¤Ēā¤° ā¤œā¤žā¤ā¤", + "User_status_temporarily_disabled": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤…ā¤¸āĨā¤Ĩā¤žā¤¯āĨ€ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆ", + "Use_token": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•ā¤ž ā¤ĒāĨā¤°ā¤¯āĨ‹ā¤— ā¤•ā¤°āĨ‡ā¤‚", + "Disconnected": "ā¤Ąā¤ŋā¤¸āĨā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž", + "Disconnect_workspace": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤•āĨ‹ ā¤Ąā¤ŋā¤¸āĨā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Awaiting_confirmation": "ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤•āĨ€ ā¤ĒāĨā¤°ā¤¤āĨ€ā¤•āĨā¤ˇā¤ž", + "Security_code": "ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‹ā¤Ą", + "Registration_Token": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤ŸāĨ‹ā¤•ā¤¨", + "RegisterWorkspace_Button": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "ConnectWorkspace_Button": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚", + "Workspace_registered": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤", + "Workspace_not_connected": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Token_Not_Recognized": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤Ēā¤šā¤šā¤žā¤¨ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤—ā¤¯ā¤ž", + "RegisterWorkspace_Registered_Description": "ā¤¯āĨ‡ ā¤¸āĨ‡ā¤ĩā¤žā¤ā¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚", + "RegisterWorkspace_Registered_Subtitle": "ā¤šāĨ‚ā¤ā¤•ā¤ŋ ā¤¯ā¤š ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤šāĨˆ ā¤‡ā¤¸ā¤˛ā¤ŋā¤ ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆ", + "RegisterWorkspace_Registered_Benefits": "ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ, ā¤Žā¤šā¤¤āĨā¤ĩā¤ĒāĨ‚ā¤°āĨā¤Ŗ ā¤•ā¤Žā¤œāĨ‹ā¤°ā¤ŋā¤¯āĨ‹ā¤‚ ā¤•āĨ€ ā¤…ā¤§ā¤ŋā¤¸āĨ‚ā¤šā¤¨ā¤ž ā¤”ā¤° ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸āĨ‡ā¤ĩā¤žā¤“ā¤‚ ā¤¤ā¤• ā¤Ēā¤šāĨā¤‚ā¤š ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤•āĨ‹ā¤ˆ ā¤­āĨ€ ā¤¸ā¤‚ā¤ĩāĨ‡ā¤Ļā¤¨ā¤ļāĨ€ā¤˛ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ĄāĨ‡ā¤Ÿā¤ž Rocket.Chat ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤žā¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "RegisterWorkspace_NotRegistered_Title": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "RegisterWorkspace_NotRegistered_Subtitle": "ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "RegisterWorkspace_NotConnected_Title": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤Ąā¤ŋā¤¸āĨā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤šāĨ‹ ā¤—ā¤¯ā¤ž", + "RegisterWorkspace_NotConnected_Subtitle": "ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "RegisterWorkspace_NotRegistered_Description": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤žā¤­", + "RegisterWorkspace_Disconnect_Subtitle": "ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤Ąā¤ŋā¤¸āĨā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤¸āĨ‡ ā¤¨ā¤ŋā¤ŽāĨā¤¨ā¤˛ā¤ŋā¤–ā¤ŋā¤¤ ā¤•āĨ€ ā¤šā¤žā¤¨ā¤ŋ ā¤šāĨ‹ā¤—āĨ€", + "RegisterWorkspace_Disconnect_Error": "ā¤Ąā¤ŋā¤¸āĨā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤šāĨā¤ˆ", + "RegisterWorkspace_Features_MobileNotifications_Title": "ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤", + "RegisterWorkspace_Features_MobileNotifications_Description": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤‰ā¤¨ā¤•āĨ‡ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤‰ā¤Ēā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤Ēā¤° ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "RegisterWorkspace_Features_MobileNotifications_Disconnect": "ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‡ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤…ā¤Ŧ ā¤…ā¤Ēā¤¨āĨ‡ ā¤ŽāĨ‹ā¤Ŧā¤žā¤‡ā¤˛ ā¤‰ā¤Ēā¤•ā¤°ā¤ŖāĨ‹ā¤‚ ā¤Ēā¤° ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤‚ā¤—āĨ€āĨ¤", + "RegisterWorkspace_Features_Marketplace_Title": "ā¤Ŧā¤žā¤œā¤žā¤°", + "RegisterWorkspace_Features_Marketplace_Description": "ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤° Rocket.Chat ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ā¤ĒāĨā¤¸ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "RegisterWorkspace_Features_Marketplace_Disconnect": "ā¤…ā¤Ŧ ā¤ā¤ĒāĨā¤¸ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°ā¤¨ā¤ž ā¤¸ā¤‚ā¤­ā¤ĩ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤—ā¤ž.", + "RegisterWorkspace_Features_Omnichannel_Title": "ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛", + "RegisterWorkspace_Features_Omnichannel_Description": "ā¤ĻāĨā¤¨ā¤ŋā¤¯ā¤ž ā¤•āĨ‡ ā¤¸ā¤Ŧā¤¸āĨ‡ ā¤˛āĨ‹ā¤•ā¤ĒāĨā¤°ā¤ŋā¤¯ ā¤¸ā¤žā¤Žā¤žā¤œā¤ŋā¤• ā¤šāĨˆā¤¨ā¤˛āĨ‹ā¤‚ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤…ā¤Ēā¤¨āĨ‡ ā¤Ļā¤°āĨā¤ļā¤•āĨ‹ā¤‚ ā¤¸āĨ‡, ā¤œā¤šā¤žā¤‚ ā¤ĩāĨ‡ ā¤šāĨˆā¤‚, ā¤Ŧā¤žā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "RegisterWorkspace_Features_Omnichannel_Disconnect": "ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨā¤ˇā¤Žā¤¤ā¤žā¤ā¤‚ ā¤…ā¤Ŧ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤‚ā¤—āĨ€.", + "RegisterWorkspace_Features_ThirdPartyLogin_Title": "ā¤¤āĨƒā¤¤āĨ€ā¤¯-ā¤Ēā¤•āĨā¤ˇ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨", + "RegisterWorkspace_Features_ThirdPartyLogin_Description": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤¸ā¤Ļā¤¸āĨā¤¯āĨ‹ā¤‚ ā¤•āĨ‹ ā¤¤āĨƒā¤¤āĨ€ā¤¯-ā¤Ēā¤•āĨā¤ˇ ā¤ā¤ĒāĨā¤˛ā¤ŋā¤•āĨ‡ā¤ļā¤¨ ā¤•āĨ‡ ā¤¸āĨ‡ā¤Ÿ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•ā¤°ā¤•āĨ‡ ā¤˛āĨ‰ā¤— ā¤‡ā¤¨ ā¤•ā¤°ā¤¨āĨ‡ ā¤ĻāĨ‡ā¤‚āĨ¤", + "RegisterWorkspace_Features_ThirdPartyLogin_Disconnect": "ā¤¤āĨƒā¤¤āĨ€ā¤¯-ā¤Ēā¤•āĨā¤ˇ ā¤˛āĨ‰ā¤—ā¤ŋā¤¨ ā¤ĩā¤ŋā¤•ā¤˛āĨā¤Ē ā¤…ā¤Ŧ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤‚ā¤—āĨ‡āĨ¤", + "RegisterWorkspace_Token_Title": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "RegisterWorkspace_Token_Step_Two": "ā¤ŸāĨ‹ā¤•ā¤¨ ā¤•āĨ‹ ā¤•āĨ‰ā¤ĒāĨ€ ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤¨āĨ€ā¤šāĨ‡ ā¤ĒāĨ‡ā¤¸āĨā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "RegisterWorkspace_with_email": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤•āĨ‹ ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤¸āĨ‡ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "RegisterWorkspace_Setup_Subtitle": "ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‡ā¤¸āĨ‡ Rocket.Chat ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤–ā¤žā¤¤āĨ‡ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤ĻāĨā¤§ ā¤•ā¤°ā¤¨ā¤ž ā¤šāĨ‹ā¤—ā¤žāĨ¤", + "RegisterWorkspace_Setup_Steps": "{{numberOfSteps}} ā¤•ā¤ž ā¤šā¤°ā¤Ŗ {{step}}", + "RegisterWorkspace_Setup_Label": "ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤–ā¤žā¤¤ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛", + "RegisterWorkspace_Setup_Have_Account_Title": "ā¤ā¤• ā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆ?", + "RegisterWorkspace_Setup_Have_Account_Subtitle": "ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤…ā¤Ēā¤¨āĨ‡ ā¤–ā¤žā¤¤āĨ‡ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ŧā¤ĻāĨā¤§ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨ā¤ž ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤–ā¤žā¤¤ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "RegisterWorkspace_Setup_No_Account_Title": "ā¤•āĨ‹ā¤ˆ ā¤–ā¤žā¤¤ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ?", + "RegisterWorkspace_Setup_No_Account_Subtitle": "ā¤ā¤• ā¤¨ā¤¯ā¤ž ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤–ā¤žā¤¤ā¤ž ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ā¤”ā¤° ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤¸ā¤‚ā¤Ŧā¤ĻāĨā¤§ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨ā¤ž ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ļā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "cloud.RegisterWorkspace_Setup_Email_Confirmation": "ā¤ĒāĨā¤ˇāĨā¤Ÿā¤ŋā¤•ā¤°ā¤Ŗ ā¤˛ā¤ŋā¤‚ā¤• ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ <1>ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤Ēā¤° ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤­āĨ‡ā¤œā¤ž ā¤—ā¤¯ā¤žāĨ¤", + "RegisterWorkspace_Setup_Email_Verification": "ā¤•āĨƒā¤Ēā¤¯ā¤ž ā¤¸ā¤¤āĨā¤¯ā¤žā¤Ēā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚ ā¤•ā¤ŋ ā¤¨āĨ€ā¤šāĨ‡ ā¤Ļā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‹ā¤Ą ā¤ˆā¤ŽāĨ‡ā¤˛ ā¤ŽāĨ‡ā¤‚ ā¤Ļā¤ŋā¤ ā¤—ā¤ ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ž ā¤•āĨ‹ā¤Ą ā¤¸āĨ‡ ā¤ŽāĨ‡ā¤˛ ā¤–ā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "RegisterWorkspace_Syncing_Error": "ā¤†ā¤Ēā¤•āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤•āĨ‹ ā¤¸ā¤Žā¤¨āĨā¤ĩā¤¯ā¤ŋā¤¤ ā¤•ā¤°ā¤¤āĨ‡ ā¤¸ā¤Žā¤¯ ā¤ā¤• ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤šāĨā¤ˆ", + "RegisterWorkspace_Syncing_Complete": "ā¤¸ā¤ŋā¤‚ā¤• ā¤ĒāĨ‚ā¤°āĨā¤Ŗ", + "RegisterWorkspace_Connection_Error": "ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤°ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤¤āĨā¤°āĨā¤Ÿā¤ŋ ā¤‰ā¤¤āĨā¤Ēā¤¨āĨā¤¨ ā¤šāĨā¤ˆ", + "cloud.RegisterWorkspace_Token_Step_One": "1. ā¤¯ā¤šā¤žā¤‚ ā¤œā¤žā¤ā¤‚: <1>cloud.rocket.chat > ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤”ā¤° <3>'ā¤¸āĨā¤ĩā¤¯ā¤‚-ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤Ēā¤‚ā¤œāĨ€ā¤•ā¤°ā¤Ŗ ā¤•ā¤°āĨ‡ā¤‚' ā¤Ēā¤° ā¤•āĨā¤˛ā¤ŋā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "cloud.RegisterWorkspace_Setup_Terms_Privacy": "ā¤ŽāĨˆā¤‚ <1>ā¤¨ā¤ŋā¤¯ā¤Ž ā¤ā¤ĩā¤‚ ā¤ļā¤°āĨā¤¤āĨ‡ā¤‚ ā¤”ā¤° <3>ā¤—āĨ‹ā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž ā¤¨āĨ€ā¤¤ā¤ŋ ā¤¸āĨ‡ ā¤¸ā¤šā¤Žā¤¤ ā¤šāĨ‚ā¤‚", + "Larger_amounts_of_active_connections": "ā¤Ŧā¤Ąā¤ŧāĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤†ā¤Ē ā¤šā¤Žā¤žā¤°āĨ‡ <1>ā¤Žā¤˛āĨā¤ŸāĨ€ā¤Ēā¤˛ ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸ ā¤¸ā¤Žā¤žā¤§ā¤žā¤¨ ā¤Ēā¤° ā¤ĩā¤ŋā¤šā¤žā¤° ā¤•ā¤° ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "Uninstall_grandfathered_app": "{{appName}} ā¤…ā¤¨ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‰ā¤˛ ā¤•ā¤°āĨ‡ā¤‚?", + "App_will_lose_grandfathered_status": "**ā¤¯ā¤š {{context}} ā¤ā¤Ē ā¤…ā¤Ēā¤¨ā¤ž ā¤Ļā¤žā¤Ļā¤ž ā¤Ļā¤°āĨā¤œā¤ž ā¤–āĨ‹ ā¤ĻāĨ‡ā¤—ā¤žāĨ¤**\n \nā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ ā¤Ēā¤° ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤žā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤§ā¤ŋā¤•ā¤¤ā¤Ž {{limit}} {{context}} ā¤ā¤ĒāĨā¤¸ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤šāĨ‹ ā¤¸ā¤•ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤Ļā¤žā¤Ļā¤žā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤¸āĨ€ā¤Žā¤ž ā¤ŽāĨ‡ā¤‚ ā¤—ā¤ŋā¤¨ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆ ā¤˛āĨ‡ā¤•ā¤ŋā¤¨ ā¤¸āĨ€ā¤Žā¤ž ā¤‰ā¤¨ ā¤Ēā¤° ā¤˛ā¤žā¤—āĨ‚ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨ‹ā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "All_rooms": "ā¤¸ā¤­āĨ€ ā¤•ā¤Žā¤°āĨ‡", + "All_visible": "ā¤¸ā¤Ŧ ā¤Ļā¤ŋā¤– ā¤°ā¤šā¤ž ā¤šāĨˆ", + "Filter_by_room": "ā¤•ā¤Žā¤°āĨ‡ ā¤•āĨ‡ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤•āĨ‡ ā¤…ā¤¨āĨā¤¸ā¤žā¤° ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Filter_by_visibility": "ā¤ĻāĨƒā¤ļāĨā¤¯ā¤¤ā¤ž ā¤•āĨ‡ ā¤†ā¤§ā¤žā¤° ā¤Ēā¤° ā¤Ģā¤ŧā¤ŋā¤˛āĨā¤Ÿā¤° ā¤•ā¤°āĨ‡ā¤‚", + "Theme_Appearence": "ā¤ĨāĨ€ā¤Ž ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ", + "mentions_counter": "{{count}} ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–", + "threads_counter": "{{count}} ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤ĨāĨā¤°āĨ‡ā¤ĄāĨ‡ā¤Ą ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ", + "group_mentions_counter": "{{count}} ā¤¸ā¤ŽāĨ‚ā¤š ā¤•ā¤ž ā¤‰ā¤˛āĨā¤˛āĨ‡ā¤–", + "unread_messages_counter": "ā¤…ā¤Ēā¤ ā¤ŋā¤¤ ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤•āĨ‹ {{count}}", + "Premium": "ā¤…ā¤§ā¤ŋā¤ŽāĨ‚ā¤˛āĨā¤¯", + "Premium_capability": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤•āĨā¤ˇā¤Žā¤¤ā¤ž", + "Operating_withing_plan_limits": "ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤¸āĨ€ā¤Žā¤ž ā¤•āĨ‡ ā¤­āĨ€ā¤¤ā¤° ā¤¸ā¤‚ā¤šā¤žā¤˛ā¤¨", + "Plan_limits_reached": "ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤•āĨ€ ā¤¸āĨ€ā¤Žā¤ž ā¤ĒāĨ‚ā¤°āĨ€ ā¤šāĨ‹ ā¤—ā¤ˆ", + "Workspace_not_registered": "ā¤•ā¤žā¤°āĨā¤¯ā¤¸āĨā¤Ĩā¤˛ ā¤Ēā¤‚ā¤œāĨ€ā¤•āĨƒā¤¤ ā¤¨ā¤šāĨ€ā¤‚ ā¤šāĨˆ", + "Users_Connected": "ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤œāĨā¤Ąā¤ŧāĨ‡", + "Solve_issues": "ā¤ŽāĨā¤ĻāĨā¤ĻāĨ‡ ā¤¸āĨā¤˛ā¤ā¤žā¤“", + "Update_version": "ā¤¨ā¤¯ā¤ž ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ", + "Version_not_supported": "ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ <1>ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ ā¤¨ā¤šāĨ€ā¤‚", + "Version_supported_until": "ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ <1>ā¤¸ā¤Žā¤°āĨā¤Ĩā¤ŋā¤¤ {{date}} ā¤¤ā¤•", + "Check_support_availability": "<1>ā¤¸ā¤Žā¤°āĨā¤Ĩā¤¨ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ā¤¤ā¤ž ā¤•āĨ€ ā¤œā¤žā¤ā¤š ā¤•ā¤°āĨ‡ā¤‚", + "Outdated": "ā¤°ā¤—ā¤Ąā¤ŧā¤ž ā¤šāĨā¤†", + "Latest": "ā¤¨ā¤ĩāĨ€ā¤¨ā¤¤ā¤Ž", + "New_version_available": "ā¤¨ā¤¯ā¤ž ā¤¸ā¤‚ā¤¸āĨā¤•ā¤°ā¤Ŗ ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆ", + "trial": "ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ", + "Subscription": "ā¤…ā¤‚ā¤ļā¤Ļā¤žā¤¨", + "Manage_subscription": "ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "ActiveSessionsPeak": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤¤āĨā¤° ā¤šā¤°ā¤Ž ā¤Ēā¤° ā¤šāĨˆā¤‚", + "ActiveSessionsPeak_InfoText": "ā¤Ēā¤ŋā¤›ā¤˛āĨ‡ 30 ā¤Ļā¤ŋā¤¨āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤°āĨā¤ĩā¤žā¤§ā¤ŋā¤• ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž", + "ActiveSessions": "ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤¤āĨā¤°", + "ActiveSessions_available": "ā¤¸ā¤¤āĨā¤° ā¤‰ā¤Ēā¤˛ā¤ŦāĨā¤§ ā¤šāĨˆā¤‚", + "Monthly_active_contacts": "ā¤Žā¤žā¤¸ā¤ŋā¤• ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•", + "Upgrade": "ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤•ā¤°ā¤¨ā¤ž", + "Seats": "ā¤¸āĨ€ā¤ŸāĨ‡ā¤‚", + "Marketplace_apps": "ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ā¤ĒāĨā¤¸", + "Private_apps": "ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸", + "Finish_your_purchase_trial": "<1>ā¤Ąā¤žā¤‰ā¤¨ā¤—āĨā¤°āĨ‡ā¤Ą ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤ŽāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤Ŧā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤¨āĨ€ ā¤–ā¤°āĨ€ā¤Ļā¤žā¤°āĨ€ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Contact_sales_trial": "ā¤…ā¤Ēā¤¨āĨ€ ā¤–ā¤°āĨ€ā¤Ļā¤žā¤°āĨ€ ā¤ĒāĨ‚ā¤°āĨ€ ā¤•ā¤°ā¤¨āĨ‡ ā¤”ā¤° <1>ā¤Ąā¤žā¤‰ā¤¨ā¤—āĨā¤°āĨ‡ā¤Ą ā¤Ēā¤°ā¤ŋā¤Ŗā¤žā¤ŽāĨ‹ā¤‚ ā¤¸āĨ‡ ā¤Ŧā¤šā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤¸āĨ‡ā¤˛āĨā¤¸ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Why_has_a_trial_been_applied_to_this_workspace": "<0>ā¤‡ā¤¸ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤Ēā¤° ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤•āĨā¤¯āĨ‹ā¤‚ ā¤˛ā¤žā¤—āĨ‚ ā¤•ā¤ŋā¤¯ā¤ž ā¤—ā¤¯ā¤ž ā¤šāĨˆ?", + "Compare_plans": "ā¤¯āĨ‹ā¤œā¤¨ā¤žā¤“ā¤‚ ā¤•āĨ€ ā¤¤āĨā¤˛ā¤¨ā¤ž ā¤•ā¤°āĨ‡ā¤‚", + "n_days_left": "{{n}} ā¤Ļā¤ŋā¤¨ ā¤Ŧā¤šāĨ‡ ā¤šāĨˆā¤‚", + "Contact_sales": "ā¤Ŧā¤ŋā¤•āĨā¤°āĨ€ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Finish_purchase": "ā¤–ā¤°āĨ€ā¤Ļā¤žā¤°āĨ€ ā¤¸ā¤Žā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚", + "Self_managed_hosting": "ā¤¸āĨā¤ĩ-ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤ŋā¤¤ ā¤šāĨ‹ā¤¸āĨā¤Ÿā¤ŋā¤‚ā¤—", + "Cloud_hosting": "ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤•āĨā¤˛ā¤žā¤‰ā¤Ą ā¤šāĨ‹ā¤¸āĨā¤Ÿā¤ŋā¤‚ā¤—", + "free_per_month_user": "$0 ā¤ĒāĨā¤°ā¤¤ā¤ŋ ā¤Žā¤žā¤š/ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž", + "Trial_active": "ā¤Ēā¤°āĨ€ā¤•āĨā¤ˇā¤Ŗ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯", + "Contact_sales_renew_date": "ā¤¯āĨ‹ā¤œā¤¨ā¤ž ā¤¨ā¤ĩāĨ€ā¤¨āĨ€ā¤•ā¤°ā¤Ŗ ā¤¤ā¤ŋā¤Ĩā¤ŋ ā¤•āĨ€ ā¤œā¤žā¤‚ā¤š ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ <0>ā¤Ŧā¤ŋā¤•āĨā¤°āĨ€ ā¤¸āĨ‡ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Renews_DATE": "ā¤¨ā¤ĩāĨ€ā¤¨āĨ€ā¤•ā¤°ā¤Ŗ {{date}}", + "UpgradeToGetMore_Headline": "ā¤…ā¤§ā¤ŋā¤• ā¤Ēā¤žā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą ā¤•ā¤°āĨ‡ā¤‚", + "UpgradeToGetMore_Subtitle": "ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤•āĨā¤ˇā¤Žā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤•āĨ‹ ā¤¸āĨā¤Ēā¤°ā¤šā¤žā¤°āĨā¤œ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "UpgradeToGetMore_scalability_Title": "ā¤‰ā¤šāĨā¤š ā¤Žā¤žā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž", + "UpgradeToGetMore_scalability_Body": "ā¤ŽāĨ‹ā¤¨āĨ‹ā¤˛ā¤ŋā¤Ĩā¤ŋā¤• ā¤¸āĨ‡ ā¤Žā¤žā¤‡ā¤•āĨā¤°āĨ‹ā¤¸ā¤°āĨā¤ĩā¤ŋā¤¸āĨ‡ā¤œ ā¤¯ā¤ž ā¤Žā¤˛āĨā¤ŸāĨ€-ā¤‡ā¤‚ā¤¸āĨā¤ŸāĨ‡ā¤‚ā¤¸ ā¤Ēā¤° ā¤¸āĨā¤ĩā¤ŋā¤š ā¤•ā¤°ā¤•āĨ‡ ā¤Ļā¤•āĨā¤ˇā¤¤ā¤ž ā¤ŽāĨ‡ā¤‚ ā¤¸āĨā¤§ā¤žā¤° ā¤•ā¤°āĨ‡ā¤‚, ā¤˛ā¤žā¤—ā¤¤ ā¤•ā¤Ž ā¤•ā¤°āĨ‡ā¤‚ ā¤”ā¤° ā¤¸ā¤Žā¤ĩā¤°āĨā¤¤āĨ€ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤•ā¤ž ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤Ŧā¤ĸā¤ŧā¤žā¤ā¤‚āĨ¤", + "UpgradeToGetMore_accessibility-certification_Title": "WCAG 2.1 ā¤”ā¤° BITV 2.0", + "UpgradeToGetMore_accessibility-certification_Body": "Rocket.Chat ā¤•āĨ‡ ā¤ā¤•āĨā¤¸āĨ‡ā¤¸ā¤ŋā¤Ŧā¤ŋā¤˛ā¤ŋā¤ŸāĨ€ ā¤ĒāĨā¤°āĨ‹ā¤—āĨā¤°ā¤žā¤Ž ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ WCAG ā¤”ā¤° BITV ā¤Žā¤žā¤¨ā¤•āĨ‹ā¤‚ ā¤•ā¤ž ā¤…ā¤¨āĨā¤Ēā¤žā¤˛ā¤¨ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "UpgradeToGetMore_engagement-dashboard_Title": "ā¤ā¤¨ā¤žā¤˛ā¤ŋā¤Ÿā¤ŋā¤•āĨā¤¸", + "UpgradeToGetMore_engagement-dashboard_Body": "ā¤¸ā¤šā¤­ā¤žā¤—ā¤ŋā¤¤ā¤ž ā¤ĄāĨˆā¤ļā¤ŦāĨ‹ā¤°āĨā¤Ą ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž, ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤”ā¤° ā¤šāĨˆā¤¨ā¤˛ ā¤•āĨ‡ ā¤‰ā¤Ēā¤¯āĨ‹ā¤— ā¤•āĨ‡ ā¤Ŧā¤žā¤°āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤œā¤žā¤¨ā¤•ā¤žā¤°āĨ€ ā¤ĒāĨā¤°ā¤žā¤ĒāĨā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "UpgradeToGetMore_oauth-enterprise_Title": "ā¤‰ā¤¨āĨā¤¨ā¤¤ ā¤ĒāĨā¤°ā¤Žā¤žā¤ŖāĨ€ā¤•ā¤°ā¤Ŗ", + "UpgradeToGetMore_oauth-enterprise_Body": "ā¤¸ā¤ŽāĨ‚ā¤š ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤ž ā¤ŽāĨˆā¤Ēā¤ŋā¤‚ā¤—, ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤Ļā¤¸āĨā¤¯ā¤¤ā¤ž, ā¤‘ā¤ŸāĨ‹ ā¤˛āĨ‰ā¤—ā¤†ā¤‰ā¤Ÿ ā¤”ā¤° ā¤Ŧā¤šāĨā¤¤ ā¤•āĨā¤› ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ā¤˛ā¤ĄāĨ€ā¤ā¤ĒāĨ€/ā¤ā¤¸ā¤ā¤ā¤Žā¤ā¤˛/ā¤“ā¤Ĩ ā¤•āĨ‡ ā¤Žā¤žā¤§āĨā¤¯ā¤Ž ā¤¸āĨ‡ ā¤‰ā¤šā¤ŋā¤¤ ā¤Ēā¤šāĨā¤‚ā¤š ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤‚ ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "UpgradeToGetMore_custom-roles_Title": "ā¤•ā¤¸āĨā¤Ÿā¤Ž ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤", + "UpgradeToGetMore_custom-roles_Body": "ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤˛āĨ‹ā¤—āĨ‹ā¤‚ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤ĩā¤ŋā¤ļā¤ŋā¤ˇāĨā¤Ÿ ā¤­āĨ‚ā¤Žā¤ŋā¤•ā¤žā¤ā¤ ā¤”ā¤° ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤¨ā¤ŋā¤°āĨā¤§ā¤žā¤°ā¤ŋā¤¤ ā¤•ā¤°ā¤•āĨ‡ ā¤ā¤• ā¤¸āĨā¤°ā¤•āĨā¤ˇā¤ŋā¤¤ ā¤”ā¤° ā¤‰ā¤¤āĨā¤Ēā¤žā¤Ļā¤• ā¤•ā¤žā¤°āĨā¤¯ ā¤ĩā¤žā¤¤ā¤žā¤ĩā¤°ā¤Ŗ ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "UpgradeToGetMore_auditing_Title": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‘ā¤Ąā¤ŋā¤Ÿā¤ŋā¤‚ā¤—", + "UpgradeToGetMore_auditing_Body": "ā¤—āĨā¤°ā¤žā¤šā¤•āĨ‹ā¤‚, ā¤†ā¤ĒāĨ‚ā¤°āĨā¤¤ā¤ŋā¤•ā¤°āĨā¤¤ā¤žā¤“ā¤‚ ā¤”ā¤° ā¤†ā¤‚ā¤¤ā¤°ā¤ŋā¤• ā¤ŸāĨ€ā¤ŽāĨ‹ā¤‚ ā¤•āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤¸ā¤‚ā¤šā¤žā¤° ā¤—āĨā¤Ŗā¤ĩā¤¤āĨā¤¤ā¤ž ā¤¸āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋā¤¤ ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤Ŧā¤žā¤¤ā¤šāĨ€ā¤¤ ā¤•āĨ‹ ā¤ā¤• ā¤šāĨ€ ā¤¸āĨā¤Ĩā¤žā¤¨ ā¤Ēā¤° ā¤‘ā¤Ąā¤ŋā¤Ÿ ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Seats_InfoText": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ā¤• ā¤¸āĨ€ā¤Ÿ ā¤Ēā¤° ā¤°ā¤šā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨ€ā¤ŸāĨ‹ā¤‚ ā¤Ēā¤° ā¤•ā¤ŦāĨā¤œā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤ ā¤¸āĨ€ā¤ŸāĨ‹ā¤‚ ā¤•āĨ€ ā¤•āĨā¤˛ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤ĒāĨā¤°ā¤•ā¤žā¤° ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ā¤Ēā¤°ā¤ŋā¤­ā¤žā¤ˇā¤ŋā¤¤ ā¤•āĨ€ ā¤œā¤žā¤¤āĨ€ ā¤šāĨˆāĨ¤", + "CountSeats_InfoText": "ā¤ĒāĨā¤°ā¤¤āĨā¤¯āĨ‡ā¤• ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤ā¤• ā¤¸āĨ€ā¤Ÿ ā¤Ēā¤° ā¤°ā¤šā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤¨ā¤ŋā¤ˇāĨā¤•āĨā¤°ā¤ŋā¤¯ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤¸āĨ€ā¤ŸāĨ‹ā¤‚ ā¤Ēā¤° ā¤•ā¤ŦāĨā¤œā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤•ā¤°ā¤¤āĨ‡ ā¤šāĨˆā¤‚āĨ¤", + "MAC_InfoText": "(ā¤ŽāĨˆā¤•) ā¤Ŧā¤ŋā¤˛ā¤ŋā¤‚ā¤— ā¤Žā¤žā¤š ā¤•āĨ‡ ā¤ĻāĨŒā¤°ā¤žā¤¨ ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žāĨ¤", + "CountMAC_InfoText": "(ā¤ŽāĨˆā¤•) ā¤•āĨˆā¤˛āĨ‡ā¤‚ā¤Ąā¤° ā¤Žā¤žā¤š ā¤•āĨ‡ ā¤ĻāĨŒā¤°ā¤žā¤¨ ā¤œāĨā¤Ąā¤ŧāĨ‡ ā¤…ā¤ĻāĨā¤ĩā¤ŋā¤¤āĨ€ā¤¯ ā¤“ā¤Žā¤¨āĨ€ā¤šāĨˆā¤¨ā¤˛ ā¤¸ā¤‚ā¤Ēā¤°āĨā¤•āĨ‹ā¤‚ ā¤•āĨ€ ā¤¸ā¤‚ā¤–āĨā¤¯ā¤žāĨ¤", + "ActiveSessions_InfoText": "ā¤•āĨā¤˛ ā¤¸ā¤Žā¤ĩā¤°āĨā¤¤āĨ€ ā¤•ā¤¨āĨ‡ā¤•āĨā¤ļā¤¨. ā¤ā¤• ā¤šāĨ€ ā¤¯āĨ‚ā¤œā¤° ā¤•āĨ‹ ā¤•ā¤ˆ ā¤Ŧā¤žā¤° ā¤•ā¤¨āĨ‡ā¤•āĨā¤Ÿ ā¤•ā¤ŋā¤¯ā¤ž ā¤œā¤ž ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆāĨ¤ ā¤ĒāĨā¤°ā¤Ļā¤°āĨā¤ļā¤¨ ā¤¸ā¤Žā¤¸āĨā¤¯ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤°āĨ‹ā¤•ā¤¨āĨ‡ ā¤•āĨ‡ ā¤˛ā¤ŋā¤ ā¤‰ā¤Ēā¤¯āĨ‹ā¤—ā¤•ā¤°āĨā¤¤ā¤ž ā¤‰ā¤Ēā¤¸āĨā¤Ĩā¤ŋā¤¤ā¤ŋ ā¤¸āĨ‡ā¤ĩā¤ž 200 ā¤¯ā¤ž ā¤‰ā¤¸ā¤¸āĨ‡ ā¤…ā¤§ā¤ŋā¤• ā¤Ēā¤° ā¤…ā¤•āĨā¤ˇā¤Ž ā¤šāĨˆāĨ¤", + "Apps_InfoText": "ā¤¸ā¤ŽāĨā¤Ļā¤žā¤¯ 3 ā¤¨ā¤ŋā¤œāĨ€ ā¤ā¤ĒāĨā¤¸ ā¤”ā¤° 5 ā¤Žā¤žā¤°āĨā¤•āĨ‡ā¤Ÿā¤ĒāĨā¤˛āĨ‡ā¤¸ ā¤ā¤ĒāĨā¤¸ ā¤•āĨ‹ ā¤¸ā¤•āĨā¤ˇā¤Ž ā¤•ā¤°ā¤¨āĨ‡ ā¤•āĨ€ ā¤…ā¤¨āĨā¤Žā¤¤ā¤ŋ ā¤ĻāĨ‡ā¤¤ā¤ž ā¤šāĨˆ", + "Remove_RocketChat_Watermark_InfoText": "ā¤¸ā¤ļāĨā¤˛āĨā¤• ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤¸ā¤•āĨā¤°ā¤ŋā¤¯ ā¤šāĨ‹ā¤¨āĨ‡ ā¤Ēā¤° ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ā¤¸āĨā¤ĩā¤šā¤žā¤˛ā¤ŋā¤¤ ā¤°āĨ‚ā¤Ē ā¤¸āĨ‡ ā¤šā¤Ÿā¤ž ā¤Ļā¤ŋā¤¯ā¤ž ā¤œā¤žā¤¤ā¤ž ā¤šāĨˆāĨ¤", + "Remove_RocketChat_Watermark": "ā¤°āĨ‰ā¤•āĨ‡ā¤Ÿ.ā¤šāĨˆā¤Ÿ ā¤ĩāĨ‰ā¤Ÿā¤°ā¤Žā¤žā¤°āĨā¤• ā¤šā¤Ÿā¤žā¤ā¤", + "High_scalabaility": "ā¤‰ā¤šāĨā¤š ā¤Žā¤žā¤Ēā¤¨āĨ€ā¤¯ā¤¤ā¤ž", + "Premium_and_unlimited_apps": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤”ā¤° ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤ā¤ĒāĨā¤¸", + "Message_audit": "ā¤¸ā¤‚ā¤ĻāĨ‡ā¤ļ ā¤‘ā¤Ąā¤ŋā¤Ÿā¤ŋā¤‚ā¤—", + "Premium_omnichannel_capabilities": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤¸ā¤°āĨā¤ĩā¤šāĨˆā¤¨ā¤˛ ā¤•āĨā¤ˇā¤Žā¤¤ā¤žā¤ā¤", + "Video_call_manager": "ā¤ĩāĨ€ā¤Ąā¤ŋā¤¯āĨ‹ ā¤•āĨ‰ā¤˛ ā¤ĒāĨā¤°ā¤Ŧā¤‚ā¤§ā¤•", + "Unlimited_push_notifications": "ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤ĒāĨā¤ļ ā¤¸āĨ‚ā¤šā¤¨ā¤žā¤ā¤‚", + "Buy_more": "ā¤…ā¤§ā¤ŋā¤• ā¤–ā¤°āĨ€ā¤ĻāĨ‡ā¤‚", + "Upgrade_to_Pro": "ā¤ĒāĨā¤°āĨ‹ ā¤ŽāĨ‡ā¤‚ ā¤…ā¤Ēā¤—āĨā¤°āĨ‡ā¤Ą", + "Sync_license_update": "ā¤¸ā¤ŋā¤‚ā¤• ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤…ā¤ĻāĨā¤¯ā¤¤ā¤¨", + "Sync_license_update_Callout_Title": "ā¤šā¤Ž ā¤†ā¤Ēā¤•ā¤ž ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•ā¤° ā¤°ā¤šāĨ‡ ā¤šāĨˆā¤‚", + "Sync_license_update_Callout": "ā¤¯ā¤Ļā¤ŋ ā¤†ā¤Ēā¤•āĨ‹ ā¤•āĨā¤› ā¤Žā¤ŋā¤¨ā¤ŸāĨ‹ā¤‚ ā¤•āĨ‡ ā¤­āĨ€ā¤¤ā¤° ā¤…ā¤Ēā¤¨āĨ‡ ā¤•ā¤žā¤°āĨā¤¯ā¤•āĨā¤ˇāĨ‡ā¤¤āĨā¤° ā¤ŽāĨ‡ā¤‚ ā¤•āĨ‹ā¤ˆ ā¤Ŧā¤Ļā¤˛ā¤žā¤ĩ ā¤¨ā¤œā¤ŧā¤° ā¤¨ā¤šāĨ€ā¤‚ ā¤†ā¤¤ā¤ž ā¤šāĨˆ, ā¤¤āĨ‹ ā¤˛ā¤žā¤‡ā¤¸āĨ‡ā¤‚ā¤¸ ā¤…ā¤Ēā¤ĄāĨ‡ā¤Ÿ ā¤•āĨ‹ ā¤¸ā¤ŋā¤‚ā¤• ā¤•ā¤°āĨ‡ā¤‚āĨ¤", + "Includes": "ā¤ļā¤žā¤Žā¤ŋā¤˛", + "Unlock_premium_capabilities": "ā¤ĒāĨā¤°āĨ€ā¤Žā¤ŋā¤¯ā¤Ž ā¤•āĨā¤ˇā¤Žā¤¤ā¤žā¤“ā¤‚ ā¤•āĨ‹ ā¤…ā¤¨ā¤˛āĨ‰ā¤• ā¤•ā¤°āĨ‡ā¤‚", + "Unlimited_seats": "ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤¸āĨ€ā¤ŸāĨ‡ā¤‚", + "Unlimited_MACs": "ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤ā¤Žā¤ā¤¸āĨ€", + "Unlimited_seats_MACs": "ā¤…ā¤¸āĨ€ā¤Žā¤ŋā¤¤ ā¤¸āĨ€ā¤ŸāĨ‡ā¤‚ ā¤”ā¤° ā¤ā¤Žā¤ā¤¸āĨ€" } \ No newline at end of file diff --git a/packages/i18n/src/locales/hr.i18n.json b/packages/i18n/src/locales/hr.i18n.json index c6b44aac84e5..84c4295d5201 100644 --- a/packages/i18n/src/locales/hr.i18n.json +++ b/packages/i18n/src/locales/hr.i18n.json @@ -2192,12 +2192,19 @@ "Retail": "Maloprodaja", "Retention_setting_changed_successfully": "Postavka pravila zadrÅžavanja uspjeÅĄno je promijenjena", "RetentionPolicy": "Pravila zadrÅžavanja", + "RetentionPolicy_AppliesToChannels": "Odnosi se na kanale", + "RetentionPolicy_AppliesToDMs": "Odnosi se na izravne poruke", + "RetentionPolicy_AppliesToGroups": "Odnosi se na privatne grupe", "RetentionPolicy_Description": "Automatski prunes stare poruke preko vaÅĄeg Rocket.Chat instanca.", "RetentionPolicy_Enabled": "Omogućeno", "RetentionPolicy_ExcludePinned": "Izuzmite prikvačene poruke", "RetentionPolicy_FilesOnly": "Samo izbriÅĄite datoteke", "RetentionPolicy_FilesOnly_Description": "Samo će se datoteke izbrisati, poruke će ostati na mjestu.", "RetentionPolicy_MaxAge": "Maksimalna dob poruka", + "RetentionPolicy_MaxAge_Channels": "Maksimalna dob poruka u kanalima", + "RetentionPolicy_MaxAge_Description": "Prune sve poruke starijima od ove vrijednosti, u danima", + "RetentionPolicy_MaxAge_DMs": "Maksimalna dob poruka u izravnim porukama", + "RetentionPolicy_MaxAge_Groups": "Maksimalna dob poruka u privatnim skupinama", "RetentionPolicy_Precision": "Preciznost mjerača", "RetentionPolicy_Precision_Description": "Koliko često bi trebao trajati mjerač vremena. Postavljanje na precizniju vrijednost čini kanale s brzim retencijskim vremenskim razmacima bolji, ali mogu koÅĄtati dodatnu snagu obrade u velikim zajednicama.", "RetentionPolicyRoom_Enabled": "Automatski obriÅĄite stare poruke", @@ -2892,4 +2899,4 @@ "registration.component.form.sendConfirmationEmail": "PoÅĄalji potvrdni email", "Enterprise": "Poduzeće", "UpgradeToGetMore_engagement-dashboard_Title": "Analitika" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/hu.i18n.json b/packages/i18n/src/locales/hu.i18n.json index 6ac0e32cc1b8..f7f85536c183 100644 --- a/packages/i18n/src/locales/hu.i18n.json +++ b/packages/i18n/src/locales/hu.i18n.json @@ -3901,6 +3901,9 @@ "RetentionPolicy_Advanced_Precision": "SpeciÃĄlis megőrzÊsi hÃĄzirend beÃĄllítÃĄs hasznÃĄlata", "RetentionPolicy_Advanced_Precision_Cron": "SpeciÃĄlis megőrzÊsi hÃĄzirend cron-feladat hasznÃĄlata", "RetentionPolicy_Advanced_Precision_Cron_Description": "Milyen gyakran kell futnia a cron-feladat kifejezÊssel meghatÃĄrozott tÃļrlÊsi időzítőnek. Ennek egy pontosabb ÊrtÊkre ÃĄllítÃĄsa a gyors visszatartÃĄsi időzítőkkel rendelkező csatornÃĄkat jobban mÅąkÃļdővÊ teszi, de tovÃĄbbi feldolgozÃĄsi teljesítmÊnybe kerÃŧlhet nagy kÃļzÃļssÊgeknÊl.", + "RetentionPolicy_AppliesToChannels": "AlkalmazÃĄs a csatornÃĄkra", + "RetentionPolicy_AppliesToDMs": "AlkalmazÃĄs a kÃļzvetlen Ãŧzenetekre", + "RetentionPolicy_AppliesToGroups": "AlkalmazÃĄs a szemÊlyes csoportokra", "RetentionPolicy_Description": "A rÊgi Ãŧzenetek Ês fÃĄjlok automatikus tÃļrlÊse az egÊsz munkaterÃŧleten.", "RetentionPolicy_DoNotPruneDiscussion": "Ne tÃļrÃļlje a megbeszÊlÊs Ãŧzeneteit", "RetentionPolicy_DoNotPrunePinned": "Ne tÃļrÃļlje a kitÅązÃļtt Ãŧzeneteket", @@ -3910,6 +3913,10 @@ "RetentionPolicy_FilesOnly": "Csak fÃĄjlok tÃļrlÊse", "RetentionPolicy_FilesOnly_Description": "Csak a fÃĄjlok lesznek tÃļrÃļlve, maguk az Ãŧzenetek a helyÃŧkÃļn maradnak.", "RetentionPolicy_MaxAge": "Legnagyobb ÃŧzenetÊletkor", + "RetentionPolicy_MaxAge_Channels": "Legnagyobb ÃŧzenetÊletkor a csatornÃĄkban", + "RetentionPolicy_MaxAge_Description": "A napokban megadott ÊrtÊknÊl rÊgebbi Ãļsszes Ãŧzenet tÃļrlÊse", + "RetentionPolicy_MaxAge_DMs": "Legnagyobb ÃŧzenetÊletkor a kÃļzvetlen Ãŧzenetekben", + "RetentionPolicy_MaxAge_Groups": "Legnagyobb ÃŧzenetÊletkor a szemÊlyes csoportokban", "RetentionPolicy_Precision": "Időzítő pontossÃĄga", "RetentionPolicy_Precision_Description": "Milyen gyakran kell futnia a tÃļrlÊsi időzítőnek. Ennek egy pontosabb ÊrtÊkre ÃĄllítÃĄsa a gyors visszatartÃĄsi időzítőkkel rendelkező csatornÃĄkat jobban mÅąkÃļdővÊ teszi, de tovÃĄbbi feldolgozÃĄsi teljesítmÊnybe kerÃŧlhet nagy kÃļzÃļssÊgeknÊl.", "RetentionPolicyRoom_Enabled": "RÊgi Ãŧzenetek automatikus tÃļrlÊse", @@ -5420,4 +5427,4 @@ "Enterprise": "VÃĄllalati", "UpgradeToGetMore_engagement-dashboard_Title": "Analitika", "UpgradeToGetMore_auditing_Title": "Üzenet ellenőrzÊs" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/id.i18n.json b/packages/i18n/src/locales/id.i18n.json index e8201ffecc03..1abc2fadd68c 100644 --- a/packages/i18n/src/locales/id.i18n.json +++ b/packages/i18n/src/locales/id.i18n.json @@ -2068,12 +2068,19 @@ "Retail": "Eceran", "Retention_setting_changed_successfully": "Pengaturan kebijakan retensi berhasil diubah", "RetentionPolicy": "Kebijakan Penyimpanan", + "RetentionPolicy_AppliesToChannels": "Berlaku untuk saluran", + "RetentionPolicy_AppliesToDMs": "Berlaku untuk mengarahkan pesan", + "RetentionPolicy_AppliesToGroups": "Berlaku untuk grup pribadi", "RetentionPolicy_Description": "Secara otomatis memangkas pesan lama di seluruh Rocket Anda. Contohnya.", "RetentionPolicy_Enabled": "Diaktifkan", "RetentionPolicy_ExcludePinned": "Kecualikan pesan yang disematkan", "RetentionPolicy_FilesOnly": "Hanya hapus file", "RetentionPolicy_FilesOnly_Description": "Hanya file yang akan dihapus, pesan itu sendiri akan tetap di tempatnya.", "RetentionPolicy_MaxAge": "Umur pesan maksimum", + "RetentionPolicy_MaxAge_Channels": "Umur pesan maksimum di saluran", + "RetentionPolicy_MaxAge_Description": "Pangkas semua pesan yang lebih lama dari nilai ini, dalam hitungan hari", + "RetentionPolicy_MaxAge_DMs": "Umur pesan maksimum dalam pesan langsung", + "RetentionPolicy_MaxAge_Groups": "Umur pesan maksimum dalam grup pribadi", "RetentionPolicy_Precision": "Timer Presisi", "RetentionPolicy_Precision_Description": "Seberapa sering pewaktu pemangkas harus berjalan. Menyetel ini ke nilai yang lebih tepat membuat saluran dengan penghitung waktu cepat berfungsi lebih baik, tetapi mungkin memerlukan biaya daya pemrosesan tambahan pada komunitas besar.", "RetentionPolicyRoom_Enabled": "Secara otomatis memangkas pesan lama", @@ -2766,4 +2773,4 @@ "registration.component.form.sendConfirmationEmail": "Kirim email konfirmasi", "Enterprise": "Perusahaan", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/it.i18n.json b/packages/i18n/src/locales/it.i18n.json index a7d0658f6035..160dbe3cf40e 100644 --- a/packages/i18n/src/locales/it.i18n.json +++ b/packages/i18n/src/locales/it.i18n.json @@ -203,9 +203,11 @@ "Accounts_OAuth_Wordpress_token_path": "Percorso del token", "Accounts_Password_Policy_AtLeastOneLowercase": "Almeno una minuscola", "Accounts_Password_Policy_AtLeastOneLowercase_Description": "Imponi che una password contenga almeno un carattere minuscolo.", + "Apps_Count_Enabled_many": "{{count}} app abilitate", "Accounts_Password_Policy_AtLeastOneNumber": "Almeno un numero", "Accounts_Password_Policy_AtLeastOneNumber_Description": "Imponi che una password contenga almeno un carattere numerico.", "Accounts_Password_Policy_AtLeastOneSpecialCharacter": "Almeno un simbolo", + "Private_Apps_Count_Enabled_many": "{{count}} applicazioni private abilitate", "Accounts_Password_Policy_AtLeastOneSpecialCharacter_Description": "Imponi che una password contenga almeno un carattere speciale.", "Accounts_Password_Policy_AtLeastOneUppercase": "Almeno una maiuscola", "Accounts_Password_Policy_AtLeastOneUppercase_Description": "Imponi che una password contenga almeno un carattere minuscolo.", @@ -230,10 +232,8 @@ "Accounts_RegistrationForm_Secret_URL": "URL segreto", "Accounts_RegistrationForm_SecretURL": "URL segreto del modulo di registrazione ", "Accounts_RegistrationForm_SecretURL_Description": "È necessario fornire una stringa casuale che verrà aggiunta all'URL di registrazione. Esempio: `https://open.rocket.chat/register/[secret_hash]`", - "Apps_Count_Enabled_many": "{{count}} app abilitate", "Accounts_RequireNameForSignUp": "Richiedi il nome per la registrazione", "Accounts_RequirePasswordConfirmation": "Richiede conferma della password", - "Private_Apps_Count_Enabled_many": "{{count}} applicazioni private abilitate", "Accounts_SearchFields": "Campi da considerare nella ricerca", "Accounts_Send_Email_When_Activating": "Invia mail all'utente quando quando è attivato", "Accounts_Send_Email_When_Deactivating": "Invia mail all'utente quando quando è inattivato", @@ -593,6 +593,7 @@ "CAS_version": "Versione CAS", "CAS_version_Description": "Utilizza solo la versione CAS supportata dal tuo servizio CAS SSO.", "CDN_PREFIX": "Prefisso CDN", + "meteor_status_reconnect_in_many": "riprovo tra {{count}} secondi...", "Certificates_and_Keys": "Certificati e chiavi", "Change_Room_Type": "Cambia la tipologia di stanza", "Changing_email": "In fase di cambiamento dell'email", @@ -714,7 +715,6 @@ "Conversation_finished_message": "Messaggio di conversazione terminato", "conversation_with_s": "la conversazione con %s", "Conversations": "Conversazioni", - "meteor_status_reconnect_in_many": "riprovo tra {{count}} secondi...", "Convert_Ascii_Emojis": "Converti gli ASCII in Emoji", "Converted__roomName__to_team": "ha convertito #{{roomName}} in una squadra", "Converted__roomName__to_channel": "ha convertito #{{roomName}} in un Channel", @@ -2579,12 +2579,19 @@ "Retail": "Al dettaglio", "Retention_setting_changed_successfully": "Impostazione dei criteri di conservazione modificata correttamente", "RetentionPolicy": "Politica di conservazione", + "RetentionPolicy_AppliesToChannels": "Si applica ai canali", + "RetentionPolicy_AppliesToDMs": "Si applica per dirigere i messaggi", + "RetentionPolicy_AppliesToGroups": "Si applica a gruppi privati", "RetentionPolicy_Description": "Elimina automaticamente vecchi messaggi attraverso l'istanza di Rocket.Chat.", "RetentionPolicy_Enabled": "Abilitato", "RetentionPolicy_ExcludePinned": "Escludere i messaggi aggiunti", "RetentionPolicy_FilesOnly": "Elimina solo i file", "RetentionPolicy_FilesOnly_Description": "Verranno eliminati solo i file, i messaggi rimarranno al loro posto.", "RetentionPolicy_MaxAge": "Età massima del messaggio", + "RetentionPolicy_MaxAge_Channels": "Massima età dei messaggi nei canali", + "RetentionPolicy_MaxAge_Description": "Elimina tutti i messaggi piÚ vecchi di questo valore, in giorni", + "RetentionPolicy_MaxAge_DMs": "Età massima dei messaggi nei messaggi diretti", + "RetentionPolicy_MaxAge_Groups": "Età massima dei messaggi in gruppi privati", "RetentionPolicy_Precision": "Precisione del timer", "RetentionPolicy_Precision_Description": "Con quale frequenza deve essere eseguito il timer di sfoltimento. Impostando questo ad un valore piÚ preciso, i canali con timer di ritenzione veloce funzionano meglio, ma potrebbero costare una maggiore potenza di elaborazione su comunità di grandi dimensioni.", "RetentionPolicyRoom_Enabled": "Elimina automaticamente vecchi messaggi", @@ -3401,4 +3408,4 @@ "UpgradeToGetMore_custom-roles_Title": "Ruoli personalizzati", "Video_call_manager": "Gestore di videochiamate", "Sync_license_update_Callout_Title": "Stiamo aggiornando la vostra licenza" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ja.i18n.json b/packages/i18n/src/locales/ja.i18n.json index d81bef5c47ad..982f9495d914 100644 --- a/packages/i18n/src/locales/ja.i18n.json +++ b/packages/i18n/src/locales/ja.i18n.json @@ -3497,6 +3497,9 @@ "RetentionPolicy_Advanced_Precision": "éĢ˜åēĻãĒäŋæŒãƒãƒĒã‚ˇãƒŧč¨­åŽšãŽäŊŋį”¨", "RetentionPolicy_Advanced_Precision_Cron": "éĢ˜åēĻãĒäŋæŒãƒãƒĒã‚ˇãƒŧクロãƒŗぎäŊŋį”¨", "RetentionPolicy_Advanced_Precision_Cron_Description": "整į†ã‚ŋイマãƒŧãŽåŽŸčĄŒé ģåēĻはcronジョブåŧã§åŽšįžŠã•ã‚Œãžã™ã€‚これをよりį˛žå¯†ãĒ値ãĢč¨­åŽšã™ã‚‹ã¨ã€äŋæŒã‚ŋイマãƒŧがéĢ˜é€ŸãĒチãƒŖネãƒĢぎ動äŊœãŒæ”šå–„されぞすが、大čĻæ¨Ąã‚ŗミãƒĨニテã‚ŖではčŋŊ加ぎå‡Ļį†čƒŊ力がåŋ…čĻãĢãĒる可čƒŊ性がありぞす。", + "RetentionPolicy_AppliesToChannels": "チãƒŖネãƒĢãĢ遊į”¨", + "RetentionPolicy_AppliesToDMs": "ダイãƒŦã‚¯ãƒˆãƒĄãƒƒã‚ģãƒŧジãĢ遊į”¨", + "RetentionPolicy_AppliesToGroups": "プナイベãƒŧトグãƒĢãƒŧプãĢ遊į”¨", "RetentionPolicy_Description": "Rocket.Chatイãƒŗã‚šã‚ŋãƒŗã‚šå…¨äŊ“ã§å¤ã„ãƒĄãƒƒã‚ģãƒŧジをč‡Ē動įš„ãĢ整į†ã—ぞす。", "RetentionPolicy_DoNotPruneDiscussion": "デã‚Ŗã‚šã‚Ģãƒƒã‚ˇãƒ§ãƒŗãƒĄãƒƒã‚ģãƒŧジを整į†ã—ãĒい", "RetentionPolicy_DoNotPrunePinned": "å›ēåŽšã•ã‚ŒãŸãƒĄãƒƒã‚ģãƒŧジを整į†ã—ãĒい", @@ -3506,6 +3509,10 @@ "RetentionPolicy_FilesOnly": "ãƒ•ã‚Ąã‚¤ãƒĢぎãŋを削除", "RetentionPolicy_FilesOnly_Description": "ãƒ•ã‚Ąã‚¤ãƒĢぎãŋãŒå‰Šé™¤ã•ã‚Œã€ãƒĄãƒƒã‚ģãƒŧジč‡ĒäŊ“はそぎぞぞ掋りぞす。", "RetentionPolicy_MaxAge": "ãƒĄãƒƒã‚ģãƒŧジäŋæŒæ—Ĩ数", + "RetentionPolicy_MaxAge_Channels": "チãƒŖネãƒĢã§ãŽãƒĄãƒƒã‚ģãƒŧジäŋæŒæœŸé–“", + "RetentionPolicy_MaxAge_Description": "こぎ値īŧˆæ—Ĩ数īŧ‰ã‚’įĩŒéŽã—たすずãĻãŽãƒĄãƒƒã‚ģãƒŧジを整į†ã—ぞす。", + "RetentionPolicy_MaxAge_DMs": "ダイãƒŦã‚¯ãƒˆãƒĄãƒƒã‚ģãƒŧã‚¸ãŽãƒĄãƒƒã‚ģãƒŧジäŋæŒæ—Ĩ数", + "RetentionPolicy_MaxAge_Groups": "プナイベãƒŧトグãƒĢãƒŧãƒ—ã§ãŽãƒĄãƒƒã‚ģãƒŧジäŋæŒæœŸé–“", "RetentionPolicy_Precision": "ã‚ŋイマãƒŧį˛žåēĻ", "RetentionPolicy_Precision_Description": "整į†ã‚ŋイマãƒŧãŽåŽŸčĄŒé ģåēĻ。これをよりį˛žå¯†ãĒ値ãĢč¨­åŽšã™ã‚‹ã¨ã€äŋæŒã‚ŋイマãƒŧがéĢ˜é€ŸãĒチãƒŖネãƒĢぎ動äŊœãŒæ”šå–„されぞすが、大čĻæ¨Ąã‚ŗミãƒĨニテã‚ŖではčŋŊ加ぎå‡Ļį†čƒŊ力がåŋ…čĻãĢãĒる可čƒŊ性がありぞす。", "RetentionPolicyRoom_Enabled": "å¤ã„ãƒĄãƒƒã‚ģãƒŧジをč‡Ē動įš„ãĢ整į†", @@ -4823,4 +4830,4 @@ "Enterprise": "エãƒŗã‚ŋãƒŧプナイã‚ē", "UpgradeToGetMore_engagement-dashboard_Title": "分析", "UpgradeToGetMore_auditing_Title": "ãƒĄãƒƒã‚ģãƒŧジį›ŖæŸģ" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ka-GE.i18n.json b/packages/i18n/src/locales/ka-GE.i18n.json index fb656612893d..3c550632cc4c 100644 --- a/packages/i18n/src/locales/ka-GE.i18n.json +++ b/packages/i18n/src/locales/ka-GE.i18n.json @@ -2776,11 +2776,17 @@ "Retail": "ქაáƒĒალო", "Retention_setting_changed_successfully": "შენახვის áƒŦესები áƒŦარმაáƒĸებით შეიáƒĒვალა", "RetentionPolicy": "შენახვის áƒŦესები", + "RetentionPolicy_AppliesToChannels": "ვრáƒĒელდება არხებზე", + "RetentionPolicy_AppliesToDMs": "ვრáƒĒელდება პირდაპირ შეáƒĸყობინებებზე", + "RetentionPolicy_AppliesToGroups": "ვრáƒĒელდება კერáƒĢო ჯგáƒŖფებზე", "RetentionPolicy_Enabled": "ჩართáƒŖლი", "RetentionPolicy_ExcludePinned": "მიმაგრებáƒŖლი შეáƒĸყობინებების გამორიáƒĒხვა", "RetentionPolicy_FilesOnly": "მხოლოდ ფაილების áƒŦაშლა", "RetentionPolicy_FilesOnly_Description": "áƒŦაიშლება მხოლოდ ფაილები,შეáƒĸყობინებები დარჩება ადგილზე", "RetentionPolicy_MaxAge": "შეáƒĸყობინების მაáƒĨსიმალáƒŖრი ასაკი", + "RetentionPolicy_MaxAge_Channels": "არ჎ში შეáƒĸყობინების მაáƒĨსიმალáƒŖრი ასაკი", + "RetentionPolicy_MaxAge_DMs": "პირდაპირ შეáƒĸყობინებებში შეáƒĸყობინების მაáƒĨსიმალáƒŖრი ასაკი", + "RetentionPolicy_MaxAge_Groups": "პირად ჯგáƒŖფში შეáƒĸყობინების მაáƒĨსიმალáƒŖრი ასაკი", "RetentionPolicy_Precision": "áƒĸაიმერის სიზáƒŖქáƒĸე", "RetentionPolicyRoom_ExcludePinned": "მიმაგრებáƒŖლი შეáƒĸყობინებების გამორიáƒĒხვა", "RetentionPolicyRoom_MaxAge": "შეáƒĸყობინების მაáƒĨსიმალáƒŖრი ასაკი დáƒĻეებში(დეფაáƒŖლáƒĸი:{{_max}})", @@ -3672,4 +3678,4 @@ "onboarding.form.registerOfflineForm.title": "ხელით დარეგისáƒĸრირება", "UpgradeToGetMore_engagement-dashboard_Title": "ანალიáƒĸიკა", "UpgradeToGetMore_auditing_Title": "შეáƒĸყობინებების შემოáƒŦმება" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/km.i18n.json b/packages/i18n/src/locales/km.i18n.json index 698d7a72edf4..997ee66a00e7 100644 --- a/packages/i18n/src/locales/km.i18n.json +++ b/packages/i18n/src/locales/km.i18n.json @@ -2376,12 +2376,19 @@ "Retail": "លក់​រážļយ", "Retention_setting_changed_successfully": "កážļរកំណត់គោលនយោបážļយរក្សážļទážģកបážļនផ្លážļស់ប្ដážŧរដោយជោគជ័យ", "RetentionPolicy": "គោលនយោបážļយរក្សážļទážģក", + "RetentionPolicy_AppliesToChannels": "ážĸនážģវត្តទៅឆážļនែល", + "RetentionPolicy_AppliesToDMs": "ážĸនážģវត្តទៅសážļរដោយផ្ទážļល់", + "RetentionPolicy_AppliesToGroups": "ážĸនážģវត្តចំពោះក្រážģមឯកជន", "RetentionPolicy_Description": "លážģបសážļរចážļស់ៗដោយស្វ័យប្រវត្តិនៅលើ Rocket.Chat របស់ážĸ្នក។", "RetentionPolicy_Enabled": "បážļនបើក", "RetentionPolicy_ExcludePinned": "មិនរážļប់បញ្ចážŧលសážļរដែលបážļនបញ្ចážŧល", "RetentionPolicy_FilesOnly": "លážģបតែឯកសážļរ", "RetentionPolicy_FilesOnly_Description": "មážļនតែឯកសážļរប៉ážģណ្ណោះដែលនឹងត្រážŧវលážģបចោលសážļររបស់ពážŊកគេនឹងនៅតែបន្ត។", "RetentionPolicy_MaxAge": "ážĸážļយážģសážļរážĸតិបរមážļ", + "RetentionPolicy_MaxAge_Channels": "ážĸážļយážģសážļរážĸតិបរមážļនៅក្នážģងឆážļនែល", + "RetentionPolicy_MaxAge_Description": "កážļត់បន្ថយសážļរទážļំងážĸស់ដែលចážļស់ជážļងតម្លៃនេះជážļថ្ងៃ", + "RetentionPolicy_MaxAge_DMs": "ážĸážļយážģសážļរážĸតិបរមážļនៅក្នážģងសážļរដោយផ្ទážļល់", + "RetentionPolicy_MaxAge_Groups": "ážĸážļយážģសážļរážĸតិបរមážļក្នážģងក្រážģមឯកជន", "RetentionPolicy_Precision": "កážļរបញ្ជážļក់ពេលវេលážļ", "RetentionPolicy_Precision_Description": "រយៈពេលប៉ážģន្មážļនដែលážĸ្នកល្ពៅគážŊរតែដំណើរកážļរ។ កážļរកំណត់នេះទៅជážļតម្លៃច្បážļស់លážļស់បន្ថែមទៀតធ្វើឱ្យឆážļនែលដែលមážļនឧបករណ៍កំណត់ពេលរក្សážļទážģកយ៉ážļងឆážļប់រហ័សដំណើរកážļរបážļនល្ážĸប៉ážģន្តែវážļážĸážļចធ្វើážĸោយចំណážļយថážļមពលដំណើរកážļរបន្ថែមលើសហគមន៍ធំ ៗ ។", "RetentionPolicyRoom_Enabled": "លážģបសážļរចážļស់ដោយស្វ័យប្រវត្តិ", @@ -3116,4 +3123,4 @@ "Enterprise": "សហគ្រážļស", "UpgradeToGetMore_engagement-dashboard_Title": "វិភážļគ", "UpgradeToGetMore_auditing_Title": "សវនកម្មសážļរ" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ko.i18n.json b/packages/i18n/src/locales/ko.i18n.json index 569245e7854a..ad5818ab9f85 100644 --- a/packages/i18n/src/locales/ko.i18n.json +++ b/packages/i18n/src/locales/ko.i18n.json @@ -3025,6 +3025,9 @@ "Retail": "ė†Œë§¤", "Retention_setting_changed_successfully": "ëŗ´ėĄ´ ė •ėą… ė„¤ė •ė´ ëŗ€ę˛Ŋ되ė—ˆėŠĩ니다.", "RetentionPolicy": "ëŗ´ėĄ´ ė •ėą…", + "RetentionPolicy_AppliesToChannels": "ėą„널ė— ė ėšŠ", + "RetentionPolicy_AppliesToDMs": "개ė¸ 대화방ė— ė ėšŠ", + "RetentionPolicy_AppliesToGroups": "비ęŗĩ개 ꡸ëŖšė— ė ėšŠ", "RetentionPolicy_Description": "Rocket.Chat ė¸ėŠ¤í„´ėŠ¤ė—ė„œ ė˜¤ëž˜ëœ 메ė‹œė§€ëĨŧ ėžë™ėœŧ로 ė •ëĻŦ합니다.", "RetentionPolicy_DoNotPruneDiscussion": "토론 메ė‹œė§€ëĨŧ ė •ëĻŦ하ė§€ 마ė‹­ė‹œė˜¤", "RetentionPolicy_DoNotPrunePinned": "ęŗ ė • 된 메ė‹œė§€ëĨŧ ė •ëĻŦ하ė§€ 마ė‹­ė‹œė˜¤", @@ -3034,6 +3037,10 @@ "RetentionPolicy_FilesOnly": "파ėŧ만 ė‚­ė œ", "RetentionPolicy_FilesOnly_Description": "파ėŧ만 ė‚­ė œë˜ëŠ° 메ė‹œė§€ ėžė˛´ëŠ” 그대로 ėœ ė§€ëŠë‹ˆë‹¤.", "RetentionPolicy_MaxAge": "ėĩœëŒ€ 메ė‹œė§€ ėˆ˜ëĒ…", + "RetentionPolicy_MaxAge_Channels": "ėą„널ė˜ ėĩœëŒ€ 메ė‹œė§€ ëŗ´ėĄ´ 기간", + "RetentionPolicy_MaxAge_Description": "ė´ 값ëŗ´ë‹¤ ė˜¤ëž˜ëœ 메ė‹œė§€ëĨŧ ėŧ 단ėœ„ëĄœ ė •ëĻŦ합니다.", + "RetentionPolicy_MaxAge_DMs": "1:1 대화방ė˜ ėĩœëŒ€ 메ė‹œė§€ ėˆ˜ëĒ…", + "RetentionPolicy_MaxAge_Groups": "비ęŗĩ개 ꡸ëŖšė˜ ėĩœëŒ€ 메ė‹œė§€ ėˆ˜ëĒ…", "RetentionPolicy_Precision": "타ė´ë¨¸ ė •ë°€ë„", "RetentionPolicy_Precision_Description": "ė •ëĻŦ 타ė´ë¨¸ę°€ ė‹¤í–‰ë˜ëŠ” 빈도. ė´ëĨŧ ëŗ´ë‹¤ ė •í™•í•œ 값ėœŧ로 ė„¤ė •í•˜ëŠ´ ëš ëĨ¸ ëŗ´ėĄ´ 타ė´ë¨¸ę°€ ėžˆëŠ” ėą„널ė´ 더 ėž˜ ėž‘동하ė§€ë§Œ, 대규ëĒ¨ ėģ¤ëŽ¤ë‹ˆí‹°ė—ė„œëŠ” ė˛˜ëĻŦ ëŠĨë Ĩė´ ėļ”ę°€ëĄœ 필ėš”í•  ėˆ˜ ėžˆėŠĩ니다.", "RetentionPolicyRoom_Enabled": "ė˜¤ëž˜ëœ 메ė‹œė§€ëĨŧ ėžë™ėœŧ로 ė •ëĻŦ합니다.", @@ -4028,4 +4035,4 @@ "Enterprise": "기ė—…", "UpgradeToGetMore_engagement-dashboard_Title": "ëļ„ė„(ė—ë„ëĻŦ틱ėŠ¤)", "UpgradeToGetMore_auditing_Title": "메ė‹œė§€ 감ė‚Ŧ" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ku.i18n.json b/packages/i18n/src/locales/ku.i18n.json index 301679e681bf..9b4a4d1aaeb2 100644 --- a/packages/i18n/src/locales/ku.i18n.json +++ b/packages/i18n/src/locales/ku.i18n.json @@ -2055,12 +2055,19 @@ "Retail": "YektacirÃŽ", "Retention_setting_changed_successfully": "SÃŽstema polÃŽtÃŽkayÃĒn paşveçÃģn bi serkeftÃŽ guhertin", "RetentionPolicy": "PolÃŽtÃŽkaya ReparÃĒziyÃĒ", + "RetentionPolicy_AppliesToChannels": "Li ser kanalÃĒn xwe ye", + "RetentionPolicy_AppliesToDMs": "Li peyamÃĒn yekser peyda dike", + "RetentionPolicy_AppliesToGroups": "Li komÃĒn taybetÃŽ", "RetentionPolicy_Description": "Xweseriya xwe li ser Rocket.", "RetentionPolicy_Enabled": "VekirÃŽ", "RetentionPolicy_ExcludePinned": "PeyamÃĒn pinned", "RetentionPolicy_FilesOnly": "TenÃĒ pelan jÃĒbirin", "RetentionPolicy_FilesOnly_Description": "TenÃĒ pelÃĒn wÃĒ jÃĒbirin, peyamÃĒn xwe dÃĒ di cih de bimÃŽnin.", "RetentionPolicy_MaxAge": "MesajÃĒ herÃŽ mezintir", + "RetentionPolicy_MaxAge_Channels": "Zewaca herÃŽ mezintir di kanalÃĒn", + "RetentionPolicy_MaxAge_Description": "Di rojan de, hemÃŽ mesajÃĒn kevntir ji vÃĒ nirxÃĒ mezintir bide", + "RetentionPolicy_MaxAge_DMs": "MesajÃĒ herÃŽ mezintir di navnÃŽÅŸÃĒn peyamÃĒ de", + "RetentionPolicy_MaxAge_Groups": "Di nav komÃĒn taybet de herÃŽ mezintirÃŽn mesajÃĒ", "RetentionPolicy_Precision": "Timer Precision", "RetentionPolicy_Precision_Description": "Heya caran timer prune divÃĒ diçin. Sazkirina vÃĒ nirxÃĒ bÃĒtir rastÃŽn dike ku kanalÃĒn bi timÃĒn bÃĒdeng yÃĒn zÃģtir baş dixebite, lÃĒ dibe ku li ser civakÃĒn mezin.", "RetentionPolicyRoom_Enabled": "PeyamÃĒn kevnÃĒn xwe yÃĒn otomatÃŽk dihÃĒle", @@ -2748,4 +2755,4 @@ "registration.component.form.sendConfirmationEmail": "ØĻیŲ…Û•ÛŒÚĩی ŲžØ´ØĒڕاØŗØĒÚŠØąØ¯Ų†Û•ŲˆÛ• بŲ†ÛŽØąÛ•", "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/lo.i18n.json b/packages/i18n/src/locales/lo.i18n.json index 441e3c09cafe..d427b251e863 100644 --- a/packages/i18n/src/locales/lo.i18n.json +++ b/packages/i18n/src/locales/lo.i18n.json @@ -2098,12 +2098,19 @@ "Retail": "āē‚āē˛āēâ€‹āēāģˆāē­āē", "Retention_setting_changed_successfully": "āēāē˛āē™āē•āēąāģ‰āē‡āē„āģˆāē˛āē™āē°āģ‚āēāēšāē˛āēāēŽāēąāēāēĒāē˛āē„āē§āē˛āēĄāē›āē­āē”āģ„āēžāģ„āē”āģ‰āē›āģˆāēŊāē™āģāē›āē‡āēĸāģˆāē˛āē‡āēĒāģāē˛āģ€āēĨāēąāē”", "RetentionPolicy": "āē™āē°āģ‚āēāēšāē˛āēāēŽāēąāēāēĒāē˛", + "RetentionPolicy_AppliesToChannels": "āē™āģāē˛āģƒāēŠāģ‰āēāēąāēšāēŠāģˆāē­āē‡āē—āē˛āē‡", + "RetentionPolicy_AppliesToDMs": "āģƒāēŠāģ‰āēāēąāēšāē‚āģāģ‰āē„āē§āē˛āēĄāģ‚āē”āēāēāēģāē‡", + "RetentionPolicy_AppliesToGroups": "āē™āģāē˛āģƒāēŠāģ‰āēāēąāēšāēāē¸āģˆāēĄāģ€āē­āēāē°āēŠāēģāē™", "RetentionPolicy_Description": "āē­āēąāē”āē•āē°āģ‚āē™āēĄāēąāē” prunes āē‚āģāģ‰āē„āē§āē˛āēĄāģ€āēāēģāģˆāē˛āģƒāē™āē•āēģāē§āēĸāģˆāē˛āē‡ RocketChat āē‚āē­āē‡āē—āģˆāē˛āē™.", "RetentionPolicy_Enabled": "Enabled", "RetentionPolicy_ExcludePinned": "āēāēģāēāģ€āē§āēąāģ‰āē™āē‚āģāģ‰āē„āē§āē˛āēĄāē—āēĩāģˆāēĄāēĩ PINned", "RetentionPolicy_FilesOnly": "āēžāēŊāē‡āģāē•āģˆāēĨāēļāēšāģ„āēŸāēĨāģŒ", "RetentionPolicy_FilesOnly_Description": "āģ„āēŸāēĨāģŒāēžāēŊāē‡āģāē•āģˆāēˆāē°āē–āēˇāēāēĨāēļāēš, āē‚āģāģ‰āē„āē§āē˛āēĄāē‚āē­āē‡āģ€āē‚āēģāē˛āģ€āēˆāēģāģ‰āē˛āģ€āē­āē‡āēˆāē°āēĸāēšāģˆāģƒāē™āēĒāē°āē–āē˛āē™āē—āēĩāģˆ.", "RetentionPolicy_MaxAge": "Age message āēĒāēšāē‡āēĒāē¸āē”", + "RetentionPolicy_MaxAge_Channels": "āē­āē˛āēāē¸āēĒāēšāē‡āēĒāē¸āē”āē‚āē­āē‡āē‚āģāģ‰āē„āē§āē˛āēĄāģƒāē™āēŠāģˆāē­āē‡āē—āē˛āē‡", + "RetentionPolicy_MaxAge_Description": "āēāē˛āē™āģāēāģ‰āģ„āē‚āē‚āģāģ‰āē„āē§āē˛āēĄāģ€āēāēģāģˆāē˛āēāē§āģˆāē˛āēĄāēšāē™āē„āģˆāē˛āē™āēĩāģ‰, āģƒāē™āēĄāēˇāģ‰", + "RetentionPolicy_MaxAge_DMs": "āē­āē˛āēāē¸āēĒāēšāē‡āēĒāē¸āē”āē‚āē­āē‡āē‚āģāģ‰āē„āē§āē˛āēĄāģƒāē™āē‚āģāģ‰āē„āē§āē˛āēĄāģ‚āē”āēāēāēģāē‡", + "RetentionPolicy_MaxAge_Groups": "āē­āē˛āēāē¸āēĒāēšāē‡āēĒāē¸āē”āē‚āģāģ‰āē„āē§āē˛āēĄāģƒāē™āēāē¸āģˆāēĄāģ€āē­āēāē°āēŠāēģāē™", "RetentionPolicy_Precision": "Timer Precision", "RetentionPolicy_Precision_Description": "āģ€āē§āēĨāē˛āē—āēĩāģˆāģƒāēŠāģ‰āģ€āē§āēĨāē˛āēĄāēąāē™āē„āē§āē™āģƒāēŠāģ‰. āēāē˛āē™āē•āēąāģ‰āē‡āē„āģˆāē˛āē™āēĩāģ‰āģƒāēĢāģ‰āēĄāēĩāēĄāēšāē™āē„āģˆāē˛āē—āēĩāģˆāēŠāēąāē”āģ€āēˆāē™āēĢāēŧāē˛āēāģ€āēŽāēąāē”āģƒāēĢāģ‰āēŠāģˆāē­āē‡āē—āēĩāģˆāēĄāēĩāģ€āē§āēĨāē˛āģ€āēāēąāēšāēŽāēąāēāēĒāē˛āģ„āē§āē‚āēļāģ‰āē™āģ€āēŽāēąāē”āē§āēŊāēāē”āēĩāē‚āēļāģ‰āē™āģāē•āģˆāē­āē˛āē”āēˆāē°āēĄāēĩāē„āģˆāē˛āģƒāēŠāģ‰āēˆāģˆāē˛āēāģƒāē™āēāē˛āē™āē›āē°āēĄāē§āē™āēœāēģāē™āēžāē´āģ€āēĒāē”āģƒāē™āēŠāē¸āēĄāēŠāēģāē™āē‚āē°āēĢāē™āē˛āē”āģƒāēĢāēāģˆ.", "RetentionPolicyRoom_Enabled": "āēĨāēļāēšāē‚āģāģ‰āē„āē§āē˛āēĄāģ€āēāēģāģˆāē˛āē­āēąāē”āē•āē°āģ‚āē™āēĄāēąāē”", @@ -2795,4 +2802,4 @@ "registration.component.form.sendConfirmationEmail": "āēĒāēģāģˆāē‡āē­āēĩāģ€āēĄāē§āēāē˛āē™āēĸāēˇāē™āēĸāēąāē™", "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "āēāē˛āē™āē§āē´āģ€āē„āē˛āē°" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/lt.i18n.json b/packages/i18n/src/locales/lt.i18n.json index f2763da5288d..88fb66dc554f 100644 --- a/packages/i18n/src/locales/lt.i18n.json +++ b/packages/i18n/src/locales/lt.i18n.json @@ -2115,12 +2115,19 @@ "Retail": "MaÅžmeninė", "Retention_setting_changed_successfully": "Saugojimo politikos nustatymas sėkmingai pasikeitė", "RetentionPolicy": "Saugojimo politika", + "RetentionPolicy_AppliesToChannels": "Taikoma kanalams", + "RetentionPolicy_AppliesToDMs": "Taikoma tiesioginiams praneÅĄimams", + "RetentionPolicy_AppliesToGroups": "Taikoma privačioms grupėms", "RetentionPolicy_Description": "AutomatiÅĄkai sunaikina senus praneÅĄimus per savo \"Rocket.Chat\" egzemplioriÅŗ.", "RetentionPolicy_Enabled": "ÄŽjungtas", "RetentionPolicy_ExcludePinned": "IÅĄskirti prisegtus praneÅĄimus", "RetentionPolicy_FilesOnly": "IÅĄtrinti tik failus", "RetentionPolicy_FilesOnly_Description": "Tik failai bus iÅĄtrinti, o pačios Åžinutės iÅĄliks.", "RetentionPolicy_MaxAge": "Maksimalus praneÅĄimo amÅžius", + "RetentionPolicy_MaxAge_Channels": "DidÅžiausias praneÅĄimÅŗ amÅžius kanaluose", + "RetentionPolicy_MaxAge_Description": "Sulenkite visus praneÅĄimus, senesnes uÅž ÅĄią vertę, dienÅŗ", + "RetentionPolicy_MaxAge_DMs": "Maksimalus praneÅĄimÅŗ amÅžius tiesioginiuose praneÅĄimuose", + "RetentionPolicy_MaxAge_Groups": "Maksimalus praneÅĄimÅŗ amÅžius privačiose grupėse", "RetentionPolicy_Precision": "Laikmatis tikslumas", "RetentionPolicy_Precision_Description": "Kaip daÅžnai turi bÅĢti paleidÅžiamas kopÅĢstÅŗ laikrodis. Jei norite nustatyti tikslesnę reikÅĄmę, kanalai su greitojo saugojimo laikmačiais dirba geriau, bet didelėms bendruomenėms gali bÅĢti brangesta papildoma apdorojimo galia.", "RetentionPolicyRoom_Enabled": "AutomatiÅĄkai sunaikinti senus praneÅĄimus", @@ -2813,4 +2820,4 @@ "registration.component.form.sendConfirmationEmail": "SiÅŗsti patvirtinimo el. LaiÅĄką", "Enterprise": "ÄŽmonė", "UpgradeToGetMore_engagement-dashboard_Title": "\"Analytics\"" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/lv.i18n.json b/packages/i18n/src/locales/lv.i18n.json index 80115585d934..544eac3dbeb3 100644 --- a/packages/i18n/src/locales/lv.i18n.json +++ b/packages/i18n/src/locales/lv.i18n.json @@ -2073,12 +2073,19 @@ "Retail": "MazumtirdzniecÄĢba", "Retention_setting_changed_successfully": "SaglabÄÅĄanas politikas iestatÄĢjumi ir veiksmÄĢgi mainÄĢti", "RetentionPolicy": "SaglabÄÅĄanas politika", + "RetentionPolicy_AppliesToChannels": "Attiecas uz kanāliem", + "RetentionPolicy_AppliesToDMs": "Attiecas uz tieÅĄajiem ziņojumiem", + "RetentionPolicy_AppliesToGroups": "Attiecas uz privātām grupām", "RetentionPolicy_Description": "Automātiski apgrieÅž vecos ziņojumus visā jÅĢsu Rocket.Chat eksemplārā.", "RetentionPolicy_Enabled": "Iespējots", "RetentionPolicy_ExcludePinned": "Izslēgt piespraustos ziņojumus", "RetentionPolicy_FilesOnly": "Dzēst tikai failus", "RetentionPolicy_FilesOnly_Description": "Tiks dzēsti tikai faili, paÅĄi ziņojumi paliks.", "RetentionPolicy_MaxAge": "Maksimālais ziņojumu vecums", + "RetentionPolicy_MaxAge_Channels": "Maksimālais ziņojumu vecums kanālos", + "RetentionPolicy_MaxAge_Description": "Apgriezt visus ziņojumus, kas vecāki par ÅĄo vērtÄĢbu, dienās", + "RetentionPolicy_MaxAge_DMs": "Maksimālais ziņojumu vecums tieÅĄajos ziņojumos", + "RetentionPolicy_MaxAge_Groups": "Maksimālais ziņojumu vecums privātās grupās", "RetentionPolicy_Precision": "Taimera precizitāte", "RetentionPolicy_Precision_Description": "Cik bieÅži ir apgrieÅĄanas taimerim bÅĢtu jādarbojas? Iestatot to precÄĢzāku ar vērtÄĢbu, kanāli ar ātru saglabÄÅĄanas taimeri darbojas labāk, taču lielām grupām tas var prasÄĢt vairāk apstrādes jaudas.", "RetentionPolicyRoom_Enabled": "Automātiski apgrieÅž vecās ziņas", @@ -2754,4 +2761,4 @@ "registration.component.form.sendConfirmationEmail": "NosÅĢtÄĢt apstiprinājuma e-pastu", "Enterprise": "Uzņēmums", "UpgradeToGetMore_engagement-dashboard_Title": "AnalÄĢtika" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/mn.i18n.json b/packages/i18n/src/locales/mn.i18n.json index a0bc5c3f9da2..60e18063b49f 100644 --- a/packages/i18n/src/locales/mn.i18n.json +++ b/packages/i18n/src/locales/mn.i18n.json @@ -2055,12 +2055,19 @@ "Retail": "ЖиĐļиĐŗĐģŅĐŊ Ņ…ŅƒĐ´Đ°ĐģĐ´Đ°Đ°", "Retention_setting_changed_successfully": "ĐĨĐ°Đ´ĐŗĐ°ĐģĐ°ĐģŅ‚Ņ‹ĐŊ йОдĐģĐžĐŗŅ‹ĐŊ Ņ‚ĐžŅ…иŅ€ĐŗОО Đ°ĐŧĐļиĐģŅ‚Ņ‚Đ°Đš йОĐģŅĐžĐŊ", "RetentionPolicy": "БаŅ‚ĐģĐ°ĐŊ ​​Ņ…Đ°ĐŧĐŗĐ°Đ°ĐģĐ°Ņ… йОдĐģĐžĐŗĐž", + "RetentionPolicy_AppliesToChannels": "ĐĄŅƒĐ˛Đ°Đŗ Đ°ŅˆĐ¸ĐŗĐģĐ°Ņ…", + "RetentionPolicy_AppliesToDMs": "МĐĩŅŅĐĩĐļиКĐŗ Đ°ŅˆĐ¸ĐŗĐģĐ°Ņ…Đ°Đ´ Đ°ŅˆĐ¸ĐŗĐģĐ°Đ´Đ°Đŗ", + "RetentionPolicy_AppliesToGroups": "ĐĨŅƒĐ˛Đ¸ĐšĐŊ ĐąŌ¯ĐģĐŗŌ¯Ō¯Đ´ŅĐ´ Ņ…ŅŅ€ŅĐŗĐģŅĐŊŅ", "RetentionPolicy_Description": "Ķ¨ĶŠŅ€Đ¸ĐšĐŊ Rocket Đ´ŅŅŅ€ Ņ…ŅƒŅƒŅ‡Đ¸ĐŊ СŅƒŅ€Đ˛Đ°ŅŅƒŅƒĐ´Ņ‹Đŗ авŅ‚ĐžĐŧĐ°Ņ‚Đ°Đ°Ņ€ Đ´Đ°Ņ€Đļ СаŅĐŊĐ° ŅƒŅƒ.", "RetentionPolicy_Enabled": "ИдŅĐ˛Ņ…ĐļŌ¯Ō¯ĐģŅŅĐŊ", "RetentionPolicy_ExcludePinned": "ĐĸŅĐŧĐ´ŅĐŗĐģŅŅŅĐŊ СŅƒŅ€Đ˛Đ°ŅŅƒŅƒĐ´Ņ‹Đŗ Ņ…Đ°ŅĐŊĐ° ŅƒŅƒ", "RetentionPolicy_FilesOnly": "ЗĶŠĐ˛Ņ…ĶŠĐŊ Ņ„Đ°ĐšĐģŅƒŅƒĐ´Ņ‹Đŗ ŅƒŅŅ‚ĐŗĐ°Ņ…", "RetentionPolicy_FilesOnly_Description": "ЗĶŠĐ˛Ņ…ĶŠĐŊ Ņ„Đ°ĐšĐģŅƒŅƒĐ´ ŅƒŅŅ‚Đ°Ņ… йОĐģĐŊĐž, ĐŧŅĐ´ŅŅĐŊŌ¯Ō¯Đ´ ĐŊŅŒ ĶŠĶŠŅ€ĶŠĶŠ йиĐĩĐģŅĐŗĐ´ŅŅ… йОĐģĐŊĐž.", "RetentionPolicy_MaxAge": "МĐĩŅŅĐĩĐļĐŊиК Ņ…Đ°ĐŧĐŗиКĐŊ иŅ… ĐŊĐ°Ņ", + "RetentionPolicy_MaxAge_Channels": "ĐĄŅƒĐ˛ĐŗиКĐŊ Ņ…Đ°ĐŧĐŗиКĐŊ иŅ… СŅƒŅ€Đ˛Đ°ŅŅ‹ĐŊ ĐŊĐ°Ņ", + "RetentionPolicy_MaxAge_Description": "Đ­ĐŊŅ ŅƒŅ‚ĐŗŅ‹Đŗ ĶŠĐŧĐŊĶŠŅ… ĐąŌ¯Ņ… СŅƒŅ€Đ˛Đ°ŅŅƒŅƒĐ´ ĶŠĐ´Ņ€ĶŠĶŠŅ ĶŠĐ´ĶŠŅ€Ņ‚ Ņ‚Đ°ĐšĐģĐ°Ņ…", + "RetentionPolicy_MaxAge_DMs": "МĐĩŅŅĐĩĐļĐŊиК Ņ…Đ°ĐŧĐŗиКĐŊ иŅ… СŅƒŅ€Đ˛Đ°ŅŅ‹ĐŊ ĐŊĐ°Ņ", + "RetentionPolicy_MaxAge_Groups": "ĐĨŅƒĐ˛Đ¸ĐšĐŊ ĐąŌ¯ĐģĐŗŌ¯Ō¯Đ´Đ¸ĐšĐŊ Ņ…Đ°ĐŧĐŗиКĐŊ иŅ… СŅƒŅ€Đ˛Đ°ŅŅ‹ĐŊ ĐŊĐ°Ņ", "RetentionPolicy_Precision": "ĐĸĐ°ĐšĐŧĐĩŅ€ НаŅ€Đ¸ĐšĐ˛Ņ‡ĐģĐ°Đģ", "RetentionPolicy_Precision_Description": "ПŅ€ĐĩŅŅ Ņ…иКŅ… Ņ…ŅƒĐŗĐ°Ņ†Đ°Đ° Ņ…ŅŅ€ иŅ… йаКŅ… Ņ‘ŅŅ‚ОК. ŌŽŌ¯ĐŊиКĐŗ иĐģŌ¯Ō¯ ĐŊĐ°Ņ€Đ¸ĐšĐ˛Ņ‡ĐģĐ°ĐģŅ‚Đ°ĐšĐŗĐ°Đ°Ņ€ Ņ‚ĐžĐŗŅ‚ООŅ… ĐŊŅŒ Ņ‚Ō¯Ņ€ĐŗŅĐŊ Ņ…ŅƒĐŗĐ°Ņ†Đ°Đ°ĐŊĐ´ Ņ…Đ°Đ´ĐŗĐ°ĐģĐ°Ņ… ŅŅƒĐ˛ĐŗŅƒŅƒĐ´ ĐŊŅŒ иĐģŌ¯Ō¯ ŅĐ°ĐšĐŊ Đ°ĐļиĐģĐģĐ°ĐŊĐ°, ĐŗŅŅ…Đ´ŅŅ Ņ‚ĐžĐŧООŅ…ĐžĐŊ ĐąŌ¯ĐģĐŗŌ¯Ō¯Đ´ŅĐ´ иĐģŌ¯Ō¯ иŅ… йОĐģОвŅŅ€ŅƒŅƒĐģĐ°Ņ… Ņ…Ō¯Ņ‡Đ¸ĐŊ Ņ‡Đ°Đ´Đ°Đģ ŅˆĐ°Đ°Ņ€Đ´Đ´Đ°Đŗ.", "RetentionPolicyRoom_Enabled": "ĐĨŅƒŅƒŅ‡Đ¸ĐŊ СŅƒŅ€Đ˛Đ°ŅŅƒŅƒĐ´Ņ‹Đŗ авŅ‚ĐžĐŧĐ°Ņ‚Đ°Đ°Ņ€ йОĐģĐŗĐžĐŊĐž", @@ -2747,4 +2754,4 @@ "registration.component.form.sendConfirmationEmail": "БаŅ‚Đ°ĐģĐŗĐ°Đ°ĐļŅƒŅƒĐģĐ°Ņ… иĐŧŅĐšĐģ иĐģĐŗŅŅŅ…", "Enterprise": "АĐļ Đ°Ņ…ŅƒĐšĐŊ ĐŊŅĐŗĐļ", "UpgradeToGetMore_engagement-dashboard_Title": "АĐŊĐ°ĐģиŅ‚иĐē" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ms-MY.i18n.json b/packages/i18n/src/locales/ms-MY.i18n.json index cbb3907b4b0f..524260560a3f 100644 --- a/packages/i18n/src/locales/ms-MY.i18n.json +++ b/packages/i18n/src/locales/ms-MY.i18n.json @@ -2067,12 +2067,19 @@ "Retail": "Runcit", "Retention_setting_changed_successfully": "Tetapan dasar retensi berjaya berubah", "RetentionPolicy": "Dasar Pengekalan", + "RetentionPolicy_AppliesToChannels": "Terpakai kepada saluran", + "RetentionPolicy_AppliesToDMs": "Terpakai untuk mengarahkan mesej", + "RetentionPolicy_AppliesToGroups": "Terpakai kepada kumpulan swasta", "RetentionPolicy_Description": "Prun secara automatik mesej lama di seberang contoh Rocket.Chat anda.", "RetentionPolicy_Enabled": "Dihidupkan", "RetentionPolicy_ExcludePinned": "Kecualikan mesej yang disematkan", "RetentionPolicy_FilesOnly": "Hanya padamkan fail", "RetentionPolicy_FilesOnly_Description": "Hanya fail yang akan dipadam, mesej itu sendiri akan kekal di tempat.", "RetentionPolicy_MaxAge": "Umur mesej maksimum", + "RetentionPolicy_MaxAge_Channels": "Umur mesej maksimum dalam saluran", + "RetentionPolicy_MaxAge_Description": "Potong semua mesej yang lebih tua daripada nilai ini, dalam beberapa hari", + "RetentionPolicy_MaxAge_DMs": "Umur mesej maksimum dalam mesej langsung", + "RetentionPolicy_MaxAge_Groups": "Umur mesej maksimum dalam kumpulan swasta", "RetentionPolicy_Precision": "Ketepatan pemasa", "RetentionPolicy_Precision_Description": "Berapa kerap pemasa prune perlu dijalankan. Menetapkan ini ke nilai yang lebih tepat menjadikan saluran dengan pemasa cepat pemasa berfungsi dengan lebih baik, tetapi mungkin memerlukan kuasa pemprosesan tambahan pada komuniti besar.", "RetentionPolicyRoom_Enabled": "Buang mesej lama secara automatik", @@ -2762,4 +2769,4 @@ "registration.component.form.sendConfirmationEmail": "Hantar e-mel pengesahan", "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analisis" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/nb-NO.i18n.json b/packages/i18n/src/locales/nb-NO.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/packages/i18n/src/locales/nb-NO.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/packages/i18n/src/locales/nl.i18n.json b/packages/i18n/src/locales/nl.i18n.json index 75609ebc3472..bf7f7ffb780c 100644 --- a/packages/i18n/src/locales/nl.i18n.json +++ b/packages/i18n/src/locales/nl.i18n.json @@ -3525,6 +3525,9 @@ "RetentionPolicy_Advanced_Precision": "Configuratie van geavanceerde retentiebeleid gebruiken", "RetentionPolicy_Advanced_Precision_Cron": "Gebruik cron geavanceerde retentiebeleid", "RetentionPolicy_Advanced_Precision_Cron_Description": "Hoe vaak de prune-timer moet worden uitgevoerd, gedefinieerd door cron job expressie. Als u dit instelt op een nauwkeurigere waarde, werken kanalen met snelle retentietimers beter, maar kan dit extra verwerkingskracht kosten voor grote gemeenschappen.", + "RetentionPolicy_AppliesToChannels": "Geldt voor kanalen", + "RetentionPolicy_AppliesToDMs": "Geldt voor directe berichten", + "RetentionPolicy_AppliesToGroups": "Geldt voor privÊgroepen", "RetentionPolicy_Description": "Verwijdert automatisch oude berichten uit uw Rocket.Chat-instantie.", "RetentionPolicy_DoNotPruneDiscussion": "Geen discussieberichten snoeien", "RetentionPolicy_DoNotPrunePinned": "Verwijder vastgezette berichten niet", @@ -3534,6 +3537,10 @@ "RetentionPolicy_FilesOnly": "Alleen bestanden verwijderen", "RetentionPolicy_FilesOnly_Description": "Alleen bestanden worden verwijderd, de berichten zelf blijven op hun plaats.", "RetentionPolicy_MaxAge": "Maximale berichtleeftijd", + "RetentionPolicy_MaxAge_Channels": "Maximale berichtleeftijd in kanalen", + "RetentionPolicy_MaxAge_Description": "Snoei alle berichten die ouder zijn dan deze waarde, in dagen", + "RetentionPolicy_MaxAge_DMs": "Maximale berichtleeftijd in privÊberichten", + "RetentionPolicy_MaxAge_Groups": "Maximale berichtleeftijd in privÊgroepen", "RetentionPolicy_Precision": "Timer precisie", "RetentionPolicy_Precision_Description": "Hoe vaak de prune-timer moet worden uitgevoerd. Als u dit instelt op een nauwkeurigere waarde, werken kanalen met snelle retentietimers beter, maar kan dit extra verwerkingskracht kosten voor grote gemeenschappen.", "RetentionPolicyRoom_Enabled": "Oude berichten automatisch snoeien", @@ -4865,4 +4872,4 @@ "Enterprise": "Onderneming", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", "UpgradeToGetMore_auditing_Title": "Bericht auditing" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/nn.i18n.json b/packages/i18n/src/locales/nn.i18n.json new file mode 100644 index 000000000000..6f31cf5a2e62 --- /dev/null +++ b/packages/i18n/src/locales/nn.i18n.json @@ -0,0 +1 @@ +{ } \ No newline at end of file diff --git a/packages/i18n/src/locales/no.i18n.json b/packages/i18n/src/locales/no.i18n.json index 8a3bbed273f4..5bdbf2fb89cc 100644 --- a/packages/i18n/src/locales/no.i18n.json +++ b/packages/i18n/src/locales/no.i18n.json @@ -3459,12 +3459,19 @@ "Retail": "Detaljhandel", "Retention_setting_changed_successfully": "Retenspolicyinnstillingen ble endret", "RetentionPolicy": "Retensjonspolitikk", + "RetentionPolicy_AppliesToChannels": "Gjelder kanaler", + "RetentionPolicy_AppliesToDMs": "Gjelder direkte meldinger", + "RetentionPolicy_AppliesToGroups": "Gjelder for private grupper", "RetentionPolicy_Description": "Beskytter automatisk gamle meldinger over Rocket.Chat-forekomsten din.", "RetentionPolicy_Enabled": "aktivert", "RetentionPolicy_ExcludePinned": "Ekskluder pinnede meldinger", "RetentionPolicy_FilesOnly": "Bare slett filer", "RetentionPolicy_FilesOnly_Description": "Bare filer vil bli slettet, meldingene selv vil forbli pÃĨ plass.", "RetentionPolicy_MaxAge": "Maksimal meldingsalder", + "RetentionPolicy_MaxAge_Channels": "Maksimal meldingsalder i kanaler", + "RetentionPolicy_MaxAge_Description": "BeskjÃĻr alle meldinger som er eldre enn denne verdien, i dager", + "RetentionPolicy_MaxAge_DMs": "Maksimal meldingsalder i direkte meldinger", + "RetentionPolicy_MaxAge_Groups": "Maksimal meldingsalder i private grupper", "RetentionPolicy_Precision": "Timer Precision", "RetentionPolicy_Precision_Description": "Hvor ofte prune timer skal løpe. Innstilling av dette til en mer presis verdi gjør at kanaler med raske retensjonstidtakere fungerer bedre, men kan koste ekstra prosessorkraft pÃĨ store lokalsamfunn.", "RetentionPolicyRoom_Enabled": "BeskjÃĻr automatisk gamle meldinger", @@ -4573,4 +4580,4 @@ "free_per_month_user": "$0 per mÃĨned per bruker", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", "Buy_more": "Kjøp mer" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/pa-IN.i18n.json b/packages/i18n/src/locales/pa-IN.i18n.json index 18aa4d8eee0b..2a6903f9781c 100644 --- a/packages/i18n/src/locales/pa-IN.i18n.json +++ b/packages/i18n/src/locales/pa-IN.i18n.json @@ -1,5 +1,6 @@ { "500": "ā¨…āŠ°ā¨Ļā¨°āŠ‚ā¨¨āŠ€ ā¨¸ā¨°ā¨ĩā¨° ā¨—āŠœā¨ŦāŠœ", + "__count__empty_rooms_will_be_removed_automatically__rooms__": "{{count}} empty rooms will be removed automatically:
    {{rooms}}.", "set__username__as__role_": "set {{username}} ā¨¨āŠ‚āŠ° {{role}}", "away": "ā¨ĻāŠ‚ā¨°", "Away": "ā¨ĻāŠ‚ā¨°", diff --git a/packages/i18n/src/locales/pl.i18n.json b/packages/i18n/src/locales/pl.i18n.json index 08f0e9bcedcb..b7d60c54ee2c 100644 --- a/packages/i18n/src/locales/pl.i18n.json +++ b/packages/i18n/src/locales/pl.i18n.json @@ -1,21 +1,39 @@ { "500": "Wewnętrzny błąd serwera", "__count__message_pruned_few": "{{count}} wiadomość(i) usuniętych", + "__agents__agents_and__count__conversations__period__": "{{agents}} agentÃŗw i {{count}} rozmÃŗw, {{period}}", "__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", "__count__message_pruned_many": "{{count}} wiadomość(i) usuniętych", + "__count__conversations__period__": "{{count}} rozmowy, {{period}}", "__usersCount__member_joined_few": "+ {{count}} członkÃŗw dołączyło", + "__count__tags__and__count__conversations__period__": "{{count}} tagÃŗw i {{conversations}} konwersacji, {{period}}", + "__departments__departments_and__count__conversations__period__": "{{departments}} działÃŗw i {{count}} rozmÃŗw, {{period}}", "__usersCount__member_joined_one": "+ {{count}} członek dołączył", "__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}}", "__username__was_set__role__by__user_by_": "UÅŧytkownik {{username}} otrzymał rolę {{role}} od uÅŧytkownika {{user_by}}", + "__count__without__department__": "{{count}} bez działu", + "__count__without__tags__": "{{count}} bez tagÃŗw", + "__count__without__assignee__": "{{count}} bez przypisania", + "__roomName__was_added_to_favorites": "{{roomName}} został dodany do ulubionych", "__usersCount__member_joined_many": "+ {{count}} członkÃŗw dołączyło", + "__roomName__was_removed_from_favorites": "{{roomName}} został usunięty z ulubionych", + "__roomName__is_encrypted": "{{roomName}} jest szyfrowany", + "__roomName__encryption_keys_need_to_be_updated": "{{roomName}} klucze szyfrowania muszą zostać zaktualizowane, aby umoÅŧliwić dostęp. Aby tak się stało, inny członek pokoju musi być online.", + "removed__username__as__role_": "usunięto {{username}} jako {{role}}", + "set__username__as__role_": "ustaw {{username}} jako {{role}}", + "sequential_message": "komunikat sekwencyjny", "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", + "Third_party_login": "Logowanie przez stronę trzecią", + "Enabled_E2E_Encryption_for_this_room": "włączone szyfrowanie E2E dla tego pokoju", + "Enable_business_hours": "Włącz godziny pracy", "disabled": "wyłączone", + "Disabled_E2E_Encryption_for_this_room": "wyłączone szyfrowanie E2E dla tego pokoju", "@username": "@nazwa_uÅŧytkownika", "@username_message": "@nazwa_uÅŧytkownika ", "#channel": "#kanał", @@ -25,9 +43,18 @@ "2_Erros_Information_and_Debug": "2 – Błędy, informacje i debugowanie", "12_Hour": "Zegar 12-godzinny", "24_Hour": "Zegar 24-godzinny", + "A_cloud-based_platform_for_those_needing_a_plug-and-play_app": "Oparta na chmurze platforma dla tych, ktÃŗrzy potrzebują aplikacji typu plug-and-play.", "A_new_owner_will_be_assigned_automatically_to__count__rooms": "Nowy właściciel zostanie automatycznie przypisany do {{count}} pokoi.", "A_new_owner_will_be_assigned_automatically_to_the__roomName__room": "Nowy właściciel zostanie automatycznie przypisany do pokoju o nazwie {{roomName}}", "A_new_owner_will_be_assigned_automatically_to_those__count__rooms__rooms__": "Nowy właściciel zostanie automatyczne przypisany do tych {{count}} pokoi:
    {{rooms}}.", + "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "Bezpieczne i wysoce prywatne rozwiązanie do samodzielnego zarządzania połączeniami konferencyjnymi.", + "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "Administrator obszaru roboczego musi zainstalować i skonfigurować aplikację do połączeń konferencyjnych.", + "An_app_needs_to_be_installed_and_configured": "Aplikacja musi zostać zainstalowana i skonfigurowana.", + "Accessibility": "Dostępność", + "Accessibility_and_Appearance": "Dostępność i wygląd", + "Accessibility_activation": "W tym miejscu moÅŧna aktywować szereg funkcji poprawiających komfort przeglądania.", + "Accessibility_statement": "Oświadczenie o dostępności", + "Accessibility_feature_documentation": "Dokumentacja funkcji dostępności", "Accept_Call": "Odbierz połączenie", "Accept": "Akceptuj", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Akceptuj przychodzące Åŧądania wielokanałowe, nawet gdy brak agentÃŗw online", @@ -39,6 +66,8 @@ "access_your_basic_information": "dostęp do podstawowych informacji", "access-mailer": "Uzyskaj dostęp do ekranu Mailer", "access-mailer_description": "Uprawnienie do wysyłania masowych wiadomości e-mail do wszystkich uÅŧytkownikÃŗw.", + "access-marketplace": "Dostęp do marketplace", + "access-marketplace_description": "Zezwolenie na przeglądanie i pobieranie aplikacji z Marketplace", "access-permissions": "Ekran uprawnień dostępu", "access-permissions_description": "Zmodyfikuj uprawnienia dla rÃŗÅŧnych rÃŗl.", "access-setting-permissions": "Zmodyfikuj uprawnienia oparte na ustawieniach", @@ -85,6 +114,7 @@ "Accounts_Default_User_Preferences_desktopNotifications": "Domyślny alert powiadomień z pulpitu", "Accounts_Default_User_Preferences_pushNotifications": "Domyślny alert powiadomień push", "Accounts_Default_User_Preferences_not_available": "Nie udało się pobrać preferencji uÅŧytkownika, poniewaÅŧ nie zostały jeszcze skonfigurowane przez uÅŧytkownika", + "Accounts_Default_User_Preferences_showThreadsInMainChannel_Description": "Po włączeniu tej opcji wszystkie odpowiedzi w wątku będą rÃŗwnieÅŧ wyświetlane bezpośrednio w głÃŗwnym pokoju. Gdy opcja ta jest wyłączona, odpowiedzi w wątku będą wyświetlane zgodnie z wyborem nadawcy.", "Accounts_DefaultUsernamePrefixSuggestion": "Domyślna sugestia prefiksu uÅŧytkownika", "Accounts_denyUnverifiedEmail": "Odrzucaj niezweryfikowane wiadomości e-mail", "Accounts_Directory_DefaultView": "Domyślny wykaz katalogÃŗw", @@ -247,6 +277,7 @@ "Accounts_ShowFormLogin": "PokaÅŧ domyślny formularz logowania", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled": "Włącz uwierzytelnianie dwuskładnikowe za pomocą TOTP", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled_Description": "UÅŧytkownicy mogą skonfigurować uwierzytelnianie dwuskładnikowe za pomocą dowolnej aplikacji TOTP, takiej jak Google Authenticator lub Authy.", + "Calls_in_queue_many": "{{count}} połączeń w kolejce", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Uruchom automatycznie uwierzytelnianie dwuskładnikowe nowych uÅŧytkownikÃŗw za pomocą poczty e-mail", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Nowi uÅŧytkownicy będą mieć domyślnie włączone uwierzytelnianie dwuskładnikowe za pomocą poczty e-mail. Mogą je wyłączyć na stronie swojego profilu.", "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Czas wygaśnięcia kodu wysłanego w wiadomości e-mail w sekundach", @@ -265,6 +296,7 @@ "API_EmbedDisabledFor": "Wyłącz osadzanie dla uÅŧytkownikÃŗw", "Accounts_UserAddedEmail_Default": "

    Witamy w [Site_Name]

    PrzejdÅē na stronę [Site_URL] i wyprÃŗbuj najlepsze dziś dostępne otwarte rozwiązanie czatu!

    MoÅŧesz zalogować się przy uÅŧyciu adresu e-mail: [email] i hasła: [password]. MoÅŧe wystąpić konieczność zmiany hasła po pierwszym logowaniu.", "Accounts_UserAddedEmail_Description": "MoÅŧesz uÅŧyć znacznikÃŗw: \n - `[name]`, `[fname]`, `[lname]`, aby wstawić odpowiednio pełną nazwę uÅŧytkownika, jego imię lub nazwisko. \n - `[email]`, aby wstawić adres e-mail uÅŧytkownika. \n - `[password]`, aby wstawić hasło uÅŧytkownika. \n - `[Site_Name]` i `[Site_URL]`, aby wstawić odpowiednio nazwę aplikacji i adres URL. ", + "Calls_in_queue_few": "{{count}} połączeń w kolejce", "API_EmbedDisabledFor_Description": "Rozdzielona przecinkami lista nazw uÅŧytkownikÃŗw, ktÃŗrym naleÅŧy wyłączyć podgląd osadzonych linkÃŗw.", "Accounts_UserAddedEmailSubject_Default": "Dodano Cię do [Site_Name]", "Accounts_Verify_Email_For_External_Accounts": "Oznaczaj Email dla kont zewnętrznych jako zweryfikowany", @@ -297,10 +329,10 @@ "add-oauth-service": "Dodaj usługę Oauth", "add-oauth-service_description": "Uprawnienie do dodawania nowej usługi Oauth", "add-team-channel": "Dodaj zespÃŗł Channel", - "Calls_in_queue_many": "{{count}} połączeń w kolejce", "add-team-channel_description": "Zezwolenie na dodanie kanału do zespołu", "add-team-member": "Dodaj członka zespołu", "add-team-member_description": "Uprawnienie do dodawania członkÃŗw do zespołu", + "Add_them": "Dodaj ich", "add-user": "Dodaj uÅŧytkownika", "add-user_description": "Uprawnienie do dodawania nowych uÅŧytkownikÃŗw do serwera na ekranie uÅŧytkownikÃŗw", "add-user-to-any-c-room": "Dodaj uÅŧytkownika do dowolnego publicznego kanału Channel", @@ -321,7 +353,6 @@ "Admin_disabled_encryption": "Administrator nie włączył szyfrowania E2E", "Admin_Info": "Informacje administracyjne", "admin-no-active-video-conf-provider": "**Połączenie konferencyjne nie jest włączone**: Skonfiguruj połączenia konferencyjne, aby były dostępne w tej przestrzeni roboczej.", - "Calls_in_queue_few": "{{count}} połączeń w kolejce", "admin-video-conf-provider-not-configured": "**Połączenie konferencyjne nie jest włączone**: Skonfiguruj połączenia konferencyjne, aby były dostępne w tej przestrzeni roboczej.", "admin-no-videoconf-provider-app": "**Połączenie konferencyjne nie jest włączone**: Aplikacje do połączeń konferencyjnych są dostępne w marketplace Rocket.Chat.", "Administration": "Administracja", @@ -382,6 +413,7 @@ "Also_send_thread_message_to_channel_behavior": "Wysyłaj wiadomości z wątku rÃŗwnieÅŧ do kanału", "Also_send_to_channel": "Wyślij takÅŧe do kanału", "Always_open_in_new_window": "Zawsze otwieraj w nowym oknie", + "Always_show_thread_replies_in_main_channel": "Zawsze wyświetlaj odpowiedzi na wątki w kanale głÃŗwnym", "Analytics": "Analityka", "Analytics_Description": "Zobacz, jak uÅŧytkownicy wchodzą w interakcję z Twoją przestrzenią roboczą.", "Analytics_features_enabled": "Funkcjonalność włączona", @@ -489,6 +521,8 @@ "Apps_context_explore": "Poznaj", "Apps_context_installed": "Zainstalowana", "Apps_context_premium": "Enterprise", + "Apps_disabled_when_Premium_trial_ended_description": "Przestrzenie robocze w wersji Community mogą mieć włączonych maksymalnie 5 aplikacji Marketplace i 3 aplikacje prywatne. Poproś administratora obszaru roboczego o ponowne włączenie aplikacji.", + "Apps_disabled_when_Premium_trial_ended_description_admin": "Przestrzenie robocze w wersji Community mogą mieć włączonych maksymalnie 5 aplikacji Marketplace i 3 aplikacje prywatne. Włącz ponownie wymagane aplikacje.", "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ć", @@ -536,7 +570,7 @@ "Apps_Logs_TTL_Alert": "W zaleÅŧności od wielkości kolekcji dziennikÃŗw zmiana tego ustawienia moÅŧe spowodować spowolnienie działania w niektÃŗrych momentach", "Apps_Marketplace_Deactivate_App_Prompt": "Czy na pewno chcesz wyłączyć tę aplikację?", "Apps_Marketplace_Login_Required_Description": "Kupowanie aplikacji z Rocket.Chat Marketplace wymaga zarejestrowania obszaru roboczego i zalogowania się.", - "Apps_Marketplace_Login_Required_Title": "Wymagane zalogowanie się do Marktetplace", + "Apps_Marketplace_Login_Required_Title": "Wymagane zalogowanie się do Marketplace", "Apps_Marketplace_Modify_App_Subscription": "Zmień subskrypcję", "Apps_Marketplace_pricingPlan_monthly": "{{price}} / miesiąc", "Apps_Marketplace_pricingPlan_monthly_perUser": "{{price}} / miesiąc od uÅŧytkownika", @@ -808,10 +842,15 @@ "Canned_Response_Sharing_Public_Description": "KaÅŧdy moÅŧe uzyskać dostęp do tej predefiniowanej odpowiedzi", "Canned_Responses": "Predefiniowane odpowiedzi", "Canned_Responses_Enable": "Włącz predefiniowane odpowiedzi", + "Create_direct_message": "Nowa wiadomość bezpośrednia", + "Create_tag": "UtwÃŗrz tag", + "Create_trigger": "UtwÃŗrz wyzwalacz", + "Create_SLA_policy": "Tworzenie zasad SLA", "Cannot_invite_users_to_direct_rooms": "Nie moÅŧna zaprosić uÅŧytkownikÃŗw do pokoi bezpośrednich", "Cannot_open_conversation_with_yourself": "Nie moÅŧna wysłać wiadomości bezpośredniej do siebie", "Cannot_share_your_location": "Nie moÅŧna udostępnić Twojej lokalizacjiâ€Ļ", "Cannot_disable_while_on_call": "Nie moÅŧna zmienić status w trakcie połączenia", + "Cant_join": "Nie mogę dołączyć", "CAS": "CAS", "CAS_Description": "Centralna usługa uwierzytelniania umoÅŧliwia członkom korzystanie z jednego zestawu poświadczeń do logowania się do wielu witryn za pośrednictwem wielu protokołÃŗw.", "CAS_autoclose": "Automatycznie zamykaj okienko logowania", @@ -825,6 +864,7 @@ "CAS_enabled": "Włączone", "CAS_Login_Layout": "Układ logowania CAS", "CAS_login_url": "Adres URL logowania SSO", + "message_counter_many": "{{count}} wiadomości", "CAS_login_url_Description": "Adres URL logowania zewnętrznej usługi SSO, np.: `https://sso.example.undef/sso/login`", "CAS_popup_height": "Wysokość okna logowania", "CAS_popup_width": "Szerokość okna logowania", @@ -840,14 +880,18 @@ "Categories*": "Kategorie*", "CDN_JSCSS_PREFIX": "Prefiks CDN dla JS/CSS", "CDN_PREFIX": "Prefiks CDN", + "meteor_status_reconnect_in_many": "sprÃŗbuj jeszcze raz za {{count}} sekund...", "CDN_PREFIX_ALL": "UÅŧywaj prefiksu CDN dla wszystkich zasobÃŗw", "Certificates_and_Keys": "Certyfikaty i klucze", + "changed_room_announcement_to__room_announcement_": "zmieniono ogłoszenie o pokoju na: {{room_announcement}}", + "changed_room_description_to__room_description_": "zmieniono opis pokoju na: {{room_description}}", "change-livechat-room-visitor": "Zmień gości w pokoju Livechat", "change-livechat-room-visitor_description": "Uprawnienie do dodawania dodatkowych informacji do gościa pokoju Livechat", "Change_Room_Type": "Zmiana typu pokoju", "Changing_email": "Zmiana adresu e-mail", "channel": "kanał", "Channel": "Kanał", + "Channel_info": "Informacje o kanale", "Channel_already_exist": "Kanał „#%s” juÅŧ istnieje.", "Channel_already_exist_static": "Kanał juÅŧ istnieje.", "Channel_already_Unarchived": "Kanał o nazwie „#%s” jest juÅŧ w stanie niezarchiwizowanym", @@ -859,6 +903,7 @@ "Channel_Name_Placeholder": "WprowadÅē nazwę kanałuâ€Ļ", "Channel_to_listen_on": "Kanał do słuchania", "Channel_Unarchived": "Kanał o nazwie „#%s” został przywrÃŗcony z archiwum", + "Channel__roomName__": "Kanał {{roomName}}.", "Channels": "Kanały", "Channels_added": "Kanały zostały dodane", "Channels_are_where_your_team_communicate": "Kanały są miejscem, w ktÃŗrym zespÃŗł się komunikuje", @@ -888,6 +933,7 @@ "Chat_Duration": "Czas trwania czatu", "Chats_removed": "Czaty usunięte", "Check_All": "Zaznacz wszystko", + "Check_back_later": "SprawdÅē pÃŗÅēniej", "Check_if_the_spelling_is_correct": "SprawdÅē, czy pisownia jest poprawna", "Check_Progress": "SprawdÅē postęp", "Check_device_activity": "SprawdÅē aktywność urządzenia", @@ -911,6 +957,7 @@ "Click_here": "Kliknij tutaj", "Click_here_for_more_details_or_contact_sales_for_a_new_license": "Kliknij tutaj, aby uzyskać więcej informacji, lub napisz na adres {{email}} w celu uzyskania nowej licencji.", "Click_here_for_more_info": "Kliknij tutaj, aby uzyskać więcej informacji", + "message_counter_few": "{{count}} wiadomości", "Click_here_to_clear_the_selection": "Kliknij tutaj aby wyczyścić wybÃŗr", "Click_here_to_enter_your_encryption_password": "Kliknij tutaj, aby wprowadzić hasło szyfrowania", "Click_here_to_view_and_copy_your_password": "Kliknij tutaj, aby wyświetlić i skopiować hasło.", @@ -929,6 +976,7 @@ "close-livechat-room_description": "Uprawnienie do zamykania bieÅŧącego pokoju Omnichannel", "close-others-livechat-room": "Zamknij inny pokÃŗj Omnichannel", "close-others-livechat-room_description": "Uprawnienie do zamykania innych pokoi Omnichannel", + "Close_Window": "Zamknij okno", "Closed": "Zamknięty", "Closed_At": "Zamknięty o", "Closed_automatically": "Zamknięty automatycznie przez system", @@ -943,6 +991,7 @@ "Cloud_Invalid_license": "Nieprawidłowa licencja!", "Cloud_Apply_license": "Zastosuj licencję", "Cloud_connectivity": "Łączność w chmurze", + "meteor_status_reconnect_in_few": "sprÃŗbuj jeszcze raz za {{count}} sekund...", "Cloud_address_to_send_registration_to": "Adres, na ktÃŗry naleÅŧy wysłać wiadomość e-mail z prośbą o rejestrację w chmurze.", "Cloud_click_here": "Po skopiowaniu tekstu przejdÅē do [konsola chmury (kliknij tutaj)]({{cloudConsoleUrl}}).", "Cloud_console": "Konsola chmury", @@ -969,6 +1018,8 @@ "Cloud_troubleshooting": "Rozwiązywanie problemÃŗw", "Cloud_update_email": "Zaktualizuj adres e-mail", "Cloud_what_is_it": "Co to jest?", + "Copy_Link": "Skopiuj link", + "Copy_password": "Skopiuj hasło", "Cloud_what_is_it_additional": "Ponadto będzie moÅŧna zarządzać licencjami, rozliczeniami i wsparciem z konsoli chmury Rocket.Chat Cloud.", "Cloud_what_is_it_description": "Połączenie z chmurą Rocket.Chat umoÅŧliwia połączenie hostowanego przez siebie obszaru roboczego Rocket.Chat z usługami, ktÃŗre świadczymy w naszej chmurze.", "Cloud_what_is_it_services_like": "Usługi takie jak:", @@ -1006,8 +1057,12 @@ "Confirm_New_Password_Placeholder": "WprowadÅē ponownie nowe hasłoâ€Ļ", "Confirm_password": "PotwierdÅē hasło", "Confirm_your_password": "PotwierdÅē hasło", + "Confirm_configuration_update": "PotwierdÅē aktualizację konfiguracji", + "Confirm_new_workspace": "PotwierdÅē nowy obszar roboczy", "Confirmation": "Potwierdzenie", "Configure_video_conference": "Konfiguracja połączenia konferencyjnego", + "Configuration_update_confirmed": "Aktualizacja konfiguracji potwierdzona", + "Configuration_update": "Aktualizacja konfiguracji", "Connect": "Połącz", "Connected": "Połączony", "Connect_SSL_TLS": "Połącz się za pomocą SSL/TLS", @@ -1028,9 +1083,9 @@ "Contact_not_found": "Nie znaleziono kontaktu", "Contact_Profile": "Profil kontaktu", "Contact_Info": "Informacje o kontakcie", - "message_counter_many": "{{count}} wiadomości", "Content": "Zawartość", "Continue": "Kontynuuj", + "Continue_Adding": "Kontynuować dodawanie?", "Continuous_sound_notifications_for_new_livechat_room": "Ciągłe powiadomienia dÅēwiękowe dla nowego pokoju omnichannel", "convert-team": "Konwertuj zespÃŗł", "convert-team_description": "Zezwolenie na przekształcenie zespołu w kanał", @@ -1045,7 +1100,6 @@ "Conversations": "Rozmowy", "Conversations_per_day": "Rozmowy na dzień", "Convert": "Konwertuj", - "meteor_status_reconnect_in_many": "sprÃŗbuj jeszcze raz za {{count}} sekund...", "Convert_Ascii_Emojis": "Konwertuj ASCII na emotikon", "Convert_to_channel": "Konwertuj na kanał", "Converting_channel_to_a_team": "Konwertujesz ten kanał na zespÃŗł. Wszyscy członkowie zostaną utrzymani.", @@ -1123,7 +1177,6 @@ "Country_Denmark": "Dania", "Country_Djibouti": "DÅŧibuti", "Country_Dominica": "Dominika", - "message_counter_few": "{{count}} wiadomości", "Country_Dominican_Republic": "Dominikana", "Country_Ecuador": "Ekwador", "Country_Egypt": "Egipt", @@ -1159,7 +1212,6 @@ "Country_Heard_Island_and_Mcdonald_Islands": "Wyspy Heard i McDonalda", "Country_Holy_See_Vatican_City_State": "Watykan", "Country_Honduras": "Honduras", - "meteor_status_reconnect_in_few": "sprÃŗbuj jeszcze raz za {{count}} sekund...", "Country_Hong_Kong": "Hongkong", "Country_Hungary": "Węgry", "Country_Iceland": "Islandia", @@ -1439,7 +1491,7 @@ "Delete_message": "Usuń wiadomość", "Delete_my_account": "Usuń konto", "Delete_Role_Warning": "Usunięcie roli usunie ją na zawsze. Nie moÅŧna tego cofnąć.", - "Delete_Room_Warning": "Usunięcie pokoju spowoduje usunięcie wszystkich wiadomości wysłanych w tym pokoju. Nie moÅŧna tego cofnąć.", + "Delete_Room_Warning": "Usunięcie pokoju {{roomType}} spowoduje usunięcie wszystkich wiadomości wysłanych w tym pokoju. Nie moÅŧna tego cofnąć.", "Delete_User_Warning": "Usunięcie uÅŧytkownika spowoduje rÃŗwnieÅŧ usunięcie wszystkich wiadomości od tego uÅŧytkownika. Nie moÅŧna tego cofnąć.", "Delete_User_Warning_Delete": "Usunięcie uÅŧytkownika spowoduje rÃŗwnieÅŧ usunięcie wszystkich wiadomości od tego uÅŧytkownika. Nie moÅŧna tego cofnąć.", "Delete_User_Warning_Keep": "UÅŧytkownik zostanie usunięty, ale jego wiadomości pozostaną widoczne. Nie moÅŧna tego cofnąć.", @@ -1566,9 +1618,11 @@ "Display_unread_counter": "Wyświetl liczbę nieprzeczytanych wiadomości", "Displays_action_text": "Wyświetla tekst akcji", "Do_It_Later": "ZrÃŗb to pÃŗÅēniej", + "Displayed_next_to_name": "Wyświetlane obok nazwy", "Do_not_display_unread_counter": "Nie wyświetlaj Åŧadnego licznika tego kanału", "Do_not_provide_this_code_to_anyone": "Nie udostępniaj nikomu tego kodu.", "Do_Nothing": "Nic nie rÃŗb", + "Do_nothing": "Nic nie rÃŗb", "Do_you_have_any_notes_for_this_conversation": "Czy masz jakieś notatki do tej rozmowy?", "Do_you_want_to_accept": "Czy chcesz zaakceptować?", "Do_you_want_to_change_to_s_question": "Czy chcesz zmienić na %s?", @@ -1623,13 +1677,14 @@ "E2E_Encryption_Password_Explanation": "MoÅŧesz teraz tworzyć zaszyfrowane grupy prywatne i wiadomości bezpośrednie. MoÅŧesz rÃŗwnieÅŧ zmienić istniejące prywatne grupy lub DM na zaszyfrowane.

    To jest szyfrowanie od końca do końca, więc klucz do kodowania / dekodowania wiadomości nie zostanie zapisany na serwerze. Z tego powodu musisz przechowywać swoje hasło w bezpiecznym miejscu. Będziesz musiał wprowadzić je na innych urządzeniach, na ktÃŗrych chcesz uÅŧywać szyfrowania e2e.", "E2E_key_reset_email": "Powiadomienie o resetowaniu klucza E2E", "E2E_message_encrypted_placeholder": "Ta wiadomość jest zaszyfrowana end-to-end. Aby ją wyświetlić, musisz wprowadzić swÃŗj klucz szyfrowania w ustawieniach konta.", - "E2E_password_request_text": "Aby uzyskać dostęp do zaszyfrowanych grup prywatnych i wiadomości bezpośrednich, wprowadÅē swoje hasło szyfrowania.
    Musisz wprowadzić to hasło, aby kodować / dekodować wiadomości na kaÅŧdym uÅŧywanym kliencie, poniewaÅŧ klucz nie jest przechowywany na serwerze.", + "E2E_password_request_text": "Aby uzyskać dostęp do zaszyfrowanych grup prywatnych i wiadomości bezpośrednich, wprowadÅē swoje hasło szyfrowania. Hasło nie jest przechowywane na serwerze, więc musisz wprowadzić je na kaÅŧdym urządzeniu.", "E2E_password_reveal_text": "MoÅŧesz teraz tworzyć zaszyfrowane grupy prywatne i wiadomości bezpośrednie. MoÅŧesz rÃŗwnieÅŧ zmienić istniejące prywatne grupy lub DM na zaszyfrowane.

    To jest szyfrowanie od końca do końca, więc klucz do kodowania / dekodowania wiadomości nie zostanie zapisany na serwerze. Z tego powodu musisz przechowywać to hasło w bezpiecznym miejscu. Będziesz musiał wprowadzić go na innych urządzeniach, na ktÃŗrych chcesz uÅŧywać szyfrowania e2e. Dowiedz się więcej tutaj

    Twoje hasło: {{randomPassword}}

    to jest automatycznie wygenerowane hasło, moÅŧesz ustawić nowe hasło do szyfrowania klucza w dowolnym momencie z dowolnej przeglądarki, do ktÃŗrej wprowadziłeś istniejące hasło.
    To hasło jest przechowywane tylko w tej przeglądarce, dopÃŗki nie zapiszesz hasła i nie usuniesz tej wiadomości.", "E2E_Reset_Email_Content": "Zostałeś automatycznie wylogowany. Kiedy zalogujesz się ponownie, Rocket.Chat wygeneruje nowy klucz i przywrÃŗci TwÃŗj dostęp do kaÅŧdego zaszyfrowanego pokoju, ktÃŗry ma jednego lub więcej członkÃŗw online. Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrÃŗcić dostępu do szyfrowanego pokoju, w ktÃŗrym nie ma Åŧadnego członka online.", "E2E_Reset_Key_Explanation": "Ta opcja usunie TwÃŗj obecny klucz E2E i wyloguje Cię.
    Po ponownym zalogowaniu się, Rocket.Chat wygeneruje nowy klucz i przywrÃŗci dostęp do szyfrowanego pokoju, ktÃŗry ma jednego lub więcej członkÃŗw online.
    Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrÃŗcić dostępu do szyfrowanego pokoju, ktÃŗry nie ma członkÃŗw online.", "E2E_Reset_Other_Key_Warning": "Zresetowanie aktualnego klucza E2E spowoduje wylogowanie uÅŧytkownika. Gdy uÅŧytkownik zaloguje się ponownie, Rocket.Chat wygeneruje nowy klucz i przywrÃŗci uÅŧytkownikowi dostęp do kaÅŧdego zaszyfrowanego pomieszczenia, ktÃŗre ma jednego lub więcej członkÃŗw online. Ze względu na charakter szyfrowania E2E, Rocket.Chat nie będzie w stanie przywrÃŗcić dostępu do szyfrowanego pokoju, w ktÃŗrym nie ma Åŧadnego członka online.", "ECDH_Enabled": "Włącz szyfrowanie drugiej warstwy dla transportu danych", "Edit": "Edycja", + "Edit_channel": "Edytuj kanał", "Edit_Business_Hour": "Edycja godzin pracy", "Edit_Canned_Response": "Edytowanie predefiniowanej odpowiedzi", "Edit_Canned_Responses": "Edycja predefiniowanej odpowiedzi", @@ -1733,7 +1788,7 @@ "Enable_inquiry_fetch_by_stream": "Włączanie pobierania danych zapytania z serwera za pomocą strumienia", "Enable_omnichannel_auto_close_abandoned_rooms": "Włącz automatyczne zamykanie pokoi opuszczonych przez odwiedzającego", "Enable_Password_History": "Włącz historię haseł", - "Enable_Password_History_Description": "Po włączeniu tej funkcji uÅŧytkownicy nie będą mogli aktualizować swoich haseł do ostatnio uÅŧywanych.", + "Enable_Password_History_Description": "Po włączeniu tej funkcji uÅŧytkownicy nie będą mogli zmieniać swoich haseł na uÅŧywane wcześniej.", "Enable_Svg_Favicon": "Włącz favicon SVG", "Enable_two-factor_authentication": "Włącz uwierzytelnianie dwuskładnikowe", "Enable_two-factor_authentication_email": "Włącz uwierzytelnienie dwuskładnikowe przez e-mail", @@ -1743,7 +1798,7 @@ "Encrypted_key_title": "Kliknij tutaj, aby wyłączyć szyfrowanie od końca do końca dla tego kanału (wymaga uprawnień e2ee-permission)", "Encrypted_message": "Zaszyfrowana wiadomość", "Encrypted_setting_changed_successfully": "Ustawienia szyfrowania zostały pomyślnie zmienione", - "Encrypted_not_available": "Niedostępne dla Channels publicznych", + "Encrypted_not_available": "Niedostępne dla publicznych {{roomType}}", "Encryption_key_saved_successfully": "TwÃŗj klucz szyfrowania został zapisany pomyślnie.", "EncryptionKey_Change_Disabled": "Nie moÅŧna ustawić hasła dla klucza szyfrowania, poniewaÅŧ klucz prywatny nie jest obecny na tym kliencie. Aby ustawić nowe hasło, musisz załadować swÃŗj klucz prywatny przy uÅŧyciu istniejącego hasła lub uÅŧyć klienta, w ktÃŗrym klucz jest juÅŧ załadowany.", "End": "Koniec", @@ -2205,6 +2260,7 @@ "Global_purge_override_warning": "Obowiązuje globalna polityka przechowywania. Jeśli zostawisz opcję \"Zastąp globalną zasadę przechowywania\", moÅŧesz zastosować tylko politykę bardziej rygorystyczną niÅŧ polityka globalna.", "Global_Search": "Wyszukiwanie globalne", "Go_to_your_workspace": "IdÅē do swojej przestrzeni roboczej", + "Go_to_accessibility_and_appearance": "PrzejdÅē do sekcji Dostępność i wygląd", "Google_Play": "Google Play", "Hold_Call": "Zawieś połączenie", "GoogleCloudStorage": "Google Cloud Storage", @@ -2301,7 +2357,7 @@ "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", - "Impersonate_user_description": "Gdy ta opcja jest włączona, wpisy integracji są określane jako uÅŧytkownik, ktÃŗry uruchomił integrację", + "Impersonate_user_description": "Gdy ta opcja jest włączona, wpisy integracji są wyświetlane jako uÅŧytkownik, ktÃŗry uruchomił integrację", "Import": "Import", "Import_New_File": "Importuj nowy plik", "Import_requested_successfully": "Import Requested Successfully", @@ -2369,6 +2425,7 @@ "Incoming_WebHook": "Przychodzący WebHook", "Industry": "Typ działalności", "Info": "Informacje", + "Information_to_keep_top_of_mind": "Informacje, o ktÃŗrych warto pamiętać", "initials_avatar": "Początkowy Avatar", "Install": "Zainstaluj", "Install_Extension": "Zainstaluj rozszerzenie", @@ -2756,6 +2813,7 @@ "Lead_capture_email_regex": "Lead capture email regex", "Lead_capture_phone_regex": "Lead capture phone regex", "Learn_more": "Dowiedz się więcej", + "Learn_more_about_accessibility": "Dowiedz się więcej o naszym zaangaÅŧowaniu w dostępność tutaj:", "Least_recent_updated": "Najstarsza aktualizacja", "Learn_how_to_unlock_the_myriad_possibilities_of_rocket_chat": "Dowiedz się, jak odblokować niezliczone moÅŧliwości Rocket.Chat.", "Leave": "Opuść", @@ -2772,6 +2830,7 @@ "leave-p": "Opuść grupy prywatne", "leave-p_description": "Zezwolenie na opuszczenie grup prywatnych", "Lets_get_you_new_one_": "ZrÃŗbmy ci nową!", + "Let_them_know": "Daj im znać", "License": "Licencja", "Link_Preview": "Podgląd linkÃŗw", "List_of_Channels": "Lista kanałÃŗw", @@ -3322,7 +3381,7 @@ "No_integration_found": "Nie znaleziono integracji za pomocą podanego identyfikatora.", "No_Limit": "Brak limitu", "No_livechats": "Nie masz Åŧadnych livechatÃŗw.", - "No_marketplace_matches_for": "Brak dopasowania Marketplace dla", + "No_marketplace_matches_for": "Brak dopasowania w Marketplace dla", "No_members_found": "Nie znaleziono członkÃŗw", "No_mentions_found": "Nie znaleziono wzmianek", "No_messages_found_to_prune": "Nie znaleziono Åŧadnych wiadomości do usunięcia", @@ -3709,6 +3768,7 @@ "Reactions": "Reakcje", "Read_by": "Przeczytane przez", "Read_only": "Tylko do odczytu", + "Read_only_field_hint_disabled": "KaÅŧdy moÅŧe wysyłać nowe wiadomości", "Read_Receipts": "Potwierdzenia odczytania", "This_room_is_read_only": "Ten pokÃŗj jest tylko do odczytu", "Only_people_with_permission_can_send_messages_here": "Tylko osoby z uprawnieniami mogą wysyłać tutaj wiadomości", @@ -3741,7 +3801,7 @@ "Register_Server_Registered": "Zarejestruj się, aby uzyskać dostęp", "Register_Server_Registered_I_Agree": "Zgadzam się z", "Register_Server_Registered_Livechat": "Livechat omnichannel proxy", - "Register_Server_Registered_Marketplace": "Rynek aplikacji", + "Register_Server_Registered_Marketplace": "Marketplace", "Register_Server_Registered_OAuth": "Proxy OAuth dla sieci społecznościowej", "Register_Server_Registered_Push_Notifications": "Mobilna bramka powiadomień push", "Register_Server_Standalone": "Zachowaj samodzielność, musisz", @@ -3759,7 +3819,7 @@ "Release": "Wydanie", "Releases": "Wydania", "Religious": "Religijny", - "Reload": "Przeładować", + "Reload": "Przeładuj", "Reload_page": "Przeładuj stronę", "Reload_Pages": "Załaduj ponownie strony", "Remove": "Usuń", @@ -3825,6 +3885,7 @@ "Require_all_tokens": "Wymagaj wszystkich tokenÃŗw", "Require_any_token": "Wymagaj dowolnego tokena", "Require_password_change": "NakaÅŧ zmianę hasła", + "Require_Two_Factor_Authentication": "Wymagaj uwierzytelniania dwuskładnikowego", "Resend_verification_email": "Ponownie wyślij e-mail weryfikacyjny", "Reset": "Zresetuj", "Reset_Connection": "Zresetuj połączenie", @@ -3847,6 +3908,9 @@ "RetentionPolicy_Advanced_Precision": "UÅŧywaj zaawansowanej konfiguracji polityki retencji", "RetentionPolicy_Advanced_Precision_Cron": "UÅŧywaj zaawansowanej konfiguracji Cron dla polityki retencji", "RetentionPolicy_Advanced_Precision_Cron_Description": "Jak często powinien działać timer przycinania definowane przez ustawienie cron joba. Ustawienie tej wartości na bardziej precyzyjną powoduje, Åŧe kanały z szybkimi licznikami czasu przechowywania działają lepiej, ale mogą kosztować dodatkową moc obliczeniową w duÅŧych społecznościach.", + "RetentionPolicy_AppliesToChannels": "Dotyczy kanałÃŗw", + "RetentionPolicy_AppliesToDMs": "Dotyczy bezpośrednich wiadomości", + "RetentionPolicy_AppliesToGroups": "Dotyczy grup prywatnych", "RetentionPolicy_Description": "Automatycznie przycina stare wiadomości w instancji Rocket.Chat.", "RetentionPolicy_DoNotPruneDiscussion": "Nie usuwaj wiadomości z dyskusji", "RetentionPolicy_DoNotPrunePinned": "Nie usuwaj przypiętych wiadomości", @@ -3856,6 +3920,10 @@ "RetentionPolicy_FilesOnly": "Usuwaj tylko pliki", "RetentionPolicy_FilesOnly_Description": "Tylko pliki zostaną usunięte, same wiadomości pozostaną na swoim miejscu.", "RetentionPolicy_MaxAge": "Maksymalny wiek wiadomości", + "RetentionPolicy_MaxAge_Channels": "Maksymalny wiek wiadomości w kanałach", + "RetentionPolicy_MaxAge_Description": "Przycinaj wszystkie wiadomości starsze niÅŧ ta wartość, w dniach", + "RetentionPolicy_MaxAge_DMs": "Maksymalny wiek wiadomości w wiadomościach bezpośrednich", + "RetentionPolicy_MaxAge_Groups": "Maksymalny wiek wiadomości w grupach prywatnych", "RetentionPolicy_Precision": "Precyzja zegara", "RetentionPolicy_Precision_Description": "Jak często powinien działać timer przycinania. Ustawienie tej wartości na bardziej precyzyjną powoduje, Åŧe kanały z szybkimi licznikami czasu przechowywania działają lepiej, ale mogą kosztować dodatkową moc obliczeniową w duÅŧych społecznościach.", "RetentionPolicyRoom_Enabled": "Automatycznie usuwaj stare wiadomości", @@ -4072,7 +4140,7 @@ "Search_Provider": "Dostawca wyszukiwania", "Search_Rooms": "Szukaj pokoi", "Search_Users": "Wyszukaj uÅŧytkownikÃŗw", - "Seats_Available": "{{seatsLeft}} Dostępne miejsca", + "Seats_Available": "{{seatsLeft, number}} Dostępne miejsca", "Seats_usage": "Wykorzystanie miejsc", "seconds": "sekund", "Secret_token": "Sekret", @@ -4208,8 +4276,9 @@ "Show_Setup_Wizard": "PokaÅŧ Kreatora instalacji", "Show_the_keyboard_shortcut_list": "PokaÅŧ listę skrÃŗtÃŗw klawiaturowych", "Show_video": "PokaÅŧ wideo", - "Showing": "Pokazywanie", - "Showing_archived_results": "

    Pokazuje %s zarchiwizowanych wynikÃŗw

    ", + "Showing": "Wyświetlanie", + "Showing_archived_results": "

    Wyświetla %s zarchiwizowanych wynikÃŗw

    ", + "Showing_current_of_total": "Wyświetlanie {{current}} z {{total}}", "Showing_online_users": "Pokazywanie: {{total_showing}}, Online: {{online}}, OgÃŗłem: {{total}} users", "Showing_results": "

    Wyświetlono %s wynikÃŗw

    ", "Showing_results_of": "Wyświetlanie wynikÃŗw %s - %s z %s", @@ -4438,14 +4507,14 @@ "Teams_left_team_successfully": "Pomyślnie opuścił zespÃŗł", "Teams_members": "Członkowie zespołÃŗw", "Teams_New_Add_members_Label": "Dodaj członkÃŗw", - "Teams_New_Broadcast_Description": "Tylko autoryzowani uÅŧytkownicy mogą pisać nowe wiadomości, ale pozostali uÅŧytkownicy będą mogli odpowiadać", + "Teams_New_Broadcast_Description": "Tylko właściciele zespołÃŗw mogą pisać nowe wiadomości, ale wszyscy uÅŧytkownicy będą mogli odpowiadać", "Teams_New_Broadcast_Label": "Broadcast", "Teams_New_Description_Label": "Temat", "Teams_New_Description_Placeholder": "Co to jest za zespÃŗł", "Teams_New_Encrypted_Description_Disabled": "Dostępne tylko dla zespołÃŗw prywatnych", "Teams_New_Encrypted_Description_Enabled": "ZespÃŗł zaszyfrowany E2E. Wyszukiwanie nie będzie działać w zaszyfrowanych zespołach, a powiadomienia mogą nie pokazywać treści wiadomości.", "Teams_New_Encrypted_Label": "Szyfrowane", - "Teams_New_Private_Description_Disabled": "Po wyłączeniu, kaÅŧdy moÅŧe dołączyć do zespołu", + "Teams_New_Private_Description_Disabled": "KaÅŧdy moÅŧe uzyskać dostęp", "Teams_New_Private_Description_Enabled": "Tylko zaproszone osoby mogą dołączyć", "Teams_New_Private_Label": "Prywatny", "Teams_New_Read_only_Description": "Wszyscy uÅŧytkownicy w tym zespole mogą pisać wiadomości", @@ -4490,6 +4559,7 @@ "The_user_will_be_removed_from_s": "UÅŧytkownik zostanie usunięty z %s", "The_user_wont_be_able_to_type_in_s": "UÅŧytkownik nie będzie mÃŗgł wpisać w %s", "Theme": "Motyw", + "Choose_theme_description": "Wybierz wygląd interfejsu, ktÃŗry najlepiej odpowiada Twoim potrzebom.", "theme-color-attention-color": "Kolor uwagi", "theme-color-component-color": "Kolor komponentu", "theme-color-content-background-color": "Kolor tła zawartości", @@ -4565,6 +4635,7 @@ "This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password": "Ten e-mail został juÅŧ uÅŧyty i nie został zweryfikowany. Proszę zmienić swoje hasło.", "This_feature_is_currently_in_alpha": "Ta funkcja jest obecnie w fazie alfa!", "This_is_a_desktop_notification": "To jest powiadomienie na pulpicie", + "Install_Zapier_from_marketplace": "Zainstaluj aplikację Zapier z Marketplace, aby uniknąć zakłÃŗceń", "This_is_a_push_test_messsage": "To jest testowy push message", "This_message_was_rejected_by__peer__peer": "Ta wiadomość została odrzucona przez {{peer}}.", "This_monitor_was_already_selected": "Ten monitor został juÅŧ wybrany", @@ -4664,7 +4735,7 @@ "Turn_ON": "Włączyć", "Turn_on_video": "Włącz wideo", "Turn_off_video": "Wyłącz wideo", - "Two Factor Authentication": "Uwierzytelnianie dwuetapowe", + "Two Factor Authentication": "Uwierzytelnianie dwuskładnikowe", "Two-factor_authentication": "Uwierzytelnianie dwuskładnikowe", "Two-factor_authentication_via_TOTP": "Uwierzytelnianie dwuskładnikowe", "Two-factor_authentication_disabled": "Wyłączono uwierzytelnianie dwuskładnikowe", @@ -4726,7 +4797,7 @@ "Unread_on_top": "Nieprzeczytane na gÃŗrze", "Unread_Rooms": "Nieprzeczytane pokoje", "Unread_Rooms_Mode": "Tryb nieprzeczytanych pokoi", - "Unread_Tray_Icon_Alert": "Powiadomienie o nieprzeczytanych wiadomościach w Tray", + "Unread_Tray_Icon_Alert": "Powiadomienie o nieprzeczytanych wiadomościach w Ikonce zasobnika", "Unstar_Message": "Usuń oznaczenie", "Unmute_microphone": "Włącz mikrofon", "Update": "Aktualizacja", @@ -4871,7 +4942,7 @@ "Username_title": "UtwÃŗrz nazwę uÅŧytkownika", "Username_wants_to_start_otr_Do_you_want_to_accept": "{{username}} chce rozpocząć OTR. Czy chcesz zaakceptować?", "Users": "UÅŧytkownicy", - "Users must use Two Factor Authentication": "UÅŧytkownicy muszą korzystać z uwierzytelniania dwuetapowego", + "Users must use Two Factor Authentication": "UÅŧytkownicy muszą korzystać z uwierzytelniania dwuskładnikowego", "Users_added": "UÅŧytkownicy zostali dodani", "Users_and_rooms": "UÅŧytkownicy i Rooms", "Users_by_time_of_day": "UÅŧytkownicy według pory dnia", @@ -5181,6 +5252,9 @@ "You_have_not_verified_your_email": "Nie zweryfikowałeś e-maila.", "You_have_successfully_unsubscribed": "TwÃŗj email został usunięty z naszej listy powiadomień.", "You_must_join_to_view_messages_in_this_channel": "Musisz dołączyć aby widzieć wiadomości w tym kanale", + "You_mentioned___mentions__but_theyre_not_in_this_room": "Wspomniałeś o {{mentions}}, ale nie ma go/ich w tym pokoju.", + "You_mentioned___mentions__but_theyre_not_in_this_room_You_can_ask_a_room_admin_to_add_them": "Wspomniałeś o {{mentions}}, ale nie ma go/ich w tym pokoju. MoÅŧesz poprosić administratora pokoju o dodanie.", + "You_mentioned___mentions__but_theyre_not_in_this_room_You_let_them_know_via_dm": "Wspomniałeś o {{mentions}}, ale nie ma go/ich w tym pokoju. Poinformuj ich o tym za pośrednictwem bezpośredniej wiadomości.", "You_need_confirm_email": "Aby się zalogować musisz potwierdzić swÃŗj adres e-mail!", "You_need_install_an_extension_to_allow_screen_sharing": "Musisz zainstalować rozszerzenie, aby umoÅŧliwić dzielenie ekranu", "You_need_to_change_your_password": "Musisz zmienić swoje hasło", @@ -5218,6 +5292,7 @@ "Your_TOTP_has_been_reset": "Twoje dwuskładnikowe TOTP zostało zresetowane", "Your_web_browser_blocked_Rocket_Chat_from_opening_tab": "Twoja przeglądarka internetowa zablokowała Rocket.Chat przed otwarciem nowej karty.", "Your_workspace_is_ready": "TwÃŗj obszar roboczy jest gotowy do uÅŧycia 🎉", + "Youre_not_a_part_of__channel__and_I_mentioned_you_there": "Nie jesteś członkiem {{channel}}, a wspomniałem tam o Tobie", "Zapier": "Zapier", "registration.page.login.errors.wrongCredentials": "Nie znaleziono uÅŧytkownika lub nieprawidłowe hasło", "registration.page.login.errors.loginBlockedForIp": "Logowanie zostało tymczasowo zablokowane dla tego IP", @@ -5322,9 +5397,15 @@ "onboarding.form.standaloneServerForm.servicesUnavailable": "NiektÃŗre z usług będą niedostępne lub będą wymagały ręcznej konfiguracji", "onboarding.form.standaloneServerForm.publishOwnApp": "W celu wysyłania powiadomień push naleÅŧy skompilować i opublikować własną aplikację w Google Play i App Store", "onboarding.form.standaloneServerForm.manuallyIntegrate": "Konieczność ręcznej integracji z usługami zewnętrznymi", + "subscription.callout.marketplaceApps": "zainstalowane aplikacje marketplace", "Something_Went_Wrong": "Coś poszło nie tak", + "Theme_match_system_description": "Automatyczne dopasowanie wyglądu systemu.", + "Theme_high_contrast_description": "Maksymalne zrÃŗÅŧnicowanie tonalne z pogrubiony kolorami i ostrymi kontrastami zapewnia lepszą dostępność.", "Join_your_team": "Dołącz do swojego zespołu", "Create_an_account": "UtwÃŗrz konto", + "Workspaces_on_community_edition_trial_on": "Przestrzenie robocze w Społeczności mogą mieć włączonych maksymalnie 5 aplikacji Marketplace i 3 aplikacje prywatne. Rozpocznij bezpłatny okres prÃŗbny Premium, aby usunąć te ograniczenia juÅŧ dziś!", + "Workspaces_on_community_edition_trial_off": "Przestrzenie robocze w Community mogą mieć włączonych do 5 aplikacji marketplace i 3 aplikacje prywatne. Uaktualnij do wersji Premium, aby usunąć ograniczenia i wzmocnić swoją przestrzeń roboczą.", + "Private_apps_are_side-loaded": "Aplikacje prywatne są ładowane z boku i nie są dostępne w Marketplace.", "Service_status": "Stan usługi", "User_Status": "Status uÅŧytkownika", "Active_connections": "Aktywne połączenia", @@ -5334,11 +5415,20 @@ "Awaiting_confirmation": "Oczekuje na potwierdzenie", "RegisterWorkspace_Features_MobileNotifications_Title": "Powiadomienia mobilne push", "RegisterWorkspace_Features_Marketplace_Title": "Marketplace", + "RegisterWorkspace_Features_Marketplace_Description": "Zainstaluj aplikacje Rocket.Chat Marketplace na tym obszarze roboczym.", "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "E-mail konta w chmurze", "RegisterWorkspace_Syncing_Complete": "Synchronizacja zakończona", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Zgadzam się z <1>zasadami i warunkami i <3>Polityką prywatności.", "Enterprise": "Enterprise", + "Marketplace_apps": "Aplikacje Marketplace", + "UpgradeToGetMore_accessibility-certification_Body": "Zgodność ze standardami WCAG i BITV dzięki programowi dostępności Rocket.Chat.", "UpgradeToGetMore_engagement-dashboard_Title": "Analityka", - "UpgradeToGetMore_auditing_Title": "Audyt wiadomości" -} + "UpgradeToGetMore_auditing_Title": "Audyt wiadomości", + "Apps_InfoText": "Wersja Community umoÅŧliwia włączenie do 3 aplikacji prywatnych i 5 aplikacji marketplace", + "Anyone_can_react_to_messages": "KaÅŧdy moÅŧe reagować na wiadomości", + "Anyone_can_access": "KaÅŧdy moÅŧe uzyskać dostęp", + "Broadcast_hint_enabled": "Tylko właściciele {{roomType}} mogą pisać nowe wiadomości, ale kaÅŧdy moÅŧe odpowiadać w wątku", + "Anyone_can_send_new_messages": "KaÅŧdy moÅŧe wysyłać nowe wiadomości", + "Select_messages_to_hide": "Wybierz wiadomości do ukrycia" +} \ No newline at end of file diff --git a/packages/i18n/src/locales/pt-BR.i18n.json b/packages/i18n/src/locales/pt-BR.i18n.json index d56243509469..67c8f46888ad 100644 --- a/packages/i18n/src/locales/pt-BR.i18n.json +++ b/packages/i18n/src/locales/pt-BR.i18n.json @@ -253,6 +253,7 @@ "Accounts_ShowFormLogin": "Mostrar formulÃĄrio de login padrÃŖo", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled": "Ativar autenticaçÃŖo de dois fatores por TOTP", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled_Description": "Os usuÃĄrios podem configurar sua AutenticaçÃŖo de dois fatores usando qualquer aplicativo de TOTP, como o Google Authenticator ou o Authy.", + "Calls_in_queue_many": "{{count}} chamadas na fila", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "Ativar automaticamente a autenticaçÃŖo de duas etapas via e-mail para novos usuÃĄrios", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Novos usuÃĄrios terÃŖo a autenticaçÃŖo de duas etapas via e-mail ativada por padrÃŖo. Eles poderÃŖo desabilitÃĄ-la em sua pÃĄgina de perfil.", "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Tempo para expirar o cÃŗdigo enviado por e-mail (em segundos)", @@ -301,7 +302,6 @@ "add-oauth-service": "Adicionar Serviço OAuth", "add-oauth-service_description": "PermissÃŖo para adicionar um novo serviço OAuth", "add-team-channel": "Adicionar Time ao Canal", - "Calls_in_queue_many": "{{count}} chamadas na fila", "add-team-channel_description": "PermissÃŖo para adicionar um canal a um time", "add-team-member": "Adicionar membro ao Team", "add-team-member_description": "PermissÃŖo para adicionar membros ao time", @@ -791,6 +791,7 @@ "CAS_enabled": "Habilitado", "CAS_Login_Layout": "Layout de login CAS", "CAS_login_url": "URL de login SSO", + "message_counter_many": "{{count}} mensagens", "CAS_login_url_Description": "O URL de login de seu serviço SSO externo (exemplo: https://sso.exemplo.indef/sso/login)", "CAS_popup_height": "Altura do pop-up de login", "CAS_popup_width": "Largura do pop-up de login", @@ -806,6 +807,7 @@ "Categories*": "Categorias*", "CDN_JSCSS_PREFIX": "Prefixo CDN para JS/CSS", "CDN_PREFIX": "Prefixo CDN", + "meteor_status_reconnect_in_many": "tentando novamente em {{count}} segundos...", "CDN_PREFIX_ALL": "Use o prefixo da CDN para todos os recursos", "Certificates_and_Keys": "Certificados e chaves", "change-livechat-room-visitor": "Alterar visitantes da Sala Livechat", @@ -984,7 +986,6 @@ "Contact_not_found": "Contato nÃŖo encontrado", "Contact_Profile": "Perfil do contato", "Contact_Info": "InformaçÃĩes do contato", - "message_counter_many": "{{count}} mensagens", "Content": "ConteÃēdo", "Continue": "Continuar", "Continuous_sound_notifications_for_new_livechat_room": "NotificaçÃĩes sonoras contínuas para nova sala de omnichannel", @@ -1000,7 +1001,6 @@ "Conversations": "Conversas", "Conversations_per_day": "Conversas por dia", "Convert": "Converter", - "meteor_status_reconnect_in_many": "tentando novamente em {{count}} segundos...", "Convert_Ascii_Emojis": "Converter ASCII em emoji", "Convert_to_channel": "Converter em canal", "Converting_channel_to_a_team": "VocÃĒ estÃĄ convertendo este canal em uma equipe. Todos os membros serÃŖo mantidos.", @@ -1632,7 +1632,7 @@ "Enable_CSP": "Habilitar política de segurança de conteÃēdo", "Enable_CSP_Description": "NÃŖo desative esta opçÃŖo a nÃŖo ser que vocÃĒ tenha uma versÃŖo personalizada e esteja tendo problemas devido a scrips inline", "Enable_Desktop_Notifications": "Habilitar notificaçÃĩes da ÃĄrea de trabalho", - "Enable_encryption" : "Ativar criptografia", + "Enable_encryption": "Ativar criptografia", "Enable_inquiry_fetch_by_stream": "Habilitar carga de dados de novas pesquisas de omnichannel utilizando stream", "Enable_omnichannel_auto_close_abandoned_rooms": "Habilitar o fechamento automÃĄtico de salas abandonadas pelo visitante", "Enable_Password_History": "Habilitar histÃŗrico de senha", @@ -2713,6 +2713,8 @@ "Livechat_transcript_has_been_requested": "A transcriçÃŖo da conversa foi solicitada.", "Livechat_transcript_request_has_been_canceled": "A solicitaçÃŖo da transcriçÃŖo da conversa foi cancelada.", "Livechat_transcript_sent": "TranscriçÃŖo de omnichannel enviada", + "Livechat_transcript_send_always": "Sempre enviar transcriçÃŖo de conversas aos visitantes via email", + "Livechat_transcript_send_always_Description": "Assim que finalizada, enviar a transcriçÃŖo da conversa via email aos visitantes automaticamente, independentemente das permissÃĩes do agente.", "Livechat_transfer_return_to_the_queue": "{{from}} retornou à conversa para a fila", "Livechat_transfer_to_agent": "{{from}} transferiu a conversa para {{to}}", "Livechat_transfer_to_agent_with_a_comment": "{{from}} transferiu a conversa para {{to}} com um comentÃĄrio: {{comment}}", @@ -3627,6 +3629,9 @@ "RetentionPolicy_Advanced_Precision": "Usar configuraçÃŖo de política de retençÃŖo avançada", "RetentionPolicy_Advanced_Precision_Cron": "Usar cron de política de retençÃŖo avançada", "RetentionPolicy_Advanced_Precision_Cron_Description": "Com que frequÃĒncia o timer de remoçÃŖo deve ser executado definido pela expressÃŖo de jobs do cron. Definir para um valor mais preciso faz com que canais com timers de retençÃŖo rÃĄpida funcionem melhor, mas pode ter custo extra de processamento em comunidades grandes.", + "RetentionPolicy_AppliesToChannels": "Aplica-se a canais", + "RetentionPolicy_AppliesToDMs": "Aplica-se a mensagens diretas", + "RetentionPolicy_AppliesToGroups": "Aplica-se a grupos privados", "RetentionPolicy_Description": "Remove automaticamente as mensagens antigas da sua instÃĸncia do Rocket.Chat.", "RetentionPolicy_DoNotPruneDiscussion": "NÃŖo remover mensagens de discussÃŖo", "RetentionPolicy_DoNotPrunePinned": "NÃŖo remover mensagens fixadas", @@ -3636,6 +3641,10 @@ "RetentionPolicy_FilesOnly": "Apenas excluir arquivos", "RetentionPolicy_FilesOnly_Description": "Apenas arquivos serÃŖo excluídos, as mensagens permanecerÃŖo.", "RetentionPolicy_MaxAge": "A idade mÃĄxima da mensagem", + "RetentionPolicy_MaxAge_Channels": "A idade mÃĄxima da mensagem nos canais", + "RetentionPolicy_MaxAge_Description": "Remover todas as mensagens mais antigas que esse valor, em dias", + "RetentionPolicy_MaxAge_DMs": "DuraçÃŖo mÃĄxima da mensagem em mensagens diretas", + "RetentionPolicy_MaxAge_Groups": "DuraçÃŖo mÃĄxima da mensagem em grupos privados", "RetentionPolicy_Precision": "PrecisÃŖo do temporizador", "RetentionPolicy_Precision_Description": "Quantas vezes o temporizador de remoçÃŖo deve ser executado. Configurar um valor mais preciso faz com que os canais com temporizadores de retençÃŖo rÃĄpidos funcionem melhor, mas podem usar mais potÃĒncia de processamento em grandes comunidades.", "RetentionPolicyRoom_Enabled": "Remover automaticamente mensagens antigas", @@ -4904,6 +4913,7 @@ "registration.component.resetPassword": "Redefinir senha", "registration.component.form.username": "Nome de usuÃĄrio", "registration.component.form.name": "Nome", + "registration.component.form.nameContainsInvalidChars": "O nome contÊm caracteres invÃĄlidos", "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.", @@ -5004,4 +5014,4 @@ "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", "UpgradeToGetMore_auditing_Title": "Auditoria de mensagem" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/pt.i18n.json b/packages/i18n/src/locales/pt.i18n.json index 96575d48ef72..8f4acc81dbdd 100644 --- a/packages/i18n/src/locales/pt.i18n.json +++ b/packages/i18n/src/locales/pt.i18n.json @@ -2396,12 +2396,19 @@ "Retail": "Retalho", "Retention_setting_changed_successfully": "A configuraçÃŖo da política de retençÃŖo foi alterada com sucesso", "RetentionPolicy": "Política de retençÃŖo", + "RetentionPolicy_AppliesToChannels": "Aplica-se a canais", + "RetentionPolicy_AppliesToDMs": "Aplica-se a direccionar mensagens", + "RetentionPolicy_AppliesToGroups": "Aplica-se a grupos privados", "RetentionPolicy_Description": "Remove automaticamente as mensagens antigas da sua instÃĸncia do Rocket.Chat.", "RetentionPolicy_Enabled": "Habilitado", "RetentionPolicy_ExcludePinned": "Excluir mensagens fixas", "RetentionPolicy_FilesOnly": "Apenas apagar arquivos", "RetentionPolicy_FilesOnly_Description": "Apenas arquivos serÃŖo excluídos, as mensagens permanecerÃŖo no lugar.", "RetentionPolicy_MaxAge": "A idade mÃĄxima da mensagem", + "RetentionPolicy_MaxAge_Channels": "A idade mÃĄxima da mensagem nos canais", + "RetentionPolicy_MaxAge_Description": "Remover todas as mensagens mais antigas que esse valor, em dias", + "RetentionPolicy_MaxAge_DMs": "DuraçÃŖo mÃĄxima da mensagem em mensagens directas", + "RetentionPolicy_MaxAge_Groups": "DuraçÃŖo mÃĄxima da mensagem em grupos privados", "RetentionPolicy_Precision": "PrecisÃŖo do temporizador", "RetentionPolicy_Precision_Description": "Quantas vezes o temporizador de remoçÃŖo deve ser executado. Configurar isso para um valor mais preciso faz com que os canais com temporizadores de retençÃŖo rÃĄpidos funcionem melhor, mas podem custar um poder de processamento extra em grandes comunidades.", "RetentionPolicyRoom_Enabled": "Remover automaticamente mensagens antigas", @@ -3161,6 +3168,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.nameContainsInvalidChars": "O nome contÊm caracteres invÃĄlidos", "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.", @@ -3175,4 +3183,4 @@ "registration.component.form.sendConfirmationEmail": "Enviar email de confirmaçÃŖo", "Enterprise": "Empreendimento", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ro.i18n.json b/packages/i18n/src/locales/ro.i18n.json index afade0413dd1..aefc4d07065f 100644 --- a/packages/i18n/src/locales/ro.i18n.json +++ b/packages/i18n/src/locales/ro.i18n.json @@ -2059,12 +2059,19 @@ "Retail": "Cu amănuntul", "Retention_setting_changed_successfully": "Politica de păstrare a fost modificată cu succes", "RetentionPolicy": "Politica de păstrare", + "RetentionPolicy_AppliesToChannels": "Se aplică la canale", + "RetentionPolicy_AppliesToDMs": "Se aplică pentru mesaje directe", + "RetentionPolicy_AppliesToGroups": "Se aplică grupurilor private", "RetentionPolicy_Description": "Șterge automat vechile mesaje de-a lungul instanței Rocket.Chat.", "RetentionPolicy_Enabled": "Activat", "RetentionPolicy_ExcludePinned": "Excludeți mesajele fixate", "RetentionPolicy_FilesOnly": "Ștergeți numai fișierele", "RetentionPolicy_FilesOnly_Description": "Numai fișierele vor fi șterse, mesajele ÃŽn sine rămÃĸn ÃŽn vigoare.", "RetentionPolicy_MaxAge": "VÃĸrsta maximă a mesajului", + "RetentionPolicy_MaxAge_Channels": "VÃĸrsta maximă a mesajului ÃŽn canale", + "RetentionPolicy_MaxAge_Description": "Prelucrați toate mesajele mai vechi decÃĸt această valoare, ÃŽn zile", + "RetentionPolicy_MaxAge_DMs": "VÃĸrsta maximă a mesajului ÃŽn mesajele directe", + "RetentionPolicy_MaxAge_Groups": "VÃĸrsta maximă a mesajului ÃŽn grupuri private", "RetentionPolicy_Precision": "Timp de precizie", "RetentionPolicy_Precision_Description": "CÃĸt de des ar trebui să ruleze cronometrul pentru prune. Setarea acestei valori la o valoare mai precisă face ca canalele cu cronometre rapide să funcționeze mai bine, dar ar putea costa putere suplimentară de procesare pentru comunitățile mari.", "RetentionPolicyRoom_Enabled": "Trasați automat mesajele vechi", @@ -2752,4 +2759,4 @@ "registration.component.form.sendConfirmationEmail": "Trimite email de confirmare", "Enterprise": "Afacere", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ru.i18n.json b/packages/i18n/src/locales/ru.i18n.json index f768764d0bc1..1829f7f2eb08 100644 --- a/packages/i18n/src/locales/ru.i18n.json +++ b/packages/i18n/src/locales/ru.i18n.json @@ -206,9 +206,11 @@ "Accounts_OAuth_Wordpress_token_path": "Token Path", "Accounts_Password_Policy_AtLeastOneLowercase": "ĐĨĐžŅ‚Ņ ĐąŅ‹ ОдĐŊŅƒ ĐąŅƒĐēвŅƒ в ĐŊиĐļĐŊĐĩĐŧ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đĩ", "Accounts_Password_Policy_AtLeastOneLowercase_Description": "ĐŖĐąĐĩдиŅ‚ĐĩŅŅŒ, Ņ‡Ņ‚Đž ĐŋĐ°Ņ€ĐžĐģŅŒ ŅĐžĐ´ĐĩŅ€ĐļиŅ‚ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊŅƒ ĐąŅƒĐēвŅƒ в ĐŊиĐļĐŊĐĩĐŧ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đĩ.", + "Apps_Count_Enabled_many": "{{count}} ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК(-Ņ) вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "Accounts_Password_Policy_AtLeastOneNumber": "ĐĨĐžŅ‚Ņ ĐąŅ‹ ОдĐŊŅƒ Ņ†Đ¸Ņ„Ņ€Ņƒ", "Accounts_Password_Policy_AtLeastOneNumber_Description": "ĐŖĐąĐĩдиŅ‚ĐĩŅŅŒ, Ņ‡Ņ‚Đž ĐŋĐ°Ņ€ĐžĐģŅŒ ŅĐžĐ´ĐĩŅ€ĐļиŅ‚ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдиĐŊ Ņ†Đ¸Ņ„Ņ€ĐžĐ˛ĐžĐš ŅĐ¸ĐŧвОĐģ.", "Accounts_Password_Policy_AtLeastOneSpecialCharacter": "ĐĨĐžŅ‚Ņ ĐąŅ‹ ОдиĐŊ ŅĐŋĐĩŅ†Đ¸Đ°ĐģŅŒĐŊŅ‹Đš ŅĐ¸ĐŧвОĐģ", + "Private_Apps_Count_Enabled_many": "{{count}} ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Ņ… ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "Accounts_Password_Policy_AtLeastOneSpecialCharacter_Description": "ĐŖĐąĐĩдиŅ‚ĐĩŅŅŒ, Ņ‡Ņ‚Đž ĐŋĐ°Ņ€ĐžĐģŅŒ ŅĐžĐ´ĐĩŅ€ĐļиŅ‚ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдиĐŊ ŅĐŋĐĩŅ†Đ¸Đ°ĐģŅŒĐŊŅ‹Đš ŅĐ¸ĐŧвОĐģ.", "Accounts_Password_Policy_AtLeastOneUppercase": "ĐĨĐžŅ‚Ņ ĐąŅ‹ ОдĐŊŅƒ ĐąŅƒĐēвŅƒ в вĐĩŅ€Ņ…ĐŊĐĩĐŧ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đĩ", "Accounts_Password_Policy_AtLeastOneUppercase_Description": "ĐŖĐąĐĩдиŅ‚ĐĩŅŅŒ, Ņ‡Ņ‚Đž ĐŋĐ°Ņ€ĐžĐģŅŒ ŅĐžĐ´ĐĩŅ€ĐļиŅ‚ Ņ…ĐžŅ‚Ņ ĐąŅ‹ ОдĐŊŅƒ ĐąŅƒĐēвŅƒ в вĐĩŅ€Ņ…ĐŊĐĩĐŧ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đĩ.", @@ -239,10 +241,8 @@ "Accounts_RegistrationForm_Secret_URL": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐŊŅ‹Đš URL-Đ°Đ´Ņ€ĐĩŅ", "Accounts_RegistrationForm_SecretURL": "ĐĄĐĩĐēŅ€ĐĩŅ‚ĐŊŅ‹Đš URL-Đ°Đ´Ņ€ĐĩŅ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸ĐžĐŊĐŊОК Ņ„ĐžŅ€ĐŧŅ‹", "Accounts_RegistrationForm_SecretURL_Description": "ВŅ‹ Đ´ĐžĐģĐļĐŊŅ‹ ĐŋŅ€ĐĩĐ´ĐžŅŅ‚авиŅ‚ŅŒ ŅĐģŅƒŅ‡Đ°ĐšĐŊŅƒŅŽ ŅŅ‚Ņ€ĐžĐēŅƒ, ĐēĐžŅ‚ĐžŅ€Đ°Ņ ĐąŅƒĐ´ĐĩŅ‚ дОйавĐģĐĩĐŊĐ° Đē ваŅˆĐĩĐŧŅƒ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸ĐžĐŊĐŊĐžĐŧŅƒ URL-Đ°Đ´Ņ€ĐĩŅŅƒ. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: `https://open.rocket.chat/register/[secret_hash]`", - "Apps_Count_Enabled_many": "{{count}} ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК(-Ņ) вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "Accounts_RequireNameForSignUp": "ĐĸŅ€ĐĩĐąŅƒĐĩŅ‚ŅŅ иĐŧŅ Đ´ĐģŅ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸Đ¸", "Accounts_RequirePasswordConfirmation": "ЗаĐŋŅ€Đ°ŅˆĐ¸Đ˛Đ°Ņ‚ŅŒ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ ĐŋĐ°Ņ€ĐžĐģŅ", - "Private_Apps_Count_Enabled_many": "{{count}} ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Ņ… ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "Accounts_RoomAvatarExternalProviderUrl": "URL вĐŊĐĩŅˆĐŊĐĩĐŗĐž ĐŋĐžŅŅ‚авŅ‰Đ¸ĐēĐ° аваŅ‚Đ°Ņ€ĐžĐ˛", "Accounts_RoomAvatarExternalProviderUrl_Description": "ПŅ€Đ¸ĐŧĐĩŅ€: `https://acme.com/api/v1/{roomId}`", "Accounts_SearchFields": "ПоĐģŅ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ŅĐģĐĩĐ´ŅƒĐĩŅ‚ ŅƒŅ‡Đ¸Ņ‚Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐŋŅ€Đ¸ ĐŋОиŅĐēĐĩ", @@ -255,6 +255,7 @@ "Accounts_ShowFormLogin": "ПоĐēаСаŅ‚ŅŒ ĐģĐžĐŗиĐŊ ĐŊĐ° ĐžŅĐŊОвĐĩ Ņ„ĐžŅ€ĐŧŅ‹", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled": "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ двŅƒŅ…Ņ„Đ°ĐēŅ‚ĐžŅ€ĐŊŅƒŅŽ Đ°ŅƒŅ‚ĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ†Đ¸ŅŽ Ņ‡ĐĩŅ€ĐĩС TOTP", "Accounts_TwoFactorAuthentication_By_TOTP_Enabled_Description": "ПоĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи ĐŧĐžĐŗŅƒŅ‚ ĐŊĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ двŅƒŅ…Ņ„Đ°ĐēŅ‚ĐžŅ€ĐŊŅƒŅŽ Đ°ŅƒŅ‚ĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ†Đ¸ŅŽ Ņ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ ĐģŅŽĐąĐžĐŗĐž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиŅ TOTP, ĐŊĐ°ĐŋŅ€Đ¸ĐŧĐĩŅ€, Google Authenticator иĐģи Authy.", + "Calls_in_queue_many": "{{count}} ЗвоĐŊĐēОв в ĐžŅ‡ĐĩŅ€Đĩди", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "АвŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐĩŅĐēиК ĐŊĐ°ŅŅ‚Ņ€Đ°Đ¸Đ˛Đ°Ņ‚ŅŒ двŅƒŅ…Ņ„Đ°ĐēŅ‚ĐžŅ€ĐŊŅƒŅŽ Đ°ŅƒŅ‚ĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ†Đ¸ŅŽ ĐŋĐž ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Đĩ Đ´ĐģŅ ĐŊОвŅ‹Ņ… ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš", "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "ĐŖ ĐŊОвŅ‹Ņ… ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš ĐŋĐž ŅƒĐŧĐžĐģŅ‡Đ°ĐŊиŅŽ ĐąŅƒĐ´ĐĩŅ‚ вĐēĐģŅŽŅ‡ĐĩĐŊĐ° двŅƒŅ…Ņ„Đ°ĐēŅ‚ĐžŅ€ĐŊĐ°Ņ Đ°ŅƒŅ‚ĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ†Đ¸Ņ ĐŋĐž ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Đĩ. ОĐŊи ŅĐŧĐžĐŗŅƒŅ‚ ĐžŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐĩĐĩ ĐŊĐ° ŅŅ‚Ņ€Đ°ĐŊиŅ†Đĩ ŅĐ˛ĐžĐĩĐŗĐž ĐŋŅ€ĐžŅ„иĐģŅ.", "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "ВŅ€ĐĩĐŧŅ Đ´Đž иŅŅ‚ĐĩŅ‡ĐĩĐŊиŅ ŅŅ€ĐžĐēĐ° Đ´ĐĩĐšŅŅ‚виŅ ĐēОда, ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊĐžĐŗĐž ĐŋĐž ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Đĩ, в ŅĐĩĐēŅƒĐŊĐ´Đ°Ņ…", @@ -273,6 +274,7 @@ "API_EmbedDisabledFor": "ОŅ‚ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ вŅŅ‚авĐēŅƒ Đ´ĐģŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐš", "Accounts_UserAddedEmail_Default": "

    ДобŅ€Đž ĐŋĐžĐļĐ°ĐģОваŅ‚ŅŒ в [Site_Name]

    ПоŅĐĩŅ‚иŅ‚Đĩ [Site_URL] и ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ ĐģŅƒŅ‡ŅˆĐĩĐĩ Ņ€ĐĩŅˆĐĩĐŊиĐĩ Đ´ĐģŅ Ņ‡Đ°Ņ‚Ов Ņ ĐžŅ‚ĐēŅ€Ņ‹Ņ‚Ņ‹Đŧ иŅŅ…ОдĐŊŅ‹Đŧ ĐēОдОĐŧ ĐŊĐ° ŅĐĩĐŗОдĐŊŅŅˆĐŊиК Đ´ĐĩĐŊŅŒ!

    ВŅ‹ ĐŧĐžĐļĐĩŅ‚Đĩ вОКŅ‚и в ŅĐ¸ŅŅ‚ĐĩĐŧŅƒ, иŅĐŋĐžĐģŅŒĐˇŅƒŅ Đ°Đ´Ņ€ĐĩŅ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹: [email] и ĐŋĐ°Ņ€ĐžĐģŅŒ: [password]. ВозĐŧĐžĐļĐŊĐž, ваĐŧ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ŅĐŧĐĩĐŊиŅ‚ŅŒ ĐĩĐŗĐž ĐŋĐžŅĐģĐĩ ĐŋĐĩŅ€Đ˛ĐžĐŗĐž вŅ…Ода в ŅĐ¸ŅŅ‚ĐĩĐŧŅƒ.", "Accounts_UserAddedEmail_Description": "ВŅ‹ ĐŧĐžĐļĐĩŅ‚Đĩ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ŅĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đĩ ОйОСĐŊĐ°Ņ‡ĐĩĐŊиŅ: \n - `[name]`, `[fname]`, `[lname]` Đ´ĐģŅ ĐŋĐžĐģĐŊĐžĐŗĐž иĐŧĐĩĐŊи ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ, Ņ‚ĐžĐģŅŒĐēĐž иĐŧĐĩĐŊи иĐģи Ņ‚ĐžĐģŅŒĐēĐž Ņ„Đ°ĐŧиĐģии ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вĐĩĐŊĐŊĐž). \n - [email] - Đ´ĐģŅ email Đ°Đ´Ņ€ĐĩŅĐ° ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ. \n - [password] - Đ´ĐģŅ ĐŋĐ°Ņ€ĐžĐģŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ. \n - `[Site_Name]` и `[Site_URL]` - ĐŊаСваĐŊиĐĩ ваŅˆĐĩĐŗĐž ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиŅ и ĐĩĐŗĐž URL. ", + "Calls_in_queue_few": "{{count}} ЗвоĐŊĐēОв в ĐžŅ‡ĐĩŅ€Đĩди", "API_EmbedDisabledFor_Description": "ĐĄĐŋиŅĐžĐē ĐģĐžĐŗиĐŊОв, Ņ€Đ°ĐˇĐ´ĐĩĐģĐĩĐŊĐŊŅ‹Ņ… СаĐŋŅŅ‚Ņ‹Đŧи, Đ´ĐģŅ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊиŅ ĐŋŅ€ĐĩдваŅ€Đ¸Ņ‚ĐĩĐģŅŒĐŊĐžĐŗĐž ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đ° ŅŅŅ‹ĐģĐžĐē.", "Accounts_UserAddedEmailSubject_Default": "ВŅ‹ ĐąŅ‹Đģи дОйавĐģĐĩĐŊŅ‹ в [Site_Name]", "Accounts_Verify_Email_For_External_Accounts": "ОŅ‚ĐŧĐĩŅ‚иŅ‚ŅŒ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊŅƒŅŽ ĐŋĐžŅ‡Ņ‚Ņƒ Đ´ĐģŅ вĐŊĐĩŅˆĐŊиŅ… ŅƒŅ‡ĐĩŅ‚ĐŊŅ‹Ņ… СаĐŋиŅĐĩĐš ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐĩĐŊĐŊОК", @@ -311,7 +313,6 @@ "bypass-time-limit-edit-and-delete": "ОбŅ…Од ĐžĐŗŅ€Đ°ĐŊиŅ‡ĐĩĐŊиŅ ĐŋĐž вŅ€ĐĩĐŧĐĩĐŊи", "bypass-time-limit-edit-and-delete_description": "РаСŅ€ĐĩŅˆĐĩĐŊиĐĩ ĐŊĐ° ОйŅ…Од ĐžĐŗŅ€Đ°ĐŊиŅ‡ĐĩĐŊиŅ ĐŋĐž вŅ€ĐĩĐŧĐĩĐŊи Đ´ĐģŅ Ņ€ĐĩĐ´Đ°ĐēŅ‚иŅ€ĐžĐ˛Đ°ĐŊиŅ и ŅƒĐ´Đ°ĐģĐĩĐŊиŅ ŅĐžĐžĐąŅ‰ĐĩĐŊиК", "add-team-channel": "ДобавиŅ‚ŅŒ Channel КоĐŧĐ°ĐŊĐ´Ņ‹", - "Calls_in_queue_many": "{{count}} ЗвоĐŊĐēОв в ĐžŅ‡ĐĩŅ€Đĩди", "add-team-channel_description": "РаСŅ€ĐĩŅˆĐĩĐŊиĐĩ ĐŊĐ° дОйавĐģĐĩĐŊиĐĩ ĐēĐ°ĐŊĐ°ĐģĐ° в КоĐŧĐ°ĐŊĐ´Ņƒ", "add-team-member": "ДобавиŅ‚ŅŒ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēĐ° КоĐŧĐ°ĐŊĐ´Ņ‹", "add-team-member_description": "РаСŅ€ĐĩŅˆĐĩĐŊиĐĩ ĐŊĐ° дОйавĐģĐĩĐŊиĐĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв в КоĐŧĐ°ĐŊĐ´Ņƒ", @@ -335,13 +336,14 @@ "Additional_Feedback": "ДоĐŋĐžĐģĐŊиŅ‚ĐĩĐģŅŒĐŊĐ°Ņ ОйŅ€Đ°Ņ‚ĐŊĐ°Ņ ŅĐ˛ŅĐˇŅŒ", "additional_integrations_Bots": "ЕŅĐģи вŅ‹ иŅ‰ĐĩŅ‚Đĩ, ĐēĐ°Đē иĐŊŅ‚ĐĩĐŗŅ€Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐžĐąŅŅ‚вĐĩĐŊĐŊĐžĐŗĐž йОŅ‚Đ°, ĐŋĐžŅĐŧĐžŅ‚Ņ€Đ¸Ņ‚Đĩ ĐŊĐ°Ņˆ Đ°Đ´Đ°ĐŋŅ‚ĐĩŅ€ Hubot. https://github.com/RocketChat/hubot-rocketchat", "Admin_disabled_encryption": "ВаŅˆ Đ°Đ´ĐŧиĐŊиŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ ĐŊĐĩ вĐēĐģŅŽŅ‡Đ¸Đģ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊиĐĩ E2E.", + "Apps_Count_Enabled_few": "{{count}} ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК(-Ņ) вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "Admin_Info": "ИĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ АдĐŧиĐŊиŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€Đ°", "admin-no-active-video-conf-provider": "**ФŅƒĐŊĐēŅ†Đ¸Ņ СвОĐŊĐēОв ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐ°**: НаŅŅ‚Ņ€ĐžĐšŅ‚Đĩ СвОĐŊĐēи, Ņ‡Ņ‚ОйŅ‹ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ иŅ… Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи Đ´ĐģŅ ваŅˆĐĩĐŗĐž ŅĐĩŅ€Đ˛ĐĩŅ€Đ°.", - "Calls_in_queue_few": "{{count}} ЗвоĐŊĐēОв в ĐžŅ‡ĐĩŅ€Đĩди", "admin-video-conf-provider-not-configured": "**ФŅƒĐŊĐēŅ†Đ¸Ņ СвОĐŊĐēОв ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐ°**: НаŅŅ‚Ņ€ĐžĐšŅ‚Đĩ СвОĐŊĐēи, Ņ‡Ņ‚ОйŅ‹ ŅĐ´ĐĩĐģĐ°Ņ‚ŅŒ иŅ… Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹Đŧи Đ´ĐģŅ ваŅˆĐĩĐŗĐž ŅĐĩŅ€Đ˛ĐĩŅ€Đ°.", "admin-no-videoconf-provider-app": "**ФŅƒĐŊĐēŅ†Đ¸Ņ СвОĐŊĐēОв ĐŊĐĩ вĐēĐģŅŽŅ‡ĐĩĐŊĐ°**: ПŅ€Đ¸ĐģĐžĐļĐĩĐŊиŅ Đ´ĐģŅ СвОĐŊĐēОв ĐŧĐžĐŗŅƒŅ‚ ĐąŅ‹Ņ‚ŅŒ ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊŅ‹ иС ĐŧĐ°ĐŗаСиĐŊĐ° ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК Rocket.Chat Đ°Đ´ĐŧиĐŊиŅŅ‚Ņ€Đ°Ņ‚ĐžŅ€ĐžĐŧ ŅĐĩŅ€Đ˛ĐĩŅ€Đ°.", "Administration": "АдĐŧиĐŊиŅŅ‚Ņ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ", "Address": "АдŅ€ĐĩŅ", + "Private_Apps_Count_Enabled_few": "{{count}} ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Ņ… ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "Adult_images_are_not_allowed": "ИСОйŅ€Đ°ĐļĐĩĐŊиŅ Đ´ĐģŅ вСŅ€ĐžŅĐģŅ‹Ņ… СаĐŋŅ€ĐĩŅ‰ĐĩĐŊŅ‹", "Aerospace_and_Defense": "АŅŅ€ĐžĐēĐžŅĐŧиŅ‡ĐĩŅĐēĐ°Ņ ĐŋŅ€ĐžĐŧŅ‹ŅˆĐģĐĩĐŊĐŊĐžŅŅ‚ŅŒ и ОйОŅ€ĐžĐŊĐ°", "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "ПоŅĐģĐĩ Đ°ŅƒŅ‚ĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ†Đ¸Đ¸ OAuth2, ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģи ĐąŅƒĐ´ŅƒŅ‚ ĐŋĐĩŅ€ĐĩĐŊĐ°ĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒŅŅ ĐŊĐ° ŅŅ‚ĐžŅ‚ URL-Đ°Đ´Ņ€ĐĩŅ", @@ -363,14 +365,12 @@ "Alias_Set": "НаŅŅ‚Ņ€ĐžĐšĐēи ĐŋŅĐĩвдОĐŊиĐŧĐ°", "AutoLinker_Email": "AutoLinker Email", "Aliases": "ПŅĐĩвдОĐŊиĐŧŅ‹", - "Apps_Count_Enabled_few": "{{count}} ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК(-Ņ) вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "AutoLinker_Phone": "ПодŅĐ˛ĐĩŅ‡Đ¸Đ˛Đ°Ņ‚ŅŒ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊŅ‹", "AutoLinker_Phone_Description": "АвŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐĩŅĐēи вŅ‹Đ´ĐĩĐģŅŅ‚ŅŒ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊĐŊŅ‹Đĩ ĐŊĐžĐŧĐĩŅ€Đ°, ĐŊĐ°ĐŋŅ€Đ¸ĐŧĐĩŅ€ `(123)456-7890`", "All": "ВŅĐĩ", "AutoLinker_StripPrefix": "ĐŖĐ´Đ°ĐģĐĩĐŊиĐĩ ĐŋŅ€ĐĩŅ„иĐēŅĐžĐ˛", "All_Apps": "ВŅĐĩ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиŅ", "AutoLinker_StripPrefix_Description": "ĐĄĐžĐēŅ€Đ°Ņ‰Đ°Ņ‚ŅŒ Ņ„ĐžŅ€ĐŧĐ°Ņ‚, ĐŊĐ°ĐŋŅ€Đ¸ĐŧĐĩŅ€: https://rocket.chat => rocket.chat", - "Private_Apps_Count_Enabled_few": "{{count}} ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Ņ… ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊиК вĐēĐģŅŽŅ‡ĐĩĐŊĐž", "All_added_tokens_will_be_required_by_the_user": "ВŅĐĩ дОйавĐģĐĩĐŊĐŊŅ‹Đĩ Ņ‚ĐžĐēĐĩĐŊŅ‹ ĐŋĐžŅ‚Ņ€ĐĩĐąŅƒŅŽŅ‚ŅŅ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģĐĩĐŧ", "All_categories": "ВŅĐĩ ĐēĐ°Ņ‚ĐĩĐŗĐžŅ€Đ¸Đ¸", "AutoLinker_Urls_Scheme": "AutoLinker Scheme:// URLs", @@ -854,6 +854,7 @@ "CAS_enabled": "ВĐēĐģŅŽŅ‡ĐĩĐŊĐž", "CAS_Login_Layout": "ĐĄŅ‚иĐģŅŒ ĐžĐēĐŊĐ° CAS авŅ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸", "CAS_login_url": "SSO ĐģĐžĐŗиĐŊ URL", + "message_counter_many": "{{count}} ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ", "CAS_login_url_Description": "ЛоĐŗиĐŊ URL ваŅˆĐĩĐŗĐž вĐŊĐĩŅˆĐŊĐĩĐŗĐž ŅĐĩŅ€Đ˛Đ¸ŅĐ° SSO. НаĐŋŅ€Đ¸ĐŧĐĩŅ€: `https://sso.example.undef/sso/login`", "CAS_popup_height": "ВŅ‹ŅĐžŅ‚Đ° вŅĐŋĐģŅ‹Đ˛Đ°ŅŽŅ‰ĐĩĐŗĐž ĐžĐēĐŊĐ° вŅ…Ода", "CAS_popup_width": "ШиŅ€Đ¸ĐŊĐ° вŅĐŋĐģŅ‹Đ˛Đ°ŅŽŅ‰ĐĩĐŗĐž ĐžĐēĐŊĐ° вŅ…Ода", @@ -869,6 +870,7 @@ "Categories*": "КаŅ‚ĐĩĐŗĐžŅ€Đ¸Đ¸*", "CDN_JSCSS_PREFIX": "ПŅ€ĐĩŅ„иĐēŅ CDN Đ´ĐģŅ JS/CSS", "CDN_PREFIX": "CDN ĐŋŅ€ĐĩŅ„иĐēŅ", + "meteor_status_reconnect_in_many": "ĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ŅĐŊОва Ņ‡ĐĩŅ€ĐĩС {{count}} ŅĐĩĐēŅƒĐŊĐ´ ...", "CDN_PREFIX_ALL": "ИŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ ПŅ€ĐĩŅ„иĐēŅ CDN Đ´ĐģŅ вŅĐĩŅ… Đ°ĐēŅ‚ивОв", "Certificates_and_Keys": "КĐģŅŽŅ‡Đ¸ и ŅĐĩŅ€Ņ‚иŅ„иĐēĐ°Ņ‚Ņ‹", "change-livechat-room-visitor": "ИСĐŧĐĩĐŊиŅ‚ŅŒ ĐŋĐžŅĐĩŅ‚иŅ‚ĐĩĐģĐĩĐš Ņ‡Đ°Ņ‚Đ° Livechat", @@ -938,6 +940,7 @@ "Click_here": "ĐēĐģиĐēĐŊиŅ‚Đĩ ŅŅŽĐ´Đ°", "Click_here_for_more_details_or_contact_sales_for_a_new_license": "НаĐļĐŧиŅ‚Đĩ ŅŅŽĐ´Đ° Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊиŅ ĐŋОдŅ€ĐžĐąĐŊОК иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ иĐģи ŅĐ˛ŅĐļиŅ‚ĐĩŅŅŒ {{email}} Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊиŅ ĐŊОвОК ĐģиŅ†ĐĩĐŊСии.", "Click_here_for_more_info": "БоĐģŅŒŅˆĐĩ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Đ¸ СдĐĩŅŅŒ", + "message_counter_few": "{{count}} ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ", "Click_here_to_enter_your_encryption_password": "НаĐļĐŧиŅ‚Đĩ СдĐĩŅŅŒ, Ņ‡Ņ‚ОйŅ‹ ввĐĩŅŅ‚и ĐŋĐ°Ņ€ĐžĐģŅŒ Đ´ĐģŅ ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊиŅ.", "Click_here_to_view_and_copy_your_password": "НаĐļĐŧиŅ‚Đĩ СдĐĩŅŅŒ, Ņ‡Ņ‚ОйŅ‹ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ и ŅĐēĐžĐŋиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐŋĐ°Ņ€ĐžĐģŅŒ.", "Click_the_messages_you_would_like_to_send_by_email": "ВŅ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ вŅ‹ Ņ…ĐžŅ‚иŅ‚Đĩ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐž email.", @@ -969,6 +972,7 @@ "Cloud_Invalid_license": "НĐĩĐ´ĐĩĐšŅŅ‚виŅ‚ĐĩĐģŅŒĐŊĐ°Ņ ĐģиŅ†ĐĩĐŊСиŅ!", "Cloud_Apply_license": "ПŅ€Đ¸ĐŧĐĩĐŊиŅ‚ŅŒ ĐģиŅ†ĐĩĐŊСиŅŽ", "Cloud_connectivity": "ОбĐģĐ°Ņ‡ĐŊĐ°Ņ ŅĐ˛ŅĐˇŅŒ", + "meteor_status_reconnect_in_few": "ĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ŅĐŊОва Ņ‡ĐĩŅ€ĐĩС {{count}} ŅĐĩĐēŅƒĐŊĐ´ ...", "Cloud_address_to_send_registration_to": "АдŅ€ĐĩŅ Đ´ĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžĐŗĐž ĐŋиŅŅŒĐŧĐ° Ņ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸ĐĩĐš в ОйĐģĐ°ĐēĐĩ.", "Cloud_click_here": "ПоŅĐģĐĩ ĐēĐžĐŋиŅ€ĐžĐ˛Đ°ĐŊиŅ Ņ‚ĐĩĐēŅŅ‚Đ° ĐŋĐĩŅ€ĐĩКдиŅ‚Đĩ ĐŊĐ° Cloud Console. [ĐŠĐĩĐģĐēĐŊиŅ‚Đĩ СдĐĩŅŅŒ]({{cloudConsoleUrl}})", "Cloud_console": "ОбĐģĐ°Ņ‡ĐŊĐ°Ņ КоĐŊŅĐžĐģŅŒ", @@ -1053,7 +1057,6 @@ "Contact_not_found": "КоĐŊŅ‚Đ°ĐēŅ‚ ĐŊĐĩ ĐŊаКдĐĩĐŊ", "Contact_Profile": "ПŅ€ĐžŅ„иĐģŅŒ ĐēĐžĐŊŅ‚Đ°ĐēŅ‚Đ°", "Contact_Info": "КоĐŊŅ‚Đ°ĐēŅ‚ĐŊĐ°Ņ иĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Đ¸Ņ", - "message_counter_many": "{{count}} ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ", "Content": "ХОдĐĩŅ€ĐļиĐŧĐžĐĩ", "Continue": "ПŅ€ĐžĐ´ĐžĐģĐļиŅ‚ŅŒ", "Continuous_sound_notifications_for_new_livechat_room": "НĐĩĐŋŅ€ĐĩŅ€Ņ‹Đ˛ĐŊŅ‹Đĩ СвŅƒĐēОвŅ‹Đĩ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊиŅ Đ´ĐģŅ ĐŊОвОК ĐēĐžĐŧĐŊĐ°Ņ‚Ņ‹ livechat", @@ -1068,7 +1071,6 @@ "Conversations": "ĐĄĐĩĐ°ĐŊŅŅ‹ Ņ‡Đ°Ņ‚Đ°", "Conversations_per_day": "ĐĄĐĩĐ°ĐŊŅŅ‹ Ņ‡Đ°Ņ‚Đ° Са Đ´ĐĩĐŊŅŒ", "Convert": "КоĐŊвĐĩŅ€Ņ‚иŅ€ĐžĐ˛Đ°Ņ‚ŅŒ", - "meteor_status_reconnect_in_many": "ĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ŅĐŊОва Ņ‡ĐĩŅ€ĐĩС {{count}} ŅĐĩĐēŅƒĐŊĐ´ ...", "Convert_Ascii_Emojis": "КоĐŊвĐĩŅ€Ņ‚иŅ€ĐžĐ˛Đ°Ņ‚ŅŒ ASCII в ŅĐŧОдСи", "Convert_to_channel": "КоĐŊвĐĩŅ€Ņ‚иŅ€ĐžĐ˛Đ°Ņ‚ŅŒ в Ņ‡Đ°Ņ‚", "Converting_channel_to_a_team": "ВŅ‹ ĐŋŅ€ĐĩОйŅ€Đ°ĐˇŅƒĐĩŅ‚Đĩ ŅŅ‚ĐžŅ‚ Ņ‡Đ°Ņ‚ в КоĐŧĐ°ĐŊĐ´Ņƒ. ВŅĐĩ ĐĩĐŗĐž ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēи ĐąŅƒĐ´ŅƒŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹.", @@ -1144,7 +1146,6 @@ "Country_Denmark": "ДаĐŊиŅ", "Country_Djibouti": "ДĐļийŅƒŅ‚и", "Country_Dominica": "ДоĐŧиĐŊиĐēĐ°", - "message_counter_few": "{{count}} ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ", "Country_Dominican_Republic": "ДоĐŧиĐŊиĐēĐ°ĐŊŅĐēĐ°Ņ Đ ĐĩŅĐŋŅƒĐąĐģиĐēĐ°", "Country_Ecuador": "Đ­ĐēвадОŅ€", "Country_Egypt": "ЕĐŗиĐŋĐĩŅ‚", @@ -1180,7 +1181,6 @@ "Country_Heard_Island_and_Mcdonald_Islands": "ОŅŅ‚Ņ€ĐžĐ˛Đ° ĐĨĐĩŅ€Đ´ и МаĐēĐ´ĐžĐŊĐ°ĐģŅŒĐ´", "Country_Holy_See_Vatican_City_State": "ХвŅŅ‚ĐĩĐšŅˆĐ¸Đš ПŅ€ĐĩŅŅ‚ĐžĐģ (ГоŅŅƒĐ´Đ°Ņ€ŅŅ‚вО ВаŅ‚иĐēĐ°ĐŊ)", "Country_Honduras": "ГоĐŊĐ´ŅƒŅ€Đ°Ņ", - "meteor_status_reconnect_in_few": "ĐŋŅ‹Ņ‚Đ°ĐĩŅ‚ŅŅ ŅĐŊОва Ņ‡ĐĩŅ€ĐĩС {{count}} ŅĐĩĐēŅƒĐŊĐ´ ...", "Country_Hong_Kong": "ГоĐŊĐēĐžĐŊĐŗ", "Country_Hungary": "ВĐĩĐŊĐŗŅ€Đ¸Ņ", "Country_Iceland": "ИŅĐģĐ°ĐŊдиŅ", @@ -3700,6 +3700,9 @@ "RetentionPolicy_Advanced_Precision": "ИŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅƒŅŽ ĐēĐžĐŊŅ„иĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŽ ĐŋĐžĐģиŅ‚иĐēи ĐžŅ‡Đ¸ŅŅ‚Đēи ŅĐžĐžĐąŅ‰ĐĩĐŊиК", "RetentionPolicy_Advanced_Precision_Cron": "ИŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊŅ‹Đš ĐŋĐģĐ°ĐŊиŅ€ĐžĐ˛Ņ‰Đ¸Đē Đ´ĐģŅ ĐŋĐžĐģиŅ‚иĐēи ĐžŅ‡Đ¸ŅŅ‚Đēи ŅĐžĐžĐąŅ‰ĐĩĐŊиК", "RetentionPolicy_Advanced_Precision_Cron_Description": "КаĐē Ņ‡Đ°ŅŅ‚Đž Đ´ĐžĐģĐļĐĩĐŊ СаĐŋŅƒŅĐēĐ°Ņ‚ŅŒŅŅ Ņ‚Đ°ĐšĐŧĐĩŅ€ ĐžŅ‡Đ¸ŅŅ‚Đēи ŅĐžĐžĐąŅ‰ĐĩĐŊиК ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅĐĩŅ‚ŅŅ ĐŋŅ€Đ°Đ˛Đ¸ĐģĐžĐŧ СадаŅ‡Đ¸ ĐŋĐģĐ°ĐŊиŅ€ĐžĐ˛Ņ‰Đ¸ĐēĐ°. ĐŖŅŅ‚Đ°ĐŊОвĐēĐ° ŅŅ‚иŅ… СĐŊĐ°Ņ‡ĐĩĐŊиК ĐŋОСвОĐģŅĐĩŅ‚ ĐēĐ°ĐŊĐ°ĐģĐ°Đŧ Ņ йОĐģĐĩĐĩ Ņ‡Đ°ŅŅ‚Ņ‹Đŧи Ņ‚Đ°ĐšĐŧĐĩŅ€Đ°Đŧи ĐžŅ‡Đ¸ŅŅ‚Đēи ŅĐžĐžĐąŅ‰ĐĩĐŊиК Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ ĐģŅƒŅ‡ŅˆĐĩ, ĐŊĐž ĐŧĐžĐļĐĩŅ‚ ŅŅ‚ОиŅ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊиŅ‚ĐĩĐģŅŒĐŊŅ‹Ņ… вŅ‹Ņ‡Đ¸ŅĐģиŅ‚ĐĩĐģŅŒĐŊŅ‹Ņ… ĐŧĐžŅ‰ĐŊĐžŅŅ‚ĐĩĐš ĐŊĐ° йОĐģŅŒŅˆĐ¸Ņ… ŅĐžĐžĐąŅ‰ĐĩŅŅ‚ваŅ….", + "RetentionPolicy_AppliesToChannels": "ПŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đē ĐžŅ‚ĐēŅ€Ņ‹Ņ‚Ņ‹Đŧ ĐēĐ°ĐŊĐ°ĐģĐ°Đŧ", + "RetentionPolicy_AppliesToDMs": "ПŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đē ĐģиŅ‡ĐŊŅ‹Đŧ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅĐŧ", + "RetentionPolicy_AppliesToGroups": "ПŅ€Đ¸ĐŧĐĩĐŊŅĐĩŅ‚ŅŅ Đē СаĐēŅ€Ņ‹Ņ‚Ņ‹Đŧ ĐēĐ°ĐŊĐ°ĐģĐ°Đŧ", "RetentionPolicy_Description": "АвŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐĩŅĐēи ŅƒĐ´Đ°ĐģŅĐĩŅ‚ ŅŅ‚Đ°Ņ€Ņ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ ĐŊĐ° ваŅˆĐĩĐŧ ŅĐĩŅ€Đ˛ĐĩŅ€Đĩ Rocket.Chat.", "RetentionPolicy_DoNotPruneDiscussion": "НĐĩ ŅƒĐ´Đ°ĐģŅŅ‚ŅŒ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ ОйŅŅƒĐļĐ´ĐĩĐŊиК", "RetentionPolicy_DoNotPrunePinned": "НĐĩ ŅƒĐ´Đ°ĐģŅŅ‚ŅŒ ĐŋŅ€Đ¸ĐēŅ€ĐĩĐŋĐģĐĩĐŊĐŊŅ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ", @@ -3709,6 +3712,10 @@ "RetentionPolicy_FilesOnly": "ĐŖĐ´Đ°ĐģиŅ‚ŅŒ Ņ‚ĐžĐģŅŒĐēĐž Ņ„Đ°ĐšĐģŅ‹", "RetentionPolicy_FilesOnly_Description": "ĐŖĐ´Đ°ĐģŅŅŽŅ‚ŅŅ Ņ‚ĐžĐģŅŒĐēĐž Ņ„Đ°ĐšĐģŅ‹, ŅĐ°Đŧи ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ ĐžŅŅ‚Đ°ŅŽŅ‚ŅŅ ĐŊĐ° ĐŧĐĩŅŅ‚Đĩ.", "RetentionPolicy_MaxAge": "МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊĐžĐĩ вŅ€ĐĩĐŧŅ ĐļиСĐŊи ŅĐžĐžĐąŅ‰ĐĩĐŊиК", + "RetentionPolicy_MaxAge_Channels": "МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊĐžĐĩ вŅ€ĐĩĐŧŅ ĐļиСĐŊи ŅĐžĐžĐąŅ‰ĐĩĐŊиК в ĐžŅ‚ĐēŅ€Ņ‹Ņ‚Ņ‹Ņ… ĐēĐ°ĐŊĐ°ĐģĐ°Ņ…", + "RetentionPolicy_MaxAge_Description": "ĐŖĐ´Đ°ĐģŅŅ‚ŅŒ вŅĐĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ ŅŅ‚Đ°Ņ€ŅˆĐĩ ŅŅ‚ĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊиŅ, в Đ´ĐŊŅŅ…", + "RetentionPolicy_MaxAge_DMs": "МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊĐžĐĩ вŅ€ĐĩĐŧŅ ĐļиСĐŊи ĐģиŅ‡ĐŊŅ‹Ņ… ŅĐžĐžĐąŅ‰ĐĩĐŊиК", + "RetentionPolicy_MaxAge_Groups": "МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊĐžĐĩ вŅ€ĐĩĐŧŅ ĐļиСĐŊи ŅĐžĐžĐąŅ‰ĐĩĐŊиК в СаĐēŅ€Ņ‹Ņ‚Ņ‹Ņ… ĐēĐ°ĐŊĐ°ĐģĐ°Ņ…", "RetentionPolicy_Precision": "ĐĸĐžŅ‡ĐŊĐžŅŅ‚ŅŒ Ņ‚Đ°ĐšĐŧĐĩŅ€Đ°", "RetentionPolicy_Precision_Description": "КаĐē Ņ‡Đ°ŅŅ‚Đž Đ´ĐžĐģĐļĐĩĐŊ СаĐŋŅƒŅĐēĐ°Ņ‚ŅŒŅŅ Ņ‚Đ°ĐšĐŧĐĩŅ€ ĐžŅ‡Đ¸ŅŅ‚Đēи. ĐŖŅŅ‚Đ°ĐŊОвĐēĐ° ŅŅ‚иŅ… СĐŊĐ°Ņ‡ĐĩĐŊиК ĐŋОСвОĐģŅĐĩŅ‚ ĐēĐ°ĐŊĐ°ĐģĐ°Đŧ Ņ йОĐģĐĩĐĩ Ņ‡Đ°ŅŅ‚Ņ‹Đŧи Ņ‚Đ°ĐšĐŧĐĩŅ€Đ°Đŧи ĐžŅ‡Đ¸ŅŅ‚Đēи ŅĐžĐžĐąŅ‰ĐĩĐŊиК Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ ĐģŅƒŅ‡ŅˆĐĩ, ĐŊĐž ĐŧĐžĐļĐĩŅ‚ ŅŅ‚ОиŅ‚ŅŒ Đ´ĐžĐŋĐžĐģĐŊиŅ‚ĐĩĐģŅŒĐŊŅ‹Ņ… вŅ‹Ņ‡Đ¸ŅĐģиŅ‚ĐĩĐģŅŒĐŊŅ‹Ņ… ĐŧĐžŅ‰ĐŊĐžŅŅ‚ĐĩĐš ĐŊĐ° йОĐģŅŒŅˆĐ¸Ņ… ŅĐžĐžĐąŅ‰ĐĩŅŅ‚ваŅ….", "RetentionPolicyRoom_Enabled": "АвŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐĩŅĐēи ŅƒĐ´Đ°ĐģŅŅ‚ŅŒ ŅŅ‚Đ°Ņ€Ņ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ", @@ -5092,4 +5099,4 @@ "Enterprise": "КоŅ€ĐŋĐžŅ€Đ°Ņ†Đ¸Ņ", "UpgradeToGetMore_engagement-dashboard_Title": "АĐŊĐ°ĐģиŅ‚иĐēĐ°", "UpgradeToGetMore_auditing_Title": "АŅƒĐ´Đ¸Ņ‚ ŅĐžĐžĐąŅ‰ĐĩĐŊиК" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/sk-SK.i18n.json b/packages/i18n/src/locales/sk-SK.i18n.json index c3e650063e09..f5bc7bfcbc58 100644 --- a/packages/i18n/src/locales/sk-SK.i18n.json +++ b/packages/i18n/src/locales/sk-SK.i18n.json @@ -2069,12 +2069,19 @@ "Retail": "Maloobchod", "Retention_setting_changed_successfully": "Nastavenie politiky uchovÃĄvania sa ÃēspeÅĄne zmenilo", "RetentionPolicy": "Politika uchovÃĄvania", + "RetentionPolicy_AppliesToChannels": "Platí pre kanÃĄly", + "RetentionPolicy_AppliesToDMs": "Platí pre priame sprÃĄvy", + "RetentionPolicy_AppliesToGroups": "Platí pre sÃēkromnÊ ​​skupiny", "RetentionPolicy_Description": "Automaticky prerezÃĄva starÊ sprÃĄvy v rÃĄmci vaÅĄej inÅĄtancie Rocket.Chat.", "RetentionPolicy_Enabled": "PovolenÊ", "RetentionPolicy_ExcludePinned": "VylÃēčte pripnutÊ sprÃĄvy", "RetentionPolicy_FilesOnly": "OdstrÃĄÅˆte iba sÃēbory", "RetentionPolicy_FilesOnly_Description": "Iba sÃēbory budÃē vymazanÊ, samotnÊ sprÃĄvy zostanÃē na mieste.", "RetentionPolicy_MaxAge": "MaximÃĄlny vek sprÃĄvy", + "RetentionPolicy_MaxAge_Channels": "MaximÃĄlny vek sprÃĄv v kanÃĄloch", + "RetentionPolicy_MaxAge_Description": "NakrÃĄjajte vÅĄetky sprÃĄvy starÅĄie ako tÃĄto hodnota v dňoch", + "RetentionPolicy_MaxAge_DMs": "MaximÃĄlny vek sprÃĄv v priamych sprÃĄvach", + "RetentionPolicy_MaxAge_Groups": "MaximÃĄlny vek sprÃĄv v sÃēkromnÃŊch skupinÃĄch", "RetentionPolicy_Precision": "Timer Precision", "RetentionPolicy_Precision_Description": "Ako často by mal spustiÅĨ časovač prerezÃĄvanie. Nastavenie tejto hodnoty na presnejÅĄiu hodnotu umoŞňuje, aby kanÃĄly s rÃŊchlymi retenčnÃŊmi časovačmi fungovali lepÅĄie, ale mohlo by to zapríčiniÅĨ mimoriadny vÃŊkon spracovania veÄžkÃŊch spoločenstiev.", "RetentionPolicyRoom_Enabled": "Automaticky prerezÃĄvaÅĨ starÊ sprÃĄvy", @@ -2764,4 +2771,4 @@ "registration.component.form.sendConfirmationEmail": "PoÅĄlite potvrdzovací e-mail", "Enterprise": "podnik", "UpgradeToGetMore_engagement-dashboard_Title": "Analytika" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/sl-SI.i18n.json b/packages/i18n/src/locales/sl-SI.i18n.json index 07ba5f608dd9..668bb94dc2c5 100644 --- a/packages/i18n/src/locales/sl-SI.i18n.json +++ b/packages/i18n/src/locales/sl-SI.i18n.json @@ -2049,12 +2049,19 @@ "Retail": "Maloprodaja", "Retention_setting_changed_successfully": "Nastavitev pravilnika o zadrÅžanju je bila uspeÅĄno spremenjena", "RetentionPolicy": "Politika zadrÅževanja", + "RetentionPolicy_AppliesToChannels": "Velja za kanale", + "RetentionPolicy_AppliesToDMs": "Velja za neposredna sporočila", + "RetentionPolicy_AppliesToGroups": "Velja za zasebne skupine", "RetentionPolicy_Description": "Samodejno osemenjevanje starih sporočil prek vaÅĄega Rocket.Chat primera.", "RetentionPolicy_Enabled": "Omogočeno", "RetentionPolicy_ExcludePinned": "Izključi prepovedana sporočila", "RetentionPolicy_FilesOnly": "IzbriÅĄite le datoteke", "RetentionPolicy_FilesOnly_Description": "Samo datoteke bodo izbrisane, sporočila bodo ostala na mestu.", "RetentionPolicy_MaxAge": "NajviÅĄja starost sporočila", + "RetentionPolicy_MaxAge_Channels": "NajviÅĄja starost sporočil v kanalih", + "RetentionPolicy_MaxAge_Description": "Preglejte vsa sporočila, starejÅĄa od te vrednosti, v dnevih", + "RetentionPolicy_MaxAge_DMs": "NajviÅĄja starost sporočil v neposrednih sporočilih", + "RetentionPolicy_MaxAge_Groups": "Največja starost sporočil v zasebnih skupinah", "RetentionPolicy_Precision": "Časovna natančnost", "RetentionPolicy_Precision_Description": "Kako pogosto naj se izvaja časovni rezalnik. Če nastavite to na natančnejÅĄo vrednost, postanejo kanali z hitrimi časovnimi časi boljÅĄi, vendar pa lahko pri večjih skupnostih stanejo dodatna procesna moč.", "RetentionPolicyRoom_Enabled": "Samodejno obrezovanje starih sporočil", @@ -2744,4 +2751,4 @@ "registration.component.form.sendConfirmationEmail": "PoÅĄlji potrditveno e-poÅĄtno sporočilo", "Enterprise": "Podjetje", "UpgradeToGetMore_engagement-dashboard_Title": "Analiza" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/sq.i18n.json b/packages/i18n/src/locales/sq.i18n.json index ce59a0e3af89..312494da2e8d 100644 --- a/packages/i18n/src/locales/sq.i18n.json +++ b/packages/i18n/src/locales/sq.i18n.json @@ -2059,12 +2059,19 @@ "Retail": "me pakicÃĢ", "Retention_setting_changed_successfully": "Rregullimi i politikÃĢs sÃĢ ruajtjes ndryshoi me sukses", "RetentionPolicy": "Politika e Ruajtjes", + "RetentionPolicy_AppliesToChannels": "Zbatohet tek kanalet", + "RetentionPolicy_AppliesToDMs": "Zbatohet nÃĢ mesazhet direkte", + "RetentionPolicy_AppliesToGroups": "Zbatohet pÃĢr grupe private", "RetentionPolicy_Description": "Prunes automatikisht mesazhet e vjetra nÃĢ tÃĢ gjithÃĢ shkallÃĢn Rocket.Chat.", "RetentionPolicy_Enabled": "enabled", "RetentionPolicy_ExcludePinned": "PÃĢrjashto mesazhet e mbÃĢshtetura", "RetentionPolicy_FilesOnly": "VetÃĢm fshini skedarÃĢt", "RetentionPolicy_FilesOnly_Description": "VetÃĢm skedarÃĢt do tÃĢ fshihen, vetÃĢ mesazhet do tÃĢ qÃĢndrojnÃĢ nÃĢ vend.", "RetentionPolicy_MaxAge": "Mosha maksimale e mesazhit", + "RetentionPolicy_MaxAge_Channels": "Mosha maksimale e mesazhit nÃĢ kanale", + "RetentionPolicy_MaxAge_Description": "Prune tÃĢ gjitha mesazhet mÃĢ tÃĢ vjetÃĢr se kjo vlerÃĢ, nÃĢ ditÃĢ", + "RetentionPolicy_MaxAge_DMs": "Mosha Maksimale e mesazhit nÃĢ mesazhet direkte", + "RetentionPolicy_MaxAge_Groups": "Mosha maksimale e mesazhit nÃĢ grupe private", "RetentionPolicy_Precision": "Timer Precision", "RetentionPolicy_Precision_Description": "Sa shpesh koha duhet tÃĢ funksionojÃĢ. Vendosja e kÃĢsaj me njÃĢ vlerÃĢ mÃĢ tÃĢ saktÃĢ bÃĢn qÃĢ kanalet me kohÃĢmatÃĢsi tÃĢ mbajtjes sÃĢ shpejtÃĢ tÃĢ funksionojnÃĢ mÃĢ mirÃĢ, por mund tÃĢ kushtojnÃĢ energji shtesÃĢ pÃĢr pÃĢrpunim nÃĢ komunitetet e mÃĢdha.", "RetentionPolicyRoom_Enabled": "Automatikisht prishi mesazhet e vjetra", @@ -2753,4 +2760,4 @@ "registration.component.form.sendConfirmationEmail": "DÃĢrgo email konfirmimi", "Enterprise": "NdÃĢrmarrje", "UpgradeToGetMore_engagement-dashboard_Title": "AnalitikÃĢ" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/sr.i18n.json b/packages/i18n/src/locales/sr.i18n.json index f02efa3acd54..e26e8bd3862f 100644 --- a/packages/i18n/src/locales/sr.i18n.json +++ b/packages/i18n/src/locales/sr.i18n.json @@ -46,7 +46,7 @@ "Accounts_Email_Deactivated_Subject": "НаĐģĐžĐŗ Đ´ĐĩĐ°ĐēŅ‚ивиŅ€Đ°ĐŊ", "Accounts_EmailVerification": "ДозвоĐģи ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Ņƒ ŅĐ°ĐŧĐž ĐŋĐžŅ‚вŅ€Ņ’ĐĩĐŊиĐŧ ĐēĐžŅ€Đ¸ŅĐŊиŅ†Đ¸ĐŧĐ°", "Accounts_EmailVerification_Description": "ПоŅ‚вŅ€Đ´Đ¸Ņ‚Đĩ Đ´Đ° иĐŧĐ°Ņ‚Đĩ иŅĐŋŅ€Đ°Đ˛ĐŊĐĩ SMTP ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đĩ Đ´Đ° йи ŅŅ‚Đĩ ĐēĐžŅ€Đ¸ŅŅ‚иĐģи ОвŅƒ ĐŧĐžĐŗŅƒŅ›ĐŊĐžŅŅ‚", - "Accounts_Enrollment_Email": "ĐŖĐŋиŅ Đĩ-ĐŧаиĐģ", + "Accounts_Enrollment_Email": "ĐŖĐŋиŅ иĐŧĐĩŅ˜ĐģĐ°", "Accounts_Enrollment_Email_Default": "

    ДобŅ€ĐžĐ´ĐžŅˆĐģи ĐŊĐ°[Site_Name]

    Иди ĐŊĐ° [Site_URL] и иŅĐŋŅ€ĐžĐąĐ°Ņ˜ ĐŊĐ°Ņ˜ĐąĐžŅ™Đĩ Ņ€ĐĩŅˆĐĩŅšĐĩ Са Ņ›Đ°ŅĐēĐ°ŅšĐĩ ĐžŅ‚вОŅ€ĐĩĐŊĐžĐŗ ĐēОда ĐēĐžŅ˜Đĩ Ņ˜Đĩ Ņ‚Ņ€ĐĩĐŊŅƒŅ‚ĐŊĐž Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž!

    ", "Accounts_Enrollment_Email_Description": "МоĐļĐĩŅ‚Đĩ ĐēĐžŅ€Đ¸ŅŅ‚иŅ‚и `[name]`, `[fname]`, `[lname]` Са ĐŋŅƒĐŊĐž иĐŧĐĩ ĐēĐžŅ€Đ¸ŅĐŊиĐēĐ°, иĐŧĐĩĐŊŅƒ иĐģи ĐŋŅ€ĐĩСиĐŧĐĩĐŊŅƒ, Ņ€ĐĩŅĐŋĐĩĐēŅ‚ивĐŊĐž.
    МоĐļĐĩŅ‚Đĩ ĐēĐžŅ€Đ¸ŅŅ‚иŅ‚и [email] Đĩ-ĐŋĐžŅˆŅ‚Đĩ ĐēĐžŅ€Đ¸ŅĐŊиĐēĐ°.", "Accounts_Enrollment_Email_Subject_Default": "ДобŅ€ĐžĐ´ĐžŅˆĐģи ĐŊĐ° [Site_Name]", @@ -72,53 +72,30 @@ "Accounts_OAuth_Custom_Token_Path": "ПŅƒŅ‚Đ°ŅšĐ° Ņ‚ĐžĐēĐĩĐŊĐ°", "Accounts_OAuth_Custom_Token_Sent_Via": "ĐĸĐžĐēĐĩĐŊ ĐŋĐžŅĐģĐ°Ņ‚ ĐŋŅƒŅ‚ĐĩĐŧ", "Accounts_OAuth_Custom_Username_Field": "ПоŅ™Đĩ ĐēĐžŅ€Đ¸ŅĐŊиŅ‡ĐēĐžĐŗ иĐŧĐĩĐŊĐ°", - "Accounts_OAuth_Drupal_id": "ДŅ€ŅƒĐŋĐ°Đģ ОАŅƒŅ‚Ņ…2 КĐģиŅ˜ĐĩĐŊŅ‚ ИД", - "Accounts_OAuth_Facebook": "ФаŅ†ĐĩйООĐē ĐģĐžĐŗиĐŊ", - "Accounts_OAuth_Facebook_secret": "Ņ„Đ°Ņ†ĐĩйООĐē ĐĸĐ°Ņ˜ĐŊĐ°", - "Accounts_OAuth_Github_callback_url": "ГиŅ‚Ņ…ŅƒĐą ĐŖРЛ Са ĐŋОвŅ€Đ°Ņ‚ĐŊи ĐŋОСив", "Accounts_OAuth_GitHub_Enterprise": "ОАŅƒŅ‚Ņ… ОĐŧĐžĐŗŅƒŅ›ĐĩĐŊĐž", - "Accounts_OAuth_GitHub_Enterprise_callback_url": "ГиŅ‚ĐĨŅƒĐą ĐŋŅ€ĐĩĐ´ŅƒĐˇĐĩŅ›Đ° ĐŖРЛ Са ĐŋОвŅ€Đ°Ņ‚ĐŊи ĐŋОСив", "Accounts_OAuth_GitHub_Enterprise_id": "Ид ĐēĐģиŅ˜ĐĩĐŊŅ‚Đ°", "Accounts_OAuth_GitHub_Enterprise_secret": "ĐĸĐ°Ņ˜ĐŊĐ° ĐēĐģиŅ˜ĐĩĐŊŅ‚Đ°", "Accounts_OAuth_Github_id": "Ид ĐēĐģиŅ˜ĐĩĐŊŅ‚Đ°", "Accounts_OAuth_Github_secret": "ĐĸĐ°Ņ˜ĐŊĐ° ĐēĐģиŅ˜ĐĩĐŊŅ‚Đ°", - "Accounts_OAuth_Gitlab": "ОАŅƒŅ‚Ņ… ОĐŧĐžĐŗŅƒŅ›ĐĩĐŊĐž", + "Accounts_OAuth_Gitlab": "OAuth ĐžĐŧĐžĐŗŅƒŅ›ĐĩĐŊ", "Accounts_OAuth_Gitlab_identity_path": "ПŅƒŅ‚Đ°ŅšĐ° Đ´Đž идĐĩĐŊŅ‚иŅ‚ĐĩŅ‚Đ°", "Accounts_OAuth_Gitlab_secret": "ĐĸĐ°Ņ˜ĐŊĐ° ĐēĐģиŅ˜ĐĩĐŊŅ‚Đ°", - "Accounts_OAuth_Google_callback_url": "ГооĐŗĐģĐĩ ĐŖРЛ Са ĐŋОвŅ€Đ°Ņ‚ĐŊи ĐŋОСив", - "Accounts_OAuth_Google_secret": "ĐŗООĐŗĐģĐĩ ĐĸĐ°Ņ˜ĐŊĐ°", - "Accounts_OAuth_Linkedin": "ЛиĐŊĐēĐĩдИĐŊ ПŅ€Đ¸Ņ˜Đ°Đ˛Đ°", - "Accounts_OAuth_Linkedin_callback_url": "ЛиĐŊĐēĐĩдИĐŊ ĐŖРЛ Са ĐŋОвŅ€Đ°Ņ‚ĐŊи ĐŋОСив", - "Accounts_OAuth_Linkedin_id": "ЛиĐŊĐēĐĩдИĐŊ ИД", - "Accounts_OAuth_Linkedin_secret": "ЛиĐŊĐēĐĩдИĐŊ ĐĸĐ°Ņ˜ĐŊĐ°", - "Accounts_OAuth_Meteor": "ĐŧĐĩŅ‚ĐĩĐžŅ€ ПŅ€Đ¸Ņ˜Đ°Đ˛Đ°", - "Accounts_OAuth_Meteor_id": "ĐŧĐĩŅ‚ĐĩĐžŅ€ ИД", - "Accounts_OAuth_Meteor_secret": "ĐŧĐĩŅ‚ĐĩĐžŅ€ ĐĸĐ°Ņ˜ĐŊĐ°", "Accounts_OAuth_Nextcloud_secret": "ĐĸĐ°Ņ˜ĐŊĐ° ĐēĐģиŅ˜ĐĩĐŊŅ‚Đ°", - "Accounts_OAuth_Proxy_host": "ПŅ€ĐžĐēи ĐĨĐžŅŅ‚", - "Accounts_OAuth_Tokenpass_callback_url": "ĐĸĐžĐēĐĩĐŊĐŋĐ°ŅŅ ĐĻĐ°ĐģĐģйаŅ†Đē ĐŖРЛ", - "Accounts_OAuth_Tokenpass_secret": "ĐĸĐžĐēĐĩĐŊĐŋĐ°ŅŅ ĐĄĐĩŅ†Ņ€ĐĩŅ‚", - "Accounts_OAuth_Twitter": "Ņ‚виŅ‚Ņ‚ĐĩŅ€ ПŅ€Đ¸Ņ˜Đ°Đ˛Đ°", - "Accounts_OAuth_Twitter_callback_url": "ĐĸвиŅ‚Ņ‚ĐĩŅ€ ĐŖРЛ Са ĐŋОвŅ€Đ°Ņ‚ĐŊи ĐŋОСив", - "Accounts_OAuth_Twitter_id": "ĐĸвиŅ‚Ņ‚ĐĩŅ€ БŅ€ĐžŅ˜", - "Accounts_OAuth_Twitter_secret": "Ņ‚виŅ‚Ņ‚ĐĩŅ€ ĐĸĐ°Ņ˜ĐŊĐ°", - "Accounts_OAuth_Wordpress": "ĐŖĐžŅ€Đ´ĐŸŅ€ĐĩŅŅ ПŅ€Đ¸Ņ˜Đ°Đ˛Đ°", + "Accounts_OAuth_Proxy_host": "ПŅ€ĐžĐēŅĐ¸ Ņ…ĐžŅŅ‚", "Accounts_OAuth_Wordpress_authorize_path": "ПŅƒŅ‚Đ°ŅšĐ° Đ´Đž Đ°ŅƒŅ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Ņ˜Đĩ", - "Accounts_OAuth_Wordpress_callback_url": "ВоŅ€Đ´ĐŋŅ€ĐĩŅŅ ĐŖРЛ Са ĐŋОвŅ€Đ°Ņ‚ĐŊи ĐŋОСив", "Accounts_OAuth_Wordpress_identity_path": "ПŅƒŅ‚Đ°ŅšĐ° Đ´Đž идĐĩĐŊŅ‚иŅ‚ĐĩŅ‚Đ°", "Accounts_OAuth_Wordpress_scope": "ОĐŋŅĐĩĐŗ", - "Accounts_OAuth_Wordpress_secret": "ĐŖĐžŅ€Đ´ĐŸŅ€ĐĩŅŅ ĐĸĐ°Ņ˜ĐŊĐ°", "Accounts_OAuth_Wordpress_server_type_custom": "ПŅ€Đ¸ĐģĐ°ĐŗĐžŅ’ĐĩĐŊĐž", "Accounts_OAuth_Wordpress_server_type_wordpress_com": "Wordpress.com", "Accounts_OAuth_Wordpress_token_path": "ПŅƒŅ‚Đ°ŅšĐ° Đ´Đž Ņ‚ĐžĐēĐĩĐŊĐ°", "Accounts_Password_Policy_AtLeastOneLowercase": "НаŅ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´ĐŊĐž ĐŧĐ°ĐģĐž ŅĐģОвО", - "Accounts_Password_Policy_AtLeastOneLowercase_Description": "ПŅ€Đ¸ĐŧĐžŅ€Đ°Đ˛Đ° Đ´Đ° ĐģОСиĐŊĐēĐ° ŅĐ°Đ´Ņ€Đļи ĐŊĐ°Ņ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´ĐŊĐž ĐŧĐ°ĐģĐž ŅĐģОвО.", + "Accounts_Password_Policy_AtLeastOneLowercase_Description": "ЗаŅ…Ņ‚Đĩва Đ´Đ° ĐģОСиĐŊĐēĐ° ŅĐ°Đ´Ņ€Đļи ĐŊĐ°Ņ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´ĐŊĐž ĐŧĐ°ĐģĐž ŅĐģОвО.", "Accounts_Password_Policy_AtLeastOneNumber": "НаŅ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´Đ°ĐŊ ĐąŅ€ĐžŅ˜", - "Accounts_Password_Policy_AtLeastOneNumber_Description": "ПŅ€Đ¸ĐŧĐžŅ€Đ°Đ˛Đ° Đ´Đ° ĐģОСиĐŊĐēĐ° ŅĐ°Đ´Ņ€Đļи ĐŊĐ°Ņ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´Đ°ĐŊ ĐŊŅƒĐŧĐĩŅ€Đ¸Ņ‡Đēи СĐŊĐ°Đē.", + "Accounts_Password_Policy_AtLeastOneNumber_Description": "ЗаŅ…Ņ‚Đĩва Đ´Đ° ĐģОСиĐŊĐēĐ° ŅĐ°Đ´Ņ€Đļи ĐŊĐ°Ņ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´Đ°ĐŊ ĐŊŅƒĐŧĐĩŅ€Đ¸Ņ‡Đēи СĐŊĐ°Đē.", "Accounts_Password_Policy_AtLeastOneSpecialCharacter": "НаŅ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´Đ°ĐŊ ŅĐ¸ĐŧйОĐģ", - "Accounts_Password_Policy_AtLeastOneSpecialCharacter_Description": "ПŅ€Đ¸ĐŧĐžŅ€Đ°Đ˛Đ° Đ´Đ° ĐģОСиĐŊĐēĐ° ŅĐ°Đ´Ņ€Đļи йаŅ€ Ņ˜ĐĩĐ´Đ°ĐŊ ĐŋĐžŅĐĩйаĐŊ ĐēĐ°Ņ€Đ°ĐēŅ‚ĐĩŅ€.", + "Accounts_Password_Policy_AtLeastOneSpecialCharacter_Description": "ЗаŅ…Ņ‚Đĩва Đ´Đ° ĐģОСиĐŊĐēĐ° ŅĐ°Đ´Ņ€Đļи йаŅ€ Ņ˜ĐĩĐ´Đ°ĐŊ ĐŋĐžŅĐĩйаĐŊ ĐēĐ°Ņ€Đ°ĐēŅ‚ĐĩŅ€.", "Accounts_Password_Policy_AtLeastOneUppercase": "НаŅ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´ĐŊĐž вĐĩĐģиĐēĐž ŅĐģОвО", - "Accounts_Password_Policy_AtLeastOneUppercase_Description": "ПŅ€Đ¸ĐŧĐžŅ€Đ°Đ˛Đ° Đ´Đ° ĐģОСиĐŊĐēĐ° ŅĐ°Đ´Ņ€Đļи ĐŊĐ°Ņ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´ĐŊĐž ĐŧĐ°ĐģĐž ŅĐģОвО.", + "Accounts_Password_Policy_AtLeastOneUppercase_Description": "ЗаŅ…Ņ‚Đĩва Đ´Đ° ĐģОСиĐŊĐēĐ° ŅĐ°Đ´Ņ€Đļи ĐŊĐ°Ņ˜ĐŧĐ°ŅšĐĩ Ņ˜ĐĩĐ´ĐŊĐž ĐŧĐ°ĐģĐž ŅĐģОвО.", "Accounts_Password_Policy_Enabled": "ОĐŧĐžĐŗŅƒŅ›Đ¸ ŅĐŧĐĩŅ€ĐŊиŅ†Ņƒ Са ĐģОСиĐŊĐēŅƒ", "Accounts_Password_Policy_Enabled_Description": "Када Ņ˜Đĩ ĐžĐŧĐžĐŗŅƒŅ›ĐĩĐŊĐž, ĐēĐžŅ€Đ¸ŅĐŊиŅ‡ĐēĐĩ ĐģОСиĐŊĐēĐĩ ĐŧĐžŅ€Đ°Ņ˜Ņƒ Đ´Đ° ŅĐĩ ĐŋŅ€Đ¸Đ´Ņ€ĐļаваŅ˜Ņƒ ĐŋĐžŅŅ‚авŅ™ĐĩĐŊиŅ… ŅĐŧĐĩŅ€ĐŊиŅ†Đ°. НаĐŋĐžĐŧĐĩĐŊĐ°: ОвО ŅĐĩ ОдĐŊĐžŅĐ¸ ŅĐ°ĐŧĐž ĐŊĐ° ĐŊОвĐĩ ĐģОСиĐŊĐēĐĩ, Đ° ĐŊĐĩ ĐŋĐžŅŅ‚ĐžŅ˜ĐĩŅ›Đĩ ĐģОСиĐŊĐēĐĩ.", "Accounts_Password_Policy_ForbidRepeatingCharacters": "ЗабŅ€Đ°ĐŊиŅ‚и ĐŋĐžĐŊавŅ™Đ°Ņ˜ŅƒŅ›Đĩ ĐēĐ°Ņ€Đ°ĐēŅ‚ĐĩŅ€Đĩ", @@ -130,20 +107,23 @@ "Accounts_Password_Policy_MinLength": "МиĐŊиĐŧĐ°ĐģĐŊĐ° Đ´ŅƒĐļиĐŊĐ°", "Accounts_Password_Policy_MinLength_Description": "ОŅĐ¸ĐŗŅƒŅ€Đ°Đ˛Đ° Đ´Đ° ĐģОСиĐŊĐēĐĩ ĐŧĐžŅ€Đ°Ņ˜Ņƒ иĐŧĐ°Ņ‚и йаŅ€ ОвŅƒ ĐēĐžĐģиŅ‡Đ¸ĐŊŅƒ СĐŊĐ°ĐēОва. КоŅ€Đ¸ŅŅ‚иŅ‚Đĩ `-1` Đ´Đ° йиŅŅ‚Đĩ ĐžĐŊĐĩĐŧĐžĐŗŅƒŅ›Đ¸Đģи.", "Accounts_PasswordReset": "Đ ĐĩŅĐĩŅ‚ОваŅšĐĩ ĐģОСиĐŊĐēĐĩ", - "Accounts_Registration_AuthenticationServices_Default_Roles": "ĐŖОйиŅ‡Đ°Ņ˜ĐĩĐŊĐĩ ŅƒĐģĐžĐŗĐĩ Са ŅƒŅĐģŅƒĐŗĐĩ ĐŋŅ€ĐžĐ˛Ņ˜ĐĩŅ€Đĩ Đ°ŅƒŅ‚ĐĩĐŊŅ‚иŅ‡ĐŊĐžŅŅ‚и", + "Accounts_Registration_AuthenticationServices_Default_Roles": "ĐŖОйиŅ‡Đ°Ņ˜ĐĩĐŊĐĩ ŅƒĐģĐžĐŗĐĩ Са ŅƒŅĐģŅƒĐŗĐĩ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đĩ Đ°ŅƒŅ‚ĐĩĐŊŅ‚иŅ‡ĐŊĐžŅŅ‚и", "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "ПодŅ€Đ°ĐˇŅƒĐŧĐĩваĐŊи ĐēĐžŅ€Đ¸ŅĐŊиŅ†Đ¸ ŅƒĐģĐžĐŗĐ° (ОдвОŅ˜ĐĩĐŊи ŅĐ° СаŅ€ĐĩСОĐŧ) Ņ›Đĩ йиŅ‚и Đ´Đ°Ņ‚и ĐēĐ°Đ´Đ° ŅĐĩ Ņ€ĐĩĐŗиŅŅ‚Ņ€ŅƒŅ˜Ņƒ ĐŋŅ€ĐĩĐēĐž ŅƒŅĐģŅƒĐŗĐ° Са ĐŋĐžŅ‚вŅ€Ņ’иваŅšĐĩ идĐĩĐŊŅ‚иŅ‚ĐĩŅ‚Đ°", "Accounts_Registration_AuthenticationServices_Enabled": "Đ ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Đ° ĐŋŅƒŅ‚ĐĩĐŧ ŅĐĩŅ€Đ˛Đ¸ŅĐ° Са Đ°ŅƒŅ‚ĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ†Đ¸Ņ˜Ņƒ", + "Accounts_Registration_InviteUrlType_Direct": "ДиŅ€ĐĩĐēŅ‚Đ°ĐŊ", + "Accounts_Registration_InviteUrlType_Proxy": "ПŅ€ĐžĐēŅĐ¸", "Accounts_RegistrationForm": "ОбŅ€Đ°ĐˇĐ°Ņ† Са Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Ņƒ", "Accounts_RegistrationForm_Disabled": "ОĐŊĐĩĐŧĐžĐŗŅƒŅ›ĐĩĐŊ", - "Accounts_RegistrationForm_LinkReplacementText": "ОбŅ€Đ°ĐˇĐ°Ņ† Са Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Ņƒ ЛиĐŊĐē ЗаĐŧĐĩĐŊĐ° ĐĸĐĩĐēŅŅ‚", "Accounts_RegistrationForm_Public": "ЈавĐŊи", "Accounts_RegistrationForm_Secret_URL": "ĐĸĐ°Ņ˜ĐŊĐ° ĐŖРЛ Đ°Đ´Ņ€ĐĩŅĐ°", "Accounts_RegistrationForm_SecretURL": "ĐĸĐ°Ņ˜ĐŊĐ° ĐŖРЛ Đ°Đ´Ņ€ĐĩŅĐ° ОйŅ€Đ°ŅŅ†Đ° Са Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Ņƒ", - "Accounts_RegistrationForm_SecretURL_Description": "МоŅ€Đ°Ņ‚Đĩ ОйĐĩСйĐĩдиŅ‚и ŅĐģŅƒŅ‡Đ°Ņ˜ĐŊи ĐŊиС ĐēĐžŅ˜Đ¸ Ņ›Đĩ йиŅ‚и дОдаŅ‚ ĐŊĐ° ваŅˆ Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Đĩ ĐŖРЛ. ПŅ€Đ¸ĐŧĐĩŅ€: Ņ…Ņ‚Ņ‚ĐŋŅ://Đ´ĐĩĐŧĐž.Ņ€ĐžŅ†ĐēĐĩŅ‚.Ņ†Ņ…Đ°Ņ‚/Ņ€ĐĩĐŗиŅŅ‚ĐĩŅ€/[secret_hash]", + "Accounts_RegistrationForm_SecretURL_Description": "МоŅ€Đ°Ņ‚Đĩ ОйĐĩСйĐĩдиŅ‚и ŅĐģŅƒŅ‡Đ°Ņ˜ĐŊи ĐŊиС ĐēĐžŅ˜Đ¸ Ņ›Đĩ йиŅ‚и дОдаŅ‚ ĐŊĐ° ваŅˆ ĐŖРЛ Са Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Ņƒ. ПŅ€Đ¸ĐŧĐĩŅ€: `https://open.rocket.chat/register/[secret_hash]`", "Accounts_RequireNameForSignUp": "ЗаŅ…Ņ‚Đĩва иĐŧĐĩ Са Ņ€ĐĩĐŗиŅŅ‚Ņ€Đ°Ņ†Đ¸Ņ˜Ņƒ", "Accounts_RequirePasswordConfirmation": "ЗаŅ…Ņ‚ĐĩваŅ˜ ĐŋĐžŅ‚вŅ€Đ´Ņƒ ĐģОСиĐŊĐēĐĩ", - "Accounts_SearchFields": "ПоŅ™Đ° Са Ņ€Đ°ĐˇĐŧиŅˆŅ™Đ°ŅšĐĩ Ņƒ ĐŋĐžŅ‚Ņ€Đ°ĐˇĐ¸", - "Accounts_SetDefaultAvatar": "ПодĐĩŅĐ¸ ĐŋОдŅ€Đ°ĐˇŅƒĐŧĐĩваĐŊи АваŅ‚Đ°Ņ€", + "Accounts_SearchFields": "ПоŅ™Đ° Са Ņ€Đ°ĐˇĐŧĐ°Ņ‚Ņ€Đ°ŅšĐĩ Ņƒ ĐŋĐžŅ‚Ņ€Đ°ĐˇĐ¸", + "Accounts_Send_Email_When_Activating": "ПоŅˆĐ°Ņ™Đ¸ иĐŧĐĩŅ˜Đģ ĐēĐžŅ€Đ¸ŅĐŊиĐēŅƒ ĐēĐ°Đ´Đ° Ņ˜Đĩ ĐēĐžŅ€Đ¸ŅĐŊиĐē Đ°ĐēŅ‚ивиŅ€Đ°ĐŊ", + "Accounts_Send_Email_When_Deactivating": "ПоŅˆĐ°Ņ™Đ¸ иĐŧĐĩŅ˜Đģ ĐēĐžŅ€Đ¸ŅĐŊиĐēŅƒ ĐēĐ°Đ´Đ° Ņ˜Đĩ ĐēĐžŅ€Đ¸ŅĐŊиĐē Đ´ĐĩĐ°ĐēŅ‚ивиŅ€Đ°ĐŊ", + "Accounts_SetDefaultAvatar": "ПодĐĩŅĐ¸ ĐŋОдŅ€Đ°ĐˇŅƒĐŧĐĩваĐŊи аваŅ‚Đ°Ņ€", "Accounts_SetDefaultAvatar_Description": "ПоĐēŅƒŅˆĐ°Đ˛Đ° Đ´Đ° ОдŅ€Đĩди ĐŋОдŅ€Đ°ĐˇŅƒĐŧĐĩваĐŊи аваŅ‚Đ°Ņ€ ĐŊĐ° ĐžŅĐŊОвŅƒ ОАŅƒŅ‚Ņ… ĐŊĐ°ĐģĐžĐŗĐ° иĐģи ГŅ€Đ°Đ˛Đ°Ņ‚Đ°Ņ€", "Accounts_ShowFormLogin": "ПŅ€Đ¸ĐēĐ°Đļи ĐŋŅ€ĐĩĐ´ĐĩŅ„иĐŊиŅĐ°ĐŊи ОйŅ€Đ°ĐˇĐ°Ņ† ĐŋŅ€Đ¸Ņ˜Đ°Đ˛Đĩ", "Accounts_TwoFactorAuthentication_Enabled": "ОĐŧĐžĐŗŅƒŅ›Đ¸ двОŅŅ‚Ņ€ŅƒĐēŅƒ вĐĩŅ€Đ¸Ņ„иĐēĐ°Ņ†Đ¸Ņ˜Ņƒ ŅĐ° TOTP", @@ -1893,12 +1873,19 @@ "Retail": "МаĐģĐžĐŋŅ€ĐžĐ´Đ°Ņ˜Đ°", "Retention_setting_changed_successfully": "ПоŅŅ‚авĐēĐ° ĐŋĐžĐģиŅĐĩ Са СадŅ€ĐļаваŅšĐĩ ŅƒŅĐŋĐĩŅˆĐŊĐž ŅĐĩ ĐŋŅ€ĐžĐŧĐĩĐŊиĐģĐ°", "RetentionPolicy": "ПоĐģиŅ‚иĐēĐ° СадŅ€ĐļаваŅšĐ°", + "RetentionPolicy_AppliesToChannels": "ПŅ€Đ¸ĐŧĐĩŅšŅƒŅ˜Đĩ ŅĐĩ ĐŊĐ° ĐēĐ°ĐŊĐ°ĐģĐĩ", + "RetentionPolicy_AppliesToDMs": "ПŅ€Đ¸ĐŧĐĩŅšŅƒŅ˜Đĩ ŅĐĩ ĐŊĐ° диŅ€ĐĩĐēŅ‚ĐŊĐĩ ĐŋĐžŅ€ŅƒĐēĐĩ", + "RetentionPolicy_AppliesToGroups": "ПŅ€Đ¸ĐŧŅ˜ĐĩŅšŅƒŅ˜Đĩ ŅĐĩ ĐŊĐ° ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐĩ ĐŗŅ€ŅƒĐŋĐĩ", "RetentionPolicy_Description": "АŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи иСйŅ€Đ¸ŅˆĐĩ ŅŅ‚Đ°Ņ€Đĩ ĐŋĐžŅ€ŅƒĐēĐĩ ĐŋŅ€ĐĩĐēĐž ваŅˆĐĩĐŗ Đ ĐžŅ†ĐēĐĩŅ‚.ĐĻŅ…Đ°Ņ‚ иĐŊŅŅ‚Đ°ĐŊŅ†Đ°.", "RetentionPolicy_Enabled": "ОĐŧĐžĐŗŅƒŅ›ĐĩĐŊĐž", "RetentionPolicy_ExcludePinned": "ИŅĐēŅ™ŅƒŅ‡Đ¸Ņ‚Đĩ СаĐēĐ°Ņ‡ĐĩĐŊĐĩ ĐŋĐžŅ€ŅƒĐēĐĩ", "RetentionPolicy_FilesOnly": "ИСйŅ€Đ¸ŅˆĐ¸Ņ‚Đĩ ŅĐ°ĐŧĐž Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ", "RetentionPolicy_FilesOnly_Description": "ĐĄĐ°ĐŧĐž Đ´Đ°Ņ‚ĐžŅ‚ĐĩĐēĐĩ Ņ›Đĩ йиŅ‚и иСйŅ€Đ¸ŅĐ°ĐŊĐĩ, ŅĐ°ĐŧĐĩ ĐŋĐžŅ€ŅƒĐēĐĩ Ņ›Đĩ ĐžŅŅ‚Đ°Ņ‚и ĐŊĐ° ĐŧĐĩŅŅ‚Ņƒ.", "RetentionPolicy_MaxAge": "МаĐēŅĐ¸ĐŧĐ°ĐģĐŊĐ° ŅŅ‚Đ°Ņ€ĐžŅŅ‚ ĐŋĐžŅ€ŅƒĐēĐĩ", + "RetentionPolicy_MaxAge_Channels": "МаĐēŅĐ¸ĐŧĐ°ĐģĐŊĐ° ŅŅ‚Đ°Ņ€ĐžŅŅ‚ ĐŋĐžŅ€ŅƒĐēĐĩ Ņƒ ĐēĐ°ĐŊĐ°ĐģиĐŧĐ°", + "RetentionPolicy_MaxAge_Description": "ОбŅ€Đ¸ŅˆĐ¸Ņ‚Đĩ ŅĐ˛Đĩ ĐŋĐžŅ€ŅƒĐēĐĩ ŅŅ‚Đ°Ņ€Đ¸Ņ˜Đĩ Од ОвĐĩ вŅ€ĐĩĐ´ĐŊĐžŅŅ‚и, Ņƒ Đ´Đ°ĐŊиĐŧĐ°", + "RetentionPolicy_MaxAge_DMs": "МаĐēŅĐ¸ĐŧĐ°ĐģĐŊĐ° ŅŅ‚Đ°Ņ€ĐžŅŅ‚ ĐŋĐžŅ€ŅƒĐēĐĩ Ņƒ диŅ€ĐĩĐēŅ‚ĐŊиĐŧ ĐŋĐžŅ€ŅƒĐēĐ°ĐŧĐ°", + "RetentionPolicy_MaxAge_Groups": "МаĐēŅĐ¸ĐŧĐ°ĐģĐŊĐ° ŅŅ‚Đ°Ņ€ĐžŅŅ‚ ĐŋĐžŅ€ŅƒĐēĐĩ Ņƒ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊиĐŧ ĐŗŅ€ŅƒĐŋĐ°ĐŧĐ°", "RetentionPolicy_Precision": "ĐĸиĐŧĐĩŅ€ ПŅ€ĐĩŅ†Đ¸ŅĐ¸ĐžĐŊ", "RetentionPolicy_Precision_Description": "КоĐģиĐēĐž Ņ‡ĐĩŅŅ‚Đž йи Ņ‚Ņ€ĐĩйаĐģĐž Đ´Đ° ŅĐĩ ĐŋĐžĐēŅ€ĐĩĐŊĐĩ Ņ‚иĐŧĐĩŅ€ Са Ņ€ĐĩСаŅšĐĩ. ПоŅŅ‚авŅ™Đ°ŅšĐĩĐŧ ОвĐĩ ĐŊĐ° ĐŋŅ€ĐĩŅ†Đ¸ĐˇĐŊŅƒ вŅ€Đ¸Ņ˜ĐĩĐ´ĐŊĐžŅŅ‚ Ņ‡Đ¸ĐŊи ĐēĐ°ĐŊĐ°ĐģĐĩ ŅĐ° ĐąŅ€ĐˇĐ¸Đŧ вŅ€ĐĩĐŧĐĩĐŊŅĐēиĐŧ СадŅ€ĐļаваŅšĐĩĐŧ йОŅ™Đĩ Ņ„ŅƒĐŊĐēŅ†Đ¸ĐžĐŊиŅ€Đ°Ņ‚и, Đ°Đģи йи ĐŧĐžĐŗĐģĐ° Đ´Đ° ĐēĐžŅˆŅ‚Đ°Ņ˜Ņƒ дОдаŅ‚ĐŊŅƒ ĐŧĐžŅ› ĐŋŅ€ĐžŅ†ĐĩŅĐ¸Ņ€Đ°ŅšĐ° ĐŊĐ° вĐĩĐģиĐēиĐŧ СаŅ˜ĐĩĐ´ĐŊиŅ†Đ°ĐŧĐ°.", "RetentionPolicyRoom_Enabled": "АŅƒŅ‚ĐžĐŧĐ°Ņ‚ŅĐēи ĐŋŅ€ĐĩĐąŅ€Đ¸ŅĐ°Ņ‚и ŅŅ‚Đ°Ņ€Đĩ ĐŋĐžŅ€ŅƒĐēĐĩ", @@ -2566,4 +2553,4 @@ "registration.component.form.sendConfirmationEmail": "ПоŅˆĐ°Ņ™Đ¸ ĐŋĐžŅ‚вŅ€Đ´ĐŊŅƒ ĐŋĐžŅ€ŅƒĐēŅƒ", "Enterprise": "ПŅ€ĐĩĐ´ŅƒĐˇĐĩŅ›Đĩ", "UpgradeToGetMore_engagement-dashboard_Title": "АĐŊĐ°ĐģиŅ‚иĐēĐ°" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/sv.i18n.json b/packages/i18n/src/locales/sv.i18n.json index aafb5a36c9dc..4e436fe6c538 100644 --- a/packages/i18n/src/locales/sv.i18n.json +++ b/packages/i18n/src/locales/sv.i18n.json @@ -4071,6 +4071,9 @@ "RetentionPolicy_Advanced_Precision": "Använd inställningar fÃļr avancerad lagringspolicy", "RetentionPolicy_Advanced_Precision_Cron": "Använd cron fÃļr avancerad lagringspolicy", "RetentionPolicy_Advanced_Precision_Cron_Description": "Hur ofta gallringstimern ska kÃļras anges av uttrycket fÃļr cron-jobb. Om du anger ett mer exakt värde fÃļr den fungerar kanaler med korta lagringstider bättre, men det kan kräva extra bearbetningskraft fÃļr stÃļrre communityn.", + "RetentionPolicy_AppliesToChannels": "Gäller kanaler", + "RetentionPolicy_AppliesToDMs": "Gäller direktmeddelanden", + "RetentionPolicy_AppliesToGroups": "Gäller privata grupper", "RetentionPolicy_Description": "Gallra automatiskt gamla meddelanden Ãļver din Rocket.Chat-instans.", "RetentionPolicy_DoNotPruneDiscussion": "Gallra inte diskussionsmeddelanden", "RetentionPolicy_DoNotPrunePinned": "Gallra inte pinnade meddelanden", @@ -4080,6 +4083,10 @@ "RetentionPolicy_FilesOnly": "Ta bara bort filer", "RetentionPolicy_FilesOnly_Description": "Endast filer kommer att raderas, meddelandena kommer att stanna kvar.", "RetentionPolicy_MaxAge": "Maximal meddelandeÃĨlder", + "RetentionPolicy_MaxAge_Channels": "Maximal meddelandeÃĨlder i kanaler", + "RetentionPolicy_MaxAge_Description": "Gallra alla meddelanden som är äldre än det här värdet, i dagar", + "RetentionPolicy_MaxAge_DMs": "Maximal meddelandeÃĨlder i direktmeddelanden", + "RetentionPolicy_MaxAge_Groups": "Maximal meddelandeÃĨlder i privata grupper", "RetentionPolicy_Precision": "Precision fÃļr timer", "RetentionPolicy_Precision_Description": "Hur ofta timern fÃļr gallring ska kÃļras. Om du ställer in det här pÃĨ ett mer exakt värde fungerar kanaler med snabba timers bättre, men det kan kosta extra processorkraft i stora communities.", "RetentionPolicyRoom_Enabled": "Gallra automatiskt gamla meddelanden", @@ -5747,4 +5754,4 @@ "Theme_Appearence": "Utseende fÃļr tema", "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ta-IN.i18n.json b/packages/i18n/src/locales/ta-IN.i18n.json index 9e37a50bd883..7a2c562d4fff 100644 --- a/packages/i18n/src/locales/ta-IN.i18n.json +++ b/packages/i18n/src/locales/ta-IN.i18n.json @@ -2060,12 +2060,19 @@ "Retail": "āŽšāŽŋāŽ˛ā¯āŽ˛āŽąā¯ˆ", "Retention_setting_changed_successfully": "āŽ¤āŽ•ā¯āŽ•āŽĩā¯ˆāŽĒā¯āŽĒā¯ āŽ•ā¯ŠāŽŗā¯āŽ•ā¯ˆ āŽ…āŽŽā¯ˆāŽĒā¯āŽĒā¯ āŽĩā¯†āŽąā¯āŽąāŽŋāŽ•āŽ°āŽŽāŽžāŽ• āŽŽāŽžāŽąā¯āŽąāŽĒā¯āŽĒāŽŸā¯āŽŸāŽ¤ā¯", "RetentionPolicy": "Retention āŽ•ā¯ŠāŽŗā¯āŽ•ā¯ˆ", + "RetentionPolicy_AppliesToChannels": "āŽšā¯‡āŽŠāŽ˛ā¯āŽ•āŽŗā¯āŽ•ā¯āŽ•ā¯ āŽĒā¯ŠāŽ°ā¯āŽ¨ā¯āŽ¤ā¯āŽŽā¯", + "RetentionPolicy_AppliesToDMs": "āŽ¨ā¯‡āŽ°āŽŸāŽŋ āŽšā¯†āŽ¯ā¯āŽ¤āŽŋāŽ•āŽŗā¯āŽ•ā¯āŽ•ā¯ āŽĒā¯ŠāŽ°ā¯āŽ¨ā¯āŽ¤ā¯āŽŽā¯", + "RetentionPolicy_AppliesToGroups": "āŽ¤āŽŠāŽŋāŽ¯āŽžāŽ°ā¯ āŽ•ā¯āŽ´ā¯āŽ•ā¯āŽ•āŽŗā¯āŽ•ā¯āŽ•ā¯ āŽĒā¯ŠāŽ°ā¯āŽ¨ā¯āŽ¤ā¯āŽŽā¯", "RetentionPolicy_Description": "āŽ‰āŽ™ā¯āŽ•āŽŗā¯ āŽ°āŽžāŽ•ā¯āŽ•ā¯†āŽŸā¯ āŽŽā¯āŽ´ā¯āŽĩāŽ¤ā¯āŽŽā¯ āŽĒāŽ´ā¯ˆāŽ¯ āŽšā¯†āŽ¯ā¯āŽ¤āŽŋāŽ•āŽŗā¯ˆ āŽ¤āŽžāŽŠāŽžāŽ•āŽĩā¯‡ āŽĒā¯āŽ°āŽŸā¯āŽŸā¯āŽ•āŽŋāŽąāŽ¤ā¯.", "RetentionPolicy_Enabled": "āŽ‡āŽ¯āŽ•ā¯āŽ•āŽĒā¯āŽĒāŽŸā¯āŽŸāŽ¤ā¯", "RetentionPolicy_ExcludePinned": "āŽĒāŽŋāŽŠā¯ āŽšā¯†āŽ¯ā¯āŽ¤āŽŋāŽ•āŽŗā¯ˆ āŽĩāŽŋāŽ˛āŽ•ā¯āŽ•āŽĩā¯āŽŽā¯", "RetentionPolicy_FilesOnly": "āŽ•ā¯‹āŽĒā¯āŽĒā¯āŽ•āŽŗā¯ˆ āŽŽāŽŸā¯āŽŸā¯āŽŽā¯ āŽ¨ā¯€āŽ•ā¯āŽ•ā¯", "RetentionPolicy_FilesOnly_Description": "āŽ•ā¯‹āŽĒā¯āŽĒā¯āŽ•āŽŗā¯ āŽŽāŽŸā¯āŽŸā¯āŽŽā¯‡ āŽ¨ā¯€āŽ•ā¯āŽ•āŽĒā¯āŽĒāŽŸā¯āŽŽā¯, āŽšā¯†āŽ¯ā¯āŽ¤āŽŋāŽ•āŽŗā¯āŽŽā¯ āŽ¤āŽ™ā¯āŽ•ā¯āŽ¤āŽ˛ā¯āŽŸāŽŠā¯ āŽ‡āŽ°ā¯āŽ•ā¯āŽ•ā¯āŽŽā¯.", "RetentionPolicy_MaxAge": "āŽ…āŽ¤āŽŋāŽ•āŽĒāŽŸā¯āŽš āŽšā¯†āŽ¯ā¯āŽ¤āŽŋ āŽĩāŽ¯āŽ¤ā¯", + "RetentionPolicy_MaxAge_Channels": "āŽšā¯‡āŽŠāŽ˛ā¯āŽ•āŽŗāŽŋāŽ˛ā¯ āŽ…āŽ¤āŽŋāŽ•āŽĒāŽŸā¯āŽš āŽšā¯†āŽ¯ā¯āŽ¤āŽŋ āŽĩāŽ¯āŽ¤ā¯", + "RetentionPolicy_MaxAge_Description": "āŽ¨āŽžāŽŸā¯āŽ•āŽŗāŽŋāŽ˛ā¯ āŽ‡āŽ¨ā¯āŽ¤ āŽŽāŽ¤āŽŋāŽĒā¯āŽĒā¯ˆ āŽĩāŽŋāŽŸ āŽĒāŽ´ā¯ˆāŽ¯ āŽŽāŽ˛ā¯āŽ˛āŽž āŽšā¯†āŽ¯ā¯āŽ¤āŽŋāŽ•āŽŗā¯ˆāŽ¯ā¯āŽŽā¯ āŽĒā¯āŽ°ā¯ˆāŽ¯ā¯āŽ™ā¯āŽ•āŽŗā¯", + "RetentionPolicy_MaxAge_DMs": "āŽ¨ā¯‡āŽ°āŽŸāŽŋāŽ¯āŽžāŽŠ āŽšā¯†āŽ¯ā¯āŽ¤āŽŋāŽ•āŽŗāŽŋāŽ˛ā¯ āŽ…āŽ¤āŽŋāŽ•āŽĒāŽŸā¯āŽš āŽšā¯†āŽ¯ā¯āŽ¤āŽŋ āŽĩāŽ¯āŽ¤ā¯", + "RetentionPolicy_MaxAge_Groups": "āŽ¤āŽŠāŽŋāŽĒā¯āŽĒāŽŸā¯āŽŸ āŽ•ā¯āŽ´ā¯āŽ•ā¯āŽ•āŽŗāŽŋāŽ˛ā¯ āŽ…āŽ¤āŽŋāŽ•āŽĒāŽŸā¯āŽš āŽšā¯†āŽ¯ā¯āŽ¤āŽŋ āŽĩāŽ¯āŽ¤ā¯", "RetentionPolicy_Precision": "āŽŸā¯ˆāŽŽāŽ°ā¯ āŽ¤ā¯āŽ˛ā¯āŽ˛āŽŋāŽ¯āŽŽā¯", "RetentionPolicy_Precision_Description": "āŽŽāŽĒā¯āŽĒāŽŸāŽŋ āŽ…āŽŸāŽŋāŽ•ā¯āŽ•āŽŸāŽŋ āŽ•āŽŋāŽŗā¯āŽŗā¯āŽ¤āŽ˛ā¯ āŽŸā¯ˆāŽŽāŽ°ā¯ āŽ‡āŽ¯āŽ•ā¯āŽ• āŽĩā¯‡āŽŖā¯āŽŸā¯āŽŽā¯. āŽ‡āŽ¤ā¯ āŽŽāŽŋāŽ•āŽĩā¯āŽŽā¯ āŽ¤ā¯āŽ˛ā¯āŽ˛āŽŋāŽ¯āŽŽāŽžāŽŠ āŽŽāŽ¤āŽŋāŽĒā¯āŽĒā¯ˆ āŽ…āŽŽā¯ˆāŽĒā¯āŽĒāŽ¤āŽŠā¯ āŽŽā¯‚āŽ˛āŽŽā¯ āŽĩā¯‡āŽ•āŽŽāŽžāŽ• āŽ¤āŽ•ā¯āŽ•āŽĩā¯ˆāŽ¤ā¯āŽ¤ā¯āŽ•ā¯āŽ•ā¯ŠāŽŗā¯āŽŗā¯āŽŽā¯ āŽ¨ā¯‡āŽ°āŽ¤ā¯āŽ¤ā¯ˆ āŽ•ā¯ŠāŽŖā¯āŽŸ āŽšā¯‡āŽŠāŽ˛ā¯āŽ•āŽŗā¯ āŽšāŽŋāŽąāŽĒā¯āŽĒāŽžāŽ• āŽšā¯†āŽ¯āŽ˛ā¯āŽĒāŽŸā¯āŽ•āŽŋāŽŠā¯āŽąāŽŠ, āŽ†āŽŠāŽžāŽ˛ā¯ āŽĒā¯†āŽ°āŽŋāŽ¯ āŽšāŽŽā¯‚āŽ•āŽ™ā¯āŽ•āŽŗāŽŋāŽ˛ā¯ āŽ•ā¯‚āŽŸā¯āŽ¤āŽ˛ā¯ āŽšā¯†āŽ¯āŽ˛āŽžāŽ•ā¯āŽ• āŽšāŽ•ā¯āŽ¤āŽŋ āŽšā¯†āŽ˛āŽĩāŽžāŽ•ā¯āŽŽā¯.", "RetentionPolicyRoom_Enabled": "āŽĒāŽ´ā¯ˆāŽ¯ āŽšā¯†āŽ¯ā¯āŽ¤āŽŋāŽ•āŽŗā¯ˆ āŽ¤āŽžāŽŠāŽžāŽ• āŽ•āŽŋāŽŗā¯āŽŗā¯āŽ•āŽŋāŽąā¯‡āŽŠā¯", @@ -2756,4 +2763,4 @@ "registration.component.form.sendConfirmationEmail": "āŽ‰āŽąā¯āŽ¤āŽŋāŽĒā¯āŽĒāŽŸā¯āŽ¤ā¯āŽ¤ā¯āŽŽā¯ āŽŽāŽŋāŽŠā¯āŽŠāŽžā¯āŽšāŽ˛ā¯ āŽ…āŽŠā¯āŽĒā¯āŽĒāŽĩā¯āŽŽā¯", "Enterprise": "āŽ¨āŽŋāŽąā¯āŽĩāŽŠ", "UpgradeToGetMore_engagement-dashboard_Title": "āŽ…āŽŠāŽ˛āŽŋāŽŸā¯āŽŸāŽŋāŽ•ā¯āŽ¸ā¯" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/th-TH.i18n.json b/packages/i18n/src/locales/th-TH.i18n.json index 2f2bb357256d..7d393a3034fb 100644 --- a/packages/i18n/src/locales/th-TH.i18n.json +++ b/packages/i18n/src/locales/th-TH.i18n.json @@ -2053,12 +2053,19 @@ "Retail": "ā¸‚ā¸˛ā¸ĸā¸›ā¸Ĩā¸ĩā¸", "Retention_setting_changed_successfully": "āš€ā¸›ā¸Ĩā¸ĩāšˆā¸ĸā¸™ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸™āš‚ā¸ĸā¸šā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš€ā¸āš‡ā¸šā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸Ēā¸ŗāš€ā¸Ŗāš‡ā¸ˆāšā¸Ĩāš‰ā¸§", "RetentionPolicy": "ā¸™āš‚ā¸ĸā¸šā¸˛ā¸ĸā¸ā¸˛ā¸Ŗāš€ā¸āš‡ā¸šā¸Ŗā¸ąā¸ā¸Šā¸˛", + "RetentionPolicy_AppliesToChannels": "āšƒā¸Šāš‰ā¸ā¸ąā¸šā¸Šāšˆā¸­ā¸‡", + "RetentionPolicy_AppliesToDMs": "āšƒā¸Šāš‰ā¸ā¸ąā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąāš‚ā¸”ā¸ĸā¸•ā¸Ŗā¸‡", + "RetentionPolicy_AppliesToGroups": "āšƒā¸Šāš‰ā¸ā¸ąā¸šā¸ā¸Ĩā¸¸āšˆā¸Ąā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§", "RetentionPolicy_Description": "ā¸Ĩā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸āšˆā¸˛ āš† āšƒā¸™ā¸•ā¸ąā¸§ā¸­ā¸ĸāšˆā¸˛ā¸‡ Rocket.Chat ā¸‚ā¸­ā¸‡ā¸„ā¸¸ā¸“āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", "RetentionPolicy_Enabled": "āš€ā¸›ā¸´ā¸”ā¸ā¸˛ā¸Ŗāšƒā¸Šāš‰ā¸‡ā¸˛ā¸™", "RetentionPolicy_ExcludePinned": "āš„ā¸Ąāšˆā¸Ŗā¸§ā¸Ąā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸•ā¸Ŗā¸ļā¸‡", "RetentionPolicy_FilesOnly": "ā¸Ĩā¸šāš€ā¸‰ā¸žā¸˛ā¸°āš„ā¸Ÿā¸ĨāšŒāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™", "RetentionPolicy_FilesOnly_Description": "ā¸Ŗā¸°ā¸šā¸šā¸ˆā¸°ā¸Ĩā¸šāš€ā¸‰ā¸žā¸˛ā¸°āš„ā¸Ÿā¸ĨāšŒāš€ā¸—āšˆā¸˛ā¸™ā¸ąāš‰ā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸ˆā¸°ā¸­ā¸ĸā¸šāšˆāšƒā¸™ā¸Ēā¸–ā¸˛ā¸™ā¸—ā¸ĩāšˆ", "RetentionPolicy_MaxAge": "ā¸­ā¸˛ā¸ĸā¸¸ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸šā¸‡ā¸Ēā¸¸ā¸”", + "RetentionPolicy_MaxAge_Channels": "ā¸­ā¸˛ā¸ĸā¸¸ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸šā¸‡ā¸Ēā¸¸ā¸”āšƒā¸™ā¸Šāšˆā¸­ā¸‡", + "RetentionPolicy_MaxAge_Description": "ā¸Ĩā¸šā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸—ā¸ąāš‰ā¸‡ā¸Ģā¸Ąā¸”ā¸—ā¸ĩāšˆāš€ā¸āšˆā¸˛ā¸ā¸§āšˆā¸˛ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰āš€ā¸›āš‡ā¸™ā¸§ā¸ąā¸™", + "RetentionPolicy_MaxAge_DMs": "ā¸­ā¸˛ā¸ĸā¸¸ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸šā¸‡ā¸Ēā¸¸ā¸”āšƒā¸™ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąāš‚ā¸”ā¸ĸā¸•ā¸Ŗā¸‡", + "RetentionPolicy_MaxAge_Groups": "ā¸­ā¸˛ā¸ĸā¸¸ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąā¸Ēā¸šā¸‡ā¸Ēā¸¸ā¸”āšƒā¸™ā¸ā¸Ĩā¸¸āšˆā¸Ąā¸Ēāšˆā¸§ā¸™ā¸•ā¸ąā¸§", "RetentionPolicy_Precision": "ā¸ˆā¸ąā¸šāš€ā¸§ā¸Ĩā¸˛āšā¸Ąāšˆā¸™ā¸ĸā¸ŗ", "RetentionPolicy_Precision_Description": "ā¸„ā¸§ā¸Ŗā¸ˆā¸ąā¸šāš€ā¸§ā¸Ĩā¸˛ā¸Ĩā¸šā¸ā¸žā¸Ŗā¸¸ā¸™ā¸šāšˆā¸­ā¸ĸāšā¸„āšˆāš„ā¸Ģā¸™ ā¸ā¸˛ā¸Ŗā¸•ā¸ąāš‰ā¸‡ā¸„āšˆā¸˛ā¸™ā¸ĩāš‰āš€ā¸›āš‡ā¸™ā¸„āšˆā¸˛ā¸—ā¸ĩāšˆāšā¸Ąāšˆā¸™ā¸ĸā¸ŗā¸ĸā¸´āšˆā¸‡ā¸‚ā¸ļāš‰ā¸™ā¸—ā¸ŗāšƒā¸Ģāš‰ā¸Šāšˆā¸­ā¸‡ā¸—ā¸ĩāšˆā¸Ąā¸ĩā¸•ā¸ąā¸§ā¸ˆā¸ąā¸šāš€ā¸§ā¸Ĩā¸˛ā¸ā¸˛ā¸Ŗāš€ā¸āš‡ā¸šā¸Ŗā¸ąā¸ā¸Šā¸˛ā¸­ā¸ĸāšˆā¸˛ā¸‡ā¸Ŗā¸§ā¸”āš€ā¸Ŗāš‡ā¸§ā¸—ā¸ŗā¸‡ā¸˛ā¸™āš„ā¸”āš‰ā¸”ā¸ĩā¸‚ā¸ļāš‰ā¸™ āšā¸•āšˆā¸­ā¸˛ā¸ˆā¸Ąā¸ĩā¸„āšˆā¸˛āšƒā¸Šāš‰ā¸ˆāšˆā¸˛ā¸ĸāš€ā¸žā¸´āšˆā¸Ąā¸‚ā¸ļāš‰ā¸™āšƒā¸™ā¸Šā¸¸ā¸Ąā¸Šā¸™ā¸‚ā¸™ā¸˛ā¸”āšƒā¸Ģā¸āšˆ", "RetentionPolicyRoom_Enabled": "ā¸•ā¸ąā¸”ā¸„āšˆā¸˛ā¸‚āš‰ā¸­ā¸„ā¸§ā¸˛ā¸Ąāš€ā¸āšˆā¸˛āš‚ā¸”ā¸ĸā¸­ā¸ąā¸•āš‚ā¸™ā¸Ąā¸ąā¸•ā¸´", @@ -2742,4 +2749,4 @@ "registration.component.form.sendConfirmationEmail": "ā¸Ēāšˆā¸‡ā¸­ā¸ĩāš€ā¸Ąā¸Ĩā¸ĸā¸ˇā¸™ā¸ĸā¸ąā¸™", "Enterprise": "ā¸­ā¸‡ā¸„āšŒā¸ā¸Ŗ", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/tr.i18n.json b/packages/i18n/src/locales/tr.i18n.json index ce2e75ee13b1..59b0c8927e23 100644 --- a/packages/i18n/src/locales/tr.i18n.json +++ b/packages/i18n/src/locales/tr.i18n.json @@ -2458,12 +2458,19 @@ "Retail": "Perakende", "Retention_setting_changed_successfully": "Saklama politikasÄą ayarÄą başarÄąyla değiştirildi", "RetentionPolicy": "AlÄąkoyma politikasÄą", + "RetentionPolicy_AppliesToChannels": "Kanallara uygulanÄąr", + "RetentionPolicy_AppliesToDMs": "Doğrudan iletilere uygulanÄąr", + "RetentionPolicy_AppliesToGroups": "Özel gruplara uygulanÄąr", "RetentionPolicy_Description": "Eski iletileri otomatik olarak Rocket.Chat Ãļrneğinizde yayÄąnlar.", "RetentionPolicy_Enabled": "Etkin", "RetentionPolicy_ExcludePinned": "Sabitlenmiş iletileri dÄąÅŸÄąnda tut", "RetentionPolicy_FilesOnly": "Sadece dosyalarÄą sil", "RetentionPolicy_FilesOnly_Description": "Sadece dosyalar silinecek, mesajlarÄąn kendisi yerinde kalacaktÄąr.", "RetentionPolicy_MaxAge": "Maksimum ileti yaÅŸÄą", + "RetentionPolicy_MaxAge_Channels": "Kanallarda maksimum ileti yaÅŸÄą", + "RetentionPolicy_MaxAge_Description": "Bu değerde gÃŧnden daha eski olan tÃŧm iletileri buda ", + "RetentionPolicy_MaxAge_DMs": "Doğrudan iletilerde maksimum ileti yaÅŸÄą", + "RetentionPolicy_MaxAge_Groups": "Özel gruplarda maksimum ileti yaÅŸÄą", "RetentionPolicy_Precision": "ZamanlayÄącÄą Hassasiyeti", "RetentionPolicy_Precision_Description": "Budama zamanlayÄącÄą kaç kez çalÄąÅŸtÄąrÄąlmalÄądÄąr. Bunu daha hassas bir değere ayarlamak, hÄązlÄą saklama zamanlayÄącÄąlarÄąna sahip kanallarÄąn daha iyi çalÄąÅŸmasÄąnÄą sağlar, ancak bÃŧyÃŧk topluluklarda ekstra işlem gÃŧcÃŧne mal olabilir.", "RetentionPolicyRoom_Enabled": "Eski iletileri otomatik olarak buda", @@ -3264,4 +3271,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Çoklu Kanal", "Enterprise": "Kuruluş", "UpgradeToGetMore_engagement-dashboard_Title": "MantÄąksal Analiz" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/uk.i18n.json b/packages/i18n/src/locales/uk.i18n.json index 55e9381c12c0..b8e27a4f8c34 100644 --- a/packages/i18n/src/locales/uk.i18n.json +++ b/packages/i18n/src/locales/uk.i18n.json @@ -568,6 +568,7 @@ "CAS_enabled": "ĐŖвŅ–ĐŧĐēĐŊĐĩĐŊĐž", "CAS_Login_Layout": "ĐĄŅ‚иĐģŅŒ вŅ…ОдŅƒ в CAS", "CAS_login_url": "URL-Đ°Đ´Ņ€ĐĩŅĐ° вŅ…ОдŅƒ в SSO", + "message_counter_many": "{{count}} ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊŅŒ", "CAS_login_url_Description": "URL-Đ°Đ´Ņ€ĐĩŅĐ° Đ´ĐģŅ вŅ…ОдŅƒ СОвĐŊŅ–ŅˆĐŊŅŒĐžŅ— ŅĐģŅƒĐļйи SSO, ĐŊĐ°ĐŋŅ€Đ¸ĐēĐģĐ°Đ´: https: //sso.example.undef/sso/login", "CAS_popup_height": "ВиŅĐžŅ‚Đ° виŅ€Đ¸ĐŊĐ°ŅŽŅ‡ĐžĐŗĐž вŅ–ĐēĐŊĐ° вŅ…ОдŅƒ", "CAS_popup_width": "ШиŅ€Đ¸ĐŊĐ° ŅĐŋĐģиваŅŽŅ‡ĐžĐŗĐž вŅ–ĐēĐŊĐ° вŅ…ОдŅƒ", @@ -625,6 +626,7 @@ "clear_history": "ОŅ‡Đ¸ŅŅ‚иŅ‚и Ņ–ŅŅ‚ĐžŅ€Ņ–ŅŽ", "Click_here": "НаŅ‚иŅĐŊŅ–Ņ‚ŅŒ Ņ‚ŅƒŅ‚", "Click_here_for_more_info": "НаŅ‚иŅĐŊŅ–Ņ‚ŅŒ Ņ‚ŅƒŅ‚, Ņ‰ĐžĐą ĐžŅ‚Ņ€Đ¸ĐŧĐ°Ņ‚и дОдаŅ‚ĐēОвŅƒ Ņ–ĐŊŅ„ĐžŅ€ĐŧĐ°Ņ†Ņ–ŅŽ", + "message_counter_few": "{{count}} ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊŅŒ", "Click_here_to_enter_your_encryption_password": "НаŅ‚иŅĐŊŅ–Ņ‚ŅŒ Ņ‚ŅƒŅ‚, Ņ‰ĐžĐą ввĐĩŅŅ‚и ĐŋĐ°Ņ€ĐžĐģŅŒ ŅˆĐ¸Ņ„Ņ€ŅƒĐ˛Đ°ĐŊĐŊŅ", "Click_here_to_view_and_copy_your_password": "НаŅ‚иŅĐŊŅ–Ņ‚ŅŒ Ņ‚ŅƒŅ‚, Ņ‰ĐžĐą ĐŋĐĩŅ€ĐĩĐŗĐģŅĐŊŅƒŅ‚и Ņ‚Đ° ŅĐēĐžĐŋŅ–ŅŽĐ˛Đ°Ņ‚и ŅĐ˛Ņ–Đš ĐŋĐ°Ņ€ĐžĐģŅŒ.", "Click_the_messages_you_would_like_to_send_by_email": "НаŅ‚иŅĐŊŅ–Ņ‚ŅŒ ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ, ŅĐēŅ– ви Ņ…ĐžŅ‡ĐĩŅ‚Đĩ ĐŊĐ°Đ´Ņ–ŅĐģĐ°Ņ‚и ĐĩĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊĐžŅŽ ĐŋĐžŅˆŅ‚ĐžŅŽ", @@ -700,7 +702,6 @@ "Consulting": "КоĐŊŅĐ°ĐģŅ‚иĐŊĐŗ", "Contact": "КоĐŊŅ‚Đ°ĐēŅ‚и", "Contains_Security_Fixes": "МŅ–ŅŅ‚ŅŅ‚ŅŒ виĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐŊŅ ĐąĐĩСĐŋĐĩĐēи", - "message_counter_many": "{{count}} ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊŅŒ", "Content": "ВĐŧŅ–ŅŅ‚", "Continue": "ПŅ€ĐžĐ´ĐžĐ˛ĐļиŅ‚и", "Continuous_sound_notifications_for_new_livechat_room": "ПоŅŅ‚Ņ–ĐšĐŊŅ– СвŅƒĐēОвŅ– ŅĐŋОвŅ–Ņ‰ĐĩĐŊĐŊŅ Đ´ĐģŅ ĐŊОвОŅ— livechat ĐēŅ–ĐŧĐŊĐ°Ņ‚и", @@ -782,7 +783,6 @@ "Country_Denmark": "ДаĐŊŅ–Ņ", "Country_Djibouti": "ДĐļийŅƒŅ‚Ņ–", "Country_Dominica": "ДоĐŧŅ–ĐŊŅ–ĐēĐ°", - "message_counter_few": "{{count}} ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊŅŒ", "Country_Dominican_Republic": "ДоĐŧŅ–ĐŊŅ–ĐēĐ°ĐŊŅŅŒĐēĐ° Ņ€ĐĩŅĐŋŅƒĐąĐģŅ–ĐēĐ°", "Country_Ecuador": "ЕĐēвадОŅ€", "Country_Egypt": "ЄĐŗиĐŋĐĩŅ‚", @@ -2596,12 +2596,19 @@ "Retail": "РОСдŅ€Ņ–ĐąĐŊĐ° Ņ‚ĐžŅ€ĐŗŅ–вĐģŅ", "Retention_setting_changed_successfully": "НаĐģĐ°ŅˆŅ‚ŅƒĐ˛Đ°ĐŊĐŊŅ ĐŋĐžĐģŅ–Ņ‚иĐēи СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ ŅƒŅĐŋŅ–ŅˆĐŊĐž СĐŧŅ–ĐŊĐĩĐŊĐž", "RetentionPolicy": "ПоĐģŅ–Ņ‚иĐēĐ° СйĐĩŅ€ĐĩĐļĐĩĐŊĐŊŅ", + "RetentionPolicy_AppliesToChannels": "ЗаŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž ĐēĐ°ĐŊĐ°ĐģŅ–в", + "RetentionPolicy_AppliesToDMs": "ЗаŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž ĐŋŅ€ŅĐŧиŅ… ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊŅŒ", + "RetentionPolicy_AppliesToGroups": "ЗаŅŅ‚ĐžŅĐžĐ˛ŅƒŅ”Ņ‚ŅŒŅŅ Đ´Đž ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊиŅ… ĐŗŅ€ŅƒĐŋ", "RetentionPolicy_Description": "АвŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐŊĐž ŅĐēĐ°ŅĐžĐ˛ŅƒŅ” ŅŅ‚Đ°Ņ€Ņ– ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ Ņ‡ĐĩŅ€ĐĩС ĐĩĐēСĐĩĐŧĐŋĐģŅŅ€ Rocket.Chat.", "RetentionPolicy_Enabled": "ĐŖвŅ–ĐŧĐēĐŊĐĩĐŊĐž", "RetentionPolicy_ExcludePinned": "ВиĐēĐģŅŽŅ‡Đ¸Ņ‚и СаĐēŅ€Ņ–ĐŋĐģĐĩĐŊŅ– ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ", "RetentionPolicy_FilesOnly": "ВидаĐģŅŅ‚и ĐģиŅˆĐĩ Ņ„Đ°ĐšĐģи", "RetentionPolicy_FilesOnly_Description": "ĐĸŅ–ĐģŅŒĐēи Ņ„Đ°ĐšĐģи ĐąŅƒĐ´ŅƒŅ‚ŅŒ видаĐģĐĩĐŊŅ–, ŅĐ°ĐŧŅ– ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ СаĐģиŅˆĐ¸Ņ‚ŅŒŅŅ ĐŊĐ° ĐŧŅ–ŅŅ†Ņ–.", "RetentionPolicy_MaxAge": "МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊиК вŅ–Đē ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ", + "RetentionPolicy_MaxAge_Channels": "МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊиК вŅ–Đē ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ в ĐēĐ°ĐŊĐ°ĐģĐ°Ņ…", + "RetentionPolicy_MaxAge_Description": "ОбŅ€Ņ–СаŅ‚и вŅŅ– ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ ŅŅ‚Đ°Ņ€ŅˆĐĩ Ņ†ŅŒĐžĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ в Đ´ĐŊŅŅ…", + "RetentionPolicy_MaxAge_DMs": "МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊиК вŅ–Đē ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ в ĐŋŅ€ŅĐŧĐžĐŧŅƒ ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ–", + "RetentionPolicy_MaxAge_Groups": "МаĐēŅĐ¸ĐŧĐ°ĐģŅŒĐŊиК вŅ–Đē ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ в ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊиŅ… ĐŗŅ€ŅƒĐŋĐ°Ņ…", "RetentionPolicy_Precision": "ĐĸĐ°ĐšĐŧĐĩŅ€ Ņ‚ĐžŅ‡ĐŊĐžŅŅ‚Ņ–", "RetentionPolicy_Precision_Description": "Đ¯Đē Ņ‡Đ°ŅŅ‚Đž ŅĐģŅ–Đ´ СаĐŋŅƒŅĐēĐ°Ņ‚и Ņ‚Đ°ĐšĐŧĐĩŅ€ ŅˆĐēŅƒŅ€Đ¸. Đ¯ĐēŅ‰Đž вŅŅ‚Đ°ĐŊОвиŅ‚и Ņ†Đĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ ĐŊĐ° ĐąŅ–ĐģŅŒŅˆ Ņ‚ĐžŅ‡ĐŊĐĩ СĐŊĐ°Ņ‡ĐĩĐŊĐŊŅ, ĐēĐ°ĐŊĐ°Đģи С Ņ‚Đ°ĐšĐŧĐĩŅ€Đ°Đŧи ŅˆĐ˛Đ¸Đ´ĐēĐžĐŗĐž ŅƒŅ‚Ņ€Đ¸ĐŧĐ°ĐŊĐŊŅ ĐŋŅ€Đ°Ņ†ŅŽĐ˛Đ°Ņ‚иĐŧŅƒŅ‚ŅŒ ĐēŅ€Đ°Ņ‰Đĩ, ОдĐŊĐ°Đē вОĐŊи ĐŧĐžĐļŅƒŅ‚ŅŒ ĐŋŅ€Đ¸ĐˇĐ˛ĐĩŅŅ‚и Đ´Đž дОдаŅ‚ĐēОвОŅ— ĐŋĐžŅ‚ŅƒĐļĐŊĐžŅŅ‚Ņ– ОйŅ€ĐžĐąĐēи вĐĩĐģиĐēиŅ… ŅĐŋŅ–ĐģŅŒĐŊĐžŅ‚.", "RetentionPolicyRoom_Enabled": "АвŅ‚ĐžĐŧĐ°Ņ‚иŅ‡ĐŊĐž ОйŅ€Ņ–СаŅ‚и ŅŅ‚Đ°Ņ€Ņ– ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊĐŊŅ", @@ -3351,4 +3358,4 @@ "Enterprise": "ПŅ–Đ´ĐŋŅ€Đ¸Ņ”ĐŧŅŅ‚вО", "UpgradeToGetMore_engagement-dashboard_Title": "АĐŊĐ°ĐģŅ–Ņ‚иĐēĐ°", "UpgradeToGetMore_auditing_Title": "АŅƒĐ´Đ¸Ņ‚ ĐŋОвŅ–Đ´ĐžĐŧĐģĐĩĐŊŅŒ" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/vi-VN.i18n.json b/packages/i18n/src/locales/vi-VN.i18n.json index 2c53f8e3fed7..bf073e9c6aee 100644 --- a/packages/i18n/src/locales/vi-VN.i18n.json +++ b/packages/i18n/src/locales/vi-VN.i18n.json @@ -2160,12 +2160,19 @@ "Retail": "NgÆ°áģi bÃĄn láēģ", "Retention_setting_changed_successfully": "ĐÃŖ thay đáģ•i cài đáēˇt chính sÃĄch lÆ°u giáģ¯ thành công", "RetentionPolicy": "Duy trÃŦ chính sÃĄch", + "RetentionPolicy_AppliesToChannels": "Áp dáģĨng cho kÃĒnh", + "RetentionPolicy_AppliesToDMs": "Áp dáģĨng cho tin nháē¯n tráģąc tiáēŋp", + "RetentionPolicy_AppliesToGroups": "Áp dáģĨng cho nhÃŗm riÃĒng tÆ°", "RetentionPolicy_Description": "Táģą đáģ™ng prunes tin nháē¯n cÅŠ trÃĒn trÆ°áģng háģŖp Rocket.Chat cáģ§a báēĄn.", "RetentionPolicy_Enabled": "ĐÃŖ báē­t", "RetentionPolicy_ExcludePinned": "LoáēĄi tráģĢ cÃĄc thÆ° đÃŖ ghim", "RetentionPolicy_FilesOnly": "Cháģ‰ xÃŗa táģ‡p", "RetentionPolicy_FilesOnly_Description": "Cháģ‰ cÃĄc táģ‡p sáēŊ báģ‹ xÃŗa, báēŖn thÃĸn thÆ° sáēŊ váēĢn đưáģŖc giáģ¯ nguyÃĒn.", "RetentionPolicy_MaxAge": "Đáģ™ tuáģ•i tin nháē¯n táģ‘i đa", + "RetentionPolicy_MaxAge_Channels": "Đáģ™ tuáģ•i tin nháē¯n táģ‘i đa trong cÃĄc kÃĒnh", + "RetentionPolicy_MaxAge_Description": "Cáē¯t báģ›t táēĨt cáēŖ cÃĄc thÆ° cÅŠ hÆĄn giÃĄ tráģ‹ này, trong ngày", + "RetentionPolicy_MaxAge_DMs": "Đáģ™ tuáģ•i tin nháē¯n táģ‘i đa trong cÃĄc tin nháē¯n tráģąc tiáēŋp", + "RetentionPolicy_MaxAge_Groups": "Đáģ™ tuáģ•i tin nháē¯n táģ‘i đa trong cÃĄc nhÃŗm riÃĒng tÆ°", "RetentionPolicy_Precision": "Háēšn giáģ chính xÃĄc", "RetentionPolicy_Precision_Description": "Táē§n suáēĨt báģ™ đáēŋm tháģi gian prune sáēŊ cháēĄy. Đáēˇt giÃĄ tráģ‹ này thành giÃĄ tráģ‹ chính xÃĄc hÆĄn giÃēp kÃĒnh cÃŗ báģ™ háēšn giáģ lÆ°u tráģ¯ nhanh hoáēĄt đáģ™ng táģ‘t hÆĄn, nhÆ°ng cÃŗ tháģƒ táģ‘n thÃĒm sáģŠc máēĄnh xáģ­ lÃŊ trÃĒn cÃĄc cáģ™ng đáģ“ng láģ›n.", "RetentionPolicyRoom_Enabled": "Táģą đáģ™ng cáē¯t báģ›t cÃĄc tin nháē¯n cÅŠ", @@ -2853,4 +2860,4 @@ "registration.component.form.sendConfirmationEmail": "Gáģ­i email xÃĄc nháē­n", "Enterprise": "Doanh nghiáģ‡p", "UpgradeToGetMore_engagement-dashboard_Title": "phÃĸn tích" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/zh-HK.i18n.json b/packages/i18n/src/locales/zh-HK.i18n.json index bd9fd451a2a5..e9821173dc0c 100644 --- a/packages/i18n/src/locales/zh-HK.i18n.json +++ b/packages/i18n/src/locales/zh-HK.i18n.json @@ -2084,15 +2084,21 @@ "Retail": "é›ļ唎", "Retention_setting_changed_successfully": "äŋį•™į­–į•Ĩ莞įŊŽåˇ˛æˆåŠŸæ›´æ”š", "RetentionPolicy": "äŋį•™æ”ŋį­–", + "RetentionPolicy_AppliesToChannels": "适į”¨äēŽéĸ‘道", + "RetentionPolicy_AppliesToDMs": "适į”¨äēŽį›´æŽĨæļˆæ¯", + "RetentionPolicy_AppliesToGroups": "适į”¨äēŽį§äēēå›ĸäŊ“", "RetentionPolicy_Description": "č‡Ē动äŋŽå‰ĒRocket.Chat厞䞋中įš„æ—§æļˆæ¯ã€‚", "RetentionPolicy_Enabled": "启į”¨", "RetentionPolicy_ExcludePinned": "排除å›ē厚æļˆæ¯", "RetentionPolicy_FilesOnly": "åĒ删除文äģļ", "RetentionPolicy_FilesOnly_Description": "åĒ删除文äģļīŧŒé‚ŽäģļæœŦčēĢ将äŋį•™åœ¨åŽŸäŊã€‚", "RetentionPolicy_MaxAge": "最大邎äģļåš´éž„", + "RetentionPolicy_MaxAge_Channels": "éĸ‘道中įš„最大æļˆæ¯æ—ļ限", + "RetentionPolicy_MaxAge_Description": "äŋŽå‰Ē所有旊äēŽæ­¤å€ŧįš„é‚ŽäģļīŧŒäģĨ夊ä¸ē单äŊ", + "RetentionPolicy_MaxAge_DMs": "į›´æŽĨæļˆæ¯ä¸­įš„最大æļˆæ¯æ—ļ间", + "RetentionPolicy_MaxAge_Groups": "į§äēēįģ„中įš„最é•ŋ邮äģļåš´éž„", "RetentionPolicy_Precision": "厚æ—ļį˛žåēĻ", "RetentionPolicy_Precision_Description": "äŋŽå‰Ē莥æ—ļ器åē”č¯Ĩ多䚅čŋčĄŒä¸€æŦĄã€‚å°†æ­¤čŽžįŊŽä¸ē更į˛žįĄŽįš„å€ŧäŧšäŊŋå…ˇæœ‰åŋĢ速äŋį•™čŽĄæ—ļ器įš„通道更åĨŊ地åˇĨäŊœīŧŒäŊ†å¯čƒŊäŧšå¯šå¤§åž‹į¤žåŒē造成éĸå¤–įš„处į†čƒŊ力。", - "RetentionPolicyRoom_Enabled": "č‡Ē动äŋŽå‰Ē旧邎äģļ", "RetentionPolicyRoom_ExcludePinned": "排除å›ē厚æļˆæ¯", "RetentionPolicyRoom_FilesOnly": "äģ…äŋŽå‰Ē文äģļīŧŒäŋį•™æļˆæ¯", @@ -2778,4 +2784,4 @@ "registration.component.form.sendConfirmationEmail": "åˇ˛å‘é€įĄŽčŽ¤į”ĩ子邎äģļ", "Enterprise": "äŧä¸š", "UpgradeToGetMore_engagement-dashboard_Title": "分析" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/zh-TW.i18n.json b/packages/i18n/src/locales/zh-TW.i18n.json index cc9ec4dae7d4..741132996be6 100644 --- a/packages/i18n/src/locales/zh-TW.i18n.json +++ b/packages/i18n/src/locales/zh-TW.i18n.json @@ -3413,6 +3413,9 @@ "RetentionPolicy_Advanced_Precision": "äŊŋį”¨é€˛éšŽäŋį•™į­–į•Ĩ設įŊŽ", "RetentionPolicy_Advanced_Precision_Cron": "äŊŋį”¨é€˛éšŽäŋį•™æ”ŋį­–č¨ˆåŠƒ", "RetentionPolicy_Advanced_Precision_Cron_Description": "cron åˇĨäŊœčĄ¨į¤ēæŗ•åŽšįžŠäē†äŋŽå‰Ēč¨ˆæ™‚å™¨æ‡‰åŸˇčĄŒįš„é ģįŽ‡ã€‚將此å€ŧ設įŊŽį‚ē更į˛žįĸēįš„å€ŧ可äŊŋå…ˇæœ‰åŋĢ速äŋį•™č¨ˆæ™‚器įš„é ģ道做įš„æ›´åĨŊīŧŒäŊ†å¯čƒŊ會įĩĻ大型į¤žįž¤å¸ļ䞆更重įš„處į†čƒŊ力。", + "RetentionPolicy_AppliesToChannels": "遊į”¨æ–ŧé ģ道", + "RetentionPolicy_AppliesToDMs": "遊į”¨æ–ŧį›´æŽĨæļˆæ¯", + "RetentionPolicy_AppliesToGroups": "遊į”¨æ–ŧį§äēē團éĢ”", "RetentionPolicy_Description": "č‡Ē動äŋŽå‰ĒRocket.Chatå¯Ļ例中įš„čˆŠæļˆæ¯ã€‚", "RetentionPolicy_DoNotPruneDiscussion": "不äŋŽå‰ĒčĢ–åŖ‡č¨Šæ¯", "RetentionPolicy_DoNotPrunePinned": "不äŋŽå‰Ē釘選įš„č¨Šæ¯", @@ -3422,6 +3425,10 @@ "RetentionPolicy_FilesOnly": "åĒåˆĒ除æĒ”æĄˆ", "RetentionPolicy_FilesOnly_Description": "åĒåˆĒ除æĒ”æĄˆīŧŒéƒĩäģļæœŦčēĢ將äŋį•™åœ¨åŽŸäŊã€‚", "RetentionPolicy_MaxAge": "最大éƒĩäģļåš´éŊĄ", + "RetentionPolicy_MaxAge_Channels": "é ģ道中įš„æœ€å¤§č¨Šæ¯æ™‚é™", + "RetentionPolicy_MaxAge_Description": "äŋŽå‰Ē所有旊æ–ŧæ­¤å€ŧįš„éƒĩäģļīŧŒäģĨ夊į‚ēå–ŽäŊ", + "RetentionPolicy_MaxAge_DMs": "į›´æŽĨč¨Šæ¯ä¸­įš„æœ€å¤§č¨Šæ¯æ™‚é–“", + "RetentionPolicy_MaxAge_Groups": "į§äēēįž¤įĩ„中įš„æœ€é•ˇč¨Šæ¯åš´éŊĄ", "RetentionPolicy_Precision": "厚時į˛žåēĻ", "RetentionPolicy_Precision_Description": "äŋŽå‰Ēč¨ˆæ™‚å™¨æ‡‰čŠ˛å¤šäš…é‹čĄŒä¸€æŦĄã€‚å°‡æ­¤č¨­įŊŽį‚ē更į˛žįĸēįš„å€ŧ會äŊŋå…ˇæœ‰åŋĢ速äŋį•™č¨ˆæ™‚器įš„通道更åĨŊ地åˇĨäŊœīŧŒäŊ†å¯čƒŊ會對大型į¤žå€é€ æˆéĄå¤–įš„處į†čƒŊ力。", "RetentionPolicyRoom_Enabled": "č‡Ē動äŋŽå‰Ē舊éƒĩäģļ", @@ -4578,4 +4585,4 @@ "Enterprise": "äŧæĨ­", "UpgradeToGetMore_engagement-dashboard_Title": "分析", "UpgradeToGetMore_auditing_Title": "č¨Šæ¯į¨Ŋæ ¸" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/zh.i18n.json b/packages/i18n/src/locales/zh.i18n.json index 75568dd3c5d8..323da5954332 100644 --- a/packages/i18n/src/locales/zh.i18n.json +++ b/packages/i18n/src/locales/zh.i18n.json @@ -3097,6 +3097,9 @@ "RetentionPolicy_Advanced_Precision": "äŊŋį”¨éĢ˜įē§äŋį•™į­–į•Ĩ配įŊŽ", "RetentionPolicy_Advanced_Precision_Cron": "äŊŋį”¨éĢ˜įē§äŋį•™į­–į•ĨäģģåŠĄčŽĄåˆ’", "RetentionPolicy_Advanced_Precision_Cron_Description": "äŊŋį”¨ cron äģģåŠĄčĄ¨čžžåŧåŽšäš‰äŋŽå‰Ē厚æ—ļ器čŋčĄŒéĸ‘åēĻīŧŒå°†æ­¤čŽžįŊŽä¸ē更į˛žįĄŽįš„å€ŧäŧšäŊŋå…ˇæœ‰åŋĢ速äŋį•™čŽĄæ—ļ器įš„éĸ‘道更åĨŊ地åˇĨäŊœīŧŒäŊ†å¯šå¤§åž‹į¤žåŒē可čƒŊäŧšæļˆč€—éĸå¤–įš„处į†čƒŊ力。", + "RetentionPolicy_AppliesToChannels": "适į”¨äēŽéĸ‘道", + "RetentionPolicy_AppliesToDMs": "适į”¨äēŽį§čŠæļˆæ¯", + "RetentionPolicy_AppliesToGroups": "适į”¨äēŽį§äēēįģ„", "RetentionPolicy_Description": "č‡Ē动äŋŽå‰Ē Rocket.Chat 厞䞋中įš„æ—§æļˆæ¯ã€‚", "RetentionPolicy_DoNotPruneDiscussion": "不äŋŽå‰Ē莨čŽēæļˆæ¯", "RetentionPolicy_DoNotPrunePinned": "不äŋŽå‰Ēåˇ˛å›ē厚įš„æļˆæ¯", @@ -3106,6 +3109,10 @@ "RetentionPolicy_FilesOnly": "åĒ删除文äģļ", "RetentionPolicy_FilesOnly_Description": "åĒ有文äģļäŧščĸĢ删除īŧŒæļˆæ¯æœŦčēĢ将äŋį•™åœ¨åŽŸäŊã€‚", "RetentionPolicy_MaxAge": "æļˆæ¯äŋæŒæ—ļ限", + "RetentionPolicy_MaxAge_Channels": "éĸ‘道中įš„æļˆæ¯äŋæŒæ—ļ限", + "RetentionPolicy_MaxAge_Description": "äŋŽå‰Ē所有旊äēŽæ­¤å€ŧįš„æļˆæ¯īŧŒäģĨ夊ä¸ē单äŊ", + "RetentionPolicy_MaxAge_DMs": "į§čŠæļˆæ¯æœ€å¤§åš´éž„", + "RetentionPolicy_MaxAge_Groups": "į§äēēįģ„中įš„æļˆæ¯æœ€å¤§åš´éž„", "RetentionPolicy_Precision": "厚æ—ļį˛žåēĻ", "RetentionPolicy_Precision_Description": "äŋŽå‰Ē莥æ—ļ器åē”č¯Ĩ多䚅čŋčĄŒä¸€æŦĄã€‚å°†æ­¤čŽžįŊŽä¸ē更į˛žįĄŽįš„å€ŧäŧšäŊŋå…ˇæœ‰åŋĢ速äŋį•™čŽĄæ—ļ器įš„éĸ‘道更åĨŊ地åˇĨäŊœīŧŒäŊ†å¯šå¤§åž‹į¤žåŒē可čƒŊäŧšæļˆč€—éĸå¤–įš„处į†čƒŊ力。", "RetentionPolicyRoom_Enabled": "č‡Ē动äŋŽå‰Ē旧æļˆæ¯", @@ -4135,4 +4142,4 @@ "Enterprise": "äŧä¸š", "UpgradeToGetMore_engagement-dashboard_Title": "分析", "UpgradeToGetMore_auditing_Title": "æļˆæ¯åŽĄčŽĄ" -} +} \ No newline at end of file diff --git a/packages/i18n/tsconfig.json b/packages/i18n/tsconfig.json new file mode 100644 index 000000000000..d3ff0b8bdc07 --- /dev/null +++ b/packages/i18n/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDirs": ["./src", "./"], + "outDir": "./dist", + "declaration": true + }, + "include": ["./src/**/*", "./jest.config.ts"] +} diff --git a/packages/instance-status/CHANGELOG.md b/packages/instance-status/CHANGELOG.md index c87456b36a80..849ccf591d08 100644 --- a/packages/instance-status/CHANGELOG.md +++ b/packages/instance-status/CHANGELOG.md @@ -1,5 +1,95 @@ # @rocket.chat/instance-status +## 0.1.3 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448]: + + - @rocket.chat/models@0.2.0 +
    + +## 0.1.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/models@0.2.0-rc.6 +
    + +## 0.1.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/models@0.2.0-rc.5 +
    + +## 0.1.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/models@0.2.0-rc.4 +
    + +## 0.1.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/models@0.2.0-rc.3 +
    + +## 0.1.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/models@0.2.0-rc.2 +
    + +## 0.1.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + +## 0.1.2 + +### Patch Changes + +-
    Updated dependencies []: +- @rocket.chat/models@0.1.2 +
    + + - @rocket.chat/models@0.2.0-rc.1 +
    + +## 0.1.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448]: + + - @rocket.chat/models@0.2.0-rc.0 + - @rocket.chat/models@0.1.2 +
    + +## 0.1.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/models@0.1.1 +
    + ## 0.1.0 ### Minor Changes diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index 61a3b3121be9..088cba613d8e 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/instance-status", - "version": "0.1.0", + "version": "0.1.3", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/packages/jest-presets/.eslintrc.json b/packages/jest-presets/.eslintrc.json new file mode 100644 index 000000000000..7250665ca644 --- /dev/null +++ b/packages/jest-presets/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://json.schemastore.org/eslintrc", + "extends": ["@rocket.chat/eslint-config"], + "ignorePatterns": ["/dist/**", "/client/**", "/server/**"] +} diff --git a/packages/jest-presets/client b/packages/jest-presets/client new file mode 120000 index 000000000000..8f76ef0d8625 --- /dev/null +++ b/packages/jest-presets/client @@ -0,0 +1 @@ +dist/client \ No newline at end of file diff --git a/packages/jest-presets/package.json b/packages/jest-presets/package.json new file mode 100644 index 000000000000..e6c0c9197bce --- /dev/null +++ b/packages/jest-presets/package.json @@ -0,0 +1,38 @@ +{ + "name": "@rocket.chat/jest-presets", + "version": "0.0.1", + "private": true, + "scripts": { + "clean": "rm -rf ./dist", + "build": "tsc", + "lint": "eslint ." + }, + "files": [ + "/dist", + "/client", + "/server" + ], + "dependencies": { + "@swc/core": "~1.7.4", + "@swc/jest": "~0.2.36", + "@testing-library/jest-dom": "~6.4.8", + "@types/jest-axe": "~3.5.9", + "identity-obj-proxy": "~3.0.0", + "jest-axe": "~9.0.0", + "jest-environment-jsdom": "~29.7.0", + "jest-environment-node": "~29.7.0", + "uuid": "~9.0.1" + }, + "devDependencies": { + "@rocket.chat/eslint-config": "workspace:~", + "@types/identity-obj-proxy": "^3", + "@types/jest": "~29.5.12", + "@types/uuid": "^9", + "eslint": "~8.45.0", + "jest": "~29.7.0", + "typescript": "~5.4.5" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/packages/jest-presets/server b/packages/jest-presets/server new file mode 120000 index 000000000000..5abc362c5511 --- /dev/null +++ b/packages/jest-presets/server @@ -0,0 +1 @@ +dist/server \ No newline at end of file diff --git a/packages/jest-presets/src/client/index.ts b/packages/jest-presets/src/client/index.ts new file mode 100644 index 000000000000..4194d7ebc206 --- /dev/null +++ b/packages/jest-presets/src/client/index.ts @@ -0,0 +1,10 @@ +import type { Config } from 'jest'; + +export type {} from '@testing-library/jest-dom'; // trick to cascade global types for Jest matchers + +const preset = '@rocket.chat/jest-presets/client'; + +export default { + preset, + setupFilesAfterEnv: [`${preset}/jest-setup.js`], +} satisfies Config; diff --git a/packages/jest-presets/src/client/jest-preset.ts b/packages/jest-presets/src/client/jest-preset.ts new file mode 100644 index 000000000000..fbba554c5a1c --- /dev/null +++ b/packages/jest-presets/src/client/jest-preset.ts @@ -0,0 +1,38 @@ +import type * as SWC from '@swc/core'; +import type { Config } from 'jest'; + +export default { + testEnvironment: 'jsdom', + errorOnDeprecated: true, + + transform: { + '^.+\\.m?(t|j)sx?$': [ + '@swc/jest', + { + sourceMaps: true, + jsc: { + target: 'es2015', + transform: { + react: { + runtime: 'automatic', + }, + }, + parser: { + syntax: 'typescript', + tsx: true, + decorators: false, + dynamicImport: true, + }, + }, + } satisfies SWC.Config, + ], + }, + transformIgnorePatterns: ['/node_modules/@babel', '/node_modules/@jest', '/node_modules/(?!@testing-library/)'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node', 'mjs'], + + moduleNameMapper: { + '\\.css$': 'identity-obj-proxy', + }, + + collectCoverage: true, +} satisfies Config; diff --git a/packages/jest-presets/src/client/jest-setup.ts b/packages/jest-presets/src/client/jest-setup.ts new file mode 100644 index 000000000000..87fe139acb29 --- /dev/null +++ b/packages/jest-presets/src/client/jest-setup.ts @@ -0,0 +1,69 @@ +import { TextEncoder, TextDecoder } from 'node:util'; + +import { toHaveNoViolations } from 'jest-axe'; +import * as uuid from 'uuid'; + +import '@testing-library/jest-dom'; + +expect.extend(toHaveNoViolations); + +const urlByBlob = new WeakMap(); +const blobByUrl = new Map(); + +globalThis.URL.createObjectURL = (blob: Blob): string => { + const url = urlByBlob.get(blob) ?? `blob://${uuid.v4()}`; + urlByBlob.set(blob, url); + blobByUrl.set(url, blob); + return url; +}; + +globalThis.URL.revokeObjectURL = (url: string): void => { + const blob = blobByUrl.get(url); + if (!blob) { + return; + } + + urlByBlob.delete(blob); + blobByUrl.delete(url); +}; + +globalThis.ResizeObserver = jest.fn().mockImplementation(() => ({ + observe: jest.fn(), + unobserve: jest.fn(), + disconnect: jest.fn(), +})); + +Object.defineProperty(global.navigator, 'serviceWorker', { + value: { + register: jest.fn(), + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + }, +}); + +globalThis.IntersectionObserver = class IntersectionObserver { + root = null; + + rootMargin = ''; + + thresholds = []; + + disconnect() { + return null; + } + + observe() { + return null; + } + + takeRecords() { + return []; + } + + unobserve() { + return null; + } +}; + +globalThis.TextEncoder = TextEncoder; +globalThis.TextDecoder = TextDecoder as any; diff --git a/packages/jest-presets/src/server/index.ts b/packages/jest-presets/src/server/index.ts new file mode 100644 index 000000000000..1600435cecbd --- /dev/null +++ b/packages/jest-presets/src/server/index.ts @@ -0,0 +1,7 @@ +import type { Config } from 'jest'; + +const preset = '@rocket.chat/jest-presets/server'; + +export default { + preset, +} satisfies Config; diff --git a/packages/jest-presets/src/server/jest-preset.ts b/packages/jest-presets/src/server/jest-preset.ts new file mode 100644 index 000000000000..df6d550d764f --- /dev/null +++ b/packages/jest-presets/src/server/jest-preset.ts @@ -0,0 +1,28 @@ +import type * as SWC from '@swc/core'; +import type { Config } from 'jest'; + +export default { + testEnvironment: 'node', + errorOnDeprecated: true, + + transform: { + '^.+\\.m?(t|j)sx?$': [ + '@swc/jest', + { + sourceMaps: true, + jsc: { + target: 'es2015', + parser: { + syntax: 'typescript', + decorators: false, + dynamicImport: true, + }, + }, + } satisfies SWC.Config, + ], + }, + transformIgnorePatterns: ['/node_modules/@babel', '/node_modules/@jest', '/node_modules/(?!@testing-library/)'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node', 'mjs'], + + collectCoverage: true, +} satisfies Config; diff --git a/packages/jest-presets/tsconfig.json b/packages/jest-presets/tsconfig.json new file mode 100644 index 000000000000..d3a2f31e035b --- /dev/null +++ b/packages/jest-presets/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "declaration": true + }, + "include": ["./src"] +} diff --git a/packages/jwt/jest.config.js b/packages/jwt/jest.config.js deleted file mode 100644 index 6231bde11685..000000000000 --- a/packages/jwt/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', -}; diff --git a/packages/jwt/jest.config.ts b/packages/jwt/jest.config.ts new file mode 100644 index 000000000000..c18c8ae02465 --- /dev/null +++ b/packages/jwt/jest.config.ts @@ -0,0 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + +export default { + preset: server.preset, +} satisfies Config; diff --git a/packages/jwt/package.json b/packages/jwt/package.json index d93ec0dc4228..a6d989e2c275 100644 --- a/packages/jwt/package.json +++ b/packages/jwt/package.json @@ -3,29 +3,30 @@ "version": "0.1.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "^29.1.1", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "scripts": { + "build": "rm -rf dist && tsc", + "dev": "tsc --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", "test": "jest", - "testunit": "jest", - "build": "rm -rf dist && tsc -p tsconfig.json", - "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" + "testunit": "jest" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", "files": [ "/dist" ], - "volta": { - "extends": "../../package.json" - }, "dependencies": { "jose": "^4.14.4" + }, + "volta": { + "extends": "../../package.json" } } diff --git a/packages/livechat/CHANGELOG.md b/packages/livechat/CHANGELOG.md index e8c8140ae8a3..56265d43563f 100644 --- a/packages/livechat/CHANGELOG.md +++ b/packages/livechat/CHANGELOG.md @@ -1,5 +1,117 @@ # @rocket.chat/livechat Change Log +## 1.19.0 + +### Minor Changes + +- ([#32498](https://github.com/RocketChat/Rocket.Chat/pull/32498)) Created a `transferChat` Livechat API endpoint for transferring chats programmatically, the endpoint has all the limitations & permissions required that transferring via UI has + +### Patch Changes + +- ([#32692](https://github.com/RocketChat/Rocket.Chat/pull/32692)) Fixed an issue that caused the widget to set the wrong department when using the setDepartment Livechat api endpoint in conjunction with a Livechat Trigger + +- ([#32626](https://github.com/RocketChat/Rocket.Chat/pull/32626)) livechat `setDepartment` livechat api fixes: + - Changing department didn't reflect on the registration form in real time + - Changing the department mid conversation didn't transfer the chat + - Depending on the state of the department, it couldn't be set as default +-
    Updated dependencies [2d89a0c448]: + + - @rocket.chat/ui-kit@0.36.0 + - @rocket.chat/gazzodown@9.0.0 +
    + +## 1.19.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/gazzodown@9.0.0-rc.6 +
    + +## 1.19.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/gazzodown@9.0.0-rc.5 +
    + +## 1.19.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/gazzodown@9.0.0-rc.4 +
    + +## 1.19.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/gazzodown@9.0.0-rc.3 +
    + +## 1.19.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/gazzodown@9.0.0-rc.2 +
    + +## 1.19.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/gazzodown@9.0.0-rc.1 +
    + +## 1.19.0-rc.0 + +### Minor Changes + +- ([#32498](https://github.com/RocketChat/Rocket.Chat/pull/32498)) Created a `transferChat` Livechat API endpoint for transferring chats programmatically, the endpoint has all the limitations & permissions required that transferring via UI has + +### Patch Changes + +- ([#32692](https://github.com/RocketChat/Rocket.Chat/pull/32692)) Fixed an issue that caused the widget to set the wrong department when using the setDepartment Livechat api endpoint in conjunction with a Livechat Trigger + +- ([#32626](https://github.com/RocketChat/Rocket.Chat/pull/32626)) livechat `setDepartment` livechat api fixes: + - Changing department didn't reflect on the registration form in real time + - Changing the department mid conversation didn't transfer the chat + - Depending on the state of the department, it couldn't be set as default +-
    Updated dependencies [2d89a0c448]: + + - @rocket.chat/ui-kit@0.36.0-rc.0 + - @rocket.chat/gazzodown@9.0.0-rc.0 + +## 1.18.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/gazzodown@8.0.2 +
    +
    + +## 1.18.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/gazzodown@8.0.1 +
    + ## 1.18.0 ### Minor Changes diff --git a/packages/livechat/package.json b/packages/livechat/package.json index 7ab28ca30366..9d40643dd4c5 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/livechat", - "version": "1.18.0", + "version": "1.19.0", "files": [ "/build" ], diff --git a/packages/livechat/src/lib/room.js b/packages/livechat/src/lib/room.js index de17ded17ccb..f7e7e97df5f4 100644 --- a/packages/livechat/src/lib/room.js +++ b/packages/livechat/src/lib/room.js @@ -41,7 +41,7 @@ export const closeChat = async ({ transcriptRequested } = {}) => { await store.setState(initial); } - Triggers.processTrigger('after-guest-registration'); + await Triggers.processTrigger('after-guest-registration'); await loadConfig(); parentCall('callback', 'chat-ended'); diff --git a/packages/livechat/src/lib/transcript.js b/packages/livechat/src/lib/transcript.ts similarity index 68% rename from packages/livechat/src/lib/transcript.js rename to packages/livechat/src/lib/transcript.ts index 970aab2ee9bc..33260edd62e8 100644 --- a/packages/livechat/src/lib/transcript.js +++ b/packages/livechat/src/lib/transcript.ts @@ -9,9 +9,19 @@ const promptTranscript = async () => { config: { messages: { transcriptMessage }, }, - user: { token, visitorEmails }, - room: { _id }, + user, + room, } = store.state; + + if (!room || !user) { + console.warn('Only call promptTranscript when there is a room and a user'); + return; + } + + const { visitorEmails } = user; + + const { _id } = room; + const email = visitorEmails && visitorEmails.length > 0 ? visitorEmails[0].address : ''; if (!email) { return; @@ -23,12 +33,12 @@ const promptTranscript = async () => { text: message, }).then((result) => { if (typeof result.success === 'boolean' && result.success) { - return Livechat.requestTranscript(email, { token, rid: _id }); + return Livechat.requestTranscript(email, { rid: _id }); } }); }; -const transcriptSentAlert = (message) => +const transcriptSentAlert = (message: string) => ModalManager.alert({ text: message, timeout: 1000, @@ -45,7 +55,8 @@ export const handleTranscript = async () => { const result = await promptTranscript(); - if (result && result.success) { + // TODO: Check why the api results are not returning the correct type + if ((result as { message: string; success: boolean })?.success) { transcriptSentAlert(i18next.t('transcript_success')); } }; diff --git a/packages/livechat/src/lib/triggerUtils.ts b/packages/livechat/src/lib/triggerUtils.ts index ca66e2bea0f9..ecce283ccf2a 100644 --- a/packages/livechat/src/lib/triggerUtils.ts +++ b/packages/livechat/src/lib/triggerUtils.ts @@ -17,16 +17,18 @@ const isAgentWithInfo = (agent: any): agent is Serialized => !ag const getNextAgentFromQueue = async () => { const { defaultAgent, - iframe: { guest: { department } = {} }, + iframe: { defaultDepartment, guest: { department } = {} }, } = store.state; if (defaultAgent?.ts && Date.now() - defaultAgent.ts < agentCacheExpiry) { return defaultAgent; // cache valid for 1 hour } + const dep = department || defaultDepartment; + let agent = null; try { - const tempAgent = await Livechat.nextAgent({ department }); + const tempAgent = await Livechat.nextAgent({ department: dep }); if (isAgentWithInfo(tempAgent?.agent)) { agent = tempAgent.agent; @@ -35,7 +37,7 @@ const getNextAgentFromQueue = async () => { return Promise.reject(error); } - store.setState({ defaultAgent: { ...agent, department, ts: Date.now() } as Agent }); + store.setState({ defaultAgent: { ...agent, department: dep, ts: Date.now() } as Agent }); return agent; }; diff --git a/packages/livechat/src/providers/ServerProvider.tsx b/packages/livechat/src/providers/ServerProvider.tsx index 79a0b2eb6f8f..203740a62e39 100644 --- a/packages/livechat/src/providers/ServerProvider.tsx +++ b/packages/livechat/src/providers/ServerProvider.tsx @@ -1,15 +1,15 @@ import type { Serialized } from '@rocket.chat/core-typings'; -import { Emitter } from '@rocket.chat/emitter'; -import type { Method, PathFor, OperationParams, OperationResult, UrlParams, PathPattern } from '@rocket.chat/rest-typings'; import type { ServerMethodName, ServerMethodParameters, ServerMethodReturn, StreamerCallbackArgs, - UploadResult, StreamNames, StreamKeys, -} from '@rocket.chat/ui-contexts'; +} from '@rocket.chat/ddp-client'; +import { Emitter } from '@rocket.chat/emitter'; +import type { Method, PathFor, OperationParams, OperationResult, UrlParams, PathPattern } from '@rocket.chat/rest-typings'; +import type { UploadResult } from '@rocket.chat/ui-contexts'; import { ServerContext } from '@rocket.chat/ui-contexts'; import { compile } from 'path-to-regexp'; import { useMemo } from 'preact/hooks'; diff --git a/packages/livechat/src/store/index.tsx b/packages/livechat/src/store/index.tsx index abc05f7101a9..f8629ce693cc 100644 --- a/packages/livechat/src/store/index.tsx +++ b/packages/livechat/src/store/index.tsx @@ -58,6 +58,7 @@ export type StoreState = { hiddenSystemMessages?: LivechatHiddenSytemMessageType[]; hideWatermark?: boolean; livechatLogo?: { url: string }; + transcript?: boolean; }; online?: boolean; departments: Department[]; diff --git a/packages/livechat/src/widget.ts b/packages/livechat/src/widget.ts index 47f073aaff0a..9a7af87de95d 100644 --- a/packages/livechat/src/widget.ts +++ b/packages/livechat/src/widget.ts @@ -1,5 +1,5 @@ import type { UserStatus } from '@rocket.chat/core-typings'; -import type { LivechatRoomEvents } from '@rocket.chat/ddp-client/dist/livechat/types/LivechatSDK'; +import type { LivechatRoomEvents } from '@rocket.chat/ddp-client'; import mitt from 'mitt'; import { isDefined } from './helpers/isDefined'; diff --git a/packages/log-format/package.json b/packages/log-format/package.json index 33eeacd1272f..b43a3954a96f 100644 --- a/packages/log-format/package.json +++ b/packages/log-format/package.json @@ -5,16 +5,12 @@ "devDependencies": { "@types/chalk": "^2.2.0", "@types/ejson": "^2.2.1", - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, diff --git a/packages/logger/package.json b/packages/logger/package.json index efbe5aa6e12f..aae996f35139 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -3,16 +3,12 @@ "version": "0.0.2", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, diff --git a/packages/message-parser/jest.config.js b/packages/message-parser/jest.config.js deleted file mode 100644 index 114260f819d9..000000000000 --- a/packages/message-parser/jest.config.js +++ /dev/null @@ -1,12 +0,0 @@ -const path = require('path'); - -module.exports = { - coverageReporters: [], - transform: { - '\\.pegjs$': path.resolve(__dirname, './loaders/pegtransform.js'), - }, - preset: 'ts-jest', - errorOnDeprecated: true, - testMatch: ['/tests/**/*.(spec|test).ts'], - moduleFileExtensions: ['js', 'ts', 'pegjs'], -}; diff --git a/packages/message-parser/jest.config.ts b/packages/message-parser/jest.config.ts new file mode 100644 index 000000000000..e11f29938eb9 --- /dev/null +++ b/packages/message-parser/jest.config.ts @@ -0,0 +1,12 @@ +import { resolve } from 'node:path'; + +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + +export default { + preset: server.preset, + transform: { + '\\.pegjs$': resolve(__dirname, './loaders/pegtransform.js'), + }, + moduleFileExtensions: ['js', 'ts', 'pegjs'], +} satisfies Config; diff --git a/packages/message-parser/package.json b/packages/message-parser/package.json index cfdb0ebe73d5..fd7e88dc1d86 100644 --- a/packages/message-parser/package.json +++ b/packages/message-parser/package.json @@ -42,9 +42,9 @@ "build": "run-s .:build:clean .:build:bundle", ".:build:clean": "rimraf dist", ".:build:bundle": "webpack", - "testunit": "jest --runInBand --coverage", - "watch": "jest --watch", - "lint": "eslint src", + "lint": "eslint .", + "test": "jest", + "testunit": "jest", "docs": "typedoc" }, "devDependencies": { @@ -52,20 +52,20 @@ "@babel/eslint-parser": "~7.21.3", "@babel/preset-env": "~7.21.4", "@rocket.chat/eslint-config": "workspace:^", + "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/peggy-loader": "workspace:~", "@rocket.chat/prettier-config": "~0.31.25", - "@types/jest": "~29.5.7", + "@types/jest": "~29.5.12", "@types/node": "~14.18.42", "@typescript-eslint/parser": "~5.58.0", "babel-loader": "~9.1.2", "eslint": "~8.45.0", - "jest": "~29.6.4", + "jest": "~29.7.0", "npm-run-all": "^4.1.5", "peggy": "3.0.2", "prettier": "~2.8.7", "prettier-plugin-pegjs": "~0.5.4", "rimraf": "^3.0.2", - "ts-jest": "~29.1.0", "ts-loader": "~9.4.2", "typedoc": "~0.24.1", "typescript": "~5.3.3", @@ -74,5 +74,8 @@ }, "dependencies": { "tldts": "~5.7.112" + }, + "volta": { + "extends": "../../package.json" } } diff --git a/packages/mock-providers/CHANGELOG.md b/packages/mock-providers/CHANGELOG.md index cbf328eda950..300b624d5dff 100644 --- a/packages/mock-providers/CHANGELOG.md +++ b/packages/mock-providers/CHANGELOG.md @@ -1,5 +1,27 @@ # @rocket.chat/mock-providers +## 0.1.1 + +### Patch Changes + +- ([#32482](https://github.com/RocketChat/Rocket.Chat/pull/32482)) Fixed an issue with blocked login when dismissed 2FA modal by clicking outside of it or pressing the escape key + +-
    Updated dependencies [b4bbcbfc9a, 25da5280a5, 1b7b1161cf, 03c8b066f9, 2d89a0c448, 3ffe4a2944, 3b4b19cfc5]: + + - @rocket.chat/i18n@0.6.0 +
    + +## 0.1.1-rc.0 + +### Patch Changes + +- ([#32482](https://github.com/RocketChat/Rocket.Chat/pull/32482)) Fixed an issue with blocked login when dismissed 2FA modal by clicking outside of it or pressing the escape key + +-
    Updated dependencies [b4bbcbfc9a, 25da5280a5, 1b7b1161cf, 03c8b066f9, 2d89a0c448, 3ffe4a2944, 3b4b19cfc5]: + + - @rocket.chat/i18n@0.6.0-rc.0 +
    + ## 0.1.0 ### Minor Changes diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json index 9adbce01c624..64310f0695cc 100644 --- a/packages/mock-providers/package.json +++ b/packages/mock-providers/package.json @@ -1,21 +1,22 @@ { "name": "@rocket.chat/mock-providers", - "version": "0.1.0", + "version": "0.1.1", "private": true, "dependencies": { + "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/i18n": "workspace:~", "i18next": "~23.4.9", - "react-i18next": "~13.2.2" + "react-i18next": "~13.2.2", + "use-sync-external-store": "~1.2.2" }, "devDependencies": { + "@rocket.chat/ddp-client": "workspace:~", "@rocket.chat/ui-contexts": "workspace:*", "@storybook/react": "~6.5.16", "@tanstack/react-query": "^4.16.1", - "@types/jest": "~29.5.7", + "@types/use-sync-external-store": "^0.0.5", "eslint": "~8.45.0", - "jest": "~29.6.4", "react": "~17.0.2", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "peerDependencies": { @@ -25,7 +26,6 @@ "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" }, @@ -33,5 +33,8 @@ "typings": "./dist/index.d.ts", "files": [ "/dist" - ] + ], + "volta": { + "extends": "../../package.json" + } } diff --git a/packages/mock-providers/src/MockedAppRootBuilder.tsx b/packages/mock-providers/src/MockedAppRootBuilder.tsx index a3b2ca725f47..15b1339c560d 100644 --- a/packages/mock-providers/src/MockedAppRootBuilder.tsx +++ b/packages/mock-providers/src/MockedAppRootBuilder.tsx @@ -1,11 +1,10 @@ -import { type ISetting, type Serialized, type SettingValue } from '@rocket.chat/core-typings'; +import type { ISetting, Serialized, SettingValue } from '@rocket.chat/core-typings'; +import type { ServerMethodName, ServerMethodParameters, ServerMethodReturn } from '@rocket.chat/ddp-client'; +import { Emitter } from '@rocket.chat/emitter'; import languages from '@rocket.chat/i18n/dist/languages'; -import { type Method, type OperationParams, type OperationResult, type PathPattern, type UrlParams } from '@rocket.chat/rest-typings'; +import type { Method, OperationParams, OperationResult, PathPattern, UrlParams } from '@rocket.chat/rest-typings'; +import type { ModalContextValue, TranslationKey } from '@rocket.chat/ui-contexts'; import { - type ServerMethodName, - type ServerMethodParameters, - type ServerMethodReturn, - type TranslationKey, AuthorizationContext, ConnectionStatusContext, RouterContext, @@ -16,18 +15,24 @@ import { ActionManagerContext, ModalContext, } from '@rocket.chat/ui-contexts'; -import { type DecoratorFn } from '@storybook/react'; +import type { DecoratorFn } from '@storybook/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { type WrapperComponent } from '@testing-library/react-hooks'; import { createInstance } from 'i18next'; -import { type ObjectId } from 'mongodb'; -import React, { type ContextType, type ReactNode, useEffect, useReducer } from 'react'; +import type { ObjectId } from 'mongodb'; +import type { ContextType, JSXElementConstructor, ReactNode } from 'react'; +import React, { useEffect, useReducer } from 'react'; import { I18nextProvider, initReactI18next } from 'react-i18next'; +import { useSyncExternalStore } from 'use-sync-external-store/shim'; type Mutable = { -readonly [P in keyof T]: T[P]; }; +// eslint-disable-next-line @typescript-eslint/naming-convention +interface MockedAppRootEvents { + 'update-modal': void; +} + export class MockedAppRootBuilder { private wrappers: Array<(children: ReactNode) => ReactNode> = []; @@ -69,6 +74,7 @@ export class MockedAppRootBuilder { navigate: () => undefined, subscribeToRouteChange: () => () => undefined, subscribeToRoutesChange: () => () => undefined, + getRoomRoute: () => ({ path: '/' }), }; private settings: Mutable> = { @@ -89,10 +95,16 @@ export class MockedAppRootBuilder { userId: null, }; - private modal: ContextType = { + private modal: ModalContextValue = { currentModal: { component: null }, modal: { - setModal: () => undefined, + setModal: (modal) => { + this.modal = { + ...this.modal, + currentModal: { component: modal }, + }; + this.events.emit('update-modal'); + }, }, }; @@ -112,6 +124,8 @@ export class MockedAppRootBuilder { }, }; + private events = new Emitter(); + wrap(wrapper: (children: ReactNode) => ReactNode): this { this.wrappers.push(wrapper); return this; @@ -311,22 +325,25 @@ export class MockedAppRootBuilder { return this; } - private i18n = createInstance( - { - // debug: true, - lng: 'en', - fallbackLng: 'en', - ns: ['core'], - nsSeparator: '.', - partialBundledLanguages: true, - defaultNS: 'core', - interpolation: { - escapeValue: false, - }, - initImmediate: false, + withOpenModal(modal: ReactNode) { + this.modal.currentModal = { component: modal }; + + return this; + } + + private i18n = createInstance({ + // debug: true, + lng: 'en', + fallbackLng: 'en', + ns: ['core'], + nsSeparator: '.', + partialBundledLanguages: true, + defaultNS: 'core', + interpolation: { + escapeValue: false, }, - () => undefined, - ).use(initReactI18next); + initImmediate: false, + }).use(initReactI18next); withTranslations(lng: string, ns: string, resources: Record): this { const addResources = () => { @@ -345,15 +362,20 @@ export class MockedAppRootBuilder { return this; } - build(): WrapperComponent<{ children: ReactNode }> { + build(): JSXElementConstructor<{ children: ReactNode }> { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false }, mutations: { retry: false }, }, + logger: { + log: console.log, + warn: console.warn, + error: () => undefined, + }, }); - const { connectionStatus, server, router, settings, user, modal, i18n, authorization, wrappers } = this; + const { connectionStatus, server, router, settings, user, i18n, authorization, wrappers } = this; const reduceTranslation = (translation?: ContextType): ContextType => { return { @@ -392,6 +414,12 @@ export class MockedAppRootBuilder { }; }; + const subscribeToModal = (onStoreChange: () => void) => this.events.on('update-modal', onStoreChange); + + const getModalSnapshot = () => this.modal; + + i18n.init(); + return function MockedAppRoot({ children }) { const [translation, updateTranslation] = useReducer(reduceTranslation, undefined, () => reduceTranslation()); @@ -405,6 +433,8 @@ export class MockedAppRootBuilder { }; }, []); + const modal = useSyncExternalStore(subscribeToModal, getModalSnapshot); + return ( @@ -443,7 +473,13 @@ export class MockedAppRootBuilder { {/* */} - {wrappers.reduce((children, wrapper) => wrapper(children), children)} + {wrappers.reduce( + (children, wrapper) => wrapper(children), + <> + {children} + {modal.currentModal.component} + , + )} {/* */} diff --git a/packages/mock-providers/src/MockedModalContext.tsx b/packages/mock-providers/src/MockedModalContext.tsx index 56afbbd1daa7..701254d11d94 100644 --- a/packages/mock-providers/src/MockedModalContext.tsx +++ b/packages/mock-providers/src/MockedModalContext.tsx @@ -1,9 +1,9 @@ import { ModalContext } from '@rocket.chat/ui-contexts'; import type { ReactNode } from 'react'; -import React from 'react'; +import React, { useState } from 'react'; export const MockedModalContext = ({ children }: { children: React.ReactNode }) => { - const [currentModal, setCurrentModal] = React.useState(null); + const [currentModal, setCurrentModal] = useState(null); return ( Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0 +

  • + +## 0.6.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 +
    + +## 0.6.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 +
    + +## 0.6.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 +
    + +## 0.6.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 +
    + +## 0.6.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 +
    + +## 0.6.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 +
    + +## 0.6.0-rc.0 + +### Minor Changes + +- ([#32493](https://github.com/RocketChat/Rocket.Chat/pull/32493)) Fixed Livechat rooms being displayed in the Engagement Dashboard's "Channels" tab + +- ([#32752](https://github.com/RocketChat/Rocket.Chat/pull/32752)) Added system messages support for Omnichannel PDF transcripts and email transcripts. Currently these transcripts don't render system messages and is shown as an empty message in PDF/email. This PR adds this support for all valid livechat system messages. + + Also added a new setting under transcripts, to toggle the inclusion of system messages in email and PDF transcripts. + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. +- ([#32493](https://github.com/RocketChat/Rocket.Chat/pull/32493)) Improved Engagement Dashboard's "Channels" tab performance by not returning rooms that had no activity in the analyzed period + +- ([#32800](https://github.com/RocketChat/Rocket.Chat/pull/32800)) Added the ability to filter chats by `queued` on the Current Chats Omnichannel page + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0-rc.0 +
    + +## 0.5.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 +
    + +## 0.5.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 +
    + ## 0.5.0 ### Minor Changes diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index 372bde3257cb..f96764fa49af 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -1,20 +1,16 @@ { "name": "@rocket.chat/model-typings", - "version": "0.5.0", + "version": "0.6.0", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", "@types/node-rsa": "^1.1.3", "eslint": "~8.45.0", - "jest": "~29.6.4", "mongodb": "^4.17.2", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, "main": "./dist/index.js", diff --git a/packages/model-typings/src/index.ts b/packages/model-typings/src/index.ts index 23e77ff1de29..61ad5d1f5c55 100644 --- a/packages/model-typings/src/index.ts +++ b/packages/model-typings/src/index.ts @@ -79,3 +79,4 @@ export * from './models/IAuditLogModel'; export * from './models/ICronHistoryModel'; export * from './models/IMigrationsModel'; export * from './models/IModerationReportsModel'; +export * from './updater'; diff --git a/packages/model-typings/src/models/IAnalyticsModel.ts b/packages/model-typings/src/models/IAnalyticsModel.ts index 4d31f66a94d8..1ca4d7abf118 100644 --- a/packages/model-typings/src/models/IAnalyticsModel.ts +++ b/packages/model-typings/src/models/IAnalyticsModel.ts @@ -2,6 +2,7 @@ import type { IAnalytic, IRoom } from '@rocket.chat/core-typings'; import type { AggregationCursor, FindCursor, FindOptions, UpdateResult, Document } from 'mongodb'; import type { IBaseModel } from './IBaseModel'; +import type { IChannelsWithNumberOfMessagesBetweenDate } from './IRoomsModel'; export interface IAnalyticsModel extends IBaseModel { saveMessageSent({ room, date }: { room: IRoom; date: IAnalytic['date'] }): Promise; @@ -38,4 +39,12 @@ export interface IAnalyticsModel extends IBaseModel { users: number; }>; findByTypeBeforeDate({ type, date }: { type: IAnalytic['type']; date: IAnalytic['date'] }): FindCursor; + findRoomsByTypesWithNumberOfMessagesBetweenDate(params: { + types: Array; + start: number; + end: number; + startOfLastWeek: number; + endOfLastWeek: number; + options?: any; + }): AggregationCursor<{ channels: IChannelsWithNumberOfMessagesBetweenDate[]; total: number }>; } diff --git a/packages/model-typings/src/models/IBaseModel.ts b/packages/model-typings/src/models/IBaseModel.ts index fa053fef9ec8..246c3ae253dd 100644 --- a/packages/model-typings/src/models/IBaseModel.ts +++ b/packages/model-typings/src/models/IBaseModel.ts @@ -22,6 +22,8 @@ import type { WithId, } from 'mongodb'; +import type { Updater } from '../updater'; + export type DefaultFields = Record | Record | void; export type ResultFields = Defaults extends void ? Base @@ -48,6 +50,8 @@ export interface IBaseModel< createIndexes(): Promise; getCollectionName(): string; + getUpdater(): Updater; + updateFromUpdater(query: Filter, updater: Updater): Promise; findOneAndUpdate(query: Filter, update: UpdateFilter | T, options?: FindOneAndUpdateOptions): Promise>; diff --git a/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts b/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts index 45709dc7ff37..f0f151fa70d4 100644 --- a/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts +++ b/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts @@ -1,5 +1,5 @@ import type { ILivechatDepartmentAgents, IUser } from '@rocket.chat/core-typings'; -import type { DeleteResult, FindCursor, FindOptions, Document, UpdateResult, Filter } from 'mongodb'; +import type { DeleteResult, FindCursor, FindOptions, Document, UpdateResult, Filter, AggregationCursor } from 'mongodb'; import type { FindPaginated, IBaseModel } from './IBaseModel'; @@ -39,23 +39,6 @@ export interface ILivechatDepartmentAgentsModel extends IBaseModel, ): FindPaginated>; - findActiveDepartmentsByAgentId(agentId: string): FindCursor; - - findActiveDepartmentsByAgentId(agentId: string, options: FindOptions): FindCursor; - - findActiveDepartmentsByAgentId

    ( - agentId: string, - options: FindOptions

    , - ): FindCursor

    ; - - findActiveDepartmentsByAgentId

    ( - agentId: string, - options?: - | undefined - | FindOptions - | FindOptions

    , - ): FindCursor | FindCursor

    ; - findByDepartmentIds(departmentIds: string[], options?: Record): FindCursor; findAgentsByAgentIdAndBusinessHourId(_agentId: string, _businessHourId: string): Promise; setDepartmentEnabledByDepartmentId(departmentId: string, departmentEnabled: boolean): Promise; @@ -67,7 +50,7 @@ export interface ILivechatDepartmentAgentsModel extends IBaseModel, ): Promise; findOneByAgentIdAndDepartmentId(agentId: string, departmentId: string): Promise; - saveAgent(agent: Omit): Promise; + saveAgent(agent: Omit): Promise; removeByAgentId(agentId: string): Promise; removeByDepartmentIdAndAgentId(departmentId: string, agentId: string): Promise; getNextAgentForDepartment( @@ -97,4 +80,5 @@ export interface ILivechatDepartmentAgentsModel extends IBaseModel, ): FindCursor; + findDepartmentsOfAgent(agentId: string, enabled?: boolean): AggregationCursor; } diff --git a/packages/model-typings/src/models/ILivechatRoomsModel.ts b/packages/model-typings/src/models/ILivechatRoomsModel.ts index 6384b325f991..babfa4ea2165 100644 --- a/packages/model-typings/src/models/ILivechatRoomsModel.ts +++ b/packages/model-typings/src/models/ILivechatRoomsModel.ts @@ -9,6 +9,7 @@ import type { import type { FindCursor, UpdateResult, AggregationCursor, Document, FindOptions, DeleteResult, Filter } from 'mongodb'; import type { FindPaginated } from '..'; +import type { Updater } from '../updater'; import type { IBaseModel } from './IBaseModel'; type Period = { @@ -28,7 +29,10 @@ type WithOptions = { options?: any; }; +// TODO: Fix types of model export interface ILivechatRoomsModel extends IBaseModel { + getUpdater(): Updater; + getQueueMetrics(params: { departmentId: any; agentId: any; includeOfflineAgents: any; options?: any }): any; findAllNumberOfAbandonedRooms(params: Period & WithDepartment & WithOnlyCount & WithOptions): Promise; @@ -96,6 +100,7 @@ export interface ILivechatRoomsModel extends IBaseModel { visitorId?: any; roomIds?: any; onhold: any; + queued: any; options?: any; extraQuery?: any; }): FindPaginated>; @@ -203,14 +208,18 @@ export interface ILivechatRoomsModel extends IBaseModel { options?: FindOptions, extraQuery?: Filter, ): FindCursor; - setResponseByRoomId(roomId: string, responseBy: IOmnichannelRoom['responseBy']): Promise; - setNotResponseByRoomId(roomId: string): Promise; - setAgentLastMessageTs(roomId: string): Promise; - saveAnalyticsDataByRoomId( + getResponseByRoomIdUpdateQuery( + responseBy: IOmnichannelRoom['responseBy'], + updater?: Updater, + ): Updater; + getNotResponseByRoomIdUpdateQuery(updater: Updater): Updater; + getAgentLastMessageTsUpdateQuery(updater?: Updater): Updater; + getAnalyticsUpdateQueryByRoomId( room: IOmnichannelRoom, message: IMessage, - analyticsData?: Record, - ): Promise; + analyticsData: Record | undefined, + updater?: Updater, + ): Promise>; getTotalConversationsBetweenDate(t: 'l', date: { gte: Date; lt: Date }, data?: { departmentId: string }): Promise; getAnalyticsMetricsBetweenDate( t: 'l', @@ -238,11 +247,12 @@ export interface ILivechatRoomsModel extends IBaseModel { removeAgentByRoomId(roomId: string): Promise; removeByVisitorToken(token: string): Promise; removeById(_id: string): Promise; - setVisitorLastMessageTimestampByRoomId(roomId: string, lastMessageTs: Date): Promise; + getVisitorLastMessageTsUpdateQueryByRoomId(lastMessageTs: Date, updater?: Updater): Updater; setVisitorInactivityInSecondsById(roomId: string, visitorInactivity: any): Promise; changeVisitorByRoomId(roomId: string, visitor: { _id: string; username: string; token: string }): Promise; unarchiveOneById(roomId: string): Promise; markVisitorActiveForPeriod(rid: string, period: string): Promise; + getVisitorActiveForPeriodUpdateQuery(period: string, updater?: Updater): Updater; getMACStatisticsForPeriod(period: string): Promise; getMACStatisticsBetweenDates(start: Date, end: Date): Promise; } diff --git a/packages/model-typings/src/models/IMessagesModel.ts b/packages/model-typings/src/models/IMessagesModel.ts index 0fb02a778c9d..986a50c8cd29 100644 --- a/packages/model-typings/src/models/IMessagesModel.ts +++ b/packages/model-typings/src/models/IMessagesModel.ts @@ -71,7 +71,12 @@ export interface IMessagesModel extends IBaseModel { findLivechatClosedMessages(rid: IRoom['_id'], searchTerm?: string, options?: FindOptions): FindPaginated>; findLivechatMessages(rid: IRoom['_id'], options?: FindOptions): FindCursor; - findLivechatMessagesWithoutClosing(rid: IRoom['_id'], options?: FindOptions): FindCursor; + findLivechatMessagesWithoutTypes( + rid: IRoom['_id'], + ignoredTypes: IMessage['t'][], + showSystemMessages: boolean, + options?: FindOptions, + ): FindCursor; countRoomsWithStarredMessages(options: AggregateOptions): Promise; countRoomsWithPinnedMessages(options: AggregateOptions): Promise; @@ -113,6 +118,7 @@ export interface IMessagesModel extends IBaseModel { roomId: IRoom['_id'], types: IMessage['t'][], ts: Date, + showSystemMessages: boolean, options?: FindOptions, showThreadMessages?: boolean, ): FindCursor; diff --git a/packages/model-typings/src/models/IRoomsModel.ts b/packages/model-typings/src/models/IRoomsModel.ts index 887f51987ae6..1808c9f361f4 100644 --- a/packages/model-typings/src/models/IRoomsModel.ts +++ b/packages/model-typings/src/models/IRoomsModel.ts @@ -1,6 +1,7 @@ import type { IDirectMessageRoom, IMessage, IOmnichannelGenericRoom, IRoom, IRoomFederated, ITeam, IUser } from '@rocket.chat/core-typings'; import type { AggregationCursor, DeleteResult, Document, FindCursor, FindOptions, UpdateOptions, UpdateResult } from 'mongodb'; +import type { Updater } from '../updater'; import type { FindPaginated, IBaseModel } from './IBaseModel'; export interface IChannelsWithNumberOfMessagesBetweenDate { @@ -86,7 +87,8 @@ export interface IRoomsModel extends IBaseModel { setTeamDefaultById(rid: IRoom['_id'], teamDefault: NonNullable, options?: UpdateOptions): Promise; - findChannelsWithNumberOfMessagesBetweenDate(params: { + findChannelsByTypesWithNumberOfMessagesBetweenDate(params: { + types: Array; start: number; end: number; startOfLastWeek: number; @@ -94,14 +96,6 @@ export interface IRoomsModel extends IBaseModel { options?: any; }): AggregationCursor; - countChannelsWithNumberOfMessagesBetweenDate(params: { - start: number; - end: number; - startOfLastWeek: number; - endOfLastWeek: number; - options?: any; - }): AggregationCursor<{ total: number }>; - findOneByName(name: NonNullable, options?: FindOptions): Promise; findDefaultRoomsForTeam(teamId: any): FindCursor; @@ -126,6 +120,8 @@ export interface IRoomsModel extends IBaseModel { setRoomNameById(roomId: IRoom['_id'], name: IRoom['name']): Promise; + setSidepanelById(roomId: IRoom['_id'], sidepanel: IRoom['sidepanel']): Promise; + setFnameById(_id: IRoom['_id'], fname: IRoom['fname']): Promise; setRoomTopicById(roomId: IRoom['_id'], topic: IRoom['description']): Promise; @@ -167,6 +163,7 @@ export interface IRoomsModel extends IBaseModel { countFederatedRooms(): Promise; incMsgCountById(rid: string, inc: number): Promise; + getIncMsgCountUpdateQuery(inc: number, roomUpdater: Updater): Updater; decreaseMessageCountById(rid: string, dec: number): Promise; findOneByIdOrName(_idOrName: string, options?: FindOptions): Promise; setCallStatus(_id: string, callStatus: IRoom['callStatus']): Promise; @@ -239,10 +236,15 @@ export interface IRoomsModel extends IBaseModel { archiveById(rid: string): Promise; unarchiveById(rid: string): Promise; setNameById(rid: string, name: string, fname: string): Promise; - incMsgCountAndSetLastMessageById(rid: IRoom['_id'], inc: number, lastMessageTs: Date, lastMessage?: IMessage): Promise; + setIncMsgCountAndSetLastMessageUpdateQuery( + inc: number, + lastMessage: IMessage, + shouldStoreLastMessage: boolean, + roomUpdater: Updater, + ): Updater; incUsersCountById(rid: string, inc: number): Promise; incUsersCountNotDMsByIds(rids: string[], inc: number): Promise; - setLastMessageById(rid: string, lastMessage: IRoom['lastMessage']): Promise; + getLastMessageUpdateQuery(lastMessage: IRoom['lastMessage'], roomUpdater: Updater): Updater; resetLastMessageById(rid: string, lastMessage: IMessage | null, msgCountDelta?: number): Promise; replaceUsername(username: string, newUsername: string): Promise; replaceMutedUsername(username: string, newUsername: string): Promise; diff --git a/packages/model-typings/src/models/IVideoConferenceModel.ts b/packages/model-typings/src/models/IVideoConferenceModel.ts index 5653859f04f6..8ef775fb6082 100644 --- a/packages/model-typings/src/models/IVideoConferenceModel.ts +++ b/packages/model-typings/src/models/IVideoConferenceModel.ts @@ -61,4 +61,10 @@ export interface IVideoConferenceModel extends IBaseModel { updateUserReferences(userId: IUser['_id'], username: IUser['username'], name: IUser['name']): Promise; increaseAnonymousCount(callId: IGroupVideoConference['_id']): Promise; + + unsetDiscussionRidById(callId: string): Promise; + + setDiscussionRidById(callId: string, discussionRid: IRoom['_id']): Promise; + + unsetDiscussionRid(discussionRid: IRoom['_id']): Promise; } diff --git a/packages/model-typings/src/updater.ts b/packages/model-typings/src/updater.ts new file mode 100644 index 000000000000..7743430ad4b8 --- /dev/null +++ b/packages/model-typings/src/updater.ts @@ -0,0 +1,38 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import type { Join, NestedPaths, PropertyType, ArrayElement, NestedPathsOfType, UpdateFilter } from 'mongodb'; + +export interface Updater { + set

    , K extends keyof P>(key: K, value: P[K]): Updater; + unset>(key: K): Updater; + inc>(key: K, value: number): Updater; + addToSet>(key: K, value: ArrayElementType[K]>): Updater; + hasChanges(): boolean; + getUpdateFilter(): UpdateFilter; +} + +type ArrayElementType = T extends (infer E)[] ? E : T; + +export type SetProps = Readonly< + { + [Property in Join, '.'>]: PropertyType; + } & { + [Property in `${NestedPathsOfType}.$${`[${string}]` | ''}`]: ArrayElement< + PropertyType + >; + } & { + [Property in `${NestedPathsOfType[]>}.$${`[${string}]` | ''}.${string}`]: any; + } +>; + +type GetType = { + [Key in keyof T]: K extends T[Key] ? T[Key] : never; +}; + +type OmitNever = { [K in keyof T as T[K] extends never ? never : K]: T[K] }; + +// only allow optional properties +export type UnsetProps = OmitNever, undefined>>; + +export type IncProps = OmitNever, number>>; + +export type AddToSetProps = OmitNever, any[]>>; diff --git a/packages/models/CHANGELOG.md b/packages/models/CHANGELOG.md index 4b30b3f974ce..e2b984708aaa 100644 --- a/packages/models/CHANGELOG.md +++ b/packages/models/CHANGELOG.md @@ -1,5 +1,101 @@ # @rocket.chat/models +## 0.2.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +-

    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 264d7d5496]: + + - @rocket.chat/model-typings@0.6.0 +
    + +## 0.2.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/model-typings@0.6.0-rc.6 +
    + +## 0.2.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/model-typings@0.6.0-rc.5 +
    + +## 0.2.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/model-typings@0.6.0-rc.4 +
    + +## 0.2.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/model-typings@0.6.0-rc.3 +
    + +## 0.2.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/model-typings@0.6.0-rc.2 +
    + +## 0.2.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + - @rocket.chat/model-typings@0.6.0-rc.1 +
    + +## 0.2.0-rc.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +-
    Updated dependencies [439faa87d3, 03c8b066f9, 2d89a0c448, 439faa87d3, 264d7d5496]: + + - @rocket.chat/model-typings@0.6.0-rc.0 +
    + +### Patch Changes + +-
    Updated dependencies []: + - @rocket.chat/model-typings@0.5.2 +
    + +## 0.1.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/model-typings@0.5.1 +
    + ## 0.1.0 ### Minor Changes diff --git a/packages/models/jest.config.ts b/packages/models/jest.config.ts index eb3f38119a73..c18c8ae02465 100644 --- a/packages/models/jest.config.ts +++ b/packages/models/jest.config.ts @@ -1,14 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', - errorOnDeprecated: true, - testEnvironment: 'jsdom', - modulePathIgnorePatterns: ['/dist/'], - testMatch: ['**/**.spec.ts'], - transform: { - '^.+\\.(t|j)sx?$': '@swc/jest', - }, - moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', - }, - collectCoverage: true, -}; + preset: server.preset, +} satisfies Config; diff --git a/packages/models/package.json b/packages/models/package.json index c5e9cfff578e..19f1f28438f6 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -1,25 +1,24 @@ { "name": "@rocket.chat/models", - "version": "0.1.0", + "version": "0.2.0", "private": true, "devDependencies": { - "@swc/core": "^1.3.95", - "@swc/jest": "^0.2.29", - "@types/jest": "~29.5.7", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "^29.7.0", "typescript": "~5.3.3" }, "dependencies": { - "@rocket.chat/model-typings": "workspace:^" + "@rocket.chat/model-typings": "workspace:~" }, "scripts": { + "build": "rm -rf dist && tsc", + "dev": "tsc --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", "test": "jest", - "dev": "tsc --watch --preserveWatchOutput -p tsconfig.json", - "build": "rm -rf dist && tsc -p tsconfig.json", "unit": "jest", "testunit": "jest" }, diff --git a/packages/models/src/index.ts b/packages/models/src/index.ts index e1cf91f1b0ee..655a94923feb 100644 --- a/packages/models/src/index.ts +++ b/packages/models/src/index.ts @@ -88,6 +88,7 @@ export function getCollectionName(name: string): string { } export { registerModel } from './proxify'; +export { type Updater, UpdaterImpl } from './updater'; export const Apps = proxify('IAppsModel'); export const AppsTokens = proxify('IAppsTokensModel'); diff --git a/packages/models/src/updater.spec.ts b/packages/models/src/updater.spec.ts new file mode 100644 index 000000000000..bdae43e338f3 --- /dev/null +++ b/packages/models/src/updater.spec.ts @@ -0,0 +1,152 @@ +import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; + +import { UpdaterImpl } from './updater'; + +test('updater typings', () => { + const updater = new UpdaterImpl<{ + _id: string; + t: 'l'; + a: { + b: string; + }; + c?: number; + + d?: { + e: string; + }; + e: string[]; + }>(); + + // @ts-expect-error: it should not allow any string to `t` only `l` is allowed + updater.set('t', 'a'); + // `l` is allowed + updater.set('t', 'l'); + + // `a` is { b: string } + updater.set('a', { b: 'test' }); + updater.set('a.b', 'test'); + // @ts-expect-error: it should not allow strings to `a`, a is an object containing `b: string` + updater.set('a', 'b'); + // @ts-expect-error: `a` is not optional so unset is not allowed + updater.unset('a'); + // @ts-expect-error: strings cannot be incremented + updater.inc('a', 1); + + // `c` is number but it should be optional, so unset is allowed + updater.unset('c'); + updater.set('c', 1); + // @ts-expect-error: `c` is a number + updater.set('c', 'b'); + // inc is allowed for numbers + updater.inc('c', 1); + + // `d` is { e: string } but it should be optional, so unset is allowed + updater.unset('d'); + updater.set('d', { e: 'a' }); + // @ts-expect-error: `d` is an object + updater.set('d', 'a'); + + // @ts-expect-error: it should not allow numbers, since e is a string + updater.addToSet('e', 1); + // @ts-expect-error: it should not allow strings, since a is an object + updater.addToSet('a', 'b'); + + updater.addToSet('e', 'a'); + // @ts-expect-error: it should not allow `njame` its not specified in the model + updater.set('njame', 1); + + // `d` is { e: string } and also it should be optional, so unset is allowed + updater.unset('d.e'); + // @ts-expect-error: `d` is an object cannot be incremented + updater.inc('d', 1); + + // `activity` is a string + const omnichannel = new UpdaterImpl(); + omnichannel.addToSet('v.activity', 'asd'); + // @ts-expect-error: it should not allow numbers, since activity is a string + omnichannel.addToSet('v.activity', 1); + // @ts-expect-error: it should not allow objects, since activity is a string + omnichannel.addToSet('v.activity', { + asdas: 1, + }); + // @ts-expect-error: it should not allow sub properties, since activity is a string + omnichannel.addToSet('v.activity.asd', { + asdas: 1, + }); +}); + +test('updater $set operations', async () => { + const updater = new UpdaterImpl<{ + _id: string; + t: 'l'; + a: { + b: string; + }; + c?: number; + }>(); + + updater.set('a', { + b: 'set', + }); + + expect(updater.getUpdateFilter()).toEqual({ $set: { a: { b: 'set' } } }); +}); + +test('updater $unset operations', async () => { + const updater = new UpdaterImpl<{ + _id: string; + t: 'l'; + a: { + b: string; + }; + c?: number; + }>(); + updater.unset('c'); + expect(updater.getUpdateFilter()).toEqual({ $unset: { c: 1 } }); +}); + +test('updater inc multiple operations', async () => { + const updater = new UpdaterImpl<{ + _id: string; + t: 'l'; + a: { + b: string; + }; + c?: number; + }>(); + + updater.inc('c', 1); + updater.inc('c', 1); + + expect(updater.getUpdateFilter()).toEqual({ $inc: { c: 2 } }); +}); + +test('it should add items to array', async () => { + const updater = new UpdaterImpl<{ + _id: string; + a: string[]; + }>(); + + updater.addToSet('a', 'b'); + updater.addToSet('a', 'c'); + + expect(updater.getUpdateFilter()).toEqual({ $addToSet: { a: { $each: ['b', 'c'] } } }); +}); + +test('it should getUpdateFilter only once', async () => { + const updater = new UpdaterImpl<{ + _id: string; + t: 'l'; + a: { + b: string; + }; + c?: number; + }>(); + + updater.set('a', { + b: 'set', + }); + + expect(updater.getUpdateFilter()).toEqual({ $set: { a: { b: 'set' } } }); + expect(() => updater.getUpdateFilter()).toThrow(); +}); diff --git a/packages/models/src/updater.ts b/packages/models/src/updater.ts new file mode 100644 index 000000000000..4f7ad271f397 --- /dev/null +++ b/packages/models/src/updater.ts @@ -0,0 +1,79 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import type { Updater, SetProps, UnsetProps, IncProps, AddToSetProps } from '@rocket.chat/model-typings'; +import type { UpdateFilter } from 'mongodb'; + +type ArrayElementType = T extends (infer E)[] ? E : T; + +type Keys = keyof SetProps; + +export class UpdaterImpl implements Updater { + private _set: Map, any> | undefined; + + private _unset: Set> | undefined; + + private _inc: Map, number> | undefined; + + private _addToSet: Map, any[]> | undefined; + + private dirty = false; + + set

    , K extends keyof P>(key: K, value: P[K]) { + this._set = this._set ?? new Map, any>(); + this._set.set(key as Keys, value); + return this; + } + + unset>(key: K): Updater { + this._unset = this._unset ?? new Set>(); + this._unset.add(key); + return this; + } + + inc>(key: K, value: number): Updater { + this._inc = this._inc ?? new Map, number>(); + + const prev = this._inc.get(key) ?? 0; + this._inc.set(key, prev + value); + return this; + } + + addToSet>(key: K, value: ArrayElementType[K]>): Updater { + this._addToSet = this._addToSet ?? new Map, any[]>(); + + const prev = this._addToSet.get(key) ?? []; + this._addToSet.set(key, [...prev, value]); + return this; + } + + hasChanges() { + const filter = this._getUpdateFilter(); + return this._hasChanges(filter); + } + + private _hasChanges(filter: UpdateFilter) { + return Object.keys(filter).length > 0; + } + + private _getUpdateFilter() { + return { + ...(this._set && { $set: Object.fromEntries(this._set) }), + ...(this._unset && { $unset: Object.fromEntries([...this._unset.values()].map((k) => [k, 1])) }), + ...(this._inc && { $inc: Object.fromEntries(this._inc) }), + ...(this._addToSet && { $addToSet: Object.fromEntries([...this._addToSet.entries()].map(([k, v]) => [k, { $each: v }])) }), + } as unknown as UpdateFilter; + } + + getUpdateFilter() { + if (this.dirty) { + throw new Error('Updater is dirty'); + } + this.dirty = true; + const filter = this._getUpdateFilter(); + if (!this._hasChanges(filter)) { + throw new Error('No changes to update'); + } + return filter; + } +} + +export { Updater }; diff --git a/packages/node-poplib/package.json b/packages/node-poplib/package.json index 9e9a112945e6..a232d6b4c476 100644 --- a/packages/node-poplib/package.json +++ b/packages/node-poplib/package.json @@ -3,15 +3,9 @@ "version": "0.0.2", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, - "scripts": { - "test": "jest" - }, "main": "./src/index.js", "typings": "./dist/index.d.ts" } diff --git a/packages/password-policies/jest.config.ts b/packages/password-policies/jest.config.ts index 959a31a7c6bf..c18c8ae02465 100644 --- a/packages/password-policies/jest.config.ts +++ b/packages/password-policies/jest.config.ts @@ -1,3 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', -}; + preset: server.preset, +} satisfies Config; diff --git a/packages/password-policies/package.json b/packages/password-policies/package.json index 4b2f0c76b7ae..d53ffa1f5249 100644 --- a/packages/password-policies/package.json +++ b/packages/password-policies/package.json @@ -3,20 +3,20 @@ "version": "0.0.2", "private": true, "devDependencies": { - "@types/chai": "~4.3.16", - "@types/jest": "~29.5.7", - "chai": "^4.3.10", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "scripts": { + "build": "rm -rf dist && tsc", + "dev": "tsc --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "testunit": "jest", - "build": "rm -rf dist && tsc -p tsconfig.json", - "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" + "test": "jest", + "testunit": "jest" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", diff --git a/packages/password-policies/src/PasswordPolicy.spec.ts b/packages/password-policies/src/PasswordPolicy.spec.ts new file mode 100644 index 000000000000..c85cfc64586e --- /dev/null +++ b/packages/password-policies/src/PasswordPolicy.spec.ts @@ -0,0 +1,219 @@ +import { PasswordPolicy } from './PasswordPolicy'; + +describe('Password tests with default options', () => { + it('should allow all passwords', () => { + const passwordPolicy = new PasswordPolicy({ throwError: false }); + expect(passwordPolicy.validate(null as any)).toBe(false); + expect(passwordPolicy.validate(undefined as any)).toBe(false); + expect(passwordPolicy.validate('')).toBe(false); + expect(passwordPolicy.validate(' ')).toBe(false); + expect(passwordPolicy.validate('a')).toBe(true); + expect(passwordPolicy.validate('aaaaaaaaa')).toBe(true); + }); +}); + +describe('Password tests with options', () => { + it('should not allow non string or empty', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + throwError: false, + }); + expect(passwordPolicy.validate(null as any)).toBe(false); + expect(passwordPolicy.validate(undefined as any)).toBe(false); + expect(passwordPolicy.validate(1 as any)).toBe(false); + expect(passwordPolicy.validate(true as any)).toBe(false); + expect(passwordPolicy.validate(new Date() as any)).toBe(false); + expect(passwordPolicy.validate(new Function() as any)).toBe(false); + expect(passwordPolicy.validate('')).toBe(false); + }); + + it('should restrict by minLength', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + minLength: 5, + throwError: false, + }); + + expect(passwordPolicy.validate('1')).toBe(false); + expect(passwordPolicy.validate('1234')).toBe(false); + expect(passwordPolicy.validate('12345')).toBe(true); + expect(passwordPolicy.validate(' ')).toBe(false); + }); + + it('should restrict by maxLength', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + maxLength: 5, + throwError: false, + }); + + expect(passwordPolicy.validate('1')).toBe(true); + expect(passwordPolicy.validate('12345')).toBe(true); + expect(passwordPolicy.validate('123456')).toBe(false); + expect(passwordPolicy.validate(' ')).toBe(false); + }); + + it('should allow repeated characters', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + forbidRepeatingCharacters: false, + throwError: false, + }); + + expect(passwordPolicy.validate('1')).toBe(true); + expect(passwordPolicy.validate('12345')).toBe(true); + expect(passwordPolicy.validate('123456')).toBe(true); + expect(passwordPolicy.validate(' ')).toBe(false); + expect(passwordPolicy.validate('11111111111111')).toBe(true); + }); + + it('should restrict repeated characters', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + forbidRepeatingCharacters: true, + forbidRepeatingCharactersCount: 3, + throwError: false, + }); + + expect(passwordPolicy.validate('1')).toBe(true); + expect(passwordPolicy.validate('11')).toBe(true); + expect(passwordPolicy.validate('111')).toBe(true); + expect(passwordPolicy.validate('1111')).toBe(false); + expect(passwordPolicy.validate(' ')).toBe(false); + expect(passwordPolicy.validate('123456')).toBe(true); + }); + + it('should restrict repeated characters customized', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + forbidRepeatingCharacters: true, + forbidRepeatingCharactersCount: 5, + throwError: false, + }); + + expect(passwordPolicy.validate('1')).toBe(true); + expect(passwordPolicy.validate('11')).toBe(true); + expect(passwordPolicy.validate('111')).toBe(true); + expect(passwordPolicy.validate('1111')).toBe(true); + expect(passwordPolicy.validate('11111')).toBe(true); + expect(passwordPolicy.validate('111111')).toBe(false); + expect(passwordPolicy.validate(' ')).toBe(false); + expect(passwordPolicy.validate('123456')).toBe(true); + }); + + it('should contain one lowercase', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + mustContainAtLeastOneLowercase: true, + throwError: false, + }); + + expect(passwordPolicy.validate('a')).toBe(true); + expect(passwordPolicy.validate('aa')).toBe(true); + expect(passwordPolicy.validate('A')).toBe(false); + expect(passwordPolicy.validate(' ')).toBe(false); + expect(passwordPolicy.validate('123456')).toBe(false); + expect(passwordPolicy.validate('AAAAA')).toBe(false); + expect(passwordPolicy.validate('AAAaAAA')).toBe(true); + }); + + it('should contain one uppercase', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + mustContainAtLeastOneUppercase: true, + throwError: false, + }); + + expect(passwordPolicy.validate('a')).toBe(false); + expect(passwordPolicy.validate('aa')).toBe(false); + expect(passwordPolicy.validate('A')).toBe(true); + expect(passwordPolicy.validate(' ')).toBe(false); + expect(passwordPolicy.validate('123456')).toBe(false); + expect(passwordPolicy.validate('AAAAA')).toBe(true); + expect(passwordPolicy.validate('AAAaAAA')).toBe(true); + }); + + it('should contain one number', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + mustContainAtLeastOneNumber: true, + throwError: false, + }); + + expect(passwordPolicy.validate('a')).toBe(false); + expect(passwordPolicy.validate('aa')).toBe(false); + expect(passwordPolicy.validate('A')).toBe(false); + expect(passwordPolicy.validate(' ')).toBe(false); + expect(passwordPolicy.validate('123456')).toBe(true); + expect(passwordPolicy.validate('AAAAA')).toBe(false); + expect(passwordPolicy.validate('AAAaAAA')).toBe(false); + expect(passwordPolicy.validate('AAAa1AAA')).toBe(true); + }); + + it('should contain one special character', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + mustContainAtLeastOneSpecialCharacter: true, + throwError: false, + }); + + expect(passwordPolicy.validate('a')).toBe(false); + expect(passwordPolicy.validate('aa')).toBe(false); + expect(passwordPolicy.validate('A')).toBe(false); + expect(passwordPolicy.validate(' ')).toBe(false); + expect(passwordPolicy.validate('123456')).toBe(false); + expect(passwordPolicy.validate('AAAAA')).toBe(false); + expect(passwordPolicy.validate('AAAaAAA')).toBe(false); + expect(passwordPolicy.validate('AAAa1AAA')).toBe(false); + expect(passwordPolicy.validate('AAAa@AAA')).toBe(true); + }); +}); + +describe('Password Policy', () => { + it('should return a correct password policy', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + throwError: false, + minLength: 10, + maxLength: 20, + forbidRepeatingCharacters: true, + forbidRepeatingCharactersCount: 4, + mustContainAtLeastOneLowercase: true, + mustContainAtLeastOneUppercase: true, + mustContainAtLeastOneNumber: true, + mustContainAtLeastOneSpecialCharacter: true, + }); + + const policy = passwordPolicy.getPasswordPolicy(); + + expect(policy).not.toBe(undefined); + expect(policy.enabled).toBe(true); + expect(policy.policy.length).toBe(8); + expect(policy.policy[0][0]).toBe('get-password-policy-minLength'); + expect(policy.policy[0][1]?.minLength).toBe(10); + }); + + it('should return correct values if policy is disabled', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: false, + }); + + const policy = passwordPolicy.getPasswordPolicy(); + + expect(policy.enabled).toBe(false); + expect(policy.policy.length).toBe(0); + }); + + it('should return correct values if policy is enabled but no specifiers exists', () => { + const passwordPolicy = new PasswordPolicy({ + enabled: true, + }); + + const policy = passwordPolicy.getPasswordPolicy(); + + expect(policy.enabled).toBe(true); + // even when no policy is specified, forbidRepeatingCharactersCount is still configured + // since its default value is 3 + expect(policy.policy.length).toBe(1); + }); +}); diff --git a/packages/password-policies/src/PasswordPolicyClass.ts b/packages/password-policies/src/PasswordPolicy.ts similarity index 100% rename from packages/password-policies/src/PasswordPolicyClass.ts rename to packages/password-policies/src/PasswordPolicy.ts diff --git a/packages/password-policies/src/index.ts b/packages/password-policies/src/index.ts index ce94042e029a..fe91af266a93 100644 --- a/packages/password-policies/src/index.ts +++ b/packages/password-policies/src/index.ts @@ -1 +1 @@ -export { PasswordPolicy } from './PasswordPolicyClass'; +export { PasswordPolicy } from './PasswordPolicy'; diff --git a/packages/password-policies/tests/passwordPolicyClass.test.ts b/packages/password-policies/tests/passwordPolicyClass.test.ts deleted file mode 100644 index 4cda16e3dd27..000000000000 --- a/packages/password-policies/tests/passwordPolicyClass.test.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { expect } from 'chai'; - -import { PasswordPolicy } from '../src/PasswordPolicyClass'; - -describe('PasswordPolicy', () => { - describe('Password tests with default options', () => { - it('should allow all passwords', () => { - const passwordPolicy = new PasswordPolicy({ throwError: false }); - expect(passwordPolicy.validate(null as any)).to.be.equal(false); - expect(passwordPolicy.validate(undefined as any)).to.be.equal(false); - expect(passwordPolicy.validate('')).to.be.equal(false); - expect(passwordPolicy.validate(' ')).to.be.equal(false); - expect(passwordPolicy.validate('a')).to.be.equal(true); - expect(passwordPolicy.validate('aaaaaaaaa')).to.be.equal(true); - }); - }); - - describe('Password tests with options', () => { - it('should not allow non string or empty', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - throwError: false, - }); - expect(passwordPolicy.validate(null as any)).to.be.equal(false); - expect(passwordPolicy.validate(undefined as any)).to.be.false; - expect(passwordPolicy.validate(1 as any)).to.be.false; - expect(passwordPolicy.validate(true as any)).to.be.false; - expect(passwordPolicy.validate(new Date() as any)).to.be.false; - expect(passwordPolicy.validate(new Function() as any)).to.be.false; - expect(passwordPolicy.validate('')).to.be.false; - }); - - it('should restrict by minLength', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - minLength: 5, - throwError: false, - }); - - expect(passwordPolicy.validate('1')).to.be.false; - expect(passwordPolicy.validate('1234')).to.be.false; - expect(passwordPolicy.validate('12345')).to.be.true; - expect(passwordPolicy.validate(' ')).to.be.false; - }); - - it('should restrict by maxLength', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - maxLength: 5, - throwError: false, - }); - - expect(passwordPolicy.validate('1')).to.be.true; - expect(passwordPolicy.validate('12345')).to.be.true; - expect(passwordPolicy.validate('123456')).to.be.false; - expect(passwordPolicy.validate(' ')).to.be.false; - }); - - it('should allow repeated characters', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - forbidRepeatingCharacters: false, - throwError: false, - }); - - expect(passwordPolicy.validate('1')).to.be.true; - expect(passwordPolicy.validate('12345')).to.be.true; - expect(passwordPolicy.validate('123456')).to.be.true; - expect(passwordPolicy.validate(' ')).to.be.false; - expect(passwordPolicy.validate('11111111111111')).to.be.true; - }); - - it('should restrict repeated characters', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - forbidRepeatingCharacters: true, - forbidRepeatingCharactersCount: 3, - throwError: false, - }); - - expect(passwordPolicy.validate('1')).to.be.true; - expect(passwordPolicy.validate('11')).to.be.true; - expect(passwordPolicy.validate('111')).to.be.true; - expect(passwordPolicy.validate('1111')).to.be.false; - expect(passwordPolicy.validate(' ')).to.be.false; - expect(passwordPolicy.validate('123456')).to.be.true; - }); - - it('should restrict repeated characters customized', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - forbidRepeatingCharacters: true, - forbidRepeatingCharactersCount: 5, - throwError: false, - }); - - expect(passwordPolicy.validate('1')).to.be.true; - expect(passwordPolicy.validate('11')).to.be.true; - expect(passwordPolicy.validate('111')).to.be.true; - expect(passwordPolicy.validate('1111')).to.be.true; - expect(passwordPolicy.validate('11111')).to.be.true; - expect(passwordPolicy.validate('111111')).to.be.false; - expect(passwordPolicy.validate(' ')).to.be.false; - expect(passwordPolicy.validate('123456')).to.be.true; - }); - - it('should contain one lowercase', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - mustContainAtLeastOneLowercase: true, - throwError: false, - }); - - expect(passwordPolicy.validate('a')).to.be.true; - expect(passwordPolicy.validate('aa')).to.be.true; - expect(passwordPolicy.validate('A')).to.be.false; - expect(passwordPolicy.validate(' ')).to.be.false; - expect(passwordPolicy.validate('123456')).to.be.false; - expect(passwordPolicy.validate('AAAAA')).to.be.false; - expect(passwordPolicy.validate('AAAaAAA')).to.be.true; - }); - - it('should contain one uppercase', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - mustContainAtLeastOneUppercase: true, - throwError: false, - }); - - expect(passwordPolicy.validate('a')).to.be.false; - expect(passwordPolicy.validate('aa')).to.be.false; - expect(passwordPolicy.validate('A')).to.be.true; - expect(passwordPolicy.validate(' ')).to.be.false; - expect(passwordPolicy.validate('123456')).to.be.false; - expect(passwordPolicy.validate('AAAAA')).to.be.true; - expect(passwordPolicy.validate('AAAaAAA')).to.be.true; - }); - - it('should contain one number', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - mustContainAtLeastOneNumber: true, - throwError: false, - }); - - expect(passwordPolicy.validate('a')).to.be.false; - expect(passwordPolicy.validate('aa')).to.be.false; - expect(passwordPolicy.validate('A')).to.be.false; - expect(passwordPolicy.validate(' ')).to.be.false; - expect(passwordPolicy.validate('123456')).to.be.true; - expect(passwordPolicy.validate('AAAAA')).to.be.false; - expect(passwordPolicy.validate('AAAaAAA')).to.be.false; - expect(passwordPolicy.validate('AAAa1AAA')).to.be.true; - }); - - it('should contain one special character', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - mustContainAtLeastOneSpecialCharacter: true, - throwError: false, - }); - - expect(passwordPolicy.validate('a')).to.be.false; - expect(passwordPolicy.validate('aa')).to.be.false; - expect(passwordPolicy.validate('A')).to.be.false; - expect(passwordPolicy.validate(' ')).to.be.false; - expect(passwordPolicy.validate('123456')).to.be.false; - expect(passwordPolicy.validate('AAAAA')).to.be.false; - expect(passwordPolicy.validate('AAAaAAA')).to.be.false; - expect(passwordPolicy.validate('AAAa1AAA')).to.be.false; - expect(passwordPolicy.validate('AAAa@AAA')).to.be.true; - }); - }); - - describe('Password Policy', () => { - it('should return a correct password policy', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - throwError: false, - minLength: 10, - maxLength: 20, - forbidRepeatingCharacters: true, - forbidRepeatingCharactersCount: 4, - mustContainAtLeastOneLowercase: true, - mustContainAtLeastOneUppercase: true, - mustContainAtLeastOneNumber: true, - mustContainAtLeastOneSpecialCharacter: true, - }); - - const policy = passwordPolicy.getPasswordPolicy(); - - expect(policy).to.not.be.undefined; - expect(policy.enabled).to.be.true; - expect(policy.policy.length).to.be.equal(8); - expect(policy.policy[0][0]).to.be.equal('get-password-policy-minLength'); - expect(policy.policy[0][1]?.minLength).to.be.equal(10); - }); - - it('should return correct values if policy is disabled', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: false, - }); - - const policy = passwordPolicy.getPasswordPolicy(); - - expect(policy.enabled).to.be.false; - expect(policy.policy.length).to.be.equal(0); - }); - - it('should return correct values if policy is enabled but no specifiers exists', () => { - const passwordPolicy = new PasswordPolicy({ - enabled: true, - }); - - const policy = passwordPolicy.getPasswordPolicy(); - - expect(policy.enabled).to.be.true; - // even when no policy is specified, forbidRepeatingCharactersCount is still configured - // since its default value is 3 - expect(policy.policy.length).to.be.equal(1); - }); - }); -}); diff --git a/packages/patch-injection/jest.config.ts b/packages/patch-injection/jest.config.ts index 959a31a7c6bf..c18c8ae02465 100644 --- a/packages/patch-injection/jest.config.ts +++ b/packages/patch-injection/jest.config.ts @@ -1,3 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', -}; + preset: server.preset, +} satisfies Config; diff --git a/packages/patch-injection/package.json b/packages/patch-injection/package.json index e90f662ac202..99f676bff831 100644 --- a/packages/patch-injection/package.json +++ b/packages/patch-injection/package.json @@ -3,18 +3,19 @@ "version": "0.0.1", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "scripts": { + "build": "rm -rf dist && tsc", + "dev": "tsc --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "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" + "test": "jest" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", diff --git a/packages/patch-injection/src/makeFunction.spec.ts b/packages/patch-injection/src/makeFunction.spec.ts new file mode 100644 index 000000000000..f88efff2be49 --- /dev/null +++ b/packages/patch-injection/src/makeFunction.spec.ts @@ -0,0 +1,236 @@ +import { makeFunction } from './makeFunction'; + +describe('Make a simple function', () => { + it('should execute the function passed as argument', () => { + const fn = makeFunction(() => { + throw new Error('function was called'); + }); + + expect(fn).toThrow('function was called'); + }); + + it('should return the result of the internal function', () => { + const fn = makeFunction(() => 15); + + expect(fn()).toBe(15); + }); +}); + +describe('Replace a simple function', () => { + it('should execute the patched function', () => { + const fn = makeFunction(() => { + throw new Error('function was called'); + }); + + fn.patch(() => { + throw new Error('patch was called'); + }); + + expect(fn).toThrow('patch was called'); + }); + + it('should return the result of the patched function', () => { + const fn = makeFunction(() => 15); + + fn.patch(() => 20); + + expect(fn()).toBe(20); + }); +}); + +describe('Remove a patch', () => { + it('should execute the function passed as argument', () => { + const fn = makeFunction(() => { + throw new Error('function was called'); + }); + + const remove = fn.patch(() => { + throw new Error('patch was called'); + }); + + expect(fn).toThrow('patch was called'); + + remove(); + + expect(fn).toThrow('function was called'); + }); + + it('should return the result of the internal function', () => { + const fn = makeFunction(() => 15); + + const remove = fn.patch(() => 20); + + expect(fn()).toBe(20); + + remove(); + + expect(fn()).toBe(15); + }); +}); + +describe('Patch Condition', () => { + it('should execute either function depending if the patch is enabled or not', () => { + const fn = makeFunction(() => { + throw new Error('function was called'); + }); + + let enabled = false; + + fn.patch( + () => { + throw new Error('patch was called'); + }, + () => enabled, + ); + + expect(fn).toThrow('function was called'); + enabled = true; + expect(fn).toThrow('patch was called'); + enabled = false; + expect(fn).toThrow('function was called'); + }); + + it('should return the value of the right function based on the condition', () => { + const fn = makeFunction(() => 15); + + let enabled = false; + + fn.patch( + () => 20, + () => enabled, + ); + + expect(fn()).toBe(15); + enabled = true; + expect(fn()).toBe(20); + enabled = false; + expect(fn()).toBe(15); + }); +}); + +describe('Chained calls', () => { + it('Should call the inner function', () => { + const fn = makeFunction(() => { + throw new Error('function was called'); + }); + + fn.patch((next) => { + next(); + throw new Error('patch was called'); + }); + + expect(fn).toThrow('function was called'); + }); + + it('should return the sum of values', () => { + const fn = makeFunction(() => 15); + + fn.patch((next) => 20 + next()); + + expect(fn()).toBe(35); + }); + + it('should send the parameters in the correct order every time', () => { + const fn = makeFunction((a: string, b: string) => `3=${[a, b].join('')}`); + + fn.patch((next, a, b) => `2=${[a, b].join('')},${next('E', 'F')}`); + fn.patch((next, a, b) => `1=${[a, b].join('')},${next('C', 'D')}`); + + expect(fn('A', 'B')).toBe('1=AB,2=CD,3=EF'); + }); +}); + +describe('Multiple patches', () => { + it('Should call the right version of the function', () => { + const fn = makeFunction(() => { + throw new Error('function was called'); + }); + + const remove = fn.patch(() => { + throw new Error('patch was called'); + }); + + const remove2 = fn.patch(() => { + throw new Error('second patch was called'); + }); + + expect(fn).toThrow('second patch was called'); + remove2(); + expect(fn).toThrow('patch was called'); + remove(); + expect(fn).toThrow('function was called'); + }); + + it('Should respect conditions and removals', () => { + const fn = makeFunction(() => { + throw new Error('function was called'); + }); + + let enabled = true; + let enabled2 = true; + + const remove = fn.patch( + () => { + throw new Error('patch was called'); + }, + () => enabled, + ); + + const remove2 = fn.patch( + () => { + throw new Error('second patch was called'); + }, + () => enabled2, + ); + + expect(fn).toThrow('second patch was called'); + enabled2 = false; + expect(fn).toThrow('patch was called'); + enabled = false; + expect(fn).toThrow('function was called'); + enabled2 = true; + expect(fn).toThrow('second patch was called'); + enabled = true; + remove2(); + expect(fn).toThrow('patch was called'); + remove(); + expect(fn).toThrow('function was called'); + }); + + it('should chain on the right order', () => { + const fn = makeFunction(() => [1]); + + let enabled2 = true; + let enabled3 = true; + let enabled4 = true; + + fn.patch( + (next) => [2].concat(next()), + () => enabled2, + ); + const remove3 = fn.patch( + (next) => [3].concat(next()), + () => enabled3, + ); + fn.patch( + (next) => [4].concat(next()), + () => enabled4, + ); + + expect(fn()).toStrictEqual([4, 3, 2, 1]); + + enabled2 = false; + expect(fn()).toStrictEqual([4, 3, 1]); + enabled4 = false; + expect(fn()).toStrictEqual([3, 1]); + enabled3 = false; + expect(fn()).toStrictEqual([1]); + enabled3 = true; + expect(fn()).toStrictEqual([3, 1]); + remove3(); + expect(fn()).toStrictEqual([1]); + enabled2 = true; + enabled4 = true; + expect(fn()).toStrictEqual([4, 2, 1]); + }); +}); diff --git a/packages/patch-injection/tests/patches.test.ts b/packages/patch-injection/tests/patches.test.ts deleted file mode 100644 index 74e3da93268a..000000000000 --- a/packages/patch-injection/tests/patches.test.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { expect } from 'chai'; - -import { makeFunction } from '../src/makeFunction'; - -describe('PatchCoordinator', () => { - describe('Make a simple function', () => { - it('should execute the function passed as argument', () => { - const fn = makeFunction(() => { - throw new Error('function was called'); - }); - - expect(fn).to.throw('function was called'); - }); - - it('should return the result of the internal function', () => { - const fn = makeFunction(() => 15); - - expect(fn()).to.be.equal(15); - }); - }); - - describe('Replace a simple function', () => { - it('should execute the patched function', () => { - const fn = makeFunction(() => { - throw new Error('function was called'); - }); - - fn.patch(() => { - throw new Error('patch was called'); - }); - - expect(fn).to.throw('patch was called'); - }); - - it('should return the result of the patched function', () => { - const fn = makeFunction(() => 15); - - fn.patch(() => 20); - - expect(fn()).to.be.equal(20); - }); - }); - - describe('Remove a patch', () => { - it('should execute the function passed as argument', () => { - const fn = makeFunction(() => { - throw new Error('function was called'); - }); - - const remove = fn.patch(() => { - throw new Error('patch was called'); - }); - - expect(fn).to.throw('patch was called'); - - remove(); - - expect(fn).to.throw('function was called'); - }); - - it('should return the result of the internal function', () => { - const fn = makeFunction(() => 15); - - const remove = fn.patch(() => 20); - - expect(fn()).to.be.equal(20); - - remove(); - - expect(fn()).to.be.equal(15); - }); - }); - - describe('Patch Condition', () => { - it('should execute either function depending if the patch is enabled or not', () => { - const fn = makeFunction(() => { - throw new Error('function was called'); - }); - - let enabled = false; - - fn.patch( - () => { - throw new Error('patch was called'); - }, - () => enabled, - ); - - expect(fn).to.throw('function was called'); - enabled = true; - expect(fn).to.throw('patch was called'); - enabled = false; - expect(fn).to.throw('function was called'); - }); - - it('should return the value of the right function based on the condition', () => { - const fn = makeFunction(() => 15); - - let enabled = false; - - fn.patch( - () => 20, - () => enabled, - ); - - expect(fn()).to.be.equal(15); - enabled = true; - expect(fn()).to.be.equal(20); - enabled = false; - expect(fn()).to.be.equal(15); - }); - }); - - describe('Chained calls', () => { - it('Should call the inner function', () => { - const fn = makeFunction(() => { - throw new Error('function was called'); - }); - - fn.patch((next) => { - next(); - throw new Error('patch was called'); - }); - - expect(fn).to.throw('function was called'); - }); - - it('should return the sum of values', () => { - const fn = makeFunction(() => 15); - - fn.patch((next) => 20 + next()); - - expect(fn()).to.be.equal(35); - }); - - it('should send the parameters in the correct order every time', () => { - const fn = makeFunction((a: string, b: string) => `3=${[a, b].join('')}`); - - fn.patch((next, a, b) => `2=${[a, b].join('')},${next('E', 'F')}`); - fn.patch((next, a, b) => `1=${[a, b].join('')},${next('C', 'D')}`); - - expect(fn('A', 'B')).to.be.equal('1=AB,2=CD,3=EF'); - }); - }); - - describe('Multiple patches', () => { - it('Should call the right version of the function', () => { - const fn = makeFunction(() => { - throw new Error('function was called'); - }); - - const remove = fn.patch(() => { - throw new Error('patch was called'); - }); - - const remove2 = fn.patch(() => { - throw new Error('second patch was called'); - }); - - expect(fn).to.throw('second patch was called'); - remove2(); - expect(fn).to.throw('patch was called'); - remove(); - expect(fn).to.throw('function was called'); - }); - - it('Should respect conditions and removals', () => { - const fn = makeFunction(() => { - throw new Error('function was called'); - }); - - let enabled = true; - let enabled2 = true; - - const remove = fn.patch( - () => { - throw new Error('patch was called'); - }, - () => enabled, - ); - - const remove2 = fn.patch( - () => { - throw new Error('second patch was called'); - }, - () => enabled2, - ); - - expect(fn).to.throw('second patch was called'); - enabled2 = false; - expect(fn).to.throw('patch was called'); - enabled = false; - expect(fn).to.throw('function was called'); - enabled2 = true; - expect(fn).to.throw('second patch was called'); - enabled = true; - remove2(); - expect(fn).to.throw('patch was called'); - remove(); - expect(fn).to.throw('function was called'); - }); - - it('should chain on the right order', () => { - const fn = makeFunction(() => [1]); - - let enabled2 = true; - let enabled3 = true; - let enabled4 = true; - - fn.patch( - (next) => [2].concat(next()), - () => enabled2, - ); - const remove3 = fn.patch( - (next) => [3].concat(next()), - () => enabled3, - ); - fn.patch( - (next) => [4].concat(next()), - () => enabled4, - ); - - expect(fn()).to.be.an('array').deep.equal([4, 3, 2, 1]); - - enabled2 = false; - expect(fn()).to.be.an('array').deep.equal([4, 3, 1]); - enabled4 = false; - expect(fn()).to.be.an('array').deep.equal([3, 1]); - enabled3 = false; - expect(fn()).to.be.an('array').deep.equal([1]); - enabled3 = true; - expect(fn()).to.be.an('array').deep.equal([3, 1]); - remove3(); - expect(fn()).to.be.an('array').deep.equal([1]); - enabled2 = true; - enabled4 = true; - expect(fn()).to.be.an('array').deep.equal([4, 2, 1]); - }); - }); -}); diff --git a/packages/peggy-loader/jest.config.js b/packages/peggy-loader/jest.config.js deleted file mode 100644 index 21526c604f6b..000000000000 --- a/packages/peggy-loader/jest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - preset: 'ts-jest', - errorOnDeprecated: true, - testMatch: ['/src/**/*.spec.[jt]s?(x)'], -}; diff --git a/packages/peggy-loader/package.json b/packages/peggy-loader/package.json index 2b1983bfa62a..5fa014da7f29 100644 --- a/packages/peggy-loader/package.json +++ b/packages/peggy-loader/package.json @@ -31,7 +31,7 @@ "build": "run-s .:build:clean .:build:esm .:build:cjs", ".:build:clean": "rimraf dist", ".:build:esm": "tsc -p tsconfig.json", - ".:build:cjs": "tsc -p tsconfig-cjs.json", + ".:build:cjs": "tsc -p tsconfig.cjs.json", "lint": "eslint src" }, "bugs": { @@ -50,8 +50,10 @@ "peggy": "3.0.2", "prettier": "~2.8.7", "rimraf": "^3.0.2", - "ts-jest": "~29.1.0", "typescript": "~5.3.3", "webpack": "~5.78.0" + }, + "volta": { + "extends": "../../package.json" } } diff --git a/packages/peggy-loader/tsconfig-cjs.json b/packages/peggy-loader/tsconfig.cjs.json similarity index 100% rename from packages/peggy-loader/tsconfig-cjs.json rename to packages/peggy-loader/tsconfig.cjs.json diff --git a/packages/random/jest.config.ts b/packages/random/jest.config.ts index 959a31a7c6bf..e6005852b621 100644 --- a/packages/random/jest.config.ts +++ b/packages/random/jest.config.ts @@ -1,3 +1,18 @@ +import client from '@rocket.chat/jest-presets/client'; +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', -}; + projects: [ + { + displayName: 'client', + preset: client.preset, + testMatch: ['/src/**/*.client.spec.[jt]s?(x)'], + }, + { + displayName: 'server', + preset: server.preset, + testMatch: ['/src/**/*.server.spec.[jt]s?(x)'], + }, + ], +} satisfies Config; diff --git a/packages/random/package.json b/packages/random/package.json index 343ce2344ab1..72fc8c5c566a 100644 --- a/packages/random/package.json +++ b/packages/random/package.json @@ -9,6 +9,7 @@ "scripts": { "build": "rm -rf dist && tsc -p tsconfig.build.json", "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint .", "lint:fix": "eslint . --fix", "test": "jest" @@ -17,12 +18,11 @@ "@babel/core": "~7.22.20", "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", + "@rocket.chat/jest-presets": "workspace:~", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.4", - "jest-environment-jsdom": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "volta": { diff --git a/packages/random/src/main.client.spec.ts b/packages/random/src/main.client.spec.ts index bde7b49b3b11..f5d4d278a5fa 100644 --- a/packages/random/src/main.client.spec.ts +++ b/packages/random/src/main.client.spec.ts @@ -1,7 +1,3 @@ -/** - * @jest-environment jsdom - */ - import { Random } from './main.client'; it('which should generate the same sequence in all environments', () => { diff --git a/packages/rest-typings/CHANGELOG.md b/packages/rest-typings/CHANGELOG.md index 00affd2f294b..efcab160b8e6 100644 --- a/packages/rest-typings/CHANGELOG.md +++ b/packages/rest-typings/CHANGELOG.md @@ -1,5 +1,117 @@ # @rocket.chat/rest-typings +## 6.11.0 + +### Minor Changes + +- ([#32800](https://github.com/RocketChat/Rocket.Chat/pull/32800)) Added the ability to filter chats by `queued` on the Current Chats Omnichannel page + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-

    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/ui-kit@0.36.0 +
    + +## 6.11.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 +
    + +## 6.11.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 +
    + +## 6.11.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 +
    + +## 6.11.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 +
    + +## 6.11.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 +
    + +## 6.11.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 +
    + +## 6.11.0-rc.0 + +### Minor Changes + +- ([#32800](https://github.com/RocketChat/Rocket.Chat/pull/32800)) Added the ability to filter chats by `queued` on the Current Chats Omnichannel page + +### Patch Changes + +- ([#32719](https://github.com/RocketChat/Rocket.Chat/pull/32719)) Added the `user` param to apps-engine update method call, allowing apps' new `onUpdate` hook to know who triggered the update. + +-
    Updated dependencies [2d89a0c448, 24f7df4894, b8e5887fb9]: + + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/ui-kit@0.36.0-rc.0 +
    + +## 6.10.2 + +### Patch Changes + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from being updated or uninstalled in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that prevented apps from handling errors during execution in some cases + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Improved Apps-Engine installation to prevent start up errors on manual installation setups + +- ([#32935](https://github.com/RocketChat/Rocket.Chat/pull/32935)) Fixed an issue that caused the video conference button on rooms to not recognize a video conference provider app in some cases + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 +
    + +## 6.10.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 +
    + ## 6.10.0 ### Minor Changes diff --git a/packages/rest-typings/jest.config.ts b/packages/rest-typings/jest.config.ts deleted file mode 100644 index e938f931d149..000000000000 --- a/packages/rest-typings/jest.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default { - preset: 'ts-jest', - errorOnDeprecated: true, - testEnvironment: 'jsdom', - modulePathIgnorePatterns: ['/dist/'], -}; diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 9be27e7634cb..6a5bf5464e98 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,22 +1,21 @@ { "name": "@rocket.chat/rest-typings", - "version": "6.11.0-develop", + "version": "6.12.0-develop", "devDependencies": { - "@rocket.chat/eslint-config": "workspace:^", - "@types/jest": "~29.5.7", + "@rocket.chat/eslint-config": "workspace:~", + "@types/jest": "~29.5.12", "eslint": "~8.45.0", - "jest": "~29.6.4", - "jest-environment-jsdom": "~29.6.4", + "jest": "~29.7.0", "mongodb": "^4.17.2", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "scripts": { + "build": "rm -rf dist && tsc", + "dev": "tsc --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "test": "jest", - "dev": "tsc --watch --preserveWatchOutput -p tsconfig.json", - "build": "rm -rf dist && tsc -p tsconfig.json" + "test": "jest" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", @@ -24,7 +23,7 @@ "/dist" ], "dependencies": { - "@rocket.chat/apps-engine": "alpha", + "@rocket.chat/apps-engine": "1.44.0", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/ui-kit": "workspace:~", diff --git a/packages/rest-typings/src/v1/omnichannel.ts b/packages/rest-typings/src/v1/omnichannel.ts index 3dad53cbe8d2..b8519bf8fe02 100644 --- a/packages/rest-typings/src/v1/omnichannel.ts +++ b/packages/rest-typings/src/v1/omnichannel.ts @@ -2552,6 +2552,7 @@ export type GETLivechatRoomsParams = PaginatedRequest<{ departmentId?: string; open?: string | boolean; onhold?: string | boolean; + queued?: string | boolean; tags?: string[]; }>; @@ -2617,6 +2618,12 @@ const GETLivechatRoomsParamsSchema = { { type: 'boolean', nullable: true }, ], }, + queued: { + anyOf: [ + { type: 'string', nullable: true }, + { type: 'boolean', nullable: true }, + ], + }, tags: { type: 'array', items: { @@ -3729,7 +3736,9 @@ export type OmnichannelEndpoints = { }; }; '/v1/livechat/agents/:agentId/departments': { - GET: (params?: GETLivechatAgentsAgentIdDepartmentsParams) => { departments: ILivechatDepartmentAgents[] }; + GET: (params?: GETLivechatAgentsAgentIdDepartmentsParams) => { + departments: (ILivechatDepartmentAgents & { departmentName: string })[]; + }; }; '/v1/livechat/business-hour': { GET: (params: GETBusinessHourParams) => { businessHour: ILivechatBusinessHour }; diff --git a/packages/rest-typings/src/v1/teams/index.ts b/packages/rest-typings/src/v1/teams/index.ts index 0a1583b66474..d63e6da8bd8a 100644 --- a/packages/rest-typings/src/v1/teams/index.ts +++ b/packages/rest-typings/src/v1/teams/index.ts @@ -89,6 +89,7 @@ export type TeamsEndpoints = { }; }; owner?: IUser['_id']; + sidepanel?: IRoom['sidepanel']; }) => { team: ITeam; }; diff --git a/packages/rest-typings/src/v1/users/UsersSetPreferenceParamsPOST.ts b/packages/rest-typings/src/v1/users/UsersSetPreferenceParamsPOST.ts index 1c89fdc04d5d..7ef41d363dea 100644 --- a/packages/rest-typings/src/v1/users/UsersSetPreferenceParamsPOST.ts +++ b/packages/rest-typings/src/v1/users/UsersSetPreferenceParamsPOST.ts @@ -1,4 +1,4 @@ -import type { ThemePreference } from '@rocket.chat/ui-theming/src/types/themes'; +import type { ThemePreference } from '@rocket.chat/core-typings'; import Ajv from 'ajv'; const ajv = new Ajv({ diff --git a/packages/server-cloud-communication/package.json b/packages/server-cloud-communication/package.json index 878a0565306b..8c970687ab8b 100644 --- a/packages/server-cloud-communication/package.json +++ b/packages/server-cloud-communication/package.json @@ -4,10 +4,7 @@ "private": true, "devDependencies": { "@rocket.chat/license": "workspace:^", - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "volta": { @@ -16,7 +13,6 @@ "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "test": "jest", "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" }, "main": "./src/index.ts", diff --git a/packages/server-fetch/package.json b/packages/server-fetch/package.json index e1527e928703..c98b4ba99e54 100644 --- a/packages/server-fetch/package.json +++ b/packages/server-fetch/package.json @@ -3,16 +3,12 @@ "version": "0.0.3", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "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" }, diff --git a/packages/sha256/jest.config.ts b/packages/sha256/jest.config.ts index 959a31a7c6bf..c18c8ae02465 100644 --- a/packages/sha256/jest.config.ts +++ b/packages/sha256/jest.config.ts @@ -1,3 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', -}; + preset: server.preset, +} satisfies Config; diff --git a/packages/sha256/package.json b/packages/sha256/package.json index 1b2f1fa6b523..6d10f5b80d65 100644 --- a/packages/sha256/package.json +++ b/packages/sha256/package.json @@ -8,6 +8,7 @@ "scripts": { "build": "rm -rf dist && tsc -p tsconfig.build.json", "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint .", "lint:fix": "eslint . --fix", "test": "jest" @@ -16,11 +17,11 @@ "@babel/core": "~7.22.20", "@babel/preset-env": "~7.22.20", "@rocket.chat/eslint-config": "workspace:^", + "@rocket.chat/jest-presets": "workspace:~", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "volta": { diff --git a/packages/tools/CHANGELOG.md b/packages/tools/CHANGELOG.md index 86ecb2a3c6ec..b74d4940c211 100644 --- a/packages/tools/CHANGELOG.md +++ b/packages/tools/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/tools +## 0.2.2 + +### Patch Changes + +- ([#32527](https://github.com/RocketChat/Rocket.Chat/pull/32527)) Fixed an inconsistent evaluation of the `Accounts_LoginExpiration` setting over the codebase. In some places, it was being used as milliseconds while in others as days. Invalid values produced different results. A helper function was created to centralize the setting validation and the proper value being returned to avoid edge cases. + Negative values may be saved on the settings UI panel but the code will interpret any negative, NaN or 0 value to the default expiration which is 90 days. + +## 0.2.2-rc.0 + +### Patch Changes + +- ([#32527](https://github.com/RocketChat/Rocket.Chat/pull/32527)) Fixed an inconsistent evaluation of the `Accounts_LoginExpiration` setting over the codebase. In some places, it was being used as milliseconds while in others as days. Invalid values produced different results. A helper function was created to centralize the setting validation and the proper value being returned to avoid edge cases. + Negative values may be saved on the settings UI panel but the code will interpret any negative, NaN or 0 value to the default expiration which is 90 days. + ## 0.2.1 ### Patch Changes diff --git a/packages/tools/jest.config.ts b/packages/tools/jest.config.ts index 959a31a7c6bf..46e41b9ab170 100644 --- a/packages/tools/jest.config.ts +++ b/packages/tools/jest.config.ts @@ -1,3 +1,7 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + export default { - preset: 'ts-jest', -}; + preset: server.preset, + testMatch: ['/src/**/*.spec.(ts|js|mjs)'], +} satisfies Config; diff --git a/packages/tools/package.json b/packages/tools/package.json index ac79955314b8..d1301efb7055 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -1,12 +1,12 @@ { "name": "@rocket.chat/tools", - "version": "0.2.1", + "version": "0.2.2", "private": true, "devDependencies": { - "@types/jest": "~29.5.7", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", "eslint": "~8.45.0", - "jest": "~29.6.4", - "ts-jest": "~29.1.1", + "jest": "~29.7.0", "typescript": "~5.3.3" }, "scripts": { diff --git a/packages/ui-avatar/CHANGELOG.md b/packages/ui-avatar/CHANGELOG.md index f45e6241438a..f65d986cfaf5 100644 --- a/packages/ui-avatar/CHANGELOG.md +++ b/packages/ui-avatar/CHANGELOG.md @@ -1,5 +1,95 @@ # @rocket.chat/ui-avatar +## 5.0.0 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 4e8aa575a6]: + + - @rocket.chat/ui-contexts@9.0.0 +
    + +## 5.0.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.6 +
    + +## 5.0.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.5 +
    + +## 5.0.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.4 +
    + +## 5.0.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.3 +
    + +## 5.0.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.2 +
    + +## 5.0.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.1 +
    + +## 5.0.0-rc.0 + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 4e8aa575a6]: + + - @rocket.chat/ui-contexts@9.0.0-rc.0 +
    + +## 4.0.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@8.0.2 +
    + +## 4.0.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@8.0.1 +
    + ## 4.0.0 ### Minor Changes diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index 2e45c20f1d36..1c2dc6dabbc4 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -1,10 +1,10 @@ { "name": "@rocket.chat/ui-avatar", - "version": "4.0.0", + "version": "5.0.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", - "@rocket.chat/fuselage": "^0.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/ui-contexts": "workspace:^", "@types/babel__core": "~7.20.3", "@types/react": "~17.0.69", @@ -31,7 +31,7 @@ ], "peerDependencies": { "@rocket.chat/fuselage": "*", - "@rocket.chat/ui-contexts": "8.0.0", + "@rocket.chat/ui-contexts": "9.0.0", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-client/CHANGELOG.md b/packages/ui-client/CHANGELOG.md index 2da8d9c6ca9a..5936f8038bc8 100644 --- a/packages/ui-client/CHANGELOG.md +++ b/packages/ui-client/CHANGELOG.md @@ -1,5 +1,107 @@ # @rocket.chat/ui-client +## 9.0.0 + +### Minor Changes + +- ([#32517](https://github.com/RocketChat/Rocket.Chat/pull/32517)) Feature Preview: New Navigation - `Header` and `Contextualbar` size improvements consistent with the new global `NavBar` + +### Patch Changes + +- ([#32024](https://github.com/RocketChat/Rocket.Chat/pull/32024)) Implemented a new tab to the users page called 'Active', this tab lists all users who have logged in for the first time and are active. + +-
    Updated dependencies [2d89a0c448, 4e8aa575a6]: + + - @rocket.chat/ui-contexts@9.0.0 +
    + +## 9.0.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.6 +
    + +## 9.0.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.5 +
    + +## 9.0.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.4 +
    + +## 9.0.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.3 +
    + +## 9.0.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.2 +
    + +## 9.0.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.1 +
    + +## 9.0.0-rc.0 + +### Minor Changes + +- ([#32517](https://github.com/RocketChat/Rocket.Chat/pull/32517)) Feature Preview: New Navigation - `Header` and `Contextualbar` size improvements consistent with the new global `NavBar` + +### Patch Changes + +- ([#32024](https://github.com/RocketChat/Rocket.Chat/pull/32024)) Implemented a new tab to the users page called 'Active', this tab lists all users who have logged in for the first time and are active. + +-
    Updated dependencies [2d89a0c448, 4e8aa575a6]: + + - @rocket.chat/ui-contexts@9.0.0-rc.0 +
    + +## 8.0.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@8.0.2 +
    + +## 8.0.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@8.0.1 +
    + ## 8.0.0 ### Minor Changes diff --git a/packages/ui-client/jest.config.ts b/packages/ui-client/jest.config.ts index d5dd6be2fd45..597fbebb687b 100644 --- a/packages/ui-client/jest.config.ts +++ b/packages/ui-client/jest.config.ts @@ -1,27 +1,12 @@ +import client from '@rocket.chat/jest-presets/client'; +import type { Config } from 'jest'; + export default { - errorOnDeprecated: true, - testEnvironment: 'jsdom', - modulePathIgnorePatterns: ['/dist/'], - testMatch: ['/src/**/**.spec.[jt]s?(x)'], - transform: { - '^.+\\.(t|j)sx?$': [ - '@swc/jest', - { - jsc: { - transform: { - react: { - runtime: 'automatic', - }, - }, - }, - }, - ], - }, + preset: client.preset, + setupFilesAfterEnv: [...client.setupFilesAfterEnv], moduleNameMapper: { - '\\.css$': 'identity-obj-proxy', '^react($|/.+)': '/../../node_modules/react$1', + '^react-dom/client$': '/../../node_modules/react-dom$1', + '^react-dom($|/.+)': '/../../node_modules/react-dom$1', }, - collectCoverage: true, - collectCoverageFrom: ['src/**/*.{ts,tsx}'], - setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect'], -}; +} satisfies Config; diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index fe35430364cf..69ca7e8b7f5b 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -1,14 +1,15 @@ { "name": "@rocket.chat/ui-client", - "version": "8.0.0", + "version": "9.0.0", "private": true, "devDependencies": { "@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.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/icons": "^0.36.0", + "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/mock-providers": "workspace:^", "@rocket.chat/ui-contexts": "workspace:~", "@storybook/addon-actions": "~6.5.16", @@ -21,12 +22,9 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", - "@swc/jest": "^0.2.29", - "@testing-library/jest-dom": "~5.16.5", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "^8.0.1", + "@testing-library/react": "~16.0.0", "@types/babel__core": "~7.20.3", - "@types/jest": "~29.5.7", + "@types/jest": "~29.5.12", "@types/react": "~17.0.69", "@types/react-dom": "~17.0.22", "eslint": "~8.45.0", @@ -35,22 +33,21 @@ "eslint-plugin-react-hooks": "~4.6.0", "eslint-plugin-storybook": "~0.6.15", "eslint-plugin-testing-library": "~5.11.1", - "jest": "~29.6.4", + "jest": "~29.7.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-hook-form": "~7.45.4", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput", + "typecheck": "tsc --noEmit", "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", "test": "jest", "testunit": "jest", - "build": "rm -rf dist && tsc -p tsconfig-build.json", - "typecheck": "tsc -p tsconfig.json --noEmit", - "storybook": "start-storybook -p 6006", - "dev": "tsc -p tsconfig-build.json --watch --preserveWatchOutput" + "storybook": "start-storybook -p 6006" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", @@ -63,7 +60,7 @@ "@rocket.chat/fuselage": "*", "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", - "@rocket.chat/ui-contexts": "8.0.0", + "@rocket.chat/ui-contexts": "9.0.0", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-client/src/components/CustomFieldsForm.tsx b/packages/ui-client/src/components/CustomFieldsForm.tsx index 0d1ba2ca5b1b..3a9c66014e4d 100644 --- a/packages/ui-client/src/components/CustomFieldsForm.tsx +++ b/packages/ui-client/src/components/CustomFieldsForm.tsx @@ -5,7 +5,7 @@ import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; import { useTranslation } from '@rocket.chat/ui-contexts'; import { useCallback, useMemo } from 'react'; -import type { Control, FieldValues } from 'react-hook-form'; +import type { Control, FieldValues, FieldError as RHFFieldError } from 'react-hook-form'; import { Controller, useFormState, get } from 'react-hook-form'; type CustomFieldFormProps = { @@ -46,10 +46,10 @@ const CustomField = ({ [defaultValue, options], ); - const validateRequired = useCallback((value) => (required ? typeof value === 'string' && !!value.trim() : true), [required]); + const validateRequired = useCallback((value: string) => (required ? typeof value === 'string' && !!value.trim() : true), [required]); const getErrorMessage = useCallback( - (error) => { + (error: RHFFieldError) => { switch (error?.type) { case 'required': return t('The_field_is_required', label || name); diff --git a/packages/ui-client/src/components/FeaturePreview/FeaturePreview.spec.tsx b/packages/ui-client/src/components/FeaturePreview/FeaturePreview.spec.tsx index e8e093eb25f6..03c297e7a10b 100644 --- a/packages/ui-client/src/components/FeaturePreview/FeaturePreview.spec.tsx +++ b/packages/ui-client/src/components/FeaturePreview/FeaturePreview.spec.tsx @@ -2,7 +2,6 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import { render, screen } from '@testing-library/react'; import { FeaturePreview, FeaturePreviewOff, FeaturePreviewOn } from './FeaturePreview'; -import '@testing-library/jest-dom'; test('should renders off if the feature is disabled', async () => { render( @@ -11,6 +10,7 @@ test('should renders off if the feature is disabled', async () => { off , { + legacyRoot: true, wrapper: mockAppRoot().withSetting('Accounts_AllowFeaturePreview', true).build(), }, ); @@ -25,6 +25,7 @@ test('should renders on if the feature is enabled', async () => { off , { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_AllowFeaturePreview', true) .withUserPreference('featuresPreview', [{ name: 'quickReactions', value: true }]) diff --git a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustom.tsx b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustom.tsx index 317f56899d05..a90cfb1bd1c6 100644 --- a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustom.tsx +++ b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustom.tsx @@ -64,8 +64,8 @@ export const MultiSelectCustom = ({ const [collapsed, toggleCollapsed] = useToggle(false); const onClose = useCallback( - (e) => { - if (isValidReference(reference, e)) { + (e: MouseEvent) => { + if (isValidReference(reference, e as { target: Node | null })) { toggleCollapsed(false); return; } diff --git a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomList.tsx b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomList.tsx index 71cb54f81aa5..4afe036e74d2 100644 --- a/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomList.tsx +++ b/packages/ui-client/src/components/MultiSelectCustom/MultiSelectCustomList.tsx @@ -20,7 +20,7 @@ const MultiSelectCustomList = ({ const [text, setText] = useState(''); - const handleChange = useCallback((event) => setText(event.currentTarget.value), []); + const handleChange = useCallback((event: FormEvent) => setText(event.currentTarget.value), []); const filteredOptions = useFilteredOptions(text, options); diff --git a/packages/ui-client/src/components/PasswordVerifier/PasswordVerifiers.spec.tsx b/packages/ui-client/src/components/PasswordVerifier/PasswordVerifiers.spec.tsx index cb2efaca19f5..108a13713707 100644 --- a/packages/ui-client/src/components/PasswordVerifier/PasswordVerifiers.spec.tsx +++ b/packages/ui-client/src/components/PasswordVerifier/PasswordVerifiers.spec.tsx @@ -10,6 +10,7 @@ afterEach(() => { it('should render no policy if its disabled ', () => { const { queryByRole } = render(, { + legacyRoot: true, wrapper: mockAppRoot().withSetting('Accounts_Password_Policy_Enabled', 'true').build(), }); @@ -18,6 +19,7 @@ it('should render no policy if its disabled ', () => { it('should render no policy if its enabled but empty', async () => { const { queryByRole, queryByTestId } = render(, { + legacyRoot: true, wrapper: mockAppRoot().build(), }); @@ -29,6 +31,7 @@ it('should render no policy if its enabled but empty', async () => { it('should render policy list if its enabled and not empty', async () => { const { queryByRole, queryByTestId } = render(, { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_Password_Policy_Enabled', 'true') .withSetting('Accounts_Password_Policy_MinLength', '6') @@ -45,6 +48,7 @@ it('should render policy list if its enabled and not empty', async () => { it('should render all the policies when all policies are enabled', async () => { const { queryByTestId, queryAllByRole } = render(, { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_Password_Policy_Enabled', 'true') .withSetting('Accounts_Password_Policy_MinLength', '6') @@ -67,6 +71,7 @@ it('should render all the policies when all policies are enabled', async () => { it("should render policy as invalid if password doesn't match the requirements", async () => { const { queryByTestId, getByRole } = render(, { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_Password_Policy_Enabled', 'true') .withSetting('Accounts_Password_Policy_MinLength', '10') @@ -82,6 +87,7 @@ it("should render policy as invalid if password doesn't match the requirements", it('should render policy as valid if password matches the requirements', async () => { const { queryByTestId, getByRole } = render(, { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_Password_Policy_Enabled', 'true') .withSetting('Accounts_Password_Policy_MinLength', '2') diff --git a/packages/ui-client/src/hooks/useDocumentTitle.spec.ts b/packages/ui-client/src/hooks/useDocumentTitle.spec.ts index e5df07fb354c..a14d34e63c22 100644 --- a/packages/ui-client/src/hooks/useDocumentTitle.spec.ts +++ b/packages/ui-client/src/hooks/useDocumentTitle.spec.ts @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useDocumentTitle } from './useDocumentTitle'; @@ -6,21 +6,26 @@ const DEFAULT_TITLE = 'Default Title'; const EXAMPLE_TITLE = 'Example Title'; it('should return the default title', () => { - const { result } = renderHook(() => useDocumentTitle(DEFAULT_TITLE)); + const { result } = renderHook(() => useDocumentTitle(DEFAULT_TITLE), { legacyRoot: true }); expect(result.current.title).toBe(DEFAULT_TITLE); }); it('should return the default title and empty key value if refocus param is false', () => { - const { result } = renderHook(() => useDocumentTitle(DEFAULT_TITLE, false)); + const { result } = renderHook(() => useDocumentTitle(DEFAULT_TITLE, false), { legacyRoot: true }); expect(result.current.title).toBe(DEFAULT_TITLE); expect(result.current.key).toBe(''); }); it('should return the default title and the example title concatenated', () => { - renderHook(() => useDocumentTitle(DEFAULT_TITLE)); - const { result } = renderHook(() => useDocumentTitle(EXAMPLE_TITLE)); + const { result } = renderHook( + () => { + useDocumentTitle(DEFAULT_TITLE); + return useDocumentTitle(EXAMPLE_TITLE); + }, + { legacyRoot: true }, + ); expect(result.current.title).toBe(`${EXAMPLE_TITLE} - ${DEFAULT_TITLE}`); }); diff --git a/packages/ui-client/src/hooks/useFeaturePreview.spec.tsx b/packages/ui-client/src/hooks/useFeaturePreview.spec.tsx index 7f6cda873e88..91bc0c91d070 100644 --- a/packages/ui-client/src/hooks/useFeaturePreview.spec.tsx +++ b/packages/ui-client/src/hooks/useFeaturePreview.spec.tsx @@ -1,41 +1,45 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useFeaturePreview } from './useFeaturePreview'; it('should return false if featurePreviewEnabled is false', () => { const { result } = renderHook(() => useFeaturePreview('quickReactions'), { + legacyRoot: true, wrapper: mockAppRoot().withSetting('Accounts_AllowFeaturePreview', false).build(), }); - expect(result.all[0]).toBe(false); + expect(result.current).toBe(false); }); // TODO: fix this test it('should return false if featurePreviewEnabled is true but feature is not in userPreferences', () => { const { result } = renderHook(() => useFeaturePreview('quickReactions'), { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_AllowFeaturePreview', false) .withUserPreference('featuresPreview', [{ name: 'quickReactions', value: true }]) .build(), }); - expect(result.all[0]).toBe(false); + expect(result.current).toBe(false); }); it('should return true if featurePreviewEnabled is true and feature is in userPreferences', () => { const { result } = renderHook(() => useFeaturePreview('quickReactions'), { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_AllowFeaturePreview', true) .withUserPreference('featuresPreview', [{ name: 'quickReactions', value: true }]) .build(), }); - expect(result.all[0]).toBe(true); + expect(result.current).toBe(true); }); it('should return false for disabled features', () => { const { result } = renderHook(() => useFeaturePreview('navigationBar'), { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_AllowFeaturePreview', true) .withUserPreference('featuresPreview', [ diff --git a/packages/ui-client/src/hooks/useFeaturePreviewList.spec.tsx b/packages/ui-client/src/hooks/useFeaturePreviewList.spec.tsx index d6f09c72bac7..e348cfb6a864 100644 --- a/packages/ui-client/src/hooks/useFeaturePreviewList.spec.tsx +++ b/packages/ui-client/src/hooks/useFeaturePreviewList.spec.tsx @@ -1,14 +1,15 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useFeaturePreviewList, enabledDefaultFeatures } from './useFeaturePreviewList'; it('should return the number of unseen features and Accounts_AllowFeaturePreview enabled ', () => { const { result } = renderHook(() => useFeaturePreviewList(), { + legacyRoot: true, wrapper: mockAppRoot().withSetting('Accounts_AllowFeaturePreview', true).build(), }); - expect(result.all[0]).toEqual( + expect(result.current).toEqual( expect.objectContaining({ featurePreviewEnabled: true, unseenFeatures: enabledDefaultFeatures.length, @@ -18,10 +19,11 @@ it('should return the number of unseen features and Accounts_AllowFeaturePreview it('should return the number of unseen features and Accounts_AllowFeaturePreview disabled ', () => { const { result } = renderHook(() => useFeaturePreviewList(), { + legacyRoot: true, wrapper: mockAppRoot().withSetting('Accounts_AllowFeaturePreview', false).build(), }); - expect(result.all[0]).toEqual( + expect(result.current).toEqual( expect.objectContaining({ featurePreviewEnabled: false, unseenFeatures: 0, @@ -31,13 +33,14 @@ it('should return the number of unseen features and Accounts_AllowFeaturePreview it('should return 0 unseen features', () => { const { result } = renderHook(() => useFeaturePreviewList(), { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_AllowFeaturePreview', true) .withUserPreference('featuresPreview', enabledDefaultFeatures) .build(), }); - expect(result.all[0]).toEqual( + expect(result.current).toEqual( expect.objectContaining({ featurePreviewEnabled: true, unseenFeatures: 0, @@ -47,6 +50,7 @@ it('should return 0 unseen features', () => { it('should ignore removed feature previews', () => { const { result } = renderHook(() => useFeaturePreviewList(), { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_AllowFeaturePreview', true) .withUserPreference('featuresPreview', [ @@ -69,6 +73,7 @@ it('should ignore removed feature previews', () => { it('should turn off ignored feature previews', async () => { const { result } = renderHook(() => useFeaturePreviewList(), { + legacyRoot: true, wrapper: mockAppRoot() .withSetting('Accounts_AllowFeaturePreview', true) .withUserPreference('featuresPreview', [ diff --git a/packages/ui-client/src/hooks/useValidatePassword.spec.ts b/packages/ui-client/src/hooks/useValidatePassword.spec.ts index 275e4ab8d6f5..8c68e2f0070d 100644 --- a/packages/ui-client/src/hooks/useValidatePassword.spec.ts +++ b/packages/ui-client/src/hooks/useValidatePassword.spec.ts @@ -1,5 +1,5 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import { useValidatePassword } from './useValidatePassword'; @@ -17,6 +17,7 @@ const settingsMockWrapper = mockAppRoot() it("should return `false` if password doesn't match all the requirements", async () => { const { result } = renderHook(async () => useValidatePassword('secret'), { + legacyRoot: true, wrapper: settingsMockWrapper, }); @@ -26,6 +27,7 @@ it("should return `false` if password doesn't match all the requirements", async it('should return `true` if password matches all the requirements', async () => { const { result } = renderHook(async () => useValidatePassword('5kgnGPq^&t4DSYW!SH#4N'), { + legacyRoot: true, wrapper: settingsMockWrapper, }); diff --git a/packages/ui-client/tsconfig-build.json b/packages/ui-client/tsconfig-build.json deleted file mode 100644 index d65872bd407d..000000000000 --- a/packages/ui-client/tsconfig-build.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "./tsconfig.json", - "exclude": ["**/*.stories.tsx"] -} diff --git a/packages/ui-client/tsconfig.build.json b/packages/ui-client/tsconfig.build.json new file mode 100644 index 000000000000..14a02ca5a1dc --- /dev/null +++ b/packages/ui-client/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["./src/**/*"], + "exclude": ["**/*.stories.tsx", "./src/**/*.spec.ts", "./src/**/*.spec.tsx"] +} diff --git a/packages/ui-client/tsconfig.json b/packages/ui-client/tsconfig.json index 7fec1e9ddf1f..2c150afcf5d4 100644 --- a/packages/ui-client/tsconfig.json +++ b/packages/ui-client/tsconfig.json @@ -1,8 +1,3 @@ { "extends": "../../tsconfig.base.client.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["./src"] } diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index fdc00ad086e1..2b3fae217aac 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -2,11 +2,24 @@ "name": "@rocket.chat/ui-composer", "version": "0.2.0", "private": true, + "main": "./dist/index.js", + "typings": "./dist/index.d.ts", + "files": [ + "/dist" + ], + "scripts": { + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", + "build": "rm -rf dist && tsc -p tsconfig.build.json", + "typecheck": "tsc --noEmit", + "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput", + "storybook": "start-storybook -p 6006" + }, "devDependencies": { "@babel/core": "~7.22.20", "@react-aria/toolbar": "^3.0.0-beta.1", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/icons": "^0.36.0", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", @@ -16,14 +29,15 @@ "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", "@types/babel__core": "~7.20.3", - "@types/jest": "~29.5.7", + "@types/react": "~17.0.69", + "@types/react-dom": "~17.0.22", "eslint": "~8.45.0", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", "eslint-plugin-storybook": "~0.6.15", - "jest": "~29.6.4", + "react": "~17.0.2", "react-docgen-typescript-plugin": "~1.0.5", - "ts-jest": "~29.1.1", + "react-dom": "~17.0.2", "typescript": "~5.3.3" }, "peerDependencies": { @@ -33,19 +47,6 @@ "react": "^17.0.2", "react-dom": "^17.0.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", - "storybook": "start-storybook -p 6006" - }, - "main": "./dist/index.js", - "typings": "./dist/index.d.ts", - "files": [ - "/dist" - ], "volta": { "extends": "../../package.json" } diff --git a/packages/ui-composer/tsconfig.build.json b/packages/ui-composer/tsconfig.build.json new file mode 100644 index 000000000000..1201960b9fb1 --- /dev/null +++ b/packages/ui-composer/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["./src/**/*.stories.tsx"] +} diff --git a/packages/ui-contexts/CHANGELOG.md b/packages/ui-contexts/CHANGELOG.md index 90e106d411f1..fb3d074b6fbe 100644 --- a/packages/ui-contexts/CHANGELOG.md +++ b/packages/ui-contexts/CHANGELOG.md @@ -1,5 +1,131 @@ # @rocket.chat/ui-contexts +## 9.0.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +- ([#32482](https://github.com/RocketChat/Rocket.Chat/pull/32482)) Fixed an issue with blocked login when dismissed 2FA modal by clicking outside of it or pressing the escape key + +-
    Updated dependencies [b4bbcbfc9a, 25da5280a5, 1b7b1161cf, 03c8b066f9, 2d89a0c448, 24f7df4894, 3ffe4a2944, 3b4b19cfc5, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/i18n@0.6.0 + - @rocket.chat/core-typings@6.11.0 + - @rocket.chat/rest-typings@6.11.0 + - @rocket.chat/ddp-client@0.3.3 +
    + +## 9.0.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.6 + - @rocket.chat/rest-typings@6.11.0-rc.6 + - @rocket.chat/ddp-client@0.3.3-rc.6 +
    + +## 9.0.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.5 + - @rocket.chat/rest-typings@6.11.0-rc.5 + - @rocket.chat/ddp-client@0.3.3-rc.5 +
    + +## 9.0.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.4 + - @rocket.chat/rest-typings@6.11.0-rc.4 + - @rocket.chat/ddp-client@0.3.3-rc.4 +
    + +## 9.0.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.3 + - @rocket.chat/rest-typings@6.11.0-rc.3 + - @rocket.chat/ddp-client@0.3.3-rc.3 +
    + +## 9.0.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.2 + - @rocket.chat/rest-typings@6.11.0-rc.2 + - @rocket.chat/ddp-client@0.3.3-rc.2 +
    + +## 9.0.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.11.0-rc.1 + - @rocket.chat/rest-typings@6.11.0-rc.1 + - @rocket.chat/ddp-client@0.3.2-rc.1 +
    + +## 9.0.0-rc.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +- ([#32482](https://github.com/RocketChat/Rocket.Chat/pull/32482)) Fixed an issue with blocked login when dismissed 2FA modal by clicking outside of it or pressing the escape key + +-
    Updated dependencies [b4bbcbfc9a, 25da5280a5, 1b7b1161cf, 03c8b066f9, 2d89a0c448, 24f7df4894, 3ffe4a2944, 3b4b19cfc5, 264d7d5496, b8e5887fb9]: + + - @rocket.chat/i18n@0.6.0-rc.0 + - @rocket.chat/core-typings@6.11.0-rc.0 + - @rocket.chat/rest-typings@6.11.0-rc.0 + - @rocket.chat/ddp-client@0.3.2-rc.0 +
    + +## 8.0.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/core-typings@6.10.2 + - @rocket.chat/rest-typings@6.10.2 + - @rocket.chat/ddp-client@0.3.2 +
    + +## 8.0.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/core-typings@6.10.1 + - @rocket.chat/rest-typings@6.10.1 + - @rocket.chat/ddp-client@0.3.1 +
    + ## 8.0.0 ### Minor Changes diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index c7d7e31780f3..513aebd86a30 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -1,23 +1,21 @@ { "name": "@rocket.chat/ui-contexts", - "version": "8.0.0", + "version": "9.0.0", "private": true, "devDependencies": { "@rocket.chat/core-typings": "workspace:^", + "@rocket.chat/ddp-client": "workspace:~", "@rocket.chat/emitter": "~0.31.25", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/i18n": "workspace:~", "@rocket.chat/rest-typings": "workspace:^", - "@types/jest": "~29.5.7", "@types/react": "~17.0.69", "@types/react-dom": "~17.0.22", "@types/use-sync-external-store": "^0.0.5", "eslint": "~8.45.0", "eslint-plugin-react-hooks": "^4.6.0", - "jest": "~29.6.4", "mongodb": "^4.17.2", "react": "~17.0.2", - "ts-jest": "~29.1.1", "typescript": "~5.3.3", "use-sync-external-store": "^1.2.0" }, @@ -40,7 +38,6 @@ "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "test": "jest", "dev": "tsc --watch --preserveWatchOutput -p tsconfig.json", "build": "rm -rf dist && tsc -p tsconfig.json" }, diff --git a/packages/ui-contexts/src/RouterContext.ts b/packages/ui-contexts/src/RouterContext.ts index 3fbd4bd98cf2..5ed0bbec823a 100644 --- a/packages/ui-contexts/src/RouterContext.ts +++ b/packages/ui-contexts/src/RouterContext.ts @@ -1,3 +1,4 @@ +import type { RoomType, RoomRouteData, DirectRoomRouteData, OmnichannelRoomRouteData, ChannelRouteData } from '@rocket.chat/core-typings'; import type { ReactNode } from 'react'; import { createContext } from 'react'; @@ -65,6 +66,15 @@ export type RouterContextValue = { defineRoutes(routes: RouteObject[]): () => void; getRoutes(): RouteObject[]; subscribeToRoutesChange(onRoutesChange: () => void): () => void; + getRoomRoute(roomType: 'd', routeData: DirectRoomRouteData): { path: LocationPathname }; + getRoomRoute(roomType: 'l' | 'v', routeData: OmnichannelRoomRouteData): { path: LocationPathname }; + getRoomRoute(roomType: 'p' | 'c', routeData: ChannelRouteData): { path: LocationPathname }; + getRoomRoute( + roomType: RoomType, + routeData: RoomRouteData, + ): { + path: LocationPathname; + }; }; export const RouterContext = createContext({ @@ -92,5 +102,8 @@ export const RouterContext = createContext({ getRoutes: () => { throw new Error('not implemented'); }, + getRoomRoute: () => { + throw new Error('not implemented'); + }, subscribeToRoutesChange: () => () => undefined, }); diff --git a/packages/ui-contexts/src/ServerContext/ServerContext.ts b/packages/ui-contexts/src/ServerContext/ServerContext.ts index 14a2b0e1a3ea..e5b7fd63c1c5 100644 --- a/packages/ui-contexts/src/ServerContext/ServerContext.ts +++ b/packages/ui-contexts/src/ServerContext/ServerContext.ts @@ -1,6 +1,12 @@ import type { IServerInfo, Serialized } from '@rocket.chat/core-typings'; -import type { ServerMethodName, ServerMethodParameters, ServerMethodReturn } from '@rocket.chat/ddp-client/src/types/methods'; -import type { StreamKeys, StreamNames, StreamerCallbackArgs } from '@rocket.chat/ddp-client/src/types/streams'; +import type { + ServerMethodName, + ServerMethodParameters, + ServerMethodReturn, + StreamKeys, + StreamNames, + StreamerCallbackArgs, +} from '@rocket.chat/ddp-client'; import type { Method, OperationParams, OperationResult, PathFor, PathPattern, UrlParams } from '@rocket.chat/rest-typings'; import { createContext } from 'react'; diff --git a/packages/ui-contexts/src/hooks/useGoToRoom.ts b/packages/ui-contexts/src/hooks/useGoToRoom.ts new file mode 100644 index 000000000000..e809a71e25bb --- /dev/null +++ b/packages/ui-contexts/src/hooks/useGoToRoom.ts @@ -0,0 +1,29 @@ +import type { IRoom } from '@rocket.chat/core-typings'; +import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; + +import { useEndpoint } from './useEndpoint'; +import { useRouter } from './useRouter'; + +export const useGoToRoom = ({ replace = false }: { replace?: boolean } = {}): ((rid: IRoom['_id']) => void) => { + const router = useRouter(); + const getRoomById = useEndpoint('GET', '/v1/rooms.info'); + + return useEffectEvent(async (roomId) => { + const { room } = await getRoomById({ roomId }); + + if (!room) { + return; + } + + const { t, name, _id: rid } = room; + + const { path } = router.getRoomRoute(t, ['c', 'p'].includes(t) ? { name } : { rid }); + + router.navigate( + { + pathname: path, + }, + { replace }, + ); + }); +}; diff --git a/packages/ui-contexts/src/hooks/useMethod.ts b/packages/ui-contexts/src/hooks/useMethod.ts index 0d71f2883972..a9f1513ed2f3 100644 --- a/packages/ui-contexts/src/hooks/useMethod.ts +++ b/packages/ui-contexts/src/hooks/useMethod.ts @@ -1,8 +1,12 @@ -import type { ServerMethodFunction, ServerMethodParameters, ServerMethods } from '@rocket.chat/ddp-client/src/types/methods'; +import type { ServerMethodName, ServerMethodParameters, ServerMethodReturn, ServerMethods } from '@rocket.chat/ddp-client'; import { useCallback, useContext } from 'react'; import { ServerContext } from '../ServerContext'; +type ServerMethodFunction = ( + ...args: ServerMethodParameters +) => Promise>; + /* @deprecated prefer the use of api endpoints (useEndpoint) */ export const useMethod = (methodName: MethodName): ServerMethodFunction => { const { callMethod } = useContext(ServerContext); diff --git a/packages/ui-contexts/src/hooks/useStream.ts b/packages/ui-contexts/src/hooks/useStream.ts index d6fb5e76be78..cb008eea468a 100644 --- a/packages/ui-contexts/src/hooks/useStream.ts +++ b/packages/ui-contexts/src/hooks/useStream.ts @@ -1,4 +1,4 @@ -import type { StreamNames, StreamerEvents, StreamKeys, StreamerCallbackArgs } from '@rocket.chat/ddp-client/src/types/streams'; +import type { StreamNames, StreamerEvents, StreamKeys, StreamerCallbackArgs } from '@rocket.chat/ddp-client'; import { useContext, useMemo } from 'react'; import { ServerContext } from '../ServerContext'; diff --git a/packages/ui-contexts/src/hooks/useUserSubscriptions.ts b/packages/ui-contexts/src/hooks/useUserSubscriptions.ts index e59a1e733a2f..ab5cdb9baacd 100644 --- a/packages/ui-contexts/src/hooks/useUserSubscriptions.ts +++ b/packages/ui-contexts/src/hooks/useUserSubscriptions.ts @@ -1,9 +1,9 @@ -import type { SubscriptionWithRoom } from '@rocket.chat/ui-contexts/src/types/SubscriptionWithRoom'; import { useContext, useMemo } from 'react'; import { useSyncExternalStore } from 'use-sync-external-store/shim'; import type { FindOptions, SubscriptionQuery } from '../UserContext'; import { UserContext } from '../UserContext'; +import type { SubscriptionWithRoom } from '../types/SubscriptionWithRoom'; export const useUserSubscriptions = (query: SubscriptionQuery, options?: FindOptions): SubscriptionWithRoom[] => { const { querySubscriptions } = useContext(UserContext); diff --git a/packages/ui-contexts/src/index.ts b/packages/ui-contexts/src/index.ts index 0870eb4417c8..e021eb840aa0 100644 --- a/packages/ui-contexts/src/index.ts +++ b/packages/ui-contexts/src/index.ts @@ -30,6 +30,7 @@ export { useCurrentModal } from './hooks/useCurrentModal'; export { useCurrentRoutePath } from './hooks/useCurrentRoutePath'; export { useCustomSound } from './hooks/useCustomSound'; export { useEndpoint } from './hooks/useEndpoint'; +export { useGoToRoom } from './hooks/useGoToRoom'; export type { EndpointFunction } from './hooks/useEndpoint'; export { useIsPrivilegedSettingsContext } from './hooks/useIsPrivilegedSettingsContext'; export { useIsSettingsContextLoading } from './hooks/useIsSettingsContextLoading'; @@ -91,21 +92,6 @@ export { useSetOutputMediaDevice } from './hooks/useSetOutputMediaDevice'; export { useSetInputMediaDevice } from './hooks/useSetInputMediaDevice'; export { useAccountsCustomFields } from './hooks/useAccountsCustomFields'; -export { - ServerMethods, - ServerMethodName, - ServerMethodParameters, - ServerMethodReturn, - ServerMethodFunction, -} from '@rocket.chat/ddp-client/src/types/methods'; -export { - StreamerEvents, - StreamNames, - StreamKeys, - StreamerConfigs, - StreamerConfig, - StreamerCallbackArgs, -} from '@rocket.chat/ddp-client/src/types/streams'; export { UploadResult } from './ServerContext'; export { TranslationKey, TranslationLanguage } from './TranslationContext'; export { Fields } from './UserContext'; diff --git a/packages/ui-kit/CHANGELOG.md b/packages/ui-kit/CHANGELOG.md index 1e920681e13d..9f31c620f4db 100644 --- a/packages/ui-kit/CHANGELOG.md +++ b/packages/ui-kit/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## 0.36.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +## 0.36.0-rc.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + ## 0.35.0 ### Minor Changes diff --git a/packages/ui-kit/jest.config.js b/packages/ui-kit/jest.config.js deleted file mode 100644 index 1ea2839f0cb8..000000000000 --- a/packages/ui-kit/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = /** @satisfies {import('jest').Config} */ ({ - preset: 'ts-jest', - testEnvironment: 'node', - errorOnDeprecated: true, - testMatch: ['/src/**/*.spec.[jt]s?(x)'], - setupFilesAfterEnv: ['/src/jest-setup.ts'], - collectCoverage: true, -}); diff --git a/packages/ui-kit/jest.config.ts b/packages/ui-kit/jest.config.ts new file mode 100644 index 000000000000..c18c8ae02465 --- /dev/null +++ b/packages/ui-kit/jest.config.ts @@ -0,0 +1,6 @@ +import server from '@rocket.chat/jest-presets/server'; +import type { Config } from 'jest'; + +export default { + preset: server.preset, +} satisfies Config; diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index b4819ef4311c..44aac1e25d17 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -1,62 +1,67 @@ { - "name": "@rocket.chat/ui-kit", - "version": "0.35.0", - "description": "Interactive UI elements for Rocket.Chat Apps", - "homepage": "https://rocket.chat", - "author": { - "name": "Rocket.Chat", - "url": "https://rocket.chat/" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/RocketChat/Rocket.Chat.git" - }, - "bugs": { - "url": "https://github.com/RocketChat/Rocket.Chat/issues" - }, - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/esm/index.d.ts", - "files": [ - "/dist" - ], - "publishConfig": { - "access": "public" - }, - "scripts": { - "build": "run-s .:build:prepare .:build:clean .:build:esm .:build:cjs", - ".:build:prepare": "ts-patch install && typia patch", - ".:build:clean": "rimraf dist", - ".:build:esm": "tsc -p tsconfig.esm.json", - ".:build:cjs": "tsc -p tsconfig.cjs.json", - "typecheck": "tsc --noEmit", - "lint": "eslint . --ext .ts,.tsx", - "test": "jest" - }, - "devDependencies": { - "@babel/core": "~7.21.4", - "@babel/eslint-parser": "~7.23.3", - "@babel/plugin-transform-runtime": "~7.21.4", - "@babel/preset-env": "~7.21.4", - "@rocket.chat/eslint-config": "workspace:~", - "@types/jest": "~29.5.0", - "babel-loader": "~9.1.2", - "eslint": "~8.45.0", - "jest": "~29.5.0", - "npm-run-all": "~4.1.5", - "prettier": "~2.8.8", - "rimraf": "~3.0.2", - "ts-jest": "~29.1.1", - "ts-loader": "~9.4.2", - "ts-node": "~10.9.1", - "ts-patch": "~3.0.2", - "typescript": "~5.3.3" - }, - "dependencies": { - "typia": "~5.3.3" - }, - "volta": { - "extends": "../../package.json" - } + "name": "@rocket.chat/ui-kit", + "version": "0.36.0", + "description": "Interactive UI elements for Rocket.Chat Apps", + "homepage": "https://rocket.chat", + "author": { + "name": "Rocket.Chat", + "url": "https://rocket.chat/" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/RocketChat/Rocket.Chat.git" + }, + "bugs": { + "url": "https://github.com/RocketChat/Rocket.Chat/issues" + }, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/esm/index.d.ts", + "files": [ + "/dist" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "run-s .:build:prepare .:build:clean .:build:esm .:build:cjs", + ".:build:prepare": "ts-patch install && typia patch", + ".:build:clean": "rimraf dist", + ".:build:esm": "tsc -p tsconfig.esm.json", + ".:build:cjs": "tsc -p tsconfig.cjs.json", + "typecheck": "tsc --noEmit", + "lint": "eslint . --ext .ts,.tsx", + "test": "jest" + }, + "devDependencies": { + "@babel/core": "~7.21.4", + "@babel/eslint-parser": "~7.23.3", + "@babel/plugin-transform-runtime": "~7.21.4", + "@babel/preset-env": "~7.21.4", + "@rocket.chat/eslint-config": "workspace:~", + "@rocket.chat/icons": "^0.36.0", + "@rocket.chat/jest-presets": "workspace:~", + "@types/jest": "~29.5.12", + "babel-loader": "~9.1.2", + "eslint": "~8.45.0", + "jest": "~29.7.0", + "npm-run-all": "~4.1.5", + "prettier": "~2.8.8", + "rimraf": "~3.0.2", + "ts-jest": "~29.1.1", + "ts-loader": "~9.4.2", + "ts-node": "~10.9.1", + "ts-patch": "~3.0.2", + "typescript": "~5.3.3" + }, + "dependencies": { + "typia": "~5.3.3" + }, + "peerDependencies": { + "@rocket.chat/icons": "*" + }, + "volta": { + "extends": "../../package.json" + } } diff --git a/packages/ui-kit/tsconfig.cjs.json b/packages/ui-kit/tsconfig.cjs.json index fd872164da6a..2784364aac38 100644 --- a/packages/ui-kit/tsconfig.cjs.json +++ b/packages/ui-kit/tsconfig.cjs.json @@ -7,5 +7,5 @@ "plugins": [{ "transform": "typia/lib/transform" }] }, "include": ["./src/**/*"], - "exclude": ["./src/**/*.spec.ts", "./src/jest-setup.ts"], + "exclude": ["./src/**/*.spec.ts"], } diff --git a/packages/ui-kit/tsconfig.esm.json b/packages/ui-kit/tsconfig.esm.json index 6eea7b79756f..a001f3197042 100644 --- a/packages/ui-kit/tsconfig.esm.json +++ b/packages/ui-kit/tsconfig.esm.json @@ -5,5 +5,5 @@ "outDir": "./dist/esm" }, "include": ["./src/**/*"], - "exclude": ["./src/**/*.spec.ts", "./src/jest-setup.ts"] + "exclude": ["./src/**/*.spec.ts"] } diff --git a/packages/ui-video-conf/.storybook/main.js b/packages/ui-video-conf/.storybook/main.js index 6919b887faaf..dc95f3584a3f 100644 --- a/packages/ui-video-conf/.storybook/main.js +++ b/packages/ui-video-conf/.storybook/main.js @@ -1,7 +1,7 @@ /** @type {import('@storybook/react/types').StorybookConfig} */ module.exports = { stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], - addons: ['@storybook/addon-essentials'], + addons: ['@storybook/addon-essentials', '@storybook/addon-a11y'], framework: '@storybook/react', features: { postcss: false, diff --git a/packages/ui-video-conf/.storybook/preview.js b/packages/ui-video-conf/.storybook/preview.js index 5980deceb25b..d1e44f0c2b8c 100644 --- a/packages/ui-video-conf/.storybook/preview.js +++ b/packages/ui-video-conf/.storybook/preview.js @@ -1,5 +1,6 @@ import '../../../apps/meteor/app/theme/client/main.css'; import 'highlight.js/styles/github.css'; +import '@rocket.chat/icons/dist/rocketchat.css'; export const parameters = { actions: { argTypesRegex: '^on[A-Z].*' }, diff --git a/packages/ui-video-conf/CHANGELOG.md b/packages/ui-video-conf/CHANGELOG.md index 0eecd8aa3072..2a697e293211 100644 --- a/packages/ui-video-conf/CHANGELOG.md +++ b/packages/ui-video-conf/CHANGELOG.md @@ -1,5 +1,115 @@ # @rocket.chat/ui-video-conf +## 9.0.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 4e8aa575a6]: + + - @rocket.chat/ui-contexts@9.0.0 + - @rocket.chat/ui-avatar@5.0.0 +
    + +## 9.0.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.6 + - @rocket.chat/ui-avatar@5.0.0-rc.6 +
    + +## 9.0.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.5 + - @rocket.chat/ui-avatar@5.0.0-rc.5 +
    + +## 9.0.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.4 + - @rocket.chat/ui-avatar@5.0.0-rc.4 +
    + +## 9.0.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.3 + - @rocket.chat/ui-avatar@5.0.0-rc.3 +
    + +## 9.0.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.2 + - @rocket.chat/ui-avatar@5.0.0-rc.2 +
    + +## 9.0.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.1 + - @rocket.chat/ui-avatar@5.0.0-rc.1 +
    + +## 9.0.0-rc.0 + +### Minor Changes + +- ([#32793](https://github.com/RocketChat/Rocket.Chat/pull/32793)) New Feature: Video Conference Persistent Chat. + This feature provides a discussion id for conference provider apps to store the chat messages exchanged during the conferences, so that those users may then access those messages again at any time through Rocket.Chat. + +### Patch Changes + +-
    Updated dependencies [2d89a0c448, 4e8aa575a6]: + + - @rocket.chat/ui-contexts@9.0.0-rc.0 + - @rocket.chat/ui-avatar@5.0.0-rc.0 +
    + +## 8.0.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@8.0.2 + - @rocket.chat/ui-avatar@4.0.2 +
    + +## 8.0.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@8.0.1 + - @rocket.chat/ui-avatar@4.0.1 +
    + ## 8.0.0 ### Minor Changes diff --git a/packages/ui-video-conf/jest.config.ts b/packages/ui-video-conf/jest.config.ts new file mode 100644 index 000000000000..14379928638f --- /dev/null +++ b/packages/ui-video-conf/jest.config.ts @@ -0,0 +1,8 @@ +import client from '@rocket.chat/jest-presets/client'; +import type { Config } from 'jest'; + +export default { + preset: client.preset, + setupFilesAfterEnv: [...client.setupFilesAfterEnv], + testMatch: ['/src/**/*.spec.{ts,tsx}'], +} satisfies Config; diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index efacce7a4586..d0dc218808c9 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -1,17 +1,19 @@ { "name": "@rocket.chat/ui-video-conf", - "version": "8.0.0", + "version": "9.0.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/icons": "^0.36.0", + "@rocket.chat/jest-presets": "workspace:~", "@rocket.chat/styled": "~0.31.25", "@rocket.chat/ui-avatar": "workspace:^", "@rocket.chat/ui-contexts": "workspace:^", + "@storybook/addon-a11y": "^6.5.16", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", "@storybook/addon-essentials": "~6.5.16", @@ -19,15 +21,17 @@ "@storybook/manager-webpack4": "~6.5.16", "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", + "@storybook/testing-react": "~1.3.0", "@types/babel__core": "~7.20.3", - "@types/jest": "~29.5.7", + "@types/jest": "~29.5.12", + "@types/jest-axe": "~3.5.9", "eslint": "~8.45.0", "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0", "eslint-plugin-storybook": "~0.6.15", - "jest": "~29.6.4", + "jest": "~29.7.0", + "jest-axe": "~9.0.0", "react-docgen-typescript-plugin": "~1.0.5", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "peerDependencies": { @@ -36,8 +40,8 @@ "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "4.0.0", - "@rocket.chat/ui-contexts": "8.0.0", + "@rocket.chat/ui-avatar": "5.0.0", + "@rocket.chat/ui-contexts": "9.0.0", "react": "^17.0.2", "react-dom": "^17.0.2" }, @@ -45,9 +49,9 @@ "eslint": "eslint --ext .js,.jsx,.ts,.tsx .", "eslint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", "test": "jest", - "build": "tsc -p tsconfig.json", + "build": "tsc -p tsconfig.build.json", "storybook": "start-storybook -p 6006", - "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput" + "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput" }, "main": "./dist/index.js", "typings": "./dist/index.d.ts", diff --git a/packages/ui-video-conf/src/VideoConfButton/VideoConfButton.spec.tsx b/packages/ui-video-conf/src/VideoConfButton/VideoConfButton.spec.tsx new file mode 100644 index 000000000000..a55b22c4a865 --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfButton/VideoConfButton.spec.tsx @@ -0,0 +1,19 @@ +import { composeStories } from '@storybook/testing-react'; +import { render } from '@testing-library/react'; +import { axe } from 'jest-axe'; + +import * as stories from './VideoConfButton.stories'; + +const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]); + +test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => { + const tree = render(); + expect(tree.baseElement).toMatchSnapshot(); +}); + +test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => { + const { container } = render(); + + const results = await axe(container); + expect(results).toHaveNoViolations(); +}); diff --git a/packages/ui-video-conf/src/VideoConfButton/VideoConfButton.stories.tsx b/packages/ui-video-conf/src/VideoConfButton/VideoConfButton.stories.tsx new file mode 100644 index 000000000000..769f98563d6e --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfButton/VideoConfButton.stories.tsx @@ -0,0 +1,10 @@ +import type { ComponentMeta, ComponentStory } from '@storybook/react'; + +import VideoConfButton from './VideoConfButton'; + +export default { + title: 'Components/VideoConfButton', + component: VideoConfButton, +} satisfies ComponentMeta; + +export const Default: ComponentStory = () => Button; diff --git a/packages/ui-video-conf/src/VideoConfButton.tsx b/packages/ui-video-conf/src/VideoConfButton/VideoConfButton.tsx similarity index 100% rename from packages/ui-video-conf/src/VideoConfButton.tsx rename to packages/ui-video-conf/src/VideoConfButton/VideoConfButton.tsx diff --git a/packages/ui-video-conf/src/VideoConfButton/__snapshots__/VideoConfButton.spec.tsx.snap b/packages/ui-video-conf/src/VideoConfButton/__snapshots__/VideoConfButton.spec.tsx.snap new file mode 100644 index 000000000000..b7170a3c0dee --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfButton/__snapshots__/VideoConfButton.spec.tsx.snap @@ -0,0 +1,18 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders Default without crashing 1`] = ` + +
    + +
    + +`; diff --git a/packages/ui-video-conf/src/VideoConfButton/index.ts b/packages/ui-video-conf/src/VideoConfButton/index.ts new file mode 100644 index 000000000000..7a3637f70e31 --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfButton/index.ts @@ -0,0 +1 @@ +export { default } from './VideoConfButton'; diff --git a/packages/ui-video-conf/src/VideoConfController/VideoConfController.spec.tsx b/packages/ui-video-conf/src/VideoConfController/VideoConfController.spec.tsx new file mode 100644 index 000000000000..96f5b50af1e3 --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfController/VideoConfController.spec.tsx @@ -0,0 +1,19 @@ +import { composeStories } from '@storybook/testing-react'; +import { render } from '@testing-library/react'; +import { axe } from 'jest-axe'; + +import * as stories from './VideoConfController.stories'; + +const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]); + +test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => { + const tree = render(); + expect(tree.baseElement).toMatchSnapshot(); +}); + +test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => { + const { container } = render(); + + const results = await axe(container); + expect(results).toHaveNoViolations(); +}); diff --git a/packages/ui-video-conf/src/VideoConfController/VideoConfController.stories.tsx b/packages/ui-video-conf/src/VideoConfController/VideoConfController.stories.tsx new file mode 100644 index 000000000000..dcce6da237ae --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfController/VideoConfController.stories.tsx @@ -0,0 +1,14 @@ +import type { ComponentMeta, ComponentStory } from '@storybook/react'; + +import VideoConfController from './VideoConfController'; + +export default { + title: 'Components/VideoConfController', + component: VideoConfController, +} satisfies ComponentMeta; + +export const Default: ComponentStory = (args) => ; +Default.args = { + 'icon': 'info', + 'aria-label': 'info', +}; diff --git a/packages/ui-video-conf/src/VideoConfController.tsx b/packages/ui-video-conf/src/VideoConfController/VideoConfController.tsx similarity index 65% rename from packages/ui-video-conf/src/VideoConfController.tsx rename to packages/ui-video-conf/src/VideoConfController/VideoConfController.tsx index b3813e329535..0b339fa0baec 100644 --- a/packages/ui-video-conf/src/VideoConfController.tsx +++ b/packages/ui-video-conf/src/VideoConfController/VideoConfController.tsx @@ -1,5 +1,4 @@ import { IconButton } from '@rocket.chat/fuselage'; -import { useUniqueId } from '@rocket.chat/fuselage-hooks'; import type { Keys as IconName } from '@rocket.chat/icons'; import type { ReactElement, ButtonHTMLAttributes } from 'react'; @@ -11,21 +10,16 @@ type VideoConfControllerProps = { small?: boolean; } & Omit, 'ref' | 'is' | 'className' | 'size' | 'elevation'>; -const VideoConfController = ({ icon, active, secondary, disabled, small = true, ...props }: VideoConfControllerProps): ReactElement => { - const id = useUniqueId(); - - return ( - - ); -}; +const VideoConfController = ({ icon, active, secondary, disabled, small = true, ...props }: VideoConfControllerProps): ReactElement => ( + +); export default VideoConfController; diff --git a/packages/ui-video-conf/src/VideoConfController/__snapshots__/VideoConfController.spec.tsx.snap b/packages/ui-video-conf/src/VideoConfController/__snapshots__/VideoConfController.spec.tsx.snap new file mode 100644 index 000000000000..a9c09dcdf166 --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfController/__snapshots__/VideoConfController.spec.tsx.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders Default without crashing 1`] = ` + +
    + +
    + +`; diff --git a/packages/ui-video-conf/src/VideoConfController/index.ts b/packages/ui-video-conf/src/VideoConfController/index.ts new file mode 100644 index 000000000000..352b2fb9769b --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfController/index.ts @@ -0,0 +1 @@ +export { default } from './VideoConfController'; diff --git a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.spec.tsx b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.spec.tsx new file mode 100644 index 000000000000..6b0db6b13b33 --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.spec.tsx @@ -0,0 +1,19 @@ +import { composeStories } from '@storybook/testing-react'; +import { render } from '@testing-library/react'; +import { axe } from 'jest-axe'; + +import * as stories from './VideoConfMessage.stories'; + +const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]); + +test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => { + const tree = render(); + expect(tree.baseElement).toMatchSnapshot(); +}); + +test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => { + const { container } = render(); + + const results = await axe(container); + expect(results).toHaveNoViolations(); +}); diff --git a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.stories.tsx b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.stories.tsx index 121db9cac51d..81a42d8b458f 100644 --- a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.stories.tsx +++ b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.stories.tsx @@ -2,7 +2,6 @@ import { MessageDivider, Message, Avatar, Box } from '@rocket.chat/fuselage'; import type { ComponentMeta, ComponentStory } from '@storybook/react'; import type { ReactElement } from 'react'; -import '@rocket.chat/icons/dist/rocketchat.css'; import { VideoConfMessage, VideoConfMessageIcon, VideoConfMessageRow, VideoConfMessageText } from '.'; import VideoConfMessageAction from './VideoConfMessageAction'; import VideoConfMessageActions from './VideoConfMessageActions'; @@ -22,7 +21,7 @@ export default { May, 24, 2020 - + @@ -41,7 +40,7 @@ export default {
    ), ], -} as ComponentMeta; +} satisfies ComponentMeta; const avatarUrl = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAoACgDASIAAhEBAxEB/8QAGwAAAgIDAQAAAAAAAAAAAAAAAAcEBgIDBQj/xAAuEAACAQQAAwcEAQUAAAAAAAABAgMABAUREiExBhMUIkFRYQcWcYGhFTJSgpH/xAAYAQADAQEAAAAAAAAAAAAAAAACAwQBAP/EAB4RAAIBBQEBAQAAAAAAAAAAAAABAgMREiExE0HR/9oADAMBAAIRAxEAPwBuXuIkhBuMe5ib/AHQP49q4L3mLitryTLTSpOiHQI5k/HzXa/qbFOEudVTu1dumWvcTaNCZYZ7vU6g6LxqjOU/24dfs1Ouh9FnkMpd3Reeyx83hAxZZEhkdV9/MBrX71WGPvJcqrJBGveKATtuXXqNU0pu02bTHXD/AGvJAluyxxRd6F4x00o+NdKoVrjbzJdvVe1t5cVLc2ck8qjnohgpPtz2v7G6JtPQ2VJwjlcw+37mchpnK6GtIuv5NFWeTsLNPvxWTvpfjvOEfwKKzEVkSct2vscS/BIzSN0YRkeX81UpPqO8masJETu7OOccY4dswYFQeftv096XV5knuJGdm2T1+agvMXj8jEaHX905QihabvcbuS7X566mLWLwSY8PuRnk/u4eZ0deTl71Ef6hY+0yM88TzeNZY4luYwpVYyduOfrvhPTnr0pXSX9y5mCsyJMdyxxvwq599em+taItqCSNc90ChvZRUruUcT0JiO18Elpk7t8v41LWzacxkBSuvjQ/FFJayjDWrCTepAQ2vUH0oo/Jk3ovpwJJeVCP5CN+lFFaaMqy+nAyuChvrTI2kN9JAsi2ZOy4IBHMnkSCP+iqBexSWdxLazoUljJVlPUH2oorkV10pRc7b1zXb/hZOzuJvM86QWEXeELxOzHSIPcmiiiunVlF2RNTpRkrs//Z'; @@ -54,7 +53,7 @@ export const CallingDM: ComponentStory = () => ( Calling... - + @@ -72,7 +71,7 @@ export const CallEndedDM: ComponentStory = () => ( Call ended - + @@ -90,7 +89,7 @@ export const CallOngoing: ComponentStory = () => ( Call ongoing - + @@ -109,7 +108,7 @@ export const CallEnded: ComponentStory = () => ( Call ended - + diff --git a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.tsx b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.tsx index 7c22b707770f..d873da1413d0 100644 --- a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.tsx +++ b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessage.tsx @@ -1,7 +1,8 @@ import { Box } from '@rocket.chat/fuselage'; -import type { ReactElement } from 'react'; +import type { AllHTMLAttributes, ReactElement } from 'react'; -const VideoConfMessage = ({ ...props }): ReactElement => ( +type VideoConfMessageProps = Omit, 'is'>; +const VideoConfMessage = (props: VideoConfMessageProps): ReactElement => ( ( borderWidth={1} borderColor='extra-light' borderRadius='x4' - className='rcx-videoconf-message-block' + rcx-videoconf-message-block {...props} /> ); diff --git a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageAction.tsx b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageAction.tsx index 9b705001c03f..a50fbda68bf6 100644 --- a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageAction.tsx +++ b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageAction.tsx @@ -2,6 +2,6 @@ import { IconButton } from '@rocket.chat/fuselage'; import type { ComponentProps, ReactElement } from 'react'; const VideoConfMessageAction = ({ icon = 'info', ...props }: ComponentProps): ReactElement => ( - + ); export default VideoConfMessageAction; diff --git a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageActions.tsx b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageActions.tsx index cc6112dfbd35..9556c334501b 100644 --- a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageActions.tsx +++ b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageActions.tsx @@ -2,7 +2,7 @@ import { ButtonGroup } from '@rocket.chat/fuselage'; import type { ComponentProps, ReactElement } from 'react'; const VideoConfMessageActions = ({ children, ...props }: ComponentProps): ReactElement => ( - + {children} ); diff --git a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageButton.tsx b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageButton.tsx index 75d2933bbce0..44463b2d28db 100644 --- a/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageButton.tsx +++ b/packages/ui-video-conf/src/VideoConfMessage/VideoConfMessageButton.tsx @@ -1,15 +1,9 @@ -import { Box, Button } from '@rocket.chat/fuselage'; -import type { AllHTMLAttributes, ReactElement, ReactNode } from 'react'; +import { Button } from '@rocket.chat/fuselage'; +import type { AllHTMLAttributes, ReactElement } from 'react'; -const VideoConfMessageButton = ({ - children, - primary, - ...props -}: { children: ReactNode; primary?: boolean } & Omit, 'is'>): ReactElement => ( - - - +type VideoConfMessageButtonProps = { primary?: boolean } & Omit, 'is'>; + +const VideoConfMessageButton = ({ primary, ...props }: VideoConfMessageButtonProps): ReactElement => ( + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +

    + Joined +

    +
    +
    + + + + + + + +`; + +exports[`renders CallEndedDM without crashing 1`] = ` + +
    +
    + + +`; + +exports[`renders CallOngoing without crashing 1`] = ` + +
    +
    + + +`; + +exports[`renders CallingDM without crashing 1`] = ` + +
    +
    + + +`; + +exports[`renders Loading without crashing 1`] = ` + +
    +
    + + +`; diff --git a/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopup.spec.tsx b/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopup.spec.tsx new file mode 100644 index 000000000000..d51db2e964d8 --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopup.spec.tsx @@ -0,0 +1,19 @@ +import { composeStories } from '@storybook/testing-react'; +import { render } from '@testing-library/react'; +import { axe } from 'jest-axe'; + +import * as stories from './VideoConfPopup.stories'; + +const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]); + +test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => { + const tree = render(); + expect(tree.baseElement).toMatchSnapshot(); +}); + +test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => { + const { container } = render(); + + const results = await axe(container); + expect(results).toHaveNoViolations(); +}); diff --git a/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopup.stories.tsx b/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopup.stories.tsx index 4f73e3cf4775..c32590af8a14 100644 --- a/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopup.stories.tsx +++ b/packages/ui-video-conf/src/VideoConfPopup/VideoConfPopup.stories.tsx @@ -3,7 +3,6 @@ import { action } from '@storybook/addon-actions'; import type { ComponentMeta, ComponentStory } from '@storybook/react'; import type { ReactElement } from 'react'; -import '@rocket.chat/icons/dist/rocketchat.css'; import { VideoConfPopup, VideoConfPopupHeader, @@ -27,22 +26,22 @@ export default { ), ], -} as ComponentMeta; +} satisfies ComponentMeta; const avatarUrl = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAoACgDASIAAhEBAxEB/8QAGwAAAgIDAQAAAAAAAAAAAAAAAAcEBgIDBQj/xAAuEAACAQQAAwcEAQUAAAAAAAABAgMABAUREiExBhMUIkFRYQcWcYGhFTJSgpH/xAAYAQADAQEAAAAAAAAAAAAAAAACAwQBAP/EAB4RAAIBBQEBAQAAAAAAAAAAAAABAgMREiExE0HR/9oADAMBAAIRAxEAPwBuXuIkhBuMe5ib/AHQP49q4L3mLitryTLTSpOiHQI5k/HzXa/qbFOEudVTu1dumWvcTaNCZYZ7vU6g6LxqjOU/24dfs1Ouh9FnkMpd3Reeyx83hAxZZEhkdV9/MBrX71WGPvJcqrJBGveKATtuXXqNU0pu02bTHXD/AGvJAluyxxRd6F4x00o+NdKoVrjbzJdvVe1t5cVLc2ck8qjnohgpPtz2v7G6JtPQ2VJwjlcw+37mchpnK6GtIuv5NFWeTsLNPvxWTvpfjvOEfwKKzEVkSct2vscS/BIzSN0YRkeX81UpPqO8masJETu7OOccY4dswYFQeftv096XV5knuJGdm2T1+agvMXj8jEaHX905QihabvcbuS7X566mLWLwSY8PuRnk/u4eZ0deTl71Ef6hY+0yM88TzeNZY4luYwpVYyduOfrvhPTnr0pXSX9y5mCsyJMdyxxvwq599em+taItqCSNc90ChvZRUruUcT0JiO18Elpk7t8v41LWzacxkBSuvjQ/FFJayjDWrCTepAQ2vUH0oo/Jk3ovpwJJeVCP5CN+lFFaaMqy+nAyuChvrTI2kN9JAsi2ZOy4IBHMnkSCP+iqBexSWdxLazoUljJVlPUH2oorkV10pRc7b1zXb/hZOzuJvM86QWEXeELxOzHSIPcmiiiunVlF2RNTpRkrs//Z'; export const StartCall: ComponentStory = () => ( - + - - + + - } icon={}> + } icon={}> Room Name diff --git a/packages/ui-video-conf/src/VideoConfPopup/__snapshots__/VideoConfPopup.spec.tsx.snap b/packages/ui-video-conf/src/VideoConfPopup/__snapshots__/VideoConfPopup.spec.tsx.snap new file mode 100644 index 000000000000..358cec7d7f7d --- /dev/null +++ b/packages/ui-video-conf/src/VideoConfPopup/__snapshots__/VideoConfPopup.spec.tsx.snap @@ -0,0 +1,117 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders StartCall without crashing 1`] = ` + +
    +
    + +
    +
    + +`; diff --git a/packages/ui-video-conf/src/hooks/useVideoConfControllers.ts b/packages/ui-video-conf/src/hooks/useVideoConfControllers.ts index 8e55ffa24d79..41bc48b97a25 100644 --- a/packages/ui-video-conf/src/hooks/useVideoConfControllers.ts +++ b/packages/ui-video-conf/src/hooks/useVideoConfControllers.ts @@ -10,13 +10,9 @@ export const useVideoConfControllers = ( ): { controllersConfig: controllersConfigProps; handleToggleMic: () => void; handleToggleCam: () => void } => { const [controllersConfig, setControllersConfig] = useState(initialPreferences); - const handleToggleMic = useCallback((): void => { - setControllersConfig((prevState) => ({ ...prevState, mic: !prevState.mic })); - }, []); + const handleToggleMic = useCallback(() => setControllersConfig((prevState) => ({ ...prevState, mic: !prevState.mic })), []); - const handleToggleCam = useCallback((): void => { - setControllersConfig((prevState) => ({ ...prevState, cam: !prevState.cam })); - }, []); + const handleToggleCam = useCallback(() => setControllersConfig((prevState) => ({ ...prevState, cam: !prevState.cam })), []); return { controllersConfig, diff --git a/packages/ui-video-conf/tsconfig.build.json b/packages/ui-video-conf/tsconfig.build.json new file mode 100644 index 000000000000..36dbe9c166ff --- /dev/null +++ b/packages/ui-video-conf/tsconfig.build.json @@ -0,0 +1,5 @@ +{ + "extends": "./tsconfig.json", + "include": ["./src/**/*"], + "exclude": ["./src/**/*.stories.tsx", "./src/**/*.spec.ts", "./src/**/*.spec.tsx"] +} diff --git a/packages/ui-video-conf/tsconfig.json b/packages/ui-video-conf/tsconfig.json index e2be47cf5499..aa282e17ea6c 100644 --- a/packages/ui-video-conf/tsconfig.json +++ b/packages/ui-video-conf/tsconfig.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig.base.client.json", "compilerOptions": { - "rootDir": "./src", + "rootDirs": ["./src", "./"], "outDir": "./dist" }, - "include": ["./src/**/*"] + "include": ["./src/**/*", "./jest.config.ts"], } diff --git a/packages/uikit-playground/CHANGELOG.md b/packages/uikit-playground/CHANGELOG.md index 43bc6d935488..0107fc049b8f 100644 --- a/packages/uikit-playground/CHANGELOG.md +++ b/packages/uikit-playground/CHANGELOG.md @@ -1,5 +1,115 @@ # @rocket.chat/uikit-playground +## 0.3.3 + +### Patch Changes + +-
    Updated dependencies [88e5219bd2, 2d89a0c448, 4e8aa575a6, b8e5887fb9]: + + - @rocket.chat/fuselage-ui-kit@9.0.0 + - @rocket.chat/ui-contexts@9.0.0 + - @rocket.chat/ui-avatar@5.0.0 +
    + +## 0.3.3-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.6 + - @rocket.chat/ui-contexts@9.0.0-rc.6 + - @rocket.chat/ui-avatar@5.0.0-rc.6 +
    + +## 0.3.3-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.5 + - @rocket.chat/ui-contexts@9.0.0-rc.5 + - @rocket.chat/ui-avatar@5.0.0-rc.5 +
    + +## 0.3.3-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.4 + - @rocket.chat/ui-contexts@9.0.0-rc.4 + - @rocket.chat/ui-avatar@5.0.0-rc.4 +
    + +## 0.3.3-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.3 + - @rocket.chat/ui-contexts@9.0.0-rc.3 + - @rocket.chat/ui-avatar@5.0.0-rc.3 +
    + +## 0.3.3-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.2 + - @rocket.chat/ui-contexts@9.0.0-rc.2 + - @rocket.chat/ui-avatar@5.0.0-rc.2 +
    + +## 0.3.3-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.1 + - @rocket.chat/ui-contexts@9.0.0-rc.1 + - @rocket.chat/ui-avatar@5.0.0-rc.1 +
    + +## 0.3.3-rc.0 + +### Patch Changes + +-
    Updated dependencies [88e5219bd2, 2d89a0c448, 4e8aa575a6, b8e5887fb9]: + + - @rocket.chat/fuselage-ui-kit@9.0.0-rc.0 + - @rocket.chat/ui-contexts@9.0.0-rc.0 + - @rocket.chat/ui-avatar@5.0.0-rc.0 +
    + +## 0.3.2 + +### Patch Changes + +-
    Updated dependencies [ca6a9d8de8, ca6a9d8de8, ca6a9d8de8, ca6a9d8de8]: + + - @rocket.chat/fuselage-ui-kit@8.0.2 + - @rocket.chat/ui-contexts@8.0.2 + - @rocket.chat/ui-avatar@4.0.2 +
    + +## 0.3.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@8.0.1 + - @rocket.chat/ui-contexts@8.0.1 + - @rocket.chat/ui-avatar@4.0.1 +
    + ## 0.3.0 ### Minor Changes diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index a9293ff218ce..750f60893188 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/uikit-playground", "private": true, - "version": "0.3.0", + "version": "0.3.3", "type": "module", "scripts": { "dev": "vite", @@ -15,10 +15,10 @@ "@codemirror/tooltip": "^0.19.16", "@lezer/highlight": "^1.1.6", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.55.2", + "@rocket.chat/fuselage": "^0.57.0", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", - "@rocket.chat/fuselage-toastbar": "^0.32.0", + "@rocket.chat/fuselage-toastbar": "^0.33.0", "@rocket.chat/fuselage-tokens": "^0.33.1", "@rocket.chat/fuselage-ui-kit": "workspace:~", "@rocket.chat/icons": "^0.36.0", diff --git a/packages/uikit-playground/src/Components/FlowContainer/FlowContainer.tsx b/packages/uikit-playground/src/Components/FlowContainer/FlowContainer.tsx index f04d95b274c2..311ddaae795c 100644 --- a/packages/uikit-playground/src/Components/FlowContainer/FlowContainer.tsx +++ b/packages/uikit-playground/src/Components/FlowContainer/FlowContainer.tsx @@ -8,6 +8,8 @@ import ReactFlow, { Viewport, ReactFlowInstance, useReactFlow, + Connection, + Edge, } from 'reactflow'; import 'reactflow/dist/style.css'; @@ -39,10 +41,10 @@ const FlowContainer = () => { const edgeUpdateSuccessful = useRef(true); const onConnect = useCallback( - (params) => { - if (params.source === params.target) return; + (connection: Connection) => { + if (connection.source === connection.target) return; const newEdge = { - ...params, + ...connection, type: FlowParams.edgeType, markerEnd: FlowParams.markerEnd, style: FlowParams.style, @@ -57,7 +59,7 @@ const FlowContainer = () => { }, []); const onEdgeUpdate = useCallback( - (oldEdge, newConnection) => { + (oldEdge: Edge, newConnection: Connection) => { edgeUpdateSuccessful.current = true; setEdges((els) => updateEdge(oldEdge, newConnection, els)); }, @@ -65,7 +67,7 @@ const FlowContainer = () => { ); const onEdgeUpdateEnd = useCallback( - (_, edge) => { + (_: MouseEvent | TouchEvent, edge: Edge) => { if (!edgeUpdateSuccessful.current) { setEdges((eds) => { return eds.filter((e) => e.id !== edge.id); diff --git a/packages/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx b/packages/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx index d0a59cc42a45..e6c0abba57e7 100644 --- a/packages/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx +++ b/packages/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx @@ -16,7 +16,7 @@ const SurfaceSelect: FC = () => { value={`${screens[activeScreen].payload.surface}`} placeholder="Surface" onChange={(e) => { - dispatch(surfaceAction(typeof e === 'string' ? parseInt(e) : e)); + dispatch(surfaceAction(typeof e === 'string' ? parseInt(e) : Number(e))); }} /> ); diff --git a/packages/web-ui-registration/CHANGELOG.md b/packages/web-ui-registration/CHANGELOG.md index ad91395df6f8..871e66b0f29c 100644 --- a/packages/web-ui-registration/CHANGELOG.md +++ b/packages/web-ui-registration/CHANGELOG.md @@ -1,5 +1,105 @@ # @rocket.chat/web-ui-registration +## 9.0.0 + +### Patch Changes + +- ([#32482](https://github.com/RocketChat/Rocket.Chat/pull/32482)) Fixed an issue with blocked login when dismissed 2FA modal by clicking outside of it or pressing the escape key + +-
    Updated dependencies [8fc6ca8b4e, 2d89a0c448, 4e8aa575a6]: + + - @rocket.chat/tools@0.2.2 + - @rocket.chat/ui-contexts@9.0.0 +
    + +## 9.0.0-rc.6 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.6 +
    + +## 9.0.0-rc.5 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.5 +
    + +## 9.0.0-rc.4 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.4 +
    + +## 9.0.0-rc.3 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.3 +
    + +## 9.0.0-rc.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.2 +
    + +## 9.0.0-rc.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@9.0.0-rc.1 +
    + +## 9.0.0-rc.0 + +### Patch Changes + +- ([#32570](https://github.com/RocketChat/Rocket.Chat/pull/32570)) Login services button was not respecting the button color and text color settings. Implemented a fix to respect these settings and change the button colors accordingly. + + Added a warning on all settings which allow admins to change OAuth button colors, so that they can be alerted about WCAG (Web Content Accessibility Guidelines) compliance. + +- ([#32482](https://github.com/RocketChat/Rocket.Chat/pull/32482)) Fixed an issue with blocked login when dismissed 2FA modal by clicking outside of it or pressing the escape key + +-
    Updated dependencies [8fc6ca8b4e, 2d89a0c448, 4e8aa575a6]: + + - @rocket.chat/tools@0.2.2-rc.0 + - @rocket.chat/ui-contexts@9.0.0-rc.0 +
    + +## 8.0.2 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@8.0.2 +
    + +## 8.0.1 + +### Patch Changes + +-
    Updated dependencies []: + + - @rocket.chat/ui-contexts@8.0.1 +
    + ## 8.0.0 ### Minor Changes diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index a6d3adcfe8f9..ba3dc31423a6 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/web-ui-registration", - "version": "8.0.0", + "version": "9.0.0", "private": true, "homepage": "https://rocket.chat", "main": "./dist/index.js", @@ -11,7 +11,6 @@ "scripts": { "lint": "eslint --ext .js,.jsx,.ts,.tsx .", "lint:fix": "eslint --ext .js,.jsx,.ts,.tsx . --fix", - "test": "jest", "storybook": "start-storybook -p 6006 --no-version-updates", "build": "tsc -p tsconfig.build.json", "dev": "tsc -p tsconfig.build.json --watch --preserveWatchOutput" @@ -35,26 +34,26 @@ "@storybook/react": "~6.5.16", "@storybook/testing-library": "^0.2.2", "@tanstack/react-query": "^4.16.1", - "@testing-library/react": "^13.3.0", - "@types/jest": "~29.5.7", + "@testing-library/react": "~16.0.0", "@types/react": "~17.0.69", "babel-loader": "~8.3.0", "eslint": "~8.45.0", - "jest": "~29.6.4", "react": "~17.0.2", "react-hook-form": "~7.45.4", "react-i18next": "~13.2.2", "storybook-dark-mode": "~3.0.1", - "ts-jest": "~29.1.1", "typescript": "~5.3.3" }, "peerDependencies": { "@rocket.chat/layout": "*", - "@rocket.chat/tools": "0.2.1", - "@rocket.chat/ui-contexts": "8.0.0", + "@rocket.chat/tools": "0.2.2", + "@rocket.chat/ui-contexts": "9.0.0", "@tanstack/react-query": "*", "react": "*", "react-hook-form": "*", "react-i18next": "*" + }, + "volta": { + "extends": "../../package.json" } } diff --git a/packages/web-ui-registration/src/LoginServicesButton.tsx b/packages/web-ui-registration/src/LoginServicesButton.tsx index ba16d360d9c1..d9f43b0e484c 100644 --- a/packages/web-ui-registration/src/LoginServicesButton.tsx +++ b/packages/web-ui-registration/src/LoginServicesButton.tsx @@ -15,8 +15,6 @@ const LoginServicesButton = ({ className, disabled, setError, - buttonColor, - buttonLabelColor, ...props }: T & { className?: string; @@ -45,8 +43,6 @@ const LoginServicesButton = ({ alignItems='center' display='flex' justifyContent='center' - color={buttonLabelColor} - backgroundColor={buttonColor} > {buttonLabelText || t('Sign_in_with__provider__', { provider: title })} diff --git a/packages/web-ui-registration/src/RegisterForm.tsx b/packages/web-ui-registration/src/RegisterForm.tsx index 0eda77879be7..57cf9378ab72 100644 --- a/packages/web-ui-registration/src/RegisterForm.tsx +++ b/packages/web-ui-registration/src/RegisterForm.tsx @@ -94,14 +94,15 @@ export const RegisterForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRo if (error.errorType === 'error-user-already-exists') { setError('username', { type: 'user-already-exists', message: t('registration.component.form.usernameAlreadyExists') }); } - if (/Email already exists/.test(error.error)) { setError('email', { type: 'email-already-exists', message: t('registration.component.form.emailAlreadyExists') }); } - if (/Username is already in use/.test(error.error)) { setError('username', { type: 'username-already-exists', message: t('registration.component.form.userAlreadyExist') }); } + if (/Name contains invalid characters/.test(error.error)) { + setError('name', { type: 'name-contains-invalid-chars', message: t('registration.component.form.nameContainsInvalidChars') }); + } if (/error-too-many-requests/.test(error.error)) { dispatchToastMessage({ type: 'error', message: error.error }); } diff --git a/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx b/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx index 0d08fba8a3ac..46ce5112b9d4 100644 --- a/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx +++ b/packages/web-ui-registration/src/components/LoginSwitchLanguageFooter.tsx @@ -62,7 +62,10 @@ const LoginSwitchLanguageFooter = ({ {suggestions.map((suggestion) => ( ))} diff --git a/turbo.json b/turbo.json index f7cf760529c0..7ce868eb3707 100644 --- a/turbo.json +++ b/turbo.json @@ -1,7 +1,7 @@ { "$schema": "https://turborepo.org/schema.json", "globalDependencies": ["tsconfig.base.json", "tsconfig.base.server.json", "tsconfig.base.client.json"], - "pipeline": { + "tasks": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] diff --git a/yarn.lock b/yarn.lock index e7555d99208e..de477be8048a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -59,10 +59,10 @@ __metadata: languageName: node linkType: hard -"@adobe/css-tools@npm:^4.0.1": - version: 4.0.1 - resolution: "@adobe/css-tools@npm:4.0.1" - checksum: 80226e2229024c21da9ffa6b5cd4a34b931f071e06f45aba4777ade071d7a6c94605cf73b13718b0c4b34e8b124c65c607b82eaa53a326d3eb73d9682a04a593 +"@adobe/css-tools@npm:^4.4.0": + version: 4.4.0 + resolution: "@adobe/css-tools@npm:4.4.0" + checksum: 1f08fb49bf17fc7f2d1a86d3e739f29ca80063d28168307f1b0a962ef37501c5667271f6771966578897f2e94e43c4770fd802728a6e6495b812da54112d506a languageName: node linkType: hard @@ -2937,16 +2937,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": - version: 7.23.4 - resolution: "@babel/runtime@npm:7.23.4" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: 8eb6a6b2367f7d60e7f7dd83f477cc2e2fdb169e5460694d7614ce5c730e83324bcf29251b70940068e757ad1ee56ff8073a372260d90cad55f18a825caf97cd - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.5, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": version: 7.24.4 resolution: "@babel/runtime@npm:7.24.4" dependencies: @@ -4358,7 +4349,7 @@ __metadata: languageName: node linkType: hard -"@jest/core@npm:^29.5.0, @jest/core@npm:^29.6.4, @jest/core@npm:^29.7.0": +"@jest/core@npm:^29.7.0": version: 29.7.0 resolution: "@jest/core@npm:29.7.0" dependencies: @@ -4399,16 +4390,16 @@ __metadata: languageName: node linkType: hard -"@jest/create-cache-key-function@npm:^27.4.2": - version: 27.5.1 - resolution: "@jest/create-cache-key-function@npm:27.5.1" +"@jest/create-cache-key-function@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/create-cache-key-function@npm:29.7.0" dependencies: - "@jest/types": ^27.5.1 - checksum: a6c3a8c769aca6f66f5dc80f1c77e66980b4f213a6b2a15a92ba3595f032848a1261c06c9c798dcf2b672b1ffbefad5085af89d130548741c85ddbe0cf4284e7 + "@jest/types": ^29.6.3 + checksum: 681bc761fa1d6fa3dd77578d444f97f28296ea80755e90e46d1c8fa68661b9e67f54dd38b988742db636d26cf160450dc6011892cec98b3a7ceb58cad8ff3aae languageName: node linkType: hard -"@jest/environment@npm:^29.6.4, @jest/environment@npm:^29.7.0": +"@jest/environment@npm:^29.7.0": version: 29.7.0 resolution: "@jest/environment@npm:29.7.0" dependencies: @@ -4439,7 +4430,7 @@ __metadata: languageName: node linkType: hard -"@jest/fake-timers@npm:^29.6.4, @jest/fake-timers@npm:^29.7.0": +"@jest/fake-timers@npm:^29.7.0": version: 29.7.0 resolution: "@jest/fake-timers@npm:29.7.0" dependencies: @@ -4502,15 +4493,6 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/schemas@npm:28.1.3" - dependencies: - "@sinclair/typebox": ^0.24.1 - checksum: 3cf1d4b66c9c4ffda58b246de1ddcba8e6ad085af63dccdf07922511f13b68c0cc480a7bc620cb4f3099a6f134801c747e1df7bfc7a4ef4dceefbdea3e31e1de - languageName: node - linkType: hard - "@jest/schemas@npm:^29.6.3": version: 29.6.3 resolution: "@jest/schemas@npm:29.6.3" @@ -4627,7 +4609,7 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^29.5.0, @jest/types@npm:^29.6.3": +"@jest/types@npm:^29.6.3": version: 29.6.3 resolution: "@jest/types@npm:29.6.3" dependencies: @@ -8460,10 +8442,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/account-utils@workspace:packages/account-utils" dependencies: - "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8473,16 +8452,13 @@ __metadata: resolution: "@rocket.chat/agenda@workspace:packages/agenda" dependencies: "@types/debug": ^4.1.10 - "@types/jest": ~29.5.7 cron: ~1.8.2 date.js: ~0.3.3 debug: ~4.1.1 eslint: ~8.45.0 human-interval: ^2.0.1 - jest: ~29.6.4 moment-timezone: ~0.5.43 mongodb: ^4.17.2 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8492,26 +8468,24 @@ __metadata: resolution: "@rocket.chat/api-client@workspace:ee/packages/api-client" dependencies: "@rocket.chat/core-typings": "workspace:^" + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/rest-typings": "workspace:^" - "@swc/core": ^1.3.95 - "@swc/jest": ^0.2.29 - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 "@types/strict-uri-encode": ^2.0.1 eslint: ~8.45.0 filter-obj: ^3.0.0 - jest: ~29.6.4 + jest: ~29.7.0 jest-fetch-mock: ^3.0.3 query-string: ^7.1.3 split-on-first: ^3.0.0 strict-uri-encode: ^2.0.0 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft -"@rocket.chat/apps-engine@npm:alpha": - version: 1.44.0-alpha.818 - resolution: "@rocket.chat/apps-engine@npm:1.44.0-alpha.818" +"@rocket.chat/apps-engine@npm:1.44.0": + version: 1.44.0 + resolution: "@rocket.chat/apps-engine@npm:1.44.0" dependencies: "@msgpack/msgpack": 3.0.0-beta2 adm-zip: ^0.5.9 @@ -8527,7 +8501,7 @@ __metadata: uuid: ~8.3.2 peerDependencies: "@rocket.chat/ui-kit": "*" - checksum: acef47bc7f13e0682d018531638b5168c3acd59beae37b013e881ea6fadfe12670fe10545f4a89487f7bedbe9166028833cba7ed3fc401d4283327e47e00e61c + checksum: f2b1b13c6a070c8d320a6d681ede6945a5882f9e2d42f2569bfc8c098229f761c7ef358589d3f1714d17b157fafa8e4869f28752408356f4a9286f62cb517f46 languageName: node linkType: hard @@ -8535,13 +8509,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/apps@workspace:packages/apps" dependencies: - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.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.3 languageName: unknown linkType: soft @@ -8585,11 +8556,11 @@ __metadata: "@babel/core": ~7.22.20 "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" + "@rocket.chat/jest-presets": "workspace:~" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 + jest: ~29.7.0 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8598,11 +8569,8 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/cas-validate@workspace:packages/cas-validate" dependencies: - "@types/jest": ~29.5.7 cheerio: 1.0.0-rc.10 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8614,10 +8582,11 @@ __metadata: "@babel/core": ~7.22.20 "@babel/preset-env": ~7.22.20 "@babel/preset-typescript": ~7.22.15 - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.0 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/icons": ^0.36.0 + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" @@ -8625,22 +8594,22 @@ __metadata: "@types/babel__core": ^7.20.3 "@types/babel__preset-env": ^7.9.4 "@types/fibers": ^3.1.3 - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 babel-jest: ^29.5.0 eslint: ~8.45.0 fibers: ^5.0.3 - jest: ~29.6.4 + jest: ~29.7.0 mongodb: ^4.17.2 prettier: ~2.8.8 typescript: ~5.3.3 languageName: unknown linkType: soft -"@rocket.chat/core-typings@workspace:^, @rocket.chat/core-typings@workspace:packages/core-typings": +"@rocket.chat/core-typings@workspace:^, @rocket.chat/core-typings@workspace:packages/core-typings, @rocket.chat/core-typings@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/core-typings@workspace:packages/core-typings" dependencies: - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.0 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/icons": ^0.36.0 "@rocket.chat/message-parser": "workspace:^" @@ -8660,11 +8629,8 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/random": "workspace:^" - "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.4 mongodb: ^4.17.2 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -8691,21 +8657,19 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/ddp-client@workspace:^, @rocket.chat/ddp-client@workspace:ee/packages/ddp-client": +"@rocket.chat/ddp-client@workspace:^, @rocket.chat/ddp-client@workspace:ee/packages/ddp-client, @rocket.chat/ddp-client@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/ddp-client@workspace:ee/packages/ddp-client" dependencies: "@rocket.chat/api-client": "workspace:^" + "@rocket.chat/core-typings": "workspace:~" + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/rest-typings": "workspace:^" - "@swc/core": ^1.3.95 - "@swc/jest": ^0.2.29 - "@types/jest": ^29.5.12 + "@types/jest": ~29.5.12 "@types/ws": ^8.5.8 eslint: ~8.45.0 - jest: ~29.6.4 - jest-environment-jsdom: ~29.6.4 - jest-websocket-mock: ^2.4.0 - ts-jest: ^29.1.2 + jest: ~29.7.0 + jest-websocket-mock: ~2.5.0 typescript: ~5.3.3 ws: ^8.13.0 peerDependencies: @@ -8717,9 +8681,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ddp-streamer@workspace:ee/apps/ddp-streamer" dependencies: - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.0 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" + "@rocket.chat/ddp-client": "workspace:~" "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" "@rocket.chat/instance-status": "workspace:^" @@ -8728,7 +8693,6 @@ __metadata: "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": ~0.31.25 - "@rocket.chat/ui-contexts": "workspace:^" "@types/ejson": ^2.2.1 "@types/gc-stats": ^1.4.2 "@types/meteor": ^2.9.8 @@ -8884,9 +8848,11 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-toastbar@npm:^0.32.0": - version: 0.32.0 - resolution: "@rocket.chat/fuselage-toastbar@npm:0.32.0" +"@rocket.chat/fuselage-toastbar@npm:^0.33.0": + version: 0.33.0 + resolution: "@rocket.chat/fuselage-toastbar@npm:0.33.0" + dependencies: + react-timing-hooks: ~4.0.2 peerDependencies: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" @@ -8894,7 +8860,7 @@ __metadata: "@rocket.chat/styled": "*" react: ^17.0.2 react-dom: ^17.0.2 - checksum: 5e78516aee6446da4c76dac10ff83adb4deeb86d6111c42419f0629c35ec64b19ae6ab563f20b5efa2600c9c723b9096edc3c166e960fd25cfda1f07c4df3f3f + checksum: 97993ad2acdc5a742b71c94f9d321e090769c4116ab52208c2103ca41d4455bc4cd15c0cd0a1f8545144910a8c7f7de645ee150c0d8fc6b746001244690de2ed languageName: node linkType: hard @@ -8913,14 +8879,15 @@ __metadata: "@babel/preset-env": ~7.22.20 "@babel/preset-react": ~7.22.15 "@babel/preset-typescript": ~7.22.15 - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.0 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/gazzodown": "workspace:^" "@rocket.chat/icons": ^0.36.0 + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/mock-providers": "workspace:^" "@rocket.chat/prettier-config": ~0.31.25 "@rocket.chat/styled": ~0.31.25 @@ -8936,9 +8903,8 @@ __metadata: "@storybook/source-loader": ~6.5.16 "@storybook/theming": ~6.5.16 "@tanstack/react-query": ^4.16.1 - "@testing-library/react": ^12.1.4 - "@testing-library/react-hooks": ^8.0.1 - "@testing-library/user-event": ^14.5.2 + "@testing-library/react": ~16.0.0 + "@testing-library/user-event": ~14.5.2 "@types/babel__core": ^7.20.3 "@types/babel__preset-env": ^7.9.4 "@types/react": ~17.0.69 @@ -8947,7 +8913,7 @@ __metadata: cross-env: ^7.0.3 eslint: ~8.45.0 i18next: ^23.10.1 - jest: ^29.7.0 + jest: ~29.7.0 normalize.css: ^8.0.1 npm-run-all: ^4.1.5 prettier: ~2.8.8 @@ -8956,7 +8922,6 @@ __metadata: react-i18next: ^14.1.0 rimraf: ^3.0.2 storybook-dark-mode: ~3.0.1 - ts-jest: ^29.1.2 tslib: ^2.5.3 typescript: ~5.3.3 peerDependencies: @@ -8968,19 +8933,19 @@ __metadata: "@rocket.chat/icons": "*" "@rocket.chat/prettier-config": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 4.0.0 - "@rocket.chat/ui-contexts": 8.0.0 - "@rocket.chat/ui-kit": 0.35.0 - "@rocket.chat/ui-video-conf": 8.0.0 + "@rocket.chat/ui-avatar": 5.0.0 + "@rocket.chat/ui-contexts": 9.0.0 + "@rocket.chat/ui-kit": 0.36.0 + "@rocket.chat/ui-video-conf": 9.0.0 "@tanstack/react-query": "*" react: "*" react-dom: "*" languageName: unknown linkType: soft -"@rocket.chat/fuselage@npm:^0.55.2": - version: 0.55.2 - resolution: "@rocket.chat/fuselage@npm:0.55.2" +"@rocket.chat/fuselage@npm:^0.57.0": + version: 0.57.0 + resolution: "@rocket.chat/fuselage@npm:0.57.0" dependencies: "@rocket.chat/css-in-js": ^0.31.25 "@rocket.chat/css-supports": ^0.31.25 @@ -8998,7 +8963,7 @@ __metadata: react: ^17.0.2 react-dom: ^17.0.2 react-virtuoso: 1.2.4 - checksum: 286f4ac261621a09de74e34ef52f5c473e7c2e55ca977507ab1b1fdccf7274c2ca788a42d1415ffd4f4f629377b0bb1ed9ad70ddead7b46d3b422bac1b861431 + checksum: 80f49f79ca6655067f528a9b427a7bfabbcf1583d0c9f3ed40b79217c7a495e93e0335e15e29b23237bf2ccb5ee5fa063051b40bf4d539439f452ffd45fdb537 languageName: node linkType: hard @@ -9009,8 +8974,9 @@ __metadata: "@babel/core": ~7.22.20 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/fuselage-tokens": ^0.33.1 + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/styled": ~0.31.25 "@rocket.chat/ui-client": "workspace:^" @@ -9024,15 +8990,11 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@swc/core": ^1.3.95 - "@swc/jest": ^0.2.29 - "@testing-library/jest-dom": ^5.16.5 - "@testing-library/react": ~12.1.5 - "@types/jest": ~29.5.7 + "@testing-library/react": ~16.0.0 + "@types/jest": ~29.5.12 "@types/katex": ~0.16.5 "@types/react": ~17.0.69 "@types/react-dom": ~17.0.22 - "@types/testing-library__jest-dom": ~5.14.9 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 babel-loader: ^8.3.0 @@ -9044,14 +9006,12 @@ __metadata: eslint-plugin-storybook: ~0.6.15 highlight.js: ^11.5.1 identity-obj-proxy: ^3.0.0 - jest: ~29.6.4 - jest-environment-jsdom: ~29.6.4 + jest: ~29.7.0 katex: ~0.16.9 outdent: ^0.8.0 react-docgen-typescript-plugin: ~1.0.5 react-dom: ~17.0.2 react-error-boundary: ^3.1.4 - ts-jest: ~29.1.1 typescript: ~5.3.3 peerDependencies: "@rocket.chat/core-typings": "workspace:^" @@ -9060,8 +9020,8 @@ __metadata: "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/message-parser": 0.31.29 "@rocket.chat/styled": "*" - "@rocket.chat/ui-client": 8.0.0 - "@rocket.chat/ui-contexts": 8.0.0 + "@rocket.chat/ui-client": 9.0.0 + "@rocket.chat/ui-contexts": 9.0.0 katex: "*" react: "*" languageName: unknown @@ -9071,12 +9031,9 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/i18n@workspace:packages/i18n" dependencies: - "@babel/core": ~7.22.20 - "@babel/preset-env": ~7.22.20 - babel-jest: ^29.5.0 + "@rocket.chat/jest-presets": "workspace:~" eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 + jest: ~29.7.0 tsup: ^6.7.0 typescript: ~5.3.3 languageName: unknown @@ -9102,15 +9059,38 @@ __metadata: languageName: unknown linkType: soft +"@rocket.chat/jest-presets@workspace:packages/jest-presets, @rocket.chat/jest-presets@workspace:~": + version: 0.0.0-use.local + resolution: "@rocket.chat/jest-presets@workspace:packages/jest-presets" + dependencies: + "@rocket.chat/eslint-config": "workspace:~" + "@swc/core": ~1.7.4 + "@swc/jest": ~0.2.36 + "@testing-library/jest-dom": ~6.4.8 + "@types/identity-obj-proxy": ^3 + "@types/jest": ~29.5.12 + "@types/jest-axe": ~3.5.9 + "@types/uuid": ^9 + eslint: ~8.45.0 + identity-obj-proxy: ~3.0.0 + jest: ~29.7.0 + jest-axe: ~9.0.0 + jest-environment-jsdom: ~29.7.0 + jest-environment-node: ~29.7.0 + typescript: ~5.4.5 + uuid: ~9.0.1 + languageName: unknown + linkType: soft + "@rocket.chat/jwt@workspace:^, @rocket.chat/jwt@workspace:packages/jwt": version: 0.0.0-use.local resolution: "@rocket.chat/jwt@workspace:packages/jwt" dependencies: - "@types/jest": ~29.5.7 + "@rocket.chat/jest-presets": "workspace:~" + "@types/jest": ~29.5.12 eslint: ~8.45.0 - jest: ~29.6.4 + jest: ~29.7.0 jose: ^4.14.4 - ts-jest: ^29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9132,19 +9112,16 @@ __metadata: resolution: "@rocket.chat/license@workspace:ee/packages/license" dependencies: "@rocket.chat/core-typings": "workspace:^" + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/jwt": "workspace:^" "@rocket.chat/logger": "workspace:^" - "@swc/core": ^1.3.95 - "@swc/jest": ^0.2.29 "@types/bcrypt": ^5.0.1 - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 "@types/ws": ^8.5.8 bcrypt: ^5.0.1 eslint: ~8.45.0 - jest: ~29.6.4 - jest-environment-jsdom: ~29.6.4 - jest-websocket-mock: ^2.4.0 - ts-jest: ~29.1.1 + jest: ~29.7.0 + jest-websocket-mock: ~2.5.0 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9252,12 +9229,9 @@ __metadata: dependencies: "@types/chalk": ^2.2.0 "@types/ejson": ^2.2.1 - "@types/jest": ~29.5.7 chalk: ^4.0.0 ejson: ^2.2.3 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9267,11 +9241,8 @@ __metadata: resolution: "@rocket.chat/logger@workspace:packages/logger" dependencies: "@rocket.chat/emitter": ~0.31.25 - "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.4 pino: ^8.15.0 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9304,21 +9275,21 @@ __metadata: "@babel/eslint-parser": ~7.21.3 "@babel/preset-env": ~7.21.4 "@rocket.chat/eslint-config": "workspace:^" + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/peggy-loader": "workspace:~" "@rocket.chat/prettier-config": ~0.31.25 - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 "@types/node": ~14.18.42 "@typescript-eslint/parser": ~5.58.0 babel-loader: ~9.1.2 eslint: ~8.45.0 - jest: ~29.6.4 + jest: ~29.7.0 npm-run-all: ^4.1.5 peggy: 3.0.2 prettier: ~2.8.7 prettier-plugin-pegjs: ~0.5.4 rimraf: ^3.0.2 tldts: ~5.7.112 - ts-jest: ~29.1.0 ts-loader: ~9.4.2 typedoc: ~0.24.1 typescript: ~5.3.3 @@ -9358,7 +9329,7 @@ __metadata: "@rocket.chat/agenda": "workspace:^" "@rocket.chat/api-client": "workspace:^" "@rocket.chat/apps": "workspace:^" - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.0 "@rocket.chat/base64": "workspace:^" "@rocket.chat/cas-validate": "workspace:^" "@rocket.chat/core-services": "workspace:^" @@ -9370,16 +9341,17 @@ __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.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 - "@rocket.chat/fuselage-toastbar": ^0.32.0 + "@rocket.chat/fuselage-toastbar": ^0.33.0 "@rocket.chat/fuselage-tokens": ^0.33.1 "@rocket.chat/fuselage-ui-kit": "workspace:^" "@rocket.chat/gazzodown": "workspace:^" "@rocket.chat/i18n": "workspace:^" "@rocket.chat/icons": ^0.36.0 "@rocket.chat/instance-status": "workspace:^" + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/jwt": "workspace:^" "@rocket.chat/layout": ~0.31.26 "@rocket.chat/license": "workspace:^" @@ -9425,13 +9397,10 @@ __metadata: "@storybook/addons": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": 0.0.13 - "@swc/core": ^1.3.95 - "@swc/jest": ^0.2.29 "@tanstack/react-query": ^4.16.1 "@tanstack/react-query-devtools": ^4.19.1 - "@testing-library/react": ~12.1.5 - "@testing-library/react-hooks": ^8.0.1 - "@testing-library/user-event": ~13.5.0 + "@testing-library/react": ~16.0.0 + "@testing-library/user-event": ~14.5.2 "@types/adm-zip": ^0.5.3 "@types/archiver": ^5.3.4 "@types/bad-words": ^3.0.2 @@ -9458,6 +9427,7 @@ __metadata: "@types/he": ^1.1.2 "@types/i18next-sprintf-postprocessor": ^0.2.2 "@types/imap": ^0.8.39 + "@types/jest": ~29.5.12 "@types/jsdom": ^16.2.15 "@types/jsdom-global": ^3.0.6 "@types/jsrsasign": ^10.5.11 @@ -9566,7 +9536,7 @@ __metadata: eslint-plugin-prettier: ~4.2.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 - eslint-plugin-testing-library: ~5.11.1 + eslint-plugin-testing-library: ~6.2.2 eslint-plugin-you-dont-need-lodash-underscore: ~6.12.0 eventemitter3: ^4.0.7 exif-be-gone: ^1.3.2 @@ -9597,7 +9567,7 @@ __metadata: ip-range-check: ^0.2.0 is-svg: ^4.3.2 isolated-vm: 4.4.2 - jest: ~29.6.4 + jest: ~29.7.0 jschardet: ^3.0.0 jsdom: ^16.7.0 jsdom-global: ^3.0.2 @@ -9718,35 +9688,33 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/mock-providers@workspace:packages/mock-providers" dependencies: + "@rocket.chat/ddp-client": "workspace:~" + "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/i18n": "workspace:~" "@rocket.chat/ui-contexts": "workspace:*" "@storybook/react": ~6.5.16 "@tanstack/react-query": ^4.16.1 - "@types/jest": ~29.5.7 + "@types/use-sync-external-store": ^0.0.5 eslint: ~8.45.0 i18next: ~23.4.9 - jest: ~29.6.4 react: ~17.0.2 react-i18next: ~13.2.2 - ts-jest: ~29.1.1 typescript: ~5.3.3 + use-sync-external-store: ~1.2.2 peerDependencies: "@tanstack/react-query": "*" react: "*" languageName: unknown linkType: soft -"@rocket.chat/model-typings@workspace:^, @rocket.chat/model-typings@workspace:packages/model-typings": +"@rocket.chat/model-typings@workspace:^, @rocket.chat/model-typings@workspace:packages/model-typings, @rocket.chat/model-typings@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/model-typings@workspace:packages/model-typings" dependencies: "@rocket.chat/core-typings": "workspace:^" - "@types/jest": ~29.5.7 "@types/node-rsa": ^1.1.3 eslint: ~8.45.0 - jest: ~29.6.4 mongodb: ^4.17.2 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9755,13 +9723,11 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/models@workspace:packages/models" dependencies: - "@rocket.chat/model-typings": "workspace:^" - "@swc/core": ^1.3.95 - "@swc/jest": ^0.2.29 - "@types/jest": ~29.5.7 + "@rocket.chat/jest-presets": "workspace:~" + "@rocket.chat/model-typings": "workspace:~" + "@types/jest": ~29.5.12 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 + jest: ^29.7.0 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9783,6 +9749,7 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/logger": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" @@ -9790,20 +9757,20 @@ __metadata: "@rocket.chat/rest-typings": "workspace:^" "@rocket.chat/string-helpers": ~0.31.25 "@rocket.chat/tools": "workspace:^" - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 "@types/node": ^14.18.63 + date-fns: ^2.28.0 ejson: ^2.2.3 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 eventemitter3: ^4.0.7 fibers: ^5.0.3 - jest: ~29.6.4 + jest: ~29.7.0 mem: ^8.1.1 moment-timezone: ^0.5.43 mongo-message-queue: ^1.0.0 mongodb: ^4.17.2 pino: ^8.15.0 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9823,7 +9790,6 @@ __metadata: "@rocket.chat/omnichannel-services": "workspace:^" "@rocket.chat/pdf-worker": "workspace:^" "@rocket.chat/tools": "workspace:^" - "@rocket.chat/ui-contexts": "workspace:^" "@types/gc-stats": ^1.4.2 "@types/node": ^14.18.63 "@types/polka": ^0.5.6 @@ -9872,12 +9838,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/password-policies@workspace:packages/password-policies" dependencies: - "@types/chai": ~4.3.16 - "@types/jest": ~29.5.7 - chai: ^4.3.10 + "@rocket.chat/jest-presets": "workspace:~" + "@types/jest": ~29.5.12 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 + jest: ~29.7.0 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9886,10 +9850,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/patch-injection@workspace:packages/patch-injection" dependencies: - "@types/jest": ~29.5.7 + "@rocket.chat/jest-presets": "workspace:~" + "@types/jest": ~29.5.12 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 + jest: ~29.7.0 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9901,25 +9865,22 @@ __metadata: "@react-pdf/renderer": ^3.1.14 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/fuselage-tokens": ^0.33.1 + "@rocket.chat/jest-presets": "workspace:~" "@storybook/addon-essentials": ~6.5.16 "@storybook/react": ~6.5.16 - "@testing-library/jest-dom": ^5.16.5 - "@testing-library/react": ~13.4.0 + "@testing-library/react": ~16.0.0 "@types/emojione": ^2.2.8 - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 "@types/react": ~17.0.69 "@types/react-dom": ~17.0.22 - "@types/testing-library__jest-dom": ~5.14.9 emoji-assets: ^7.0.1 emoji-toolkit: ^7.0.1 eslint: ~8.45.0 - jest: ~29.6.4 - jest-environment-jsdom: ~29.6.4 + jest: ~29.7.0 moment: ^2.29.4 moment-timezone: ^0.5.43 - react: ^18.2.0 - react-dom: ^18.2.0 - ts-jest: ~29.1.1 + react: ~18.3.1 + react-dom: ~18.3.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9936,7 +9897,6 @@ __metadata: peggy: 3.0.2 prettier: ~2.8.7 rimraf: ^3.0.2 - ts-jest: ~29.1.0 typescript: ~5.3.3 webpack: ~5.78.0 peerDependencies: @@ -9949,10 +9909,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/poplib@workspace:packages/node-poplib" dependencies: - "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -9996,7 +9953,7 @@ __metadata: "@babel/core": ~7.22.20 "@babel/preset-env": ~7.22.20 "@babel/preset-typescript": ~7.22.15 - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.0 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" @@ -10005,7 +9962,7 @@ __metadata: "@types/node": ^14.18.63 babel-jest: ^29.0.3 eslint: ~8.45.0 - jest: ~29.6.4 + jest: ~29.7.0 mongodb: ^4.17.2 typescript: ~5.3.3 languageName: unknown @@ -10063,12 +10020,11 @@ __metadata: "@babel/core": ~7.22.20 "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" + "@rocket.chat/jest-presets": "workspace:~" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.4 - jest-environment-jsdom: ~29.6.4 - ts-jest: ~29.1.1 + jest: ~29.7.0 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -10111,19 +10067,17 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/rest-typings@workspace:packages/rest-typings" dependencies: - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.0 "@rocket.chat/core-typings": "workspace:^" - "@rocket.chat/eslint-config": "workspace:^" + "@rocket.chat/eslint-config": "workspace:~" "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/ui-kit": "workspace:~" - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 ajv: ^8.11.0 ajv-formats: ^2.1.1 eslint: ~8.45.0 - jest: ~29.6.4 - jest-environment-jsdom: ~29.6.4 + jest: ~29.7.0 mongodb: ^4.17.2 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -10146,10 +10100,7 @@ __metadata: resolution: "@rocket.chat/server-cloud-communication@workspace:packages/server-cloud-communication" dependencies: "@rocket.chat/license": "workspace:^" - "@types/jest": ~29.5.7 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -10158,15 +10109,12 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/server-fetch@workspace:packages/server-fetch" dependencies: - "@types/jest": ~29.5.7 "@types/proxy-from-env": ^1.0.3 eslint: ~8.45.0 http-proxy-agent: ^5.0.0 https-proxy-agent: ^5.0.1 - jest: ~29.6.4 node-fetch: 2.3.0 proxy-from-env: ^1.1.0 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -10178,11 +10126,11 @@ __metadata: "@babel/core": ~7.22.20 "@babel/preset-env": ~7.22.20 "@rocket.chat/eslint-config": "workspace:^" + "@rocket.chat/jest-presets": "workspace:~" "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 eslint: ~8.45.0 - jest: ~29.6.4 - ts-jest: ~29.1.1 + jest: ~29.7.0 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -10252,11 +10200,11 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/tools@workspace:packages/tools" dependencies: - "@types/jest": ~29.5.7 + "@rocket.chat/jest-presets": "workspace:~" + "@types/jest": ~29.5.12 eslint: ~8.45.0 - jest: ~29.6.4 + jest: ~29.7.0 moment-timezone: ^0.5.43 - ts-jest: ~29.1.1 typescript: ~5.3.3 languageName: unknown linkType: soft @@ -10266,7 +10214,7 @@ __metadata: resolution: "@rocket.chat/ui-avatar@workspace:packages/ui-avatar" dependencies: "@babel/core": ~7.22.20 - "@rocket.chat/fuselage": ^0.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/ui-contexts": "workspace:^" "@types/babel__core": ~7.20.3 "@types/react": ~17.0.69 @@ -10280,7 +10228,7 @@ __metadata: typescript: ~5.3.3 peerDependencies: "@rocket.chat/fuselage": "*" - "@rocket.chat/ui-contexts": 8.0.0 + "@rocket.chat/ui-contexts": 9.0.0 react: ~17.0.2 languageName: unknown linkType: soft @@ -10292,9 +10240,10 @@ __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.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/icons": ^0.36.0 + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/mock-providers": "workspace:^" "@rocket.chat/ui-contexts": "workspace:~" "@storybook/addon-actions": ~6.5.16 @@ -10307,12 +10256,9 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 - "@swc/jest": ^0.2.29 - "@testing-library/jest-dom": ~5.16.5 - "@testing-library/react": ^12.1.5 - "@testing-library/react-hooks": ^8.0.1 + "@testing-library/react": ~16.0.0 "@types/babel__core": ~7.20.3 - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 "@types/react": ~17.0.69 "@types/react-dom": ~17.0.22 eslint: ~8.45.0 @@ -10321,11 +10267,10 @@ __metadata: eslint-plugin-react-hooks: ~4.6.0 eslint-plugin-storybook: ~0.6.15 eslint-plugin-testing-library: ~5.11.1 - jest: ~29.6.4 + jest: ~29.7.0 react: ^17.0.2 react-dom: ^17.0.2 react-hook-form: ~7.45.4 - ts-jest: ~29.1.1 typescript: ~5.3.3 peerDependencies: "@react-aria/toolbar": "*" @@ -10333,7 +10278,7 @@ __metadata: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" - "@rocket.chat/ui-contexts": 8.0.0 + "@rocket.chat/ui-contexts": 9.0.0 react: ~17.0.2 languageName: unknown linkType: soft @@ -10345,7 +10290,7 @@ __metadata: "@babel/core": ~7.22.20 "@react-aria/toolbar": ^3.0.0-beta.1 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/icons": ^0.36.0 "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 @@ -10355,14 +10300,15 @@ __metadata: "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 "@types/babel__core": ~7.20.3 - "@types/jest": ~29.5.7 + "@types/react": ~17.0.69 + "@types/react-dom": ~17.0.22 eslint: ~8.45.0 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 eslint-plugin-storybook: ~0.6.15 - jest: ~29.6.4 + react: ~17.0.2 react-docgen-typescript-plugin: ~1.0.5 - ts-jest: ~29.1.1 + react-dom: ~17.0.2 typescript: ~5.3.3 peerDependencies: "@react-aria/toolbar": "*" @@ -10378,21 +10324,19 @@ __metadata: resolution: "@rocket.chat/ui-contexts@workspace:packages/ui-contexts" dependencies: "@rocket.chat/core-typings": "workspace:^" + "@rocket.chat/ddp-client": "workspace:~" "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/i18n": "workspace:~" "@rocket.chat/password-policies": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" - "@types/jest": ~29.5.7 "@types/react": ~17.0.69 "@types/react-dom": ~17.0.22 "@types/use-sync-external-store": ^0.0.5 eslint: ~8.45.0 eslint-plugin-react-hooks: ^4.6.0 - jest: ~29.6.4 mongodb: ^4.17.2 react: ~17.0.2 - ts-jest: ~29.1.1 typescript: ~5.3.3 use-sync-external-store: ^1.2.0 peerDependencies: @@ -10416,10 +10360,12 @@ __metadata: "@babel/plugin-transform-runtime": ~7.21.4 "@babel/preset-env": ~7.21.4 "@rocket.chat/eslint-config": "workspace:~" - "@types/jest": ~29.5.0 + "@rocket.chat/icons": ^0.36.0 + "@rocket.chat/jest-presets": "workspace:~" + "@types/jest": ~29.5.12 babel-loader: ~9.1.2 eslint: ~8.45.0 - jest: ~29.5.0 + jest: ~29.7.0 npm-run-all: ~4.1.5 prettier: ~2.8.8 rimraf: ~3.0.2 @@ -10429,6 +10375,8 @@ __metadata: ts-patch: ~3.0.2 typescript: ~5.3.3 typia: ~5.3.3 + peerDependencies: + "@rocket.chat/icons": "*" languageName: unknown linkType: soft @@ -10437,31 +10385,18 @@ __metadata: resolution: "@rocket.chat/ui-theming@workspace:ee/packages/ui-theming" dependencies: "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/icons": ^0.36.0 "@rocket.chat/ui-contexts": "workspace:~" - "@storybook/addon-actions": ~6.5.16 - "@storybook/addon-docs": ~6.5.16 - "@storybook/addon-essentials": ~6.5.16 - "@storybook/addon-interactions": ~6.5.16 - "@storybook/addon-links": ~6.5.16 - "@storybook/addon-postcss": ~2.0.0 - "@storybook/builder-webpack4": ~6.5.16 - "@storybook/manager-webpack4": ~6.5.16 - "@storybook/react": ~6.5.16 - "@storybook/testing-library": ~0.0.13 - "@types/jest": ~29.5.7 "@types/react": ~17.0.69 eslint: ~8.45.0 eslint-plugin-anti-trojan-source: ~1.1.1 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 eslint-plugin-testing-library: ^5.11.1 - jest: ~29.6.4 react: ~17.0.2 react-docgen-typescript-plugin: ~1.0.5 - ts-jest: ~29.1.1 typescript: ~5.3.3 peerDependencies: "@rocket.chat/css-in-js": "*" @@ -10480,12 +10415,14 @@ __metadata: "@rocket.chat/css-in-js": ~0.31.25 "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/icons": ^0.36.0 + "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/styled": ~0.31.25 "@rocket.chat/ui-avatar": "workspace:^" "@rocket.chat/ui-contexts": "workspace:^" + "@storybook/addon-a11y": ^6.5.16 "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 "@storybook/addon-essentials": ~6.5.16 @@ -10493,15 +10430,17 @@ __metadata: "@storybook/manager-webpack4": ~6.5.16 "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 + "@storybook/testing-react": ~1.3.0 "@types/babel__core": ~7.20.3 - "@types/jest": ~29.5.7 + "@types/jest": ~29.5.12 + "@types/jest-axe": ~3.5.9 eslint: ~8.45.0 eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 eslint-plugin-storybook: ~0.6.15 - jest: ~29.6.4 + jest: ~29.7.0 + jest-axe: ~9.0.0 react-docgen-typescript-plugin: ~1.0.5 - ts-jest: ~29.1.1 typescript: ~5.3.3 peerDependencies: "@rocket.chat/css-in-js": "*" @@ -10509,8 +10448,8 @@ __metadata: "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 4.0.0 - "@rocket.chat/ui-contexts": 8.0.0 + "@rocket.chat/ui-avatar": 5.0.0 + "@rocket.chat/ui-contexts": 9.0.0 react: ^17.0.2 react-dom: ^17.0.2 languageName: unknown @@ -10525,10 +10464,10 @@ __metadata: "@codemirror/tooltip": ^0.19.16 "@lezer/highlight": ^1.1.6 "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.55.2 + "@rocket.chat/fuselage": ^0.57.0 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 - "@rocket.chat/fuselage-toastbar": ^0.32.0 + "@rocket.chat/fuselage-toastbar": ^0.33.0 "@rocket.chat/fuselage-tokens": ^0.33.1 "@rocket.chat/fuselage-ui-kit": "workspace:~" "@rocket.chat/icons": ^0.36.0 @@ -10585,22 +10524,19 @@ __metadata: "@storybook/react": ~6.5.16 "@storybook/testing-library": ^0.2.2 "@tanstack/react-query": ^4.16.1 - "@testing-library/react": ^13.3.0 - "@types/jest": ~29.5.7 + "@testing-library/react": ~16.0.0 "@types/react": ~17.0.69 babel-loader: ~8.3.0 eslint: ~8.45.0 - jest: ~29.6.4 react: ~17.0.2 react-hook-form: ~7.45.4 react-i18next: ~13.2.2 storybook-dark-mode: ~3.0.1 - ts-jest: ~29.1.1 typescript: ~5.3.3 peerDependencies: "@rocket.chat/layout": "*" - "@rocket.chat/tools": 0.2.1 - "@rocket.chat/ui-contexts": 8.0.0 + "@rocket.chat/tools": 0.2.2 + "@rocket.chat/ui-contexts": 9.0.0 "@tanstack/react-query": "*" react: "*" react-hook-form: "*" @@ -10633,13 +10569,6 @@ __metadata: languageName: node linkType: hard -"@sinclair/typebox@npm:^0.24.1": - version: 0.24.51 - resolution: "@sinclair/typebox@npm:0.24.51" - checksum: fd0d855e748ef767eb19da1a60ed0ab928e91e0f358c1dd198d600762c0015440b15755e96d1176e2a0db7e09c6a64ed487828ee10dd0c3e22f61eb09c478cd0 - languageName: node - linkType: hard - "@sinclair/typebox@npm:^0.27.8": version: 0.27.8 resolution: "@sinclair/typebox@npm:0.27.8" @@ -10859,7 +10788,7 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-a11y@npm:6.5.16": +"@storybook/addon-a11y@npm:6.5.16, @storybook/addon-a11y@npm:^6.5.16": version: 6.5.16 resolution: "@storybook/addon-a11y@npm:6.5.16" dependencies: @@ -11836,6 +11765,15 @@ __metadata: languageName: node linkType: hard +"@storybook/csf@npm:0.0.2--canary.87bc651.0": + version: 0.0.2--canary.87bc651.0 + resolution: "@storybook/csf@npm:0.0.2--canary.87bc651.0" + dependencies: + lodash: ^4.17.15 + checksum: 1533ff81f7fb59c06fc608f452de3cfcafba5806da68dd2c88813e8284a7aa1c158daee6a58b028b7ccd03d96974b5d3727deaae1d1d38e304b2a7cdcd8a678d + languageName: node + linkType: hard + "@storybook/csf@npm:^0.0.1": version: 0.0.1 resolution: "@storybook/csf@npm:0.0.1" @@ -12375,6 +12313,21 @@ __metadata: languageName: node linkType: hard +"@storybook/testing-react@npm:~1.3.0": + version: 1.3.0 + resolution: "@storybook/testing-react@npm:1.3.0" + dependencies: + "@storybook/csf": 0.0.2--canary.87bc651.0 + peerDependencies: + "@storybook/addons": ">=6.4.0" + "@storybook/client-api": ">=6.4.0" + "@storybook/preview-web": ">=6.4.0" + "@storybook/react": ">=6.4.0" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: f7da948bfc100b7a3d8f3ddf02e8d610da80344904761ecdaa7a575dcc312c921ef4a28663edcc719aee587b14716643147b0e10414fa17abb740056cf9e80b5 + languageName: node + linkType: hard + "@storybook/theming@npm:6.5.16, @storybook/theming@npm:~6.5.16": version: 6.5.16 resolution: "@storybook/theming@npm:6.5.16" @@ -12442,94 +12395,94 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-darwin-arm64@npm:1.3.95" +"@swc/core-darwin-arm64@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-darwin-arm64@npm:1.7.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-darwin-x64@npm:1.3.95" +"@swc/core-darwin-x64@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-darwin-x64@npm:1.7.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.95" +"@swc/core-linux-arm-gnueabihf@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.4" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-linux-arm64-gnu@npm:1.3.95" +"@swc/core-linux-arm64-gnu@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-linux-arm64-gnu@npm:1.7.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-linux-arm64-musl@npm:1.3.95" +"@swc/core-linux-arm64-musl@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-linux-arm64-musl@npm:1.7.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-linux-x64-gnu@npm:1.3.95" +"@swc/core-linux-x64-gnu@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-linux-x64-gnu@npm:1.7.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-linux-x64-musl@npm:1.3.95" +"@swc/core-linux-x64-musl@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-linux-x64-musl@npm:1.7.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-win32-arm64-msvc@npm:1.3.95" +"@swc/core-win32-arm64-msvc@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-win32-arm64-msvc@npm:1.7.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-win32-ia32-msvc@npm:1.3.95" +"@swc/core-win32-ia32-msvc@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-win32-ia32-msvc@npm:1.7.4" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.3.95": - version: 1.3.95 - resolution: "@swc/core-win32-x64-msvc@npm:1.3.95" +"@swc/core-win32-x64-msvc@npm:1.7.4": + version: 1.7.4 + resolution: "@swc/core-win32-x64-msvc@npm:1.7.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.3.95": - version: 1.3.95 - resolution: "@swc/core@npm:1.3.95" - dependencies: - "@swc/core-darwin-arm64": 1.3.95 - "@swc/core-darwin-x64": 1.3.95 - "@swc/core-linux-arm-gnueabihf": 1.3.95 - "@swc/core-linux-arm64-gnu": 1.3.95 - "@swc/core-linux-arm64-musl": 1.3.95 - "@swc/core-linux-x64-gnu": 1.3.95 - "@swc/core-linux-x64-musl": 1.3.95 - "@swc/core-win32-arm64-msvc": 1.3.95 - "@swc/core-win32-ia32-msvc": 1.3.95 - "@swc/core-win32-x64-msvc": 1.3.95 - "@swc/counter": ^0.1.1 - "@swc/types": ^0.1.5 - peerDependencies: - "@swc/helpers": ^0.5.0 +"@swc/core@npm:~1.7.4": + version: 1.7.4 + resolution: "@swc/core@npm:1.7.4" + dependencies: + "@swc/core-darwin-arm64": 1.7.4 + "@swc/core-darwin-x64": 1.7.4 + "@swc/core-linux-arm-gnueabihf": 1.7.4 + "@swc/core-linux-arm64-gnu": 1.7.4 + "@swc/core-linux-arm64-musl": 1.7.4 + "@swc/core-linux-x64-gnu": 1.7.4 + "@swc/core-linux-x64-musl": 1.7.4 + "@swc/core-win32-arm64-msvc": 1.7.4 + "@swc/core-win32-ia32-msvc": 1.7.4 + "@swc/core-win32-x64-msvc": 1.7.4 + "@swc/counter": ^0.1.3 + "@swc/types": ^0.1.12 + peerDependencies: + "@swc/helpers": "*" dependenciesMeta: "@swc/core-darwin-arm64": optional: true @@ -12554,14 +12507,14 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 49856ad64fa16151f7f784956c8134060c5ed612c9b3fcb79e33676c77219f61fa3bb6b9e0dd15d78c7bff92cacc0c944d2b4e60849eb93caca917a8544b1c2c + checksum: 1b2231fcb6a2a63171e34e80f0d43cd459d259b0a2fa269a129456291dc11b95a716aed60f61e5fcafd039a217916ece375876b02d125d88cdc7927382805e55 languageName: node linkType: hard -"@swc/counter@npm:^0.1.1": - version: 0.1.2 - resolution: "@swc/counter@npm:0.1.2" - checksum: 8427c594f1f0cf44b83885e9c8fe1e370c9db44ae96e07a37c117a6260ee97797d0709483efbcc244e77bac578690215f45b23254c4cd8a70fb25ddbb50bf33e +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 languageName: node linkType: hard @@ -12583,22 +12536,25 @@ __metadata: languageName: node linkType: hard -"@swc/jest@npm:^0.2.29": - version: 0.2.29 - resolution: "@swc/jest@npm:0.2.29" +"@swc/jest@npm:~0.2.36": + version: 0.2.36 + resolution: "@swc/jest@npm:0.2.36" dependencies: - "@jest/create-cache-key-function": ^27.4.2 + "@jest/create-cache-key-function": ^29.7.0 + "@swc/counter": ^0.1.3 jsonc-parser: ^3.2.0 peerDependencies: "@swc/core": "*" - checksum: 9eaad322310f34e81f67d41411a7d60663341af1bd9fb65456faa914c936d849d6f643fa3b942a187d52e71e62c33097098c639d25c2047fa874f49bf51cec76 + checksum: 14f2e696ac093e23dae1e2e57d894bbcde4de6fe80341a26c8d0d8cbae5aae31832f8fa32dc698529f128d19a76aeedf2227f59480de6dab5eb3f30bfdf9b71a languageName: node linkType: hard -"@swc/types@npm:^0.1.5": - version: 0.1.5 - resolution: "@swc/types@npm:0.1.5" - checksum: 6aee11f62d3d805a64848e0bd5f0e0e615f958e327a9e1260056c368d7d28764d89e38bd8005a536c9bf18afbcd303edd84099d60df34a2975d62540f61df13b +"@swc/types@npm:^0.1.12": + version: 0.1.12 + resolution: "@swc/types@npm:0.1.12" + dependencies: + "@swc/counter": ^0.1.3 + checksum: cf7f89e46f859864075d7965582baea9c5f98830f45b1046251568c9bdf1ca484b1bf37f6d3c32b7c82ecf8cd5df89d22f05268c391819c44e49911bb1a8e71a languageName: node linkType: hard @@ -12652,25 +12608,25 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:^8.0.0, @testing-library/dom@npm:^8.3.0, @testing-library/dom@npm:^8.5.0": - version: 8.17.1 - resolution: "@testing-library/dom@npm:8.17.1" +"@testing-library/dom@npm:^8.3.0": + version: 8.20.1 + resolution: "@testing-library/dom@npm:8.20.1" dependencies: "@babel/code-frame": ^7.10.4 "@babel/runtime": ^7.12.5 - "@types/aria-query": ^4.2.0 - aria-query: ^5.0.0 + "@types/aria-query": ^5.0.1 + aria-query: 5.1.3 chalk: ^4.1.0 dom-accessibility-api: ^0.5.9 - lz-string: ^1.4.4 + lz-string: ^1.5.0 pretty-format: ^27.0.2 - checksum: e4df091fcf84c9eac4a6ee4c76674c1d562bf98732f0ac8820972d7718ab10397b672b9f082aace3cacd1f610fc77de6e1b6094e67afe1df0443bf22eb9deab2 + checksum: 06fc8dc67849aadb726cbbad0e7546afdf8923bd39acb64c576d706249bd7d0d05f08e08a31913fb621162e3b9c2bd0dce15964437f030f9fa4476326fdd3007 languageName: node linkType: hard "@testing-library/dom@npm:^9.0.0": - version: 9.3.1 - resolution: "@testing-library/dom@npm:9.3.1" + version: 9.3.4 + resolution: "@testing-library/dom@npm:9.3.4" dependencies: "@babel/code-frame": ^7.10.4 "@babel/runtime": ^7.12.5 @@ -12680,78 +12636,47 @@ __metadata: dom-accessibility-api: ^0.5.9 lz-string: ^1.5.0 pretty-format: ^27.0.2 - checksum: 8ee3136451644e39990edea93709c38cf1e8ce5306f3c66273ca00935963faa51ca74e8d92b02eb442ccb842cfa28ca62833e393e075eb269cf9bef6f5600663 + checksum: dfd6fb0d6c7b4dd716ba3c47309bc9541b4a55772cb61758b4f396b3785efe2dbc75dc63423545c039078c7ffcc5e4b8c67c2db1b6af4799580466036f70026f languageName: node linkType: hard -"@testing-library/jest-dom@npm:^5.16.5, @testing-library/jest-dom@npm:~5.16.5": - version: 5.16.5 - resolution: "@testing-library/jest-dom@npm:5.16.5" +"@testing-library/jest-dom@npm:~6.4.8": + version: 6.4.8 + resolution: "@testing-library/jest-dom@npm:6.4.8" dependencies: - "@adobe/css-tools": ^4.0.1 + "@adobe/css-tools": ^4.4.0 "@babel/runtime": ^7.9.2 - "@types/testing-library__jest-dom": ^5.9.1 aria-query: ^5.0.0 chalk: ^3.0.0 css.escape: ^1.5.1 - dom-accessibility-api: ^0.5.6 - lodash: ^4.17.15 + dom-accessibility-api: ^0.6.3 + lodash: ^4.17.21 redent: ^3.0.0 - checksum: 94911f901a8031f3e489d04ac057cb5373621230f5d92bed80e514e24b069fb58a3166d1dd86963e55f078a1bd999da595e2ab96ed95f452d477e272937d792a + checksum: b601688950e522557c2c6bbc0f026ae31a10583577c8a557814b0eb33648fe82afc06299f3cdb79ff0c5076fd1a6106f3d76e2ca0dde6f7ee0555e63008fbd72 languageName: node linkType: hard -"@testing-library/react-hooks@npm:^8.0.1": - version: 8.0.1 - resolution: "@testing-library/react-hooks@npm:8.0.1" +"@testing-library/react@npm:~16.0.0": + version: 16.0.0 + resolution: "@testing-library/react@npm:16.0.0" dependencies: "@babel/runtime": ^7.12.5 - react-error-boundary: ^3.1.0 peerDependencies: - "@types/react": ^16.9.0 || ^17.0.0 - react: ^16.9.0 || ^17.0.0 - react-dom: ^16.9.0 || ^17.0.0 - react-test-renderer: ^16.9.0 || ^17.0.0 + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 + "@types/react-dom": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 peerDependenciesMeta: "@types/react": optional: true - react-dom: - optional: true - react-test-renderer: + "@types/react-dom": optional: true - checksum: 7fe44352e920deb5cb1876f80d64e48615232072c9d5382f1e0284b3aab46bb1c659a040b774c45cdf084a5257b8fe463f7e08695ad8480d8a15635d4d3d1f6d - languageName: node - linkType: hard - -"@testing-library/react@npm:^12.1.4, @testing-library/react@npm:^12.1.5, @testing-library/react@npm:~12.1.5": - version: 12.1.5 - resolution: "@testing-library/react@npm:12.1.5" - dependencies: - "@babel/runtime": ^7.12.5 - "@testing-library/dom": ^8.0.0 - "@types/react-dom": <18.0.0 - peerDependencies: - react: <18.0.0 - react-dom: <18.0.0 - checksum: 4abd0490405e709a7df584a0db604e508a4612398bb1326e8fa32dd9393b15badc826dcf6d2f7525437886d507871f719f127b9860ed69ddd204d1fa834f576a + checksum: 45a35f0b5f34b5a7f4dcefdd3f1d202d5421692e5cc7a491c9bc71e6ed9dd5872a182b80b4dfefb4a56d9c1df35e50f6fa2917bcf657cc26b4bc0d2259df0027 languageName: node linkType: hard -"@testing-library/react@npm:^13.3.0, @testing-library/react@npm:~13.4.0": - version: 13.4.0 - resolution: "@testing-library/react@npm:13.4.0" - dependencies: - "@babel/runtime": ^7.12.5 - "@testing-library/dom": ^8.5.0 - "@types/react-dom": ^18.0.0 - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 51ec548c1fdb1271089a5c63e0908f0166f2c7fcd9cacd3108ebbe0ce64cb4351812d885892020dc37608418cfb15698514856502b3cab0e5cc58d6cc1bd4a3e - languageName: node - linkType: hard - -"@testing-library/user-event@npm:^13.2.1, @testing-library/user-event@npm:~13.5.0": +"@testing-library/user-event@npm:^13.2.1": version: 13.5.0 resolution: "@testing-library/user-event@npm:13.5.0" dependencies: @@ -12762,16 +12687,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/user-event@npm:^14.4.0": - version: 14.5.1 - resolution: "@testing-library/user-event@npm:14.5.1" - peerDependencies: - "@testing-library/dom": ">=7.21.4" - checksum: 3e6bc9fd53dfe2f3648190193ed2fd4bca2a1bfb47f68810df3b33f05412526e5fd5c4ef9dc5375635e0f4cdf1859916867b597eed22bda1321e04242ea6c519 - languageName: node - linkType: hard - -"@testing-library/user-event@npm:^14.5.2": +"@testing-library/user-event@npm:^14.4.0, @testing-library/user-event@npm:~14.5.2": version: 14.5.2 resolution: "@testing-library/user-event@npm:14.5.2" peerDependencies: @@ -12854,17 +12770,10 @@ __metadata: languageName: node linkType: hard -"@types/aria-query@npm:^4.2.0": - version: 4.2.2 - resolution: "@types/aria-query@npm:4.2.2" - checksum: 6f2ce11d91e2d665f3873258db19da752d91d85d3679eb5efcdf9c711d14492287e1e4eb52613b28e60375841a9e428594e745b68436c963d8bad4bf72188df3 - languageName: node - linkType: hard - "@types/aria-query@npm:^5.0.1": - version: 5.0.1 - resolution: "@types/aria-query@npm:5.0.1" - checksum: 69fd7cceb6113ed370591aef04b3fd0742e9a1b06dd045c43531448847b85de181495e4566f98e776b37c422a12fd71866e0a1dfd904c5ec3f84d271682901de + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: ad8b87e4ad64255db5f0a73bc2b4da9b146c38a3a8ab4d9306154334e0fc67ae64e76bfa298eebd1e71830591fb15987e5de7111bdb36a2221bdc379e3415fb0 languageName: node linkType: hard @@ -13661,6 +13570,13 @@ __metadata: languageName: node linkType: hard +"@types/identity-obj-proxy@npm:^3": + version: 3.0.2 + resolution: "@types/identity-obj-proxy@npm:3.0.2" + checksum: 77387ee587657ab24f12a1dee5c0e1386358d5c38cda5cac78bc5049340cb358e009f6254de3bbdee6a08e46f13b1552cd47a0bbd3e7a53ff469bf58a04ec6e9 + languageName: node + linkType: hard + "@types/imap@npm:^0.8.39": version: 0.8.39 resolution: "@types/imap@npm:0.8.39" @@ -13720,7 +13636,17 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:*, @types/jest@npm:^29.5.12, @types/jest@npm:~29.5.0, @types/jest@npm:~29.5.7": +"@types/jest-axe@npm:~3.5.9": + version: 3.5.9 + resolution: "@types/jest-axe@npm:3.5.9" + dependencies: + "@types/jest": "*" + axe-core: ^3.5.5 + checksum: ca93cf7b13f173278f8c67e4f7d73c9c0cf3c6110f5d76a8815e1044c1b2950fe4b4e83475f6d23bd82479edc908da19e037cf8e1a9c0e89f1c8f5b95355c93d + languageName: node + linkType: hard + +"@types/jest@npm:*, @types/jest@npm:~29.5.12": version: 29.5.12 resolution: "@types/jest@npm:29.5.12" dependencies: @@ -14264,7 +14190,7 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:<18.0.0, @types/react-dom@npm:~17.0.22": +"@types/react-dom@npm:~17.0.22": version: 17.0.22 resolution: "@types/react-dom@npm:17.0.22" dependencies: @@ -14273,15 +14199,6 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^18.0.0": - version: 18.0.10 - resolution: "@types/react-dom@npm:18.0.10" - dependencies: - "@types/react": "*" - checksum: ff8282d5005a0b1cd95fb65bf79d3d8485e4cfe2aaf052129033a178684b940014a3f4536bc20d573f8a01cf4c6f4770c74988cef7c2b5cac3041d9f172647e3 - languageName: node - linkType: hard - "@types/react-lifecycles-compat@npm:^3.0.1": version: 3.0.4 resolution: "@types/react-lifecycles-compat@npm:3.0.4" @@ -14529,15 +14446,6 @@ __metadata: languageName: node linkType: hard -"@types/testing-library__jest-dom@npm:^5.9.1, @types/testing-library__jest-dom@npm:~5.14.9": - version: 5.14.9 - resolution: "@types/testing-library__jest-dom@npm:5.14.9" - dependencies: - "@types/jest": "*" - checksum: d364494fc2545316292e88861146146af1e3818792ca63b62a63758b2f737669b687f4aaddfcfbcb7d0e1ed7890a9bd05de23ff97f277d5e68de574497a9ee72 - languageName: node - linkType: hard - "@types/textarea-caret@npm:^3.0.2": version: 3.0.2 resolution: "@types/textarea-caret@npm:3.0.2" @@ -14624,6 +14532,13 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:^9": + version: 9.0.8 + resolution: "@types/uuid@npm:9.0.8" + checksum: b8c60b7ba8250356b5088302583d1704a4e1a13558d143c549c408bf8920535602ffc12394ede77f8a8083511b023704bc66d1345792714002bfa261b17c5275 + languageName: node + linkType: hard + "@types/webidl-conversions@npm:*": version: 6.1.1 resolution: "@types/webidl-conversions@npm:6.1.1" @@ -15639,9 +15554,9 @@ __metadata: linkType: hard "acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + version: 8.3.2 + resolution: "acorn-walk@npm:8.3.2" + checksum: 3626b9d26a37b1b427796feaa5261faf712307a8920392c8dce9a5739fb31077667f4ad2ec71c7ac6aaf9f61f04a9d3d67ff56f459587206fc04aa31c27ef392 languageName: node linkType: hard @@ -15664,11 +15579,11 @@ __metadata: linkType: hard "acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.0, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" + version: 8.11.3 + resolution: "acorn@npm:8.11.3" bin: acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d + checksum: 76d8e7d559512566b43ab4aadc374f11f563f0a9e21626dd59cb2888444e9445923ae9f3699972767f18af61df89cd89f5eaaf772d1327b055b45cb829b4a88c languageName: node linkType: hard @@ -16242,7 +16157,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:5.1.3, aria-query@npm:^5.0.0": +"aria-query@npm:5.1.3": version: 5.1.3 resolution: "aria-query@npm:5.1.3" dependencies: @@ -16251,7 +16166,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.3.0": +"aria-query@npm:^5.0.0, aria-query@npm:^5.3.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" dependencies: @@ -16281,17 +16196,7 @@ __metadata: languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - is-array-buffer: ^3.0.1 - checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 - languageName: node - linkType: hard - -"array-buffer-byte-length@npm:^1.0.1": +"array-buffer-byte-length@npm:^1.0.0, array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" dependencies: @@ -16322,20 +16227,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.0.3, array-includes@npm:^3.1.4, array-includes@npm:^3.1.6": - version: 3.1.6 - resolution: "array-includes@npm:3.1.6" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - get-intrinsic: ^1.1.3 - is-string: ^1.0.7 - checksum: f22f8cd8ba8a6448d91eebdc69f04e4e55085d09232b5216ee2d476dab3ef59984e8d1889e662c6a0ed939dcb1b57fd05b2c0209c3370942fc41b752c82a2ca5 - languageName: node - linkType: hard - -"array-includes@npm:^3.1.7": +"array-includes@npm:^3.0.3, array-includes@npm:^3.1.4, array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": version: 3.1.8 resolution: "array-includes@npm:3.1.8" dependencies: @@ -16393,19 +16285,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.1, array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.2.5": - version: 1.3.1 - resolution: "array.prototype.flat@npm:1.3.1" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - es-shim-unscopables: ^1.0.0 - checksum: 5a8415949df79bf6e01afd7e8839bbde5a3581300e8ad5d8449dea52639e9e59b26a467665622783697917b43bf39940a6e621877c7dd9b3d1c1f97484b9b88b - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.3.1": +"array.prototype.flat@npm:^1.2.1, array.prototype.flat@npm:^1.2.3, array.prototype.flat@npm:^1.2.5, array.prototype.flat@npm:^1.3.1": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -16417,19 +16297,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.2.1, array.prototype.flatmap@npm:^1.3.1": - version: 1.3.1 - resolution: "array.prototype.flatmap@npm:1.3.1" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - es-shim-unscopables: ^1.0.0 - checksum: 8c1c43a4995f12cf12523436da28515184c753807b3f0bc2ca6c075f71c470b099e2090cc67dba8e5280958fea401c1d0c59e1db0143272aef6cd1103921a987 - languageName: node - linkType: hard - -"array.prototype.flatmap@npm:^1.3.2": +"array.prototype.flatmap@npm:^1.2.1, array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: @@ -16467,21 +16335,6 @@ __metadata: languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.2": - version: 1.0.2 - resolution: "arraybuffer.prototype.slice@npm:1.0.2" - dependencies: - array-buffer-byte-length: ^1.0.0 - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - is-array-buffer: ^3.0.2 - is-shared-array-buffer: ^1.0.2 - checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 - languageName: node - linkType: hard - "arraybuffer.prototype.slice@npm:^1.0.3": version: 1.0.3 resolution: "arraybuffer.prototype.slice@npm:1.0.3" @@ -16748,13 +16601,6 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a - languageName: node - linkType: hard - "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -16811,6 +16657,13 @@ __metadata: languageName: node linkType: hard +"axe-core@npm:4.9.1": + version: 4.9.1 + resolution: "axe-core@npm:4.9.1" + checksum: 41d9227871781f96c2952e2a777fca73624959dd0e98864f6d82806a77602f82b4fc490852082a7e524d8cd864e50d8b4d9931819b4a150112981d8c932110c5 + languageName: node + linkType: hard + "axe-core@npm:=4.7.0": version: 4.7.0 resolution: "axe-core@npm:4.7.0" @@ -16818,6 +16671,13 @@ __metadata: languageName: node linkType: hard +"axe-core@npm:^3.5.5": + version: 3.5.6 + resolution: "axe-core@npm:3.5.6" + checksum: 000777d2b6bf1f390beb1fb4b8714ed9127797c021c345b032db0c144e07320dbbe8cb0bcb7688b90b79cfbd3cdc1f27a4dc857804e3c61d7e0defb34deeb830 + languageName: node + linkType: hard + "axe-core@npm:^4.2.0, axe-core@npm:^4.7.0": version: 4.7.2 resolution: "axe-core@npm:4.7.2" @@ -18187,17 +18047,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": version: 1.0.7 resolution: "call-bind@npm:1.0.7" dependencies: @@ -18506,6 +18356,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:4.1.2, chalk@npm:^4, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + "chalk@npm:^1.0.0": version: 1.1.3 resolution: "chalk@npm:1.1.3" @@ -18519,16 +18379,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - "change-case@npm:^4.1.2": version: 4.1.2 resolution: "change-case@npm:4.1.2" @@ -20892,13 +20742,13 @@ __metadata: linkType: hard "deep-equal@npm:^2.0.5": - version: 2.2.2 - resolution: "deep-equal@npm:2.2.2" + version: 2.2.3 + resolution: "deep-equal@npm:2.2.3" dependencies: array-buffer-byte-length: ^1.0.0 - call-bind: ^1.0.2 + call-bind: ^1.0.5 es-get-iterator: ^1.1.3 - get-intrinsic: ^1.2.1 + get-intrinsic: ^1.2.2 is-arguments: ^1.1.1 is-array-buffer: ^3.0.2 is-date-object: ^1.0.5 @@ -20908,12 +20758,12 @@ __metadata: object-is: ^1.1.5 object-keys: ^1.1.1 object.assign: ^4.1.4 - regexp.prototype.flags: ^1.5.0 + regexp.prototype.flags: ^1.5.1 side-channel: ^1.0.4 which-boxed-primitive: ^1.0.2 which-collection: ^1.0.1 - which-typed-array: ^1.1.9 - checksum: eb61c35157b6ecb96a5359b507b083fbff8ddb4c86a78a781ee38485f77a667465e45d63ee2ebd8a00e86d94c80e499906900cd82c2debb400237e1662cd5397 + which-typed-array: ^1.1.13 + checksum: ee8852f23e4d20a5626c13b02f415ba443a1b30b4b3d39eaf366d59c4a85e6545d7ec917db44d476a85ae5a86064f7e5f7af7479f38f113995ba869f3a1ddc53 languageName: node linkType: hard @@ -20978,18 +20828,7 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1": - version: 1.1.0 - resolution: "define-data-property@npm:1.1.0" - dependencies: - get-intrinsic: ^1.2.1 - gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - checksum: 7ad4ee84cca8ad427a4831f5693526804b62ce9dfd4efac77214e95a4382aed930072251d4075dc8dc9fc949a353ed51f19f5285a84a788ba9216cc51472a093 - languageName: node - linkType: hard - -"define-data-property@npm:^1.1.4": +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" dependencies: @@ -21007,17 +20846,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.2, define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": - version: 1.2.0 - resolution: "define-properties@npm:1.2.0" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 - languageName: node - linkType: hard - -"define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.2, define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -21248,13 +21077,6 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^28.1.1": - version: 28.1.1 - resolution: "diff-sequences@npm:28.1.1" - checksum: e2529036505567c7ca5a2dea86b6bcd1ca0e3ae63bf8ebf529b8a99cfa915bbf194b7021dc1c57361a4017a6d95578d4ceb29fabc3232a4f4cb866a2726c7690 - languageName: node - linkType: hard - "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -21362,13 +21184,20 @@ __metadata: languageName: node linkType: hard -"dom-accessibility-api@npm:^0.5.6, dom-accessibility-api@npm:^0.5.9": +"dom-accessibility-api@npm:^0.5.9": version: 0.5.14 resolution: "dom-accessibility-api@npm:0.5.14" checksum: 782c813f75a09ba6735ef03b5e1624406a3829444ae49d5bdedd272a49d437ae3354f53e02ffc8c9fd9165880250f41546538f27461f839dd4ea1234e77e8d5e languageName: node linkType: hard +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: c325b5144bb406df23f4affecffc117dbaec9af03daad9ee6b510c5be647b14d28ef0a4ea5ca06d696d8ab40bb777e5fed98b985976fdef9d8790178fa1d573f + languageName: node + linkType: hard + "dom-converter@npm:^0.2.0": version: 0.2.0 resolution: "dom-converter@npm:0.2.0" @@ -22044,54 +21873,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.19.1, es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1": - version: 1.22.2 - resolution: "es-abstract@npm:1.22.2" - dependencies: - array-buffer-byte-length: ^1.0.0 - arraybuffer.prototype.slice: ^1.0.2 - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-set-tostringtag: ^2.0.1 - es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.1 - get-symbol-description: ^1.0.0 - globalthis: ^1.0.3 - gopd: ^1.0.1 - has: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.5 - is-array-buffer: ^3.0.2 - is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-typed-array: ^1.1.12 - is-weakref: ^1.0.2 - object-inspect: ^1.12.3 - object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.5.1 - safe-array-concat: ^1.0.1 - safe-regex-test: ^1.0.0 - string.prototype.trim: ^1.2.8 - string.prototype.trimend: ^1.0.7 - string.prototype.trimstart: ^1.0.7 - typed-array-buffer: ^1.0.0 - typed-array-byte-length: ^1.0.0 - typed-array-byte-offset: ^1.0.0 - typed-array-length: ^1.0.4 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.11 - checksum: cc70e592d360d7d729859013dee7a610c6b27ed8630df0547c16b0d16d9fe6505a70ee14d1af08d970fdd132b3f88c9ca7815ce72c9011608abf8ab0e55fc515 - languageName: node - linkType: hard - -"es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2": +"es-abstract@npm:^1.17.2, es-abstract@npm:^1.19.1, es-abstract@npm:^1.20.4, es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2": version: 1.23.3 resolution: "es-abstract@npm:1.23.3" dependencies: @@ -22230,17 +22012,6 @@ __metadata: languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.1": - version: 2.0.1 - resolution: "es-set-tostringtag@npm:2.0.1" - dependencies: - get-intrinsic: ^1.1.3 - has: ^1.0.3 - has-tostringtag: ^1.0.0 - checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 - languageName: node - linkType: hard - "es-set-tostringtag@npm:^2.0.3": version: 2.0.3 resolution: "es-set-tostringtag@npm:2.0.3" @@ -22752,6 +22523,17 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-testing-library@npm:~6.2.2": + version: 6.2.2 + resolution: "eslint-plugin-testing-library@npm:6.2.2" + dependencies: + "@typescript-eslint/utils": ^5.58.0 + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + checksum: df55ca98415bad3e7d6b21adcd0f817d7c6df59cb32099528e45b39e8d7edf95e040334106fc7574fd402ed624ca65215ccf37745e1da1a9c90cfe00b99c5be4 + languageName: node + linkType: hard + "eslint-plugin-you-dont-need-lodash-underscore@npm:~6.12.0": version: 6.12.0 resolution: "eslint-plugin-you-dont-need-lodash-underscore@npm:6.12.0" @@ -24107,17 +23889,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.4, follow-redirects@npm:^1.14.7, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.2": - version: 1.15.2 - resolution: "follow-redirects@npm:1.15.2" - peerDependenciesMeta: - debug: - optional: true - checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.10.0": +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.10.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.14.4, follow-redirects@npm:^1.14.7, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.14.9, follow-redirects@npm:^1.15.2": version: 1.15.4 resolution: "follow-redirects@npm:1.15.4" peerDependenciesMeta: @@ -24672,19 +24444,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1": - version: 1.2.1 - resolution: "get-intrinsic@npm:1.2.1" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" dependencies: @@ -24776,17 +24536,7 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 - languageName: node - linkType: hard - -"get-symbol-description@npm:^1.0.2": +"get-symbol-description@npm:^1.0.0, get-symbol-description@npm:^1.0.2": version: 1.0.2 resolution: "get-symbol-description@npm:1.0.2" dependencies: @@ -25449,16 +25199,7 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" - dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.2": +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": version: 1.0.2 resolution: "has-property-descriptors@npm:1.0.2" dependencies: @@ -25467,14 +25208,7 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e - languageName: node - linkType: hard - -"has-proto@npm:^1.0.3": +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": version: 1.0.3 resolution: "has-proto@npm:1.0.3" checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 @@ -25504,16 +25238,7 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" - dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -25608,16 +25333,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" - dependencies: - function-bind: ^1.1.2 - checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 - languageName: node - linkType: hard - -"hasown@npm:^2.0.1, hasown@npm:^2.0.2": +"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -26307,16 +26023,7 @@ __metadata: languageName: node linkType: hard -"i18next@npm:>=17.0.11, i18next@npm:~23.4.9": - version: 23.4.9 - resolution: "i18next@npm:23.4.9" - dependencies: - "@babel/runtime": ^7.22.5 - checksum: 46ac2415dc817c0e25e1c5e64332249825cd63b5fb9a5d42e3a2329d4ecd098c0f15a243f56b53e03db02e2e9931ca9bb4447370b2436f9ad6556de40ce981cf - languageName: node - linkType: hard - -"i18next@npm:^23.10.1": +"i18next@npm:>=17.0.11, i18next@npm:^23.10.1": version: 23.10.1 resolution: "i18next@npm:23.10.1" dependencies: @@ -26334,6 +26041,15 @@ __metadata: languageName: node linkType: hard +"i18next@npm:~23.4.9": + version: 23.4.9 + resolution: "i18next@npm:23.4.9" + dependencies: + "@babel/runtime": ^7.22.5 + checksum: 46ac2415dc817c0e25e1c5e64332249825cd63b5fb9a5d42e3a2329d4ecd098c0f15a243f56b53e03db02e2e9931ca9bb4447370b2436f9ad6556de40ce981cf + languageName: node + linkType: hard + "iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24, iconv-lite@npm:^0.4.4": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -26379,7 +26095,7 @@ __metadata: languageName: node linkType: hard -"identity-obj-proxy@npm:^3.0.0": +"identity-obj-proxy@npm:^3.0.0, identity-obj-proxy@npm:~3.0.0": version: 3.0.0 resolution: "identity-obj-proxy@npm:3.0.0" dependencies: @@ -26802,18 +26518,7 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.5": - version: 1.0.5 - resolution: "internal-slot@npm:1.0.5" - dependencies: - get-intrinsic: ^1.2.0 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a - languageName: node - linkType: hard - -"internal-slot@npm:^1.0.7": +"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.4, internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" dependencies: @@ -26999,18 +26704,7 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.0 - is-typed-array: ^1.1.10 - checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 - languageName: node - linkType: hard - -"is-array-buffer@npm:^3.0.4": +"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4": version: 3.0.4 resolution: "is-array-buffer@npm:3.0.4" dependencies: @@ -27465,13 +27159,6 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a - languageName: node - linkType: hard - "is-negative-zero@npm:^2.0.3": version: 2.0.3 resolution: "is-negative-zero@npm:2.0.3" @@ -27658,16 +27345,7 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.3": +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "is-shared-array-buffer@npm:1.0.3" dependencies: @@ -27726,16 +27404,7 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": - version: 1.1.12 - resolution: "is-typed-array@npm:1.1.12" - dependencies: - which-typed-array: ^1.1.11 - checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796 - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.13": +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.3": version: 1.1.13 resolution: "is-typed-array@npm:1.1.13" dependencies: @@ -28093,6 +27762,18 @@ __metadata: languageName: node linkType: hard +"jest-axe@npm:~9.0.0": + version: 9.0.0 + resolution: "jest-axe@npm:9.0.0" + dependencies: + axe-core: 4.9.1 + chalk: 4.1.2 + jest-matcher-utils: 29.2.2 + lodash.merge: 4.6.2 + checksum: 04457ed3d03e0b7745584325eab446da65d2093f6b608a83955d5ff0ec6a4e026db0da77c755b5e4d8d582ece443d2921da3d94d52eb499f51c105a1cc784cc7 + languageName: node + linkType: hard + "jest-changed-files@npm:^29.7.0": version: 29.7.0 resolution: "jest-changed-files@npm:29.7.0" @@ -28132,7 +27813,7 @@ __metadata: languageName: node linkType: hard -"jest-cli@npm:^29.5.0, jest-cli@npm:^29.6.4, jest-cli@npm:^29.7.0": +"jest-cli@npm:^29.7.0": version: 29.7.0 resolution: "jest-cli@npm:29.7.0" dependencies: @@ -28196,19 +27877,7 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^28.0.2": - version: 28.1.3 - resolution: "jest-diff@npm:28.1.3" - dependencies: - chalk: ^4.0.0 - diff-sequences: ^28.1.1 - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: fa8583e0ccbe775714ce850b009be1b0f6b17a4b6759f33ff47adef27942ebc610dbbcc8a5f7cfb7f12b3b3b05afc9fb41d5f766674616025032ff1e4f9866e0 - languageName: node - linkType: hard - -"jest-diff@npm:^29.7.0": +"jest-diff@npm:^29.2.0, jest-diff@npm:^29.2.1, jest-diff@npm:^29.7.0": version: 29.7.0 resolution: "jest-diff@npm:29.7.0" dependencies: @@ -28242,28 +27911,28 @@ __metadata: languageName: node linkType: hard -"jest-environment-jsdom@npm:~29.6.4": - version: 29.6.4 - resolution: "jest-environment-jsdom@npm:29.6.4" +"jest-environment-jsdom@npm:~29.7.0": + version: 29.7.0 + resolution: "jest-environment-jsdom@npm:29.7.0" dependencies: - "@jest/environment": ^29.6.4 - "@jest/fake-timers": ^29.6.4 + "@jest/environment": ^29.7.0 + "@jest/fake-timers": ^29.7.0 "@jest/types": ^29.6.3 "@types/jsdom": ^20.0.0 "@types/node": "*" - jest-mock: ^29.6.3 - jest-util: ^29.6.3 + jest-mock: ^29.7.0 + jest-util: ^29.7.0 jsdom: ^20.0.0 peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: canvas: optional: true - checksum: 2afe105f12d7d93ca56e2e6f67ab07ada3dd3da0516d1198f254930683ab9feb2b8c14417baaca53544eed88fd7fb5744f0dbce2e100269746187317ce0347df + checksum: 559aac134c196fccc1dfc794d8fc87377e9f78e894bb13012b0831d88dec0abd7ece99abec69da564b8073803be4f04a9eb4f4d1bb80e29eec0cb252c254deb8 languageName: node linkType: hard -"jest-environment-node@npm:^29.7.0": +"jest-environment-node@npm:^29.7.0, jest-environment-node@npm:~29.7.0": version: 29.7.0 resolution: "jest-environment-node@npm:29.7.0" dependencies: @@ -28287,14 +27956,7 @@ __metadata: languageName: node linkType: hard -"jest-get-type@npm:^28.0.2": - version: 28.0.2 - resolution: "jest-get-type@npm:28.0.2" - checksum: 5281d7c89bc8156605f6d15784f45074f4548501195c26e9b188742768f72d40948252d13230ea905b5349038865a1a8eeff0e614cc530ff289dfc41fe843abd - languageName: node - linkType: hard - -"jest-get-type@npm:^29.6.3": +"jest-get-type@npm:^29.2.0, jest-get-type@npm:^29.6.3": version: 29.6.3 resolution: "jest-get-type@npm:29.6.3" checksum: 88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 @@ -28359,6 +28021,18 @@ __metadata: languageName: node linkType: hard +"jest-matcher-utils@npm:29.2.2": + version: 29.2.2 + resolution: "jest-matcher-utils@npm:29.2.2" + dependencies: + chalk: ^4.0.0 + jest-diff: ^29.2.1 + jest-get-type: ^29.2.0 + pretty-format: ^29.2.1 + checksum: 97ef2638ab826c25f84bfedea231cef091820ae0876ba316922da81145e950d2b9d2057d3645813b5ee880bb975ed4f22e228dda5d0d26a20715e575b675357d + languageName: node + linkType: hard + "jest-matcher-utils@npm:^29.7.0": version: 29.7.0 resolution: "jest-matcher-utils@npm:29.7.0" @@ -28398,7 +28072,7 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:^29.6.3, jest-mock@npm:^29.7.0": +"jest-mock@npm:^29.7.0": version: 29.7.0 resolution: "jest-mock@npm:29.7.0" dependencies: @@ -28573,7 +28247,7 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.0.0, jest-util@npm:^29.6.3, jest-util@npm:^29.7.0": +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" dependencies: @@ -28617,13 +28291,13 @@ __metadata: languageName: node linkType: hard -"jest-websocket-mock@npm:^2.4.0": - version: 2.4.0 - resolution: "jest-websocket-mock@npm:2.4.0" +"jest-websocket-mock@npm:~2.5.0": + version: 2.5.0 + resolution: "jest-websocket-mock@npm:2.5.0" dependencies: - jest-diff: ^28.0.2 - mock-socket: ^9.1.0 - checksum: 03c0707b70bbdbcdf4c2f5579d3423b41317bdecb38ede593061c7894421d24d903bf9dc53062f7a3f2fc3302374d35436cb36d6db6ac84058b63862438d6d27 + jest-diff: ^29.2.0 + mock-socket: ^9.3.0 + checksum: df52989d62f59aea3408d37089ab56490efdfa75d81c851dde65758474844e273a9a4ebd9c13db49d226b87d8272896cabd91173dd8cc56b96beec309d46554d languageName: node linkType: hard @@ -28661,7 +28335,7 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.7.0": +"jest@npm:^29.7.0, jest@npm:~29.7.0": version: 29.7.0 resolution: "jest@npm:29.7.0" dependencies: @@ -28680,44 +28354,6 @@ __metadata: languageName: node linkType: hard -"jest@npm:~29.5.0": - version: 29.5.0 - resolution: "jest@npm:29.5.0" - dependencies: - "@jest/core": ^29.5.0 - "@jest/types": ^29.5.0 - import-local: ^3.0.2 - jest-cli: ^29.5.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: a8ff2eb0f421623412236e23cbe67c638127fffde466cba9606bc0c0553b4c1e5cb116d7e0ef990b5d1712851652c8ee461373b578df50857fe635b94ff455d5 - languageName: node - linkType: hard - -"jest@npm:~29.6.4": - version: 29.6.4 - resolution: "jest@npm:29.6.4" - dependencies: - "@jest/core": ^29.6.4 - "@jest/types": ^29.6.3 - import-local: ^3.0.2 - jest-cli: ^29.6.4 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: ba28ca7a86d029bcd742bb254c0c8d0119c1e002ddae128ff6409ebabc0b29c36f69dbf3fdd326aff16e7b2500c9a918bbc6a9a5db4d966e035127242239439f - languageName: node - linkType: hard - "jmespath@npm:0.16.0": version: 0.16.0 resolution: "jmespath@npm:0.16.0" @@ -29155,17 +28791,7 @@ __metadata: languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0": - version: 3.2.2 - resolution: "jsx-ast-utils@npm:3.2.2" - dependencies: - array-includes: ^3.1.4 - object.assign: ^4.1.2 - checksum: 88c7ade9e1edb8e27021c9ac194184f47d6ffd3852807c3aac44b1610f7eb33359e1aa872a35008d43ed66b5f7be0f6fd8d6e0574d01cf3a4af3ceb0cd0b5988 - languageName: node - linkType: hard - -"jsx-ast-utils@npm:^3.3.5": +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" dependencies: @@ -29849,7 +29475,7 @@ __metadata: languageName: node linkType: hard -"lodash.merge@npm:^4.6.2": +"lodash.merge@npm:4.6.2, lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 @@ -30117,7 +29743,7 @@ __metadata: languageName: node linkType: hard -"lz-string@npm:^1.4.4, lz-string@npm:^1.5.0": +"lz-string@npm:^1.5.0": version: 1.5.0 resolution: "lz-string@npm:1.5.0" bin: @@ -31261,10 +30887,10 @@ __metadata: languageName: node linkType: hard -"mock-socket@npm:^9.1.0": - version: 9.2.1 - resolution: "mock-socket@npm:9.2.1" - checksum: daf07689563163dbcefbefe23b2a9784a75d0af31706f23ad535c6ab2abbcdefa2e91acddeb50a3c39009139e47a8f909cbb38e8137452193ccb9331637fee3e +"mock-socket@npm:^9.3.0": + version: 9.3.1 + resolution: "mock-socket@npm:9.3.1" + checksum: cb2dde4fc5dde280dd5ccb78eaaa223382ee16437f46b86558017655584ad08c22e733bde2dd5cc86927def506b6caeb0147e3167b9a62d70d5cf19d44103853 languageName: node linkType: hard @@ -32316,9 +31942,9 @@ __metadata: linkType: hard "nwsapi@npm:^2.2.0, nwsapi@npm:^2.2.2": - version: 2.2.2 - resolution: "nwsapi@npm:2.2.2" - checksum: 43769106292bc95f776756ca2f3513dab7b4d506a97c67baec32406447841a35f65f29c1f95ab5d42785210fd41668beed33ca16fa058780be43b101ad73e205 + version: 2.2.10 + resolution: "nwsapi@npm:2.2.10" + checksum: 5f1d361b38c47ab49727d5ea8bbfeb5867ae6de0e538eec9a8b77c88005ddde36d8b930e0730b50ee5e5dda949112c0f9ffed1bf15e7e1b3cd9cfa319f5a9b6f languageName: node linkType: hard @@ -32405,14 +32031,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": version: 1.13.1 resolution: "object-inspect@npm:1.13.1" checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f @@ -32420,12 +32039,12 @@ __metadata: linkType: hard "object-is@npm:^1.0.1, object-is@npm:^1.1.5": - version: 1.1.5 - resolution: "object-is@npm:1.1.5" + version: 1.1.6 + resolution: "object-is@npm:1.1.6" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - checksum: 989b18c4cba258a6b74dc1d74a41805c1a1425bce29f6cabb50dcb1a6a651ea9104a1b07046739a49a5bb1bc49727bcb00efd5c55f932f6ea04ec8927a7901fe + call-bind: ^1.0.7 + define-properties: ^1.2.1 + checksum: 3ea22759967e6f2380a2cbbd0f737b42dc9ddb2dfefdb159a1b927fea57335e1b058b564bfa94417db8ad58cddab33621a035de6f5e5ad56d89f2dd03e66c6a1 languageName: node linkType: hard @@ -32452,19 +32071,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": - version: 4.1.4 - resolution: "object.assign@npm:4.1.4" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - has-symbols: ^1.0.3 - object-keys: ^1.1.1 - checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 - languageName: node - linkType: hard - -"object.assign@npm:^4.1.5": +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.5": version: 4.1.5 resolution: "object.assign@npm:4.1.5" dependencies: @@ -32476,18 +32083,7 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.0, object.entries@npm:^1.1.6": - version: 1.1.6 - resolution: "object.entries@npm:1.1.6" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 0f8c47517e6a9a980241eafe3b73de11e59511883173c2b93d67424a008e47e11b77c80e431ad1d8a806f6108b225a1cab9223e53e555776c612a24297117d28 - languageName: node - linkType: hard - -"object.entries@npm:^1.1.7": +"object.entries@npm:^1.1.0, object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": version: 1.1.8 resolution: "object.entries@npm:1.1.8" dependencies: @@ -32498,18 +32094,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.0 || ^1.0.0, object.fromentries@npm:^2.0.6": - version: 2.0.6 - resolution: "object.fromentries@npm:2.0.6" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 453c6d694180c0c30df451b60eaf27a5b9bca3fb43c37908fd2b78af895803dc631242bcf05582173afa40d8d0e9c96e16e8874b39471aa53f3ac1f98a085d85 - languageName: node - linkType: hard - -"object.fromentries@npm:^2.0.7": +"object.fromentries@npm:^2.0.0 || ^1.0.0, object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": version: 2.0.8 resolution: "object.fromentries@npm:2.0.8" dependencies: @@ -34872,19 +34457,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^28.1.3": - version: 28.1.3 - resolution: "pretty-format@npm:28.1.3" - dependencies: - "@jest/schemas": ^28.1.3 - ansi-regex: ^5.0.1 - ansi-styles: ^5.0.0 - react-is: ^18.0.0 - checksum: e69f857358a3e03d271252d7524bec758c35e44680287f36c1cb905187fbc82da9981a6eb07edfd8a03bc3cbeebfa6f5234c13a3d5b59f2bbdf9b4c4053e0a7f - languageName: node - linkType: hard - -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.2.1, pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" dependencies: @@ -35770,15 +35343,15 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" +"react-dom@npm:~18.3.1": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: loose-envify: ^1.1.0 - scheduler: ^0.23.0 + scheduler: ^0.23.2 peerDependencies: - react: ^18.2.0 - checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + react: ^18.3.1 + checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 languageName: node linkType: hard @@ -35796,7 +35369,7 @@ __metadata: languageName: node linkType: hard -"react-error-boundary@npm:^3.1.0, react-error-boundary@npm:^3.1.4": +"react-error-boundary@npm:^3.1.4": version: 3.1.4 resolution: "react-error-boundary@npm:3.1.4" dependencies: @@ -36097,6 +35670,15 @@ __metadata: languageName: node linkType: hard +"react-timing-hooks@npm:~4.0.2": + version: 4.0.2 + resolution: "react-timing-hooks@npm:4.0.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 95ebcaffe400f3e1af32bd82eb92258c5e1473e43a7edf65879692117946105bb21f4e91046fdc85c8c737997be1d8148bffacfde8a8a9ee835d81415048119e + languageName: node + linkType: hard + "react-virtuoso@npm:^4.7.1": version: 4.7.1 resolution: "react-virtuoso@npm:4.7.1" @@ -36128,12 +35710,12 @@ __metadata: languageName: node linkType: hard -"react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" +"react@npm:~18.3.1": + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: loose-envify: ^1.1.0 - checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 languageName: node linkType: hard @@ -36531,18 +36113,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": - version: 1.5.1 - resolution: "regexp.prototype.flags@npm:1.5.1" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - set-function-name: ^2.0.0 - checksum: 869edff00288442f8d7fa4c9327f91d85f3b3acf8cbbef9ea7a220345cf23e9241b6def9263d2c1ebcf3a316b0aa52ad26a43a84aa02baca3381717b3e307f47 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.2": +"regexp.prototype.flags@npm:^1.4.3, regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.2": version: 1.5.2 resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: @@ -37153,7 +36724,7 @@ __metadata: "@types/js-yaml": ^4.0.8 node-gyp: ^9.4.1 ts-node: ^10.9.2 - turbo: ^1.12.4 + turbo: latest languageName: unknown linkType: soft @@ -37161,7 +36732,7 @@ __metadata: version: 0.0.0-use.local resolution: "rocketchat-services@workspace:apps/meteor/ee/server/services" dependencies: - "@rocket.chat/apps-engine": alpha + "@rocket.chat/apps-engine": 1.44.0 "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": ~0.31.25 @@ -37285,18 +36856,6 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.0.1": - version: 1.0.1 - resolution: "safe-array-concat@npm:1.0.1" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - isarray: ^2.0.5 - checksum: 001ecf1d8af398251cbfabaf30ed66e3855127fbceee178179524b24160b49d15442f94ed6c0db0b2e796da76bb05b73bf3cc241490ec9c2b741b41d33058581 - languageName: node - linkType: hard - "safe-array-concat@npm:^1.1.2": version: 1.1.2 resolution: "safe-array-concat@npm:1.1.2" @@ -37330,17 +36889,6 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-regex: ^1.1.4 - checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 - languageName: node - linkType: hard - "safe-regex-test@npm:^1.0.3": version: 1.0.3 resolution: "safe-regex-test@npm:1.0.3" @@ -37508,12 +37056,12 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: ^1.1.0 - checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 languageName: node linkType: hard @@ -37883,17 +37431,6 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.0": - version: 2.0.1 - resolution: "set-function-name@npm:2.0.1" - dependencies: - define-data-property: ^1.0.1 - functions-have-names: ^1.2.3 - has-property-descriptors: ^1.0.0 - checksum: 4975d17d90c40168eee2c7c9c59d023429f0a1690a89d75656306481ece0c3c1fb1ebcc0150ea546d1913e35fbd037bace91372c69e543e51fc5d1f31a9fa126 - languageName: node - linkType: hard - "set-function-name@npm:^2.0.1": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" @@ -39120,17 +38657,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.8": - version: 1.2.8 - resolution: "string.prototype.trim@npm:1.2.8" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 49eb1a862a53aba73c3fb6c2a53f5463173cb1f4512374b623bcd6b43ad49dd559a06fb5789bdec771a40fc4d2a564411c0a75d35fb27e76bbe738c211ecff07 - languageName: node - linkType: hard - "string.prototype.trim@npm:^1.2.9": version: 1.2.9 resolution: "string.prototype.trim@npm:1.2.9" @@ -39143,17 +38669,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimend@npm:1.0.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 2375516272fd1ba75992f4c4aa88a7b5f3c7a9ca308d963bcd5645adf689eba6f8a04ebab80c33e30ec0aefc6554181a3a8416015c38da0aa118e60ec896310c - languageName: node - linkType: hard - "string.prototype.trimend@npm:^1.0.8": version: 1.0.8 resolution: "string.prototype.trimend@npm:1.0.8" @@ -39165,17 +38680,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimstart@npm:1.0.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 13d0c2cb0d5ff9e926fa0bec559158b062eed2b68cd5be777ffba782c96b2b492944e47057274e064549b94dd27cf81f48b27a31fee8af5b574cff253e7eb613 - languageName: node - linkType: hard - "string.prototype.trimstart@npm:^1.0.8": version: 1.0.8 resolution: "string.prototype.trimstart@npm:1.0.8" @@ -40357,14 +39861,14 @@ __metadata: linkType: hard "tough-cookie@npm:^4.0.0, tough-cookie@npm:^4.1.2": - version: 4.1.2 - resolution: "tough-cookie@npm:4.1.2" + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" dependencies: psl: ^1.1.33 punycode: ^2.1.1 universalify: ^0.2.0 url-parse: ^1.5.3 - checksum: a7359e9a3e875121a84d6ba40cc184dec5784af84f67f3a56d1d2ae39b87c0e004e6ba7c7331f9622a7d2c88609032473488b28fe9f59a1fec115674589de39a + checksum: 5815059f014c31179a303c673f753f7899a6fce94ac93712c88ea5f3c26e0c042b5f0c7a599a00f8e0feeca4615dba75c3dffc54f3c1a489978aa8205e09307c languageName: node linkType: hard @@ -40492,9 +39996,9 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:^29.1.1, ts-jest@npm:^29.1.2, ts-jest@npm:~29.1.0, ts-jest@npm:~29.1.1": - version: 29.1.2 - resolution: "ts-jest@npm:29.1.2" +"ts-jest@npm:~29.1.1": + version: 29.1.5 + resolution: "ts-jest@npm:29.1.5" dependencies: bs-logger: 0.x fast-json-stable-stringify: 2.x @@ -40506,6 +40010,7 @@ __metadata: yargs-parser: ^21.0.1 peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/transform": ^29.0.0 "@jest/types": ^29.0.0 babel-jest: ^29.0.0 jest: ^29.0.0 @@ -40513,6 +40018,8 @@ __metadata: peerDependenciesMeta: "@babel/core": optional: true + "@jest/transform": + optional: true "@jest/types": optional: true babel-jest: @@ -40521,7 +40028,7 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: a0ce0affc1b716c78c9ab55837829c42cb04b753d174a5c796bb1ddf9f0379fc20647b76fbe30edb30d9b23181908138d6b4c51ef2ae5e187b66635c295cefd5 + checksum: 96bfdea46d7faa83457c2647806a31a86f28656f703515fee9f6d2ff1ccfc58ccfbbe3ae9283f40141a85af0def30afe887843be5b002c08ed5d5189c941eab1 languageName: node linkType: hard @@ -40540,45 +40047,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.9.1, ts-node@npm:~10.9.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 - languageName: node - linkType: hard - -"ts-node@npm:^10.9.2": +"ts-node@npm:^10.9.1, ts-node@npm:^10.9.2, ts-node@npm:~10.9.1": version: 10.9.2 resolution: "ts-node@npm:10.9.2" dependencies: @@ -40791,58 +40260,58 @@ __metadata: languageName: node linkType: hard -"turbo-darwin-64@npm:1.12.4": - version: 1.12.4 - resolution: "turbo-darwin-64@npm:1.12.4" +"turbo-darwin-64@npm:2.0.11": + version: 2.0.11 + resolution: "turbo-darwin-64@npm:2.0.11" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"turbo-darwin-arm64@npm:1.12.4": - version: 1.12.4 - resolution: "turbo-darwin-arm64@npm:1.12.4" +"turbo-darwin-arm64@npm:2.0.11": + version: 2.0.11 + resolution: "turbo-darwin-arm64@npm:2.0.11" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"turbo-linux-64@npm:1.12.4": - version: 1.12.4 - resolution: "turbo-linux-64@npm:1.12.4" +"turbo-linux-64@npm:2.0.11": + version: 2.0.11 + resolution: "turbo-linux-64@npm:2.0.11" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"turbo-linux-arm64@npm:1.12.4": - version: 1.12.4 - resolution: "turbo-linux-arm64@npm:1.12.4" +"turbo-linux-arm64@npm:2.0.11": + version: 2.0.11 + resolution: "turbo-linux-arm64@npm:2.0.11" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"turbo-windows-64@npm:1.12.4": - version: 1.12.4 - resolution: "turbo-windows-64@npm:1.12.4" +"turbo-windows-64@npm:2.0.11": + version: 2.0.11 + resolution: "turbo-windows-64@npm:2.0.11" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"turbo-windows-arm64@npm:1.12.4": - version: 1.12.4 - resolution: "turbo-windows-arm64@npm:1.12.4" +"turbo-windows-arm64@npm:2.0.11": + version: 2.0.11 + resolution: "turbo-windows-arm64@npm:2.0.11" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"turbo@npm:^1.12.4": - version: 1.12.4 - resolution: "turbo@npm:1.12.4" +"turbo@npm:latest": + version: 2.0.11 + resolution: "turbo@npm:2.0.11" dependencies: - turbo-darwin-64: 1.12.4 - turbo-darwin-arm64: 1.12.4 - turbo-linux-64: 1.12.4 - turbo-linux-arm64: 1.12.4 - turbo-windows-64: 1.12.4 - turbo-windows-arm64: 1.12.4 + turbo-darwin-64: 2.0.11 + turbo-darwin-arm64: 2.0.11 + turbo-linux-64: 2.0.11 + turbo-linux-arm64: 2.0.11 + turbo-windows-64: 2.0.11 + turbo-windows-arm64: 2.0.11 dependenciesMeta: turbo-darwin-64: optional: true @@ -40858,7 +40327,7 @@ __metadata: optional: true bin: turbo: bin/turbo - checksum: d387fb91af6ed0ea925201d3858180353c5d93be564829de2e22f48fe57124d1347d2abb8b99215901a305d4c6da4a0daf4c28afeec20fa1bc1ae2762c3b8d3d + checksum: a2fcb17b2549102dcd912799319a5c31cbabc3fcb76241bac1d2231ee4e1911789cd4e6b4eb050f9e8548ef89143ee77be59eb35b1843cf12b42f136ef176a0c languageName: node linkType: hard @@ -41029,17 +40498,6 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-buffer@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - is-typed-array: ^1.1.10 - checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 - languageName: node - linkType: hard - "typed-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "typed-array-buffer@npm:1.0.2" @@ -41051,18 +40509,6 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-length@npm:1.0.0" - dependencies: - call-bind: ^1.0.2 - for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 - languageName: node - linkType: hard - "typed-array-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "typed-array-byte-length@npm:1.0.1" @@ -41076,19 +40522,6 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-offset@npm:1.0.0" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b - languageName: node - linkType: hard - "typed-array-byte-offset@npm:^1.0.2": version: 1.0.2 resolution: "typed-array-byte-offset@npm:1.0.2" @@ -41103,17 +40536,6 @@ __metadata: languageName: node linkType: hard -"typed-array-length@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-length@npm:1.0.4" - dependencies: - call-bind: ^1.0.2 - for-each: ^0.3.3 - is-typed-array: ^1.1.9 - checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 - languageName: node - linkType: hard - "typed-array-length@npm:^1.0.6": version: 1.0.6 resolution: "typed-array-length@npm:1.0.6" @@ -41170,6 +40592,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:~5.4.5": + version: 5.4.5 + resolution: "typescript@npm:5.4.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 53c879c6fa1e3bcb194b274d4501ba1985894b2c2692fa079db03c5a5a7140587a1e04e1ba03184605d35f439b40192d9e138eb3279ca8eee313c081c8bcd9b0 + languageName: node + linkType: hard + "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" @@ -41180,6 +40612,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@~5.4.5#~builtin": + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#~builtin::version=5.4.5&hash=85af82" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2373c693f3b328f3b2387c3efafe6d257b057a142f9a79291854b14ff4d5367d3d730810aee981726b677ae0fd8329b23309da3b6aaab8263dbdccf1da07a3ba + languageName: node + linkType: hard + "typia@npm:5.3.3, typia@npm:^5.3.3": version: 5.3.3 resolution: "typia@npm:5.3.3" @@ -41858,7 +41300,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:~1.2.0": +"use-sync-external-store@npm:1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" peerDependencies: @@ -41867,6 +41309,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.2.0, use-sync-external-store@npm:~1.2.0, use-sync-external-store@npm:~1.2.2": + version: 1.2.2 + resolution: "use-sync-external-store@npm:1.2.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: fe07c071c4da3645f112c38c0e57beb479a8838616ff4e92598256ecce527f2888c08febc7f9b2f0ce2f0e18540ba3cde41eb2035e4fafcb4f52955037098a81 + languageName: node + linkType: hard + "use@npm:^3.1.0": version: 3.1.1 resolution: "use@npm:3.1.1" @@ -42026,7 +41477,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0, uuid@npm:^9.0.1": +"uuid@npm:^9.0.0, uuid@npm:^9.0.1, uuid@npm:~9.0.1": version: 9.0.1 resolution: "uuid@npm:9.0.1" bin: @@ -43035,20 +42486,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": - version: 1.1.11 - resolution: "which-typed-array@npm:1.1.11" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: 711ffc8ef891ca6597b19539075ec3e08bb9b4c2ca1f78887e3c07a977ab91ac1421940505a197758fb5939aa9524976d0a5bbcac34d07ed6faa75cedbb17206 - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15" dependencies: @@ -43304,8 +42742,8 @@ __metadata: linkType: hard "ws@npm:^8.11.0, ws@npm:^8.13.0, ws@npm:^8.2.3, ws@npm:^8.8.1": - version: 8.13.0 - resolution: "ws@npm:8.13.0" + version: 8.17.0 + resolution: "ws@npm:8.17.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -43314,7 +42752,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + checksum: 147ef9eab0251364e1d2c55338ad0efb15e6913923ccbfdf20f7a8a6cb8f88432bcd7f4d8f66977135bfad35575644f9983201c1a361019594a4e53977bf6d4e languageName: node linkType: hard