diff --git a/.github/workflows/auto-branch-updater.yml b/.github/workflows/auto-branch-updater.yml index 90376c99560..e2f181680d9 100644 --- a/.github/workflows/auto-branch-updater.yml +++ b/.github/workflows/auto-branch-updater.yml @@ -29,7 +29,7 @@ jobs: run: echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: 'eu-web-${{ steps.setup.outputs.branch }}' fetch-depth: 0 diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index a8660bad182..ae4f2f37ba8 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -43,7 +43,7 @@ jobs: node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get Package Version id: gen_vars @@ -73,7 +73,7 @@ jobs: working-directory: apps/browser steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Testing locales - extName length run: | @@ -111,10 +111,10 @@ jobs: _NODE_VERSION: ${{ needs.setup.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -173,63 +173,63 @@ jobs: working-directory: browser-source/apps/browser - name: Upload Opera artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: dist-opera-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/dist/dist-opera.zip if-no-files-found: error - name: Upload Opera MV3 artifact (DO NOT USE FOR PROD) - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: DO-NOT-USE-FOR-PROD-dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/dist/dist-opera-mv3.zip if-no-files-found: error - name: Upload Chrome MV3 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/dist/dist-chrome-mv3.zip if-no-files-found: error - name: Upload Chrome MV3 Beta artifact (DO NOT USE FOR PROD) - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: DO-NOT-USE-FOR-PROD-dist-chrome-MV3-beta-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/dist/dist-chrome-mv3-beta.zip if-no-files-found: error - name: Upload Firefox artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: dist-firefox-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/dist/dist-firefox.zip if-no-files-found: error - name: Upload Firefox MV3 artifact (DO NOT USE FOR PROD) - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: DO-NOT-USE-FOR-PROD-dist-firefox-MV3-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/dist/dist-firefox-mv3.zip if-no-files-found: error - name: Upload Edge artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: dist-edge-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/dist/dist-edge.zip if-no-files-found: error - name: Upload Edge MV3 artifact (DO NOT USE FOR PROD) - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: DO-NOT-USE-FOR-PROD-dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/dist/dist-edge-mv3.zip if-no-files-found: error - name: Upload browser source - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: browser-source-${{ env._BUILD_NUMBER }}.zip path: browser-source.zip @@ -237,7 +237,7 @@ jobs: - name: Upload coverage artifact if: false - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: coverage-${{ env._BUILD_NUMBER }}.zip path: browser-source/apps/browser/coverage/coverage-${{ env._BUILD_NUMBER }}.zip @@ -254,10 +254,10 @@ jobs: _NODE_VERSION: ${{ needs.setup.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -352,7 +352,7 @@ jobs: ls -la - name: Upload Safari artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: dist-safari-${{ env._BUILD_NUMBER }}.zip path: apps/browser/dist/dist-safari.zip @@ -367,7 +367,7 @@ jobs: - build-safari steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -382,7 +382,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@6ed209d411599a981ccb978df3be9dc9b8a81699 # v2.1.1 + uses: crowdin/github-action@c953b17499daa6be3e5afbf7a63616fb02d8b18d # v1.19.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -423,7 +423,7 @@ jobs: secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 + uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() env: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 1f1b9936bf6..fd864cf99a5 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -43,7 +43,7 @@ jobs: node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get Package Version id: retrieve-package-version @@ -84,7 +84,7 @@ jobs: _WIN_PKG_VERSION: 3.5 steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup Unix Vars run: | @@ -93,7 +93,7 @@ jobs: awk '{print tolower($0)}')" >> $GITHUB_ENV - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -130,14 +130,14 @@ jobs: matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt - name: Upload unix zip asset - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - name: Upload unix checksum asset - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}-sha256-${{ env._PACKAGE_VERSION }}.txt @@ -162,7 +162,7 @@ jobs: _WIN_PKG_VERSION: 3.5 steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup Windows builder run: | @@ -171,7 +171,7 @@ jobs: choco install nasm --no-progress - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -269,14 +269,14 @@ jobs: -t sha256 | Out-File -Encoding ASCII ./dist/bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${env:_PACKAGE_VERSION}.txt - name: Upload windows zip asset - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bw${{ matrix.license_type.artifact_prefix }}-windows-${{ env._PACKAGE_VERSION }}.zip path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-windows-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - name: Upload windows checksum asset - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${{ env._PACKAGE_VERSION }}.txt path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${{ env._PACKAGE_VERSION }}.txt @@ -284,18 +284,21 @@ jobs: - name: Upload Chocolatey asset if: matrix.license_type.build_prefix == 'bit' - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden-cli.${{ env._PACKAGE_VERSION }}.nupkg path: apps/cli/dist/chocolatey/bitwarden-cli.${{ env._PACKAGE_VERSION }}.nupkg if-no-files-found: error + + - name: Zip NPM Build Artifact + run: Get-ChildItem -Path .\build | Compress-Archive -DestinationPath .\bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip - name: Upload NPM Build Directory asset if: matrix.license_type.build_prefix == 'bit' - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip - path: apps/cli/build + path: apps/cli/bitwarden-cli-${{ env._PACKAGE_VERSION }}-npm-build.zip if-no-files-found: error snap: @@ -309,7 +312,7 @@ jobs: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Print environment run: | @@ -319,7 +322,7 @@ jobs: echo "BW Package Version: $_PACKAGE_VERSION" - name: Get bw linux cli - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: bw-linux-${{ env._PACKAGE_VERSION }}.zip path: apps/cli/dist/snap @@ -332,7 +335,7 @@ jobs: ls -alth - name: Build snap - uses: snapcore/action-build@2096990827aa966f773676c8a53793c723b6b40f # v1.2.0 + uses: snapcore/action-build@3bdaa03e1ba6bf59a65f84a751d943d549a54e79 # v1.3.0 with: path: apps/cli/dist/snap @@ -361,14 +364,14 @@ jobs: run: sudo snap remove bw - name: Upload snap asset - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bw_${{ env._PACKAGE_VERSION }}_amd64.snap path: apps/cli/dist/snap/bw_${{ env._PACKAGE_VERSION }}_amd64.snap if-no-files-found: error - name: Upload snap checksum asset - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt path: apps/cli/dist/snap/bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt @@ -405,7 +408,7 @@ jobs: secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 + uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() env: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index c933ea304c6..a4dcf698faa 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -38,7 +38,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Verify run: | @@ -67,7 +67,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get Package Version id: retrieve-version @@ -140,10 +140,10 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -169,7 +169,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: cache with: path: | @@ -193,42 +193,42 @@ jobs: run: npm run dist:lin - name: Upload .deb artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb if-no-files-found: error - name: Upload .rpm artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm if-no-files-found: error - name: Upload .freebsd artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd if-no-files-found: error - name: Upload .snap artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap path: apps/desktop/dist/bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap if-no-files-found: error - name: Upload .AppImage artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: ${{ needs.setup.outputs.release_channel }}-linux.yml path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-linux.yml @@ -249,10 +249,10 @@ jobs: NODE_OPTIONS: --max_old_space_size=4096 steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -298,7 +298,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: cache with: path: apps/desktop/desktop_native/napi/*.node @@ -351,91 +351,91 @@ jobs: -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z - name: Upload portable exe artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe path: apps/desktop/dist/Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe if-no-files-found: error - name: Upload installer exe artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe path: apps/desktop/dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe if-no-files-found: error - name: Upload appx ia32 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx if-no-files-found: error - name: Upload store appx ia32 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx if-no-files-found: error - name: Upload NSIS ia32 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z if-no-files-found: error - name: Upload appx x64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx if-no-files-found: error - name: Upload store appx x64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx if-no-files-found: error - name: Upload NSIS x64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z if-no-files-found: error - name: Upload appx ARM64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx if-no-files-found: error - name: Upload store appx ARM64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx if-no-files-found: error - name: Upload NSIS ARM64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z if-no-files-found: error - name: Upload nupkg artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden.${{ env._PACKAGE_VERSION }}.nupkg path: apps/desktop/dist/chocolatey/bitwarden.${{ env._PACKAGE_VERSION }}.nupkg if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: ${{ needs.setup.outputs.release_channel }}.yml path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release_channel }}.yml @@ -455,10 +455,10 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -481,14 +481,14 @@ jobs: - name: Cache Build id: build-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Cache Safari id: safari-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -581,7 +581,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: cache with: path: apps/desktop/desktop_native/napi/*.node @@ -619,10 +619,10 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -645,14 +645,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -745,7 +745,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: cache with: path: apps/desktop/desktop_native/napi/*.node @@ -761,7 +761,7 @@ jobs: run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -792,28 +792,28 @@ jobs: run: npm run pack:mac - name: Upload .zip artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip if-no-files-found: error - name: Upload .dmg artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg if-no-files-found: error - name: Upload .dmg blockmap artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: ${{ needs.setup.outputs.release_channel }}-mac.yml path: apps/desktop/dist/${{ needs.setup.outputs.release_channel }}-mac.yml @@ -836,10 +836,10 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -862,14 +862,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -962,7 +962,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: cache with: path: apps/desktop/desktop_native/napi/*.node @@ -978,7 +978,7 @@ jobs: run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -1009,7 +1009,7 @@ jobs: run: npm run pack:mac:mas - name: Upload .pkg artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg @@ -1044,10 +1044,10 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -1065,14 +1065,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -1165,7 +1165,7 @@ jobs: working-directory: ./ - name: Cache Native Module - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: cache with: path: apps/desktop/desktop_native/napi/*.node @@ -1181,7 +1181,7 @@ jobs: run: npm run build - name: Download Browser artifact - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: ${{ github.workspace }}/browser-build-artifacts @@ -1215,7 +1215,7 @@ jobs: zip -r Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip Bitwarden.app - name: Upload masdev artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip path: apps/desktop/dist/mas-dev-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-masdev-universal.zip @@ -1233,7 +1233,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -1248,7 +1248,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@6ed209d411599a981ccb978df3be9dc9b8a81699 # v2.1.1 + uses: crowdin/github-action@c953b17499daa6be3e5afbf7a63616fb02d8b18d # v1.19.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -1294,7 +1294,7 @@ jobs: secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 + uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() env: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 46e65e8924b..fbab45ddb72 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -45,7 +45,7 @@ jobs: node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get GitHub sha as version id: version @@ -91,10 +91,10 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -130,7 +130,7 @@ jobs: run: zip -r web-${{ env._VERSION }}-${{ matrix.name }}.zip build - name: Upload ${{ matrix.name }} artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: web-${{ env._VERSION }}-${{ matrix.name }}.zip path: apps/web/web-${{ env._VERSION }}-${{ matrix.name }}.zip @@ -157,7 +157,7 @@ jobs: _VERSION: ${{ needs.setup.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Check Branch to Publish env: @@ -194,7 +194,7 @@ jobs: secrets: "github-pat-bitwarden-devops-bot-repo-scope" - name: Download ${{ matrix.artifact_name }} artifact - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip path: apps/web @@ -255,7 +255,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -270,7 +270,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@6ed209d411599a981ccb978df3be9dc9b8a81699 # v2.1.1 + uses: crowdin/github-action@c953b17499daa6be3e5afbf7a63616fb02d8b18d # v1.19.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -345,7 +345,7 @@ jobs: secrets: "devops-alerts-slack-webhook-url" - name: Notify Slack on failure - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f # v2.0.0 + uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() env: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 6a02c2d1245..c8dd3e77838 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 @@ -38,13 +38,13 @@ jobs: echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: node-version: ${{ steps.retrieve-node-version.outputs.node_version }} - name: Cache NPM id: npm-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/.npm" key: ${{ runner.os }}-npm-chromatic-${{ hashFiles('**/package-lock.json') }} diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 1f5df5a66c0..527dedb5a86 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -23,7 +23,7 @@ jobs: crowdin_project_id: "308189" steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2d881a4c304..bb495a5a26d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Lint filenames (no capital characters) run: | @@ -48,7 +48,7 @@ jobs: echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml index 09b6b53e584..6581e260900 100644 --- a/.github/workflows/publish-cli.yml +++ b/.github/workflows/publish-cli.yml @@ -92,7 +92,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -129,7 +129,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -169,7 +169,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -183,8 +183,11 @@ jobs: keyvault: "bitwarden-ci" secrets: "npm-api-key" - - name: Download artifacts - run: wget https://github.com/bitwarden/clients/releases/download/cli-v${{ env._PKG_VERSION }}/bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip + - name: Download and set up artifact + run: | + mkdir -p build + wget https://github.com/bitwarden/clients/releases/download/cli-v${{ env._PKG_VERSION }}/bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip + unzip bitwarden-cli-${{ env._PKG_VERSION }}-npm-build.zip -d build - name: Setup NPM run: | diff --git a/.github/workflows/publish-desktop.yml b/.github/workflows/publish-desktop.yml index c03697fc802..d12072c7e6d 100644 --- a/.github/workflows/publish-desktop.yml +++ b/.github/workflows/publish-desktop.yml @@ -184,7 +184,7 @@ jobs: _RELEASE_TAG: ${{ needs.setup.outputs.tag-name }} steps: - name: Checkout Repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Login to Azure uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 @@ -228,7 +228,7 @@ jobs: _RELEASE_TAG: ${{ needs.setup.outputs.tag-name }} steps: - name: Checkout Repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Print Environment run: | diff --git a/.github/workflows/publish-web.yml b/.github/workflows/publish-web.yml index b7ea8498593..4409da93560 100644 --- a/.github/workflows/publish-web.yml +++ b/.github/workflows/publish-web.yml @@ -27,7 +27,7 @@ jobs: tag_version: ${{ steps.version.outputs.tag }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Branch check if: ${{ inputs.publish_type != 'Dry Run' }} @@ -67,7 +67,7 @@ jobs: echo "Github Release Option: $_RELEASE_OPTION" - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 ########## ACR ########## - name: Login to Azure - PROD Subscription diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml index 3feaff8cede..2811b23af9b 100644 --- a/.github/workflows/release-browser.yml +++ b/.github/workflows/release-browser.yml @@ -27,7 +27,7 @@ jobs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -56,7 +56,7 @@ jobs: needs: setup steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Testing locales - extName length run: | diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index ddcdb4e904f..cd450b2cd79 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -27,7 +27,7 @@ jobs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Branch check if: ${{ inputs.release_type != 'Dry Run' }} diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml index 74db61563e1..3f8bc45d51d 100644 --- a/.github/workflows/release-desktop-beta.yml +++ b/.github/workflows/release-desktop-beta.yml @@ -24,7 +24,7 @@ jobs: node_version: ${{ steps.retrieve-node-version.outputs.node_version }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Branch check run: | @@ -125,12 +125,12 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -159,42 +159,42 @@ jobs: run: npm run dist:lin - name: Upload .deb artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-amd64.deb if-no-files-found: error - name: Upload .rpm artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.rpm if-no-files-found: error - name: Upload .freebsd artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.freebsd if-no-files-found: error - name: Upload .snap artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap path: apps/desktop/dist/bitwarden_${{ env._PACKAGE_VERSION }}_amd64.snap if-no-files-found: error - name: Upload .AppImage artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x86_64.AppImage if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: ${{ needs.setup.outputs.release-channel }}-linux.yml path: apps/desktop/dist/${{ needs.setup.outputs.release-channel }}-linux.yml @@ -215,12 +215,12 @@ jobs: NODE_OPTIONS: --max_old_space_size=4096 steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -300,91 +300,91 @@ jobs: -NewName bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z - name: Upload portable exe artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe path: apps/desktop/dist/Bitwarden-Portable-${{ env._PACKAGE_VERSION }}.exe if-no-files-found: error - name: Upload installer exe artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe path: apps/desktop/dist/nsis-web/Bitwarden-Installer-${{ env._PACKAGE_VERSION }}.exe if-no-files-found: error - name: Upload appx ia32 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32.appx if-no-files-found: error - name: Upload store appx ia32 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-ia32-store.appx if-no-files-found: error - name: Upload NSIS ia32 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-ia32.nsis.7z if-no-files-found: error - name: Upload appx x64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64.appx if-no-files-found: error - name: Upload store appx x64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-x64-store.appx if-no-files-found: error - name: Upload NSIS x64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-x64.nsis.7z if-no-files-found: error - name: Upload appx ARM64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64.appx if-no-files-found: error - name: Upload store appx ARM64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-arm64-store.appx if-no-files-found: error - name: Upload NSIS ARM64 artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z path: apps/desktop/dist/nsis-web/bitwarden-${{ env._PACKAGE_VERSION }}-arm64.nsis.7z if-no-files-found: error - name: Upload nupkg artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: bitwarden.${{ env._PACKAGE_VERSION }}.nupkg path: apps/desktop/dist/chocolatey/bitwarden.${{ env._PACKAGE_VERSION }}.nupkg if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: ${{ needs.setup.outputs.release-channel }}.yml path: apps/desktop/dist/nsis-web/${{ needs.setup.outputs.release-channel }}.yml @@ -404,12 +404,12 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -427,14 +427,14 @@ jobs: - name: Cache Build id: build-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Cache Safari id: safari-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -538,12 +538,12 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -561,14 +561,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -708,28 +708,28 @@ jobs: run: npm run pack:mac - name: Upload .zip artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal-mac.zip if-no-files-found: error - name: Upload .dmg artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg if-no-files-found: error - name: Upload .dmg blockmap artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap path: apps/desktop/dist/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.dmg.blockmap if-no-files-found: error - name: Upload auto-update artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: ${{ needs.setup.outputs.release-channel }}-mac.yml path: apps/desktop/dist/${{ needs.setup.outputs.release-channel }}-mac.yml @@ -751,12 +751,12 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ needs.setup.outputs.branch-name }} - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -774,14 +774,14 @@ jobs: - name: Get Build Cache id: build-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/desktop/build key: ${{ runner.os }}-${{ github.run_id }}-build - name: Setup Safari Cache id: safari-cache - uses: actions/cache@ab5e6d0c87105b4c9c2047343972218f562e4319 # v4.0.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension @@ -916,7 +916,7 @@ jobs: APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - name: Upload .pkg artifact - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 with: name: Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg path: apps/desktop/dist/mas-universal/Bitwarden-${{ env._PACKAGE_VERSION }}-universal.pkg @@ -958,7 +958,7 @@ jobs: aws-electron-bucket-name" - name: Download all artifacts - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: path: apps/desktop/artifacts @@ -1011,7 +1011,7 @@ jobs: - release steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup git config run: | diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index 2fe7cb2b7a4..5b75460ef92 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -27,7 +27,7 @@ jobs: release-channel: ${{ steps.release-channel.outputs.channel }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 596341459cd..982e3867585 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -24,7 +24,7 @@ jobs: tag_version: ${{ steps.version.outputs.tag }} steps: - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index 212795d3a2b..d90e009bf36 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -27,12 +27,12 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: ${{ github.event.pull_request.head.sha }} - name: Scan with Checkmarx - uses: checkmarx/ast-github-action@749fec53e0db0f6404a97e2e0807c3e80e3583a7 # v2.0.23 + uses: checkmarx/ast-github-action@1fe318de2993222574e6249750ba9000a4e2a6cd # 2.0.33 env: INCREMENTAL: "${{ contains(github.event_name, 'pull_request') && '--sast-incremental' || '' }}" with: @@ -47,7 +47,7 @@ jobs: --output-path . ${{ env.INCREMENTAL }} - name: Upload Checkmarx results to GitHub - uses: github/codeql-action/upload-sarif@1b1aada464948af03b950897e5eb522f92603cc2 # v3.24.9 + uses: github/codeql-action/upload-sarif@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 with: sarif_file: cx_result.sarif @@ -61,13 +61,13 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.sha }} - name: Scan with SonarCloud - uses: sonarsource/sonarcloud-github-action@49e6cd3b187936a73b8280d59ffd9da69df63ec9 # v2.1.1 + uses: sonarsource/sonarcloud-github-action@e44258b109568baa0df60ed515909fc6c72cba92 # v2.3.0 env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 52928e9a040..5b4cd52ac8e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,7 +41,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Get Node Version id: retrieve-node-version @@ -51,7 +51,7 @@ jobs: echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT - name: Set up Node - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: cache: 'npm' cache-dependency-path: '**/package-lock.json' @@ -86,7 +86,7 @@ jobs: fail-on-error: true - name: Upload coverage to codecov.io - uses: codecov/codecov-action@54bcd8715eee62d40e33596ef5e8f0f48dbbccab # v4.1.0 + uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0 if: ${{ needs.check-test-secrets.outputs.available == 'true' }} env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} @@ -121,7 +121,7 @@ jobs: sudo apt-get install -y gnome-keyring dbus-x11 - name: Check out repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Build working-directory: ./apps/desktop/desktop_native diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 4bf502da21c..fc30996e850 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -58,7 +58,7 @@ jobs: fi - name: Checkout Branch - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: main @@ -526,7 +526,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout Branch - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: ref: main diff --git a/apps/browser/package.json b/apps/browser/package.json index 07fb9deb26f..433ddecd2ac 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2024.8.0", + "version": "2024.8.1", "scripts": { "build": "cross-env MANIFEST_VERSION=3 webpack", "build:mv2": "webpack", @@ -20,8 +20,8 @@ "dist:chrome:beta": "cross-env MANIFEST_VERSION=3 npm run build:prod:beta && cross-env MANIFEST_VERSION=3 BETA_BUILD=1 gulp dist:chrome", "dist:firefox": "npm run build:prod && gulp dist:firefox", "dist:opera": "npm run build:prod && gulp dist:opera", - "dist:safari": "cross-env MANIFEST_VERSION=3 BROWSER=safari npm run build:prod && cross-env MANIFEST_VERSION=3 gulp dist:safari", - "dist:safari:mv3": "npm run build:prod && gulp dist:safari", + "dist:safari": "cross-env BROWSER=safari npm run build:prod && gulp dist:safari", + "dist:safari:mv3": "cross-env MANIFEST_VERSION=3 BROWSER=safari run build:prod && cross-env MANIFEST_VERSION=3 BROWSER=safari gulp dist:safari", "dist:safari:mas": "npm run build:prod && gulp dist:safari:mas", "dist:safari:masdev": "npm run build:prod && gulp dist:safari:masdev", "dist:safari:dmg": "npm run build:prod && gulp dist:safari:dmg", diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 2b523a788b4..16b51dae076 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -384,16 +384,56 @@ "message": "الحد الأدنى لطول كلمة السر" }, "uppercase": { - "message": "أحرف كبيرة (من A إلى Z)" + "message": "أحرف كبيرة (من A إلى Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "أحرف كبيرة (من a إلى z)" + "message": "أحرف كبيرة (من a إلى z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "الأرقام (من 0 الى 9)" + "message": "الأرقام (من 0 الى 9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "الأحرف الخاصة (!@#$%^&*)" + "message": "الأحرف الخاصة (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "عدد الكلمات" @@ -415,7 +455,12 @@ "message": "الحد الأدنى من الأحرف الخاصة" }, "avoidAmbChar": { - "message": "تجنب الأحرف الغامضة" + "message": "تجنب الأحرف الغامضة", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "البحث في الخزنة" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "تم إنشاء حسابك الجديد! يمكنك الآن تسجيل الدخول." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "سجلتَ الدخول بنجاح" }, @@ -1113,7 +1164,7 @@ "message": "شكرا لك على دعم Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "الكل فقط بـ $PRICE$ /سنة!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "فشل القياسات الحيوية" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 90327c85425..346a727a87b 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -384,16 +384,56 @@ "message": "Minimal parol uzunluğu" }, "uppercase": { - "message": "Böyük hərf (A-Z)" + "message": "Böyük hərf (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Kiçik hərf (a-z)" + "message": "Kiçik hərf (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Rəqəmlər (0-9)" + "message": "Rəqəmlər (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Xüsusi simvollar (!@#$%^&*)" + "message": "Xüsusi simvollar (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Daxil et", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Böyük hərf xarakterlərini daxil et", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Kiçik hərf xarakterlərini daxil et", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Rəqəmləri daxil et", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Xüsusi xarakterləri daxil et", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Söz sayı" @@ -415,7 +455,12 @@ "message": "Minimum simvol" }, "avoidAmbChar": { - "message": "Anlaşılmaz simvollardan çəkinin" + "message": "Anlaşılmaz simvollardan çəkinin", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Anlaşılmaz xarakterlərdən çəkin", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Anbarda axtar" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Yeni hesabınız yaradıldı! İndi giriş edə bilərsiniz." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Uğurla giriş etdiniz" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Lütfən bu istifadəçinin kilidini masaüstü tətbiqində açıb yenidən sınayın." }, + "biometricsNotAvailableTitle": { + "message": "Biometrik kilidi açma əlçatmazdır" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrik kilidi açma hazırda əlçatmazdır. Lütfən daha sonra yenidən sınayın." + }, "biometricsFailedTitle": { "message": "Biometrik uğursuzdur" }, @@ -3639,10 +3696,18 @@ "message": "Kimlik məlumatları uğurla saxlanıldı!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Parol saxlanıldı!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Kimlik məlumatları uğurla güncəlləndi!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Parol güncəlləndi!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Kimlik məlumatlarını saxlama xətası. Detallar üçün konsolu yoxlayın.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Müəssisə siyasət tələbləri bu ayara tətbiq edildi" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index e06960c6b74..5de9698dd1d 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -384,16 +384,56 @@ "message": "Мінімальная даўжыня пароля" }, "uppercase": { - "message": "Вялікія літары (A-Z)" + "message": "Вялікія літары (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Маленькія літары (a-z)" + "message": "Маленькія літары (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Лічбы (0-9)" + "message": "Лічбы (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Спецыяльныя сімвалы (!@#$%^&*)" + "message": "Спецыяльныя сімвалы (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Колькасць слоў" @@ -415,7 +455,12 @@ "message": "Мінімум спецыяльных сімвалаў" }, "avoidAmbChar": { - "message": "Пазбягаць неадназначных сімвалаў" + "message": "Пазбягаць неадназначных сімвалаў", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Пошук у сховішчы" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Ваш уліковы запіс створаны! Цяпер вы можаце ўвайсці ў яго." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Вы паспяхова аўтарызаваны" }, @@ -1113,7 +1164,7 @@ "message": "Дзякуй за падтрымку Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Усяго за $PRICE$ у год!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index de9686623d2..410fea88f8b 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -384,16 +384,56 @@ "message": "Минимална дължина на паролата" }, "uppercase": { - "message": "Главни букви (A-Z)" + "message": "Главни букви (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Малки букви (a-z)" + "message": "Малки букви (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Числа (0-9)" + "message": "Числа (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Специални знаци (!@#$%^&*)" + "message": "Специални знаци (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Включване", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Включване на главни букви", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Включване на малки букви", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Включване на цифри", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Включване на специални знаци", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Брой думи" @@ -415,7 +455,12 @@ "message": "Минимален брой специални знаци" }, "avoidAmbChar": { - "message": "Без нееднозначни знаци" + "message": "Без нееднозначни знаци", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Без нееднозначни знаци", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Търсене в трезора" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Абонаментът ви бе създаден. Вече можете да се впишете." }, + "newAccountCreated2": { + "message": "Новата Ви регистрация беше създадена!" + }, + "youHaveBeenLoggedIn": { + "message": "Вече сте вписан(а)!" + }, "youSuccessfullyLoggedIn": { "message": "Вписахте се успешно" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Отключете потребителя в настолното приложение и опитайте отново." }, + "biometricsNotAvailableTitle": { + "message": "Отключването чрез биометрични данни не е налично" + }, + "biometricsNotAvailableDesc": { + "message": "Отключването чрез биометрични данни не е налично в момента. Опитайте отново по-късно." + }, "biometricsFailedTitle": { "message": "Неуспешно удостоверяване чрез биометрични данни" }, @@ -3639,10 +3696,18 @@ "message": "Идентификационните данни са запазени успешно!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Паролата е запазена!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Идентификационните данни са променени успешно!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Паролата е обновена!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Грешка при запазването на идентификационните данни. Вижте конзолата за подробности.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Изискванията на политиката за големи компании бяха приложени към тази настройка" + }, + "additionalContentAvailable": { + "message": "Има налично допълнително съдържание" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 8bb46b60aba..b19ca88cb4b 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "শব্দের সংখ্যা" @@ -415,7 +455,12 @@ "message": "ন্যূনতম বিশেষ" }, "avoidAmbChar": { - "message": "অস্পষ্ট বর্ণগুলি এড়িয়ে চলুন" + "message": "অস্পষ্ট বর্ণগুলি এড়িয়ে চলুন", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "ভল্ট খুঁজুন" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "আপনার নতুন অ্যাকাউন্ট তৈরি করা হয়েছে! আপনি এখন প্রবেশ করতে পারেন।" }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Bitwarden কে সমর্থন করার জন্য আপনাকে ধন্যবাদ।" }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "সমস্ত মাত্র $PRICE$ / বছরের জন্য!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index 9d53f1e0fdc..072fa9b99d5 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 88f04d0b517..4543080fadc 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -384,16 +384,56 @@ "message": "Longitud mínima de la contrasenya" }, "uppercase": { - "message": "Majúscula (A-Z)" + "message": "Majúscula (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minúscula (a-z)" + "message": "Minúscula (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Números (0-9)" + "message": "Números (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caràcters especials (!@#$%^&*)" + "message": "Caràcters especials (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Nombre de paraules" @@ -415,7 +455,12 @@ "message": "Mínim de caràcters especials" }, "avoidAmbChar": { - "message": "Eviteu caràcters ambigus" + "message": "Eviteu caràcters ambigus", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Cerca en la caixa forta" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "El vostre compte s'ha creat correctament. Ara ja podeu iniciar sessió." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Heu iniciat sessió correctament" }, @@ -1113,7 +1164,7 @@ "message": "Gràcies per donar suport a Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Tot per només $PRICE$ / any!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "La biometria ha fallat" }, @@ -3639,10 +3696,18 @@ "message": "Les credencials s'han guardat correctament!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Les credencials s'han actualitzat correctament!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "S'ha produït un error en guardar les credencials. Consulteu la consola per obtenir més informació.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index b16040f3276..f20fa8b420e 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -384,16 +384,56 @@ "message": "Minimální délka hesla" }, "uppercase": { - "message": "Velká písmena (A-Z)" + "message": "Velká písmena (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Malá písmena (a-z)" + "message": "Malá písmena (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Číslice (0-9)" + "message": "Číslice (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Speciální znaky (!@#$%^&*)" + "message": "Speciální znaky (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Zahrnout", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Zahrnout velká písmena", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Zahrnout malá písmena", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Zahrnout číslice", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Zahrnout speciální znaky", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Počet slov" @@ -415,7 +455,12 @@ "message": "Minimální počet speciálních znaků" }, "avoidAmbChar": { - "message": "Nepoužívat zaměnitelné znaky" + "message": "Nepoužívat zaměnitelné znaky", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Nepoužívat zaměnitelné znaky", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Vyhledat v trezoru" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Váš účet byl vytvořen! Můžete se přihlásit." }, + "newAccountCreated2": { + "message": "Váš nový účet byl vytvořen!" + }, + "youHaveBeenLoggedIn": { + "message": "Byli jste přihlášeni!" + }, "youSuccessfullyLoggedIn": { "message": "Byli jste úspěšně přihlášeni" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Odemkněte tohoto uživatele v programu pro počítač a zkuste to znovu." }, + "biometricsNotAvailableTitle": { + "message": "Biometrické odemknutí není k dispozici" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrické odemknutí je momentálně nedostupné. Opakujte akci později." + }, "biometricsFailedTitle": { "message": "Biometrika selhala" }, @@ -3639,10 +3696,18 @@ "message": "Pověření byla úspěšně uložena!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Heslo uloženo!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Pověření byla úspěšně aktualizována!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Heslo aktualizováno!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Chyba při ukládání přihlašovacích údajů. Podrobnosti naleznete v konzoli.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Na toto nastavení byly uplatněny požadavky podnikových zásad" + }, + "additionalContentAvailable": { + "message": "Je k dispozici další obsah" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 295f970b182..3060e28608e 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -384,16 +384,56 @@ "message": "Hyd lleiaf cyfrineiriau" }, "uppercase": { - "message": "Priflythrennau (A-Z)" + "message": "Priflythrennau (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Llythrennau bach (a-z)" + "message": "Llythrennau bach (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Rhifau (0-9)" + "message": "Rhifau (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Nodau arbennig (!@#$%^&*)" + "message": "Nodau arbennig (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Nifer o eiriau" @@ -415,7 +455,12 @@ "message": "Isafswm nodau arbennig" }, "avoidAmbChar": { - "message": "Osgoi nodau amwys" + "message": "Osgoi nodau amwys", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Chwilio'r gell" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Mae eich cyfrif newydd wedi cael ei greu! Gallwch bellach fewngofnodi." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Diolch am gefnogi Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Hyn oll am $PRICE$ y flwyddyn!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index ea5d1eae3cb..376633ee762 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -384,16 +384,56 @@ "message": "Minimumslængde på adgangskode" }, "uppercase": { - "message": "Store bogstaver (A-Z)" + "message": "Store bogstaver (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Små bogstaver (a-z)" + "message": "Små bogstaver (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Tal (0-9)" + "message": "Tal (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Specialtegn (!@#$%^&*)" + "message": "Specialtegn (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Inkludér", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Inkludér majuskler", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Inkludér minuskler", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Inkludér tal", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Inkludér specialtegn", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Antal ord" @@ -415,7 +455,12 @@ "message": "Mindste antal specialtegn" }, "avoidAmbChar": { - "message": "Undgå tvetydige tegn" + "message": "Undgå tvetydige tegn", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Undgå tvetydige tegn", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Søg i boks" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Din nye konto er oprettet! Du kan nu logge ind." }, + "newAccountCreated2": { + "message": "Din nye konto er oprettet!" + }, + "youHaveBeenLoggedIn": { + "message": "Du er blevet logget ind!" + }, "youSuccessfullyLoggedIn": { "message": "Du er nu logget ind" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Oplås denne bruger op i computerprogrammet og forsøg igen." }, + "biometricsNotAvailableTitle": { + "message": "Biometrisk oplåsning utilgængelig" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrisk oplåsning er p.t. ikke tilgængelig. Prøv igen senere." + }, "biometricsFailedTitle": { "message": "Biometri mislykkedes" }, @@ -3639,10 +3696,18 @@ "message": "Legitimationsoplysninger er gemt!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Adgangskode gemt!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Legitimationsoplysninger er opdateret!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Adgangskode opdateret!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Fejl under import. Tjek konsollen for detaljer.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Virksomhedspolitikkrav er anvendt på denne indstilling" + }, + "additionalContentAvailable": { + "message": "Yderligere indhold er tilgængeligt" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 658b95e5e0f..ab0227ccbd5 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -384,16 +384,56 @@ "message": "Minimale Passwortlänge" }, "uppercase": { - "message": "Großbuchstaben (A-Z)" + "message": "Großbuchstaben (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Kleinbuchstaben (a-z)" + "message": "Kleinbuchstaben (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Zahlen (0-9)" + "message": "Zahlen (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Sonderzeichen (!@#$%^&*)" + "message": "Sonderzeichen (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Einschließen", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Großbuchstaben verwenden", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Kleinbuchstaben verwenden", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Ziffern verwenden", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Sonderzeichen verwenden", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Anzahl der Wörter" @@ -415,7 +455,12 @@ "message": "Mindestanzahl Sonderzeichen" }, "avoidAmbChar": { - "message": "Mehrdeutige Zeichen vermeiden" + "message": "Mehrdeutige Zeichen vermeiden", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Mehrdeutige Zeichen vermeiden", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Tresor durchsuchen" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Dein neues Konto wurde erstellt! Du kannst dich jetzt anmelden." }, + "newAccountCreated2": { + "message": "Dein neues Konto wurde erstellt!" + }, + "youHaveBeenLoggedIn": { + "message": "Du wurdest angemeldet!" + }, "youSuccessfullyLoggedIn": { "message": "Du hast dich erfolgreich angemeldet." }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Bitte entsperre diesen Nutzer in der Desktop-Anwendung und versuche es erneut." }, + "biometricsNotAvailableTitle": { + "message": "Biometrisches Entsperren nicht verfügbar" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrisches Entsperren ist derzeit nicht verfügbar. Bitte versuche es später erneut." + }, "biometricsFailedTitle": { "message": "Biometrie fehlgeschlagen" }, @@ -3639,10 +3696,18 @@ "message": "Zugangsdaten erfolgreich gespeichert!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Passwort gespeichert!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Zugangsdaten erfolgreich aktualisiert!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Passwort aktualisiert!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Fehler beim Speichern der Zugangsdaten. Details in der Konsole.", "description": "Notification message for when saving credentials has failed." @@ -3988,7 +4053,7 @@ } }, "enableAnimations": { - "message": "Enable animations" + "message": "Animationen aktivieren" }, "addAccount": { "message": "Konto hinzufügen" @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Unternehmens-Richtlinienanforderungen wurden auf diese Einstellung angewandt" + }, + "additionalContentAvailable": { + "message": "Zusätzlicher Inhalt ist verfügbar" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 83a77c6b382..5ab4132d27d 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -384,16 +384,56 @@ "message": "Ελάχιστο μήκος κωδικού πρόσβασης" }, "uppercase": { - "message": "Κεφαλαία (A-Z)" + "message": "Κεφαλαία (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Πεζά (α-ω)" + "message": "Πεζά (α-ω)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Αριθμοί (0-9)" + "message": "Αριθμοί (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Ειδικοί χαρακτήρες (!@#$%^&*)" + "message": "Ειδικοί χαρακτήρες (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Αριθμός λέξεων" @@ -415,7 +455,12 @@ "message": "Ελάχιστοι ειδικοί χαρακτήρες" }, "avoidAmbChar": { - "message": "Αποφυγή αμφιλεγόμενων χαρακτήρων" + "message": "Αποφυγή αμφιλεγόμενων χαρακτήρων", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Αναζήτηση στο vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Ο λογαριασμός σας έχει δημιουργηθεί! Τώρα μπορείτε να συνδεθείτε." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Έχετε συνδεθεί επιτυχώς" }, @@ -1113,7 +1164,7 @@ "message": "Ευχαριστούμε που υποστηρίζετε το Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Όλα για μόνο $PRICE$ /έτος!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Παρακαλώ ξεκλειδώστε αυτόν τον χρήστη στην εφαρμογή επιφάνειας εργασίας και προσπαθήστε ξανά." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Τα βιομετρικά απέτυχαν" }, @@ -3639,10 +3696,18 @@ "message": "Τα στοιχεία αποθηκεύτηκαν επιτυχώς!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Τα στοιχεία ενημερώθηκαν επιτυχώς!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Σφάλμα αποθήκευσης στοιχείων. Ελέγξτε την κονσόλα για λεπτομέρειες.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Οι απαιτήσεις της πολιτικής για επιχειρήσεις έχουν εφαρμοστεί σε αυτήν τη ρύθμιση" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 1e8fd03ade3..bc2448d924e 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 49a2f0d3f33..666e391c827 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 97288cb6964..2712156ca96 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special Characters (!@#$%^&*)" + "message": "Special Characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index a3eb6c468cc..78aeed0847a 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -384,16 +384,56 @@ "message": "Longitud mínima de contraseña" }, "uppercase": { - "message": "Mayúsculas (A-Z)" + "message": "Mayúsculas (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minúsculas (a-z)" + "message": "Minúsculas (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Números (0-9)" + "message": "Números (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caracteres especiales (!@#$%^&*)" + "message": "Caracteres especiales (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Número de palabras" @@ -415,7 +455,12 @@ "message": "Mínimo de caracteres especiales" }, "avoidAmbChar": { - "message": "Evitar caracteres ambiguos" + "message": "Evitar caracteres ambiguos", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Buscar en caja fuerte" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "¡Tu nueva cuenta ha sido creada! Ahora puedes acceder." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Accedió correctamente a su cuenta" }, @@ -1113,7 +1164,7 @@ "message": "Gracias por apoyar el desarrollo de Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "¡Todo por solo %price% /año!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Por favor, desbloquea a este usuario en la aplicación de escritorio e inténtalo de nuevo." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Fallo de biométrica" }, @@ -3639,10 +3696,18 @@ "message": "¡Credenciales guardadas con éxito!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "¡Credenciales actualizadas con éxito!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Se produjo un error al guardar las credenciales. Revise la consola para obtener detalles.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index ee717416ac4..f376d7eedaa 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -384,16 +384,56 @@ "message": "Lühim lubatud parooli pikkus" }, "uppercase": { - "message": "Suurtäht (A-Z) " + "message": "Suurtäht (A-Z) ", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Väiketäht (a-z) " + "message": "Väiketäht (a-z) ", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbrid (0-9)" + "message": "Numbrid (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Erimärgid (!@#$%^&*)" + "message": "Erimärgid (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Sõnade arv" @@ -415,7 +455,12 @@ "message": "Vähim arv spetsiaalmärke" }, "avoidAmbChar": { - "message": "Väldi ebamääraseid kirjamärke" + "message": "Väldi ebamääraseid kirjamärke", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Otsi hoidlast" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Konto on loodud! Võid nüüd sisse logida." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Sisselogimine õnnestus" }, @@ -1113,7 +1164,7 @@ "message": "Täname, et toetad Bitwardenit." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Kõik see ainult $PRICE$ / aastas!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biomeetria nurjus" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index e04be282700..bc9132fe94e 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -384,16 +384,56 @@ "message": "Pasahitzaren gutxieneko luzera" }, "uppercase": { - "message": "Letra larria (A-Z)" + "message": "Letra larria (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Letra txikia (a-z)" + "message": "Letra txikia (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Zenbakiak (0-9)" + "message": "Zenbakiak (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Karaktere bereziak (!@#$%^&*)" + "message": "Karaktere bereziak (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Hitz kopurua" @@ -415,7 +455,12 @@ "message": "Gutxieneko karaktere bereziak" }, "avoidAmbChar": { - "message": "Saihestu karaktere anbiguoak" + "message": "Saihestu karaktere anbiguoak", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Bilatu kutxa gotorrean" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Zure kontua egina dago. Orain saioa has dezakezu." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Eskerrik asko Bitwarden babesteagatik." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Dena, urtean $PRICE$gatik!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 159a7f49e92..95db48557ba 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -384,16 +384,56 @@ "message": "حداقل طول گذرواژه" }, "uppercase": { - "message": "حروف بزرگ (A-Z)" + "message": "حروف بزرگ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "حروف کوچک (a-z)" + "message": "حروف کوچک (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "اعداد (‪0-9‬)" + "message": "اعداد (‪0-9‬)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "نویسه‌های ویژه (!@#$%^&*)" + "message": "نویسه‌های ویژه (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "تعداد کلمات" @@ -415,7 +455,12 @@ "message": "حداقل حرف خاص" }, "avoidAmbChar": { - "message": "از کاراکترهای مبهم اجتناب کن" + "message": "از کاراکترهای مبهم اجتناب کن", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "جستجوی گاوصندوق" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "حساب کاربری جدید شما ساخته شد! حالا می‌توانید وارد شوید." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "شما با موفقیت وارد شدید" }, @@ -1113,7 +1164,7 @@ "message": "برای حمایتتان از Bitwarden سپاسگزاریم." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "تمامش فقط $PRICE$ در سال!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "زیست‌سنجی ناموفق بود" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index b9f3df94e48..a9629a63bea 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -384,16 +384,56 @@ "message": "Salasanan vähimmäispituus" }, "uppercase": { - "message": "Isot kirjaimet (A-Z)" + "message": "Isot kirjaimet (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Pienet kirjaimet (a-z)" + "message": "Pienet kirjaimet (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numerot (0-9)" + "message": "Numerot (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Erikoismerkit (!@#$%^&*)" + "message": "Erikoismerkit (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Sisällytä isoja kirjaimia", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Ö", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Käytä pieniä kirjaimia", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-ö", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Käytä numeroita", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Käytä erikoismerkkejä", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Sanojen määrä" @@ -415,7 +455,12 @@ "message": "Erikoismerkkejä vähintään" }, "avoidAmbChar": { - "message": "Vältä epäselviä merkkejä" + "message": "Vältä epäselviä merkkejä", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Vältä epäselviä merkkejä", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Etsi holvista" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Uusi käyttäjätilisi on luotu! Voit nyt kirjautua sisään." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Kirjautuminen onnistui" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Poista käyttäjän lukitus työpöytäsovelluksesta ja yritä uudelleen." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometria epäonnistui" }, @@ -3639,10 +3696,18 @@ "message": "Käyttäjätiedot tallennettiin!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Salasana tallennettiin!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Käyttäjätiedot päivitettiin!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Salasana päivitettiin!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Virhe tallennettaessa käyttäjätietoja. Näet isätietoja hallinnasta.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Yrityskäytännön vaatimuksia on sovellettu tähän asetukseen" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index bfe541fc36f..1dc83447781 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-t) sa Filipino ay mababang-letra (a-t)" + "message": "Lowercase (a-t) sa Filipino ay mababang-letra (a-t)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Mga espesyal na character (!@#$%^&*) sa Filipino ay tinatawag na mga simbolong pambihira" + "message": "Mga espesyal na character (!@#$%^&*) sa Filipino ay tinatawag na mga simbolong pambihira", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Ang bilang ng mga salita\n\nNumero ng mga salita" @@ -415,7 +455,12 @@ "message": "Inakamababang espesyal" }, "avoidAmbChar": { - "message": "Iwasan ang mga hindi malinaw na character" + "message": "Iwasan ang mga hindi malinaw na character", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Hanapin ang vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Nalikha na ang iyong bagong account! Maaari ka nang mag-log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Salamat sa pagsuporta sa Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Lahat para lamang sa $PRICE$ /taon!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index dd25eddfcce..c9e8c2cfc2d 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -384,16 +384,56 @@ "message": "Longueur minimale du mot de passe" }, "uppercase": { - "message": "Majuscules (A-Z)" + "message": "Majuscules (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minuscules (a-z)" + "message": "Minuscules (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Chiffres (0-9)" + "message": "Chiffres (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caractères spéciaux (!@#$%^&*)" + "message": "Caractères spéciaux (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Inclure", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Inclure des caractères majuscules", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Inclure des caractères minuscules", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Inclure des nombres", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Inclure des caractères spéciaux", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Nombre de mots" @@ -415,7 +455,12 @@ "message": "Minimum de caractères spéciaux" }, "avoidAmbChar": { - "message": "Éviter les caractères ambigus" + "message": "Éviter les caractères ambigus", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Éviter les caractères ambigus", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Rechercher dans le coffre" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Votre nouveau compte a été créé ! Vous pouvez maintenant vous authentifier." }, + "newAccountCreated2": { + "message": "Votre nouveau compte a été créé !" + }, + "youHaveBeenLoggedIn": { + "message": "Vous avez été connecté !" + }, "youSuccessfullyLoggedIn": { "message": "Vous vous êtes connecté avec succès" }, @@ -2063,7 +2114,7 @@ "message": "Le déverrouillage biométrique a échoué. La clé secrète biométrique n'a pas réussi à déverrouiller le coffre. Veuillez essayer de configurer à nouveau la biométrie." }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "Non-concordance des clés biométriques" }, "biometricsNotEnabledTitle": { "message": "Le déverrouillage biométrique n'est pas activé" @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Veuillez déverrouiller cet utilisateur dans l'application de bureau et réessayer." }, + "biometricsNotAvailableTitle": { + "message": "Déverrouillage biométrique indisponible" + }, + "biometricsNotAvailableDesc": { + "message": "Le déverrouillage biométrique est actuellement indisponible. Veuillez réessayer plus tard." + }, "biometricsFailedTitle": { "message": "Le déverrouillage biométique a échoué\n" }, @@ -3211,7 +3268,7 @@ "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Add new vault login item, opens in a new window", + "message": "Ajouter un nouvel élément de connexion au coffre, s'ouvre dans une nouvelle fenêtre", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -3219,7 +3276,7 @@ "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Add new vault card item, opens in a new window", + "message": "Ajouter un nouvel élément de carte au coffre, s'ouvre dans une nouvelle fenêtre", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { @@ -3227,7 +3284,7 @@ "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { - "message": "Add new vault identity item, opens in a new window", + "message": "Ajouter un nouvel élément d'identité au coffre, s'ouvre dans une nouvelle fenêtre", "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { @@ -3317,7 +3374,7 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + "message": "Erreur de connexion avec le service Duo. Utilisez une autre méthode de connexion en deux étapes ou contactez Duo pour obtenir de l'aide." }, "launchDuoAndFollowStepsToFinishLoggingIn": { "message": "Lancez DUO et suivez les étapes pour terminer la connexion." @@ -3639,10 +3696,18 @@ "message": "Identifiants enregistrés avec succès !", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Mot de passe enregistré !", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Identifiants mis à jour avec succès !", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Mot de passe mis à jour !", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Erreur lors de l'enregistrement des identifiants. Consultez la console pour plus de détails.", "description": "Notification message for when saving credentials has failed." @@ -3660,7 +3725,7 @@ "message": "Suggestions de saisie automatique" }, "autofillSuggestionsTip": { - "message": "Save a login item for this site to autofill" + "message": "Enregistrez un élément de connexion à remplir automatiquement pour ce site" }, "yourVaultIsEmpty": { "message": "Votre coffre-fort est vide" @@ -3874,7 +3939,7 @@ } }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Are you sure you want to permanently delete this attachment?" + "message": "Êtes-vous sûr de vouloir supprimer définitivement cette pièce jointe ?" }, "premium": { "message": "Premium" @@ -4057,7 +4122,7 @@ "message": "Utilisez un champ lié lorsque vous rencontrez des problèmes de saisie automatique pour un site Web spécifique." }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "Entrez l'identifiant html, le nom, l'étiquette aria ou l'espace réservé du champ." }, "editField": { "message": "Éditer le champ" @@ -4215,18 +4280,21 @@ "message": "Bitwarden a un nouveau look !" }, "bitwardenNewLookDesc": { - "message": "It's easier and more intuitive than ever to autofill and search from the Vault tab. Take a look around!" + "message": "Il est plus facile et plus intuitif que jamais de remplir automatiquement les champs et d'effectuer des recherches à partir de l'onglet \"Coffre\". Jetez un coup d'œil !" }, "accountActions": { - "message": "Account actions" + "message": "Actions du compte" }, "showNumberOfAutofillSuggestions": { "message": "Afficher le nombre de suggestions de saisie automatique d'identifiant sur l'icône d'extension" }, "systemDefault": { - "message": "System default" + "message": "Par défaut" }, "enterprisePolicyRequirementsApplied": { - "message": "Enterprise policy requirements have been applied to this setting" + "message": "Les exigences de la politique d'entreprise ont été appliquées à ce paramètre" + }, + "additionalContentAvailable": { + "message": "Du contenu supplémentaire est disponible" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 91cd72fbc91..11b6766d88a 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -384,16 +384,56 @@ "message": "Lonxitude mínima do contrasinal" }, "uppercase": { - "message": "Maiúsculas (A-Z)" + "message": "Maiúsculas (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minúsculas (a-z)" + "message": "Minúsculas (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Números (0-9)" + "message": "Números (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caracteres especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Número de palabras" @@ -415,7 +455,12 @@ "message": "Mínimo de caracteres especiais" }, "avoidAmbChar": { - "message": "Evitar caracteres ambiguos" + "message": "Evitar caracteres ambiguos", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Buscar na caixa forte" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "A túa nova conta foi creada! Podes iniciar sesión agora." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Iniciaches sesión correctamente" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 3df3937a1df..1ddb96bca1a 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "מספר מילים" @@ -415,7 +455,12 @@ "message": "מינימום תוים מיוחדים" }, "avoidAmbChar": { - "message": "המנע מאותיות ותוים דומים" + "message": "המנע מאותיות ותוים דומים", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "חיפוש בכספת" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "החשבון שלך נוצר בהצלחה! כעת ניתן להכנס למערכת." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "תודה על תמיכתך בBitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "הכל רק ב$PRICE$ לשנה!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 109b3c8b06e..9cac9ac7718 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -384,16 +384,56 @@ "message": "न्यूनतम पासवर्ड लंबाई" }, "uppercase": { - "message": "बड़े अक्षर (A-Z)" + "message": "बड़े अक्षर (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "छोटे अक्षर (a-z)" + "message": "छोटे अक्षर (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "संख्या (0-9)" + "message": "संख्या (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "विशेष अक्षर (!@#$%^&*)" + "message": "विशेष अक्षर (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of Words" @@ -415,7 +455,12 @@ "message": "Minimum Special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid Ambiguous Characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "वॉल्ट खोजे" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "आपका नया खाता बनाया गया है! अब आप लॉग इन कर सकते हैं।" }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "इस सेटिंग पर एंटरप्राइज़ नीति आवश्यकताएँ लागू की गई हैं" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 0d931cb5108..058de5f1ceb 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -384,16 +384,56 @@ "message": "Minimalna duljina lozinke" }, "uppercase": { - "message": "Velika slova (A - Z)" + "message": "Velika slova (A - Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Mala slova (a - z)" + "message": "Mala slova (a - z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Brojevi (0 - 9)" + "message": "Brojevi (0 - 9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Posebni znakovi (!@#$%^&*)" + "message": "Posebni znakovi (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Broj riječi" @@ -415,7 +455,12 @@ "message": "Najmanje posebnih" }, "avoidAmbChar": { - "message": "Izbjegavaj dvosmislene znakove" + "message": "Izbjegavaj dvosmislene znakove", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Pretraži trezor" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Tvoj novi račun je stvoren! Sada se možeš prijaviti." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Prijava uspješna" }, @@ -1080,7 +1131,7 @@ "message": "1 GB šifriranog prostora za pohranu podataka." }, "premiumSignUpEmergency": { - "message": "Emergency access." + "message": "Pristup u nuždi." }, "premiumSignUpTwoStepOptions": { "message": "Mogućnosti za prijavu u dva koraka kao što su YubiKey i Duo." @@ -1104,7 +1155,7 @@ "message": "Možeš kupiti premium članstvo na web trezoru. Želiš li sada posjetiti bitwarden.com?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Premium možeš kupiti u postavkama računa na Bitwarden web aplikaciji." }, "premiumCurrentMember": { "message": "Ti si premium član!" @@ -1113,7 +1164,7 @@ "message": "Hvala ti što podupireš Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Nadogradi na Premium za:" }, "premiumPrice": { "message": "Sve za samo $PRICE$ /godišnje!", @@ -1125,7 +1176,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "Sve samo za $PRICE$ /godišnje!", "placeholders": { "price": { "content": "$1", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Otključaj ovog korisnika u desktop aplikaciji i pokušaj ponovno." }, + "biometricsNotAvailableTitle": { + "message": "Biometrijsko otključavanje nije dostupno" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrijsko otključavanje trenutno nije dostupno. Pokušaj ponovno kasnije." + }, "biometricsFailedTitle": { "message": "Biometrija neuspješna" }, @@ -2314,11 +2371,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Send je uspješno stvoren!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Send će biti dostupan svakome s poveznicom ovoliko dana: $DAYS$.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2328,7 +2385,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Kopirana poveznica Senda", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3639,10 +3696,18 @@ "message": "Vjerodajnice uspješno spremljene!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Lozinka pohranjena!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Vjerodajnice uspješno ažurirane!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Lozinka ažurirana!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Greška pri spremanju vjerodajnica. Za detalje pogledaj konzolu.", "description": "Notification message for when saving credentials has failed." @@ -3970,10 +4035,10 @@ "message": "Auto-ispuna kod učitavanja?" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Istekla kartica" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Ako je obnovljeno, ažuriraj podatke o kartici" }, "cardDetails": { "message": "Detalji kartice" @@ -3988,7 +4053,7 @@ } }, "enableAnimations": { - "message": "Enable animations" + "message": "Omogući animacije" }, "addAccount": { "message": "Dodaj račun" @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Pravila tvrtke primijenjena su na ovu postavku" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index dfcfe51ab29..e7081341afd 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -384,16 +384,56 @@ "message": "Minimum jelszó hosszúság" }, "uppercase": { - "message": "Nagybetűs (A-Z)" + "message": "Nagybetűs (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Kisbetűs (a-z)" + "message": "Kisbetűs (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Számok (0-9)" + "message": "Számok (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Speciális karakterek (!@#$%^&*)" + "message": "Speciális karakterek (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Bevonás", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Nagybetűs karakterek bevonása", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Kisbetűs karakterek bevonása", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Számok bevonása", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Speciális karakterek bevonása", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Szavak száma" @@ -415,7 +455,12 @@ "message": "Minimális speciális" }, "avoidAmbChar": { - "message": "Félreérthető karakterek mellőzése" + "message": "Félreérthető karakterek mellőzése", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Félreérthető karakterek mellőzése", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Keresés a széfben" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Felhasználódat létrehoztuk. Most már be tudsz jelentkezni." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "A bejelentkezés sikeres volt." }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Oldjuk fel a felhasználó zárolását az asztali alkalmazásban és próbáljuk újra." }, + "biometricsNotAvailableTitle": { + "message": "A biometrikus feloldás nem érhető el." + }, + "biometricsNotAvailableDesc": { + "message": "A biometrikus feloldás jelenleg nem érhető el. Próbáljuk újra később." + }, "biometricsFailedTitle": { "message": "A biometria nem sikerült." }, @@ -3639,10 +3696,18 @@ "message": "A hitelesítések sikeresen mentésre kerültek.", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "A jelszó mentésre került!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "A hitelesítések sikeresen frissítésre kerültek.", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "A jelszó frissítésre került!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Hiba történt a hitelesítések mentésekor. A részletekért ellenőrizzük a konzolt.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Erre a beállításra a vállalkozás rendszabály követelmények lettek alkalmazva." + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 75dcf04a58a..76d21515f02 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -384,16 +384,56 @@ "message": "Panjang kata sandi minimum" }, "uppercase": { - "message": "Huruf besar (A-Z)" + "message": "Huruf besar (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Huruf kecil (a-z)" + "message": "Huruf kecil (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Angka (0-9)" + "message": "Angka (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "karakter khusus (contoh.! @#$%^&*)" + "message": "karakter khusus (contoh.! @#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Jumlah Kata" @@ -415,7 +455,12 @@ "message": "Spesial Minimum" }, "avoidAmbChar": { - "message": "Hindari Karakter Ambigu" + "message": "Hindari Karakter Ambigu", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Cari brankas" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Akun baru Anda telah dibuat! Sekarang Anda bisa masuk." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Anda berhasil masuk" }, @@ -1113,7 +1164,7 @@ "message": "Terima kasih telah mendukung Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Semua itu hanya $PRICE$ /tahun!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 59c4091c1a0..468593e7d85 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -384,16 +384,56 @@ "message": "Lunghezza minima della password" }, "uppercase": { - "message": "Maiuscole (A-Z)" + "message": "Maiuscole (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minuscole (a-z)" + "message": "Minuscole (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numeri (0-9)" + "message": "Numeri (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caratteri speciali (!@#$%^&*)" + "message": "Caratteri speciali (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Numero di parole" @@ -415,7 +455,12 @@ "message": "Minimo caratteri speciali" }, "avoidAmbChar": { - "message": "Evita caratteri ambigui" + "message": "Evita caratteri ambigui", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Cerca nella cassaforte" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Il tuo nuovo account è stato creato! Ora puoi eseguire l'accesso." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Hai effettuato l'accesso" }, @@ -1113,7 +1164,7 @@ "message": "Grazie per il tuo supporto a Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Il tutto per soli $PRICE$ all'anno!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Sblocca questo utente nell'applicazione desktop e riprova." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Autenticazione biometrica fallita" }, @@ -3639,10 +3696,18 @@ "message": "Credenziali salvate!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credenziali aggiornate!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Errore durante il salvataggio delle credenziali. Controlla la console per più dettagli.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 8c729136d90..9a90c2e40bd 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -384,16 +384,56 @@ "message": "パスワードの最低文字数" }, "uppercase": { - "message": "大文字(A-Z)" + "message": "大文字(A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "小文字(a-z)" + "message": "小文字(a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "数字 (0~9)" + "message": "数字 (0~9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "特殊文字(!@#$%^&*)" + "message": "特殊文字(!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "含む文字", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "大文字を含める", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A~Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "小文字を含める", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "数字を含める", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0~9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "特殊記号を含める", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "単語数" @@ -415,7 +455,12 @@ "message": "記号の最小数" }, "avoidAmbChar": { - "message": "あいまいな文字を省く" + "message": "あいまいな文字を省く", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "あいまいな文字を避ける", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "保管庫を検索" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "新しいアカウントを作成しました!今すぐログインできます。" }, + "newAccountCreated2": { + "message": "新しいアカウントを作成しました!" + }, + "youHaveBeenLoggedIn": { + "message": "ログインしました!" + }, "youSuccessfullyLoggedIn": { "message": "ログインに成功しました" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "デスクトップアプリでこのユーザーのロックを解除して、もう一度やり直してください。" }, + "biometricsNotAvailableTitle": { + "message": "生体認証ロック解除が利用できません" + }, + "biometricsNotAvailableDesc": { + "message": "生体認証ロック解除は現在利用できません。しばらくしてからもう一度お試しください。" + }, "biometricsFailedTitle": { "message": "生体認証に失敗しました" }, @@ -3639,10 +3696,18 @@ "message": "認証情報を保存しました!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "パスワードを保存しました!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "認証情報を更新しました!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "パスワードを更新しました!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "資格情報の保存中にエラーが発生しました。詳細はコンソールを確認してください。", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "エンタープライズポリシー要件がこの設定に適用されました" + }, + "additionalContentAvailable": { + "message": "追加コンテンツが利用可能です" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 109ceb35eab..55f3a6d7037 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "სიტყვათა რაოდენობა" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index a580b3372a3..9a27ce485bd 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 99de6153875..490a36e4040 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "ಪದಗಳ ಸಂಖ್ಯೆ" @@ -415,7 +455,12 @@ "message": "ಕನಿಷ್ಠ ವಿಶೇಷ" }, "avoidAmbChar": { - "message": "ಅಸ್ಪಷ್ಟ ಅಕ್ಷರಗಳನ್ನು ತಪ್ಪಿಸಿ" + "message": "ಅಸ್ಪಷ್ಟ ಅಕ್ಷರಗಳನ್ನು ತಪ್ಪಿಸಿ", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "ವಾಲ್ಟ್ ಹುಡುಕಿ" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "ನಿಮ್ಮ ಹೊಸ ಖಾತೆಯನ್ನು ರಚಿಸಲಾಗಿದೆ! ನೀವು ಈಗ ಲಾಗ್ ಇನ್ ಮಾಡಬಹುದು." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "ಬಿಟ್ವಾರ್ಡೆನ್ ಅವರನ್ನು ಬೆಂಬಲಿಸಿದ್ದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "ಎಲ್ಲವೂ ಕೇವಲ $PRICE$ / ವರ್ಷಕ್ಕೆ!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 6d01dc6ea94..817b9de47e0 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -384,16 +384,56 @@ "message": "최소 비밀번호 길이" }, "uppercase": { - "message": "대문자 (A-Z)" + "message": "대문자 (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "소문자 (a-z)" + "message": "소문자 (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "숫자 (0-9)" + "message": "숫자 (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "특수 문자 (!@#$%^&*)" + "message": "특수 문자 (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "단어 수" @@ -415,7 +455,12 @@ "message": "특수 문자 최소 개수" }, "avoidAmbChar": { - "message": "모호한 문자 사용 안 함" + "message": "모호한 문자 사용 안 함", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "보관함 검색" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "계정 생성이 완료되었습니다! 이제 로그인하실 수 있습니다." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "로그인에 성공했습니다." }, @@ -1113,7 +1164,7 @@ "message": "Bitwarden을 지원해 주셔서 감사합니다." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "이 모든 기능을 연 $PRICE$에 이용하실 수 있습니다!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index a894feb5eb0..96360fc0221 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -384,16 +384,56 @@ "message": "Minimalus slaptažodžio ilgis" }, "uppercase": { - "message": "Didžiosiomis (A-Z)" + "message": "Didžiosiomis (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Mažosiomis (a-z)" + "message": "Mažosiomis (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Skaitmenys (0-9)" + "message": "Skaitmenys (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Specialieji simboliai (!@#$%^&*)" + "message": "Specialieji simboliai (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Žodžių skaičius" @@ -415,7 +455,12 @@ "message": "Mažiausiai simbolių" }, "avoidAmbChar": { - "message": "Vengti dviprasmiškų simbolių" + "message": "Vengti dviprasmiškų simbolių", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Ieškoti saugykloje" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Jūsų paskyra sukurta! Galite prisijungti." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Jūs sėkmingai prisijungėte" }, @@ -1113,7 +1164,7 @@ "message": "Dėkojame, kad palaikote „Bitwarden“." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Visa tai tik už $PRICE$ / metus!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Atrakinkite šį naudotoją darbalaukio programoje ir bandykite dar kartą." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrika nepavyko" }, @@ -3639,10 +3696,18 @@ "message": "Kredencialai išsaugoti sėkmingai.", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Kredencialai atnaujinti sėkmingai.", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Klaida išsaugant kredencialus. Išsamesnės informacijos patikrink konsolėje.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index dc7100f3fda..f906faec6d8 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -384,16 +384,56 @@ "message": "Mazākais pieļaujamais paroles garums" }, "uppercase": { - "message": "Lielie burti (A-Z)" + "message": "Lielie burti (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Mazie burti (a-z)" + "message": "Mazie burti (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Cipari (0-9)" + "message": "Cipari (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Īpašās rakstzīmes (!@#$%^&*)" + "message": "Īpašās rakstzīmes (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Iekļaut", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Iekļaut lielos burtus", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Iekļaut mazos burtus", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Iekļaut ciparus", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Iekļaut īpašās rakstzīmes", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Vārdu skaits" @@ -415,7 +455,12 @@ "message": "Mazākais pieļaujamais īpašo rakstzīmju skaits" }, "avoidAmbChar": { - "message": "Izvairīties no viegli sajaucamām rakstzīmēm" + "message": "Izvairīties no viegli sajaucamām rakstzīmēm", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Izvairīties no viegli sajaucamām rakstzīmēm", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Meklēt glabātavā" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Jaunais konts ir izveidots. Tagad vari pieteikties." }, + "newAccountCreated2": { + "message": "Jaunais konts tika izveidots." + }, + "youHaveBeenLoggedIn": { + "message": "Tu esi pieteicies." + }, "youSuccessfullyLoggedIn": { "message": "Pieteikšanās bija veiksmīga" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Lūgums atslēgt šo lietotāju darbvirsmas lietotnē un mēģināt vēlreiz." }, + "biometricsNotAvailableTitle": { + "message": "Atslēgšana ar biometriju nav pieejama" + }, + "biometricsNotAvailableDesc": { + "message": "Atslēgšana ar biometriju pašlaik nav pieejama. Lūgums vēlāk mēģināt vēlreiz." + }, "biometricsFailedTitle": { "message": "Biometrija neizdevās" }, @@ -3639,10 +3696,18 @@ "message": "Piekļuves informācija veiksmīgi saglabāta.", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Parole saglabāta.", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Piekļuves informācija veiksmīgi atjaunināta.", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Parole atjaunināta.", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Kļūda piekļuves informācijas saglabāšanā. Jāpārbauda, vai konsolē ir izvērstāka informācija.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Šim iestatījumam tika piemērotas uzņēmējdarbības nosacījumu prasības" + }, + "additionalContentAvailable": { + "message": "Ir pieejams papildu saturs" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 80f13845ad8..c56d2facb06 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "വാക്കുകളുടെ എണ്ണം" @@ -415,7 +455,12 @@ "message": "കുറഞ്ഞ പ്രത്യേക പ്രതീകങ്ങൾ" }, "avoidAmbChar": { - "message": "അവ്യക്തമായ പ്രതീകങ്ങൾ ഒഴിവാക്കുക" + "message": "അവ്യക്തമായ പ്രതീകങ്ങൾ ഒഴിവാക്കുക", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "വാൾട് തിരയുക" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "തങ്ങളുടെ അക്കൗണ്ട് സൃഷ്ടിക്കപ്പെട്ടു! ഇനി താങ്കൾക്ക് ലോഗിൻ ചെയ്യാം." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Bitwardenനെ പിന്തുണച്ചതിന് നന്ദി." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "എല്ലാം വെറും $PRICE$/ വർഷത്തേക്ക്!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 7d1a3b668c1..ec21a82c447 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "तिजोरीत शोधा" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index a580b3372a3..9a27ce485bd 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index b76b824d2b0..87e47c5bd5e 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -384,16 +384,56 @@ "message": "Minimum passordlengde" }, "uppercase": { - "message": "Store bokstaver (A–Å)" + "message": "Store bokstaver (A–Å)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Små bokstaver (a-z)" + "message": "Små bokstaver (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Tall (0-9)" + "message": "Tall (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Spesialtegn (!@#$%^&*)" + "message": "Spesialtegn (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Antall ord" @@ -415,7 +455,12 @@ "message": "Minste antall spesialtegn" }, "avoidAmbChar": { - "message": "Unngå tvetydige tegn" + "message": "Unngå tvetydige tegn", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Søk i hvelvet" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Din nye konto har blitt opprettet! Du kan nå logge på." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Takk for at du støtter Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Og alt det for %price%/år!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometri mislyktes" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index a580b3372a3..9a27ce485bd 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 39683ed7697..7d5c9cf9dae 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -384,16 +384,56 @@ "message": "Minimale wachtwoordlengte" }, "uppercase": { - "message": "Hoofdletters (A-Z)" + "message": "Hoofdletters (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Kleine letters (a-z)" + "message": "Kleine letters (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Cijfers (0-9)" + "message": "Cijfers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Speciale tekens (!@#$%^&*)" + "message": "Speciale tekens (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Toevoegen", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Hoofdletters toevoegen", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Kleine letters toevoegen", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Nummers toevoegen", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Speciale tekens toevoegen", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Aantal woorden" @@ -415,7 +455,12 @@ "message": "Minimum aantal speciale tekens" }, "avoidAmbChar": { - "message": "Dubbelzinnige tekens vermijden" + "message": "Dubbelzinnige tekens vermijden", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Dubbelzinnige tekens vermijden", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Kluis doorzoeken" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Je nieuwe account is aangemaakt! Je kunt nu inloggen." }, + "newAccountCreated2": { + "message": "Je nieuwe account is aangemaakt!" + }, + "youHaveBeenLoggedIn": { + "message": "Je bent ingelogd!" + }, "youSuccessfullyLoggedIn": { "message": "U bent succesvol ingelogd" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometrisch ontgrendelen niet beschikbaar" + }, + "biometricsNotAvailableDesc": { + "message": "Biometrische ontgrendeling is momenteel niet beschikbaar. Probeer het later opnieuw." + }, "biometricsFailedTitle": { "message": "Biometrie mislukt" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Wachtwoord opgeslagen!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Wachtwoord bijgewerkt!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Bedrijfsbeleidseisen zijn op deze instelling toegepast" + }, + "additionalContentAvailable": { + "message": "Extra inhoud beschikbaar" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index a580b3372a3..9a27ce485bd 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index a580b3372a3..9a27ce485bd 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index d1d77df71ad..77dfe0d16ad 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -384,16 +384,56 @@ "message": "Minimalna długość hasła" }, "uppercase": { - "message": "Wielkie litery (A-Z)" + "message": "Wielkie litery (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Małe litery (a-z)" + "message": "Małe litery (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Cyfry (0-9)" + "message": "Cyfry (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Znaki specjalne (!@#$%^&*)" + "message": "Znaki specjalne (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Liczba słów" @@ -415,7 +455,12 @@ "message": "Minimalna liczba znaków specjalnych" }, "avoidAmbChar": { - "message": "Unikaj niejednoznacznych znaków" + "message": "Unikaj niejednoznacznych znaków", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Szukaj w sejfie" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Konto zostało utworzone! Teraz możesz się zalogować." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Zalogowałeś się pomyślnie" }, @@ -1113,7 +1164,7 @@ "message": "Dziękujemy za wspieranie Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Wszystko to jedynie za $PRICE$ /rok!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Odblokuj tego użytkownika w aplikacji desktopowej i spróbuj ponownie." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Dane biometryczne są błędne" }, @@ -3639,10 +3696,18 @@ "message": "Pomyślnie zapisano dane logowania!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Pomyślnie zaktualizowano dane logowania!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Błąd podczas zapisywania danych logowania. Sprawdź konsolę, aby uzyskać szczegóły.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index f15f3eb922f..98cf71b21b8 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -302,22 +302,22 @@ "message": "Editar Pasta" }, "newFolder": { - "message": "New folder" + "message": "Nova pasta" }, "folderName": { - "message": "Folder name" + "message": "Nome da pasta" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Aninhe uma pasta adicionando o nome da pasta pai seguido de um \"/\". Exemplo: Social/Fóruns" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Nenhuma pasta adicionada" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Crie pastas para organizar os itens do seu cofre" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Você tem certeza que deseja excluir esta pasta permanentemente?" }, "deleteFolder": { "message": "Excluir Pasta" @@ -384,16 +384,56 @@ "message": "Tamanho mínimo da senha" }, "uppercase": { - "message": "Maiúsculas (A-Z)" + "message": "Maiúsculas (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minúsculas (a-z)" + "message": "Minúsculas (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Números (0-9)" + "message": "Números (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caracteres especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Número de Palavras" @@ -415,7 +455,12 @@ "message": "Especiais Mínimos" }, "avoidAmbChar": { - "message": "Evitar Caracteres Ambíguos" + "message": "Evitar Caracteres Ambíguos", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Pesquisar no Cofre" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "A sua nova conta foi criada! Agora você pode iniciar a sessão." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Você logou na sua conta com sucesso" }, @@ -688,7 +739,7 @@ "message": "O Bitwarden pode armazenar e preencher códigos de verificação de duas etapas. Selecione o ícone de câmera para tirar uma captura da tela do código QR de autenticador deste site, ou copie e cole a chave neste campo." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "Saiba mais sobre os autenticadores" }, "copyTOTP": { "message": "Copiar chave de Autenticação (TOTP)" @@ -1080,7 +1131,7 @@ "message": "1 GB de armazenamento de arquivos encriptados." }, "premiumSignUpEmergency": { - "message": "Emergency access." + "message": "Acesso de emergência." }, "premiumSignUpTwoStepOptions": { "message": "Opções de login em duas etapas como YubiKey e Duo." @@ -1104,7 +1155,7 @@ "message": "Você pode comprar a assinatura premium no cofre web em bitwarden.com. Você deseja visitar o site agora?" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Você pode comprar Premium nas configurações de sua conta no aplicativo web do Bitwarden." }, "premiumCurrentMember": { "message": "Você é um membro premium!" @@ -1113,7 +1164,7 @@ "message": "Obrigado por apoiar o Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Atualize para a versão Premium e receba:" }, "premiumPrice": { "message": "Tudo por apenas %price% /ano!", @@ -1125,7 +1176,7 @@ } }, "premiumPriceV2": { - "message": "All for just $PRICE$ per year!", + "message": "Tudo por apenas $PRICE$ por ano!", "placeholders": { "price": { "content": "$1", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Por favor, desbloqueie esse usuário no aplicativo da área de trabalho e tente novamente." }, + "biometricsNotAvailableTitle": { + "message": "Desbloqueio biométrico indisponível" + }, + "biometricsNotAvailableDesc": { + "message": "O desbloqueio biométrico está indisponível no momento. Tente novamente mais tarde." + }, "biometricsFailedTitle": { "message": "Biometria falhou" }, @@ -2314,11 +2371,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Envio criado com sucesso!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendAvailability": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "O envio estará disponível para qualquer pessoa com o link para os próximos $DAYS$ dias.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2328,7 +2385,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Enviar link copiado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -3639,10 +3696,18 @@ "message": "Credenciais salvas com sucesso!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credenciais atualizadas com sucesso!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Erro ao salvar credenciais. Verifique o console para detalhes.", "description": "Notification message for when saving credentials has failed." @@ -3920,7 +3985,7 @@ "message": "Site (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Site (URI) $COUNT$", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -3970,10 +4035,10 @@ "message": "Preenchimento automático ao carregar a página?" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Cartão expirado" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Se você o renovou, atualize as informações do cartão" }, "cardDetails": { "message": "Detalhes do cartão" @@ -3988,7 +4053,7 @@ } }, "enableAnimations": { - "message": "Enable animations" + "message": "Habilita animações" }, "addAccount": { "message": "Adicionar conta" @@ -4221,12 +4286,15 @@ "message": "Ações da conta" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Mostrar o número de sugestões de preenchimento automático de login no ícone da extensão" }, "systemDefault": { - "message": "System default" + "message": "Padrão do sistema" }, "enterprisePolicyRequirementsApplied": { - "message": "Enterprise policy requirements have been applied to this setting" + "message": "Os requisitos de política empresarial foram aplicados nesta configuração" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 75c0d12f9ec..d3e513ee568 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -384,16 +384,56 @@ "message": "Comprimento mínimo da palavra-passe" }, "uppercase": { - "message": "Maiúsculas (A-Z)" + "message": "Maiúsculas (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Minúsculas (a-z)" + "message": "Minúsculas (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Números (0-9)" + "message": "Números (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caracteres especiais (!@#$%^&*)" + "message": "Caracteres especiais (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Incluir", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Incluir caracteres em maiúsculas", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Incluir caracteres em minúsculas", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Incluir números", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Incluir caracteres especiais", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Número de palavras" @@ -415,7 +455,12 @@ "message": "Mínimo de caracteres especiais" }, "avoidAmbChar": { - "message": "Evitar caracteres ambíguos" + "message": "Evitar caracteres ambíguos", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Evitar caracteres ambíguos", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Procurar no cofre" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "A sua nova conta foi criada! Pode agora iniciar sessão." }, + "newAccountCreated2": { + "message": "A sua nova conta foi criada!" + }, + "youHaveBeenLoggedIn": { + "message": "Iniciou sessão!" + }, "youSuccessfullyLoggedIn": { "message": "Iniciou sessão com sucesso" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Por favor, desbloqueie este utilizador na aplicação para computador e tente novamente." }, + "biometricsNotAvailableTitle": { + "message": "Desbloqueio biométrico indisponível" + }, + "biometricsNotAvailableDesc": { + "message": "O desbloqueio biométrico não está atualmente disponível. Por favor, tente novamente mais tarde." + }, "biometricsFailedTitle": { "message": "Falha na biometria" }, @@ -3639,10 +3696,18 @@ "message": "Credenciais guardadas com sucesso!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Palavra-passe guardada!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credenciais atualizadas com sucesso!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Palavra passe atualizada!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Erro ao guardar as credenciais. Verifique a consola para obter detalhes.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Os requisitos da política empresarial foram aplicados a esta definição" + }, + "additionalContentAvailable": { + "message": "Estão disponíveis conteúdos adicionais" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 90dbfd33d2d..bec803128ee 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -384,16 +384,56 @@ "message": "Lungimea minimă a parolei" }, "uppercase": { - "message": "Litere mari (A-Z)" + "message": "Litere mari (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Litere mici (a-z)" + "message": "Litere mici (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numere (0-9)" + "message": "Numere (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Caractere speciale (!@#$%^&*)" + "message": "Caractere speciale (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Număr de cuvinte" @@ -415,7 +455,12 @@ "message": "Minim de caractere speciale" }, "avoidAmbChar": { - "message": "Se evită caracterele ambigue" + "message": "Se evită caracterele ambigue", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Căutare în seif" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Noul dvs. cont a fost creat! Acum vă puteți autentifica." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "V-ați conectat cu succes" }, @@ -1113,7 +1164,7 @@ "message": "Vă mulțumim pentru susținerea Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Totul pentru doar %price% /an!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrica a eșuat" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 5002161e96b..c455359458c 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -384,16 +384,56 @@ "message": "Минимальная длина пароля" }, "uppercase": { - "message": "Прописные буквы (A-Z)" + "message": "Прописные буквы (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Строчные буквы (a-z)" + "message": "Строчные буквы (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Цифры (0-9)" + "message": "Цифры (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Специальные символы (!@#$%^&*)" + "message": "Специальные символы (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Включить", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Включить заглавные символы", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Включить строчные символы", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Включить цифры", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Включить специальные символы", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Количество слов" @@ -415,7 +455,12 @@ "message": "Минимум символов" }, "avoidAmbChar": { - "message": "Избегать неоднозначных символов" + "message": "Избегать неоднозначных символов", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Избегать неоднозначных символов", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Поиск в хранилище" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Ваш аккаунт создан! Теперь вы можете войти в систему." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Вы успешно авторизовались" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Пожалуйста, разблокируйте этого пользователя в приложении для компьютера и повторите попытку." }, + "biometricsNotAvailableTitle": { + "message": "Разблокировка биометрией недоступна" + }, + "biometricsNotAvailableDesc": { + "message": "Разблокировка биометрией в настоящее время недоступна. Пожалуйста, повторите попытку позже." + }, "biometricsFailedTitle": { "message": "Сбой биометрии" }, @@ -3639,10 +3696,18 @@ "message": "Учетные данные успешно сохранены!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Пароль сохранен!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Учетные данные успешно обновлены!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Пароль обновлен!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Ошибка сохранения учетных данных. Проверьте консоль для получения подробной информации.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "К этой настройке были применены требования корпоративной политики" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index edffa756719..7962499853b 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "වචන ගණන" @@ -415,7 +455,12 @@ "message": "අවම විශේෂ" }, "avoidAmbChar": { - "message": "අපැහැදිලි චරිත වලින් වළකින්න" + "message": "අපැහැදිලි චරිත වලින් වළකින්න", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "සුරක්ෂිතාගාරය සොයන්න" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "ඔබගේ නව ගිණුම නිර්මාණය කර ඇත! ඔබට දැන් ලොග් විය හැකිය." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "බිට්වර්ඩන්ට සහාය වීම ගැන ස්තූතියි." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "සියල්ල $PRICE$ /අවුරුද්ද සඳහා!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 03d1eaf38a6..b7eb9b75115 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -147,7 +147,7 @@ "message": "Kopírovať názov vlastného poľa" }, "noMatchingLogins": { - "message": "Žiadne zodpovedajúce prihlasovacie údaje." + "message": "Žiadne zodpovedajúce prihlasovacie údaje" }, "noCards": { "message": "Žiadne karty" @@ -171,7 +171,7 @@ "message": "Prihláste sa do trezora" }, "autoFillInfo": { - "message": "Nie sú prístupné žiadne prihlasovacie údaje na automatické vyplnenie pre aktuálnu kartu." + "message": "Nie sú k dispozícii žiadne prihlasovacie údaje na automatické vyplnenie pre aktuálnu kartu." }, "addLogin": { "message": "Pridať prihlasovacie údaje" @@ -180,13 +180,13 @@ "message": "Pridať položku" }, "passwordHint": { - "message": "Nápoveda k heslu" + "message": "Pomôcka pre heslo" }, "enterEmailToGetHint": { "message": "Zadajte emailovú adresu na zaslanie nápovedy pre vaše hlavné heslo." }, "getMasterPasswordHint": { - "message": "Získať nápovedu k hlavnému heslu" + "message": "Získať pomôcku pre hlavné heslo" }, "continue": { "message": "Pokračovať" @@ -296,7 +296,7 @@ "message": "Pridať priečinok" }, "name": { - "message": "Meno" + "message": "Názov" }, "editFolder": { "message": "Upraviť priečinok" @@ -384,16 +384,56 @@ "message": "Minimálna dĺžka hesla" }, "uppercase": { - "message": "Veľké písmená (A-Z)" + "message": "Veľké písmená (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Malé písmená (a-z)" + "message": "Malé písmená (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Čísla (0-9)" + "message": "Čísla (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Špeciálne znaky (!@#$%^&*)" + "message": "Špeciálne znaky (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Zahrnúť", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Zahrnúť veľké písmená", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Zahrnúť malé písmená", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Zahrnúť čísla", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Zahrnúť špeciálne znaky", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Počet slov" @@ -412,10 +452,15 @@ "message": "Minimum číslic" }, "minSpecial": { - "message": "Minimum špec. znakov" + "message": "Minimum špeciálnych znakov" }, "avoidAmbChar": { - "message": "Vyhnúť sa zameniteľným znakom" + "message": "Vyhnúť sa zameniteľným znakom", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Vyhnúť sa zameniteľným znakom", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Prehľadávať trezor" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Váš nový účet bol vytvorený! Teraz sa môžete prihlásiť." }, + "newAccountCreated2": { + "message": "Váš nový účet bol vytvorený!" + }, + "youHaveBeenLoggedIn": { + "message": "Boli ste prihlásený!" + }, "youSuccessfullyLoggedIn": { "message": "Úspešne ste sa prihlásili" }, @@ -751,7 +802,7 @@ "message": "Začiatočnícka príručka" }, "gettingStartedTutorialVideo": { - "message": "Sledujte našu začiatočnícku príručku, aby ste sa naučili, ako získať maximum z nášho rozšírenia prehliadača." + "message": "Pozrite našu príručku pre začiatočníkov, v ktorej sa dozviete, ako získať maximum z nášho rozšírenia pre prehliadač." }, "syncingComplete": { "message": "Synchronizácia kompletná" @@ -810,7 +861,7 @@ "message": "Prehľadávať priečinok" }, "searchCollection": { - "message": "Vyhľadať zbierku" + "message": "Hľadať v zbierke" }, "searchType": { "message": "Typ vyhľadávania" @@ -826,7 +877,7 @@ "message": "Uložiť do nastavení trezora" }, "addLoginNotificationDesc": { - "message": "Opýtať sa na pridanie prihlasovacích údajov ak ich ešte nemáte v trezore." + "message": "Opýtať sa na pridanie prihlasovacích údajov, ak ich ešte nemáte v trezore." }, "addLoginNotificationDescAlt": { "message": "Požiada o pridanie položky, ak sa v trezore nenachádza. Platí pre všetky prihlásené účty." @@ -858,7 +909,7 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Má si pre vás Bitwarden zapamätať toto heslo?" + "message": "Má si Bitwarden zapamätať toto heslo?" }, "notificationAddSave": { "message": "Uložiť" @@ -1047,7 +1098,7 @@ "message": "Súbor" }, "selectFile": { - "message": "Vybrať súbor." + "message": "Vyberte súbor" }, "maxFileSize": { "message": "Maximálna veľkosť súboru je 500 MB." @@ -1077,7 +1128,7 @@ "message": "Zaregistrujte sa pre prémiové členstvo a získajte:" }, "ppremiumSignUpStorage": { - "message": "1 GB šifrovaného úložiska." + "message": "1 GB šifrovaného úložiska na prílohy." }, "premiumSignUpEmergency": { "message": "Núdzový prístup" @@ -1101,7 +1152,7 @@ "message": "Zakúpiť Prémiový účet" }, "premiumPurchaseAlert": { - "message": "Svoje prémiové členstvo môžete zakúpiť vo webovom trezore bitwarden.com. Chcete navštíviť túto stránku teraz?" + "message": "Svoje prémiové členstvo si môžete zakúpiť vo webovom trezore bitwarden.com. Chcete navštíviť túto stránku teraz?" }, "premiumPurchaseAlertV2": { "message": "Prémiové členstvo si môžete zakúpiť v nastaveniach svojho účtu vo webovej aplikácii Bitwarden." @@ -1197,7 +1248,7 @@ "message": "Overiť cez WebAuthn" }, "loginUnavailable": { - "message": "Prihlasovací údaj nedostupný" + "message": "Prihlásenie nie je dispozícii" }, "noTwoStepProviders": { "message": "Tento účet má povolené dvojstupňové prihlásenie, ale žiadny z nakonfigurovaných poskytovateľov nie je podporovaný týmto prehliadačom." @@ -1225,7 +1276,7 @@ "message": "Bezpečnostný kľúč Yubico OTP" }, "yubiKeyDesc": { - "message": "Použiť YubiKey pre prístup k vášmu účtu. Pracuje s YubiKey 4, 4 Nano, 4C a s NEO zariadeniami." + "message": "Použiť YubiKey na prístup k vášmu účtu. Pracuje s YubiKey 4, 4 Nano, 4C a s NEO zariadeniami." }, "duoDescV2": { "message": "Zadajte kód vygenerovaný aplikáciou Duo Security.", @@ -1248,7 +1299,7 @@ "message": "Zadajte kód zaslaný na váš e-mail." }, "selfHostedEnvironment": { - "message": "Sebou hosťované prostredie" + "message": "Prostredie s vlastným hostingom" }, "selfHostedEnvironmentFooter": { "message": "Zadajte základnú URL adresu lokálne hosťovanej inštalácie Bitwarden." @@ -1266,7 +1317,7 @@ "message": "Vlastné prostredie" }, "customEnvironmentFooter": { - "message": "Pre pokročilých používateľov. Môžete špecifikovať základnú URL pre každú službu nezávisle." + "message": "Pre pokročilých používateľov. Základnú adresu URL každej služby môžete určiť samostatne." }, "baseUrl": { "message": "URL servera" @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Prosím, odomknite tohto používateľa v počítačovej aplikácii a skúste to znova." }, + "biometricsNotAvailableTitle": { + "message": "Odomykanie biometrickými údajmi je nedostupné" + }, + "biometricsNotAvailableDesc": { + "message": "Odomykanie biometrickými údajmi je momentálne nedostupné. Skúste to znova neskôr." + }, "biometricsFailedTitle": { "message": "Biometria zlyhala" }, @@ -3639,10 +3696,18 @@ "message": "Prihlasovacie údaje boli úspešne uložené!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Heslo bolo uložené!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Prihlasovacie údaje boli úspešne aktualizované!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Heslo bolo aktualizované!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Chyba pri ukladaní prihlasovacích údajov. Viac informácii nájdete v konzole.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Na toto nastavenie boli uplatnené požiadavky pravidiel spoločnosti" + }, + "additionalContentAvailable": { + "message": "K dispozícii je ďalší obsah" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 4a4bb31d9b3..9db593631ff 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Velike črke (A-Z)" + "message": "Velike črke (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Male črke (a-z)" + "message": "Male črke (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Števke (0-9)" + "message": "Števke (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Posebni znaki (!@#$%^&*)" + "message": "Posebni znaki (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Število besed" @@ -415,7 +455,12 @@ "message": "Minimalno posebnih znakov" }, "avoidAmbChar": { - "message": "Izogibaj se dvoumnim znakom" + "message": "Izogibaj se dvoumnim znakom", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Išči v trezorju" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Vaš račun je ustvarjen. Lahko se prijavite." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Hvala, ker podpirate Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Vse za samo $PRICE$ /leto!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index eaf7a732e8e..66a055b0ad8 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -384,16 +384,56 @@ "message": "Минимална дужина лозинке" }, "uppercase": { - "message": "Велика слова (A-Z)" + "message": "Велика слова (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Мала слова (a-z)" + "message": "Мала слова (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Цифре (0-9)" + "message": "Цифре (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Специјална слова (!@#$%^&*)" + "message": "Специјална слова (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Укључити", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Укључити велика слова", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "А-Ш", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Укључити мала слова", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "а-ш", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Укључит ибројеве", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Укључити специјална слова", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Број речи" @@ -415,7 +455,12 @@ "message": "Минимално специјалних знакова" }, "avoidAmbChar": { - "message": "Избегавај двосмислене карактере" + "message": "Избегавај двосмислене карактере", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Избегавај двосмислене карактере", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Претражи сеф" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Ваш налог је креиран! Сада се можете пријавити." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Успешно сте се пријавили" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Откључајте овог корисника у десктоп апликацији и покушајте поново." }, + "biometricsNotAvailableTitle": { + "message": "Биометријско откључавање није доступно" + }, + "biometricsNotAvailableDesc": { + "message": "Биометријско откључавање тренутно није доступно. Покушајте поново касније." + }, "biometricsFailedTitle": { "message": "Биометрија није успела" }, @@ -3639,10 +3696,18 @@ "message": "Акредитиви су успешно сачувани!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Лозинка је сачувана!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Акредитиви су успешно ажурирани!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Лозинка је ажурирана!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Грешка при чувању акредитива. Проверите конзолу за детаље.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Захтеви политике предузећа су примењени на ово подешавање" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index f885a489b04..84160ca81b2 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -384,16 +384,56 @@ "message": "Minsta tillåtna lösenordslängd" }, "uppercase": { - "message": "Versaler (A-Ö)" + "message": "Versaler (A-Ö)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Gemener (a-ö)" + "message": "Gemener (a-ö)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Siffror (0-9)" + "message": "Siffror (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Specialtecken (!@#$%^&*)" + "message": "Specialtecken (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Antal ord" @@ -415,7 +455,12 @@ "message": "Minsta antal speciella tecken" }, "avoidAmbChar": { - "message": "Undvik tvetydiga tecken" + "message": "Undvik tvetydiga tecken", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Sök i valvet" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Ditt nya konto har skapats! Du kan logga in nu." }, + "newAccountCreated2": { + "message": "Ditt nya konto har skapats!" + }, + "youHaveBeenLoggedIn": { + "message": "Du har blivit inloggad!" + }, "youSuccessfullyLoggedIn": { "message": "Du är nu inloggad" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Lås upp den här användaren i skrivbordsprogrammet och försök igen." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometri misslyckades" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index a580b3372a3..9a27ce485bd 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Uppercase (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Lowercase (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Numbers (0-9)" + "message": "Numbers (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Special characters (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of words" @@ -415,7 +455,12 @@ "message": "Minimum special" }, "avoidAmbChar": { - "message": "Avoid ambiguous characters" + "message": "Avoid ambiguous characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Search vault" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Your new account has been created! You may now log in." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 490aa27d739..abbcbc7f001 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -384,16 +384,56 @@ "message": "Minimum password length" }, "uppercase": { - "message": "ตัวพิมพ์ใหญ่ (A-Z)" + "message": "ตัวพิมพ์ใหญ่ (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "ตัวพิมพ์เล็ก (a-z)" + "message": "ตัวพิมพ์เล็ก (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "ตัวเลข (0-9)" + "message": "ตัวเลข (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "อักขระพิเศษ (!@#$%^&*)" + "message": "อักขระพิเศษ (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Number of Words" @@ -415,7 +455,12 @@ "message": "Minimum Special" }, "avoidAmbChar": { - "message": "Avoid Ambiguous Characters" + "message": "Avoid Ambiguous Characters", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "ค้นหาในตู้นิรภัย" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "บัญชีใหม่ของคุณถูกสร้างขึ้นแล้ว! ตอนนี้คุณสามารถเข้าสู่ระบบ" }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, @@ -1113,7 +1164,7 @@ "message": "Thank you for supporting bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "All for just $PRICE$ /year!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Biometrics failed" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index 9ecaf18c282..eb80d1c1828 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -384,16 +384,56 @@ "message": "Minimum parola uzunluğu" }, "uppercase": { - "message": "Büyük harf (A-Z)" + "message": "Büyük harf (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Küçük harf (a-z)" + "message": "Küçük harf (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Rakamlar (0-9)" + "message": "Rakamlar (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Özel karakterler (!@#$%^&*)" + "message": "Özel karakterler (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Dahil et", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Büyük harfleri dahil et", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Küçük harfleri dahil et", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Rakamları dahil et", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Özel karakterleri dahil et", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Kelime sayısı" @@ -415,7 +455,12 @@ "message": "En az özel karakter" }, "avoidAmbChar": { - "message": "Okurken karışabilecek karakterleri kullanma" + "message": "Okurken karışabilecek karakterleri kullanma", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Okurken karışabilecek karakterleri kullanma", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Kasada ara" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Yeni hesabınız oluşturuldu! Şimdi giriş yapabilirsiniz." }, + "newAccountCreated2": { + "message": "Yeni hesabınız oluşturuldu." + }, + "youHaveBeenLoggedIn": { + "message": "Oturum açtınız." + }, "youSuccessfullyLoggedIn": { "message": "Başarıyla giriş yaptınız" }, @@ -1113,7 +1164,7 @@ "message": "Bitwarden'ı desteklediğiniz için teşekkür ederiz." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Bunların hepsi sadece yılda $PRICE$!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Lütfen masaüstü uygulamasından bu kullanıcının kilidini açıp yeniden deneyin." }, + "biometricsNotAvailableTitle": { + "message": "Biyometrik kilit açma kullanılamıyor" + }, + "biometricsNotAvailableDesc": { + "message": "Biyometrik kilit açma şu anda kullanılamıyor. Lütfen daha sonra tekrar deneyin." + }, "biometricsFailedTitle": { "message": "Biyometri doğrulanamadı" }, @@ -3639,10 +3696,18 @@ "message": "Kimlik bilgileri başarıyla kaydedildi!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Parola kaydedildi!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Kimlik bilgileri başarıyla güncellendi!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Parola güncellendi!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Kimlik bilgileri kaydedilirken hata oluştu. Ayrıntılar için konsolu kontrol edin.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Bu ayara kurumsal ilke gereksinimleri uygulandı" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index de2f5d1853f..fd8f4b86f4f 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -384,16 +384,56 @@ "message": "Мінімальна довжина пароля" }, "uppercase": { - "message": "Верхній регістр (A-Z)" + "message": "Верхній регістр (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Нижній регістр (a-z)" + "message": "Нижній регістр (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Числа (0-9)" + "message": "Числа (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Спеціальні символи (!@#$%^&*)" + "message": "Спеціальні символи (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Включити", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Символи верхнього регістру", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Символи нижнього регістру", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Цифри", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Спеціальні символи", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Кількість слів" @@ -415,7 +455,12 @@ "message": "Мінімум спеціальних символів" }, "avoidAmbChar": { - "message": "Уникати неоднозначних символів" + "message": "Уникати неоднозначних символів", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Уникати неоднозначних символів", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Пошук" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Ваш обліковий запис створений! Тепер ви можете увійти." }, + "newAccountCreated2": { + "message": "Ваш обліковий запис створено!" + }, + "youHaveBeenLoggedIn": { + "message": "Ви увійшли!" + }, "youSuccessfullyLoggedIn": { "message": "Ви успішно увійшли в систему" }, @@ -1232,7 +1283,7 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Авторизуйтесь за допомогою Duo Security для вашої організації з використанням мобільного додатку Duo Mobile, SMS, телефонного виклику, або ключа безпеки U2F.", + "message": "Авторизуйтесь за допомогою Duo Security для вашої організації з використанням програми Duo Mobile, SMS, телефонного виклику, або ключа безпеки U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Розблокуйте цього користувача в програмі для комп'ютера і повторіть спробу." }, + "biometricsNotAvailableTitle": { + "message": "Біометричне розблокування недоступне" + }, + "biometricsNotAvailableDesc": { + "message": "Біометричне розблокування наразі недоступне. Повторіть спробу пізніше." + }, "biometricsFailedTitle": { "message": "Збій біометрії" }, @@ -3639,10 +3696,18 @@ "message": "Облікові дані успішно збережено!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Пароль збережено!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Облікові дані успішно оновлено!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Пароль оновлено!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Помилка збереження облікових даних. Перегляньте подробиці в консолі.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "До цього налаштування застосовано вимоги політики компанії" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index eb1ac1037d8..da186cbdd54 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -384,16 +384,56 @@ "message": "Độ dài mật khẩu tối thiểu" }, "uppercase": { - "message": "Chữ in hoa (A-Z)" + "message": "Chữ in hoa (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "Chữ in thường (a-z)" + "message": "Chữ in thường (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "Chữ số (0-9)" + "message": "Chữ số (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "Ký tự đặc biệt (!@#$%^&*)" + "message": "Ký tự đặc biệt (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "Số từ" @@ -415,7 +455,12 @@ "message": "Số kí tự đặc biệt tối thiểu" }, "avoidAmbChar": { - "message": "Tránh các ký tự không rõ ràng" + "message": "Tránh các ký tự không rõ ràng", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "Tìm kiếm trong kho lưu trữ" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "Tài khoản mới của bạn đã được tạo! Bạn có thể đăng nhập từ bây giờ." }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "Bạn đã đăng nhập thành công" }, @@ -1113,7 +1164,7 @@ "message": "Cảm ơn bạn vì đã hỗ trợ Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "Tất cả chỉ với $PRICE$/năm!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Vui lòng mở khóa người dùng này trong ứng dụng máy tính và thử lại." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "Sinh trắc học không thành công" }, @@ -3639,10 +3696,18 @@ "message": "Thông tin đăng nhập đã lưu thành công!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Thông tin đăng nhập đã được cập nhật thành công!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Xảy ra lỗi trong quá trình lưu thông tin đăng nhập. Kiểm tra bảng điều khiển để biết thêm chi tiết.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index c2ed27b25a4..04b2891f8ee 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -11,7 +11,7 @@ "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "登录或者创建一个账户来访问您的安全密码库。" + "message": "登录或创建一个新账户以访问您的安全密码库。" }, "inviteAccepted": { "message": "邀请已接受" @@ -384,16 +384,56 @@ "message": "最小密码长度" }, "uppercase": { - "message": "大写 (A-Z)" + "message": "大写 (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "小写 (a-z)" + "message": "小写 (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "数字 (0-9)" + "message": "数字 (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "特殊字符 (!@#$%^&*)" + "message": "特殊字符 (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "包含", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "包含大写字符", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "包含小写字符", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "包含数字", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "包含特殊字符", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "单词个数" @@ -415,7 +455,12 @@ "message": "符号最少个数" }, "avoidAmbChar": { - "message": "避免易混淆的字符" + "message": "避免易混淆的字符", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "避免易混淆的字符", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "搜索密码库" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "您的新账户已创建!您现在可以登录了。" }, + "newAccountCreated2": { + "message": "您的新账户已成功创建!" + }, + "youHaveBeenLoggedIn": { + "message": "您已登录!" + }, "youSuccessfullyLoggedIn": { "message": "您已成功登录" }, @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "请在桌面应用程序中解锁此用户,然后重试。" }, + "biometricsNotAvailableTitle": { + "message": "生物识别解锁不可用" + }, + "biometricsNotAvailableDesc": { + "message": "生物识别解锁当前不可用。请稍后再试。" + }, "biometricsFailedTitle": { "message": "生物识别失败" }, @@ -2789,7 +2846,7 @@ "message": "使用设备登录" }, "loginWithDeviceEnabledInfo": { - "message": "设备登录必须在 Bitwarden 应用程序的设置中启用。需要其他登录选项吗?" + "message": "必须在 Bitwarden App 的设置中启用设备登录。需要其他登录选项吗?" }, "fingerprintPhraseHeader": { "message": "指纹短语" @@ -3639,10 +3696,18 @@ "message": "凭据保存成功!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "密码已保存!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "凭据更新成功!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "密码已更新!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "保存凭据时出错。检查控制台以获取详细信息。", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "企业策略要求已应用于此设置" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 470fd45d2d4..f92af586c97 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -171,7 +171,7 @@ "message": "登入您的密碼庫" }, "autoFillInfo": { - "message": "沒有可以自動填入目前瀏覽器分頁的登入資料。" + "message": "沒有可以自動填入目前瀏覽器分頁的登入資訊。" }, "addLogin": { "message": "新增登入資料" @@ -384,16 +384,56 @@ "message": "最小密碼長度" }, "uppercase": { - "message": "大寫 (A-Z)" + "message": "大寫 (A-Z)", + "description": "deprecated. Use uppercaseLabel instead." }, "lowercase": { - "message": "小寫 (a-z)" + "message": "小寫 (a-z)", + "description": "deprecated. Use lowercaseLabel instead." }, "numbers": { - "message": "數字 (0-9)" + "message": "數字 (0-9)", + "description": "deprecated. Use numbersLabel instead." }, "specialCharacters": { - "message": "特殊字元 (!@#$%^&*)" + "message": "特殊字元 (!@#$%^&*)", + "description": "deprecated. Use specialCharactersLabel instead." + }, + "include": { + "message": "Include", + "description": "Card header for password generator include block" + }, + "uppercaseDescription": { + "message": "Include uppercase characters", + "description": "Tooltip for the password generator uppercase character checkbox" + }, + "uppercaseLabel": { + "message": "A-Z", + "description": "Label for the password generator uppercase character checkbox" + }, + "lowercaseDescription": { + "message": "Include lowercase characters", + "description": "Full description for the password generator lowercase character checkbox" + }, + "lowercaseLabel": { + "message": "a-z", + "description": "Label for the password generator lowercase character checkbox" + }, + "numbersDescription": { + "message": "Include numbers", + "description": "Full description for the password generator numbers checkbox" + }, + "numbersLabel": { + "message": "0-9", + "description": "Label for the password generator numbers checkbox" + }, + "specialCharactersDescription": { + "message": "Include special characters", + "description": "Full description for the password generator special characters checkbox" + }, + "specialCharactersLabel": { + "message": "!@#$%^&*", + "description": "Label for the password generator special characters checkbox" }, "numWords": { "message": "單字數量" @@ -415,7 +455,12 @@ "message": "最少符號位數" }, "avoidAmbChar": { - "message": "避免易混淆的字元" + "message": "避免易混淆的字元", + "description": "deprecated. Use avoidAmbiguous instead." + }, + "avoidAmbiguous": { + "message": "Avoid ambiguous characters", + "description": "Label for the avoid ambiguous characters checkbox." }, "searchVault": { "message": "搜尋密碼庫" @@ -499,7 +544,7 @@ "message": "設定解鎖方法來變更您的密碼庫逾時動作。" }, "unlockMethodNeeded": { - "message": "設定中設定解鎖" + "message": "在設定中設定一個解鎖方式" }, "sessionTimeoutHeader": { "message": "Session timeout" @@ -638,6 +683,12 @@ "newAccountCreated": { "message": "帳戶已建立!現在可以登入了。" }, + "newAccountCreated2": { + "message": "Your new account has been created!" + }, + "youHaveBeenLoggedIn": { + "message": "You have been logged in!" + }, "youSuccessfullyLoggedIn": { "message": "登入成功" }, @@ -667,7 +718,7 @@ } }, "autofillError": { - "message": "無法在此頁面自動填入所選項目。請手動複製貼上。" + "message": "無法在此頁面自動填入所選項目。請手動複製並貼上。" }, "totpCaptureError": { "message": "無法掃描此網頁的二維碼" @@ -1113,7 +1164,7 @@ "message": "感謝您支持 Bitwarden 。" }, "premiumFeatures": { - "message": "Upgrade to premium and receive:" + "message": "Upgrade to Premium and receive:" }, "premiumPrice": { "message": "每年只需 $PRICE$!", @@ -2083,6 +2134,12 @@ "biometricsNotUnlockedDesc": { "message": "Please unlock this user in the desktop application and try again." }, + "biometricsNotAvailableTitle": { + "message": "Biometric unlock unavailable" + }, + "biometricsNotAvailableDesc": { + "message": "Biometric unlock is currently unavailable. Please try again later." + }, "biometricsFailedTitle": { "message": "生物特徵辨識失敗" }, @@ -3639,10 +3696,18 @@ "message": "Credentials saved successfully!", "description": "Notification message for when saving credentials has succeeded." }, + "passwordSaved": { + "message": "Password saved!", + "description": "Notification message for when saving credentials has succeeded." + }, "updateCipherAttemptSuccess": { "message": "Credentials updated successfully!", "description": "Notification message for when updating credentials has succeeded." }, + "passwordUpdated": { + "message": "Password updated!", + "description": "Notification message for when updating credentials has succeeded." + }, "saveCipherAttemptFailed": { "message": "Error saving credentials. Check console for details.", "description": "Notification message for when saving credentials has failed." @@ -4228,5 +4293,8 @@ }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" + }, + "additionalContentAvailable": { + "message": "Additional content is available" } } diff --git a/apps/browser/src/auth/popup/environment.component.ts b/apps/browser/src/auth/popup/environment.component.ts index ed348e563b6..b84f03b5fd7 100644 --- a/apps/browser/src/auth/popup/environment.component.ts +++ b/apps/browser/src/auth/popup/environment.component.ts @@ -5,6 +5,7 @@ import { EnvironmentComponent as BaseEnvironmentComponent } from "@bitwarden/ang import { ModalService } from "@bitwarden/angular/services/modal.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { ToastService } from "@bitwarden/components"; import { BrowserEnvironmentService } from "../../platform/services/browser-environment.service"; @@ -21,8 +22,9 @@ export class EnvironmentComponent extends BaseEnvironmentComponent implements On i18nService: I18nService, private router: Router, modalService: ModalService, + toastService: ToastService, ) { - super(platformUtilsService, environmentService, i18nService, modalService); + super(platformUtilsService, environmentService, i18nService, modalService, toastService); this.showCustom = true; } diff --git a/apps/browser/src/auth/popup/hint.component.ts b/apps/browser/src/auth/popup/hint.component.ts index 214a43efb71..bc1f68f4c43 100644 --- a/apps/browser/src/auth/popup/hint.component.ts +++ b/apps/browser/src/auth/popup/hint.component.ts @@ -7,6 +7,7 @@ import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { ToastService } from "@bitwarden/components"; @Component({ selector: "app-hint", @@ -21,8 +22,17 @@ export class HintComponent extends BaseHintComponent { logService: LogService, private route: ActivatedRoute, loginEmailService: LoginEmailServiceAbstraction, + toastService: ToastService, ) { - super(router, i18nService, apiService, platformUtilsService, logService, loginEmailService); + super( + router, + i18nService, + apiService, + platformUtilsService, + logService, + loginEmailService, + toastService, + ); super.onSuccessfulSubmit = async () => { // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. diff --git a/apps/browser/src/auth/popup/home.component.ts b/apps/browser/src/auth/popup/home.component.ts index 43f8f3dcf4c..505931ad0f1 100644 --- a/apps/browser/src/auth/popup/home.component.ts +++ b/apps/browser/src/auth/popup/home.component.ts @@ -7,6 +7,7 @@ import { EnvironmentSelectorComponent } from "@bitwarden/angular/auth/components import { LoginEmailServiceAbstraction, RegisterRouteService } from "@bitwarden/auth/common"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { ToastService } from "@bitwarden/components"; import { AccountSwitcherService } from "./account-switching/services/account-switcher.service"; @@ -36,6 +37,7 @@ export class HomeComponent implements OnInit, OnDestroy { private loginEmailService: LoginEmailServiceAbstraction, private accountSwitcherService: AccountSwitcherService, private registerRouteService: RegisterRouteService, + private toastService: ToastService, ) {} async ngOnInit(): Promise { @@ -76,11 +78,11 @@ export class HomeComponent implements OnInit, OnDestroy { this.formGroup.markAllAsTouched(); if (this.formGroup.invalid) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorOccured"), - this.i18nService.t("invalidEmail"), - ); + this.toastService.showToast({ + variant: "error", + title: this.i18nService.t("errorOccured"), + message: this.i18nService.t("invalidEmail"), + }); return; } diff --git a/apps/browser/src/auth/popup/lock.component.html b/apps/browser/src/auth/popup/lock.component.html index 5ea839470be..ccc743d86d4 100644 --- a/apps/browser/src/auth/popup/lock.component.html +++ b/apps/browser/src/auth/popup/lock.component.html @@ -89,7 +89,7 @@

- {{ biometricError }} + {{ biometricError }}

{{ "awaitDesktop" | i18n }}

diff --git a/apps/browser/src/auth/popup/lock.component.ts b/apps/browser/src/auth/popup/lock.component.ts index 2819d6a21fe..f5413e4bea4 100644 --- a/apps/browser/src/auth/popup/lock.component.ts +++ b/apps/browser/src/auth/popup/lock.component.ts @@ -24,9 +24,10 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service"; +import { BiometricsService } from "@bitwarden/common/platform/biometrics/biometric.service"; import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; -import { DialogService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; import { BiometricErrors, BiometricErrorTypes } from "../../models/biometricErrors"; import { BrowserRouterService } from "../../platform/popup/services/browser-router.service"; @@ -67,9 +68,11 @@ export class LockComponent extends BaseLockComponent implements OnInit { pinService: PinServiceAbstraction, private routerService: BrowserRouterService, biometricStateService: BiometricStateService, + biometricsService: BiometricsService, accountService: AccountService, kdfConfigService: KdfConfigService, syncService: SyncService, + toastService: ToastService, ) { super( masterPasswordService, @@ -93,10 +96,12 @@ export class LockComponent extends BaseLockComponent implements OnInit { userVerificationService, pinService, biometricStateService, + biometricsService, accountService, authService, kdfConfigService, syncService, + toastService, ); this.successRoute = "/tabs/current"; this.isInitialLockScreen = (window as any).previousPopupUrl == null; @@ -129,22 +134,35 @@ export class LockComponent extends BaseLockComponent implements OnInit { this.isInitialLockScreen && (await this.authService.getAuthStatus()) === AuthenticationStatus.Locked ) { - await this.unlockBiometric(); + await this.unlockBiometric(true); } }, 100); } - override async unlockBiometric(): Promise { + override async unlockBiometric(automaticPrompt: boolean = false): Promise { if (!this.biometricLock) { return; } - this.pendingBiometric = true; this.biometricError = null; let success; try { - success = await super.unlockBiometric(); + const available = await super.isBiometricUnlockAvailable(); + if (!available) { + if (!automaticPrompt) { + await this.dialogService.openSimpleDialog({ + type: "warning", + title: { key: "biometricsNotAvailableTitle" }, + content: { key: "biometricsNotAvailableDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + }); + } + } else { + this.pendingBiometric = true; + success = await super.unlockBiometric(); + } } catch (e) { const error = BiometricErrors[e?.message as BiometricErrorTypes]; diff --git a/apps/browser/src/auth/popup/login-via-auth-request.component.ts b/apps/browser/src/auth/popup/login-via-auth-request.component.ts index f83062e6c97..53f29badee6 100644 --- a/apps/browser/src/auth/popup/login-via-auth-request.component.ts +++ b/apps/browser/src/auth/popup/login-via-auth-request.component.ts @@ -22,6 +22,7 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; @Component({ @@ -50,6 +51,7 @@ export class LoginViaAuthRequestComponent extends BaseLoginWithDeviceComponent { loginStrategyService: LoginStrategyServiceAbstraction, accountService: AccountService, private location: Location, + toastService: ToastService, ) { super( router, @@ -70,6 +72,7 @@ export class LoginViaAuthRequestComponent extends BaseLoginWithDeviceComponent { deviceTrustService, authRequestService, loginStrategyService, + toastService, ); super.onSuccessfulLogin = async () => { await syncService.fullSync(true); diff --git a/apps/browser/src/auth/popup/login.component.ts b/apps/browser/src/auth/popup/login.component.ts index 79a02ede85d..6e73199969a 100644 --- a/apps/browser/src/auth/popup/login.component.ts +++ b/apps/browser/src/auth/popup/login.component.ts @@ -22,6 +22,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { flagEnabled } from "../../platform/flags"; @@ -53,6 +54,7 @@ export class LoginComponent extends BaseLoginComponent { ssoLoginService: SsoLoginServiceAbstraction, webAuthnLoginService: WebAuthnLoginServiceAbstraction, registerRouteService: RegisterRouteService, + toastService: ToastService, ) { super( devicesApiService, @@ -74,6 +76,7 @@ export class LoginComponent extends BaseLoginComponent { ssoLoginService, webAuthnLoginService, registerRouteService, + toastService, ); super.onSuccessfulLogin = async () => { await syncService.fullSync(true); diff --git a/apps/browser/src/auth/popup/register.component.ts b/apps/browser/src/auth/popup/register.component.ts index 61e007ac52a..dab1e62f850 100644 --- a/apps/browser/src/auth/popup/register.component.ts +++ b/apps/browser/src/auth/popup/register.component.ts @@ -13,7 +13,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; -import { DialogService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; @Component({ @@ -39,6 +39,7 @@ export class RegisterComponent extends BaseRegisterComponent { logService: LogService, auditService: AuditService, dialogService: DialogService, + toastService: ToastService, ) { super( formValidationErrorService, @@ -55,6 +56,7 @@ export class RegisterComponent extends BaseRegisterComponent { logService, auditService, dialogService, + toastService, ); } } diff --git a/apps/browser/src/auth/popup/settings/account-security.component.ts b/apps/browser/src/auth/popup/settings/account-security.component.ts index 076c03801aa..25401f06f38 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -33,12 +33,13 @@ import { MessagingService } from "@bitwarden/common/platform/abstractions/messag import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service"; +import { BiometricsService } from "@bitwarden/common/platform/biometrics/biometric.service"; import { VaultTimeout, VaultTimeoutOption, VaultTimeoutStringType, } from "@bitwarden/common/types/vault-timeout.type"; -import { DialogService } from "@bitwarden/components"; +import { DialogService, ToastService } from "@bitwarden/components"; import { BiometricErrors, BiometricErrorTypes } from "../../../models/biometricErrors"; import { BrowserApi } from "../../../platform/browser/browser-api"; @@ -94,6 +95,8 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { private dialogService: DialogService, private changeDetectorRef: ChangeDetectorRef, private biometricStateService: BiometricStateService, + private toastService: ToastService, + private biometricsService: BiometricsService, ) { this.accountSwitcherEnabled = enableAccountSwitching(); } @@ -165,7 +168,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { }; this.form.patchValue(initialValues, { emitEvent: false }); - this.supportsBiometric = await this.platformUtilsService.supportsBiometric(); + this.supportsBiometric = await this.biometricsService.supportsBiometric(); this.showChangeMasterPass = await this.userVerificationService.hasMasterPassword(); this.form.controls.vaultTimeout.valueChanges @@ -272,11 +275,11 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { // The minTimeoutError does not apply to browser because it supports Immediately // So only check for the policyError if (this.form.controls.vaultTimeout.hasError("policyError")) { - this.platformUtilsService.showToast( - "error", - null, - this.i18nService.t("vaultTimeoutTooLarge"), - ); + this.toastService.showToast({ + variant: "error", + title: null, + message: this.i18nService.t("vaultTimeoutTooLarge"), + }); return; } @@ -313,11 +316,11 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { } if (this.form.controls.vaultTimeout.hasError("policyError")) { - this.platformUtilsService.showToast( - "error", - null, - this.i18nService.t("vaultTimeoutTooLarge"), - ); + this.toastService.showToast({ + variant: "error", + title: null, + message: this.i18nService.t("vaultTimeoutTooLarge"), + }); return; } @@ -405,7 +408,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { const biometricsPromise = async () => { try { - const result = await this.platformUtilsService.authenticateBiometric(); + const result = await this.biometricsService.authenticateBiometric(); // prevent duplicate dialog biometricsResponseReceived = true; @@ -415,11 +418,11 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { this.form.controls.biometric.setValue(result); if (!result) { - this.platformUtilsService.showToast( - "error", - this.i18nService.t("errorEnableBiometricTitle"), - this.i18nService.t("errorEnableBiometricDesc"), - ); + this.toastService.showToast({ + variant: "error", + title: this.i18nService.t("errorEnableBiometricTitle"), + message: this.i18nService.t("errorEnableBiometricDesc"), + }); } } catch (e) { // prevent duplicate dialog diff --git a/apps/browser/src/auth/popup/sso.component.ts b/apps/browser/src/auth/popup/sso.component.ts index 33284717ab5..42222c42b97 100644 --- a/apps/browser/src/auth/popup/sso.component.ts +++ b/apps/browser/src/auth/popup/sso.component.ts @@ -22,6 +22,7 @@ import { LogService } from "@bitwarden/common/platform/abstractions/log.service" import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; +import { ToastService } from "@bitwarden/components"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { BrowserApi } from "../../platform/browser/browser-api"; @@ -51,6 +52,7 @@ export class SsoComponent extends BaseSsoComponent { accountService: AccountService, private authService: AuthService, @Inject(WINDOW) private win: Window, + toastService: ToastService, ) { super( ssoLoginService, @@ -69,6 +71,7 @@ export class SsoComponent extends BaseSsoComponent { configService, masterPasswordService, accountService, + toastService, ); environmentService.environment$.pipe(takeUntilDestroyed()).subscribe((env) => { diff --git a/apps/browser/src/auth/popup/two-factor-auth.component.ts b/apps/browser/src/auth/popup/two-factor-auth.component.ts index ea0d4a48e55..27c95321100 100644 --- a/apps/browser/src/auth/popup/two-factor-auth.component.ts +++ b/apps/browser/src/auth/popup/two-factor-auth.component.ts @@ -32,6 +32,7 @@ import { LinkModule, TypographyModule, DialogService, + ToastService, } from "@bitwarden/components"; import { @@ -95,6 +96,7 @@ export class TwoFactorAuthComponent @Inject(WINDOW) protected win: Window, private syncService: SyncService, private messagingService: MessagingService, + toastService: ToastService, ) { super( loginStrategyService, @@ -114,6 +116,7 @@ export class TwoFactorAuthComponent accountService, formBuilder, win, + toastService, ); super.onSuccessfulLoginTdeNavigate = async () => { this.win.close(); diff --git a/apps/browser/src/autofill/background/abstractions/notification.background.ts b/apps/browser/src/autofill/background/abstractions/notification.background.ts index e01e2c5c02b..ed9d8e6d84b 100644 --- a/apps/browser/src/autofill/background/abstractions/notification.background.ts +++ b/apps/browser/src/autofill/background/abstractions/notification.background.ts @@ -9,6 +9,7 @@ interface NotificationQueueMessage { type: NotificationQueueMessageTypes; domain: string; tab: chrome.tabs.Tab; + launchTimestamp: number; expires: Date; wasVaultLocked: boolean; } @@ -88,10 +89,9 @@ type NotificationBackgroundExtensionMessage = { tab?: chrome.tabs.Tab; sender?: string; notificationType?: string; + fadeOutNotification?: boolean; }; -type SaveOrUpdateCipherResult = undefined | { error: string }; - type BackgroundMessageParam = { message: NotificationBackgroundExtensionMessage }; type BackgroundSenderParam = { sender: chrome.runtime.MessageSender }; type BackgroundOnMessageHandlerParams = BackgroundMessageParam & BackgroundSenderParam; @@ -100,7 +100,7 @@ type NotificationBackgroundExtensionMessageHandlers = { [key: string]: CallableFunction; unlockCompleted: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgGetFolderData: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; - bgCloseNotificationBar: ({ sender }: BackgroundSenderParam) => Promise; + bgCloseNotificationBar: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgAdjustNotificationBar: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgAddLogin: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgChangedPassword: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; @@ -129,7 +129,6 @@ export { ChangePasswordMessageData, UnlockVaultMessageData, AddLoginMessageData, - SaveOrUpdateCipherResult, NotificationBackgroundExtensionMessage, NotificationBackgroundExtensionMessageHandlers, }; diff --git a/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts b/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts new file mode 100644 index 00000000000..0ec6a9ae04a --- /dev/null +++ b/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts @@ -0,0 +1,52 @@ +import AutofillPageDetails from "../../models/autofill-page-details"; + +export type NotificationTypeData = { + isVaultLocked?: boolean; + theme?: string; + removeIndividualVault?: boolean; + importType?: string; + launchTimestamp?: number; +}; + +export type WebsiteOriginsWithFields = Map>; + +export type ActiveFormSubmissionRequests = Set; + +export type ModifyLoginCipherFormData = { + uri: string; + username: string; + password: string; + newPassword: string; +}; + +export type ModifyLoginCipherFormDataForTab = Map< + chrome.tabs.Tab["id"], + { uri: string; username: string; password: string; newPassword: string } +>; + +export type OverlayNotificationsExtensionMessage = { + command: string; + uri?: string; + username?: string; + password?: string; + newPassword?: string; + details?: AutofillPageDetails; +}; + +type OverlayNotificationsMessageParams = { message: OverlayNotificationsExtensionMessage }; +type OverlayNotificationSenderParams = { sender: chrome.runtime.MessageSender }; +type OverlayNotificationsMessageHandlersParams = OverlayNotificationsMessageParams & + OverlayNotificationSenderParams; + +export type OverlayNotificationsExtensionMessageHandlers = { + [key: string]: ({ message, sender }: OverlayNotificationsMessageHandlersParams) => any; + formFieldSubmitted: ({ message, sender }: OverlayNotificationsMessageHandlersParams) => void; + collectPageDetailsResponse: ({ + message, + sender, + }: OverlayNotificationsMessageHandlersParams) => Promise; +}; + +export interface OverlayNotificationsBackground { + init(): void; +} diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index 2c9232d8b5c..0ede9b96091 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -1,4 +1,4 @@ -import { mock } from "jest-mock-extended"; +import { mock, MockProxy } from "jest-mock-extended"; import { BehaviorSubject, firstValueFrom } from "rxjs"; import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; @@ -48,7 +48,8 @@ describe("NotificationBackground", () => { let notificationBackground: NotificationBackground; const autofillService = mock(); const cipherService = mock(); - const authService = mock(); + let activeAccountStatusMock$: BehaviorSubject; + let authService: MockProxy; const policyService = mock(); const folderService = mock(); const userNotificationSettingsService = mock(); @@ -60,6 +61,9 @@ describe("NotificationBackground", () => { const accountService = mock(); beforeEach(() => { + activeAccountStatusMock$ = new BehaviorSubject(AuthenticationStatus.Locked); + authService = mock(); + authService.activeAccountStatus$ = activeAccountStatusMock$; notificationBackground = new NotificationBackground( autofillService, cipherService, @@ -91,6 +95,7 @@ describe("NotificationBackground", () => { tab: createChromeTabMock(), expires: new Date(), wasVaultLocked: false, + launchTimestamp: 0, }; const cipherView = notificationBackground["convertAddLoginQueueMessageToCipherView"](message); @@ -126,6 +131,7 @@ describe("NotificationBackground", () => { tab: createChromeTabMock(), expires: new Date(), wasVaultLocked: false, + launchTimestamp: 0, }; const cipherView = notificationBackground["convertAddLoginQueueMessageToCipherView"]( message, @@ -137,8 +143,8 @@ describe("NotificationBackground", () => { }); describe("notification bar extension message handlers", () => { - beforeEach(async () => { - await notificationBackground.init(); + beforeEach(() => { + notificationBackground.init(); }); it("ignores messages whose command does not match the expected handlers", () => { @@ -222,6 +228,7 @@ describe("NotificationBackground", () => { expect(BrowserApi.tabSendMessageData).toHaveBeenCalledWith( sender.tab, "closeNotificationBar", + { fadeOutNotification: false }, ); }); }); @@ -249,7 +256,6 @@ describe("NotificationBackground", () => { describe("bgAddLogin message handler", () => { let tab: chrome.tabs.Tab; let sender: chrome.runtime.MessageSender; - let getAuthStatusSpy: jest.SpyInstance; let getEnableAddedLoginPromptSpy: jest.SpyInstance; let getEnableChangedPasswordPromptSpy: jest.SpyInstance; let pushAddLoginToQueueSpy: jest.SpyInstance; @@ -259,7 +265,6 @@ describe("NotificationBackground", () => { beforeEach(() => { tab = createChromeTabMock(); sender = mock({ tab }); - getAuthStatusSpy = jest.spyOn(authService, "getAuthStatus"); getEnableAddedLoginPromptSpy = jest.spyOn( notificationBackground as any, "getEnableAddedLoginPrompt", @@ -281,12 +286,11 @@ describe("NotificationBackground", () => { command: "bgAddLogin", login: { username: "test", password: "password", url: "https://example.com" }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.LoggedOut); + activeAccountStatusMock$.next(AuthenticationStatus.LoggedOut); sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getEnableAddedLoginPromptSpy).not.toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).not.toHaveBeenCalled(); }); @@ -296,12 +300,11 @@ describe("NotificationBackground", () => { command: "bgAddLogin", login: { username: "test", password: "password", url: "" }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Locked); + activeAccountStatusMock$.next(AuthenticationStatus.Locked); sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getEnableAddedLoginPromptSpy).not.toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).not.toHaveBeenCalled(); }); @@ -311,13 +314,12 @@ describe("NotificationBackground", () => { command: "bgAddLogin", login: { username: "test", password: "password", url: "https://example.com" }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Locked); + activeAccountStatusMock$.next(AuthenticationStatus.Locked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(false); sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getEnableAddedLoginPromptSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).not.toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).not.toHaveBeenCalled(); @@ -329,14 +331,13 @@ describe("NotificationBackground", () => { command: "bgAddLogin", login: { username: "test", password: "password", url: "https://example.com" }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(false); getAllDecryptedForUrlSpy.mockResolvedValueOnce([]); sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getEnableAddedLoginPromptSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).not.toHaveBeenCalled(); @@ -348,7 +349,7 @@ describe("NotificationBackground", () => { command: "bgAddLogin", login: { username: "test", password: "password", url: "https://example.com" }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(true); getEnableChangedPasswordPromptSpy.mockReturnValueOnce(false); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ @@ -358,7 +359,6 @@ describe("NotificationBackground", () => { sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getEnableAddedLoginPromptSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(getEnableChangedPasswordPromptSpy).toHaveBeenCalled(); @@ -371,7 +371,7 @@ describe("NotificationBackground", () => { command: "bgAddLogin", login: { username: "test", password: "password", url: "https://example.com" }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(true); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ mock({ login: { username: "test", password: "password" } }), @@ -380,7 +380,6 @@ describe("NotificationBackground", () => { sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getEnableAddedLoginPromptSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).not.toHaveBeenCalled(); @@ -390,13 +389,12 @@ describe("NotificationBackground", () => { it("adds the login to the queue if the user has a locked account", async () => { const login = { username: "test", password: "password", url: "https://example.com" }; const message: NotificationBackgroundExtensionMessage = { command: "bgAddLogin", login }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Locked); + activeAccountStatusMock$.next(AuthenticationStatus.Locked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(true); sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).toHaveBeenCalledWith("example.com", login, sender.tab, true); }); @@ -407,7 +405,7 @@ describe("NotificationBackground", () => { url: "https://example.com", } as any; const message: NotificationBackgroundExtensionMessage = { command: "bgAddLogin", login }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(true); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ mock({ login: { username: "anotherTestUsername", password: "password" } }), @@ -416,14 +414,13 @@ describe("NotificationBackground", () => { sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).toHaveBeenCalledWith("example.com", login, sender.tab); }); it("adds a change password message to the queue if the user has changed an existing cipher's password", async () => { const login = { username: "tEsT", password: "password", url: "https://example.com" }; const message: NotificationBackgroundExtensionMessage = { command: "bgAddLogin", login }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getEnableAddedLoginPromptSpy.mockResolvedValueOnce(true); getEnableChangedPasswordPromptSpy.mockResolvedValueOnce(true); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ @@ -448,14 +445,12 @@ describe("NotificationBackground", () => { describe("bgChangedPassword message handler", () => { let tab: chrome.tabs.Tab; let sender: chrome.runtime.MessageSender; - let getAuthStatusSpy: jest.SpyInstance; let pushChangePasswordToQueueSpy: jest.SpyInstance; let getAllDecryptedForUrlSpy: jest.SpyInstance; beforeEach(() => { tab = createChromeTabMock(); sender = mock({ tab }); - getAuthStatusSpy = jest.spyOn(authService, "getAuthStatus"); pushChangePasswordToQueueSpy = jest.spyOn( notificationBackground as any, "pushChangePasswordToQueue", @@ -484,12 +479,11 @@ describe("NotificationBackground", () => { url: "https://example.com", }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Locked); + activeAccountStatusMock$.next(AuthenticationStatus.Locked); sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(pushChangePasswordToQueueSpy).toHaveBeenCalledWith( null, "example.com", @@ -508,7 +502,7 @@ describe("NotificationBackground", () => { url: "https://example.com", }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ mock({ login: { username: "test", password: "password" } }), ]); @@ -516,7 +510,6 @@ describe("NotificationBackground", () => { sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(pushChangePasswordToQueueSpy).not.toHaveBeenCalled(); }); @@ -530,7 +523,7 @@ describe("NotificationBackground", () => { url: "https://example.com", }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ mock({ login: { username: "test", password: "password" } }), mock({ login: { username: "test2", password: "password" } }), @@ -539,7 +532,6 @@ describe("NotificationBackground", () => { sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(pushChangePasswordToQueueSpy).not.toHaveBeenCalled(); }); @@ -553,7 +545,7 @@ describe("NotificationBackground", () => { url: "https://example.com", }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ mock({ id: "cipher-id", @@ -580,7 +572,7 @@ describe("NotificationBackground", () => { url: "https://example.com", }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ mock({ login: { username: "test", password: "password" } }), mock({ login: { username: "test2", password: "password" } }), @@ -589,7 +581,6 @@ describe("NotificationBackground", () => { sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(pushChangePasswordToQueueSpy).not.toHaveBeenCalled(); }); @@ -602,7 +593,7 @@ describe("NotificationBackground", () => { url: "https://example.com", }, }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ mock({ id: "cipher-id", @@ -658,12 +649,10 @@ describe("NotificationBackground", () => { }); describe("bgSaveCipher message handler", () => { - let getAuthStatusSpy: jest.SpyInstance; let tabSendMessageDataSpy: jest.SpyInstance; let openUnlockPopoutSpy: jest.SpyInstance; beforeEach(() => { - getAuthStatusSpy = jest.spyOn(authService, "getAuthStatus"); tabSendMessageDataSpy = jest.spyOn(BrowserApi, "tabSendMessageData").mockImplementation(); openUnlockPopoutSpy = jest .spyOn(notificationBackground as any, "openUnlockPopout") @@ -677,12 +666,11 @@ describe("NotificationBackground", () => { edit: false, folder: "folder-id", }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Locked); + activeAccountStatusMock$.next(AuthenticationStatus.Locked); sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(tabSendMessageDataSpy).toHaveBeenCalledWith( sender.tab, "addToLockedVaultPendingNotifications", @@ -716,7 +704,7 @@ describe("NotificationBackground", () => { let cipherEncryptSpy: jest.SpyInstance; beforeEach(() => { - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Unlocked); + activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getDecryptedCipherByIdSpy = jest.spyOn( notificationBackground as any, "getDecryptedCipherById", @@ -1214,11 +1202,9 @@ describe("NotificationBackground", () => { }); describe("bgUnlockPopoutOpened message handler", () => { - let getAuthStatusSpy: jest.SpyInstance; let pushUnlockVaultToQueueSpy: jest.SpyInstance; beforeEach(() => { - getAuthStatusSpy = jest.spyOn(authService, "getAuthStatus"); pushUnlockVaultToQueueSpy = jest.spyOn( notificationBackground as any, "pushUnlockVaultToQueue", @@ -1236,7 +1222,6 @@ describe("NotificationBackground", () => { sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).not.toHaveBeenCalled(); expect(pushUnlockVaultToQueueSpy).not.toHaveBeenCalled(); }); @@ -1246,12 +1231,11 @@ describe("NotificationBackground", () => { const message: NotificationBackgroundExtensionMessage = { command: "bgUnlockPopoutOpened", }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.LoggedOut); + activeAccountStatusMock$.next(AuthenticationStatus.LoggedOut); sendMockExtensionMessage(message, sender); await flushPromises(); - expect(getAuthStatusSpy).toHaveBeenCalled(); expect(pushUnlockVaultToQueueSpy).not.toHaveBeenCalled(); }); @@ -1261,7 +1245,7 @@ describe("NotificationBackground", () => { const message: NotificationBackgroundExtensionMessage = { command: "bgUnlockPopoutOpened", }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Locked); + activeAccountStatusMock$.next(AuthenticationStatus.Locked); notificationBackground["notificationQueue"] = [mock()]; sendMockExtensionMessage(message, sender); @@ -1276,7 +1260,7 @@ describe("NotificationBackground", () => { const message: NotificationBackgroundExtensionMessage = { command: "bgUnlockPopoutOpened", }; - getAuthStatusSpy.mockResolvedValueOnce(AuthenticationStatus.Locked); + activeAccountStatusMock$.next(AuthenticationStatus.Locked); sendMockExtensionMessage(message, sender); await flushPromises(); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 25f45bd0659..683e3d8f581 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -44,6 +44,7 @@ import { NotificationBackgroundExtensionMessage, NotificationBackgroundExtensionMessageHandlers, } from "./abstractions/notification.background"; +import { NotificationTypeData } from "./abstractions/overlay-notifications.background"; import { OverlayBackgroundExtensionMessage } from "./abstractions/overlay.background"; export default class NotificationBackground { @@ -58,7 +59,8 @@ export default class NotificationBackground { private readonly extensionMessageHandlers: NotificationBackgroundExtensionMessageHandlers = { unlockCompleted: ({ message, sender }) => this.handleUnlockCompleted(message, sender), bgGetFolderData: () => this.getFolderData(), - bgCloseNotificationBar: ({ sender }) => this.handleCloseNotificationBarMessage(sender), + bgCloseNotificationBar: ({ message, sender }) => + this.handleCloseNotificationBarMessage(message, sender), bgAdjustNotificationBar: ({ message, sender }) => this.handleAdjustNotificationBarMessage(message, sender), bgAddLogin: ({ message, sender }) => this.addLogin(message, sender), @@ -94,7 +96,7 @@ export default class NotificationBackground { private accountService: AccountService, ) {} - async init() { + init() { if (chrome.runtime == null) { return; } @@ -132,6 +134,10 @@ export default class NotificationBackground { return await firstValueFrom(this.configService.serverConfig$); } + private async getAuthStatus() { + return await firstValueFrom(this.authService.activeAccountStatus$); + } + /** * Checks the notification queue for any messages that need to be sent to the * specified tab. If no tab is specified, the current tab will be used. @@ -186,9 +192,10 @@ export default class NotificationBackground { ) { const notificationType = notificationQueueMessage.type; - const typeData: Record = { + const typeData: NotificationTypeData = { isVaultLocked: notificationQueueMessage.wasVaultLocked, theme: await firstValueFrom(this.themeStateService.selectedTheme$), + launchTimestamp: notificationQueueMessage.launchTimestamp, }; switch (notificationType) { @@ -230,11 +237,11 @@ export default class NotificationBackground { * @param message - The message to add to the queue * @param sender - The contextual sender of the message */ - private async addLogin( + async addLogin( message: NotificationBackgroundExtensionMessage, sender: chrome.runtime.MessageSender, ) { - const authStatus = await this.authService.getAuthStatus(); + const authStatus = await this.getAuthStatus(); if (authStatus === AuthenticationStatus.LoggedOut) { return; } @@ -289,6 +296,7 @@ export default class NotificationBackground { ) { // remove any old messages for this tab this.removeTabFromNotificationQueue(tab); + const launchTimestamp = new Date().getTime(); const message: AddLoginQueueMessage = { type: NotificationQueueMessageType.AddLogin, username: loginInfo.username, @@ -296,7 +304,8 @@ export default class NotificationBackground { domain: loginDomain, uri: loginInfo.url, tab: tab, - expires: new Date(new Date().getTime() + NOTIFICATION_BAR_LIFESPAN_MS), + launchTimestamp, + expires: new Date(launchTimestamp + NOTIFICATION_BAR_LIFESPAN_MS), wasVaultLocked: isVaultLocked, }; this.notificationQueue.push(message); @@ -310,7 +319,7 @@ export default class NotificationBackground { * @param message - The message to add to the queue * @param sender - The contextual sender of the message */ - private async changedPassword( + async changedPassword( message: NotificationBackgroundExtensionMessage, sender: chrome.runtime.MessageSender, ) { @@ -320,7 +329,7 @@ export default class NotificationBackground { return; } - if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { + if ((await this.getAuthStatus()) < AuthenticationStatus.Unlocked) { await this.pushChangePasswordToQueue( null, loginDomain, @@ -380,7 +389,7 @@ export default class NotificationBackground { return; } - const currentAuthStatus = await this.authService.getAuthStatus(); + const currentAuthStatus = await this.getAuthStatus(); if (currentAuthStatus !== AuthenticationStatus.Locked || this.notificationQueue.length) { return; } @@ -399,7 +408,7 @@ export default class NotificationBackground { * @param importType - The type of import that is being requested */ async requestFilelessImport(tab: chrome.tabs.Tab, importType: string) { - const currentAuthStatus = await this.authService.getAuthStatus(); + const currentAuthStatus = await this.getAuthStatus(); if (currentAuthStatus !== AuthenticationStatus.Unlocked || this.notificationQueue.length) { return; } @@ -419,13 +428,15 @@ export default class NotificationBackground { ) { // remove any old messages for this tab this.removeTabFromNotificationQueue(tab); + const launchTimestamp = new Date().getTime(); const message: AddChangePasswordQueueMessage = { type: NotificationQueueMessageType.ChangePassword, cipherId: cipherId, newPassword: newPassword, domain: loginDomain, tab: tab, - expires: new Date(new Date().getTime() + NOTIFICATION_BAR_LIFESPAN_MS), + launchTimestamp, + expires: new Date(launchTimestamp + NOTIFICATION_BAR_LIFESPAN_MS), wasVaultLocked: isVaultLocked, }; this.notificationQueue.push(message); @@ -434,11 +445,13 @@ export default class NotificationBackground { private async pushUnlockVaultToQueue(loginDomain: string, tab: chrome.tabs.Tab) { this.removeTabFromNotificationQueue(tab); + const launchTimestamp = new Date().getTime(); const message: AddUnlockVaultQueueMessage = { type: NotificationQueueMessageType.UnlockVault, domain: loginDomain, tab: tab, - expires: new Date(new Date().getTime() + 0.5 * 60000), // 30 seconds + launchTimestamp, + expires: new Date(launchTimestamp + 0.5 * 60000), // 30 seconds wasVaultLocked: true, }; await this.sendNotificationQueueMessage(tab, message); @@ -459,11 +472,13 @@ export default class NotificationBackground { importType?: string, ) { this.removeTabFromNotificationQueue(tab); + const launchTimestamp = new Date().getTime(); const message: AddRequestFilelessImportQueueMessage = { type: NotificationQueueMessageType.RequestFilelessImport, domain: loginDomain, tab, - expires: new Date(new Date().getTime() + 0.5 * 60000), // 30 seconds + launchTimestamp, + expires: new Date(launchTimestamp + 0.5 * 60000), // 30 seconds wasVaultLocked: false, importType, }; @@ -484,7 +499,7 @@ export default class NotificationBackground { message: NotificationBackgroundExtensionMessage, sender: chrome.runtime.MessageSender, ) { - if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { + if ((await this.getAuthStatus()) < AuthenticationStatus.Unlocked) { await BrowserApi.tabSendMessageData(sender.tab, "addToLockedVaultPendingNotifications", { commandToRetry: { message: { @@ -736,10 +751,16 @@ export default class NotificationBackground { * Sends a message back to the sender tab which * triggers closure of the notification bar. * + * @param message - The extension message * @param sender - The contextual sender of the message */ - private async handleCloseNotificationBarMessage(sender: chrome.runtime.MessageSender) { - await BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar"); + private async handleCloseNotificationBarMessage( + message: NotificationBackgroundExtensionMessage, + sender: chrome.runtime.MessageSender, + ) { + await BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar", { + fadeOutNotification: !!message.fadeOutNotification, + }); } /** diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts b/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts new file mode 100644 index 00000000000..d694438c00f --- /dev/null +++ b/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts @@ -0,0 +1,548 @@ +import { mock, MockProxy } from "jest-mock-extended"; + +import { CLEAR_NOTIFICATION_LOGIN_DATA_DURATION } from "@bitwarden/common/autofill/constants"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { EnvironmentServerConfigData } from "@bitwarden/common/platform/models/data/server-config.data"; + +import { BrowserApi } from "../../platform/browser/browser-api"; +import AutofillField from "../models/autofill-field"; +import AutofillPageDetails from "../models/autofill-page-details"; +import { + flushPromises, + sendMockExtensionMessage, + triggerTabOnRemovedEvent, + triggerTabOnUpdatedEvent, + triggerWebNavigationOnCompletedEvent, + triggerWebRequestOnBeforeRequestEvent, + triggerWebRequestOnCompletedEvent, +} from "../spec/testing-utils"; + +import NotificationBackground from "./notification.background"; +import { OverlayNotificationsBackground } from "./overlay-notifications.background"; + +describe("OverlayNotificationsBackground", () => { + let logService: MockProxy; + let configService: MockProxy; + let notificationBackground: NotificationBackground; + let getEnableChangedPasswordPromptSpy: jest.SpyInstance; + let getEnableAddedLoginPromptSpy: jest.SpyInstance; + let overlayNotificationsBackground: OverlayNotificationsBackground; + + beforeEach(async () => { + jest.useFakeTimers(); + logService = mock(); + configService = mock(); + notificationBackground = mock(); + getEnableChangedPasswordPromptSpy = jest + .spyOn(notificationBackground, "getEnableChangedPasswordPrompt") + .mockResolvedValue(true); + getEnableAddedLoginPromptSpy = jest + .spyOn(notificationBackground, "getEnableAddedLoginPrompt") + .mockResolvedValue(true); + overlayNotificationsBackground = new OverlayNotificationsBackground( + logService, + configService, + notificationBackground, + ); + configService.getFeatureFlag.mockResolvedValue(true); + await overlayNotificationsBackground.init(); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + + describe("setting up the form submission listeners", () => { + let fields: MockProxy[]; + let details: MockProxy; + + beforeEach(() => { + fields = [mock(), mock(), mock()]; + details = mock({ fields }); + }); + + describe("skipping setting up the web request listeners", () => { + it("skips setting up listeners when the notification bar is disabled", async () => { + getEnableChangedPasswordPromptSpy.mockResolvedValue(false); + getEnableAddedLoginPromptSpy.mockResolvedValue(false); + + sendMockExtensionMessage({ + command: "collectPageDetailsResponse", + details, + }); + await flushPromises(); + + expect(chrome.webRequest.onCompleted.addListener).not.toHaveBeenCalled(); + }); + + describe("when the sender is from an excluded domain", () => { + const senderHost = "example.com"; + const senderUrl = `https://${senderHost}`; + + beforeEach(() => { + jest.spyOn(notificationBackground, "getExcludedDomains").mockResolvedValue({ + [senderHost]: null, + }); + }); + + it("skips setting up listeners when the sender is the user's vault", async () => { + const vault = "https://vault.bitwarden.com"; + const sender = mock({ origin: vault }); + jest + .spyOn(notificationBackground, "getActiveUserServerConfig") + .mockResolvedValue( + mock({ environment: mock({ vault }) }), + ); + + sendMockExtensionMessage({ command: "collectPageDetailsResponse", details }, sender); + await flushPromises(); + + expect(chrome.webRequest.onCompleted.addListener).not.toHaveBeenCalled(); + }); + + it("skips setting up listeners when the sender is an excluded domain", async () => { + const sender = mock({ origin: senderUrl }); + + sendMockExtensionMessage({ command: "collectPageDetailsResponse", details }, sender); + await flushPromises(); + + expect(chrome.webRequest.onCompleted.addListener).not.toHaveBeenCalled(); + }); + + it("skips setting up listeners when the sender contains a malformed origin", async () => { + const senderOrigin = "-_-!..exampwle.com"; + const sender = mock({ origin: senderOrigin }); + + sendMockExtensionMessage({ command: "collectPageDetailsResponse", details }, sender); + await flushPromises(); + + expect(chrome.webRequest.onCompleted.addListener).not.toHaveBeenCalled(); + }); + }); + + it("skips setting up listeners when the sender tab does not contain page details fields", async () => { + const sender = mock({ tab: { id: 1 } }); + details.fields = []; + + sendMockExtensionMessage({ command: "collectPageDetailsResponse", details }, sender); + await flushPromises(); + + expect(chrome.webRequest.onCompleted.addListener).not.toHaveBeenCalled(); + }); + }); + + it("sets up the web request listeners", async () => { + const sender = mock({ + tab: { id: 1 }, + url: "example.com", + }); + + sendMockExtensionMessage({ command: "collectPageDetailsResponse", details }, sender); + await flushPromises(); + + expect(chrome.webRequest.onCompleted.addListener).toHaveBeenCalled(); + }); + + it("skips setting up duplicate listeners when the website origin has been previously encountered with fields", async () => { + const sender = mock({ + tab: { id: 1 }, + url: "example.com", + }); + + sendMockExtensionMessage({ command: "collectPageDetailsResponse", details }, sender); + await flushPromises(); + sendMockExtensionMessage({ command: "collectPageDetailsResponse", details }, sender); + await flushPromises(); + sendMockExtensionMessage({ command: "collectPageDetailsResponse", details }, sender); + await flushPromises(); + + expect(chrome.webRequest.onCompleted.addListener).toHaveBeenCalledTimes(1); + }); + }); + + describe("storing the modified login form data", () => { + const sender = mock({ tab: { id: 1 } }); + + it("stores the modified login cipher form data", async () => { + sendMockExtensionMessage( + { + command: "formFieldSubmitted", + uri: "example.com", + username: "username", + password: "password", + newPassword: "newPassword", + }, + sender, + ); + await flushPromises(); + + expect( + overlayNotificationsBackground["modifyLoginCipherFormData"].get(sender.tab.id), + ).toEqual({ + uri: "example.com", + username: "username", + password: "password", + newPassword: "newPassword", + }); + }); + + it("clears the modified login cipher form data after 5 seconds", () => { + sendMockExtensionMessage( + { + command: "formFieldSubmitted", + uri: "example.com", + username: "username", + password: "password", + newPassword: "newPassword", + }, + sender, + ); + + jest.advanceTimersByTime(CLEAR_NOTIFICATION_LOGIN_DATA_DURATION); + + expect(overlayNotificationsBackground["modifyLoginCipherFormData"].size).toBe(0); + }); + + it("attempts to store the modified login cipher form data within the onBeforeRequest listener when the data is not captured through a submit button click event", async () => { + const pageDetails = mock({ fields: [mock()] }); + const tab = mock({ id: sender.tab.id }); + jest.spyOn(BrowserApi, "getTab").mockResolvedValueOnce(tab); + const response = { + command: "formFieldSubmitted", + uri: "example.com", + username: "username", + password: "password", + newPassword: "newPassword", + }; + jest.spyOn(BrowserApi, "tabSendMessage").mockResolvedValueOnce(response); + sendMockExtensionMessage( + { command: "collectPageDetailsResponse", details: pageDetails }, + sender, + ); + await flushPromises(); + + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: "https://example.com", + tabId: sender.tab.id, + method: "POST", + requestId: "123345", + }), + ); + await flushPromises(); + + expect( + overlayNotificationsBackground["modifyLoginCipherFormData"].get(sender.tab.id), + ).toEqual({ + uri: "example.com", + username: "username", + password: "password", + newPassword: "newPassword", + }); + }); + }); + + describe("web request listeners", () => { + let sender: MockProxy; + const pageDetails = mock({ fields: [mock()] }); + let notificationChangedPasswordSpy: jest.SpyInstance; + let notificationAddLoginSpy: jest.SpyInstance; + + beforeEach(async () => { + sender = mock({ + tab: { id: 1 }, + url: "https://example.com", + }); + notificationChangedPasswordSpy = jest.spyOn(notificationBackground, "changedPassword"); + notificationAddLoginSpy = jest.spyOn(notificationBackground, "addLogin"); + + sendMockExtensionMessage( + { command: "collectPageDetailsResponse", details: pageDetails }, + sender, + ); + await flushPromises(); + }); + + describe("ignored web requests", () => { + it("ignores requests from urls that do not start with a valid protocol", async () => { + sender.url = "chrome-extension://extension-id"; + + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + }), + ); + + expect(overlayNotificationsBackground["activeFormSubmissionRequests"].size).toBe(0); + }); + + it("ignores requests from urls that do not have a valid tabId", async () => { + sender.tab = mock({ id: -1 }); + + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + }), + ); + + expect(overlayNotificationsBackground["activeFormSubmissionRequests"].size).toBe(0); + }); + + it("ignores requests from urls that do not have a valid request method", async () => { + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "GET", + }), + ); + + expect(overlayNotificationsBackground["activeFormSubmissionRequests"].size).toBe(0); + }); + + it("ignores requests that are not part of an active form submission", async () => { + triggerWebRequestOnCompletedEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + requestId: "123345", + }), + ); + + expect(notificationChangedPasswordSpy).not.toHaveBeenCalled(); + expect(notificationAddLoginSpy).not.toHaveBeenCalled(); + }); + + it("ignores requests for tabs that do not contain stored login data", async () => { + const requestId = "123345"; + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + requestId, + }), + ); + await flushPromises(); + + triggerWebRequestOnCompletedEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + requestId, + }), + ); + + expect(notificationChangedPasswordSpy).not.toHaveBeenCalled(); + expect(notificationAddLoginSpy).not.toHaveBeenCalled(); + }); + }); + + describe("web requests that trigger notifications", () => { + const requestId = "123345"; + + beforeEach(async () => { + sendMockExtensionMessage( + { + command: "formFieldSubmitted", + uri: "example.com", + username: "username", + password: "password", + newPassword: "newPassword", + }, + sender, + ); + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + requestId, + }), + ); + await flushPromises(); + }); + + it("waits for the tab's navigation to complete using the web navigation API before initializing the notification", async () => { + chrome.tabs.get = jest.fn().mockImplementationOnce((tabId, callback) => { + callback( + mock({ + status: "loading", + url: sender.url, + }), + ); + }); + triggerWebRequestOnCompletedEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + requestId, + }), + ); + await flushPromises(); + + chrome.tabs.get = jest.fn().mockImplementationOnce((tabId, callback) => { + callback( + mock({ + status: "complete", + url: sender.url, + }), + ); + }); + triggerWebNavigationOnCompletedEvent( + mock({ + tabId: sender.tab.id, + url: sender.url, + }), + ); + await flushPromises(); + + expect(notificationAddLoginSpy).toHaveBeenCalled(); + }); + + it("initializes the notification immediately when the tab's navigation is complete", async () => { + sendMockExtensionMessage( + { + command: "formFieldSubmitted", + uri: "example.com", + username: "username", + password: "password", + newPassword: "newPassword", + }, + sender, + ); + await flushPromises(); + chrome.tabs.get = jest.fn().mockImplementationOnce((tabId, callback) => { + callback( + mock({ + status: "complete", + url: sender.url, + }), + ); + }); + + triggerWebRequestOnCompletedEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + requestId, + }), + ); + await flushPromises(); + + expect(notificationAddLoginSpy).toHaveBeenCalled(); + }); + + it("triggers the notification on the beforeRequest listener when a post-submission redirection is encountered", async () => { + sender.tab = mock({ id: 4 }); + sendMockExtensionMessage( + { + command: "formFieldSubmitted", + uri: "example.com", + username: "", + password: "password", + newPassword: "newPassword", + }, + sender, + ); + await flushPromises(); + chrome.tabs.get = jest.fn().mockImplementation((tabId, callback) => { + callback( + mock({ + status: "complete", + url: sender.url, + }), + ); + }); + + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + requestId, + }), + ); + await flushPromises(); + + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: "https://example.com/redirect", + tabId: sender.tab.id, + method: "GET", + requestId, + }), + ); + await flushPromises(); + + expect(notificationChangedPasswordSpy).toHaveBeenCalled(); + }); + }); + }); + + describe("tab listeners", () => { + let sender: MockProxy; + const pageDetails = mock({ fields: [mock()] }); + const requestId = "123345"; + + beforeEach(async () => { + sender = mock({ + tab: { id: 1 }, + url: "https://example.com", + }); + + sendMockExtensionMessage( + { command: "collectPageDetailsResponse", details: pageDetails }, + sender, + ); + await flushPromises(); + triggerWebRequestOnBeforeRequestEvent( + mock({ + url: sender.url, + tabId: sender.tab.id, + method: "POST", + requestId, + }), + ); + await flushPromises(); + sendMockExtensionMessage( + { + command: "formFieldSubmitted", + uri: "example.com", + username: "username", + password: "password", + newPassword: "newPassword", + }, + sender, + ); + await flushPromises(); + }); + + it("clears all associated data with a removed tab", () => { + triggerTabOnRemovedEvent(sender.tab.id, mock()); + + expect(overlayNotificationsBackground["websiteOriginsWithFields"].size).toBe(0); + }); + + it("clears all associated data with a tab that is entering a `loading` state", () => { + triggerTabOnUpdatedEvent( + sender.tab.id, + mock({ status: "loading" }), + mock({ status: "loading" }), + ); + + expect(overlayNotificationsBackground["websiteOriginsWithFields"].size).toBe(0); + }); + }); +}); diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.ts b/apps/browser/src/autofill/background/overlay-notifications.background.ts new file mode 100644 index 00000000000..e252bdcc4af --- /dev/null +++ b/apps/browser/src/autofill/background/overlay-notifications.background.ts @@ -0,0 +1,557 @@ +import { Subject, switchMap, timer } from "rxjs"; + +import { CLEAR_NOTIFICATION_LOGIN_DATA_DURATION } from "@bitwarden/common/autofill/constants"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; +import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; + +import { BrowserApi } from "../../platform/browser/browser-api"; + +import { + ActiveFormSubmissionRequests, + ModifyLoginCipherFormData, + ModifyLoginCipherFormDataForTab, + OverlayNotificationsBackground as OverlayNotificationsBackgroundInterface, + OverlayNotificationsExtensionMessage, + OverlayNotificationsExtensionMessageHandlers, + WebsiteOriginsWithFields, +} from "./abstractions/overlay-notifications.background"; +import NotificationBackground from "./notification.background"; + +export class OverlayNotificationsBackground implements OverlayNotificationsBackgroundInterface { + private websiteOriginsWithFields: WebsiteOriginsWithFields = new Map(); + private activeFormSubmissionRequests: ActiveFormSubmissionRequests = new Set(); + private modifyLoginCipherFormData: ModifyLoginCipherFormDataForTab = new Map(); + private clearLoginCipherFormDataSubject: Subject = new Subject(); + private readonly formSubmissionRequestMethods: Set = new Set(["POST", "PUT", "PATCH"]); + private readonly extensionMessageHandlers: OverlayNotificationsExtensionMessageHandlers = { + formFieldSubmitted: ({ message, sender }) => this.storeModifiedLoginFormData(message, sender), + collectPageDetailsResponse: ({ message, sender }) => + this.handleCollectPageDetailsResponse(message, sender), + }; + + constructor( + private logService: LogService, + private configService: ConfigService, + private notificationBackground: NotificationBackground, + ) {} + + /** + * Initialize the overlay notifications background service. + */ + async init() { + const featureFlagActive = await this.configService.getFeatureFlag( + FeatureFlag.NotificationBarAddLoginImprovements, + ); + if (!featureFlagActive) { + return; + } + + this.setupExtensionListeners(); + this.clearLoginCipherFormDataSubject + .pipe(switchMap(() => timer(CLEAR_NOTIFICATION_LOGIN_DATA_DURATION))) + .subscribe(() => this.modifyLoginCipherFormData.clear()); + } + + /** + * Handles the response from the content script with the page details. Triggers an initialization + * of the add login or change password notification if the conditions are met. + * + * @param message - The message from the content script + * @param sender - The sender of the message + */ + private async handleCollectPageDetailsResponse( + message: OverlayNotificationsExtensionMessage, + sender: chrome.runtime.MessageSender, + ) { + if (await this.shouldInitAddLoginOrChangePasswordNotification(message, sender)) { + this.websiteOriginsWithFields.set(sender.tab.id, this.getSenderUrlMatchPatterns(sender)); + this.setupWebRequestsListeners(); + } + } + + /** + * Determines if the add login or change password notification should be initialized. This depends + * on whether the user has enabled the notification, the sender is not from an excluded domain, the + * tab's page details contains fillable fields, and the website origin has not been previously stored. + * + * @param message - The message from the content script + * @param sender - The sender of the message + */ + private async shouldInitAddLoginOrChangePasswordNotification( + message: OverlayNotificationsExtensionMessage, + sender: chrome.runtime.MessageSender, + ) { + return ( + (await this.isAddLoginOrChangePasswordNotificationEnabled()) && + !(await this.isSenderFromExcludedDomain(sender)) && + message.details?.fields?.length > 0 && + !this.websiteOriginsWithFields.has(sender.tab.id) + ); + } + + /** + * Determines if the add login or change password notification is enabled. + * This is based on the user's settings for the notification. + */ + private async isAddLoginOrChangePasswordNotificationEnabled() { + return ( + (await this.notificationBackground.getEnableChangedPasswordPrompt()) || + (await this.notificationBackground.getEnableAddedLoginPrompt()) + ); + } + + /** + * Returns the match patterns for the sender's URL. This is used to filter out + * the web requests that are not from the sender's tab. + * + * @param sender - The sender of the message + */ + private getSenderUrlMatchPatterns(sender: chrome.runtime.MessageSender) { + return new Set([ + ...this.generateMatchPatterns(sender.url), + ...this.generateMatchPatterns(sender.tab.url), + ]); + } + + /** + * Generates the origin and subdomain match patterns for the URL. + * + * @param url - The URL of the tab + */ + private generateMatchPatterns(url: string): string[] { + try { + if (!url.startsWith("http")) { + url = `https://${url}`; + } + + const originMatchPattern = `${new URL(url).origin}/*`; + + const parsedUrl = new URL(url); + const splitHost = parsedUrl.hostname.split("."); + const domain = splitHost.slice(-2).join("."); + const subDomainMatchPattern = `${parsedUrl.protocol}//*.${domain}/*`; + + return [originMatchPattern, subDomainMatchPattern]; + } catch { + return []; + } + } + + /** + * Stores the login form data that was modified by the user in the content script. This data is + * used to trigger the add login or change password notification when the form is submitted. + * + * @param message - The message from the content script + * @param sender - The sender of the message + */ + private storeModifiedLoginFormData = ( + message: OverlayNotificationsExtensionMessage, + sender: chrome.runtime.MessageSender, + ) => { + const { uri, username, password, newPassword } = message; + if (!username && !password && !newPassword) { + return; + } + + this.clearLoginCipherFormDataSubject.next(); + const formData = { uri, username, password, newPassword }; + + const existingModifyLoginData = this.modifyLoginCipherFormData.get(sender.tab.id); + if (existingModifyLoginData) { + formData.username = formData.username || existingModifyLoginData.username; + formData.password = formData.password || existingModifyLoginData.password; + formData.newPassword = formData.newPassword || existingModifyLoginData.newPassword; + } + + this.modifyLoginCipherFormData.set(sender.tab.id, formData); + }; + + /** + * Determines if the sender of the message is from an excluded domain. This is used to prevent the + * add login or change password notification from being triggered on the user's vault domain or + * other excluded domains. + * + * @param sender - The sender of the message + */ + private async isSenderFromExcludedDomain(sender: chrome.runtime.MessageSender): Promise { + try { + const senderOrigin = sender.origin; + const serverConfig = await this.notificationBackground.getActiveUserServerConfig(); + const activeUserVault = serverConfig?.environment?.vault; + if (activeUserVault === senderOrigin) { + return true; + } + + const excludedDomains = await this.notificationBackground.getExcludedDomains(); + if (!excludedDomains) { + return false; + } + + const senderDomain = new URL(senderOrigin).hostname; + return excludedDomains[senderDomain] !== undefined; + } catch { + return true; + } + } + + /** + * Removes and resets the onBeforeRequest and onCompleted listeners for web requests. This ensures + * that we are only listening for form submission requests on the tabs that have fillable form fields. + */ + private setupWebRequestsListeners() { + chrome.webRequest.onBeforeRequest.removeListener(this.handleOnBeforeRequestEvent); + chrome.webRequest.onCompleted.removeListener(this.handleOnCompletedRequestEvent); + if (this.websiteOriginsWithFields.size) { + const requestFilter: chrome.webRequest.RequestFilter = this.generateRequestFilter(); + chrome.webRequest.onBeforeRequest.addListener(this.handleOnBeforeRequestEvent, requestFilter); + chrome.webRequest.onCompleted.addListener(this.handleOnCompletedRequestEvent, requestFilter); + } + } + + /** + * Generates the request filter for the web requests. This is used to filter out the web requests + * that are not from the tabs that have fillable form fields. + */ + private generateRequestFilter(): chrome.webRequest.RequestFilter { + const websiteOrigins = Array.from(this.websiteOriginsWithFields.values()); + const urls: string[] = []; + websiteOrigins.forEach((origins) => urls.push(...origins)); + return { + urls, + types: ["main_frame", "sub_frame", "xmlhttprequest"], + }; + } + + /** + * Handles the onBeforeRequest event for web requests. This is used to ensures that the following + * onCompleted event is only triggered for form submission requests. + * + * @param details - The details of the web request + */ + private handleOnBeforeRequestEvent = (details: chrome.webRequest.WebRequestDetails) => { + if (this.isPostSubmissionFormRedirection(details)) { + this.setupNotificationInitTrigger( + details.tabId, + details.requestId, + this.modifyLoginCipherFormData.get(details.tabId), + ).catch((error) => this.logService.error(error)); + + return; + } + + if (!this.isValidFormSubmissionRequest(details)) { + return; + } + + const { requestId, tabId, frameId } = details; + this.activeFormSubmissionRequests.add(requestId); + + if (this.notificationDataIncompleteOnBeforeRequest(tabId)) { + this.getFormFieldDataFromTab(tabId, frameId).catch((error) => this.logService.error(error)); + } + }; + + /** + * Captures the modified login form data if the tab contains incomplete data. This is used as + * a redundancy to ensure that the modified login form data is captured in cases where the form + * is split into multiple parts. + * + * @param tabId - The id of the tab + */ + private notificationDataIncompleteOnBeforeRequest = (tabId: number) => { + const modifyLoginData = this.modifyLoginCipherFormData.get(tabId); + return ( + !modifyLoginData || + !this.shouldTriggerAddLoginNotification(modifyLoginData) || + !this.shouldTriggerChangePasswordNotification(modifyLoginData) + ); + }; + + /** + * Determines whether the request is happening after a form submission. This is identified by a GET + * request that is triggered after a form submission POST request from the same request id. If + * this is the case, and the modified login form data is available, the add login or change password + * notification is triggered. + * + * @param details - The details of the web request + */ + private isPostSubmissionFormRedirection = (details: chrome.webRequest.WebRequestDetails) => { + return ( + details.method?.toUpperCase() === "GET" && + this.activeFormSubmissionRequests.has(details.requestId) && + this.modifyLoginCipherFormData.has(details.tabId) + ); + }; + + /** + * Determines if the web request is a valid form submission request. A valid web request + * is a POST, PUT, or PATCH request that is not from an invalid host. + * + * @param details - The details of the web request + */ + private isValidFormSubmissionRequest = (details: chrome.webRequest.WebRequestDetails) => { + return ( + !this.requestHostIsInvalid(details) && + this.formSubmissionRequestMethods.has(details.method?.toUpperCase()) + ); + }; + + /** + * Retrieves the form field data from the tab. This is used to get the modified login form data + * in cases where the submit button is not clicked, but the form is submitted through other means. + * + * @param tabId - The senders tab id + * @param frameId - The frame where the form is located + */ + private getFormFieldDataFromTab = async (tabId: number, frameId: number) => { + const tab = await BrowserApi.getTab(tabId); + if (!tab) { + return; + } + + const response = (await BrowserApi.tabSendMessage( + tab, + { command: "getFormFieldDataForNotification" }, + { frameId }, + )) as OverlayNotificationsExtensionMessage; + if (response) { + this.storeModifiedLoginFormData(response, { tab }); + } + }; + + /** + * Handles the onCompleted event for web requests. This is used to trigger the add login or change + * password notification when a form submission request is completed. + * + * @param details - The details of the web response + */ + private handleOnCompletedRequestEvent = async (details: chrome.webRequest.WebResponseDetails) => { + if ( + this.requestHostIsInvalid(details) || + this.isInvalidStatusCode(details.statusCode) || + !this.activeFormSubmissionRequests.has(details.requestId) + ) { + return; + } + + const modifyLoginData = this.modifyLoginCipherFormData.get(details.tabId); + if (!modifyLoginData) { + return; + } + + this.setupNotificationInitTrigger(details.tabId, details.requestId, modifyLoginData).catch( + (error) => this.logService.error(error), + ); + }; + + /** + * Sets up the initialization trigger for the add login or change password notification. This is used + * to ensure that the notification is triggered after the tab has finished loading. + * + * @param tabId - The id of the tab + * @param requestId - The request id of the web request + * @param modifyLoginData - The modified login form data + */ + private setupNotificationInitTrigger = async ( + tabId: number, + requestId: string, + modifyLoginData: ModifyLoginCipherFormData, + ) => { + const tab = await BrowserApi.getTab(tabId); + if (tab.status !== "complete") { + await this.delayNotificationInitUntilTabIsComplete(tabId, requestId, modifyLoginData); + return; + } + + await this.triggerNotificationInit(requestId, modifyLoginData, tab); + }; + + /** + * Delays the initialization of the add login or change password notification + * until the tab is complete. This is used to ensure that the notification is + * triggered after the tab has finished loading. + * + * @param tabId - The id of the tab + * @param requestId - The request id of the web request + * @param modifyLoginData - The modified login form data + */ + private delayNotificationInitUntilTabIsComplete = async ( + tabId: chrome.webRequest.ResourceRequest["tabId"], + requestId: chrome.webRequest.ResourceRequest["requestId"], + modifyLoginData: ModifyLoginCipherFormData, + ) => { + const handleWebNavigationOnCompleted = async () => { + chrome.webNavigation.onCompleted.removeListener(handleWebNavigationOnCompleted); + const tab = await BrowserApi.getTab(tabId); + await this.triggerNotificationInit(requestId, modifyLoginData, tab); + }; + chrome.webNavigation.onCompleted.addListener(handleWebNavigationOnCompleted); + }; + + /** + * Initializes the add login or change password notification based on the modified login form data + * and the tab details. This will trigger the notification to be displayed to the user. + * + * @param requestId - The details of the web response + * @param modifyLoginData - The modified login form data + * @param tab - The tab details + */ + private triggerNotificationInit = async ( + requestId: chrome.webRequest.ResourceRequest["requestId"], + modifyLoginData: ModifyLoginCipherFormData, + tab: chrome.tabs.Tab, + ) => { + if (this.shouldTriggerChangePasswordNotification(modifyLoginData)) { + // These notifications are temporarily setup as "messages" to the notification background. + // This will be structured differently in a future refactor. + await this.notificationBackground.changedPassword( + { + command: "bgChangedPassword", + data: { + url: modifyLoginData.uri, + currentPassword: modifyLoginData.password, + newPassword: modifyLoginData.newPassword, + }, + }, + { tab }, + ); + this.clearCompletedWebRequest(requestId, tab); + return; + } + + if (this.shouldTriggerAddLoginNotification(modifyLoginData)) { + await this.notificationBackground.addLogin( + { + command: "bgAddLogin", + login: { + url: modifyLoginData.uri, + username: modifyLoginData.username, + password: modifyLoginData.password || modifyLoginData.newPassword, + }, + }, + { tab }, + ); + this.clearCompletedWebRequest(requestId, tab); + } + }; + + /** + * Determines if the change password notification should be triggered. + * + * @param modifyLoginData - The modified login form data + */ + private shouldTriggerChangePasswordNotification = ( + modifyLoginData: ModifyLoginCipherFormData, + ) => { + return modifyLoginData.newPassword && !modifyLoginData.username; + }; + + /** + * Determines if the add login notification should be triggered. + * + * @param modifyLoginData - The modified login form data + */ + private shouldTriggerAddLoginNotification = (modifyLoginData: ModifyLoginCipherFormData) => { + return modifyLoginData.username && (modifyLoginData.password || modifyLoginData.newPassword); + }; + + /** + * Clears the completed web request and removes the modified login form data for the tab. + * + * @param requestId - The request id of the web request + * @param tab - The tab details + */ + private clearCompletedWebRequest = ( + requestId: chrome.webRequest.ResourceRequest["requestId"], + tab: chrome.tabs.Tab, + ) => { + this.activeFormSubmissionRequests.delete(requestId); + this.modifyLoginCipherFormData.delete(tab.id); + this.websiteOriginsWithFields.delete(tab.id); + this.setupWebRequestsListeners(); + }; + + /** + * Determines if the status code of the web response is invalid. An invalid status code is + * any status code that is not in the 200-299 range. + * + * @param statusCode - The status code of the web response + */ + private isInvalidStatusCode = (statusCode: number) => { + return statusCode < 200 || statusCode >= 300; + }; + + /** + * Determines if the host of the web request is invalid. An invalid host is any host that does not + * start with "http" or a tab id that is less than 0. + * + * @param details - The details of the web request + */ + private requestHostIsInvalid = (details: chrome.webRequest.ResourceRequest) => { + return !details.url?.startsWith("http") || details.tabId < 0; + }; + + /** + * Sets up the listeners for the extension messages and the tab events. + */ + private setupExtensionListeners() { + BrowserApi.messageListener("overlay-notifications", this.handleExtensionMessage); + chrome.tabs.onRemoved.addListener(this.handleTabRemoved); + chrome.tabs.onUpdated.addListener(this.handleTabUpdated); + } + + /** + * Handles messages that are sent to the extension background. + * + * @param message - The message from the content script + * @param sender - The sender of the message + * @param sendResponse - The response to send back to the content script + */ + private handleExtensionMessage = ( + message: OverlayNotificationsExtensionMessage, + sender: chrome.runtime.MessageSender, + sendResponse: (response?: any) => void, + ) => { + const handler: CallableFunction = this.extensionMessageHandlers[message.command]; + if (!handler) { + return null; + } + + const messageResponse = handler({ message, sender }); + if (typeof messageResponse === "undefined") { + return null; + } + + Promise.resolve(messageResponse) + .then((response) => sendResponse(response)) + .catch((error) => this.logService.error(error)); + return true; + }; + + /** + * Handles the removal of a tab. This is used to remove the modified login form data for the tab. + * + * @param tabId - The id of the tab that was removed + */ + private handleTabRemoved = (tabId: number) => { + this.modifyLoginCipherFormData.delete(tabId); + if (this.websiteOriginsWithFields.has(tabId)) { + this.websiteOriginsWithFields.delete(tabId); + this.setupWebRequestsListeners(); + } + }; + + /** + * Handles the update of a tab. This is used to remove the modified + * login form data for the tab when the tab is loading. + * + * @param tabId - The id of the tab that was updated + * @param changeInfo - The change info of the tab + */ + private handleTabUpdated = (tabId: number, changeInfo: chrome.tabs.TabChangeInfo) => { + if (changeInfo.status === "loading" && this.websiteOriginsWithFields.has(tabId)) { + this.websiteOriginsWithFields.delete(tabId); + } + }; +} diff --git a/apps/browser/src/autofill/content/auto-submit-login.spec.ts b/apps/browser/src/autofill/content/auto-submit-login.spec.ts index d8a192dbcab..98caee3d363 100644 --- a/apps/browser/src/autofill/content/auto-submit-login.spec.ts +++ b/apps/browser/src/autofill/content/auto-submit-login.spec.ts @@ -12,6 +12,16 @@ let pageDetailsMock: AutofillPageDetails; let fillScriptMock: AutofillScript; let autofillFieldElementByOpidMock: FormFieldElement; +jest.mock("../services/dom-query.service", () => { + const module = jest.requireActual("../services/dom-query.service"); + return { + DomQueryService: class extends module.DomQueryService { + deepQueryElements(element: HTMLElement, queryString: string): T[] { + return Array.from(element.querySelectorAll(queryString)) as T[]; + } + }, + }; +}); jest.mock("../services/collect-autofill-content.service", () => { const module = jest.requireActual("../services/collect-autofill-content.service"); return { @@ -20,10 +30,6 @@ jest.mock("../services/collect-autofill-content.service", () => { return pageDetailsMock; } - deepQueryElements(element: HTMLElement, queryString: string): T[] { - return Array.from(element.querySelectorAll(queryString)) as T[]; - } - getAutofillFieldElementByOpid(opid: string) { const mockedEl = autofillFieldElementByOpidMock; if (mockedEl) { diff --git a/apps/browser/src/autofill/content/auto-submit-login.ts b/apps/browser/src/autofill/content/auto-submit-login.ts index 9cc06f874e6..19ffac61bcf 100644 --- a/apps/browser/src/autofill/content/auto-submit-login.ts +++ b/apps/browser/src/autofill/content/auto-submit-login.ts @@ -4,13 +4,16 @@ import AutofillPageDetails from "../models/autofill-page-details"; import AutofillScript from "../models/autofill-script"; import { CollectAutofillContentService } from "../services/collect-autofill-content.service"; import DomElementVisibilityService from "../services/dom-element-visibility.service"; +import { DomQueryService } from "../services/dom-query.service"; import InsertAutofillContentService from "../services/insert-autofill-content.service"; import { elementIsInputElement, nodeIsFormElement, sendExtensionMessage } from "../utils"; (function (globalContext) { + const domQueryService = new DomQueryService(); const domElementVisibilityService = new DomElementVisibilityService(); const collectAutofillContentService = new CollectAutofillContentService( domElementVisibilityService, + domQueryService, ); const insertAutofillContentService = new InsertAutofillContentService( domElementVisibilityService, @@ -191,7 +194,7 @@ import { elementIsInputElement, nodeIsFormElement, sendExtensionMessage } from " element: HTMLElement, lastFieldIsPasswordInput = false, ): boolean { - const genericSubmitElement = collectAutofillContentService.deepQueryElements( + const genericSubmitElement = domQueryService.deepQueryElements( element, "[type='submit']", ); @@ -200,10 +203,7 @@ import { elementIsInputElement, nodeIsFormElement, sendExtensionMessage } from " return true; } - const buttons = collectAutofillContentService.deepQueryElements( - element, - "button", - ); + const buttons = domQueryService.deepQueryElements(element, "button"); for (let i = 0; i < buttons.length; i++) { if (isLoginButton(buttons[i])) { clickSubmitElement(buttons[i], lastFieldIsPasswordInput); @@ -274,7 +274,7 @@ import { elementIsInputElement, nodeIsFormElement, sendExtensionMessage } from " */ function getAutofillFormElements(): HTMLFormElement[] { const formElements: HTMLFormElement[] = []; - collectAutofillContentService.queryAllTreeWalkerNodes( + domQueryService.queryAllTreeWalkerNodes( globalContext.document.documentElement, (node: Node) => { if (nodeIsFormElement(node)) { diff --git a/apps/browser/src/autofill/content/autofill-init.spec.ts b/apps/browser/src/autofill/content/autofill-init.spec.ts index e27e8ef73d0..ebfbda75b56 100644 --- a/apps/browser/src/autofill/content/autofill-init.spec.ts +++ b/apps/browser/src/autofill/content/autofill-init.spec.ts @@ -3,6 +3,8 @@ import { mock, MockProxy } from "jest-mock-extended"; import AutofillPageDetails from "../models/autofill-page-details"; import AutofillScript from "../models/autofill-script"; import { AutofillInlineMenuContentService } from "../overlay/inline-menu/content/autofill-inline-menu-content.service"; +import { OverlayNotificationsContentService } from "../overlay/notifications/abstractions/overlay-notifications-content.service"; +import { DomQueryService } from "../services/abstractions/dom-query.service"; import { AutofillOverlayContentService } from "../services/autofill-overlay-content.service"; import { flushPromises, @@ -14,6 +16,8 @@ import { AutofillExtensionMessage } from "./abstractions/autofill-init"; import AutofillInit from "./autofill-init"; describe("AutofillInit", () => { + let domQueryService: MockProxy; + let overlayNotificationsContentService: MockProxy; let inlineMenuElements: MockProxy; let autofillOverlayContentService: MockProxy; let autofillInit: AutofillInit; @@ -27,9 +31,16 @@ describe("AutofillInit", () => { addListener: jest.fn(), }, }); + domQueryService = mock(); + overlayNotificationsContentService = mock(); inlineMenuElements = mock(); autofillOverlayContentService = mock(); - autofillInit = new AutofillInit(autofillOverlayContentService, inlineMenuElements); + autofillInit = new AutofillInit( + domQueryService, + autofillOverlayContentService, + inlineMenuElements, + overlayNotificationsContentService, + ); sendExtensionMessageSpy = jest .spyOn(autofillInit as any, "sendExtensionMessage") .mockImplementation(); @@ -171,6 +182,16 @@ describe("AutofillInit", () => { expect(inlineMenuElements.messageHandlers.messageHandler).toHaveBeenCalled(); }); + it("triggers extension message handlers from the OverlayNotificationsContentService", () => { + overlayNotificationsContentService.messageHandlers.messageHandler = jest.fn(); + + sendMockExtensionMessage({ command: "messageHandler" }, sender, sendResponse); + + expect( + overlayNotificationsContentService.messageHandlers.messageHandler, + ).toHaveBeenCalled(); + }); + describe("collectPageDetails", () => { it("sends the collected page details for autofill using a background script message", async () => { const pageDetails: AutofillPageDetails = { diff --git a/apps/browser/src/autofill/content/autofill-init.ts b/apps/browser/src/autofill/content/autofill-init.ts index e44956e1849..c0cbac3ae67 100644 --- a/apps/browser/src/autofill/content/autofill-init.ts +++ b/apps/browser/src/autofill/content/autofill-init.ts @@ -2,7 +2,9 @@ import { EVENTS } from "@bitwarden/common/autofill/constants"; import AutofillPageDetails from "../models/autofill-page-details"; import { AutofillInlineMenuContentService } from "../overlay/inline-menu/abstractions/autofill-inline-menu-content.service"; +import { OverlayNotificationsContentService } from "../overlay/notifications/abstractions/overlay-notifications-content.service"; import { AutofillOverlayContentService } from "../services/abstractions/autofill-overlay-content.service"; +import { DomQueryService } from "../services/abstractions/dom-query.service"; import { CollectAutofillContentService } from "../services/collect-autofill-content.service"; import DomElementVisibilityService from "../services/dom-element-visibility.service"; import InsertAutofillContentService from "../services/insert-autofill-content.service"; @@ -16,8 +18,6 @@ import { class AutofillInit implements AutofillInitInterface { private readonly sendExtensionMessage = sendExtensionMessage; - private readonly autofillOverlayContentService: AutofillOverlayContentService | undefined; - private readonly autofillInlineMenuContentService: AutofillInlineMenuContentService | undefined; private readonly domElementVisibilityService: DomElementVisibilityService; private readonly collectAutofillContentService: CollectAutofillContentService; private readonly insertAutofillContentService: InsertAutofillContentService; @@ -32,20 +32,23 @@ class AutofillInit implements AutofillInitInterface { * AutofillInit constructor. Initializes the DomElementVisibilityService, * CollectAutofillContentService and InsertAutofillContentService classes. * + * @param domQueryService - Service used to handle DOM queries. * @param autofillOverlayContentService - The autofill overlay content service, potentially undefined. - * @param inlineMenuElements - The inline menu elements, potentially undefined. + * @param autofillInlineMenuContentService - The inline menu content service, potentially undefined. + * @param overlayNotificationsContentService - The overlay notifications content service, potentially undefined. */ constructor( - autofillOverlayContentService?: AutofillOverlayContentService, - inlineMenuElements?: AutofillInlineMenuContentService, + private domQueryService: DomQueryService, + private autofillOverlayContentService?: AutofillOverlayContentService, + private autofillInlineMenuContentService?: AutofillInlineMenuContentService, + private overlayNotificationsContentService?: OverlayNotificationsContentService, ) { - this.autofillOverlayContentService = autofillOverlayContentService; - this.autofillInlineMenuContentService = inlineMenuElements; this.domElementVisibilityService = new DomElementVisibilityService( this.autofillInlineMenuContentService, ); this.collectAutofillContentService = new CollectAutofillContentService( this.domElementVisibilityService, + domQueryService, this.autofillOverlayContentService, ); this.insertAutofillContentService = new InsertAutofillContentService( @@ -204,6 +207,10 @@ class AutofillInit implements AutofillInitInterface { return this.autofillInlineMenuContentService.messageHandlers[command]; } + if (this.overlayNotificationsContentService?.messageHandlers?.[command]) { + return this.overlayNotificationsContentService.messageHandlers[command]; + } + return this.extensionMessageHandlers[command]; } @@ -217,6 +224,7 @@ class AutofillInit implements AutofillInitInterface { this.collectAutofillContentService.destroy(); this.autofillOverlayContentService?.destroy(); this.autofillInlineMenuContentService?.destroy(); + this.overlayNotificationsContentService?.destroy(); } } diff --git a/apps/browser/src/autofill/content/bootstrap-autofill-overlay-menu.ts b/apps/browser/src/autofill/content/bootstrap-autofill-overlay-menu.ts new file mode 100644 index 00000000000..aed0f6cb940 --- /dev/null +++ b/apps/browser/src/autofill/content/bootstrap-autofill-overlay-menu.ts @@ -0,0 +1,30 @@ +import { AutofillInlineMenuContentService } from "../overlay/inline-menu/content/autofill-inline-menu-content.service"; +import { AutofillOverlayContentService } from "../services/autofill-overlay-content.service"; +import { DomQueryService } from "../services/dom-query.service"; +import { InlineMenuFieldQualificationService } from "../services/inline-menu-field-qualification.service"; +import { setupAutofillInitDisconnectAction } from "../utils"; + +import AutofillInit from "./autofill-init"; + +(function (windowContext) { + if (!windowContext.bitwardenAutofillInit) { + const domQueryService = new DomQueryService(); + const inlineMenuFieldQualificationService = new InlineMenuFieldQualificationService(); + const autofillOverlayContentService = new AutofillOverlayContentService( + domQueryService, + inlineMenuFieldQualificationService, + ); + let inlineMenuElements: AutofillInlineMenuContentService; + if (globalThis.self === globalThis.top) { + inlineMenuElements = new AutofillInlineMenuContentService(); + } + windowContext.bitwardenAutofillInit = new AutofillInit( + domQueryService, + autofillOverlayContentService, + inlineMenuElements, + ); + setupAutofillInitDisconnectAction(windowContext); + + windowContext.bitwardenAutofillInit.init(); + } +})(window); diff --git a/apps/browser/src/autofill/content/bootstrap-autofill-overlay-notifications.ts b/apps/browser/src/autofill/content/bootstrap-autofill-overlay-notifications.ts new file mode 100644 index 00000000000..0a810c68f56 --- /dev/null +++ b/apps/browser/src/autofill/content/bootstrap-autofill-overlay-notifications.ts @@ -0,0 +1,33 @@ +import { OverlayNotificationsContentService } from "../overlay/notifications/content/overlay-notifications-content.service"; +import { AutofillOverlayContentService } from "../services/autofill-overlay-content.service"; +import { DomQueryService } from "../services/dom-query.service"; +import { InlineMenuFieldQualificationService } from "../services/inline-menu-field-qualification.service"; +import { setupAutofillInitDisconnectAction } from "../utils"; + +import AutofillInit from "./autofill-init"; + +(function (windowContext) { + if (!windowContext.bitwardenAutofillInit) { + const domQueryService = new DomQueryService(); + const inlineMenuFieldQualificationService = new InlineMenuFieldQualificationService(); + const autofillOverlayContentService = new AutofillOverlayContentService( + domQueryService, + inlineMenuFieldQualificationService, + ); + + let overlayNotificationsContentService: OverlayNotificationsContentService; + if (globalThis.self === globalThis.top) { + overlayNotificationsContentService = new OverlayNotificationsContentService(); + } + + windowContext.bitwardenAutofillInit = new AutofillInit( + domQueryService, + autofillOverlayContentService, + null, + overlayNotificationsContentService, + ); + setupAutofillInitDisconnectAction(windowContext); + + windowContext.bitwardenAutofillInit.init(); + } +})(window); diff --git a/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts b/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts index 22430227660..6df9397f6d8 100644 --- a/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts +++ b/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts @@ -1,5 +1,7 @@ import { AutofillInlineMenuContentService } from "../overlay/inline-menu/content/autofill-inline-menu-content.service"; +import { OverlayNotificationsContentService } from "../overlay/notifications/content/overlay-notifications-content.service"; import { AutofillOverlayContentService } from "../services/autofill-overlay-content.service"; +import { DomQueryService } from "../services/dom-query.service"; import { InlineMenuFieldQualificationService } from "../services/inline-menu-field-qualification.service"; import { setupAutofillInitDisconnectAction } from "../utils"; @@ -7,17 +9,25 @@ import AutofillInit from "./autofill-init"; (function (windowContext) { if (!windowContext.bitwardenAutofillInit) { + const domQueryService = new DomQueryService(); const inlineMenuFieldQualificationService = new InlineMenuFieldQualificationService(); const autofillOverlayContentService = new AutofillOverlayContentService( + domQueryService, inlineMenuFieldQualificationService, ); + let inlineMenuElements: AutofillInlineMenuContentService; + let overlayNotificationsContentService: OverlayNotificationsContentService; if (globalThis.self === globalThis.top) { inlineMenuElements = new AutofillInlineMenuContentService(); + overlayNotificationsContentService = new OverlayNotificationsContentService(); } + windowContext.bitwardenAutofillInit = new AutofillInit( + domQueryService, autofillOverlayContentService, inlineMenuElements, + overlayNotificationsContentService, ); setupAutofillInitDisconnectAction(windowContext); diff --git a/apps/browser/src/autofill/content/bootstrap-autofill.ts b/apps/browser/src/autofill/content/bootstrap-autofill.ts index f98d4bc1d72..3de750cd671 100644 --- a/apps/browser/src/autofill/content/bootstrap-autofill.ts +++ b/apps/browser/src/autofill/content/bootstrap-autofill.ts @@ -1,10 +1,12 @@ +import { DomQueryService } from "../services/dom-query.service"; import { setupAutofillInitDisconnectAction } from "../utils"; import AutofillInit from "./autofill-init"; (function (windowContext) { if (!windowContext.bitwardenAutofillInit) { - windowContext.bitwardenAutofillInit = new AutofillInit(); + const domQueryService = new DomQueryService(); + windowContext.bitwardenAutofillInit = new AutofillInit(domQueryService); setupAutofillInitDisconnectAction(windowContext); windowContext.bitwardenAutofillInit.init(); diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts index 2bcf4394fd9..5217ebbe8ed 100644 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ b/apps/browser/src/autofill/content/notification-bar.ts @@ -6,6 +6,7 @@ import { import AutofillField from "../models/autofill-field"; import { WatchedForm } from "../models/watched-form"; import { NotificationBarIframeInitData } from "../notification/abstractions/notification-bar"; +import { NotificationTypeData } from "../overlay/notifications/abstractions/overlay-notifications-content.service"; import { FormData } from "../services/abstractions/autofill.service"; import { sendExtensionMessage, setupExtensionDisconnectAction } from "../utils"; @@ -832,7 +833,7 @@ async function loadNotificationBar() { // End Form Detection and Submission Handling // Notification Bar Functions (open, close, height adjustment, etc.) - function closeExistingAndOpenBar(type: string, typeData: any) { + function closeExistingAndOpenBar(type: string, typeData: NotificationTypeData) { const notificationBarInitData: NotificationBarIframeInitData = { type, isVaultLocked: typeData.isVaultLocked, diff --git a/apps/browser/src/autofill/deprecated/content/autofill-init.deprecated.ts b/apps/browser/src/autofill/deprecated/content/autofill-init.deprecated.ts index 211e3bf9251..b3ee2637b09 100644 --- a/apps/browser/src/autofill/deprecated/content/autofill-init.deprecated.ts +++ b/apps/browser/src/autofill/deprecated/content/autofill-init.deprecated.ts @@ -2,6 +2,7 @@ import { AutofillInit } from "../../content/abstractions/autofill-init"; import AutofillPageDetails from "../../models/autofill-page-details"; import { CollectAutofillContentService } from "../../services/collect-autofill-content.service"; import DomElementVisibilityService from "../../services/dom-element-visibility.service"; +import { DomQueryService } from "../../services/dom-query.service"; import InsertAutofillContentService from "../../services/insert-autofill-content.service"; import { sendExtensionMessage } from "../../utils"; import { LegacyAutofillOverlayContentService } from "../services/abstractions/autofill-overlay-content.service"; @@ -40,8 +41,10 @@ class LegacyAutofillInit implements AutofillInit { constructor(autofillOverlayContentService?: LegacyAutofillOverlayContentService) { this.autofillOverlayContentService = autofillOverlayContentService; this.domElementVisibilityService = new DomElementVisibilityService(); + const domQueryService = new DomQueryService(); this.collectAutofillContentService = new CollectAutofillContentService( this.domElementVisibilityService, + domQueryService, this.autofillOverlayContentService, ); this.insertAutofillContentService = new InsertAutofillContentService( diff --git a/apps/browser/src/autofill/deprecated/services/autofill-overlay-content.service.deprecated.ts b/apps/browser/src/autofill/deprecated/services/autofill-overlay-content.service.deprecated.ts index 6526f6993db..87af2518ddc 100644 --- a/apps/browser/src/autofill/deprecated/services/autofill-overlay-content.service.deprecated.ts +++ b/apps/browser/src/autofill/deprecated/services/autofill-overlay-content.service.deprecated.ts @@ -73,7 +73,7 @@ class LegacyAutofillOverlayContentService implements LegacyAutofillOverlayConten * Satisfy the AutofillOverlayContentService interface. */ messageHandlers = {} as AutofillOverlayContentExtensionMessageHandlers; - async setupInlineMenu( + async setupOverlayListeners( autofillFieldElement: ElementWithOpId, autofillFieldData: AutofillField, pageDetails: AutofillPageDetails, diff --git a/apps/browser/src/autofill/enums/autofill-field.enums.ts b/apps/browser/src/autofill/enums/autofill-field.enums.ts index 4fd7c0fe88f..68408f2b671 100644 --- a/apps/browser/src/autofill/enums/autofill-field.enums.ts +++ b/apps/browser/src/autofill/enums/autofill-field.enums.ts @@ -1,5 +1,6 @@ export const AutofillFieldQualifier = { password: "password", + newPassword: "newPassword", username: "username", cardholderName: "cardholderName", cardNumber: "cardNumber", diff --git a/apps/browser/src/autofill/notification/abstractions/notification-bar.ts b/apps/browser/src/autofill/notification/abstractions/notification-bar.ts index 268617c419e..6dfcac4abea 100644 --- a/apps/browser/src/autofill/notification/abstractions/notification-bar.ts +++ b/apps/browser/src/autofill/notification/abstractions/notification-bar.ts @@ -4,6 +4,8 @@ type NotificationBarIframeInitData = { theme?: string; removeIndividualVault?: boolean; importType?: string; + applyRedesign?: boolean; + launchTimestamp?: number; }; type NotificationBarWindowMessage = { diff --git a/apps/browser/src/autofill/notification/bar.html b/apps/browser/src/autofill/notification/bar.html index 26d9d7086d4..6b0e76b5169 100644 --- a/apps/browser/src/autofill/notification/bar.html +++ b/apps/browser/src/autofill/notification/bar.html @@ -13,16 +13,11 @@
-
+
@@ -32,8 +27,8 @@