diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index df099efa1d6..e2514433942 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -81,7 +81,9 @@ bitwarden_license/bit-web/src/app/billing @bitwarden/team-billing-dev apps/browser/src/platform @bitwarden/team-platform-dev apps/cli/src/platform @bitwarden/team-platform-dev apps/desktop/macos @bitwarden/team-platform-dev +apps/desktop/scripts @bitwarden/team-platform-dev apps/desktop/src/platform @bitwarden/team-platform-dev +apps/desktop/resources @bitwarden/team-platform-dev apps/web/src/app/platform @bitwarden/team-platform-dev libs/angular/src/platform @bitwarden/team-platform-dev libs/common/src/platform @bitwarden/team-platform-dev @@ -140,6 +142,7 @@ libs/components @bitwarden/team-ui-foundation libs/ui @bitwarden/team-ui-foundation apps/browser/src/platform/popup/layout @bitwarden/team-ui-foundation apps/browser/src/popup/app-routing.animations.ts @bitwarden/team-ui-foundation +apps/browser/src/popup/components/extension-anon-layout-wrapper @bitwarden/team-ui-foundation apps/web/src/app/layouts @bitwarden/team-ui-foundation diff --git a/.github/ISSUE_TEMPLATE/browser.yml b/.github/ISSUE_TEMPLATE/browser.yml index 23a0e4276bf..6f5c9dd0051 100644 --- a/.github/ISSUE_TEMPLATE/browser.yml +++ b/.github/ISSUE_TEMPLATE/browser.yml @@ -1,4 +1,4 @@ -name: Browser Bug Report +name: Browser Extension Bug Report description: File a bug report labels: [bug, browser] body: diff --git a/.github/ISSUE_TEMPLATE/web.yml b/.github/ISSUE_TEMPLATE/web.yml index 80429112fbd..d7989e40af1 100644 --- a/.github/ISSUE_TEMPLATE/web.yml +++ b/.github/ISSUE_TEMPLATE/web.yml @@ -1,4 +1,4 @@ -name: Web Bug Report +name: Web App Bug Report description: File a bug report labels: [bug, web] body: @@ -77,6 +77,7 @@ body: - Opera - Brave - Vivaldi + - DuckDuckGo validations: required: true - type: input diff --git a/.github/workflows/auto-branch-updater.yml b/.github/workflows/auto-branch-updater.yml index dc4a43fc34e..3f67388fd0c 100644 --- a/.github/workflows/auto-branch-updater.yml +++ b/.github/workflows/auto-branch-updater.yml @@ -22,6 +22,8 @@ jobs: env: _BOT_EMAIL: 106330231+bitwarden-devops-bot@users.noreply.github.com _BOT_NAME: bitwarden-devops-bot + permissions: + contents: write steps: - name: Setup id: setup diff --git a/.github/workflows/auto-reply-discussions.yml b/.github/workflows/auto-reply-discussions.yml index 8becc7471c5..83970ab3619 100644 --- a/.github/workflows/auto-reply-discussions.yml +++ b/.github/workflows/auto-reply-discussions.yml @@ -8,6 +8,9 @@ jobs: reply: name: Auto-reply runs-on: ubuntu-22.04 + permissions: + discussions: write + contents: read steps: - name: Get discussion label and template name diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index f7b8eeabefe..ea113f8b9a5 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -41,6 +41,8 @@ defaults: run: shell: bash +permissions: {} + jobs: setup: name: Setup @@ -441,7 +443,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 + uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index fa9d7dc82a3..3e6c1937583 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -46,6 +46,9 @@ defaults: run: working-directory: apps/cli +permissions: + contents: read + jobs: setup: name: Setup @@ -168,13 +171,6 @@ jobs: exit 1 fi - - name: Create checksums Unix - run: | - cd ./dist - shasum -a 256 bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-${{ env._PACKAGE_VERSION }}.zip \ - | awk '{split($0, a); print a[1]}' > bw${{ - matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-sha256-${{ env._PACKAGE_VERSION }}.txt - - name: Upload unix zip asset uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: @@ -182,13 +178,6 @@ jobs: path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - - name: Upload unix checksum asset - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 - with: - name: bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-sha256-${{ env._PACKAGE_VERSION }}.txt - if-no-files-found: error - # We want to confirm the CLI is runnable using the dependencies defined in `apps/cli/package.json`. - name: Remove node_modules (root) run: rm -rf node_modules @@ -379,11 +368,6 @@ jobs: Throw "Version test failed." } - - name: Create checksums Windows - run: | - checksum -f="./dist/bw${{ matrix.license_type.artifact_prefix }}-windows-${env:_PACKAGE_VERSION}.zip" ` - -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@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: @@ -391,13 +375,6 @@ jobs: 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@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 - 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 - if-no-files-found: error - - name: Upload Chocolatey asset if: matrix.license_type.build_prefix == 'bit' uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 @@ -457,13 +434,6 @@ jobs: with: path: apps/cli/dist/snap - - name: Create checksum - run: | - cd dist/snap - ls -alth - sha256sum bw_${{ env._PACKAGE_VERSION }}_amd64.snap \ - | awk '{split($0, a); print a[1]}' > bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt - - name: Install Snap run: sudo snap install dist/snap/bw*.snap --dangerous @@ -488,13 +458,6 @@ jobs: 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@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 - with: - name: bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/snap/bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt - if-no-files-found: error - check-failures: name: Check for failures diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index fab0df693cb..a022fe7fd0f 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -46,6 +46,9 @@ defaults: run: shell: bash +permissions: + contents: read + jobs: electron-verify: name: Verify Electron Version @@ -425,7 +428,7 @@ jobs: - name: Install AST run: dotnet tool install --global AzureSignTool --version 4.0.1 - - name: Set up environmentF + - name: Set up environment run: choco install checksum --no-progress - name: Print environment @@ -499,7 +502,7 @@ jobs: run: | npm run pack:win - - name: Pack & Sign (dev) + - name: Pack & Sign if: ${{ needs.setup.outputs.has_secrets == 'true' }} env: ELECTRON_BUILDER_SIGN: 1 @@ -1413,7 +1416,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 + uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 019647f594a..745376b46d8 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -51,6 +51,8 @@ env: _AZ_REGISTRY: bitwardenprod.azurecr.io _GITHUB_PR_REPO_NAME: ${{ github.event.pull_request.head.repo.full_name }} +permissions: {} + jobs: setup: name: Setup @@ -351,7 +353,7 @@ jobs: secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 + uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/enforce-labels.yml b/.github/workflows/enforce-labels.yml index 40ddfe7739f..12a771fd3c0 100644 --- a/.github/workflows/enforce-labels.yml +++ b/.github/workflows/enforce-labels.yml @@ -4,6 +4,9 @@ on: workflow_call: pull_request: types: [labeled, unlabeled, opened, edited, synchronize] +permissions: + contents: read + pull-requests: read jobs: enforce-label: name: EnforceLabel diff --git a/.github/workflows/lint-crowdin-config.yml b/.github/workflows/lint-crowdin-config.yml new file mode 100644 index 00000000000..adb5950e3a0 --- /dev/null +++ b/.github/workflows/lint-crowdin-config.yml @@ -0,0 +1,45 @@ +name: Lint Crowdin Config + +on: + pull_request: + types: [opened, synchronize] + paths: + - '**/crowdin.yml' +permissions: {} + +jobs: + lint-crowdin-config: + name: Lint Crowdin Config ${{ matrix.app.name }} + runs-on: ubuntu-24.04 + strategy: + matrix: + app: [ + { name: 'web', project_id: '308189', config_path: 'apps/web/crowdin.yml' }, + { name: 'desktop', project_id: '299360', config_path: 'apps/desktop/crowdin.yml' }, + { name: 'browser', project_id: '268134', config_path: 'apps/browser/crowdin.yml' } + ] + steps: + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 1 + - name: Login to Azure + uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + with: + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "crowdin-api-token" + - name: Lint ${{ matrix.app.name }} config + uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CROWDIN_PROJECT_ID: ${{ matrix.app.project_id }} + CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} + with: + dryrun_action: true + command: 'config lint' + command_args: '--verbose -c ${{ matrix.app.config_path }}' \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4fbef027c7c..4246d623f04 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -22,6 +22,9 @@ defaults: run: shell: bash +permissions: + contents: read + jobs: lint: name: Lint diff --git a/.github/workflows/locales-lint.yml b/.github/workflows/locales-lint.yml index 8c9447ea50f..0c8148d4c28 100644 --- a/.github/workflows/locales-lint.yml +++ b/.github/workflows/locales-lint.yml @@ -8,6 +8,9 @@ on: paths: - '**/messages.json' +permissions: + contents: read + jobs: lint: name: Lint diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml index 498f8748959..ac79287f84d 100644 --- a/.github/workflows/release-browser.yml +++ b/.github/workflows/release-browser.yml @@ -22,6 +22,8 @@ jobs: setup: name: Setup runs-on: ubuntu-22.04 + permissions: + contents: read outputs: release_version: ${{ steps.version.outputs.version }} steps: @@ -53,6 +55,8 @@ jobs: name: Locales Test runs-on: ubuntu-22.04 needs: setup + permissions: + contents: read steps: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -89,6 +93,8 @@ jobs: needs: - setup - locales-test + permissions: + contents: write steps: - name: Download latest Release build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index 519fee1989b..31a16dc9a6d 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -18,6 +18,9 @@ defaults: run: working-directory: apps/cli +permissions: + contents: read + jobs: setup: name: Setup @@ -78,24 +81,15 @@ jobs: PKG_VERSION: ${{ needs.setup.outputs.release_version }} with: artifacts: "apps/cli/bw-oss-windows-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-oss-windows-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-windows-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-windows-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-oss-macos-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-oss-macos-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-oss-macos-arm64-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-oss-macos-arm64-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-macos-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-macos-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-macos-arm64-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-macos-arm64-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-oss-linux-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-oss-linux-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-linux-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-linux-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bitwarden-cli.${{ env.PKG_VERSION }}.nupkg, apps/cli/bw_${{ env.PKG_VERSION }}_amd64.snap, - apps/cli/bw-snap-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bitwarden-cli-${{ env.PKG_VERSION }}-npm-build.zip" commit: ${{ github.sha }} tag: cli-v${{ env.PKG_VERSION }} diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index 57143747a86..b3c3fe5d250 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -17,6 +17,9 @@ defaults: run: shell: bash +permissions: + contents: read + jobs: setup: name: Setup @@ -89,12 +92,6 @@ jobs: working-directory: apps/desktop/artifacts run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive - - name: Get checksum files - uses: bitwarden/gh-actions/get-checksum@main - with: - packages_dir: "apps/desktop/artifacts" - file_path: "apps/desktop/artifacts/sha256-checksums.txt" - - name: Create Release uses: ncipollo/release-action@cdcc88a9acf3ca41c16c37bb7d21b9ad48560d87 # v1.15.0 if: ${{ steps.release_channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' }} @@ -125,8 +122,7 @@ jobs: apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive, apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}.yml, apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}-linux.yml, - apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}-mac.yml, - apps/desktop/artifacts/sha256-checksums.txt" + apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}-mac.yml" commit: ${{ github.sha }} tag: desktop-v${{ env.PKG_VERSION }} name: Desktop v${{ env.PKG_VERSION }} diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 0301b814796..5a3c29d29fc 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -18,6 +18,8 @@ jobs: setup: name: Setup runs-on: ubuntu-22.04 + permissions: + contents: read outputs: release_version: ${{ steps.version.outputs.version }} tag_version: ${{ steps.version.outputs.tag }} @@ -50,6 +52,8 @@ jobs: runs-on: ubuntu-22.04 needs: - setup + permissions: + contents: write steps: - name: Download latest build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} diff --git a/.github/workflows/repository-management.yml b/.github/workflows/repository-management.yml index 8ab74adf543..d91e0a12afd 100644 --- a/.github/workflows/repository-management.yml +++ b/.github/workflows/repository-management.yml @@ -36,8 +36,7 @@ on: description: "New version override (leave blank for automatic calculation, example: '2024.1.0')" required: false type: string - - +permissions: {} jobs: setup: name: Setup @@ -57,51 +56,11 @@ jobs: fi echo "branch=$BRANCH" >> $GITHUB_OUTPUT - - - cut_branch: - name: Cut branch - if: ${{ needs.setup.outputs.branch == 'rc' }} - needs: setup - runs-on: ubuntu-24.04 - steps: - - name: Generate GH App token - uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 - id: app-token - with: - app-id: ${{ secrets.BW_GHAPP_ID }} - private-key: ${{ secrets.BW_GHAPP_KEY }} - - - name: Check out target ref - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - ref: ${{ inputs.target_ref }} - token: ${{ steps.app-token.outputs.token }} - - - name: Check if ${{ needs.setup.outputs.branch }} branch exists - env: - BRANCH_NAME: ${{ needs.setup.outputs.branch }} - run: | - if [[ $(git ls-remote --heads origin $BRANCH_NAME) ]]; then - echo "$BRANCH_NAME already exists! Please delete $BRANCH_NAME before running again." >> $GITHUB_STEP_SUMMARY - exit 1 - fi - - - name: Cut branch - env: - BRANCH_NAME: ${{ needs.setup.outputs.branch }} - run: | - git switch --quiet --create $BRANCH_NAME - git push --quiet --set-upstream origin $BRANCH_NAME - - bump_version: name: Bump Version if: ${{ always() }} runs-on: ubuntu-24.04 - needs: - - cut_branch - - setup + needs: setup outputs: version_browser: ${{ steps.set-final-version-output.outputs.version_browser }} version_cli: ${{ steps.set-final-version-output.outputs.version_cli }} @@ -441,15 +400,13 @@ jobs: - name: Push changes if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} run: git push - - - cherry_pick: - name: Cherry-Pick Commit(s) + cut_branch: + name: Cut branch if: ${{ needs.setup.outputs.branch == 'rc' }} - runs-on: ubuntu-24.04 needs: - - bump_version - setup + - bump_version + runs-on: ubuntu-24.04 steps: - name: Generate GH App token uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 @@ -458,43 +415,24 @@ jobs: app-id: ${{ secrets.BW_GHAPP_ID }} private-key: ${{ secrets.BW_GHAPP_KEY }} - - name: Check out main branch + - name: Check out target ref uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - fetch-depth: 0 - ref: main + ref: ${{ inputs.target_ref }} token: ${{ steps.app-token.outputs.token }} - - name: Configure Git + - name: Check if ${{ needs.setup.outputs.branch }} branch exists + env: + BRANCH_NAME: ${{ needs.setup.outputs.branch }} run: | - git config --local user.email "actions@github.com" - git config --local user.name "Github Actions" + if [[ $(git ls-remote --heads origin $BRANCH_NAME) ]]; then + echo "$BRANCH_NAME already exists! Please delete $BRANCH_NAME before running again." >> $GITHUB_STEP_SUMMARY + exit 1 + fi - - name: Perform cherry-pick(s) + - name: Cut branch + env: + BRANCH_NAME: ${{ needs.setup.outputs.branch }} run: | - # Function for cherry-picking - cherry_pick () { - local package_path="apps/$1/package.json" - local source_branch=$2 - local destination_branch=$3 - - # Get project commit/version from source branch - git switch $source_branch - SOURCE_COMMIT=$(git log --reverse --pretty=format:"%H" --max-count=1 $package_path) - SOURCE_VERSION=$(cat $package_path | jq -r '.version') - - # Get project commit/version from destination branch - git switch $destination_branch - DESTINATION_VERSION=$(cat $package_path | jq -r '.version') - - if [[ "$DESTINATION_VERSION" != "$SOURCE_VERSION" ]]; then - git cherry-pick --strategy-option=theirs -x $SOURCE_COMMIT - git push -u origin $destination_branch - fi - } - - # Cherry-pick from 'main' into 'rc' - cherry_pick browser main rc - cherry_pick cli main rc - cherry_pick desktop main rc - cherry_pick web main rc + git switch --quiet --create $BRANCH_NAME + git push --quiet --set-upstream origin $BRANCH_NAME \ No newline at end of file diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index abb292f53f3..13acde2b0fc 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -8,6 +8,11 @@ jobs: stale: name: 'Check for stale issues and PRs' runs-on: ubuntu-22.04 + permissions: + actions: write + contents: read + issues: write + pull-requests: write steps: - name: 'Run stale action' uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 64cc86f1db6..a8bfd368884 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,6 +10,8 @@ on: pull_request: types: [ opened, synchronize ] +permissions: {} + jobs: testing: @@ -134,7 +136,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install rust - uses: dtolnay/rust-toolchain@c5a29ddb4d9d194e7c84ec8c3fba61b1c31fee8c # stable + uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b # stable with: toolchain: stable components: llvm-tools diff --git a/apps/browser/package.json b/apps/browser/package.json index c44743add7c..9b6d0174b0f 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.5.1", + "version": "2025.6.0", "scripts": { "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index ad4ca0d4c42..85a535f2476 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "مفتاح SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "جديد $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "تعيين رمز PIN الخاص بك لإلغاء قفل Bitwarden. سيتم إعادة تعيين إعدادات PIN الخاصة بك إذا قمت بتسجيل الخروج بالكامل من التطبيق." }, - "setYourPinCode1": { - "message": "سيتم استخدام رَقَم التعريف الشخصي الخاص بك لفتح Bitwarden بدلاً من كلمة المرور الرئيسية. سيتم حذف رَقَم التعريف الشخصي الخاص بك إذا قمت بتسجيل الخروج بالكامل من Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "رمز PIN مطلوب." @@ -2515,6 +2518,10 @@ "change": { "message": "تغيير" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "تغيير كلمة المرور - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 2bf1226047d..5da9db4359c 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH açarı" }, + "typeNote": { + "message": "Not" + }, "newItemHeader": { "message": "Yeni $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Bitwarden-in kilidini açmaq üçün PIN kodunuzu ayarlayın. Tətbiqdən tam çıxış etdikdə PIN ayarlarınız sıfırlanacaq." }, - "setYourPinCode1": { - "message": "Bitwarden kilidini açmaq üçün ana parolunuzun əvəzinə PIN-iniz istifadə ediləcək. Bitwarden-dən tamamilə çıxış etdikdə PIN-iniz sıfırlanacaq." + "setPinCode": { + "message": "Bitwarden-in kilidini açmaq üçün bu PIN-i istifadə edə bilərsiniz. Tətbiqdən tam çıxış etsəniz, PIN-iniz sıfırlanacaq." }, "pinRequired": { "message": "PIN kod lazımdır." @@ -2515,6 +2518,10 @@ "change": { "message": "Dəyişdir" }, + "changePassword": { + "message": "Parolu dəyişdir", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Parolu dəyişdir - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Riskli parollar" + }, "atRiskPasswords": { "message": "Riskli parollar" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Bu saytdakı parolunuz risk altındadır. $ORGANIZATION$ onu dəyişdirməyinizi tələb edir.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$, bu parolun risk altında olduğu üçün dəyişdirməyinizi istəyir. Parolu dəyişdirmək üçün hesabınızın ayarlarına gedin.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Riskli bir parolu incələ və dəyişdir" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "PIN ilə kilid açma təyini" }, + "unlockBiometricSet": { + "message": "Biometrik ilə kilidi aç ayarı" + }, "authenticating": { "message": "Kimlik doğrulama" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Bu səhifəyə baxmaq icazəniz yoxdur. Fərqli hesabla giriş etməyə çalışın." + }, + "wasmNotSupported": { + "message": "WebAssembly brauzerinizdə dəstəklənmir və ya fəal deyil. WebAssembly, Bitwarden tətbiqini istifadə etmək üçün tələb olunur.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 93314ce58de..7ec00e7432d 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Ключ SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Новы $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Прызначце PIN-код для разблакіроўкі Bitwarden. Налады PIN-кода будуць скінуты, калі вы калі-небудзь цалкам выйдзеце з праграмы." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Патрабуецца PIN-код." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index 02e96f18bbc..32c566db779 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH ключ" }, + "typeNote": { + "message": "Бележка" + }, "newItemHeader": { "message": "Ново $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Задайте ПИН за отключване на Bitwarden. Настройките за ПИН се изчистват при всяко пълно излизане от програмата." }, - "setYourPinCode1": { - "message": "Вашият ПИН ще бъде ползван за отключване на Битуорден, вместо главната парола. Той ще бъде нулиран, ако някога се отпишете напълно от Битуорден." + "setPinCode": { + "message": "Може да използвате този ПИН за отключване на Битуорден. Вашият ПИН ще се нулира ако в някакъв момент се отпишете напълно от приложението." }, "pinRequired": { "message": "Необходим е ПИН." @@ -2515,6 +2518,10 @@ "change": { "message": "Промяна" }, + "changePassword": { + "message": "Промяна на паролата", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Промяна на паролата – $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Парола в риск" + }, "atRiskPasswords": { "message": "Пароли в риск" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Вашата парола за този уеб сайт е в риск. $ORGANIZATION$ изисква от Вас да я смените.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ иска от Вас да смените тази парола, защото е в риск. Отидете в настройките на акаунта си, за да смените паролата си.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Преглед и промяна на една парола в риск" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Зададен е ПИН код за отключване" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Удостоверяване" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Нямате права за преглед на тази страница. Опитайте да се впишете с друг акаунт." + }, + "wasmNotSupported": { + "message": "WebAssembly не е включено или не се поддържа от Вашия браузър. За ползването на приложението на Битуорден е необходимо WebAssembly да работи.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 2e84549c710..4eb485f1861 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Bitwarden আনলক করার জন্য আপনার পিন কোডটি সেট করুন। আপনি যদি অ্যাপ্লিকেশনটি থেকে পুরোপুরি লগ আউট করেন তবে আপনার পিন সেটিংস রিসেট করা হবে।" }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "পিন কোড প্রয়োজন।" @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index f23362e285a..b1a2cfc3f6d 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index e4105606aef..c67496fef54 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logotip de Bitwarden" }, "extName": { "message": "Bitwarden - Gestor de contrasenyes", @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Clau SSH" }, + "typeNote": { + "message": "Nota" + }, "newItemHeader": { "message": "Nou $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Configureu el vostre codi PIN per desbloquejar Bitwarden. La configuració del PIN es restablirà si tanqueu la sessió definitivament." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Es necessita el codi PIN." @@ -2515,6 +2518,10 @@ "change": { "message": "Canvia" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "S'està autenticant" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 0d7eb8082d2..2679ab063af 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -1003,7 +1003,7 @@ "message": "Prohledat složku" }, "searchCollection": { - "message": "Prohledat kolekci" + "message": "Prohledat sbírku" }, "searchType": { "message": "Typ hledání" @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH klíč" }, + "typeNote": { + "message": "Poznámka" + }, "newItemHeader": { "message": "Nové $TYPE$", "placeholders": { @@ -1965,10 +1968,10 @@ "message": "Zpět" }, "collections": { - "message": "Kolekce" + "message": "Sbírky" }, "nCollections": { - "message": "$COUNT$ kolekcí", + "message": "$COUNT$ sbírek", "placeholders": { "count": { "content": "$1", @@ -2111,7 +2114,7 @@ "message": "Nepatříte do žádné organizace. Organizace umožňují bezpečné sdílení položek s ostatními uživateli." }, "noCollectionsInList": { - "message": "Žádné kolekce k zobrazení." + "message": "Žádné sbírky k zobrazení." }, "ownership": { "message": "Vlastnictví" @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Nastavte svůj PIN kód pro odemknutí trezoru. Pokud se zcela odhlásíte z aplikace bude Váš aktuální PIN resetován." }, - "setYourPinCode1": { - "message": "Váš PIN bude použit k odemknutí Bitwardenu namísto hlavního hesla. Pokud se někdy plně odhlásíte z Bitwarden, Váš PIN kód se obnoví." + "setPinCode": { + "message": "Tento PIN můžete použít k odemknutí Bitwardenu. Váš PIN bude resetován, pokud seněkdy úplně odhlásíte z aplikace." }, "pinRequired": { "message": "Je vyžadován PIN kód." @@ -2184,7 +2187,7 @@ "message": "Vyžadovat hlavní heslo při restartu prohlížeče" }, "selectOneCollection": { - "message": "Musíte vybrat alespoň jednu kolekci." + "message": "Musíte vybrat alespoň jednu sbírku." }, "cloneItem": { "message": "Duplikovat položku" @@ -2476,7 +2479,7 @@ "message": "Tuto akci nelze provést v postranním panelu, zkuste akci znovu v novém okně." }, "personalOwnershipSubmitError": { - "message": "Z důvodu podnikových zásad nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte z dostupných kolekcí." + "message": "Z důvodu podnikových zásad nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte dostupných sbírek." }, "personalOwnershipPolicyInEffect": { "message": "Zásady organizace ovlivňují možnosti vlastnictví." @@ -2515,6 +2518,10 @@ "change": { "message": "Změnit" }, + "changePassword": { + "message": "Změnit heslo", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Změnit heslo - $ITEMNAME$", "placeholders": { @@ -2524,11 +2531,14 @@ } } }, + "atRiskPassword": { + "message": "Ohrožené heslo" + }, "atRiskPasswords": { "message": "Ohrožená hesla" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ Vás žádá o změnu 1 hesla, protože je v ohrožení.", + "message": "$ORGANIZATION$ Vás žádá o změnu 1 hesla, protože je ohroženo.", "placeholders": { "organization": { "content": "$1", @@ -2537,7 +2547,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ Vás žádá o změnu $COUNT$ hesel, protože jsou v ohrožení.", + "message": "$ORGANIZATION$ Vás žádá o změnu $COUNT$ hesel, protože jsou ohrožena.", "placeholders": { "organization": { "content": "$1", @@ -2550,7 +2560,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Vaše organizace Vás žádají o změnu $COUNT$ hesel, protože jsou v ohrožení.", + "message": "Vaše organizace Vás žádají o změnu $COUNT$ hesel, protože jsou ohrožena.", "placeholders": { "count": { "content": "$1", @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Vaše heslo pro tuto stránku je ohrožené. $ORGANIZATION$ Vás požádala, abyste jej změnili.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ chce, abyste změnili toto heslo, protože je ohrožené. Přejděte do nastavení účtu a změňte heslo.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Zkontrolovat a změnit jedno ohrožené heslo" }, @@ -2577,20 +2607,20 @@ "message": "Aktualizujte svá nastavení, abyste mohli rychle automaticky vyplňovat hesla a generovat nová hesla." }, "reviewAtRiskLogins": { - "message": "Kontrola rizikových přihlášení" + "message": "Kontrola ohrožených přihlášení" }, "reviewAtRiskPasswords": { - "message": "Kontrola rizikových hesel" + "message": "Kontrola ohrožených hesel" }, "reviewAtRiskLoginsSlideDesc": { "message": "Hesla Vaší organizace jsou ohrožena, protože jsou slabá, opakovaně používaná nebo odhalená.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Ilustrace seznamu přihlášení, která jsou riziková." + "message": "Ilustrace seznamu přihlášení, která jsou ohrožená." }, "generatePasswordSlideDesc": { - "message": "Rychle vygeneruje silné, unikátní heslo s nabídkou automatického vyplňování Bitwarden na rizikových stránkách.", + "message": "Rychle vygeneruje silné, unikátní heslo s nabídkou automatického vyplňování Bitwarden na ohrožených stránkách.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { @@ -3959,7 +3989,7 @@ "message": "Zvolte složku" }, "selectImportCollection": { - "message": "Zvolte kolekci" + "message": "Zvolte sbírku" }, "importTargetHint": { "message": "Pokud chcete obsah importovaného souboru přesunout do složky $DESTINATION$, vyberte tuto volbu", @@ -4145,7 +4175,7 @@ "message": "Zkuste to znovu nebo vyhledejte e-mail od LastPass pro ověření, že jste to Vy." }, "collection": { - "message": "Kolekce" + "message": "Sbírka" }, "lastPassYubikeyDesc": { "message": "Vložte YubiKey spojený s Vaším účtem LastPass do USB portu Vašeho počítače a stiskněte jeho tlačítko." @@ -4409,7 +4439,7 @@ "message": "Žádné hodnoty ke zkopírování" }, "assignToCollections": { - "message": "Přiřadit ke kolekcím" + "message": "Přiřadit ke sbírkám" }, "copyEmail": { "message": "Kopírovat e-mail" @@ -4433,7 +4463,7 @@ "message": "Vzhled" }, "errorAssigningTargetCollection": { - "message": "Chyba při přiřazování cílové kolekce." + "message": "Chyba při přiřazování do cílové sbírky." }, "errorAssigningTargetFolder": { "message": "Chyba při přiřazování cílové složky." @@ -4725,10 +4755,10 @@ "message": "Přiřadit" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Jen členové organizace s přístupem k těmto kolekcím budou moci vidět položku." + "message": "Jen členové organizace s přístupem k těmto sbírkám budou moci vidět položku." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Jen členové organizace s přístupem k těmto kolekcím budou moci vidět položky." + "message": "Jen členové organizace s přístupem k těmto sbírkám budou moci vidět položky." }, "bulkCollectionAssignmentWarning": { "message": "Vybrali jste $TOTAL_COUNT$ položek. Nemůžete aktualizovat $READONLY_COUNT$ položek, protože nemáte oprávnění k úpravám.", @@ -4829,7 +4859,7 @@ } }, "selectCollectionsToAssign": { - "message": "Vyberte kolekce pro přiřazení" + "message": "Vyberte sbírky pro přiřazení" }, "personalItemTransferWarningSingular": { "message": "1 položka bude trvale převedena do vybrané organizace. Tuto položku již nebudete vlastnit." @@ -4866,7 +4896,7 @@ } }, "successfullyAssignedCollections": { - "message": "Kolekce byly úspěšně přiřazeny" + "message": "Sbírky byly úspěšně přiřazeny" }, "nothingSelected": { "message": "Nevybrali jste žádné položky." @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "PIN pro odemknutí byl nastaven" }, + "unlockBiometricSet": { + "message": "Odemknout sadu biometriky" + }, "authenticating": { "message": "Ověřování" }, @@ -5234,7 +5267,7 @@ "message": "SSH klíč byl úspěšně importován" }, "cannotRemoveViewOnlyCollections": { - "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", + "message": "Nemůžete odebrat sbírky s oprávněními jen pro zobrazení: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Nemáte oprávnění k zobrazení této stránky. Zkuste se přihlásit jiným účtem." + }, + "wasmNotSupported": { + "message": "WebAssembly není ve Vašem prohlížeči podporováno nebo není povoleno. WebAssembly je vyžadováno pro použití aplikace Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index c842e8cf543..9940ed173ed 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logo Bitwarden" }, "extName": { "message": "Rheolydd cyfrineiriau Bitwarden", @@ -335,7 +335,7 @@ "message": "Mwy gan Bitwarden" }, "continueToBitwardenDotCom": { - "message": "Continue to bitwarden.com?" + "message": "Parhau i bitwarden.com?" }, "bitwardenForBusiness": { "message": "Bitwarden for Business" @@ -668,13 +668,13 @@ "message": "Mae eich cell ar glo. Gwiriwch eich hunaniaeth i barhau." }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Mae eich cell ar glo" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Mae eich cyfrif ar glo" }, "or": { - "message": "or" + "message": "neu" }, "unlock": { "message": "Datgloi" @@ -762,7 +762,7 @@ "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintLabel": { - "message": "Master password hint" + "message": "Awgrym o'ch prif gyfrinair" }, "errorOccurred": { "message": "Bu gwall" @@ -799,13 +799,13 @@ "message": "Mae eich cyfrif wedi cael ei greu!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "Rydych wedi cael eich mewngofnodi!" }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, "youMayCloseThisWindow": { - "message": "You may close this window" + "message": "Gallwch cau'r ffenestr hon bellach" }, "masterPassSent": { "message": "Rydym ni wedi anfon ebost atoch gydag awgrym ar gyfer eich prif gyfrinair." @@ -860,7 +860,7 @@ "message": "Logged out" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Rydych wedi cael eich allgofnodi o'ch cyfrif." }, "loginExpired": { "message": "Mae eich sesiwn wedi dod i ben." @@ -872,13 +872,13 @@ "message": "Mewngofnodi i Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Rhowch y cod a anfonwyd i'ch ebost" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Rhowch y cod o'ch ap dilysu" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Gwasgwch eich YubiKey i ddilysu" }, "duoTwoFactorRequiredPageSubtitle": { "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." @@ -929,13 +929,13 @@ "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." }, "twoStepLoginConfirmationTitle": { - "message": "Continue to web app?" + "message": "Parhau i'r ap gwe?" }, "editedFolder": { "message": "Ffolder wedi'i chadw" }, "deleteFolderConfirmation": { - "message": "Are you sure you want to delete this folder?" + "message": "Ydych chi'n sicr yr hoffech chi ddileu'r ffolder hon?" }, "deletedFolder": { "message": "Ffolder wedi'i dileu" @@ -1076,11 +1076,11 @@ "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Golygu cyn cadw", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Hysbysiad newydd" }, "labelWithNotification": { "message": "$LABEL$: New notification", @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Allwedd SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "$TYPE$ newydd", "placeholders": { @@ -2090,7 +2093,7 @@ "message": "Tynnu" }, "default": { - "message": "Default" + "message": "Rhagosodiad" }, "dateUpdated": { "message": "Updated", @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Mae angen cod PIN." @@ -2222,7 +2225,7 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Addasu'r gell" }, "vaultTimeoutAction": { "message": "Vault timeout action" @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Cyfrineiriau mewn perygl" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -3132,7 +3162,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Defnyddiwch $RECOMMENDED$ neu fwy o eiriau i gynhyrchu cyfrinymadrodd cryff.", + "message": " Defnyddiwch $RECOMMENDED$ neu fwy o eiriau i gynhyrchu cyfrinymadrodd cryf.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -4015,7 +4045,7 @@ "message": "Passkey" }, "accessing": { - "message": "Accessing" + "message": "Yn cysylltu â" }, "loggedInExclamation": { "message": "Logged in!" @@ -4172,7 +4202,7 @@ "message": "Account limit reached. Log out of an account to add another." }, "active": { - "message": "active" + "message": "gweithredol" }, "locked": { "message": "locked" @@ -4646,7 +4676,7 @@ "message": "Delete website" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Rhagosodiad ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -4695,10 +4725,10 @@ } }, "enableAnimations": { - "message": "Enable animations" + "message": "Galluogi animeiddio" }, "showAnimations": { - "message": "Show animations" + "message": "Dangos animeiddio" }, "addAccount": { "message": "Ychwanegu cyfrif" @@ -4922,7 +4952,7 @@ "message": "Text Sends" }, "accountActions": { - "message": "Account actions" + "message": "Gweithredoedd y cyfrif" }, "showNumberOfAutofillSuggestions": { "message": "Show number of login autofill suggestions on extension icon" @@ -4931,7 +4961,7 @@ "message": "Show quick copy actions on Vault" }, "systemDefault": { - "message": "System default" + "message": "Rhagosodiad y sytem" }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5198,13 +5231,13 @@ "message": "Beta" }, "extensionWidth": { - "message": "Extension width" + "message": "Lled yr estyniad" }, "wide": { - "message": "Wide" + "message": "Llydan" }, "extraWide": { - "message": "Extra wide" + "message": "Llydan iawn" }, "sshKeyWrongPassword": { "message": "The password you entered is incorrect." @@ -5252,7 +5285,7 @@ "message": "Change at-risk password" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Dewisiadau'r gell" }, "emptyVaultDescription": { "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 71723b90283..d6680f4190a 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH-nøgle" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Ny $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Indstil din pinkode til at låse Bitwarden op. Dine pin-indstillinger nulstilles, hvis du nogensinde logger helt ud af programmet." }, - "setYourPinCode1": { - "message": "PIN-koden vil blive brugt til oplåsning af Bitwarden i stedet for hovedadgangskoden. PIN-koden nulstilles, hvis man logger helt ud af Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Pinkode er påkrævet." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Godkender" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index 28402576ddf..8449eb7b966 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -1366,7 +1366,7 @@ "message": "Funktion nicht verfügbar" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "Die veraltete Verschlüsselung wird nicht mehr unterstützt. Bitte kontaktiere den Support, um dein Konto wiederherzustellen." }, "premiumMembership": { "message": "Premium-Mitgliedschaft" @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH-Schlüssel" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Neue $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Gebe deinen PIN-Code für das Entsperren von Bitwarden ein. Deine PIN-Einstellungen werden zurückgesetzt, wenn du dich vollständig von der Anwendung abmeldest." }, - "setYourPinCode1": { - "message": "Deine PIN wird verwendet, um Bitwarden anstatt deines Master-Passworts zu entsperren. Deine PIN wird zurückgesetzt, wenn du dich jemals vollständig von Bitwarden abgemeldet hast." + "setPinCode": { + "message": "Du kannst diese PIN verwenden, um Bitwarden zu entsperren. Deine PIN wird zurückgesetzt, wenn du dich vollständig aus der Anwendung abmeldest." }, "pinRequired": { "message": "PIN-Code ist erforderlich." @@ -2515,6 +2518,10 @@ "change": { "message": "Ändern" }, + "changePassword": { + "message": "Passwort ändern", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Passwort ändern - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Gefährdetes Passwort" + }, "atRiskPasswords": { "message": "Gefährdete Passwörter" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Dein Passwort für diese Website ist gefährdet. $ORGANIZATION$ hat darum gebeten, dass du es änderst.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ möchte, dass du dieses Passwort änderst, da es gefährdet ist. Wechsel zu deinen Kontoeinstellungen, um das Passwort zu ändern.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Überprüfe und ändere ein gefährdetes Passwort" }, @@ -2678,7 +2708,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Maximale Zugriffsanzahl erreicht", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Entsperr-PIN festgelegt" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authentifizierung" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Du hast keine Berechtigung, diese Seite anzuzeigen. Versuche dich mit einem anderen Konto anzumelden." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 3fee57b7246..9d023585108 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Κλειδί SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Νέα $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Ορίστε τον κωδικό PIN για να ξεκλειδώσετε το Bitwarden. Οι ρυθμίσεις PIN θα επαναρυθμιστούν αν αποσυνδεθείτε πλήρως από την εφαρμογή." }, - "setYourPinCode1": { - "message": "Το PIN σας θα χρησιμοποιείται για το ξεκλείδωμα του Bitwarden αντί του κύριου κωδικού πρόσβασης. Αν αποσυνδεθείτε εντελώς από το Bitwarden, θα γίνει επαναφορά του PIN σας." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Απαιτείται κωδικός PIN." @@ -2515,6 +2518,10 @@ "change": { "message": "Αλλαγή" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Αλλαγή κωδικού πρόσβασης - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Κωδικοί πρόσβασης σε κίνδυνο" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Ταυτοποίηση" }, @@ -5222,16 +5255,16 @@ "message": "Enter password" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "Το κλειδί SSH δεν είναι έγκυρο" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "Ο τύπος κλειδιού SSH δεν υποστηρίζεται" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Εισαγωγή κλειδιού από το πρόχειρο" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "Επιτυχής εισαγωγή κλειδιού SSH" }, "cannotRemoveViewOnlyCollections": { "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", @@ -5285,10 +5318,10 @@ "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 ειδοποίηση" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Εισαγωγή υπαρχόντων κωδικών πρόσβασης" }, "emptyVaultNudgeBody": { "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 298c4db01f5..65a7d071e9e 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -1928,6 +1928,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2490,6 +2493,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2521,6 +2530,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2530,6 +2543,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2564,6 +2580,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5044,6 +5080,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5385,5 +5424,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 635a416e002..00488aaf275 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 1baf1d63257..796a51f8bba 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 090bb8db08e..40e20fa2d5e 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -1080,7 +1080,7 @@ "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Nueva notificación" }, "labelWithNotification": { "message": "$LABEL$: New notification", @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Llave SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Nuevo $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Establece tu código PIN para desbloquear Bitwarden. Tus ajustes de PIN se reiniciarán si alguna vez cierras tu sesión completamente de la aplicación." }, - "setYourPinCode1": { - "message": "Su PIN se utilizará para desbloquear Bitwarden en lugar de su contraseña maestra. Su PIN se restablecerá si alguna vez cierra completamente la sesión de Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Código PIN requerido." @@ -2377,7 +2380,7 @@ "message": "Política de privacidad" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Tu nueva contraseña no puede ser igual a tu contraseña actual." }, "hintEqualsPassword": { "message": "Tu contraseña no puede ser idéntica a la pista de contraseña." @@ -2515,6 +2518,10 @@ "change": { "message": "Cambiar" }, + "changePassword": { + "message": "Cambiar contraseña", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Cambiar contraseña - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Contraseñas de riesgo" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -3776,7 +3806,7 @@ "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { - "message": "Unlock your account to view autofill suggestions", + "message": "Desbloquea tu cuenta para ver sugerencias de autocompletado", "description": "Text to display in overlay when the account is locked." }, "unlockAccount": { @@ -4286,7 +4316,7 @@ "message": "Clave de acceso eliminada" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Sugerencias de autocompletado" }, "itemSuggestions": { "message": "Suggested items" @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Autenticando" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 0599339b77d..4046451a567 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Uus $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Määra Bitwardeni lahtilukustamiseks PIN kood. Rakendusest täielikult välja logides nullitakse ka PIN koodi seaded." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Nõutakse PIN koodi." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 4a4713737fa..1b04d15f36f 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Ezarri zure PIN kodea Bitwarden desblokeatzeko. Zure PIN-aren konfigurazioa berrezarriko da, noizbait aplikaziotik erabat saioa ixten baduzu." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN-a beharrezkoa da." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 1b1b865e1d0..f07352ca159 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -41,7 +41,7 @@ "message": "ایجاد حساب کاربری خود را با تنظیم کلمه عبور تکمیل کنید" }, "enterpriseSingleSignOn": { - "message": "ورود به سیستم پروژه" + "message": "ورود یکپارچه سازمانی" }, "cancel": { "message": "انصراف" @@ -258,13 +258,13 @@ "message": "حساب ایمیل" }, "requestHint": { - "message": "درخواست راهنمایی" + "message": "درخواست یادآور" }, "requestPasswordHint": { "message": "درخواست یادآور کلمه عبور" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "نشانی ایمیل حساب کاربری خود را وارد کنید تا راهنمای کلمه عبور برای شما ارسال شود" + "message": "نشانی ایمیل حساب کاربری خود را وارد کنید تا یادآور کلمه عبور برای شما ارسال شود" }, "getMasterPasswordHint": { "message": "دریافت یادآور کلمه عبور اصلی" @@ -294,7 +294,7 @@ "message": "با برنامه وب ادامه می‌دهید؟" }, "continueToWebAppDesc": { - "message": "ویژگی‌های بیشتر حساب Bitwarden خود را در برنامه وب کاوش کنید." + "message": "ویژگی‌های بیشتر حساب کاربری Bitwarden خود را در برنامه وب کاوش کنید." }, "continueToHelpCenter": { "message": "به مرکز راهنمایی ادامه می‌دهید؟" @@ -316,11 +316,11 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "عبارت اثر انگشت حساب شما", + "message": "عبارت اثر انگشت حساب کاربری شما", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "ورود دو مرحله ای" + "message": "ورود دو مرحله‌ای" }, "logOut": { "message": "خروج" @@ -407,7 +407,7 @@ "message": "برای سامان‌دهی موردهای گاوصندوق خود پوشه ایجاد کنید" }, "deleteFolderPermanently": { - "message": "مطمئنید می‌خواهید این پوشه را برای همیشه پاک کنید؟" + "message": "آیا مطمئنید می‌خواهید این پوشه را برای همیشه پاک کنید؟" }, "deleteFolder": { "message": "حذف پوشه" @@ -428,7 +428,7 @@ "message": "انجمن‌های Bitwarden را کاوش کنید" }, "contactSupport": { - "message": "پیام به پشتیبانیBitwarden" + "message": "پیام به پشتیبانی Bitwarden" }, "sync": { "message": "همگام‌سازی" @@ -575,13 +575,13 @@ "message": "مورد علاقه" }, "unfavorite": { - "message": "حذف از علایق" + "message": "حذف از مورد علاقه" }, "itemAddedToFavorites": { "message": "به موارد مورد علاقه افزوده شد" }, "itemRemovedFromFavorites": { - "message": "از علایق حذف شد" + "message": "از مورد علاقه حذف شد" }, "notes": { "message": "یادداشت‌ها" @@ -635,7 +635,7 @@ "message": "باز کردن امکانات" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "یک روش بازگشایی برای پایان زمان مجاز تنظیم کنید." + "message": "یک روش باز کردن قفل برای پایان زمان مجاز راه‌اندازی کنید." }, "unlockMethodNeeded": { "message": "یک روش باز کردن قفل را در تنظیمات راه‌اندازی کنید" @@ -653,7 +653,7 @@ "message": "به این افزونه امتیاز دهید" }, "browserNotSupportClipboard": { - "message": "مرورگر شما از کپی کلیپ بورد آسان پشتیبانی نمی‌کند. به جای آن به صورت دستی کپی کنید." + "message": "مرورگر شما از کپی حافظه موقت آسان پشتیبانی نمی‌کند. به جای آن به صورت دستی کپی کنید." }, "verifyYourIdentity": { "message": "هویت خود را تأیید کنید" @@ -741,10 +741,10 @@ "message": "4 ساعت" }, "onLocked": { - "message": "در قفل سیستم" + "message": "هنگام قفل سیستم" }, "onRestart": { - "message": "هنگام راه اندازی مجدد" + "message": "هنگام راه‌اندازی مجدد" }, "never": { "message": "هرگز" @@ -799,7 +799,7 @@ "message": "حساب کاربری جدید شما ایجاد شده است!" }, "youHaveBeenLoggedIn": { - "message": "شما با موفقیت وارد شدید!" + "message": "شما وارد شدید!" }, "youSuccessfullyLoggedIn": { "message": "شما با موفقیت وارد شدید" @@ -808,7 +808,7 @@ "message": "می‌توانید این پنجره را ببندید" }, "masterPassSent": { - "message": "ما یک ایمیل همراه با راهنمای کلمه عبور اصلی برایتان ارسال کردیم." + "message": "ما یک ایمیل همراه با یادآور کلمه عبور اصلی برایتان ارسال کردیم." }, "verificationCodeRequired": { "message": "کد تأیید مورد نیاز است." @@ -820,7 +820,7 @@ "message": "کد تأیید نامعتبر است" }, "valueCopied": { - "message": " کپی شده", + "message": "$VALUE$ کپی شد", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -848,7 +848,7 @@ "message": "Bitwarden می‌تواند کدهای تأیید دو مرحله‌ای را ذخیره و پر کند. کلید را کپی کرده و در این فیلد قرار دهید." }, "totpHelperWithCapture": { - "message": "Bitwarden می‌تواند کدهای تأیید دو مرحله‌ای را ذخیره و پر کند. برای اسکن کد QR احراز هویت کننده این وب‌سایت، روی آیکون دوربین کلیک کنید یا کلید را کپی کرده و در این فیلد قرار دهید." + "message": "Bitwarden می‌تواند کدهای تأیید دو مرحله‌ای را ذخیره و پر کند. برای اسکن کد QR احراز هویت کننده این وب‌سایت، روی نماد دوربین کلیک کنید یا کلید را کپی کرده و در این فیلد قرار دهید." }, "learnMoreAboutAuthenticators": { "message": "درباره احراز هویت کننده‌ها بیشتر بدانید" @@ -860,7 +860,7 @@ "message": "خارج شد" }, "loggedOutDesc": { - "message": "شما از حساب خود خارج شده‌اید." + "message": "شما از حساب کاربری خود خارج شده‌اید." }, "loginExpired": { "message": "نشست ورود شما منقضی شده است." @@ -923,7 +923,7 @@ "message": "پوشه اضافه شد" }, "twoStepLoginConfirmation": { - "message": "ورود دو مرحله ای باعث می‌شود که حساب کاربری شما با استفاده از یک دستگاه دیگر مانند کلید امنیتی، برنامه احراز هویت، پیامک، تماس تلفنی و یا ایمیل، اعتبار خود را با ایمنی بیشتر اثبات کند. ورود دو مرحله ای می تواند در bitwarden.com فعال شود. آیا می‌خواهید از سایت بازدید کنید؟" + "message": "ورود دو مرحله‌ای باعث می شود که حساب کاربری شما با استفاده از یک دستگاه دیگر مانند کلید امنیتی، برنامه احراز هویت، پیامک، تماس تلفنی و یا رایانامه، اعتبار خود را با ایمنی بیشتر اثبات کند. ورود دو مرحله‌ای می‌تواند در bitwarden.com راه‌اندازی شود. آیا می‌خواهید از سایت بازدید کنید؟" }, "twoStepLoginConfirmationContent": { "message": "با راه‌اندازی ورود دو مرحله‌ای در برنامه وب Bitwarden، حساب کاربری خود را ایمن‌تر کنید." @@ -982,16 +982,16 @@ "message": "مورد ذخیره شد" }, "deleteItemConfirmation": { - "message": "واقعاً می‌خواهید این آیتم را به سطل زباله ارسال کنید؟" + "message": "واقعاً می‌خواهید این مورد را به سطل زباله ارسال کنید؟" }, "deletedItem": { - "message": "مورد به زباله‌ها فرستاده شد" + "message": "مورد به سطل زباله فرستاده شد" }, "overwritePassword": { "message": "بازنویسی کلمه عبور" }, "overwritePasswordConfirmation": { - "message": "آیا از بازنویسی بر روی پسورد فعلی مطمئن هستید؟" + "message": "آیا از بازنویسی بر روی کلمه عبور فعلی مطمئن هستید؟" }, "overwriteUsername": { "message": "بازنویسی نام کاربری" @@ -1022,7 +1022,7 @@ "message": "در صورتی که موردی در گاوصندوق شما یافت نشد، درخواست افزودن کنید." }, "addLoginNotificationDescAlt": { - "message": "اگر موردی در گاوصندوق شما یافت نشد، درخواست افزودن آن را بدهید. این مورد برای همه حساب‌های وارد شده اعمال می‌شود." + "message": "اگر موردی در گاوصندوق شما یافت نشد، درخواست افزودن آن را بدهید. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." }, "showCardsInVaultViewV2": { "message": "همیشه کارت‌ها را به‌عنوان پیشنهادهای پر کردن خودکار در نمای گاوصندوق نمایش بده" @@ -1049,11 +1049,11 @@ "message": "برای پر کردن، روی موردها در پیشنهادهای پرکردن خودکار کلیک کنید" }, "clearClipboard": { - "message": "پاکسازی کلیپ بورد", + "message": "پاکسازی حافظه موقت", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "به صورت خودکار، مقادیر کپی شده را از کلیپ بورد پاک کن.", + "message": "به صورت خودکار، مقادیر کپی شده را از حافظه موقت پاک کن.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { @@ -1180,13 +1180,13 @@ "message": "هنگامی که تغییری در یک وب‌سایت شناسایی شد، درخواست به‌روزرسانی کلمه عبور ورود کن." }, "changedPasswordNotificationDescAlt": { - "message": "هنگامی که تغییری در کلمه عبور یک ورود در وب‌سایت شناسایی شود، درخواست به‌روزرسانی آن را بده. این مورد برای همه حساب‌های وارد شده اعمال می‌شود." + "message": "هنگامی که تغییری در کلمه عبور یک ورود در وب‌سایت شناسایی شود، درخواست به‌روزرسانی آن را بده. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." }, "enableUsePasskeys": { - "message": "برای ذخیره و استفاده از passkey اجازه بگیر" + "message": "درخواست برای ذخیره و استفاده از کلیدهای عبور" }, "usePasskeysDesc": { - "message": "درخواست ذخیره کلیدهای عبور جدید یا ورود با کلیدهای عبوری که در گاوصندوق شما ذخیره شده‌اند. این مورد برای همه حساب‌های وارد شده اعمال می‌شود." + "message": "درخواست ذخیره کلیدهای عبور جدید یا ورود با کلیدهای عبوری که در گاوصندوق شما ذخیره شده‌اند. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." }, "notificationChangeDesc": { "message": "آیا مایل به به‌روزرسانی این کلمه عبور در Bitwarden هستید؟" @@ -1207,7 +1207,7 @@ "message": "نمایش گزینه‌های منوی زمینه" }, "contextMenuItemDesc": { - "message": "از یک کلیک ثانویه برای دسترسی به تولید کلمه عبور و ورودهای منطبق برای وب سایت استفاده کن." + "message": "از یک کلیک ثانویه برای دسترسی به تولید کلمه عبور و ورودهای منطبق برای وب‌سایت استفاده کن." }, "contextMenuItemDescAlt": { "message": "برای دسترسی به تولید کلمه عبور و ورودهای منطبق با وب‌سایت، از کلیک ثانویه استفاده کنید. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." @@ -1226,7 +1226,7 @@ "message": "تغییر رنگ پوسته برنامه." }, "themeDescAlt": { - "message": "تغییر تم رنگی برنامه. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." + "message": "تغییر پوسته رنگی برنامه. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." }, "dark": { "message": "تاریک", @@ -1255,7 +1255,7 @@ "message": "این کلمه عبور برای برون ریزی و درون ریزی این پرونده استفاده می‌شود" }, "accountRestrictedOptionDescription": { - "message": "برای رمزگذاری برون ریزی و محدود کردن درون ریزی فقط به حساب کاربری فعلی Bitwarden، از کلید رمزگذاری حساب خود که از نام کاربری و کلمه عبور اصلی حساب شما مشتق شده است استفاده کنید." + "message": "برای رمزگذاری برون ریزی و محدود کردن درون ریزی فقط به حساب کاربری فعلی Bitwarden، از کلید رمزگذاری حساب کاربری خود که از نام کاربری و کلمه عبور اصلی حساب کاربری شما مشتق شده است استفاده کنید." }, "passwordProtectedOptionDescription": { "message": "یک کلمه عبور برای پرونده به‌منظور رمزگذاری تنظیم کنید تا برون ریزی و درون ریزی آن به هر حساب Bitwarden با استفاده از کلمه عبور رمزگشایی شود." @@ -1270,7 +1270,7 @@ "message": "عدم تطابق \"کلمه عبور پرونده\" و \"تأیید کلمه عبور پرونده\" با یکدیگر." }, "warning": { - "message": "اخطار", + "message": "هشدار", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "warningCapitalized": { @@ -1284,7 +1284,7 @@ "message": "این برون ریزی شامل داده‌های گاوصندوق در یک قالب رمزنگاری نشده است. شما نباید آن را از طریق یک راه ارتباطی نا امن (مثل ایمیل) ذخیره یا ارسال کنید. به محض اینکه کارتان با آن تمام شد، آن را حذف کنید." }, "encExportKeyWarningDesc": { - "message": "این برون ریزی با استفاده از کلید رمزگذاری حساب شما، اطلاعاتتان را رمزگذاری می کند. اگر زمانی کلید رمزگذاری حساب خود را بچرخانید، باید دوباره خروجی بگیرید، چون قادر به رمزگشایی این پرونده برون ریزی نخواهید بود." + "message": "این برون ریزی با استفاده از کلید رمزگذاری حساب کاربری شما، اطلاعاتتان را رمزگذاری می کند. اگر زمانی کلید رمزگذاری حساب کاربری خود را تغییر دهید، باید دوباره خروجی بگیرید، چون قادر به رمزگشایی این پرونده برون ریزی نخواهید بود." }, "encExportAccountWarningDesc": { "message": "کلیدهای رمزگذاری حساب برای هر حساب کاربری Bitwarden منحصر به فرد است، بنابراین نمی‌توانید برون ریزی رمزگذاری شده را به حساب دیگری وارد کنید." @@ -1330,7 +1330,7 @@ "message": "کپی کد تأیید" }, "attachments": { - "message": "پیوست ها" + "message": "پیوست‌ها" }, "deleteAttachment": { "message": "حذف پیوست" @@ -1366,7 +1366,7 @@ "message": "ویژگی موجود نیست" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "رمزنگاری قدیمی دیگر پشتیبانی نمی‌شود. لطفاً برای بازیابی حساب کاربری خود با پشتیبانی تماس بگیرید." }, "premiumMembership": { "message": "عضویت پرمیوم" @@ -1387,16 +1387,16 @@ "message": "برای عضویت پرمیوم ثبت نام کنید و دریافت کنید:" }, "ppremiumSignUpStorage": { - "message": "۱ گیگابایت فضای ذخیره سازی رمزگذاری شده برای پیوست های پرونده." + "message": "۱ گیگابایت فضای ذخیره‌سازی رمزگذاری شده برای پیوست‌های پرونده." }, "premiumSignUpEmergency": { "message": "دسترسی اضطراری." }, "premiumSignUpTwoStepOptions": { - "message": "گزینه های ورود اضافی دو مرحله ای مانند YubiKey و Duo." + "message": "گزینه‌های ورود اضافی دو مرحله‌ای مانند YubiKey و Duo." }, "ppremiumSignUpReports": { - "message": "گزارش‌های بهداشت کلمه عبور، سلامت حساب و نقض داده‌ها برای ایمن نگهداشتن گاوصندوق شما." + "message": "گزارش‌های بهداشت کلمه عبور، سلامت حساب کاربری و نقض داده‌ها برای ایمن نگهداشتن گاوصندوق شما." }, "ppremiumSignUpTotp": { "message": "تولید کننده کد تأیید (2FA) از نوع TOTP برای ورودهای در گاوصندوقتان." @@ -1411,7 +1411,7 @@ "message": "خرید پرمیوم" }, "premiumPurchaseAlertV2": { - "message": "می‌توانید نسخه پرمیوم را از تنظیمات حساب کاربری خود در اپلیکیشن وب Bitwarden خریداری کنید." + "message": "می‌توانید نسخه پرمیوم را از تنظیمات حساب کاربری خود در برنامه وب Bitwarden خریداری کنید." }, "premiumCurrentMember": { "message": "شما یک عضو پرمیوم هستید!" @@ -1423,7 +1423,7 @@ "message": "ارتقا به نسخه پرمیوم و دریافت:" }, "premiumPrice": { - "message": "تمامش فقط $PRICE$ در سال!", + "message": "تمامش فقط $PRICE$ /سال!", "placeholders": { "price": { "content": "$1", @@ -1447,10 +1447,10 @@ "message": "TOTP را به صورت خودکار کپی کن" }, "disableAutoTotpCopyDesc": { - "message": "اگر یک ورود دارای یک کلید احراز هویت باشد، هنگام پر کردن خودکار ورود، کد تأیید TOTP را در کلیپ بورد خود کپی کن." + "message": "اگر یک ورود دارای یک کلید احراز هویت باشد، هنگام پر کردن خودکار ورود، کد تأیید TOTP را در حافظه موقت خود کپی کن." }, "enableAutoBiometricsPrompt": { - "message": "درخواست بیومتریک هنگام راه اندازی" + "message": "درخواست بیومتریک هنگام راه‌اندازی" }, "premiumRequired": { "message": "در نسخه پرمیوم کار می‌کند" @@ -1484,7 +1484,7 @@ "message": "از کد بازیابی‌تان استفاده کنید" }, "insertU2f": { - "message": "کلید امنیتی خود را وارد پورت USB رایانه کنید، اگر دکمه ای دارد آن را بفشارید." + "message": "کلید امنیتی خود را وارد پورت USB رایانه کنید، اگر دکمه‌ای دارد آن را بفشارید." }, "openInNewTab": { "message": "گشودن در زبانهٔ جدید" @@ -1502,7 +1502,7 @@ "message": "ورود به سیستم در دسترس نیست" }, "noTwoStepProviders": { - "message": "ورود دو مرحله‌ای برای این حساب فعال است، با این حال، هیچ یک از ارائه‌دهندگان دو مرحله‌ای پیکربندی شده توسط این مرورگر وب پشتیبانی نمی‌شوند." + "message": "ورود دو مرحله‌ای برای این حساب کاربری فعال است، با این حال، هیچ یک از ارائه‌دهندگان دو مرحله‌ای پیکربندی شده توسط این مرورگر وب پشتیبانی نمی‌شوند." }, "noTwoStepProviders2": { "message": "لطفاً از یک مرورگر وب پشتیبانی شده (مانند کروم) استفاده کنید و یا ارائه دهندگان اضافی را که از مرورگر وب بهتر پشتیانی می‌کنند را اضافه کنید (مانند یک برنامه احراز هویت)." @@ -1541,10 +1541,10 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { - "message": "FIDO2 WebAuthn\n" + "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "برای دسترسی به حساب خود از هر کلید امنیتی فعال شده WebAuthn استفاده کنید." + "message": "برای دسترسی به حساب کاربری خود از هر کلید امنیتی فعال شده WebAuthn استفاده کنید." }, "emailTitle": { "message": "ایمیل" @@ -1587,7 +1587,7 @@ "message": "نشانی سرور اعلان‌ها" }, "iconsUrl": { - "message": "نشانی سرور آیکون ها" + "message": "نشانی سرور نمادها" }, "environmentSaved": { "message": "نشانی‌های اینترنتی محیط ذخیره شد" @@ -1627,7 +1627,7 @@ "message": "نمایش کارت‌ها به‌عنوان پیشنهاد" }, "showInlineMenuOnIconSelectionLabel": { - "message": "نمایش پیشنهادها هنگام انتخاب آیکون" + "message": "نمایش پیشنهادها هنگام انتخاب نماد" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "برای تمام حساب‌های کاربری وارد شده اعمال می‌شود." @@ -1647,7 +1647,7 @@ "description": "Overlay appearance select option for showing the field on focus of the input element" }, "autofillOverlayVisibilityOnButtonClick": { - "message": "وقتی آیکون پر کردن خودکار انتخاب شود", + "message": "وقتی نماد پر کردن خودکار انتخاب شود", "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { @@ -1675,7 +1675,7 @@ "message": "می‌توانید پر کردن خودکار هنگام بارگیری صفحه را برای موارد ورود به سیستم از نمای ویرایش مورد خاموش کنید." }, "itemAutoFillOnPageLoad": { - "message": "پر کردن خودکار بارگذاری صفحه (درصورت فعال بودن در گزینه ها)" + "message": "پر کردن خودکار بارگذاری صفحه (درصورت فعال بودن در گزینه‌ها)" }, "autoFillOnPageLoadUseDefault": { "message": "استفاده از تنظیمات پیش‌فرض" @@ -1693,16 +1693,16 @@ "message": "باز کردن گاوصندوق در نوار کناری" }, "commandAutofillLoginDesc": { - "message": "آخرین ورودی مورد استفاده برای وب سایت فعلی را به صورت خودکار پر کنید" + "message": "آخرین ورودی مورد استفاده برای وب‌سایت فعلی را به صورت خودکار پر کنید" }, "commandAutofillCardDesc": { - "message": "آخرین کارت مورد استفاده برای وب سایت فعلی را به صورت خودکار پر کنید" + "message": "آخرین کارت مورد استفاده برای وب‌سایت فعلی را به صورت خودکار پر کنید" }, "commandAutofillIdentityDesc": { - "message": "آخرین هویت مورد استفاده برای وب سایت فعلی را به صورت خودکار پر کنید" + "message": "آخرین هویت مورد استفاده برای وب‌سایت فعلی را به صورت خودکار پر کنید" }, "commandGeneratePasswordDesc": { - "message": "یک کلمه عبور تصادفی جدید ایجاد کنید و آن را در کلیپ بورد کپی کنید" + "message": "یک کلمه عبور تصادفی جدید ایجاد کنید و آن را در حافظه موقت کپی کنید" }, "commandLockVaultDesc": { "message": "قفل گاوصندوق" @@ -1806,7 +1806,7 @@ "message": "جولای" }, "august": { - "message": "آگوست‌" + "message": "اوت‌" }, "september": { "message": "سپتامبر" @@ -1842,7 +1842,7 @@ "message": "دکتر" }, "mx": { - "message": "عنوان" + "message": "بی جنسیت" }, "firstName": { "message": "نام" @@ -1890,7 +1890,7 @@ "message": "نشانی ۳" }, "cityTown": { - "message": "شهر / شهرک" + "message": "شهر / شهرستان" }, "stateProvince": { "message": "ایالت / استان" @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "کلید SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "$TYPE$ جدید", "placeholders": { @@ -1980,7 +1983,7 @@ "message": "مورد علاقه‌ها" }, "popOutNewWindow": { - "message": "به یک پنجره جدید پاپ بزن" + "message": "در پنجره‌ای جدید باز کن" }, "refresh": { "message": "تازه کردن" @@ -2008,7 +2011,7 @@ "message": "بررسی کنید که آیا کلمه عبور افشا شده است." }, "passwordExposed": { - "message": "این کلمه عبور $VALUE$ بار در رخنه داده‌ها افشا شده است. باید آن را تغییر دهید.", + "message": "این کلمه عبور $VALUE$ بار در نقض داده‌ها افشا شده است. باید آن را تغییر دهید.", "placeholders": { "value": { "content": "$1", @@ -2017,7 +2020,7 @@ } }, "passwordSafe": { - "message": "این کلمه عبور در هیچ رخنه داده ای شناخته نشده است. استفاده از آن باید ایمن باشد." + "message": "این کلمه عبور در هیچ یک از نقض‌های داده شناخته شده یافت نشد. استفاده از آن باید ایمن باشد." }, "baseDomain": { "message": "دامنه پایه", @@ -2054,10 +2057,10 @@ "description": "Default URI match detection for autofill." }, "toggleOptions": { - "message": "گزینه های تبدیل" + "message": "سوئیچ گزینه‌ها" }, "toggleCurrentUris": { - "message": "تغییر وضعیت نشانی های اینترنتی فعلی", + "message": "تغییر وضعیت نشانی‌های اینترنتی فعلی", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -2142,7 +2145,7 @@ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { - "message": "باز کردن با پین" + "message": "باز کردن با کد پین" }, "setYourPinTitle": { "message": "تنظیم کد پین" @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "کد پین خود را برای باز کردن Bitwarden تنظیم کنید. اگر به طور کامل از برنامه خارج شوید، تنظیمات پین شما از بین می‌رود." }, - "setYourPinCode1": { - "message": "کد پین شما برای باز کردن Bitwarden به جای کلمه عبور اصلی استفاده خواهد شد. در صورتی که کاملاً از Bitwarden خارج شوید، کد پین شما ریست خواهد شد." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "کد پین الزامیست." @@ -2163,10 +2166,10 @@ "message": "کد پین معتبر نیست." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "تعداد تلاش‌های ناموفق پین زیاد شد. خارج می‌شوید." + "message": "تعداد تلاش‌های ناموفق کد پین زیاد شد. خارج می‌شوید." }, "unlockWithBiometrics": { - "message": "با استفاده از بیومتریک باز کنید" + "message": "باز کردن قفل با بیومتریک" }, "unlockWithMasterPassword": { "message": "باز کردن قفل با کلمه عبور اصلی" @@ -2190,7 +2193,7 @@ "message": "مورد شبیه" }, "clone": { - "message": "شبیه سازی" + "message": "شبیه‌سازی" }, "passwordGenerator": { "message": "تولید کننده کلمه عبور" @@ -2199,13 +2202,13 @@ "message": "تولید کننده نام کاربری" }, "useThisEmail": { - "message": "از این ایمیل استفاده شود" + "message": "از این ایمیل استفاده کن" }, "useThisPassword": { "message": "از این کلمه عبور استفاده کن" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "از این عبارت عبور استفاده کن" }, "useThisUsername": { "message": "از این نام کاربری استفاده کن" @@ -2235,17 +2238,17 @@ "description": "Verb form: to make secure or inaccessible by" }, "trash": { - "message": "زباله‌ها", + "message": "سطل زباله", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "جستجوی زباله‌ها" + "message": "جستجوی سطل زباله" }, "permanentlyDeleteItem": { "message": "حذف دائمی مورد" }, "permanentlyDeleteItemConfirmation": { - "message": "مطمئن هستید که می‌خواهید این مورد را برای همیشه پاک کنید؟" + "message": "آیا مطمئن هستید که می‌خواهید این مورد را برای همیشه پاک کنید؟" }, "permanentlyDeletedItem": { "message": "مورد برای همیشه حذف شد" @@ -2284,7 +2287,7 @@ "message": "آیا هنوز می‌خواهید این ورود را پر کنید؟" }, "autofillIframeWarning": { - "message": "فرم توسط دامنه ای متفاوت از نشانی اینترنتی ورود به سیستم ذخیره شده شما میزبانی می‌شود. به هر حال برای پر کردن خودکار، تأیید را انتخاب کنید یا برای توقف، لغو را انتخاب کنید." + "message": "فرم توسط دامنه‌ای متفاوت از نشانی اینترنتی ورود به سیستم ذخیره شده شما میزبانی می‌شود. به هر حال برای پر کردن خودکار، تأیید را انتخاب کنید یا برای توقف، لغو را انتخاب کنید." }, "autofillIframeWarningTip": { "message": "برای جلوگیری از این هشدار در آینده، این نشانی اینترنتی، $HOSTNAME$، را در مورد ورود Bitwarden خود برای این سایت ذخیره کنید.", @@ -2380,7 +2383,7 @@ "message": "کلمه عبور جدید شما نمی‌تواند با کلمه عبور فعلی‌تان یکسان باشد." }, "hintEqualsPassword": { - "message": "اشاره به کلمه عبور شما نمی‌تواند همان کلمه عبور شما باشد." + "message": "یادآور کلمه عبور شما نمی‌تواند همان کلمه عبور شما باشد." }, "ok": { "message": "تأیید" @@ -2422,10 +2425,10 @@ "message": "ارتباط دسکتاپ قطع شد" }, "nativeMessagingWrongUserDesc": { - "message": "برنامه دسکتاپ به یک حساب دیگر وارد شده است. لطفاً اطمینان حاصل کنید که هر دو برنامه به یک حساب وارد شده اند." + "message": "برنامه دسکتاپ به یک حساب کاربری دیگر وارد شده است. لطفاً اطمینان حاصل کنید که هر دو برنامه به یک حساب کاربری وارد شده اند." }, "nativeMessagingWrongUserTitle": { - "message": "عدم مطابقت حساب کاربری" + "message": "عدم تطابق حساب کاربری" }, "nativeMessagingWrongUserKeyTitle": { "message": "عدم تطابق کلید بیومتریک" @@ -2434,10 +2437,10 @@ "message": "باز کردن قفل بیومتریک ناموفق بود. کلید مخفی بیومتریک نتوانست گاوصندوق را باز کند. لطفاً دوباره تنظیمات بیومتریک را انجام دهید." }, "biometricsNotEnabledTitle": { - "message": "بیومتریک برپا نشده" + "message": "بیومتریک راه‌اندازی نشده" }, "biometricsNotEnabledDesc": { - "message": "بیومتریک مرورگر ابتدا نیاز به فعالسازی بیومتریک دسکتاپ در تنظیمات دارد." + "message": "بیومتریک مرورگر ابتدا نیاز به فعال‌سازی بیومتریک دسکتاپ در تنظیمات دارد." }, "biometricsNotSupportedTitle": { "message": "بیومتریک پشتیبانی نمی‌شود" @@ -2476,7 +2479,7 @@ "message": "این عمل را نمی‌توان در نوار کناری انجام داد، لطفاً اقدام را در پنجره بازشو بازخوانی کنید." }, "personalOwnershipSubmitError": { - "message": "به دلیل سیاست پرمیوم، برای ذخیره موارد در گاوصندوق شخصی خود محدود شده اید. گزینه مالکیت را به یک سازمان تغییر دهید و مجموعه های موجود را انتخاب کنید." + "message": "به دلیل سیاست پرمیوم، برای ذخیره موارد در گاوصندوق شخصی خود محدود شده‌اید. گزینه مالکیت را به یک سازمان تغییر دهید و مجموعه‌های موجود را انتخاب کنید." }, "personalOwnershipPolicyInEffect": { "message": "سیاست سازمانی بر تنظیمات مالکیت شما تأثیر می‌گذارد." @@ -2495,10 +2498,10 @@ "message": "اطلاعات بیشتر درباره دامنه‌های مسدود شده" }, "excludedDomains": { - "message": "دامنه های مستثنی" + "message": "دامنه‌های مستثنی" }, "excludedDomainsDesc": { - "message": "Bitwarden برای ذخیره جزئیات ورود به سیستم این دامنه ها سوال نمی‌کند. برای اینکه تغییرات اعمال شود باید صفحه را تازه کنید." + "message": "Bitwarden برای ذخیره جزئیات ورود به سیستم این دامنه‌ها سوال نمی‌کند. برای اینکه تغییرات اعمال شود باید صفحه را تازه کنید." }, "excludedDomainsDescAlt": { "message": "Bitwarden برای هیچ یک از حساب‌های کاربری وارد شده، درخواست ذخیره اطلاعات ورود برای این دامنه‌ها را نخواهد داد. برای اعمال تغییرات باید صفحه را تازه‌سازی کنید." @@ -2515,6 +2518,10 @@ "change": { "message": "تغییر" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "تغییر کلمه عبور - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "کلمات عبور در معرض خطر" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "بررسی و تغییر یک کلمه عبور در معرض خطر" }, @@ -2674,11 +2704,11 @@ "message": "پرونده" }, "allSends": { - "message": "همه ارسال ها", + "message": "همه ارسال‌ها", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "به حداکثر تعداد دسترسی رسیده است", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2718,7 +2748,7 @@ "message": "غیرفعال شد" }, "removePasswordConfirmation": { - "message": "مطمئنید که می‌خواهید کلمه عبور حذف شود؟" + "message": "آیا مطمئنید که می‌خواهید کلمه عبور حذف شود؟" }, "deleteSend": { "message": "ارسال حذف شد", @@ -2836,10 +2866,10 @@ "message": "برای انتخاب پرونده، پسوند را در نوار کناری باز کنید (در صورت امکان) یا با کلیک بر روی این بنر پنجره جدیدی باز کنید." }, "sendFirefoxFileWarning": { - "message": "برای انتخاب یک پرونده با استفاده از Firefox، افزونه را در نوار کناری باز کنید یا با کلیک بر روی این بنر پنجره جدیدی باز کنید." + "message": "برای انتخاب یک پرونده با استفاده از فایرفاکس، افزونه را در نوار کناری باز کنید یا با کلیک بر روی این بنر پنجره جدیدی باز کنید." }, "sendSafariFileWarning": { - "message": "برای انتخاب پرونده ای با استفاده از Safari، با کلیک روی این بنر پنجره جدیدی باز کنید." + "message": "برای انتخاب پرونده‌ای با استفاده از سافاری، با کلیک روی این بنر پنجره جدیدی باز کنید." }, "popOut": { "message": "باز کردن در پنجره جداگانه" @@ -2884,16 +2914,16 @@ "message": "برای استفاده از این ویژگی باید ایمیل خود را تأیید کنید. می‌توانید ایمیل خود را در گاوصندوق وب تأیید کنید." }, "updatedMasterPassword": { - "message": "کلمه عبور اصلی به‌روز شد" + "message": "کلمه عبور اصلی به‌روزرسانی شد" }, "updateMasterPassword": { "message": "به‌روزرسانی کلمه عبور اصلی" }, "updateMasterPasswordWarning": { - "message": "کلمه عبور اصلی شما اخیراً توسط سرپرست سازمان‌تان تغییر کرده است. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." + "message": "کلمه عبور اصلی شما اخیراً توسط مدیر سازمان‌تان تغییر کرده است. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روزرسانی کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه‌های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." }, "updateWeakMasterPasswordWarning": { - "message": "کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." + "message": "کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روزرسانی کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه‌های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." }, "tdeDisabledMasterPasswordRequired": { "message": "سازمان شما رمزگذاری دستگاه‌های مورد اعتماد را غیرفعال کرده است. لطفاً برای دسترسی به گاوصندوق خود یک کلمه عبور اصلی تنظیم کنید." @@ -2902,7 +2932,7 @@ "message": "ثبت نام خودکار" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "این سازمان دارای سیاست سازمانی ای است که به طور خودکار شما را در بازنشانی کلمه عبور ثبت نام می‌کند. این ثبت نام به مدیران سازمان اجازه می‌دهد تا کلمه عبور اصلی شما را تغییر دهند." + "message": "این سازمان دارای سیاست سازمانی است که به طور خودکار شما را در بازیابی کلمه عبور ثبت نام می‌کند. این ثبت نام به مدیران سازمان اجازه می‌دهد تا کلمه عبور اصلی شما را تغییر دهند." }, "selectFolder": { "message": "پوشه را انتخاب کنید..." @@ -2929,7 +2959,7 @@ } }, "verificationRequired": { - "message": "تایید لازم است", + "message": "تأیید لازم است", "description": "Default title for the user verification dialog." }, "hours": { @@ -2942,7 +2972,7 @@ "message": "نیازمندی‌های سیاست سازمانی بر گزینه‌های زمان پایان نشست شما اعمال شده است" }, "vaultTimeoutPolicyInEffect": { - "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است", + "message": "سیاست‌های سازمان‌تان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است.", "placeholders": { "hours": { "content": "$1", @@ -2981,7 +3011,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است. عملگر مهلت زمانی گاوصندوق شما روی $ACTION$ تنظیم شده است.", + "message": "سیاست‌های سازمان‌تان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است. عملگر مهلت زمانی گاوصندوق شما روی $ACTION$ تنظیم شده است.", "placeholders": { "hours": { "content": "$1", @@ -3007,7 +3037,7 @@ } }, "vaultTimeoutTooLarge": { - "message": "مهلت زمانی شما بیش از محدودیت های تعیین شده توسط سازمانتان است." + "message": "مهلت زمانی شما بیش از محدودیت‌های تعیین شده توسط سازمان‌تان است." }, "vaultExportDisabled": { "message": "برون ریزی گاوصندوق غیرفعال شده است" @@ -3040,10 +3070,10 @@ "message": "کلمه عبور اصلی حذف شد" }, "leaveOrganizationConfirmation": { - "message": "آيا مطمئن هستيد که می خواهيد سازمان های انتخاب شده را ترک کنيد؟" + "message": "آيا مطمئنید که می‌خواهيد سازمان انتخاب شده را ترک کنيد؟" }, "leftOrganization": { - "message": "شما از سازمان خارج شده اید." + "message": "شما از سازمان خارج شده‌اید." }, "toggleCharacterCount": { "message": "تغییر تعداد کاراکترها" @@ -3146,7 +3176,7 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "از قابلیت های آدرس دهی فرعی ارائه دهنده ایمیل خود استفاده کنید." + "message": "از قابلیت‌های آدرس دهی فرعی ارائه دهنده ایمیل خود استفاده کنید." }, "catchallEmail": { "message": "دریافت همه ایمیل‌ها" @@ -3277,7 +3307,7 @@ } }, "forwarderNoUrl": { - "message": "آدرس $SERVICENAME$ نامعتبر.", + "message": "نشانی $SERVICENAME$ نامعتبر.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -3392,7 +3422,7 @@ "message": "یک اعلان به دستگاه شما ارسال شده است." }, "notificationSentDevicePart1": { - "message": "قفل Bitwarden را در دستگاه خود یا در... باز کنید" + "message": "قفل Bitwarden را روی دستگاه خود باز کنید یا روی" }, "notificationSentDeviceAnchor": { "message": "برنامه وب" @@ -3419,16 +3449,16 @@ "message": "کلمه عبور اصلی افشا شده" }, "exposedMasterPasswordDesc": { - "message": "کلمه عبور در نقض داده پیدا شد. از یک کلمه عبور منحصر به فرد برای محافظت از حساب خود استفاده کنید. آیا مطمئنید که می‌خواهید از یک کلمه عبور افشا شده استفاده کنید؟" + "message": "کلمه عبور در افشای داده پیدا شد. از یک کلمه عبور منحصربه‌فرد برای محافظت از حساب کاربری خود استفاده کنید. آیا مطمئنید که می‌خواهید از یک کلمه عبور افشا شده استفاده کنید؟" }, "weakAndExposedMasterPassword": { "message": "کلمه عبور اصلی ضعیف و افشا شده" }, "weakAndBreachedMasterPasswordDesc": { - "message": "کلمه عبور ضعیف شناسایی و در یک نقض داده پیدا شد. از یک کلمه عبور قوی و منحصر به فرد برای محافظت از حساب خود استفاده کنید. آیا مطمئنید که می‌خواهید از این کلمه عبور استفاده کنید؟" + "message": "کلمه عبور ضعیف شناسایی و در یک افشای داده پیدا شد. از یک کلمه عبور قوی و منحصربه‌فرد برای محافظت از حساب کاربری خود استفاده کنید. آیا مطمئنید که می‌خواهید از این کلمه عبور استفاده کنید؟" }, "checkForBreaches": { - "message": "نقض اطلاعات شناخته شده برای این کلمه عبور را بررسی کنید" + "message": "بررسی نقض‌های داده شناخته شده برای این کلمه عبور" }, "important": { "message": "مهم:" @@ -3479,7 +3509,7 @@ "message": "مدیریت میان‌برها" }, "autofillShortcut": { - "message": "میانبر صفحه کلید پر کردن خودکار" + "message": "میان‌بر صفحه کلید پر کردن خودکار" }, "autofillLoginShortcutNotSet": { "message": "میان‌بر ورود خودکار تنظیم نشده است. این مورد را در تنظیمات مرورگر تغییر دهید." @@ -3494,7 +3524,7 @@ } }, "autofillShortcutTextSafari": { - "message": "میانبر پر کردن خودکار پیش‌فرض: $COMMAND$.", + "message": "میان‌بر پر کردن خودکار پیش‌فرض: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -3533,7 +3563,7 @@ "message": "شناسه سازمان SSO مورد نیاز است." }, "creatingAccountOn": { - "message": "در حال ساخت حساب روی" + "message": "در حال ساخت حساب کاربری روی" }, "checkYourEmail": { "message": "ایمیل خود را چک کنید" @@ -3594,7 +3624,7 @@ "message": "اعتماد به سازمان" }, "trust": { - "message": "اطمینان" + "message": "اعتماد" }, "doNotTrust": { "message": "اعتماد نکنید" @@ -3857,7 +3887,7 @@ "message": "خطای درون ریزی" }, "importErrorDesc": { - "message": "مشکلی با داده‌هایی که سعی کردید وارد کنید وجود داشت. لطفاً خطاهای فهرست شده زیر را در فایل منبع خود برطرف کرده و دوباره امتحان کنید." + "message": "مشکلی با داده‌هایی که سعی کردید درون ریزی کنید وجود داشت. لطفاً خطاهای فهرست شده در زیر را در پرونده منبع خود برطرف کرده و دوباره امتحان کنید." }, "resolveTheErrorsBelowAndTryAgain": { "message": "خطاهای زیر را برطرف کرده و دوباره امتحان کنید." @@ -3929,7 +3959,7 @@ "message": "خطا در اتصال به سرویس Duo. از روش ورود دو مرحله‌ای دیگری استفاده کنید یا برای دریافت کمک با Duo تماس بگیرید." }, "duoRequiredForAccount": { - "message": "ورود دو مرحله ای Duo برای حساب کاربری شما لازم است." + "message": "ورود دو مرحله‌ای Duo برای حساب کاربری شما لازم است." }, "popoutExtension": { "message": "باز کردن پنجره جداگانه افزونه" @@ -3938,10 +3968,10 @@ "message": "اجرای Duo" }, "importFormatError": { - "message": "داده‌ها به درستی قالب‌بندی نشده‌اند. لطفا فایل وارد شده خود را بررسی و دوباره امتحان کنید." + "message": "داده‌ها به درستی قالب‌بندی نشده‌اند. لطفاً پرونده درون ریزی شده خود را بررسی و دوباره امتحان کنید." }, "importNothingError": { - "message": "چیزی وارد نشد." + "message": "چیزی درون ریزی نشد." }, "importEncKeyError": { "message": "خطا در رمزگشایی پرونده‌ی درون ریزی شده. کلید رمزگذاری شما با کلید رمزگذاری استفاده شده برای درون ریزی داده‌ها مطابقت ندارد." @@ -3953,7 +3983,7 @@ "message": "مقصد" }, "learnAboutImportOptions": { - "message": "درباره گزینه‌های برون ریزی خود بیاموزید" + "message": "درباره گزینه‌های درون ریزی خود بیاموزید" }, "selectImportFolder": { "message": "یک پوشه انتخاب کنید" @@ -3962,7 +3992,7 @@ "message": "انتخاب یک مجموعه" }, "importTargetHint": { - "message": "اگر می‌خواهید محتوای فایل وارد شده به $DESTINATION$ منتقل شود، این گزینه را انتخاب کنید", + "message": "اگر می‌خواهید محتوای پرونده درون ریزی شده به $DESTINATION$ منتقل شود، این گزینه را انتخاب کنید", "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", "placeholders": { "destination": { @@ -4024,10 +4054,10 @@ "message": "کلید عبور کپی نمی‌شود" }, "passkeyNotCopiedAlert": { - "message": "کلید عبور در مورد شبیه سازی شده کپی نمی‌شود. آیا می‌خواهید به شبیه سازی این مورد ادامه دهید؟" + "message": "کلید عبور در مورد شبیه‌سازی شده کپی نمی‌شود. آیا می‌خواهید به شبیه‌سازی این مورد ادامه دهید؟" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { - "message": "تأیید توسط سایت آغازگر الزامی است. این ویژگی هنوز برای حساب‌های بدون کلمه عبور اصلی اجرا نشده است." + "message": "تأیید توسط سایت آغازگر الزامی است. این ویژگی هنوز برای حساب‌های کاربری بدون کلمه عبور اصلی اجرا نشده است." }, "logInWithPasskeyQuestion": { "message": "با کلید عبور وارد می‌شوید؟" @@ -4039,10 +4069,10 @@ "message": "هیچ کلمه عبوری برای این برنامه یافت نشد." }, "noMatchingPasskeyLogin": { - "message": "شما هیچ ورود مشابهی برای این سایت ندارید." + "message": "شما هیچ ورود مشابهی برای این وب‌سایت ندارید." }, "noMatchingLoginsForSite": { - "message": "ورود منطبق برای این سایت یافت نشد" + "message": "ورود منطبق برای این وب‌سایت یافت نشد" }, "searchSavePasskeyNewLogin": { "message": "جستجو یا ذخیره کلید عبور به عنوان ورود جدید" @@ -4132,7 +4162,7 @@ "message": "لطفاً برای ورود، از اطلاعات کاربری شرکت خود استفاده کنید." }, "seeDetailedInstructions": { - "message": "دستورالعمل‌های کامل را در سایت راهنمای ما مشاهده کنید در", + "message": "دستورالعمل‌های کامل را در وب‌سایت راهنمای ما مشاهده کنید در", "description": "This is followed a by a hyperlink to the help website." }, "importDirectlyFromLastPass": { @@ -4154,7 +4184,7 @@ "message": "تعویض حساب کاربری" }, "switchAccounts": { - "message": "تعویض حساب‌ها" + "message": "تعویض حساب‌های کاربری" }, "switchToAccount": { "message": "تعویض به حساب کاربری" @@ -4169,7 +4199,7 @@ "message": "حساب کاربری در درسترس" }, "accountLimitReached": { - "message": "محدودیت حساب کاربری تکمیل شد. برای افزودن حساب کاربری دیگر، از یک حساب خارج شوید." + "message": "محدودیت حساب کاربری تکمیل شد. برای افزودن حساب کاربری دیگر، از یک حساب کاربری خارج شوید." }, "active": { "message": "فعال" @@ -4193,7 +4223,7 @@ "message": "فقط یک بار" }, "alwaysForThisSite": { - "message": "همیشه برای این سایت" + "message": "همیشه برای این وب‌سایت" }, "domainAddedToExcludedDomains": { "message": "دامنه $DOMAIN$ به دامنه‌های مستثنی اضافه شد.", @@ -4292,7 +4322,7 @@ "message": "موارد پیشنهادی" }, "autofillSuggestionsTip": { - "message": "یک مورد ورود برای این سایت ذخیره کنید تا به‌صورت خودکار پر شود" + "message": "یک مورد ورود برای این وب‌سایت ذخیره کنید تا به‌صورت خودکار پر شود" }, "yourVaultIsEmpty": { "message": "گاوصندوق‌تان خالی است" @@ -4344,7 +4374,7 @@ } }, "viewItemTitle": { - "message": "مشاهده آیتم - $ITEMNAME$", + "message": "مشاهده مورد - $ITEMNAME$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4418,7 +4448,7 @@ "message": "کپی تلفن" }, "copyAddress": { - "message": "کپی آدرس" + "message": "کپی نشانی" }, "adminConsole": { "message": "کنسول مدیر" @@ -4643,7 +4673,7 @@ "message": "افزودن وب‌سایت" }, "deleteWebsite": { - "message": "حذف وبسایت" + "message": "حذف وب‌سایت" }, "defaultLabel": { "message": "پیش‌فرض ($VALUE$)", @@ -4656,7 +4686,7 @@ } }, "showMatchDetection": { - "message": "نمایش تطبیق سایت $WEBSITE$", + "message": "نمایش شناسایی تطابق برای $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4665,7 +4695,7 @@ } }, "hideMatchDetection": { - "message": "مخفی کردن تطبیق سایت $WEBSITE$", + "message": "مخفی کردن شناسایی تطابق $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4767,7 +4797,7 @@ "message": "وقتی در پر کردن خودکار برای یک وب‌سایت خاص به مشکل برخوردید، از فیلد مرتبط استفاده کنید." }, "linkedLabelHelpText": { - "message": "شناسه Html، نام، aria-label یا محل نگهدار فیلد را وارد کنید." + "message": "شناسه html، نام، aria-label یا محل نگهدار فیلد را وارد کنید." }, "editField": { "message": "ویرایش فیلد" @@ -4869,7 +4899,7 @@ "message": "مجموعه‌ها با موفقیت اختصاص داده شدند" }, "nothingSelected": { - "message": "شما چیزی را انتخاب نکرده اید." + "message": "شما چیزی را انتخاب نکرده‌اید." }, "itemsMovedToOrg": { "message": "موارد به $ORGNAME$ منتقل شدند", @@ -4925,7 +4955,7 @@ "message": "فعالیت‌های حساب کاربری" }, "showNumberOfAutofillSuggestions": { - "message": "نمایش تعداد پیشنهادهای پر کردن خودکار ورود در آیکون افزونه" + "message": "نمایش تعداد پیشنهادهای پر کردن خودکار ورود در نماد افزونه" }, "showQuickCopyActions": { "message": "نمایش عملیات کپی سریع در گاوصندوق" @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "بازکردن قفل کد پین تنظیم شد" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "در حال احراز هویت" }, @@ -5270,7 +5303,7 @@ "message": "ورود سریع و آسان" }, "quickLoginBody": { - "message": "قفل بیومتریک و پر کردن خودکار را تنظیم کنید تا بدون وارد کردن حتی یک حرف وارد حساب‌های خود شوید." + "message": "قفل بیومتریک و پر کردن خودکار را تنظیم کنید تا بدون وارد کردن حتی یک حرف وارد حساب‌های کاربری خود شوید." }, "secureUser": { "message": "ورودهای خود را ارتقا دهید" @@ -5282,7 +5315,7 @@ "message": "داده‌های شما، زمانی که نیاز دارید و در جایی که نیاز دارید" }, "secureDevicesBody": { - "message": "کلمه‌های عبور نامحدود را در دستگاه‌های نامحدود با اپلیکیشن‌های موبایل، مرورگر و دسکتاپ Bitwarden ذخیره کنید." + "message": "کلمه‌های عبور نامحدود را در دستگاه‌های نامحدود با برنامه‌های موبایل، مرورگر و دسکتاپ Bitwarden ذخیره کنید." }, "nudgeBadgeAria": { "message": "۱ اعلان" @@ -5371,10 +5404,14 @@ "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "با کلیک روی دکمه تولید رمز عبور، به‌راحتی کلمات عبور قوی و منحصر به‌ فرد ایجاد کنید تا ورودهای شما ایمن باقی بمانند.", + "message": "با کلیک روی دکمه تولید کلمه عبور، به‌راحتی کلمات عبور قوی و منحصر به‌ فرد ایجاد کنید تا ورودهای شما ایمن باقی بمانند.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { "message": "شما اجازه دسترسی به این صفحه را ندارید. لطفاً با حساب کاربری دیگری وارد شوید." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index ba2ed77c8de..5723b9b29c5 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH-avain" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Uusi $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut laajennuksesta kokonaan ulos." }, - "setYourPinCode1": { - "message": "PIN-koodia käytetään pääsalasanasi sijasta Bitwarenin avaukseen. Määritetty PIN-koodi tyhjennetään, jos kirjaudut kokonaan ulos Bitwardenista." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN-koodi vaaditaan." @@ -2515,6 +2518,10 @@ "change": { "message": "Vaihda" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Vaihda salasana - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Vaarantuneet salasanat" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Tarkasta ja vaihda yksi vaarantunut salasana" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Todennetaan" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index ce1a99debbe..d52eae1b43e 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Itakda ang iyong PIN code para sa pag-unlock ng Bitwarden. Ang iyong mga setting ng PIN ay ma-reset kung kailanman ay lubusang lumabas ka mula sa application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Kinakailangan ang PIN code." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index f6ed8e79c30..f913e2ab4b3 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Clé SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Créer un(e) $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Définissez votre code PIN pour déverrouiller Bitwarden. Les paramètres relatifs à votre code PIN seront réinitialisés si vous vous déconnectez complètement de l'application." }, - "setYourPinCode1": { - "message": "Votre code PIN sera utilisé pour déverrouiller Bitwarden au lieu de votre mot de passe principal. Votre code PIN sera réinitialisé si vous vous déconnectez complètement de Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Le code PIN est requis." @@ -2515,6 +2518,10 @@ "change": { "message": "Modifier" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Modifier le mot de passe - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Mots de passe à risque" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Examiner et modifier un mot de passe à risque" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authentification" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 4839eb6be81..41766204775 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Clave SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Novo $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Crea un PIN para abrir a caixa forte. Se algunha vez pechas a sesión en Bitwarden perderase a configuración deste PIN." }, - "setYourPinCode1": { - "message": "O PIN empregarase no lugar do contrasinal mestre para abrir a caixa forte. Se pechas a sesión en Bitwarden perderase a configuración do PIN." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN requirido." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Autenticando" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 7cb09c3b4fc..7549d77cac0 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "מפתח SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "$TYPE$ חדש", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "קבע קוד PIN לביטול נעילת Bitwarden. הגדרות הPIN יאופסו אם תבצע יציאה מהתוכנה." }, - "setYourPinCode1": { - "message": "ה־PIN שלך ישמש לביטול נעילת Bitwarden במקום הסיסמה הראשית שלך. ה־PIN שלך יאופס אם אי פעם תצא באופן מלא מ־Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "נדרש קוד PIN." @@ -2515,6 +2518,10 @@ "change": { "message": "שינוי" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "שנה סיסמה - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "סיסמאות בסיכון" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "סקור ושנה סיסמה אחת בסיכון" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "מאמת" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 8531f9a481a..4d766d1090d 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "नोट" + }, "newItemHeader": { "message": "नया $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "बिटवर्डन को अनलॉक करने के लिए अपना पिन कोड सेट करें यदि आप कभी भी आवेदन से पूरी तरह लॉग आउट करते हैं तो आपकी पिन सेटिंग्स रीसेट हो जाएंगी।" }, - "setYourPinCode1": { - "message": "बिटवर्डन को अनलॉक करने के लिए आपके मास्टर पासवर्ड के बजाय आपके पिन का उपयोग किया जाएगा। यदि आप कभी भी बिटवर्डन से पूरी तरह लॉग आउट हो जाते हैं तो आपका पिन रीसेट हो जाएगा।" + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "पिन-कोड आवश्यक है |" @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index d585e8ec3ff..972448319b5 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH ključ" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Novi $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Postavi svoj PIN kôd za otključavanje Bitwardena. Postavke PIN-a se resetiraju ako se potpuno odjaviš iz aplikacije." }, - "setYourPinCode1": { - "message": "Tvoj PIN će se koristiti za otključavanje Bitwardena umjesto glavne lozinke. PIN će se restirati ukoliko se odjaviš iz Bitwardena. " + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Potreban je PIN." @@ -2515,6 +2518,10 @@ "change": { "message": "Promijeni" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Promijeni lozinku - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Rizične lozinke" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Pregledaj i promijeni jednu rizičnu lozinku" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Autentifikacija" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 73232437bc6..13d5996469f 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH kulcs" }, + "typeNote": { + "message": "Jegyzet" + }, "newItemHeader": { "message": "Új $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "A pinkód beállítása a Bitwarden feloldásához. A pinkód beállítás alaphelyzetbe kerül, ha teljesen kijelentkezünk az alkalmazásból." }, - "setYourPinCode1": { - "message": "A Bitwarden feloldásához a PIN kódot használjuk a mesterjelszó helyett. A PIN kód alaphelyzetbe kerül, ha teljesen kijelentkezünk a Bitwardenből." + "setPinCode": { + "message": "Ezt a PIN kódot használhatjuk a Bitwarden feloldásához. A PIN kód alaphelyzetbe kerül, ha valaha is teljesen kijelentkezünk az alkalmazásból." }, "pinRequired": { "message": "A pinkód szükséges." @@ -2515,6 +2518,10 @@ "change": { "message": "Módosítás" }, + "changePassword": { + "message": "Jelszó módosítása", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Jelszó módosítás - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Veszélyes jelszó" + }, "atRiskPasswords": { "message": "Veszélyes jelszavak" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "A webhely jelszava veszélyben van. $ORGANIZATION$ kérte a megváltoztatását.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ azt akarja, hogy változtassuk meg ezt a jelszót, mert veszélyben van. A jelszó módosításához navigáljunk fiók beállításokhoz.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Tekintsük át és módosítsuk az egyik veszélyeztetett jelszót." }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "PIN beállítás feloldása" }, + "unlockBiometricSet": { + "message": "Biometriai beállítások feloldása" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Nincs jogosultság az oldal megtekintéséhez. Próbáljunk meg másik fiókkal bejelentkezni." + }, + "wasmNotSupported": { + "message": "A WebAssembly nem támogatott a böngészőben vagy nincs engedélyezve. A WebAssembly szükséges a Bitwarden alkalmazás használatához.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index af1ccf80034..995540036d6 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -1072,7 +1072,7 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationNewItemAria": { - "message": "New Item, opens in new window", + "message": "Benda baru, buka di jendela baru", "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { @@ -1093,15 +1093,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "telah disimpan ke Bitwarden.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "telah diperbarui di Bitwarden.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Pilih $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1121,7 +1121,7 @@ "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "Buka untuk menyimpan login ini", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { @@ -1366,7 +1366,7 @@ "message": "Fitur Tidak Tersedia" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "Enkripsi usang tidak lagi didukung. Silakan hubungi pendukung untuk memulihkan akun Anda." }, "premiumMembership": { "message": "Keanggotaan Premium" @@ -1600,13 +1600,13 @@ "message": "Saran isi otomatis" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "Temukan saran isi otomatis dengan mudah" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "Matikan pengaturan isi otomatis peramban Anda, sehingga tidak bertentangan dengan Bitwarden." }, "turnOffBrowserAutofill": { - "message": "Turn off $BROWSER$ autofill", + "message": "Matikan isi otomatis $BROWSER$", "placeholders": { "browser": { "content": "$1", @@ -1615,7 +1615,7 @@ } }, "turnOffAutofill": { - "message": "Turn off autofill" + "message": "Matikan isi otomatis" }, "showInlineMenuLabel": { "message": "Tampilkan saran isi otomatis pada kolom formulir" @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Kunci SSH" }, + "typeNote": { + "message": "Catatan" + }, "newItemHeader": { "message": "$TYPE$ baru", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Setel kode PIN Anda untuk membuka kunci Bitwarden. Pengaturan PIN Anda akan diatur ulang jika Anda pernah keluar sepenuhnya dari aplikasi." }, - "setYourPinCode1": { - "message": "PIN Anda akan digunakan untuk membuka Bitwarden alih-alih dengan kata sandi utama Anda. PIN Anda akan diatur ulang apabila Anda pernah keluar sepenuhnya dari Bitwarden." + "setPinCode": { + "message": "Anda dapat menggunakan PIN ini untuk membuka Bitwarden. PIN Anda akan diatur ulang jika Anda keluar dari semua sesi aplikasi." }, "pinRequired": { "message": "Membutuhkan kode PIN." @@ -2205,7 +2208,7 @@ "message": "Gunakan kata sandi ini" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Gunakan frasa sandi ini" }, "useThisUsername": { "message": "Gunakan nama pengguna ini" @@ -2515,6 +2518,10 @@ "change": { "message": "Ubah" }, + "changePassword": { + "message": "Ubah kata sandi", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Ubah kata sandi - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Kata sandi yang berisiko" + }, "atRiskPasswords": { "message": "Kata sandi yang berrisiko" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Kata sandi Anda untuk situs ini dalam bahaya. $ORGANIZATION$ telah meminta Anda untuk mengubahnya.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ ingin Anda untuk mengubah kata sandi ini karena kata sandi itu dalam bahaya. Pergi ke pengaturan akun Anda untuk mengubah kata sandinya.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Tinjau dan ubah satu kata sandi berrisiko" }, @@ -2678,7 +2708,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Jumlah akses maksimum tercapai", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -3022,13 +3052,13 @@ "message": "Tidak ada pengidentifikasi unik yang ditemukan." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Sebuah kata sandi utama tidak lagi dibutuhkan untuk para anggota dari organisasi berikut. Silakan konfirmasi domain berikut kepada pengelola organisasi Anda." }, "organizationName": { - "message": "Organization name" + "message": "Nama organisasi" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Domain penghubung kunci" }, "leaveOrganization": { "message": "Tinggalkan Organisasi" @@ -3615,11 +3645,11 @@ "message": "Percayai pengguna" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Kirim informasi sensitif dengan aman", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Bagikan berkas-berkas dan data secara aman dengan siapa saja, pada platform apapun. Informasi Anda akan tetap terenkripsi dari ujung-ke-ujung sembari membatasi paparan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4560,10 +4590,10 @@ "message": "Unduh dari bitwarden.com sekarang" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "Dapatkan di Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Unduh di App Store" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Apakah Anda yakin ingin menghapus lampiran ini selamanya?" @@ -4866,13 +4896,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Berhasil menetapkan koleksi" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Anda belum memilih apa pun." }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Benda dipindah ke $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4881,7 +4911,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Benda dipindah ke $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4890,7 +4920,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ dipindah ke bawah, posisi $INDEX$ dari $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4910,25 +4940,25 @@ "message": "Lokasi Item" }, "fileSend": { - "message": "File Send" + "message": "Berkas Send" }, "fileSends": { - "message": "File Sends" + "message": "Berkas-berkas Send" }, "textSend": { - "message": "Text Send" + "message": "Teks Send" }, "textSends": { - "message": "Text Sends" + "message": "Teks Send" }, "accountActions": { "message": "Tindakan akun" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Tampilkan jumlah saran isi otomatis login pada ikon pengaya" }, "showQuickCopyActions": { - "message": "Show quick copy actions on Vault" + "message": "Tampilkan tindakan salin cepat pada Vault" }, "systemDefault": { "message": "Baku sistem" @@ -4964,58 +4994,58 @@ "message": "Coba lagi" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Minimal tenggat waktu ubahsuai adalah 1 menit." }, "additionalContentAvailable": { - "message": "Additional content is available" + "message": "Konten tambahan telah tersedia" }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Berkas tersimpan di perangkat. Kelola dari unduhan perangkat Anda." }, "showCharacterCount": { "message": "Tunjukkan cacah karakter" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Sembunyikan jumlah karakter" }, "itemsInTrash": { - "message": "Items in trash" + "message": "Benda-benda di tempat sampah" }, "noItemsInTrash": { - "message": "No items in trash" + "message": "Tidak ada benda di tempat sampah" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Benda-benda yang Anda hapus akan muncul di sini dan akan dihapus selamanya setelah 30 hari" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "Benda-benda yang berada di tempat sampah lebih dari 30 hari akan dihapus secara otomatis" }, "restore": { - "message": "Restore" + "message": "Pulihkan" }, "deleteForever": { - "message": "Delete forever" + "message": "Hapus selamanya" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Anda tidak memiliki izin untuk menyunting benda ini" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Buka dengan biometrik tidak tersedia karena memerlukan PIN atau kata sandi untuk membuka terlebih dahulu." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Buka dengan biometrik tidak tersedia untuk saat ini." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Buka dengan biometrik tidak tersedia karena pengaturan berkas-berkas sistem yang tidak sesuai." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Buka dengan biometrik tidak tersedia karena pengaturan berkas-berkas sistem yang tidak sesuai." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Buka dengan biometrik tidak tersedia karena aplikasi destop Bitwarden tertutup." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Buka dengan biometrik tidak tersedia karena tidak dinyalakan untuk $EMAIL$ pada aplikasi destop Bitwarden.", "placeholders": { "email": { "content": "$1", @@ -5024,22 +5054,25 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Buka dengan biometrik tidak tersedia untuk saat ini karena alasan yang tidak diketahui." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Buka brankas Anda dalam hitungan detik" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Anda dapat mengubahsuai pengaturan membuka dan waktu tenggat Anda agar dapat lebih cepat mengakses brankas Anda." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "PIN untuk membuka telah diatur" + }, + "unlockBiometricSet": { + "message": "Biometrik untuk membuka telah diatur" }, "authenticating": { - "message": "Authenticating" + "message": "Sedang memeriksa keaslian" }, "fillGeneratedPassword": { - "message": "Fill generated password", + "message": "Isi kata sandi yang dihasilkan", "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { @@ -5047,7 +5080,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Simpan ke Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5252,67 +5285,67 @@ "message": "Ubah kata sandi yang berrisiko" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Pilihan brankas" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Brankas melindungi lebih dari kata sandi Anda. Simpan login aman, pengenal, kartu dan catatan secara aman di sini." }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Selamat datang ke Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Keamanan, diutamakan" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "Simpan login, kartu, dan pengenal ke brankas aman Anda. Bitwarden menggunakan ketidaktahuan, enkripsi dari ujung-ke-ujung untuk melindungi apa yang penting bagi Anda." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Masuk dengan cepat dan mudah" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Atur buka dengan biometrik dan isi otomatis untuk masuk ke akun-akun Anda tanpa mengetik sebuah huruf." }, "secureUser": { - "message": "Level up your logins" + "message": "Tingkatkan login Anda" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Gunakan penghasil untuk membuat dan menyimpan kata sandi yang kuat dan unit untuk semua akun Anda." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Data Anda, kapanpun dan dimanapun Anda membutuhkannya" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Simpan kata sandi tak terbatas lintas perangkat tak terbatas dengan Bitwarden untuk ponsel, peramban, dan aplikasi destop." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 pemberitahuan" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Impor kata sandi yang sudah ada" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Gunakan pengimpor untuk memindakan login dengan cepat ke Bitwarden tanpa menambahkannya secara manual." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Impor sekarang" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Selamat datang di brankas Anda!" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Benda-benda isi otomatis untuk halaman saat ini" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Benda yang disukai untuk akses cepat" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Cari brankas Anda untuk sesuatu yang lain" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Hemat waktu dengan isi otomatis" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Sertakan", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, @@ -5358,23 +5391,27 @@ "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Buat kata sandi dengan cepat" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Buat kata sandi yang kuat dan unik dengan mudah dengan menekan pada", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "untuk membantu Anda menyimpan login Anda dengan aman.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Buat kata sandi yang kuat dan unik dengan mudah dengan menekan pada tombol Buat kata sandi untuk membantu Anda menyimpan login Anda dengan aman.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Anda tidak memiliki izin untuk melihat halaman ini. Coba masuk dengan akun yang berbeda." + }, + "wasmNotSupported": { + "message": "WebAssembly tidak didukung atau tidak dinyalakan oleh peramban Anda. Web Assembly diperlukan untuk menggunakan aplikasi Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 81282951d93..09b92304287 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Chiave SSH" }, + "typeNote": { + "message": "Nota" + }, "newItemHeader": { "message": "Nuovo $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le tue impostazioni PIN saranno resettate se esci completamente dall'app." }, - "setYourPinCode1": { - "message": "Il tuo PIN sarà usato per sbloccare Bitwarden invece della password principale. Il PIN sarà ripristinato se ti disconnetterai completamente da Bitwarden." + "setPinCode": { + "message": "Puoi usare il PIN per sbloccare Bitwarden. Il PIN sarà disattivato ogni volta che ti scolleghi dall'account." }, "pinRequired": { "message": "Codice PIN obbligatorio." @@ -2515,6 +2518,10 @@ "change": { "message": "Cambia" }, + "changePassword": { + "message": "Cambia password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Cambia parola d'accesso - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Password a rischio" + }, "atRiskPasswords": { "message": "Parola d'accesso a rischio" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "La tua password per questo sito è a rischio. $ORGANIZATION$ ha richiesto di modificarla.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ ti chiede di cambiare la tua password perché è a rischio. Vai alle impostazioni del tuo account per la modifica.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Rivedi e modifica una parola d'accesso a rischio" }, @@ -3597,7 +3627,7 @@ "message": "Fidati" }, "doNotTrust": { - "message": "Non fidarti" + "message": "Non considerare affidabile" }, "organizationNotTrusted": { "message": "L'organizzazione non è fidata" @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Sblocca PIN impostato" }, + "unlockBiometricSet": { + "message": "Sblocco biometrico" + }, "authenticating": { "message": "Autenticazione" }, @@ -5342,7 +5375,7 @@ "message": "Mantieni al sicuro i tuoi dati sensibili" }, "newNoteNudgeBody": { - "message": "Con le note, memorizzi in modo sicuro i dati sensibili come i dettagli bancari o assicurativi." + "message": "Usa le note per memorizzare in modo sicuro i dati sensibili come i dettagli bancari o assicurativi." }, "newSshNudgeTitle": { "message": "Accesso SSH ideale per gli sviluppatori" @@ -5371,10 +5404,14 @@ "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Crea facilmente password forti e uniche cliccando sul pulsante Genera password per aiutarti a mantenere al sicuro i tuoi login.", + "message": "Crea facilmente password forti e uniche cliccando sul pulsante 'Genera password' per aiutarti a mantenere al sicuro i tuoi login.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { "message": "Non hai i permessi per visualizzare questa pagina. Prova ad accedere con un altro account." + }, + "wasmNotSupported": { + "message": "WebAssembly non è supportato dal browser o non è abilitato. WebAssembly è richiesto per utilizzare l'app Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 43fb9621f8f..9b96507cb2c 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH 鍵" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "$TYPE$ を新規作成", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Bitwarden のロックを解除するための PIN コードを設定します。アプリから完全にログアウトすると、PIN 設定はリセットされます。" }, - "setYourPinCode1": { - "message": "あなたの PIN はマスターパスワードの代わりに Bitwarden のロックを解除するために使用されます。Bitwarden から完全にログアウトすると PIN がリセットされます。" + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN コードが必要です。" @@ -2515,6 +2518,10 @@ "change": { "message": "変更" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "パスワードの変更 - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "リスクがあるパスワード" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "1 件の危険なパスワードを確認・変更する" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "認証中" }, @@ -5252,7 +5285,7 @@ "message": "危険なパスワードの変更" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "保管庫オプション" }, "emptyVaultDescription": { "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 8789bada8d1..00fcf43aa67 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "ავთენტიკაცია" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 032d8c89d49..2d29efcc89e 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 411d9446390..da9a4637444 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "ಬಿಟ್‌ವಾರ್ಡೆನ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನಿಮ್ಮ ಪಿನ್ ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಿ. ನೀವು ಎಂದಾದರೂ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಸಂಪೂರ್ಣವಾಗಿ ಲಾಗ್ out ಟ್ ಆಗಿದ್ದರೆ ನಿಮ್ಮ ಪಿನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮರುಹೊಂದಿಸಲಾಗುತ್ತದೆ." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "ಪಿನ್ ಕೋಡ್ ಅಗತ್ಯವಿದೆ." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index f3af50ef779..a49ca045dd4 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH 키" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "새 $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Bitwarden 잠금해제에 사용될 PIN 코드를 설정합니다. 이 애플리케이션에서 완전히 로그아웃할 경우 PIN 설정이 초기화됩니다." }, - "setYourPinCode1": { - "message": "PIN은 마스터 비밀번호 대신 Bitwarden 잠금해제에 사용됩니다. Bitwarden에서 완전히 로그아웃하면 PIN이 재설정됩니다." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN 코드가 필요합니다." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "인증 중" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 0884081c173..6b672696c2f 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Naujas $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Nustatykite savo PIN kodą, kad atrakintumėte „Bitwarden“. Jūsų PIN nustatymai bus nustatyti iš naujo, jei kada nors visiškai atsijungsite nuo programos." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN kodas yra privalomas." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 63b2098fe00..c0690140cc2 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH atslēga" }, + "typeNote": { + "message": "Piezīme" + }, "newItemHeader": { "message": "Jauns/a $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Iestatīt PIN kodu Bitwarden atslēgšanai. PIN iestatījumi tiks atiestatīti pēc pilnīgas izrakstīšanās no lietotnes." }, - "setYourPinCode1": { - "message": "PIN būs izmantojams galvenās paroles vietā, lai atslēgtu Bitwarden. PIN tiks atiestatīts, ja kādreiz notiks pilnīga izrakstīšanās no Bitwarden." + "setPinCode": { + "message": "Šo PIN var izmantot, lai atslēgtu Bitwarden. PIN tiks atiestatīts pēc pilnīgas atteikšanās lietotnē." }, "pinRequired": { "message": "Ir nepieciešams PIN kods." @@ -2515,6 +2518,10 @@ "change": { "message": "Mainīt" }, + "changePassword": { + "message": "Mainīt paroli", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Mainīt paroli - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Riskam pakļauta parole" + }, "atRiskPasswords": { "message": "Riskam pakļautās paroles" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Šīs vietnes parole ir pakļauta riskam. $ORGANIZATION$ pieprasīja, lai tā tiktu nomainīta.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ vēlas, lai šī parole tiktu nomainīta, jo tā ir pakļauta riskam. Jādodas uz sava konta iestatījumiem, lai nomainītu paroli.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Pārskatīt un mainīt vienu riskam pakļautu paroli" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Atslēgšanas PIN iestatīts" }, + "unlockBiometricSet": { + "message": "Atslēgt biometrijas kopu" + }, "authenticating": { "message": "Autentificē" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Nav atļaujas apskatīt šo lapu. Jāmēģina pieteikties ar citu kontu." + }, + "wasmNotSupported": { + "message": "WebAssembly šajā pārlūkā netiek atbalstīts vai nav iespējots. WebAssebly ir nepieciešams, lai izmantotu Bitwarden lietotni.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 8a59821fc7a..3bbb7e28da6 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Bitwarden അൺലോക്കുചെയ്യുന്നതിന് തങ്ങളുടെ പിൻ കോഡ് സജ്ജമാക്കുക. തങ്ങൾ എപ്പോഴെങ്കിലും അപ്ലിക്കേഷനിൽ നിന്ന് പൂർണ്ണമായി ലോഗ് ഔട്ട് ചെയ്യുകയാണെങ്കിൽ, പിൻ ക്രമീകരണങ്ങൾ പുനസജ്ജമാക്കും." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "പിൻ കോഡ് നിർബന്ധമാണ്." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index 01d8e475f0b..fdbd6a9895a 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 032d8c89d49..2d29efcc89e 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index a20eb5b1b12..0ec9268c915 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH-nøkkel" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Ny $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Angi PIN-koden din for å låse opp Bitwarden. PIN-innstillingene tilbakestilles hvis du logger deg helt ut av programmet." }, - "setYourPinCode1": { - "message": "PIN-koden din vil bli brukt til å låse opp Bitwarden i stedet for hovedpassordet ditt. PIN-koden din tilbakestilles hvis du noen gang logger deg helt ut av Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN-kode er påkrevd." @@ -2515,6 +2518,10 @@ "change": { "message": "Endre" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Endre passord - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Autentiserer" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 032d8c89d49..2d29efcc89e 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index bad44058213..a4e49771077 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH-sleutel" }, + "typeNote": { + "message": "Notitie" + }, "newItemHeader": { "message": "Nieuwe $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Stel je PIN-code in voor het ontgrendelen van Bitwarden. Je PIN-code wordt opnieuw ingesteld als je je ooit volledig afmeldt bij de applicatie." }, - "setYourPinCode1": { - "message": "Je pincode wordt gebruikt om Bitwarden te ontgrendelen in plaats van je hoofdwachtwoord. Je pincode wordt opnieuw ingesteld als je ooit volledig uitlogt op Bitwarden." + "setPinCode": { + "message": "Je kunt deze PIN gebruiken voor het ontgrendelen van Bitwarden. Je PIN wordt opnieuw ingesteld als je je ooit volledig afmeldt bij de applicatie." }, "pinRequired": { "message": "PIN-code is vereist." @@ -2515,6 +2518,10 @@ "change": { "message": "Wijzigen" }, + "changePassword": { + "message": "Wachtwoord wijzigen", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Wachtwoord wijzigen - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Risicovolle wachtwoorden" + }, "atRiskPasswords": { "message": "Risicovolle wachtwoorden" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Je wachtwoord voor deze website is een risico. $ORGANIZATION$ vraagt je deze te veranderen.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wil dat je dit wachtwoord verandert omdat het in gevaar is. Navigeer naar je accountinstellingen om het wachtwoord te wijzigen.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Eén risicovol wachtwoord beoordelen en wijzigen" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "PIN-code ontgrendelen instellen" }, + "unlockBiometricSet": { + "message": "Biometrische set ontgrendelen" + }, "authenticating": { "message": "Aan het inloggen" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Je hebt geen rechten om deze pagina te bekijken. Probeer in te loggen met een ander account." + }, + "wasmNotSupported": { + "message": "WebAssembly wordt niet ondersteund in je browser of is niet ingeschakeld. WebAssembly is vereist om de Bitwarden-app te gebruiken.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 032d8c89d49..2d29efcc89e 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 032d8c89d49..2d29efcc89e 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index df5ff1b4b37..de6dfa2d7ff 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Klucz SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Nowy $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Ustaw kod PIN do odblokowywania aplikacji Bitwarden. Ustawienia odblokowywania kodem PIN zostaną zresetowane po wylogowaniu." }, - "setYourPinCode1": { - "message": "Twój PIN będzie używany do odblokowania Bitwardena zamiast hasła głównego. Twój kod PIN zostanie zresetowany jeśli kiedykolwiek wylogujesz się z Bitwarden." + "setPinCode": { + "message": "Możesz użyć tego kodu PIN, aby odblokować Bitwarden. Twój kod PIN zostanie zresetowany, jeśli kiedykolwiek wylogujesz się z aplikacji." }, "pinRequired": { "message": "Kod PIN jest wymagany." @@ -2515,6 +2518,10 @@ "change": { "message": "Zmień" }, + "changePassword": { + "message": "Zmień hasło", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Zmień hasło - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Zagrożone hasło" + }, "atRiskPasswords": { "message": "Zagrożone hasła" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Twoje hasło dla tej witryny jest zagrożone. Organizacja $ORGANIZATION$ poprosiła Cię o jego zmianę.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ chce, abyś zmienił to hasło, ponieważ jest ono zagrożone. Przejdź do ustawień konta, aby zmienić hasło.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Przejrzyj i zmień jedno zagrożone hasło" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Ustaw kod PIN odblokowujący" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Uwierzytelnianie" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Nie masz uprawnień do przeglądania tej strony. Spróbuj zalogować się na inne konto." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 1ae2c2c1a07..542c2be0a0b 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Chave SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Nova $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Defina o seu código PIN para desbloquear o Bitwarden. Suas configurações de PIN serão redefinidas se alguma vez você encerrar completamente toda a sessão do aplicativo." }, - "setYourPinCode1": { - "message": "O seu PIN será usado para desbloquear o Bitwarden em vez da sua senha mestra. O seu PIN será redefinido se terminar sessão completa do Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "O código PIN é necessário." @@ -2515,6 +2518,10 @@ "change": { "message": "Alterar" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Alterar senha - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Senhas em risco" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Revisar e alterar uma senha vulnerável" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Autenticando" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index c88f9b9b5eb..103dc0351da 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Chave SSH" }, + "typeNote": { + "message": "Nota" + }, "newItemHeader": { "message": "Novo(a) $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Defina o seu código PIN para desbloquear o Bitwarden. As suas definições de PIN serão redefinidas se alguma vez terminar sessão por completo da aplicação." }, - "setYourPinCode1": { - "message": "O seu PIN será utilizado para desbloquear o Bitwarden em vez da sua palavra-passe mestra. O seu PIN será reposto se alguma vez terminar totalmente a sessão no Bitwarden." + "setPinCode": { + "message": "Pode utilizar este PIN para desbloquear o Bitwarden. O seu PIN será reposto se alguma vez terminar sessão completamente da aplicação." }, "pinRequired": { "message": "É necessário o código PIN." @@ -2515,6 +2518,10 @@ "change": { "message": "Alterar" }, + "changePassword": { + "message": "Alterar palavra-passe", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Alterar palavra-passe - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Palavra-passe em risco" + }, "atRiskPasswords": { "message": "Palavras-passe em risco" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "A sua palavra-passe deste site está em risco. A $ORGANIZATION$ pediu-lhe que a alterasse.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "A $ORGANIZATION$ pretende que altere esta palavra-passe porque está em risco. Navegue até às definições da sua conta para alterar a palavra-passe.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Rever e alterar uma palavra-passe em risco" }, @@ -4832,7 +4862,7 @@ "message": "Selecione as coleções a atribuir" }, "personalItemTransferWarningSingular": { - "message": "1 será permanentemente transferido para a organização selecionada. Este item deixará de lhe pertencer." + "message": "1 item será permanentemente transferido para a organização selecionada. Este item deixará de lhe pertencer." }, "personalItemsTransferWarningPlural": { "message": "$PERSONAL_ITEMS_COUNT$ itens serão permanentemente transferidos para a organização selecionada. Estes itens deixarão de lhe pertencer.", @@ -4844,7 +4874,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 será permanentemente transferido para a $ORG$. Este item deixará de lhe pertencer.", + "message": "1 item será permanentemente transferido para a $ORG$. Este item deixará de lhe pertencer.", "placeholders": { "org": { "content": "$1", @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Definição do PIN de desbloqueio" }, + "unlockBiometricSet": { + "message": "Desbloquear conjunto de biometria" + }, "authenticating": { "message": "A autenticar" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Não tem permissões para ver esta página. Tente iniciar sessão com uma conta diferente." + }, + "wasmNotSupported": { + "message": "O WebAssembly não é suportado no seu navegador ou não está ativado. O WebAssembly é necessário para utilizar a app Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 4342afc635f..5a21d0886a4 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Stabiliți codul PIN de deblocare Bitwarden. Setările codului PIN vor fi reinițializate dacă vă deconectați vreodată din aplicație." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Codul PIN este necesar." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 937ad7700c7..130ded8ef0a 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Ключ SSH" }, + "typeNote": { + "message": "Заметка" + }, "newItemHeader": { "message": "Новый $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Установите PIN-код для разблокировки Bitwarden. Настройки PIN-кода будут сброшены, если вы когда-либо полностью выйдете из приложения." }, - "setYourPinCode1": { - "message": "Ваш PIN-код будет использоваться для разблокировки Bitwarden вместо мастер-пароля. PIN-код будет сброшен, если вы выйдете из Bitwarden." + "setPinCode": { + "message": "Вы можете использовать этот PIN-код для разблокировки Bitwarden. PIN-код будет сброшен, если вы когда-либо полностью выйдете из приложения." }, "pinRequired": { "message": "Необходим PIN-код." @@ -2515,6 +2518,10 @@ "change": { "message": "Изменить" }, + "changePassword": { + "message": "Изменить пароль", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Изменить пароль - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Пароль, подверженный риску" + }, "atRiskPasswords": { "message": "Пароли, подверженные риску" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Ваш пароль для этого сайта подвержен риску. Организация $ORGANIZATION$ попросила вас изменить его.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "Организация $ORGANIZATION$ просит вас изменить этот пароль, поскольку он подвержен риску. Перейдите в настройки аккаунта для изменения пароля.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Проверить и изменить один пароль, подверженный риску" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Установить PIN--код разблокировки" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Аутентификация" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "У вас нет прав для просмотра этой страницы. Попробуйте авторизоваться под другим аккаунтом." + }, + "wasmNotSupported": { + "message": "WebAssembly не поддерживается вашим браузером или не включен. WebAssembly необходим для использования приложения Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 7832a96efc6..70019afd17c 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "බිට්වර්ඩන් අගුළු ඇරීමට ඔබේ PIN අංකය කේතය සකසන්න. ඔබ කවදා හෝ යෙදුමෙන් සම්පූර්ණයෙන්ම පුරනය වී ඇත්නම් ඔබගේ PIN සැකසුම් නැවත සකසනු ඇත." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN කේතය අවශ්ය වේ." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index eac6179685b..600ab1817b8 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Kľúč SSH" }, + "typeNote": { + "message": "Poznámka" + }, "newItemHeader": { "message": "Nové $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Nastaviť kód PIN na odomykanie Bitwardenu. Nastavenie PIN sa vynuluje, ak sa úplne odhlásite z aplikácie." }, - "setYourPinCode1": { - "message": "Na odomknutie Bitwardenu sa namiesto hlavného hesla použije váš PIN. Váš PIN sa resetuje, ak sa niekedy úplne odhlásite zo Bitwardenu." + "setPinCode": { + "message": "Tento PIN môžete použiť na odomknutie Bitwardenu. PIN sa resetuje, ak sa úplne odhlásite z aplikácie." }, "pinRequired": { "message": "Kód PIN je povinný." @@ -2515,6 +2518,10 @@ "change": { "message": "Zmeniť" }, + "changePassword": { + "message": "Zmeniť heslo", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Zmeniť heslo - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Rizikové heslo" + }, "atRiskPasswords": { "message": "Rizikové heslá" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Vaše heslo pre túto stránku je rizikové. Organizácia $ORGANIZATION$ vás požiadala o jeho zmenu.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ chce, aby ste toto heslo zmenili, pretože je rizikové. Prejdite do nastavení svojho účtu a zmeňte heslo.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Skontrolujte a zmeňte jedno ohrozené heslo" }, @@ -4409,7 +4439,7 @@ "message": "Nie je čo kopírovať" }, "assignToCollections": { - "message": "Prideliť k zbierkam" + "message": "Priradiť ku zbierkam" }, "copyEmail": { "message": "Skopírovať e-mail" @@ -4731,7 +4761,7 @@ "message": "Položky si budú môcť pozrieť len členovia organizácie s prístupom k týmto zbierkam." }, "bulkCollectionAssignmentWarning": { - "message": "Vybrali ste $TOTAL_COUNT$ položky. Nemôžete aktualizovať $READONLY_COUNT$ položky(-iek), pretože nemáte oprávnenie na úpravu.", + "message": "Vybrali ste položky ($TOTAL_COUNT$). Nemôžete aktualizovať $READONLY_COUNT$ položky(-iek), pretože nemáte oprávnenie na úpravu.", "placeholders": { "total_count": { "content": "$1", @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "PIN na odomknutie nastavený" }, + "unlockBiometricSet": { + "message": "Odomknutie biometrickými údajmi nastavené" + }, "authenticating": { "message": "Overuje sa" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Nemáte oprávnenie na zobrazenie tejto stránky. Skúste sa prihlásiť pomocou iného účtu." + }, + "wasmNotSupported": { + "message": "WebAssembly nie je vo vašom prehliadači podporovaný alebo nie je povolený. Na používanie Bitwardenu sa vyžaduje WebAssembly.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index c42b4a3a2ba..25bbabfc0c6 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Za odklep Bitwardna si nastavite PIN-kodo. PIN-koda bo ponastavljena, če se boste popolnoma odjavili iz aplikacije." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Potrebna je PIN-koda." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index d0d76cba4cf..0479276441b 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -1366,7 +1366,7 @@ "message": "Функција је недоступна" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "Legacy енкрипција више није подржана. Молимо контактирајте подршку за повраћај налога." }, "premiumMembership": { "message": "Премијум чланство" @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH кључ" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Нови $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Поставите свој ПИН код за откључавање Bitwarden-а. Поставке ПИН-а ће се ресетовати ако се икада потпуно одјавите из апликације." }, - "setYourPinCode1": { - "message": "Ваш ПИН ће се користити за откључавање Bitwarden-а уместо ваше главне лозинке. Ваш ПИН ће се ресетовати ако се икада потпуно одјавите са Bitwarden-а." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "ПИН је обавезан." @@ -2515,6 +2518,10 @@ "change": { "message": "Промени" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Промена лозинке - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Лозинке под ризиком" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Прегледајте и промените једну лозинку за ризик" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Постављен ПИН деблокирања" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Аутентификација" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Немате дозволе за преглед ове странице. Покушајте да се пријавите са другим налогом." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index a6cc305469d..5af58bc3419 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH-nyckel" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Ny $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Ange en PIN-kod för att låsa upp Bitwarden. Dina PIN-inställningar återställs om du någonsin loggar ut helt från programmet." }, - "setYourPinCode1": { - "message": "Din PIN-kod kommer att användas för att låsa upp Bitwarden istället för ditt huvudlösenord. Din PIN-kod kommer att återställas om du någonsin helt loggar ut från Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN-kod krävs." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 032d8c89d49..2d29efcc89e 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 46fe36ab0da..7d291b911be 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "ตั้ง PIN เพื่อใช้ปลดล็อก Bitwarden ทั้งนี้ หากคุณล็อกเอาต์ออกจากแอปโดยสมบูรณ์จะเป็นการลบการตั้งค่า PIN ของคุณด้วย" }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "ต้องระบุ PIN" @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index c31f3507c54..abde20c43e0 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -84,7 +84,7 @@ "message": "Ana parola ipucu (isteğe bağlı)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Parola Güvenlik Puanı $SCORE$", "placeholders": { "score": { "content": "$1", @@ -350,19 +350,19 @@ "message": "Bitwarden Secrets Manager" }, "continueToSecretsManagerPageDesc": { - "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + "message": "Geliştirici gizli anahtarlarınızı Bitwarden Secrets Manager ile güvenli bir şekilde saklayın, yönetin ve paylaşın. Daha fazla bilgi için bitwarden.com web sitesini ziyaret edin." }, "passwordlessDotDev": { "message": "Passwordless.dev" }, "continueToPasswordlessDotDevPageDesc": { - "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + "message": "Passwordless.dev ile geleneksel parolalara ihtiyaç duymadan sorunsuz ve güvenli oturum açma deneyimleri oluşturun. Daha fazla bilgi için bitwarden.com web sitesini ziyaret edin." }, "freeBitwardenFamilies": { "message": "Ücretsiz Bitwarden Aile" }, "freeBitwardenFamiliesPageDesc": { - "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + "message": "Ücretsiz Bitwarden Aile Paketi’nden faydalanmaya hak kazandınız. Bu teklifi bugün web uygulaması üzerinden kullanın." }, "version": { "message": "Sürüm" @@ -398,7 +398,7 @@ "message": "Klasör adı" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Bir klasörü iç içe yerleştirmek için, üst klasörün adını yazdıktan sonra “/” ekleyin. Örnek: Sosyal/Forumlar" }, "noFoldersAdded": { "message": "Hiç klasör eklenmedi" @@ -468,7 +468,7 @@ "message": "Parola üretildi" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Parola ifadesi oluşturuldu" }, "usernameGenerated": { "message": "Kullanıcı adı üretildi" @@ -842,13 +842,13 @@ "message": "Mevcut web sayfasındaki kimlik doğrulayıcı QR kodunu tarayın" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "2 adımlı doğrulamayı sorunsuz hale getirin" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden, 2 adımlı doğrulama kodlarını saklayabilir ve otomatik olarak doldurabilir. Anahtarı kopyalayıp bu alana yapıştırın." }, "totpHelperWithCapture": { - "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + "message": "Bitwarden, iki adımlı doğrulama kodlarını saklayabilir ve otomatik olarak doldurabilir. Bu web sitesinin doğrulayıcı QR kodunun ekran görüntüsünü almak için kamera simgesini seçin veya anahtarı bu alana kopyalayıp yapıştırın." }, "learnMoreAboutAuthenticators": { "message": "Kimlik doğrulayıcılar hakkında bilgi alın" @@ -878,10 +878,10 @@ "message": "Kimlik doğrulama uygulamanızdaki kodu girin" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Kimlik doğrulamak için YubiKey’inize dokunun" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Hesabınız için Duo iki adımlı giriş gereklidir. Giriş işlemini tamamlamak için aşağıdaki adımları izleyin." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Girişi tamamlamak için aşağıdaki adımları izleyin." @@ -1141,7 +1141,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Harika iş çıkardınız! Kendinizi ve $ORGANIZATION$’ı daha güvenli hale getirmek için gereken adımları attınız.", "placeholders": { "organization": { "content": "$1" @@ -1150,7 +1150,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "$ORGANIZATION$’ı daha güvenli hale getirdiğiniz için teşekkürler. Güncellemeniz gereken $TASK_COUNT$ adet parola daha var.", "placeholders": { "organization": { "content": "$1" @@ -1162,7 +1162,7 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Sonraki parolayı değiştir", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { @@ -1366,7 +1366,7 @@ "message": "Özellik kullanılamıyor" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "Eski şifreleme artık desteklenmemektedir. Hesabınızı kurtarmak için lütfen destek ekibiyle iletişime geçin." }, "premiumMembership": { "message": "Premium üyelik" @@ -1496,7 +1496,7 @@ "message": "Güvenlik anahtarını oku" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Güvenlik anahtarı etkileşimi bekleniyor…" }, "loginUnavailable": { "message": "Giriş yapılamıyor" @@ -1556,13 +1556,13 @@ "message": "Şirket içinde barındırılan ortam" }, "selfHostedBaseUrlHint": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + "message": "Yerel sunucunuzda barındırılan Bitwarden kurulumunuzun temel URL’sini belirtin. Örnek: https://bitwarden.sirketiniz.com" }, "selfHostedCustomEnvHeader": { "message": "İleri düzey yapılandırma için her hizmetin taban URL'sini bağımsız olarak belirleyebilirsiniz." }, "selfHostedEnvFormInvalid": { - "message": "You must add either the base Server URL or at least one custom environment." + "message": "Temel Sunucu URL’sini veya en az bir özel ortam eklemelisiniz." }, "customEnvironment": { "message": "Özel ortam" @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH anahtarı" }, + "typeNote": { + "message": "Not" + }, "newItemHeader": { "message": "Yeni $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Bitwarden'ı açarken kullanacağınız PIN kodunu belirleyin. Uygulamadan tamamen çıkış yaparsanız PIN ayarlarınız sıfırlanacaktır." }, - "setYourPinCode1": { - "message": "Bitwarden'ın kilidini açmak için ana parolanız yerine PIN'iniz kullanılacaktır. Bitwarden'dan tamamen çıkış yaparsanız PIN'iniz sıfırlanır." + "setPinCode": { + "message": "Bitwarden'ın kilidini açmak için bu PIN'i kullanabilirsiniz. Uygulamadan tamamen çıkış yaparsanız PIN'iniz sıfırlanacaktır." }, "pinRequired": { "message": "PIN kodu gerekli." @@ -2205,7 +2208,7 @@ "message": "Bu parolayı kullan" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Bu parola ifadesini kullanın" }, "useThisUsername": { "message": "Bu kullanıcı adını kullan" @@ -2377,7 +2380,7 @@ "message": "Gizlilik Politikası" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Yeni parolanız mevcut parolanızla aynı olamaz." }, "hintEqualsPassword": { "message": "Parola ipucunuz parolanızla aynı olamaz." @@ -2515,6 +2518,10 @@ "change": { "message": "Değiştir" }, + "changePassword": { + "message": "Parolayı değiştir", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Parolayı değiştir - $ITEMNAME$", "placeholders": { @@ -2524,11 +2531,14 @@ } } }, + "atRiskPassword": { + "message": "Riskli parolalar" + }, "atRiskPasswords": { "message": "Riskli parolalar" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$, risk altında olduğu için bir parolanızı değiştirmenizi istiyor.", "placeholders": { "organization": { "content": "$1", @@ -2537,7 +2547,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$, risk altında oldukları için $COUNT$ adet parolanızı değiştirmenizi istiyor.", "placeholders": { "organization": { "content": "$1", @@ -2550,7 +2560,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Organizasyonlarınız, risk altında oldukları için $COUNT$ adet parolanızı değiştirmenizi istiyor.", "placeholders": { "count": { "content": "$1", @@ -2558,11 +2568,31 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Risk altında olan bir parolayı inceleyin ve değiştirin" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Risk altında olan $COUNT$ adet parolayı inceleyin ve değiştirin", "placeholders": { "count": { "content": "$1", @@ -2571,40 +2601,40 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Risk altındaki parolaları daha hızlı değiştirin" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Ayarlarınızı güncelleyin, böylece parolalarınızı hızlıca otomatik doldurabilir ve yeni parolalar oluşturabilirsiniz" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Risk altındaki girişleri inceleyin" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Risk altındaki parolaları inceleyin" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Organizasyonunuzun parolaları zayıf, tekrar kullanılmış ve/veya açığa çıkmış olduğu için risk altındadır.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Illustration of a list of logins that are at-risk." + "message": "Risk altında olan girişlerin bir listesinin görseli." }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Risk altındaki sitede Bitwarden otomatik doldurma menüsü ile hızlıca güçlü ve benzersiz bir parola oluşturun.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password." + "message": "Oluşturulan parolayı gösteren Bitwarden otomatik doldurma menüsünün görseli." }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Bitwarden’da güncelleyin" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden, ardından parola yöneticisinde parolayı güncellemeniz için sizi yönlendirecektir.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." + "message": "Kullanıcıya giriş bilgilerini güncellemesi için bildirim gönderen Bitwarden’in görseli." }, "turnOnAutofill": { "message": "Otomatik doldurmayı etkinleştir" @@ -2896,7 +2926,7 @@ "message": "Ana parolanız kuruluş ilkelerinizi karşılamıyor. Kasanıza erişmek için ana parolanızı güncellemelisiniz. Devam ettiğinizde oturumunuz kapanacak ve yeniden oturum açmanız gerekecektir. Diğer cihazlardaki aktif oturumlar bir saate kadar aktif kalabilir." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "Organizasyonunuz, güvenilir cihaz şifrelemesini devre dışı bıraktı. Kasanıza erişmek için lütfen bir ana parola belirleyin." }, "resetPasswordPolicyAutoEnroll": { "message": "Otomatik eklenme" @@ -3022,7 +3052,7 @@ "message": "Benzersiz tanımlayıcı bulunamadı." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Aşağıdaki organizasyonun üyeleri için artık ana parola gerekmemektedir. Lütfen alan adını organizasyon yöneticinizle doğrulayın." }, "organizationName": { "message": "Kuruluş adı" @@ -3091,14 +3121,14 @@ "message": "Şifre çözme sorunu" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden, aşağıda listelenen kasa öğelerinin şifresini çözemedi." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Müşteri ekibi ile başarıyla iletişime geçtin", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "Ek veri kaybını önlemek için.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3122,7 +3152,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": "Güçlü bir parola oluşturmak için $RECOMMENDED$ veya daha fazla karakter kullanın.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3132,7 +3162,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": "Güçlü bir parola ifadesi oluşturmak için $RECOMMENDED$ veya daha fazla kelime kullanın.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3209,7 +3239,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Geçersiz $SERVICENAME$ API anahtarı", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -3219,7 +3249,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Geçersiz $SERVICENAME$ API anahtarı: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3233,7 +3263,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$, isteğinizi reddetti. Yardım için lütfen hizmet sağlayıcınızla iletişime geçin.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3243,7 +3273,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$, isteğinizi reddetti: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3257,7 +3287,7 @@ } }, "forwarderNoAccountId": { - "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "message": "$SERVICENAME$ maskeli e-posta hesap kimliği alınamıyor.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -3591,10 +3621,10 @@ "message": "Cihaza güvenildi" }, "trustOrganization": { - "message": "Trust organization" + "message": "Organizasyona güven" }, "trust": { - "message": "Trust" + "message": "Güven" }, "doNotTrust": { "message": "Güvenme" @@ -3603,16 +3633,16 @@ "message": "Kuruluş güvenilir değil" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "Hesabınızın güvenliği için, yalnızca bu kullanıcıya acil erişim yetkisi verdiyseniz ve parmak izi hesaplarındakiyle uyuşuyorsa onaylayın." }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "Hesabınızın güvenliği için, yalnızca bu kuruluşun bir üyesiyseniz, hesap kurtarma etkinse ve aşağıda görüntülenen parmak izi kuruluşun parmak iziyle eşleşiyorsa devam edin." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Bu kuruluşun, sizi hesap kurtarma sistemine kaydedecek bir kurumsal politikası vardır. Bu kaydolma işlemi, kuruluş yöneticilerinin parolanızı değiştirmesine izin verir. Yalnızca bu kuruluşu tanıyorsanız ve aşağıda görüntülenen parmak izi ifadesi kuruluşun parmak iziyle eşleşiyorsa devam edin." }, "trustUser": { - "message": "Trust user" + "message": "Kullanıcıya güven" }, "sendsTitleNoItems": { "message": "Hassas bilgileri güvenle paylaşın", @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Kimlik doğrulanıyor" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "Bu sayfayı görüntüleme izniniz yok. Farklı bir hesapla giriş yapmayı deneyin." + }, + "wasmNotSupported": { + "message": "Tarayıcınızda WebAssembly desteklenmiyor veya etkinleştirilmemişt. Bitwarden uygulamasını kullanmak için WebAssembly gereklidir.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 141de06e0a9..8f9e8e21f36 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -1360,13 +1360,13 @@ "message": "Оберіть файл" }, "maxFileSize": { - "message": "Максимальний розмір файлу 500 Мб." + "message": "Максимальний розмір файлу 500 МБ." }, "featureUnavailable": { "message": "Функція недоступна" }, "legacyEncryptionUnsupported": { - "message": "Legacy encryption is no longer supported. Please contact support to recover your account." + "message": "Застаріле шифрування більше не підтримується. Зверніться до служби підтримки, щоб відновити обліковий запис." }, "premiumMembership": { "message": "Преміум статус" @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "Ключ SSH" }, + "typeNote": { + "message": "Нотатка" + }, "newItemHeader": { "message": "Новий $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Встановіть PIN-код для розблокування Bitwarden. Налаштування PIN-коду будуть скинуті, якщо ви коли-небудь повністю вийдете з програми." }, - "setYourPinCode1": { - "message": "PIN-код буде використовуватися для розблокування Bitwarden замість головного пароля. У разі повного виходу з Bitwarden, ваш PIN-код буде скинуто." + "setPinCode": { + "message": "Ви можете використовувати цей PIN-код для розблокування Bitwarden. PIN-код буде скинуто, якщо ви вийдете з програми." }, "pinRequired": { "message": "Необхідний PIN-код." @@ -2205,7 +2208,7 @@ "message": "Використати цей пароль" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Використати цю парольну фразу" }, "useThisUsername": { "message": "Використати це ім'я користувача" @@ -2515,6 +2518,10 @@ "change": { "message": "Змінити" }, + "changePassword": { + "message": "Змінити пароль", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Змінити пароль – $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "Ризикований пароль" + }, "atRiskPasswords": { "message": "Ризиковані паролі" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Пароль для цього сайту ризикований. Організація $ORGANIZATION$ попросила вас змінити його.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ хоче, щоб ви змінили цей пароль, тому що він ризикований. Перейдіть до налаштувань облікового запису, щоб змінити пароль.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Перегляньте і змініть один ризикований пароль" }, @@ -2678,7 +2708,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Досягнуто максимальної кількості доступів", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Розблокування PIN-кодом встановлено" }, + "unlockBiometricSet": { + "message": "Біометричне розблокування налаштовано" + }, "authenticating": { "message": "Аутентифікація" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "У вас немає дозволу переглядати цю сторінку. Спробуйте ввійти з іншим обліковим записом." + }, + "wasmNotSupported": { + "message": "WebAssembly не підтримується або не ввімкнено у вашому браузері. WebAssembly є обов'язковою вимогою для програми Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index 6af7ae6df41..b27e419eb30 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "$TYPE$ mới", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "Đặt mã PIN của bạn để mở khóa Bitwarden. Cài đặt mã PIN của bạn sẽ bị xóa nếu bạn hoàn toàn đăng xuất khỏi ứng dụng." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Mã PIN là bắt buộc." @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index cfd35616fa9..de945e94110 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH 密钥" }, + "typeNote": { + "message": "笔记" + }, "newItemHeader": { "message": "新增 $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "设定您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您完全注销此应用程序时被重置。" }, - "setYourPinCode1": { - "message": "您的 PIN 码将代替主密码用于解锁 Bitwarden。如果您完全注销 Bitwarden,PIN 码将被重置。" + "setPinCode": { + "message": "您可以使用此 PIN 码解锁 Bitwarden。您的 PIN 码将在您完全注销此应用程序时被重置。" }, "pinRequired": { "message": "需要 PIN 码。" @@ -2515,6 +2518,10 @@ "change": { "message": "更改" }, + "changePassword": { + "message": "更改密码", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "更改密码 - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "存在风险的密码" + }, "atRiskPasswords": { "message": "存在风险的密码" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "该网站密码存在风险,$ORGANIZATION$ 要求您更改此密码。", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ 希望您更改此密码,因为它存在风险。请前往账户设置更改此密码。", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "审查并更改 1 个存在风险的密码" }, @@ -4869,7 +4899,7 @@ "message": "成功分配了集合" }, "nothingSelected": { - "message": "您尚未选择任何内容。" + "message": "您没有选择任何内容。" }, "itemsMovedToOrg": { "message": "项目已移动到 $ORGNAME$", @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "解锁 PIN 设置" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "正在验证" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "您没有查看此页面的权限。请尝试使用其他账户登录。" + }, + "wasmNotSupported": { + "message": "您的浏览器不支持 WebAssembly 或 WebAssembly 未启用。使用 Bitwarden App 需要 WebAssembly。", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 00fb93c6302..1614cf3c9ff 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -1922,6 +1922,9 @@ "typeSshKey": { "message": "SSH 金鑰" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "新增 $TYPE$", "placeholders": { @@ -2153,8 +2156,8 @@ "setYourPinCode": { "message": "設定您用來解鎖 Bitwarden 的 PIN 碼。您的 PIN 設定將在您完全登出本應用程式時被重設。" }, - "setYourPinCode1": { - "message": "您的 PIN 碼會取代主密碼用來解鎖 Bitwarden。您的 PIN 碼會重置,若您完全登出 Bitwarden。" + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "必須填入 PIN 碼。" @@ -2515,6 +2518,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2531,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2568,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -5035,6 +5065,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockBiometricSet": { + "message": "Unlock biometrics set" + }, "authenticating": { "message": "驗證中" }, @@ -5376,5 +5409,9 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." } } diff --git a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts index 3c94fbeef70..48fd57431a2 100644 --- a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts @@ -4,7 +4,7 @@ import { Router } from "@angular/router"; import { Subject, firstValueFrom, map, of, startWith, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { LockService } from "@bitwarden/auth/common"; +import { LockService, LogoutService } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -69,6 +69,7 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy { private vaultTimeoutSettingsService: VaultTimeoutSettingsService, private authService: AuthService, private lockService: LockService, + private logoutService: LogoutService, ) {} get accountLimit() { @@ -140,12 +141,9 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy { }); if (confirmed) { - const result = await this.accountSwitcherService.logoutAccount(userId); - // unlocked logout responses need to be navigated out of the account switcher. - // other responses will be handled by background and app.component - if (result?.status === AuthenticationStatus.Unlocked) { - this.location.back(); - } + await this.logoutService.logout(userId); + // navigate to root so redirect guard can properly route next active user or null user to correct page + await this.router.navigate(["/"]); } this.loading = false; } diff --git a/apps/browser/src/auth/popup/account-switching/account.component.ts b/apps/browser/src/auth/popup/account-switching/account.component.ts index cdd2656fdc1..c060d9161ef 100644 --- a/apps/browser/src/auth/popup/account-switching/account.component.ts +++ b/apps/browser/src/auth/popup/account-switching/account.component.ts @@ -1,7 +1,8 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { CommonModule, Location } from "@angular/common"; +import { CommonModule } from "@angular/common"; import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { Router } from "@angular/router"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -23,7 +24,7 @@ export class AccountComponent { constructor( private accountSwitcherService: AccountSwitcherService, - private location: Location, + private router: Router, private i18nService: I18nService, private logService: LogService, private biometricsService: BiometricsService, @@ -44,8 +45,8 @@ export class AccountComponent { // Navigate out of account switching for unlocked accounts // locked or logged out account statuses are handled by background and app.component - if (result?.status === AuthenticationStatus.Unlocked) { - this.location.back(); + if (result?.authenticationStatus === AuthenticationStatus.Unlocked) { + await this.router.navigate(["vault"]); await this.biometricsService.setShouldAutopromptNow(false); } else { await this.biometricsService.setShouldAutopromptNow(true); diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts index 1fdd0b1ecf2..4bacd453803 100644 --- a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.spec.ts @@ -207,35 +207,4 @@ describe("AccountSwitcherService", () => { expect(removeListenerSpy).toBeCalledTimes(1); }); }); - - describe("logout", () => { - const userId1 = "1" as UserId; - const userId2 = "2" as UserId; - it("initiates logout", async () => { - let listener: ( - message: { command: string; userId: UserId; status: AuthenticationStatus }, - sender: unknown, - sendResponse: unknown, - ) => void; - jest.spyOn(chrome.runtime.onMessage, "addListener").mockImplementation((addedListener) => { - listener = addedListener; - }); - - const removeListenerSpy = jest.spyOn(chrome.runtime.onMessage, "removeListener"); - - const logoutPromise = accountSwitcherService.logoutAccount(userId1); - - listener( - { command: "switchAccountFinish", userId: userId2, status: AuthenticationStatus.Unlocked }, - undefined, - undefined, - ); - - const result = await logoutPromise; - - expect(messagingService.send).toHaveBeenCalledWith("logout", { userId: userId1 }); - expect(result).toEqual({ newUserId: userId2, status: AuthenticationStatus.Unlocked }); - expect(removeListenerSpy).toBeCalledTimes(1); - }); - }); }); diff --git a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts index bfed7dc1408..7bb12fc260d 100644 --- a/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts +++ b/apps/browser/src/auth/popup/account-switching/services/account-switcher.service.ts @@ -12,6 +12,7 @@ import { timeout, } from "rxjs"; +import { NewActiveUser } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AvatarService } from "@bitwarden/common/auth/abstractions/avatar.service"; @@ -43,7 +44,7 @@ export class AccountSwitcherService { SPECIAL_ADD_ACCOUNT_ID = "addAccount"; availableAccounts$: Observable; - switchAccountFinished$: Observable<{ userId: UserId; status: AuthenticationStatus }>; + switchAccountFinished$: Observable; constructor( private accountService: AccountService, @@ -118,7 +119,7 @@ export class AccountSwitcherService { [message: { command: string; userId: UserId; status: AuthenticationStatus }] >(chrome.runtime.onMessage).pipe( filter(([message]) => message.command === "switchAccountFinish"), - map(([message]) => ({ userId: message.userId, status: message.status })), + map(([message]) => ({ userId: message.userId, authenticationStatus: message.status })), ); } @@ -143,29 +144,9 @@ export class AccountSwitcherService { return await switchAccountFinishedPromise; } - /** - * - * @param userId the user id to logout - * @returns the userId and status of the that has been switch to due to the logout. null on errors. - */ - async logoutAccount( - userId: UserId, - ): Promise<{ newUserId: UserId; status: AuthenticationStatus } | null> { - // logout creates an account switch to the next up user, which may be null - const switchPromise = this.listenForSwitchAccountFinish(null); - - await this.messagingService.send("logout", { userId }); - - // wait for account switch to happen, the result will be the new user id and status - const result = await switchPromise; - return { newUserId: result.userId, status: result.status }; - } - // Listens for the switchAccountFinish message and returns the userId from the message // Optionally filters switchAccountFinish to an expected userId - private listenForSwitchAccountFinish( - expectedUserId: UserId | null, - ): Promise<{ userId: UserId; status: AuthenticationStatus } | null> { + listenForSwitchAccountFinish(expectedUserId: UserId | null): Promise { return firstValueFrom( this.switchAccountFinished$.pipe( filter(({ userId }) => (expectedUserId ? userId === expectedUserId : true)), diff --git a/apps/browser/src/auth/guards/fido2-auth.guard.ts b/apps/browser/src/auth/popup/guards/fido2-auth.guard.ts similarity index 93% rename from apps/browser/src/auth/guards/fido2-auth.guard.ts rename to apps/browser/src/auth/popup/guards/fido2-auth.guard.ts index 7d7f1f5c4e9..87d490b3d92 100644 --- a/apps/browser/src/auth/guards/fido2-auth.guard.ts +++ b/apps/browser/src/auth/popup/guards/fido2-auth.guard.ts @@ -9,7 +9,7 @@ import { import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { BrowserRouterService } from "../../platform/popup/services/browser-router.service"; +import { BrowserRouterService } from "../../../platform/popup/services/browser-router.service"; /** * This guard verifies the user's authentication status. diff --git a/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.spec.ts b/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.spec.ts deleted file mode 100644 index 8f3199cdfce..00000000000 --- a/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Router } from "@angular/router"; -import { MockProxy, mock } from "jest-mock-extended"; -import { BehaviorSubject } from "rxjs"; - -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; - -import { postLogoutMessageListener$ } from "../utils/post-logout-message-listener"; - -import { ExtensionLoginDecryptionOptionsService } from "./extension-login-decryption-options.service"; - -// Mock the module providing postLogoutMessageListener$ -jest.mock("../utils/post-logout-message-listener", () => { - return { - postLogoutMessageListener$: new BehaviorSubject(""), // Replace with mock subject - }; -}); - -describe("ExtensionLoginDecryptionOptionsService", () => { - let service: ExtensionLoginDecryptionOptionsService; - - let messagingService: MockProxy; - let router: MockProxy; - let postLogoutMessageSubject: BehaviorSubject; - - beforeEach(() => { - messagingService = mock(); - router = mock(); - - // Cast postLogoutMessageListener$ to BehaviorSubject for dynamic control - postLogoutMessageSubject = postLogoutMessageListener$ as BehaviorSubject; - - service = new ExtensionLoginDecryptionOptionsService(messagingService, router); - }); - - it("should instantiate the service", () => { - expect(service).not.toBeFalsy(); - }); - - describe("logOut()", () => { - it("should send a logout message", async () => { - postLogoutMessageSubject.next("switchAccountFinish"); - - await service.logOut(); - - expect(messagingService.send).toHaveBeenCalledWith("logout"); - }); - - it("should navigate to root on 'switchAccountFinish'", async () => { - postLogoutMessageSubject.next("switchAccountFinish"); - - await service.logOut(); - - expect(router.navigate).toHaveBeenCalledWith(["/"]); - }); - - it("should not navigate for 'doneLoggingOut'", async () => { - postLogoutMessageSubject.next("doneLoggingOut"); - - await service.logOut(); - - expect(router.navigate).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.ts b/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.ts deleted file mode 100644 index 3e591e08ac1..00000000000 --- a/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Router } from "@angular/router"; -import { firstValueFrom } from "rxjs"; - -import { - DefaultLoginDecryptionOptionsService, - LoginDecryptionOptionsService, -} from "@bitwarden/auth/angular"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; - -import { postLogoutMessageListener$ } from "../utils/post-logout-message-listener"; - -export class ExtensionLoginDecryptionOptionsService - extends DefaultLoginDecryptionOptionsService - implements LoginDecryptionOptionsService -{ - constructor( - protected messagingService: MessagingService, - private router: Router, - ) { - super(messagingService); - } - - override async logOut(): Promise { - // start listening for "switchAccountFinish" or "doneLoggingOut" - const messagePromise = firstValueFrom(postLogoutMessageListener$); - - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - super.logOut(); - - // wait for messages - const command = await messagePromise; - - // doneLoggingOut already has a message handler that will navigate us - if (command === "switchAccountFinish") { - await this.router.navigate(["/"]); - } - } -} diff --git a/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts b/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts index 6d1f0571ae7..bd85ff9293e 100644 --- a/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts +++ b/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts @@ -16,7 +16,7 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { BrowserPlatformUtilsService } from "../../../platform/services/platform-utils/browser-platform-utils.service"; -import { ExtensionAnonLayoutWrapperDataService } from "../extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; +import { ExtensionAnonLayoutWrapperDataService } from "../../../popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; import { ExtensionLoginComponentService } from "./extension-login-component.service"; diff --git a/apps/browser/src/auth/popup/login/extension-login-component.service.ts b/apps/browser/src/auth/popup/login/extension-login-component.service.ts index 49ed0635b7a..37d74616391 100644 --- a/apps/browser/src/auth/popup/login/extension-login-component.service.ts +++ b/apps/browser/src/auth/popup/login/extension-login-component.service.ts @@ -11,7 +11,7 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; -import { ExtensionAnonLayoutWrapperDataService } from "../extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; +import { ExtensionAnonLayoutWrapperDataService } from "../../../popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; @Injectable() export class ExtensionLoginComponentService diff --git a/apps/browser/src/auth/popup/logout/extension-logout.service.spec.ts b/apps/browser/src/auth/popup/logout/extension-logout.service.spec.ts new file mode 100644 index 00000000000..7ab7742c1c3 --- /dev/null +++ b/apps/browser/src/auth/popup/logout/extension-logout.service.spec.ts @@ -0,0 +1,101 @@ +import { MockProxy, mock } from "jest-mock-extended"; + +import { LogoutReason, LogoutService } from "@bitwarden/auth/common"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { AccountSwitcherService } from "../account-switching/services/account-switcher.service"; + +import { ExtensionLogoutService } from "./extension-logout.service"; + +describe("ExtensionLogoutService", () => { + let logoutService: LogoutService; + let messagingService: MockProxy; + let accountSwitcherService: MockProxy; + + let primaryUserId: UserId; + let secondaryUserId: UserId; + let logoutReason: LogoutReason; + + beforeEach(() => { + primaryUserId = "1" as UserId; + secondaryUserId = "2" as UserId; + logoutReason = "vaultTimeout"; + + messagingService = mock(); + accountSwitcherService = mock(); + logoutService = new ExtensionLogoutService(messagingService, accountSwitcherService); + }); + + it("instantiates", () => { + expect(logoutService).not.toBeFalsy(); + }); + + describe("logout", () => { + describe("No new active user", () => { + beforeEach(() => { + accountSwitcherService.listenForSwitchAccountFinish.mockResolvedValue(null); + }); + + it("sends logout message without a logout reason when not provided", async () => { + const result = await logoutService.logout(primaryUserId); + + expect(accountSwitcherService.listenForSwitchAccountFinish).toHaveBeenCalledTimes(1); + expect(messagingService.send).toHaveBeenCalledWith("logout", { userId: primaryUserId }); + + expect(result).toBeUndefined(); + }); + + it("sends logout message with a logout reason when provided", async () => { + const result = await logoutService.logout(primaryUserId, logoutReason); + + expect(accountSwitcherService.listenForSwitchAccountFinish).toHaveBeenCalledTimes(1); + expect(messagingService.send).toHaveBeenCalledWith("logout", { + userId: primaryUserId, + logoutReason, + }); + expect(result).toBeUndefined(); + }); + }); + + describe("New active user", () => { + const newActiveUserAuthenticationStatus = AuthenticationStatus.Unlocked; + + beforeEach(() => { + accountSwitcherService.listenForSwitchAccountFinish.mockResolvedValue({ + userId: secondaryUserId, + authenticationStatus: newActiveUserAuthenticationStatus, + }); + }); + + it("sends logout message without a logout reason when not provided and returns the new active user", async () => { + const result = await logoutService.logout(primaryUserId); + + expect(accountSwitcherService.listenForSwitchAccountFinish).toHaveBeenCalledTimes(1); + + expect(messagingService.send).toHaveBeenCalledWith("logout", { userId: primaryUserId }); + + expect(result).toEqual({ + userId: secondaryUserId, + authenticationStatus: newActiveUserAuthenticationStatus, + }); + }); + + it("sends logout message with a logout reason when provided and returns the new active user", async () => { + const result = await logoutService.logout(primaryUserId, logoutReason); + + expect(accountSwitcherService.listenForSwitchAccountFinish).toHaveBeenCalledTimes(1); + + expect(messagingService.send).toHaveBeenCalledWith("logout", { + userId: primaryUserId, + logoutReason, + }); + expect(result).toEqual({ + userId: secondaryUserId, + authenticationStatus: newActiveUserAuthenticationStatus, + }); + }); + }); + }); +}); diff --git a/apps/browser/src/auth/popup/logout/extension-logout.service.ts b/apps/browser/src/auth/popup/logout/extension-logout.service.ts new file mode 100644 index 00000000000..c43c18f157a --- /dev/null +++ b/apps/browser/src/auth/popup/logout/extension-logout.service.ts @@ -0,0 +1,39 @@ +import { + DefaultLogoutService, + LogoutReason, + LogoutService, + NewActiveUser, +} from "@bitwarden/auth/common"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { AccountSwitcherService } from "../account-switching/services/account-switcher.service"; + +export class ExtensionLogoutService extends DefaultLogoutService implements LogoutService { + constructor( + protected messagingService: MessagingService, + private accountSwitcherService: AccountSwitcherService, + ) { + super(messagingService); + } + + override async logout( + userId: UserId, + logoutReason?: LogoutReason, + ): Promise { + // logout can result in an account switch to the next up user + const accountSwitchFinishPromise = + this.accountSwitcherService.listenForSwitchAccountFinish(null); + + // send the logout message + this.messagingService.send("logout", { userId, logoutReason }); + + // wait for the account switch to finish + const result = await accountSwitchFinishPromise; + if (result) { + return { userId: result.userId, authenticationStatus: result.authenticationStatus }; + } + // if there is no account switch, return undefined + return undefined; + } +} diff --git a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts index 15c4dbee98b..b50e1f55032 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts @@ -36,7 +36,7 @@ import { DialogService, ToastService } from "@bitwarden/components"; import { BiometricStateService, BiometricsService, KeyService } from "@bitwarden/key-management"; import { BrowserApi } from "../../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../../platform/browser/browser-popup-utils"; import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; import { PopupRouterCacheService } from "../../../platform/popup/view-cache/popup-router-cache.service"; 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 61937a30e8f..066332b0e23 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -70,7 +70,7 @@ import { import { BiometricErrors, BiometricErrorTypes } from "../../../models/biometricErrors"; import { BrowserApi } from "../../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../../platform/browser/browser-popup-utils"; import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; @@ -474,12 +474,14 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { this.form.controls.pin.setValue(userHasPinSet, { emitEvent: false }); const requireReprompt = (await this.pinService.getPinLockType(userId)) == "EPHEMERAL"; this.form.controls.pinLockWithMasterPassword.setValue(requireReprompt, { emitEvent: false }); - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("unlockPinSet"), - }); - await this.vaultNudgesService.dismissNudge(NudgeType.AccountSecurity, userId); + if (userHasPinSet) { + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("unlockPinSet"), + }); + await this.vaultNudgesService.dismissNudge(NudgeType.AccountSecurity, userId); + } } else { const userId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); await this.vaultTimeoutSettingsService.clear(userId); @@ -532,6 +534,11 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { if (!successful) { await this.biometricStateService.setFingerprintValidated(false); } + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("unlockWithBiometricSet"), + }); } catch (error) { this.form.controls.biometric.setValue(false); this.validationService.showError(error); diff --git a/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts b/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts index b2c20ba2849..af850c9a7bc 100644 --- a/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts +++ b/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts @@ -1,6 +1,6 @@ import { createChromeTabMock } from "../../../autofill/spec/autofill-mocks"; import { BrowserApi } from "../../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../../platform/browser/browser-popup-utils"; import { AuthPopoutType, diff --git a/apps/browser/src/auth/popup/utils/auth-popout-window.ts b/apps/browser/src/auth/popup/utils/auth-popout-window.ts index 0646b684b22..0611891b61e 100644 --- a/apps/browser/src/auth/popup/utils/auth-popout-window.ts +++ b/apps/browser/src/auth/popup/utils/auth-popout-window.ts @@ -1,7 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { BrowserApi } from "../../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../../platform/browser/browser-popup-utils"; const AuthPopoutType = { unlockExtension: "auth_unlockExtension", diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts index 2247328acab..52b2e1bf4c5 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts @@ -13,7 +13,7 @@ jest.mock("../popup/utils/auth-popout-window", () => { }; }); -jest.mock("../../platform/popup/browser-popup-utils", () => ({ +jest.mock("../../platform/browser/browser-popup-utils", () => ({ inSingleActionPopout: jest.fn(), inPopout: jest.fn(), })); @@ -22,7 +22,9 @@ import { DuoLaunchAction } from "@bitwarden/auth/angular"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { BrowserApi } from "../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../platform/browser/browser-popup-utils"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { AuthPopoutType, closeSsoAuthResultPopout, diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts index f768b223984..154abe13448 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts @@ -6,7 +6,9 @@ import { import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { BrowserApi } from "../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../platform/browser/browser-popup-utils"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { AuthPopoutType, closeSsoAuthResultPopout, diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-duo-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-duo-component.service.ts index 594e09fc50c..8fa72cdfc6c 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-duo-component.service.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-duo-component.service.ts @@ -5,6 +5,8 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openTwoFactorAuthDuoPopout } from "../../auth/popup/utils/auth-popout-window"; import { ZonedMessageListenerService } from "../../platform/browser/zoned-message-listener.service"; diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts index 01a0129d0e5..432d00047a2 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts @@ -13,12 +13,14 @@ jest.mock("../popup/utils/auth-popout-window", () => { }; }); -jest.mock("../../platform/popup/browser-popup-utils", () => ({ +jest.mock("../../platform/browser/browser-popup-utils", () => ({ inPopup: jest.fn(), })); +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openTwoFactorAuthEmailPopout } from "../../auth/popup/utils/auth-popout-window"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../platform/browser/browser-popup-utils"; import { ExtensionTwoFactorAuthEmailComponentService } from "./extension-two-factor-auth-email-component.service"; diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts index 293d88c4e64..e9cb53f935e 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts @@ -6,8 +6,10 @@ import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { DialogService } from "@bitwarden/components"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openTwoFactorAuthEmailPopout } from "../../auth/popup/utils/auth-popout-window"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../platform/browser/browser-popup-utils"; // TODO: popup state persistence should eventually remove the need for this service export class ExtensionTwoFactorAuthEmailComponentService diff --git a/apps/browser/src/autofill/background/abstractions/notification.background.ts b/apps/browser/src/autofill/background/abstractions/notification.background.ts index db110319d20..9c9c5c0e243 100644 --- a/apps/browser/src/autofill/background/abstractions/notification.background.ts +++ b/apps/browser/src/autofill/background/abstractions/notification.background.ts @@ -1,6 +1,9 @@ import { NeverDomains } from "@bitwarden/common/models/domain/domain-service"; import { ServerConfig } from "@bitwarden/common/platform/abstractions/config/server-config"; +import { UserId } from "@bitwarden/common/types/guid"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { FolderView } from "@bitwarden/common/vault/models/view/folder.view"; +import { SecurityTask } from "@bitwarden/common/vault/tasks"; import { CollectionView } from "../../content/components/common-types"; import { NotificationQueueMessageTypes } from "../../enums/notification-queue-message-type.enum"; @@ -32,10 +35,17 @@ interface AddUnlockVaultQueueMessage extends NotificationQueueMessage { type: "unlock"; } +interface AtRiskPasswordQueueMessage extends NotificationQueueMessage { + type: "at-risk-password"; + organizationName: string; + passwordChangeUri?: string; +} + type NotificationQueueMessageItem = | AddLoginQueueMessage | AddChangePasswordQueueMessage - | AddUnlockVaultQueueMessage; + | AddUnlockVaultQueueMessage + | AtRiskPasswordQueueMessage; type LockedVaultPendingNotificationsData = { commandToRetry: { @@ -50,6 +60,13 @@ type LockedVaultPendingNotificationsData = { target: string; }; +type AtRiskPasswordNotificationsData = { + activeUserId: UserId; + cipher: CipherView; + securityTask: SecurityTask; + uri: string; +}; + type AdjustNotificationBarMessageData = { height: number; }; @@ -76,7 +93,8 @@ type NotificationBackgroundExtensionMessage = { data?: Partial & Partial & Partial & - Partial; + Partial & + Partial; login?: AddLoginMessageData; folder?: string; edit?: boolean; @@ -101,10 +119,20 @@ type NotificationBackgroundExtensionMessageHandlers = { sender, }: BackgroundOnMessageHandlerParams) => Promise; bgCloseNotificationBar: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; - bgOpenAtRisksPasswords: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; + bgOpenAtRiskPasswords: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; bgAdjustNotificationBar: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; - bgAddLogin: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; - bgChangedPassword: ({ message, sender }: BackgroundOnMessageHandlerParams) => Promise; + bgTriggerAddLoginNotification: ({ + message, + sender, + }: BackgroundOnMessageHandlerParams) => Promise; + bgTriggerChangedPasswordNotification: ({ + message, + sender, + }: BackgroundOnMessageHandlerParams) => Promise; + bgTriggerAtRiskPasswordNotification: ({ + message, + sender, + }: BackgroundOnMessageHandlerParams) => Promise; bgRemoveTabFromNotificationQueue: ({ sender }: BackgroundSenderParam) => void; bgSaveCipher: ({ message, sender }: BackgroundOnMessageHandlerParams) => void; bgOpenAddEditVaultItemPopout: ({ diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index b161200215a..5e7e3ed30f5 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -275,7 +275,7 @@ describe("NotificationBackground", () => { }); }); - describe("bgAddLogin message handler", () => { + describe("bgTriggerAddLoginNotification message handler", () => { let tab: chrome.tabs.Tab; let sender: chrome.runtime.MessageSender; let getEnableAddedLoginPromptSpy: jest.SpyInstance; @@ -305,7 +305,7 @@ describe("NotificationBackground", () => { it("skips attempting to add the login if the user is logged out", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgAddLogin", + command: "bgTriggerAddLoginNotification", login: { username: "test", password: "password", url: "https://example.com" }, }; activeAccountStatusMock$.next(AuthenticationStatus.LoggedOut); @@ -319,7 +319,7 @@ describe("NotificationBackground", () => { it("skips attempting to add the login if the login data does not contain a valid url", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgAddLogin", + command: "bgTriggerAddLoginNotification", login: { username: "test", password: "password", url: "" }, }; activeAccountStatusMock$.next(AuthenticationStatus.Locked); @@ -333,7 +333,7 @@ describe("NotificationBackground", () => { it("skips attempting to add the login if the user with a locked vault has disabled the login notification", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgAddLogin", + command: "bgTriggerAddLoginNotification", login: { username: "test", password: "password", url: "https://example.com" }, }; activeAccountStatusMock$.next(AuthenticationStatus.Locked); @@ -350,7 +350,7 @@ describe("NotificationBackground", () => { it("skips attempting to add the login if the user with an unlocked vault has disabled the login notification", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgAddLogin", + command: "bgTriggerAddLoginNotification", login: { username: "test", password: "password", url: "https://example.com" }, }; activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); @@ -368,7 +368,7 @@ describe("NotificationBackground", () => { it("skips attempting to change the password for an existing login if the user has disabled changing the password notification", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgAddLogin", + command: "bgTriggerAddLoginNotification", login: { username: "test", password: "password", url: "https://example.com" }, }; activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); @@ -390,7 +390,7 @@ describe("NotificationBackground", () => { it("skips attempting to change the password for an existing login if the password has not changed", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgAddLogin", + command: "bgTriggerAddLoginNotification", login: { username: "test", password: "password", url: "https://example.com" }, }; activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); @@ -410,7 +410,10 @@ 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 }; + const message: NotificationBackgroundExtensionMessage = { + command: "bgTriggerAddLoginNotification", + login, + }; activeAccountStatusMock$.next(AuthenticationStatus.Locked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(true); @@ -426,7 +429,10 @@ describe("NotificationBackground", () => { password: "password", url: "https://example.com", } as any; - const message: NotificationBackgroundExtensionMessage = { command: "bgAddLogin", login }; + const message: NotificationBackgroundExtensionMessage = { + command: "bgTriggerAddLoginNotification", + login, + }; activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(true); getAllDecryptedForUrlSpy.mockResolvedValueOnce([ @@ -441,7 +447,10 @@ describe("NotificationBackground", () => { 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 }; + const message: NotificationBackgroundExtensionMessage = { + command: "bgTriggerAddLoginNotification", + login, + }; activeAccountStatusMock$.next(AuthenticationStatus.Unlocked); getEnableAddedLoginPromptSpy.mockResolvedValueOnce(true); getEnableChangedPasswordPromptSpy.mockResolvedValueOnce(true); @@ -464,7 +473,7 @@ describe("NotificationBackground", () => { }); }); - describe("bgChangedPassword message handler", () => { + describe("bgTriggerChangedPasswordNotification message handler", () => { let tab: chrome.tabs.Tab; let sender: chrome.runtime.MessageSender; let pushChangePasswordToQueueSpy: jest.SpyInstance; @@ -482,7 +491,7 @@ describe("NotificationBackground", () => { it("skips attempting to add the change password message to the queue if the passed url is not valid", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgChangedPassword", + command: "bgTriggerChangedPasswordNotification", data: { newPassword: "newPassword", currentPassword: "currentPassword", url: "" }, }; @@ -494,7 +503,7 @@ describe("NotificationBackground", () => { it("adds a change password message to the queue if the user does not have an unlocked account", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgChangedPassword", + command: "bgTriggerChangedPasswordNotification", data: { newPassword: "newPassword", currentPassword: "currentPassword", @@ -517,7 +526,7 @@ describe("NotificationBackground", () => { it("skips adding a change password message to the queue if the multiple ciphers exist for the passed URL and the current password is not found within the list of ciphers", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgChangedPassword", + command: "bgTriggerChangedPasswordNotification", data: { newPassword: "newPassword", currentPassword: "currentPassword", @@ -538,7 +547,7 @@ describe("NotificationBackground", () => { it("skips adding a change password message if more than one existing cipher is found with a matching password ", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgChangedPassword", + command: "bgTriggerChangedPasswordNotification", data: { newPassword: "newPassword", currentPassword: "currentPassword", @@ -560,7 +569,7 @@ describe("NotificationBackground", () => { it("adds a change password message to the queue if a single cipher matches the passed current password", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgChangedPassword", + command: "bgTriggerChangedPasswordNotification", data: { newPassword: "newPassword", currentPassword: "currentPassword", @@ -588,7 +597,7 @@ describe("NotificationBackground", () => { it("skips adding a change password message if no current password is passed in the message and more than one cipher is found for a url", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgChangedPassword", + command: "bgTriggerChangedPasswordNotification", data: { newPassword: "newPassword", url: "https://example.com", @@ -609,7 +618,7 @@ describe("NotificationBackground", () => { it("adds a change password message to the queue if no current password is passed with the message, but a single cipher is matched for the uri", async () => { const message: NotificationBackgroundExtensionMessage = { - command: "bgChangedPassword", + command: "bgTriggerChangedPasswordNotification", data: { newPassword: "newPassword", url: "https://example.com", diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index cb6a67c8137..a798798a980 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -3,7 +3,10 @@ import { firstValueFrom, switchMap, map, of } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; -import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { + getOrganizationById, + OrganizationService, +} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; @@ -41,8 +44,12 @@ import { TaskService } from "@bitwarden/common/vault/tasks"; import { SecurityTaskType } from "@bitwarden/common/vault/tasks/enums"; import { SecurityTask } from "@bitwarden/common/vault/tasks/models/security-task"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; import { BrowserApi } from "../../platform/browser/browser-api"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openAddEditVaultItemPopout, openViewVaultItemPopout, @@ -55,6 +62,7 @@ import { import { CollectionView } from "../content/components/common-types"; import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum"; import { AutofillService } from "../services/abstractions/autofill.service"; +import { TemporaryNotificationChangeLoginService } from "../services/notification-change-login-password.service"; import { AddChangePasswordQueueMessage, @@ -81,14 +89,18 @@ export default class NotificationBackground { ExtensionCommand.AutofillIdentity, ]); private readonly extensionMessageHandlers: NotificationBackgroundExtensionMessageHandlers = { - bgAddLogin: ({ message, sender }) => this.addLogin(message, sender), bgAdjustNotificationBar: ({ message, sender }) => this.handleAdjustNotificationBarMessage(message, sender), - bgChangedPassword: ({ message, sender }) => this.changedPassword(message, sender), + bgTriggerAddLoginNotification: ({ message, sender }) => + this.triggerAddLoginNotification(message, sender), + bgTriggerChangedPasswordNotification: ({ message, sender }) => + this.triggerChangedPasswordNotification(message, sender), + bgTriggerAtRiskPasswordNotification: ({ message, sender }) => + this.triggerAtRiskPasswordNotification(message, sender), bgCloseNotificationBar: ({ message, sender }) => this.handleCloseNotificationBarMessage(message, sender), - bgOpenAtRisksPasswords: ({ message, sender }) => - this.handleOpenAtRisksPasswordsMessage(message, sender), + bgOpenAtRiskPasswords: ({ message, sender }) => + this.handleOpenAtRiskPasswordsMessage(message, sender), bgGetActiveUserServerConfig: () => this.getActiveUserServerConfig(), bgGetDecryptedCiphers: () => this.getNotificationCipherData(), bgGetEnableChangedPasswordPrompt: () => this.getEnableChangedPasswordPrompt(), @@ -341,12 +353,17 @@ export default class NotificationBackground { tab: chrome.tabs.Tab, notificationQueueMessage: NotificationQueueMessageItem, ) { - const notificationType = notificationQueueMessage.type; + const { + type: notificationType, + wasVaultLocked: isVaultLocked, + launchTimestamp, + ...params + } = notificationQueueMessage; const typeData: NotificationTypeData = { - isVaultLocked: notificationQueueMessage.wasVaultLocked, + isVaultLocked, theme: await firstValueFrom(this.themeStateService.selectedTheme$), - launchTimestamp: notificationQueueMessage.launchTimestamp, + launchTimestamp, }; switch (notificationType) { @@ -358,6 +375,7 @@ export default class NotificationBackground { await BrowserApi.tabSendMessageData(tab, "openNotificationBar", { type: notificationType, typeData, + params, }); } @@ -375,6 +393,48 @@ export default class NotificationBackground { } } + /** + * Sends a message to trigger the at risk password notification + * + * @param message - The extension message + * @param sender - The contextual sender of the message + */ + async triggerAtRiskPasswordNotification( + message: NotificationBackgroundExtensionMessage, + sender: chrome.runtime.MessageSender, + ): Promise { + const { activeUserId, securityTask, cipher } = message.data; + const domain = Utils.getDomain(sender.tab.url); + const passwordChangeUri = + await new TemporaryNotificationChangeLoginService().getChangePasswordUrl(cipher); + + const authStatus = await this.getAuthStatus(); + + const wasVaultLocked = authStatus === AuthenticationStatus.Locked; + + const organization = await firstValueFrom( + this.organizationService + .organizations$(activeUserId) + .pipe(getOrganizationById(securityTask.organizationId)), + ); + + this.removeTabFromNotificationQueue(sender.tab); + const launchTimestamp = new Date().getTime(); + const queueMessage: NotificationQueueMessageItem = { + domain, + wasVaultLocked, + type: NotificationQueueMessageType.AtRiskPassword, + passwordChangeUri, + organizationName: organization.name, + tab: sender.tab, + launchTimestamp, + expires: new Date(launchTimestamp + NOTIFICATION_BAR_LIFESPAN_MS), + }; + this.notificationQueue.push(queueMessage); + await this.checkNotificationQueue(sender.tab); + return true; + } + /** * Adds a login message to the notification queue, prompting the user to save * the login if it does not already exist in the vault. If the cipher exists @@ -383,20 +443,20 @@ export default class NotificationBackground { * @param message - The message to add to the queue * @param sender - The contextual sender of the message */ - async addLogin( + async triggerAddLoginNotification( message: NotificationBackgroundExtensionMessage, sender: chrome.runtime.MessageSender, - ) { + ): Promise { const authStatus = await this.getAuthStatus(); if (authStatus === AuthenticationStatus.LoggedOut) { - return; + return false; } const loginInfo = message.login; const normalizedUsername = loginInfo.username ? loginInfo.username.toLowerCase() : ""; const loginDomain = Utils.getDomain(loginInfo.url); if (loginDomain == null) { - return; + return false; } const addLoginIsEnabled = await this.getEnableAddedLoginPrompt(); @@ -406,14 +466,14 @@ export default class NotificationBackground { await this.pushAddLoginToQueue(loginDomain, loginInfo, sender.tab, true); } - return; + return false; } const activeUserId = await firstValueFrom( this.accountService.activeAccount$.pipe(getOptionalUserId), ); if (activeUserId == null) { - return; + return false; } const ciphers = await this.cipherService.getAllDecryptedForUrl(loginInfo.url, activeUserId); @@ -422,7 +482,7 @@ export default class NotificationBackground { ); if (addLoginIsEnabled && usernameMatches.length === 0) { await this.pushAddLoginToQueue(loginDomain, loginInfo, sender.tab); - return; + return true; } const changePasswordIsEnabled = await this.getEnableChangedPasswordPrompt(); @@ -438,7 +498,9 @@ export default class NotificationBackground { loginInfo.password, sender.tab, ); + return true; } + return false; } private async pushAddLoginToQueue( @@ -472,14 +534,14 @@ export default class NotificationBackground { * @param message - The message to add to the queue * @param sender - The contextual sender of the message */ - async changedPassword( + async triggerChangedPasswordNotification( message: NotificationBackgroundExtensionMessage, sender: chrome.runtime.MessageSender, ) { const changeData = message.data as ChangePasswordMessageData; const loginDomain = Utils.getDomain(changeData.url); if (loginDomain == null) { - return; + return false; } if ((await this.getAuthStatus()) < AuthenticationStatus.Unlocked) { @@ -490,7 +552,7 @@ export default class NotificationBackground { sender.tab, true, ); - return; + return true; } let id: string = null; @@ -498,7 +560,7 @@ export default class NotificationBackground { this.accountService.activeAccount$.pipe(getOptionalUserId), ); if (activeUserId == null) { - return; + return false; } const ciphers = await this.cipherService.getAllDecryptedForUrl(changeData.url, activeUserId); @@ -514,7 +576,9 @@ export default class NotificationBackground { } if (id != null) { await this.pushChangePasswordToQueue(id, loginDomain, changeData.newPassword, sender.tab); + return true; } + return false; } /** @@ -900,7 +964,7 @@ export default class NotificationBackground { return null; } - private async getSecurityTasks(userId: UserId) { + async getSecurityTasks(userId: UserId) { let tasks: SecurityTask[] = []; if (userId) { @@ -1074,7 +1138,7 @@ export default class NotificationBackground { * @param message - The extension message * @param sender - The contextual sender of the message */ - private async handleOpenAtRisksPasswordsMessage( + private async handleOpenAtRiskPasswordsMessage( message: NotificationBackgroundExtensionMessage, sender: chrome.runtime.MessageSender, ) { diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts b/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts index a51757dabea..00114330bc4 100644 --- a/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay-notifications.background.spec.ts @@ -1,9 +1,12 @@ import { mock, MockProxy } from "jest-mock-extended"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { CLEAR_NOTIFICATION_LOGIN_DATA_DURATION } from "@bitwarden/common/autofill/constants"; 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 { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { TaskService } from "@bitwarden/common/vault/tasks"; import { BrowserApi } from "../../platform/browser/browser-api"; import AutofillField from "../models/autofill-field"; @@ -24,6 +27,9 @@ import { OverlayNotificationsBackground } from "./overlay-notifications.backgrou describe("OverlayNotificationsBackground", () => { let logService: MockProxy; let notificationBackground: NotificationBackground; + let taskService: TaskService; + let accountService: AccountService; + let cipherService: CipherService; let getEnableChangedPasswordPromptSpy: jest.SpyInstance; let getEnableAddedLoginPromptSpy: jest.SpyInstance; let overlayNotificationsBackground: OverlayNotificationsBackground; @@ -32,6 +38,9 @@ describe("OverlayNotificationsBackground", () => { jest.useFakeTimers(); logService = mock(); notificationBackground = mock(); + taskService = mock(); + accountService = mock(); + cipherService = mock(); getEnableChangedPasswordPromptSpy = jest .spyOn(notificationBackground, "getEnableChangedPasswordPrompt") .mockResolvedValue(true); @@ -41,6 +50,9 @@ describe("OverlayNotificationsBackground", () => { overlayNotificationsBackground = new OverlayNotificationsBackground( logService, notificationBackground, + taskService, + accountService, + cipherService, ); await overlayNotificationsBackground.init(); }); @@ -329,8 +341,11 @@ describe("OverlayNotificationsBackground", () => { tab: { id: 1 }, url: "https://example.com", }); - notificationChangedPasswordSpy = jest.spyOn(notificationBackground, "changedPassword"); - notificationAddLoginSpy = jest.spyOn(notificationBackground, "addLogin"); + notificationChangedPasswordSpy = jest.spyOn( + notificationBackground, + "triggerChangedPasswordNotification", + ); + notificationAddLoginSpy = jest.spyOn(notificationBackground, "triggerAddLoginNotification"); sendMockExtensionMessage( { command: "collectPageDetailsResponse", details: pageDetails }, diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.ts b/apps/browser/src/autofill/background/overlay-notifications.background.ts index 5c85ce132d7..93357113fc4 100644 --- a/apps/browser/src/autofill/background/overlay-notifications.background.ts +++ b/apps/browser/src/autofill/background/overlay-notifications.background.ts @@ -1,9 +1,15 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Subject, switchMap, timer } from "rxjs"; +import { firstValueFrom, Subject, switchMap, timer } from "rxjs"; +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { getOptionalUserId } from "@bitwarden/common/auth/services/account.service"; import { CLEAR_NOTIFICATION_LOGIN_DATA_DURATION } from "@bitwarden/common/autofill/constants"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; +import { UserId } from "@bitwarden/common/types/guid"; +import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { SecurityTask, SecurityTaskStatus, TaskService } from "@bitwarden/common/vault/tasks"; import { BrowserApi } from "../../platform/browser/browser-api"; import { generateDomainMatchPatterns, isInvalidResponseStatusCode } from "../utils"; @@ -19,6 +25,12 @@ import { } from "./abstractions/overlay-notifications.background"; import NotificationBackground from "./notification.background"; +type LoginSecurityTaskInfo = { + securityTask: SecurityTask; + cipher: CipherView; + uri: ModifyLoginCipherFormData["uri"]; +}; + export class OverlayNotificationsBackground implements OverlayNotificationsBackgroundInterface { private websiteOriginsWithFields: WebsiteOriginsWithFields = new Map(); private activeFormSubmissionRequests: ActiveFormSubmissionRequests = new Set(); @@ -35,6 +47,9 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg constructor( private logService: LogService, private notificationBackground: NotificationBackground, + private taskService: TaskService, + private accountService: AccountService, + private cipherService: CipherService, ) {} /** @@ -259,8 +274,8 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg const modifyLoginData = this.modifyLoginCipherFormData.get(tabId); return ( !modifyLoginData || - !this.shouldTriggerAddLoginNotification(modifyLoginData) || - !this.shouldTriggerChangePasswordNotification(modifyLoginData) + !this.shouldAttemptAddLoginNotification(modifyLoginData) || + !this.shouldAttemptChangedPasswordNotification(modifyLoginData) ); }; @@ -404,10 +419,11 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg modifyLoginData: ModifyLoginCipherFormData, tab: chrome.tabs.Tab, ) => { - if (this.shouldTriggerChangePasswordNotification(modifyLoginData)) { + let result: string; + if (this.shouldAttemptChangedPasswordNotification(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( + const success = await this.notificationBackground.triggerChangedPasswordNotification( { command: "bgChangedPassword", data: { @@ -418,14 +434,15 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg }, { tab }, ); - this.clearCompletedWebRequest(requestId, tab); - return; + if (!success) { + result = "Unqualified changedPassword notification attempt."; + } } - if (this.shouldTriggerAddLoginNotification(modifyLoginData)) { - await this.notificationBackground.addLogin( + if (this.shouldAttemptAddLoginNotification(modifyLoginData)) { + const success = await this.notificationBackground.triggerAddLoginNotification( { - command: "bgAddLogin", + command: "bgTriggerAddLoginNotification", login: { url: modifyLoginData.uri, username: modifyLoginData.username, @@ -434,8 +451,44 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg }, { tab }, ); - this.clearCompletedWebRequest(requestId, tab); + if (!success) { + result = "Unqualified addLogin notification attempt."; + } } + + const shouldGetTasks = + (await this.notificationBackground.getNotificationFlag()) && !modifyLoginData.newPassword; + + if (shouldGetTasks) { + const activeUserId = await firstValueFrom( + this.accountService.activeAccount$.pipe(getOptionalUserId), + ); + + if (activeUserId) { + const loginSecurityTaskInfo = await this.getSecurityTaskAndCipherForLoginData( + modifyLoginData, + activeUserId, + ); + + if (loginSecurityTaskInfo) { + await this.notificationBackground.triggerAtRiskPasswordNotification( + { + command: "bgTriggerAtRiskPasswordNotification", + data: { + activeUserId, + cipher: loginSecurityTaskInfo.cipher, + securityTask: loginSecurityTaskInfo.securityTask, + }, + }, + { tab }, + ); + } else { + result = "Unqualified atRiskPassword notification attempt."; + } + } + } + this.clearCompletedWebRequest(requestId, tab); + return result; }; /** @@ -443,7 +496,7 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg * * @param modifyLoginData - The modified login form data */ - private shouldTriggerChangePasswordNotification = ( + private shouldAttemptChangedPasswordNotification = ( modifyLoginData: ModifyLoginCipherFormData, ) => { return modifyLoginData?.newPassword && !modifyLoginData.username; @@ -454,10 +507,66 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg * * @param modifyLoginData - The modified login form data */ - private shouldTriggerAddLoginNotification = (modifyLoginData: ModifyLoginCipherFormData) => { + private shouldAttemptAddLoginNotification = (modifyLoginData: ModifyLoginCipherFormData) => { return modifyLoginData?.username && (modifyLoginData.password || modifyLoginData.newPassword); }; + /** + * If there is a security task for this cipher at login, return the task, cipher view, and uri. + * + * @param modifyLoginData - The modified login form data + * @param activeUserId - The currently logged in user ID + */ + private async getSecurityTaskAndCipherForLoginData( + modifyLoginData: ModifyLoginCipherFormData, + activeUserId: UserId, + ): Promise { + const tasks: SecurityTask[] = await this.notificationBackground.getSecurityTasks(activeUserId); + if (!tasks?.length) { + return null; + } + + const urlCiphers: CipherView[] = await this.cipherService.getAllDecryptedForUrl( + modifyLoginData.uri, + activeUserId, + ); + if (!urlCiphers?.length) { + return null; + } + + const securityTaskForLogin = urlCiphers.reduce( + (taskInfo: LoginSecurityTaskInfo | null, cipher: CipherView) => { + if ( + // exit early if info was found already + taskInfo || + // exit early if the cipher was deleted + cipher.deletedDate || + // exit early if the entered login info doesn't match an existing cipher + modifyLoginData.username !== cipher.login.username || + modifyLoginData.password !== cipher.login.password + ) { + return taskInfo; + } + + // Find the first security task for the cipherId belonging to the entered login + const cipherSecurityTask = tasks.find( + ({ cipherId, status }) => + cipher.id === cipherId && // match security task cipher id to url cipher id + status === SecurityTaskStatus.Pending, // security task has not been completed + ); + + if (cipherSecurityTask) { + return { securityTask: cipherSecurityTask, cipher, uri: modifyLoginData.uri }; + } + + return taskInfo; + }, + null, + ); + + return securityTaskForLogin; + } + /** * Clears the completed web request and removes the modified login form data for the tab. * diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index 2ff08328e3d..1f249454393 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -49,8 +49,12 @@ import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view" import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; import { BrowserApi } from "../../platform/browser/browser-api"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openAddEditVaultItemPopout, openViewVaultItemPopout, diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts index 2fb435a4c67..c33cb6a4371 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts @@ -30,8 +30,12 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; import { BrowserApi } from "../../platform/browser/browser-api"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openAddEditVaultItemPopout, openVaultItemPasswordRepromptPopout, diff --git a/apps/browser/src/autofill/content/components/buttons/action-button.ts b/apps/browser/src/autofill/content/components/buttons/action-button.ts index 8d8bfacec77..339b628875c 100644 --- a/apps/browser/src/autofill/content/components/buttons/action-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/action-button.ts @@ -4,52 +4,70 @@ import { html, TemplateResult } from "lit"; import { Theme } from "@bitwarden/common/platform/enums"; import { border, themes, typography, spacing } from "../constants/styles"; +import { Spinner } from "../icons"; export type ActionButtonProps = { buttonText: string | TemplateResult; disabled?: boolean; + isLoading?: boolean; theme: Theme; handleClick: (e: Event) => void; + fullWidth?: boolean; }; export function ActionButton({ buttonText, disabled = false, + isLoading = false, theme, handleClick, + fullWidth = true, }: ActionButtonProps) { const handleButtonClick = (event: Event) => { - if (!disabled) { + if (!disabled && !isLoading) { handleClick(event); } }; return html` `; } -const actionButtonStyles = ({ disabled, theme }: { disabled: boolean; theme: Theme }) => css` +const actionButtonStyles = ({ + disabled, + fullWidth, + isLoading, + theme, +}: { + disabled: boolean; + fullWidth: boolean; + isLoading: boolean; + theme: Theme; +}) => css` ${typography.body2} user-select: none; + display: flex; + align-items: center; + justify-content: center; border: 1px solid transparent; border-radius: ${border.radius.full}; padding: ${spacing["1"]} ${spacing["3"]}; - width: 100%; + width: ${fullWidth ? "100%" : "auto"}; overflow: hidden; text-align: center; text-overflow: ellipsis; font-weight: 700; - ${disabled + ${disabled || isLoading ? ` background-color: ${themes[theme].secondary["300"]}; color: ${themes[theme].text.muted}; @@ -71,7 +89,8 @@ const actionButtonStyles = ({ disabled, theme }: { disabled: boolean; theme: The `} svg { - width: fit-content; + padding: 2px 0; /* Match line-height of button body2 typography */ + width: auto; height: 16px; } `; diff --git a/apps/browser/src/autofill/content/components/buttons/additional-tasks/button-content.ts b/apps/browser/src/autofill/content/components/buttons/additional-tasks/button-content.ts new file mode 100644 index 00000000000..2357da4e785 --- /dev/null +++ b/apps/browser/src/autofill/content/components/buttons/additional-tasks/button-content.ts @@ -0,0 +1,29 @@ +import { css } from "@emotion/css"; +import { html } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { spacing, themes } from "../../constants/styles"; +import { ExternalLink } from "../../icons"; + +export function AdditionalTasksButtonContent({ + buttonText, + theme, +}: { + buttonText: string; + theme: Theme; +}) { + return html` +
+ ${buttonText} + ${ExternalLink({ theme, color: themes[theme].text.contrast })} +
+ `; +} + +export const additionalTasksButtonContentStyles = ({ theme }: { theme: Theme }) => css` + gap: ${spacing[2]}; + display: flex; + align-items: center; + white-space: nowrap; +`; diff --git a/apps/browser/src/autofill/content/components/constants/styles.ts b/apps/browser/src/autofill/content/components/constants/styles.ts index 08c8671ce14..55130781808 100644 --- a/apps/browser/src/autofill/content/components/constants/styles.ts +++ b/apps/browser/src/autofill/content/components/constants/styles.ts @@ -174,6 +174,17 @@ export const buildIconColorRule = (color: string, rule: RuleName = ruleNames.fil ${rule}: ${color}; `; +export const animations = { + spin: ` + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } + `, +}; + export function scrollbarStyles(theme: Theme, color?: { thumb?: string; track?: string }) { const thumbColor = color?.thumb || themes[theme].secondary["500"]; const trackColor = color?.track || themes[theme].background.alt; diff --git a/apps/browser/src/autofill/content/components/icons/index.ts b/apps/browser/src/autofill/content/components/icons/index.ts index 65ec6301ac4..d1538e1543f 100644 --- a/apps/browser/src/autofill/content/components/icons/index.ts +++ b/apps/browser/src/autofill/content/components/icons/index.ts @@ -11,4 +11,5 @@ export { Folder } from "./folder"; export { Globe } from "./globe"; export { PencilSquare } from "./pencil-square"; export { Shield } from "./shield"; +export { Spinner } from "./spinner"; export { User } from "./user"; diff --git a/apps/browser/src/autofill/content/components/icons/spinner.ts b/apps/browser/src/autofill/content/components/icons/spinner.ts new file mode 100644 index 00000000000..20f53a43d44 --- /dev/null +++ b/apps/browser/src/autofill/content/components/icons/spinner.ts @@ -0,0 +1,34 @@ +import { css, keyframes } from "@emotion/css"; +import { html } from "lit"; + +import { IconProps } from "../common-types"; +import { buildIconColorRule, ruleNames, themes, animations } from "../constants/styles"; + +export function Spinner({ + ariaHidden = true, + color, + disabled, + theme, + disableSpin = false, +}: IconProps & { disableSpin?: boolean }) { + const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; + + return html` + + + + `; +} + +const animation = css` + animation: ${keyframes(animations.spin)} 2s infinite linear; +`; diff --git a/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts index 77769bc67dc..dc630e537b0 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts @@ -1,9 +1,12 @@ import { Meta, StoryObj } from "@storybook/web-components"; +import { html } from "lit"; import { ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; import { ActionButton, ActionButtonProps } from "../../buttons/action-button"; +type ComponentAndControls = ActionButtonProps & { width: number }; + export default { title: "Components/Buttons/Action Button", argTypes: { @@ -11,12 +14,15 @@ export default { disabled: { control: "boolean" }, theme: { control: "select", options: [...Object.values(ThemeTypes)] }, handleClick: { control: false }, + width: { control: "number", min: 10, max: 100, step: 1 }, }, args: { buttonText: "Click Me", disabled: false, + isLoading: false, theme: ThemeTypes.Light, handleClick: () => alert("Clicked"), + width: 150, }, parameters: { design: { @@ -24,10 +30,18 @@ export default { url: "https://www.figma.com/design/LEhqLAcBPY8uDKRfU99n9W/Autofill-notification-redesign?node-id=487-14755&t=2O7uCAkwRZCcjumm-4", }, }, -} as Meta; +} as Meta; -const Template = (args: ActionButtonProps) => ActionButton({ ...args }); +const Template = (args: ComponentAndControls) => { + const { width, ...componentProps } = args; + return html`
${ActionButton({ ...componentProps })}
`; +}; + +export const Default: StoryObj = { + args: { + isLoading: true, + theme: "dark", + }, -export const Default: StoryObj = { render: Template, }; diff --git a/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts index 3741ccbcb69..4e18008b94a 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts @@ -6,9 +6,10 @@ import { ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; import { IconProps } from "../../common-types"; import * as Icons from "../../icons"; +const { Spinner, ...StaticIcons } = Icons; + type Args = IconProps & { size: number; - iconLink: URL; }; export default { @@ -26,7 +27,10 @@ export default { }, } as Meta; -const Template = (args: Args, IconComponent: (props: IconProps) => ReturnType) => html` +const Template = ( + args: Args, + IconComponent: (props: IconProps & { disableSpin?: boolean }) => ReturnType, +) => html`
@@ -34,18 +38,26 @@ const Template = (args: Args, IconComponent: (props: IconProps) => ReturnType `; -const createIconStory = (iconName: keyof typeof Icons): StoryObj => { +const createIconStory = ( + iconName: keyof typeof StaticIcons, +): StoryObj => { const story = { - render: (args) => Template(args, Icons[iconName]), + render: (args) => Template(args, StaticIcons[iconName]), } as StoryObj; - story.argTypes = { - iconLink: { table: { disable: true } }, - }; - return story; }; +const SpinnerIconStory: StoryObj = { + render: (args) => Template(args, Spinner), + argTypes: { + disableSpin: { control: "boolean" }, + }, + args: { + disableSpin: false, + }, +}; + export const AngleDownIcon = createIconStory("AngleDown"); export const AngleUpIcon = createIconStory("AngleUp"); export const BusinessIcon = createIconStory("Business"); @@ -58,4 +70,5 @@ export const FolderIcon = createIconStory("Folder"); export const GlobeIcon = createIconStory("Globe"); export const PencilSquareIcon = createIconStory("PencilSquare"); export const ShieldIcon = createIconStory("Shield"); +export const SpinnerIcon = SpinnerIconStory; export const UserIcon = createIconStory("User"); diff --git a/apps/browser/src/autofill/content/components/lit-stories/mock-data.ts b/apps/browser/src/autofill/content/components/lit-stories/mock-data.ts index 81cdf5a50f3..3451029a01a 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/mock-data.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/mock-data.ts @@ -103,6 +103,12 @@ export const mockTasks = [ export const mockI18n = { appName: "Bitwarden", + atRiskPassword: "At-risk password", + atRiskNavigatePrompt: + "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + atRiskChangePrompt: + "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + changePassword: "Change password", close: "Close", collection: "Collection", folder: "Folder", diff --git a/apps/browser/src/autofill/content/components/lit-stories/notification/at-risk-notification/container.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/notification/at-risk-notification/container.lit-stories.ts new file mode 100644 index 00000000000..3d1fcf339e8 --- /dev/null +++ b/apps/browser/src/autofill/content/components/lit-stories/notification/at-risk-notification/container.lit-stories.ts @@ -0,0 +1,44 @@ +import { Meta, StoryObj } from "@storybook/web-components"; + +import { ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { + AtRiskNotification, + AtRiskNotificationProps, +} from "../../../notification/at-risk-password/container"; +import { mockI18n, mockBrowserI18nGetMessage } from "../../mock-data"; + +export default { + title: "Components/Notifications/At-Risk Notification", + argTypes: { + theme: { control: "select", options: [...Object.values(ThemeTypes)] }, + }, + args: { + theme: ThemeTypes.Light, + handleCloseNotification: () => alert("Close notification action triggered"), + params: { + passwordChangeUri: "https://webtests.dev/.well-known/change-password", // Remove to see "navigate" version of notification + organizationName: "Acme Co.", + }, + i18n: mockI18n, + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/LEhqLAcBPY8uDKRfU99n9W/Autofill-notification-redesign?node-id=485-20160&m=dev", + }, + }, +} as Meta; + +const Template = (args: AtRiskNotificationProps) => AtRiskNotification({ ...args }); + +export const Default: StoryObj = { + render: Template, +}; + +window.chrome = { + ...window.chrome, + i18n: { + getMessage: mockBrowserI18nGetMessage, + }, +} as typeof chrome; diff --git a/apps/browser/src/autofill/content/components/notification/at-risk-password/body.ts b/apps/browser/src/autofill/content/components/notification/at-risk-password/body.ts new file mode 100644 index 00000000000..3cc08a26210 --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/at-risk-password/body.ts @@ -0,0 +1,49 @@ +import createEmotion from "@emotion/css/create-instance"; +import { html, nothing } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { spacing, themes } from "../../constants/styles"; +import { Warning } from "../../illustrations"; + +import { AtRiskNotificationMessage } from "./message"; + +export const componentClassPrefix = "at-risk-notification-body"; + +const { css } = createEmotion({ + key: componentClassPrefix, +}); + +export type AtRiskNotificationBodyProps = { + riskMessage: string; + theme: Theme; +}; + +export function AtRiskNotificationBody({ riskMessage, theme }: AtRiskNotificationBodyProps) { + return html` +
+
${Warning()}
+ ${riskMessage + ? AtRiskNotificationMessage({ + message: riskMessage, + theme, + }) + : nothing} +
+ `; +} + +const iconContainerStyles = css` + > svg { + width: 50px; + height: auto; + } +`; +const atRiskNotificationBodyStyles = ({ theme }: { theme: Theme }) => css` + gap: ${spacing[4]}; + display: flex; + align-items: center; + justify-content: flex-start; + background-color: ${themes[theme].background.alt}; + padding: 12px; +`; diff --git a/apps/browser/src/autofill/content/components/notification/at-risk-password/container.ts b/apps/browser/src/autofill/content/components/notification/at-risk-password/container.ts new file mode 100644 index 00000000000..90da0833fd9 --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/at-risk-password/container.ts @@ -0,0 +1,72 @@ +import { css } from "@emotion/css"; +import { html, nothing } from "lit"; + +import { Theme, ThemeTypes } from "@bitwarden/common/platform/enums"; + +import { NotificationBarIframeInitData } from "../../../../notification/abstractions/notification-bar"; +import { I18n } from "../../common-types"; +import { themes, spacing } from "../../constants/styles"; +import { + NotificationHeader, + componentClassPrefix as notificationHeaderClassPrefix, +} from "../header"; + +import { AtRiskNotificationBody } from "./body"; +import { AtRiskNotificationFooter } from "./footer"; + +export type AtRiskNotificationProps = NotificationBarIframeInitData & { + handleCloseNotification: (e: Event) => void; +} & { + i18n: I18n; +}; + +export function AtRiskNotification({ + handleCloseNotification, + i18n, + theme = ThemeTypes.Light, + params, +}: AtRiskNotificationProps) { + const { passwordChangeUri, organizationName } = params; + const riskMessage = chrome.i18n.getMessage( + passwordChangeUri ? "atRiskChangePrompt" : "atRiskNavigatePrompt", + organizationName, + ); + + return html` +
+ ${NotificationHeader({ + handleCloseNotification, + i18n, + message: i18n.atRiskPassword, + theme, + })} + ${AtRiskNotificationBody({ + theme, + riskMessage, + })} + ${passwordChangeUri + ? AtRiskNotificationFooter({ + i18n, + theme, + passwordChangeUri: params?.passwordChangeUri, + }) + : nothing} +
+ `; +} + +const atRiskNotificationContainerStyles = (theme: Theme) => css` + position: absolute; + right: 20px; + border: 1px solid ${themes[theme].secondary["300"]}; + border-radius: ${spacing["4"]}; + box-shadow: -2px 4px 6px 0px #0000001a; + background-color: ${themes[theme].background.alt}; + width: 400px; + overflow: hidden; + + [class*="${notificationHeaderClassPrefix}-"] { + border-radius: ${spacing["4"]} ${spacing["4"]} 0 0; + border-bottom: 0.5px solid ${themes[theme].secondary["300"]}; + } +`; diff --git a/apps/browser/src/autofill/content/components/notification/at-risk-password/footer.ts b/apps/browser/src/autofill/content/components/notification/at-risk-password/footer.ts new file mode 100644 index 00000000000..d7805492fa6 --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/at-risk-password/footer.ts @@ -0,0 +1,42 @@ +import { css } from "@emotion/css"; +import { html } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { ActionButton } from "../../buttons/action-button"; +import { AdditionalTasksButtonContent } from "../../buttons/additional-tasks/button-content"; +import { I18n } from "../../common-types"; +import { spacing } from "../../constants/styles"; + +export type AtRiskNotificationFooterProps = { + i18n: I18n; + theme: Theme; + passwordChangeUri: string; +}; + +export function AtRiskNotificationFooter({ + i18n, + theme, + passwordChangeUri, +}: AtRiskNotificationFooterProps) { + return html`
+ ${passwordChangeUri && + ActionButton({ + handleClick: () => { + open(passwordChangeUri, "_blank"); + }, + buttonText: AdditionalTasksButtonContent({ buttonText: i18n.changePassword, theme }), + theme, + fullWidth: false, + })} +
`; +} + +const atRiskNotificationFooterStyles = css` + display: flex; + padding: ${spacing[2]} ${spacing[4]} ${spacing[4]} ${spacing[4]}; + + :last-child { + border-radius: 0 0 ${spacing["4"]} ${spacing["4"]}; + } +`; diff --git a/apps/browser/src/autofill/content/components/notification/at-risk-password/message.ts b/apps/browser/src/autofill/content/components/notification/at-risk-password/message.ts new file mode 100644 index 00000000000..42d4907711d --- /dev/null +++ b/apps/browser/src/autofill/content/components/notification/at-risk-password/message.ts @@ -0,0 +1,44 @@ +import { css } from "@emotion/css"; +import { html, nothing } from "lit"; + +import { Theme } from "@bitwarden/common/platform/enums"; + +import { themes } from "../../constants/styles"; + +export type AtRiskNotificationMessageProps = { + message?: string; + theme: Theme; +}; + +export function AtRiskNotificationMessage({ message, theme }: AtRiskNotificationMessageProps) { + return html` +
+ ${message + ? html` + + ${message} + + ` + : nothing} +
+ `; +} + +const baseTextStyles = css` + overflow-x: hidden; + text-align: left; + text-overflow: ellipsis; + line-height: 24px; + font-family: Roboto, sans-serif; + font-size: 16px; +`; + +const atRiskNotificationMessageStyles = (theme: Theme) => css` + ${baseTextStyles} + + color: ${themes[theme].text.main}; + font-weight: 400; + white-space: normal; + word-break: break-word; + display: inline; +`; diff --git a/apps/browser/src/autofill/content/components/notification/button-row.ts b/apps/browser/src/autofill/content/components/notification/button-row.ts index 470147cb469..04b79c1951a 100644 --- a/apps/browser/src/autofill/content/components/notification/button-row.ts +++ b/apps/browser/src/autofill/content/components/notification/button-row.ts @@ -34,6 +34,7 @@ export type NotificationButtonRowProps = { organizations?: OrgView[]; primaryButton: { text: string; + isLoading?: boolean; handlePrimaryButtonClick: (args: any) => void; }; personalVaultIsAllowed: boolean; diff --git a/apps/browser/src/autofill/content/components/notification/container.ts b/apps/browser/src/autofill/content/components/notification/container.ts index cc7f0fc72c0..0c70e0da63c 100644 --- a/apps/browser/src/autofill/content/components/notification/container.ts +++ b/apps/browser/src/autofill/content/components/notification/container.ts @@ -29,6 +29,7 @@ export type NotificationContainerProps = NotificationBarIframeInitData & { folders?: FolderView[]; headerMessage?: string; i18n: I18n; + isLoading?: boolean; organizations?: OrgView[]; personalVaultIsAllowed?: boolean; notificationTestId: string; @@ -44,6 +45,7 @@ export function NotificationContainer({ folders, headerMessage, i18n, + isLoading, organizations, personalVaultIsAllowed = true, notificationTestId, @@ -74,6 +76,7 @@ export function NotificationContainer({ collections, folders, i18n, + isLoading, notificationType: type, organizations, personalVaultIsAllowed, diff --git a/apps/browser/src/autofill/content/components/notification/footer.ts b/apps/browser/src/autofill/content/components/notification/footer.ts index b47dd5cc094..d37547a6fae 100644 --- a/apps/browser/src/autofill/content/components/notification/footer.ts +++ b/apps/browser/src/autofill/content/components/notification/footer.ts @@ -16,6 +16,7 @@ export type NotificationFooterProps = { collections?: CollectionView[]; folders?: FolderView[]; i18n: I18n; + isLoading?: boolean; notificationType?: NotificationType; organizations?: OrgView[]; personalVaultIsAllowed: boolean; @@ -27,6 +28,7 @@ export function NotificationFooter({ collections, folders, i18n, + isLoading, notificationType, organizations, personalVaultIsAllowed, @@ -52,6 +54,7 @@ export function NotificationFooter({ i18n, primaryButton: { handlePrimaryButtonClick: handleSaveAction, + isLoading, text: primaryButtonText, }, personalVaultIsAllowed, diff --git a/apps/browser/src/autofill/content/components/rows/button-row.ts b/apps/browser/src/autofill/content/components/rows/button-row.ts index 041d0a6b696..8b4eabfec50 100644 --- a/apps/browser/src/autofill/content/components/rows/button-row.ts +++ b/apps/browser/src/autofill/content/components/rows/button-row.ts @@ -12,6 +12,7 @@ export type ButtonRowProps = { theme: Theme; primaryButton: { text: string; + isLoading?: boolean; handlePrimaryButtonClick: (args: any) => void; }; selectButtons?: { @@ -29,6 +30,7 @@ export function ButtonRow({ theme, primaryButton, selectButtons }: ButtonRowProp ${ActionButton({ handleClick: primaryButton.handlePrimaryButtonClick, buttonText: primaryButton.text, + isLoading: primaryButton.isLoading, theme, })}
diff --git a/apps/browser/src/autofill/enums/notification-queue-message-type.enum.ts b/apps/browser/src/autofill/enums/notification-queue-message-type.enum.ts index 5a7b8fa990b..1fe6246f8b8 100644 --- a/apps/browser/src/autofill/enums/notification-queue-message-type.enum.ts +++ b/apps/browser/src/autofill/enums/notification-queue-message-type.enum.ts @@ -2,6 +2,7 @@ const NotificationQueueMessageType = { AddLogin: "add", ChangePassword: "change", UnlockVault: "unlock", + AtRiskPassword: "at-risk-password", } as const; type NotificationQueueMessageTypes = diff --git a/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts b/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts index 04b09a7df32..8de48a49a8e 100644 --- a/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts +++ b/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts @@ -28,6 +28,8 @@ import { import { Utils } from "@bitwarden/common/platform/misc/utils"; import { BrowserApi } from "../../../platform/browser/browser-api"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { closeFido2Popout, openFido2Popout } from "../../../vault/popup/utils/vault-popout-window"; const BrowserFido2MessageName = "BrowserFido2UserInterfaceServiceMessage"; diff --git a/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts b/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts index c8bcf5faa4b..0cccd91876d 100644 --- a/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts +++ b/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts @@ -88,6 +88,7 @@ export class WebauthnUtils { getClientExtensionResults: () => ({ credProps: result.extensions.credProps, }), + toJSON: () => Fido2Utils.createResultToJson(result), } as PublicKeyCredential; // Modify prototype chains to fix `instanceof` calls. @@ -134,6 +135,7 @@ export class WebauthnUtils { } as AuthenticatorAssertionResponse, getClientExtensionResults: () => ({}), authenticatorAttachment: "platform", + toJSON: () => Fido2Utils.getResultToJson(result), } as PublicKeyCredential; // Modify prototype chains to fix `instanceof` calls. diff --git a/apps/browser/src/autofill/notification/abstractions/notification-bar.ts b/apps/browser/src/autofill/notification/abstractions/notification-bar.ts index 8256190ea55..934aa4a2571 100644 --- a/apps/browser/src/autofill/notification/abstractions/notification-bar.ts +++ b/apps/browser/src/autofill/notification/abstractions/notification-bar.ts @@ -11,6 +11,7 @@ const NotificationTypes = { Add: "add", Change: "change", Unlock: "unlock", + AtRiskPassword: "at-risk-password", } as const; type NotificationType = (typeof NotificationTypes)[keyof typeof NotificationTypes]; @@ -30,7 +31,8 @@ type NotificationBarIframeInitData = { organizations?: OrgView[]; removeIndividualVault?: boolean; theme?: Theme; - type?: string; // @TODO use `NotificationType` + type?: NotificationType; + params?: AtRiskPasswordNotificationParams | any; }; type NotificationBarWindowMessage = { @@ -50,7 +52,13 @@ type NotificationBarWindowMessageHandlers = { saveCipherAttemptCompleted: ({ message }: { message: NotificationBarWindowMessage }) => void; }; +type AtRiskPasswordNotificationParams = { + passwordChangeUri?: string; + organizationName: string; +}; + export { + AtRiskPasswordNotificationParams, NotificationTaskInfo, NotificationTypes, NotificationType, diff --git a/apps/browser/src/autofill/notification/bar.ts b/apps/browser/src/autofill/notification/bar.ts index 2027e3fecfc..a83e9fce531 100644 --- a/apps/browser/src/autofill/notification/bar.ts +++ b/apps/browser/src/autofill/notification/bar.ts @@ -7,11 +7,12 @@ import type { FolderView } from "@bitwarden/common/vault/models/view/folder.view import { AdjustNotificationBarMessageData } from "../background/abstractions/notification.background"; import { NotificationCipherData } from "../content/components/cipher/types"; import { CollectionView, I18n, OrgView } from "../content/components/common-types"; +import { AtRiskNotification } from "../content/components/notification/at-risk-password/container"; import { NotificationConfirmationContainer } from "../content/components/notification/confirmation/container"; import { NotificationContainer } from "../content/components/notification/container"; import { selectedFolder as selectedFolderSignal } from "../content/components/signals/selected-folder"; import { selectedVault as selectedVaultSignal } from "../content/components/signals/selected-vault"; -import { buildSvgDomElement } from "../utils"; +import { buildSvgDomElement, matchAllowedColorSchemes } from "../utils"; import { circleCheckIcon } from "../utils/svg-icons"; import { @@ -56,21 +57,24 @@ function applyNotificationBarStyle() { function getI18n() { return { appName: chrome.i18n.getMessage("appName"), + atRiskPassword: chrome.i18n.getMessage("atRiskPassword"), + changePassword: chrome.i18n.getMessage("changePassword"), close: chrome.i18n.getMessage("close"), collection: chrome.i18n.getMessage("collection"), folder: chrome.i18n.getMessage("folder"), + loginSaveConfirmation: chrome.i18n.getMessage("loginSaveConfirmation"), loginSaveSuccess: chrome.i18n.getMessage("loginSaveSuccess"), + loginUpdatedConfirmation: chrome.i18n.getMessage("loginUpdatedConfirmation"), loginUpdateSuccess: chrome.i18n.getMessage("loginUpdateSuccess"), loginUpdateTaskSuccess: chrome.i18n.getMessage("loginUpdateTaskSuccess"), loginUpdateTaskSuccessAdditional: chrome.i18n.getMessage("loginUpdateTaskSuccessAdditional"), - nextSecurityTaskAction: chrome.i18n.getMessage("nextSecurityTaskAction"), - newItem: chrome.i18n.getMessage("newItem"), - never: chrome.i18n.getMessage("never"), myVault: chrome.i18n.getMessage("myVault"), + never: chrome.i18n.getMessage("never"), + newItem: chrome.i18n.getMessage("newItem"), + nextSecurityTaskAction: chrome.i18n.getMessage("nextSecurityTaskAction"), notificationAddDesc: chrome.i18n.getMessage("notificationAddDesc"), notificationAddSave: chrome.i18n.getMessage("notificationAddSave"), notificationChangeDesc: chrome.i18n.getMessage("notificationChangeDesc"), - notificationUpdate: chrome.i18n.getMessage("notificationChangeSave"), notificationEdit: chrome.i18n.getMessage("edit"), notificationEditTooltip: chrome.i18n.getMessage("notificationEditTooltip"), notificationLoginSaveConfirmation: chrome.i18n.getMessage("notificationLoginSaveConfirmation"), @@ -79,6 +83,7 @@ function getI18n() { ), notificationUnlock: chrome.i18n.getMessage("notificationUnlock"), notificationUnlockDesc: chrome.i18n.getMessage("notificationUnlockDesc"), + notificationUpdate: chrome.i18n.getMessage("notificationChangeSave"), notificationViewAria: chrome.i18n.getMessage("notificationViewAria"), saveAction: chrome.i18n.getMessage("notificationAddSave"), saveAsNewLoginAction: chrome.i18n.getMessage("saveAsNewLoginAction"), @@ -87,8 +92,8 @@ function getI18n() { saveLogin: chrome.i18n.getMessage("saveLogin"), typeLogin: chrome.i18n.getMessage("typeLogin"), unlockToSave: chrome.i18n.getMessage("unlockToSave"), - updateLoginAction: chrome.i18n.getMessage("updateLoginAction"), updateLogin: chrome.i18n.getMessage("updateLogin"), + updateLoginAction: chrome.i18n.getMessage("updateLoginAction"), vault: chrome.i18n.getMessage("vault"), view: chrome.i18n.getMessage("view"), }; @@ -124,6 +129,7 @@ export function getNotificationHeaderMessage(i18n: I18n, type?: NotificationType [NotificationTypes.Add]: i18n.saveLogin, [NotificationTypes.Change]: i18n.updateLogin, [NotificationTypes.Unlock]: i18n.unlockToSave, + [NotificationTypes.AtRiskPassword]: i18n.atRiskPassword, }[type] : undefined; } @@ -143,6 +149,7 @@ export function getConfirmationHeaderMessage(i18n: I18n, type?: NotificationType [NotificationTypes.Add]: i18n.loginSaveSuccess, [NotificationTypes.Change]: i18n.loginUpdateSuccess, [NotificationTypes.Unlock]: "", + [NotificationTypes.AtRiskPassword]: "", }[type] : undefined; } @@ -193,6 +200,7 @@ export function getNotificationTestId( [NotificationTypes.Unlock]: "unlock-notification-bar", [NotificationTypes.Add]: "save-notification-bar", [NotificationTypes.Change]: "update-notification-bar", + [NotificationTypes.AtRiskPassword]: "at-risk-password-notification-bar", }[notificationType]; } @@ -230,6 +238,15 @@ async function initNotificationBar(message: NotificationBarWindowMessage) { const i18n = getI18n(); const resolvedTheme = getResolvedTheme(theme ?? ThemeTypes.Light); + // https://drafts.csswg.org/css-color-adjust-1/#preferred + // Prevents preferred color scheme from forcing an opaque background in the iframe + const colorScheme = new URLSearchParams(window.location.search).get("colorScheme") || ""; + const allowedColorScheme = matchAllowedColorSchemes(colorScheme); + const meta = document.createElement("meta"); + meta.setAttribute("name", "color-scheme"); + meta.setAttribute("content", allowedColorScheme); + document.getElementsByTagName("head")[0].appendChild(meta); + if (useComponentBar) { const resolvedType = resolveNotificationType(notificationBarIframeInitData); const headerMessage = getNotificationHeaderMessage(i18n, resolvedType); @@ -241,28 +258,54 @@ async function initNotificationBar(message: NotificationBarWindowMessage) { document.head.querySelectorAll('link[rel="stylesheet"]').forEach((node) => node.remove()); if (isVaultLocked) { - return render( - NotificationContainer({ - ...notificationBarIframeInitData, - headerMessage, - type: resolvedType, - notificationTestId, - theme: resolvedTheme, - personalVaultIsAllowed: !personalVaultDisallowed, - handleCloseNotification, - handleSaveAction: (e) => { - sendSaveCipherMessage(true); + const notificationConfig = { + ...notificationBarIframeInitData, + headerMessage, + type: resolvedType, + notificationTestId, + theme: resolvedTheme, + personalVaultIsAllowed: !personalVaultDisallowed, + handleCloseNotification, + handleEditOrUpdateAction, + i18n, + }; - // @TODO can't close before vault has finished decrypting, but can't leave open during long decrypt because it looks like the experience has failed - }, - handleEditOrUpdateAction, + const handleSaveAction = () => { + sendSaveCipherMessage(true); + + render( + NotificationContainer({ + ...notificationConfig, + handleSaveAction: () => {}, + isLoading: true, + }), + document.body, + ); + }; + + const UnlockNotification = NotificationContainer({ ...notificationConfig, handleSaveAction }); + + return render(UnlockNotification, document.body); + } + + // Handle AtRiskPasswordNotification render + if (notificationBarIframeInitData.type === NotificationTypes.AtRiskPassword) { + return render( + AtRiskNotification({ + ...notificationBarIframeInitData, + type: notificationBarIframeInitData.type as NotificationType, + theme: resolvedTheme, i18n, + params: initData.params, + handleCloseNotification, }), document.body, ); } + // Default scenario: add or update password const orgId = selectedVaultSignal.get(); + await Promise.all([ new Promise((resolve) => sendPlatformMessage({ command: "bgGetOrgData" }, resolve), @@ -533,7 +576,7 @@ function handleSaveCipherConfirmation(message: NotificationBarWindowMessage) { ...notificationBarIframeInitData, error, handleCloseNotification, - handleOpenTasks: () => sendPlatformMessage({ command: "bgOpenAtRisksPasswords" }), + handleOpenTasks: () => sendPlatformMessage({ command: "bgOpenAtRiskPasswords" }), handleOpenVault: (e: Event) => cipherId ? openViewVaultItemPopout(cipherId) : openAddEditVaultItemPopout(e, {}), headerMessage, diff --git a/apps/browser/src/autofill/overlay/notifications/abstractions/overlay-notifications-content.service.ts b/apps/browser/src/autofill/overlay/notifications/abstractions/overlay-notifications-content.service.ts index 42d7666e8a7..338c79cc607 100644 --- a/apps/browser/src/autofill/overlay/notifications/abstractions/overlay-notifications-content.service.ts +++ b/apps/browser/src/autofill/overlay/notifications/abstractions/overlay-notifications-content.service.ts @@ -17,6 +17,7 @@ export type NotificationsExtensionMessage = { error?: string; closedByUser?: boolean; fadeOutNotification?: boolean; + params: object; }; }; diff --git a/apps/browser/src/autofill/overlay/notifications/content/__snapshots__/overlay-notifications-content.service.spec.ts.snap b/apps/browser/src/autofill/overlay/notifications/content/__snapshots__/overlay-notifications-content.service.spec.ts.snap index c20626212fa..1b5d9a73888 100644 --- a/apps/browser/src/autofill/overlay/notifications/content/__snapshots__/overlay-notifications-content.service.spec.ts.snap +++ b/apps/browser/src/autofill/overlay/notifications/content/__snapshots__/overlay-notifications-content.service.spec.ts.snap @@ -7,7 +7,7 @@ exports[`OverlayNotificationsContentService opening the notification bar creates >