diff --git a/.eslintrc.json b/.eslintrc.json index 45a9d063a98..f3115898ff8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -20,7 +20,8 @@ "plugin:import/recommended", "plugin:import/typescript", "prettier", - "plugin:rxjs/recommended" + "plugin:rxjs/recommended", + "plugin:storybook/recommended" ], "settings": { "import/parsers": { @@ -134,6 +135,18 @@ "tailwindcss/no-contradicting-classname": "error" } }, + { + "files": ["libs/angular/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/angular/*", "src/**/*"] }] + } + }, + { + "files": ["libs/auth/src/**/*.ts"], + "rules": { + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/auth/*", "src/**/*"] }] + } + }, { "files": ["libs/common/src/**/*.ts"], "rules": { @@ -147,15 +160,9 @@ } }, { - "files": ["libs/angular/src/**/*.ts"], + "files": ["libs/exporter/src/**/*.ts"], "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/angular/*", "src/**/*"] }] - } - }, - { - "files": ["libs/node/src/**/*.ts"], - "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/node/*", "src/**/*"] }] + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/exporter/*", "src/**/*"] }] } }, { @@ -165,9 +172,9 @@ } }, { - "files": ["libs/exporter/src/**/*.ts"], + "files": ["libs/node/src/**/*.ts"], "rules": { - "no-restricted-imports": ["error", { "patterns": ["@bitwarden/exporter/*", "src/**/*"] }] + "no-restricted-imports": ["error", { "patterns": ["@bitwarden/node/*", "src/**/*"] }] } } ] diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a954236cdf7..15de72d785b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,7 +4,7 @@ # The following owners will be the default owners for everything in the repo. # Unless a later match takes precedence -# @bitwarden/team-leads +* @bitwarden/team-leads-eng ## Secrets Manager team files ## bitwarden_license/bit-web/src/app/secrets-manager @bitwarden/team-secrets-manager-dev @@ -13,9 +13,11 @@ bitwarden_license/bit-web/src/app/secrets-manager @bitwarden/team-secrets-manage apps/browser/src/auth @bitwarden/team-auth-dev apps/cli/src/auth @bitwarden/team-auth-dev apps/desktop/src/auth @bitwarden/team-auth-dev -apps/web/src/auth @bitwarden/team-auth-dev +apps/web/src/app/auth @bitwarden/team-auth-dev +libs/auth @bitwarden/team-auth-dev # web connectors used for auth apps/web/src/connectors @bitwarden/team-auth-dev +bitwarden_license/bit-web/src/app/auth @bitwarden/team-auth-dev libs/angular/src/auth @bitwarden/team-auth-dev libs/common/src/auth @bitwarden/team-auth-dev @@ -31,7 +33,6 @@ libs/exporter @bitwarden/team-tools-dev libs/importer @bitwarden/team-tools-dev ## Vault team files ## -apps/browser/src/autofill @bitwarden/team-vault-dev apps/browser/src/vault @bitwarden/team-vault-dev apps/cli/src/vault @bitwarden/team-vault-dev apps/desktop/src/vault @bitwarden/team-vault-dev @@ -69,8 +70,37 @@ apps/web/src/app/core @bitwarden/team-platform-dev apps/web/src/app/shared @bitwarden/team-platform-dev apps/web/src/translation-constants.ts @bitwarden/team-platform-dev +## Autofill team files ## +apps/browser/src/autofill @bitwarden/team-autofill-dev + ## Component Library ## +.storybook @bitwarden/team-platform-dev libs/components @bitwarden/team-platform-dev ## Desktop native module ## apps/desktop/desktop_native @bitwarden/team-platform-dev + +## Multiple file owners ## +apps/browser/package.json +apps/browser/src/manifest.json +apps/browser/src/manifest.v3.json + +apps/cli/package.json + +apps/desktop/package.json +apps/desktop/src/package-lock.json +apps/desktop/src/package.json + +/apps/web/config +/apps/web/package.json + +package-lock.json + +## Locales ## +apps/browser/src/_locales/en/messages.json +apps/cli/src/locales/en/messages.json +apps/desktop/src/locales/en/messages.json +apps/web/src/locales/en/messages.json + +## DevOps team files ## +/.github/workflows @bitwarden/dept-devops diff --git a/.github/whitelist-capital-letters.txt b/.github/whitelist-capital-letters.txt index 471602a09b0..17047f4333d 100644 --- a/.github/whitelist-capital-letters.txt +++ b/.github/whitelist-capital-letters.txt @@ -4,7 +4,6 @@ ./apps/browser/src/safari/desktop/Base.lproj ./apps/browser/src/services/vaultTimeout ./apps/browser/store/windows/Assets -./libs/common/src/abstractions/userVerification ./libs/common/src/abstractions/vaultTimeout ./libs/common/src/services/vaultTimeout ./bitwarden_license/README.md @@ -26,14 +25,13 @@ ./libs/common/src/misc/linkedFieldOption.decorator.ts ./libs/common/src/misc/serviceUtils.ts ./libs/common/src/misc/serviceUtils.spec.ts -./libs/common/src/abstractions/userVerification/userVerification.service.abstraction.ts -./libs/common/src/abstractions/userVerification/userVerification-api.service.abstraction.ts ./libs/common/src/abstractions/vaultTimeout/vaultTimeoutSettings.service.ts ./libs/common/src/abstractions/vaultTimeout/vaultTimeout.service.ts ./libs/common/src/abstractions/anonymousHub.service.ts ./libs/common/src/services/vaultTimeout/vaultTimeoutSettings.service.ts ./libs/common/src/services/vaultTimeout/vaultTimeout.service.ts ./libs/common/src/services/anonymousHub.service.ts +./libs/auth/README.md ./README.md ./LICENSE_BITWARDEN.txt ./CONTRIBUTING.md diff --git a/.github/workflows/auto-branch-updater.yml b/.github/workflows/auto-branch-updater.yml new file mode 100644 index 00000000000..fee2ad958f2 --- /dev/null +++ b/.github/workflows/auto-branch-updater.yml @@ -0,0 +1,42 @@ +--- +name: Auto Update Branch + +on: + push: + branches: + - 'master' + - 'rc' + paths: + - 'apps/web/**' + - 'libs/**' + - '*' + - '!*.md' + - '!*.txt' + - '.github/workflows/build-web.yml' + workflow_dispatch: + inputs: {} + +jobs: + update: + name: Update Branch + runs-on: ubuntu-22.04 + env: + _BOT_EMAIL: 106330231+bitwarden-devops-bot@users.noreply.github.com + _BOT_NAME: bitwarden-devops-bot + steps: + - name: Setup + id: setup + run: echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT + + - name: Checkout repo + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + with: + ref: 'eu-web-${{ steps.setup.outputs.branch }}' + fetch-depth: 0 + + - name: Merge ${{ steps.setup.outputs.branch }} + run: | + git config --local user.email "${{ env._BOT_EMAIL }}" + git config --local user.name "${{ env._BOT_NAME }}" + git merge origin/${{ steps.setup.outputs.branch }} + git push diff --git a/.github/workflows/brew-bump-cli.yml b/.github/workflows/brew-bump-cli.yml index cae9db880ec..438e74c9424 100644 --- a/.github/workflows/brew-bump-cli.yml +++ b/.github/workflows/brew-bump-cli.yml @@ -23,7 +23,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "brew-bump-workflow-pat" @@ -35,8 +35,7 @@ jobs: token: ${{ steps.retrieve-secrets.outputs.brew-bump-workflow-pat }} org: bitwarden tap: Homebrew/homebrew-core - cask: bitwarden-cli + formula: bitwarden-cli tag: ${{ github.ref }} revision: ${{ github.sha }} force: false - dryrun: true diff --git a/.github/workflows/brew-bump-desktop.yml b/.github/workflows/brew-bump-desktop.yml index 43b24f4553c..b724f3562aa 100644 --- a/.github/workflows/brew-bump-desktop.yml +++ b/.github/workflows/brew-bump-desktop.yml @@ -23,7 +23,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "brew-bump-workflow-pat" diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 89fa40a53fe..8e4fc6d4f7d 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up cloc run: | @@ -79,7 +79,7 @@ jobs: working-directory: apps/browser steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Testing locales - extName length run: | @@ -119,7 +119,7 @@ jobs: working-directory: apps/browser steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -145,8 +145,8 @@ jobs: - name: Build run: npm run dist - - name: Build Manifest v3 - run: npm run dist:mv3 + # - name: Build Manifest v3 + # run: npm run dist:mv3 - name: Gulp run: gulp ci @@ -179,12 +179,12 @@ jobs: path: apps/browser/dist/dist-opera.zip if-no-files-found: error - - name: Upload Opera MV3 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-opera-mv3.zip - if-no-files-found: error + # - name: Upload Opera MV3 artifact + # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + # with: + # name: dist-opera-MV3-${{ env._BUILD_NUMBER }}.zip + # path: apps/browser/dist/dist-opera-mv3.zip + # if-no-files-found: error - name: Upload Chrome artifact uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 @@ -193,12 +193,12 @@ jobs: path: apps/browser/dist/dist-chrome.zip if-no-files-found: error - - name: Upload Chrome MV3 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-chrome-mv3.zip - if-no-files-found: error + # - name: Upload Chrome MV3 artifact + # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + # with: + # name: dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip + # path: apps/browser/dist/dist-chrome-mv3.zip + # if-no-files-found: error - name: Upload Firefox artifact uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 @@ -214,12 +214,12 @@ jobs: path: apps/browser/dist/dist-edge.zip if-no-files-found: error - - name: Upload Edge MV3 artifact - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip - path: apps/browser/dist/dist-edge-mv3.zip - if-no-files-found: error + # - name: Upload Edge MV3 artifact + # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + # with: + # name: dist-edge-MV3-${{ env._BUILD_NUMBER }}.zip + # path: apps/browser/dist/dist-edge-mv3.zip + # if-no-files-found: error - name: Upload browser source uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 @@ -246,7 +246,7 @@ jobs: _BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -345,7 +345,7 @@ jobs: - build-safari steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -354,13 +354,13 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@102b5aa21783a64027193ef802a616140a1ca102 # v1.8.1 + uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -416,7 +416,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index bc33a4ccd0a..b0cc27e0ea9 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -38,7 +38,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up cloc run: | @@ -56,7 +56,7 @@ jobs: package_version: ${{ steps.retrieve-version.outputs.package_version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Get Package Version id: retrieve-version @@ -79,7 +79,7 @@ jobs: _WIN_PKG_VERSION: 3.4 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup Unix Vars run: | @@ -153,7 +153,7 @@ jobs: _WIN_PKG_VERSION: 3.4 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup Windows builder run: | @@ -299,7 +299,7 @@ jobs: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Print environment run: | @@ -404,7 +404,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index b5da80f7f78..60949f3d692 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up cloc run: | @@ -55,7 +55,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Verify run: | @@ -83,7 +83,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Get Package Version id: retrieve-version @@ -143,7 +143,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -259,7 +259,7 @@ jobs: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -277,7 +277,7 @@ jobs: node-gyp install $(node -v) - name: Install AST - uses: bitwarden/gh-actions/install-ast@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/install-ast@a30e9c3d658dc97c4c2e61ec749fdab64b83386c - name: Set up environmentF run: choco install checksum --no-progress @@ -302,7 +302,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "code-signing-vault-url, @@ -472,7 +472,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -624,7 +624,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -821,7 +821,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -1010,7 +1010,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -1181,7 +1181,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -1190,13 +1190,13 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@102b5aa21783a64027193ef802a616140a1ca102 # v1.8.1 + uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -1269,7 +1269,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 05c6b0f8b6e..9c670f01c65 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up cloc run: | @@ -56,7 +56,7 @@ jobs: version: ${{ steps.version.outputs.value }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Get GitHub sha as version id: version @@ -80,16 +80,16 @@ jobs: npm_command: "dist:bit:selfhost" - name: "cloud-QA" npm_command: "build:bit:qa" - - name: "cloud-POC2" - npm_command: "build:bit:poc" - name: "ee" npm_command: "build:bit:ee" - - name: "cloud-eudevtest" - npm_command: "build:bit:eudevtest" + - name: "cloud-euprd" + npm_command: "build:bit:euprd" + - name: "cloud-euqa" + npm_command: "build:bit:euqa" steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -158,7 +158,7 @@ jobs: _VERSION: ${{ needs.setup.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Check Branch to Publish env: @@ -237,7 +237,7 @@ jobs: - name: Retrieve github PAT secrets id: retrieve-secret-pat - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "github-pat-bitwarden-devops-bot-repo-scope" @@ -245,13 +245,13 @@ jobs: - name: Setup DCT if: ${{ env.is_publish_branch == 'true' }} id: setup-dct - uses: bitwarden/gh-actions/setup-docker-trust@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/setup-docker-trust@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: azure-creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} azure-keyvault-name: "bitwarden-ci" - name: Build Docker image - uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 # v4.0.0 + uses: docker/build-push-action@2eb1c1961a95fc15694676618e422e8ba1d63825 # v4.1.1 with: context: apps/web file: apps/web/Dockerfile @@ -284,7 +284,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -293,13 +293,13 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - name: Upload Sources - uses: crowdin/github-action@102b5aa21783a64027193ef802a616140a1ca102 # v1.8.1 + uses: crowdin/github-action@ee4ab4ea2feadc0fdc3b200729c7b1c4cf4b38f3 # v1.11.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -354,7 +354,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets if: failure() - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index d2f1f45c25d..eda9f8d0f7d 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -18,7 +18,7 @@ jobs: node-version: "16" - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: fetch-depth: 0 @@ -37,7 +37,7 @@ jobs: run: npm run build-storybook:ci - name: Publish to Chromatic - uses: chromaui/action@a2ed440e22f7d4e2c6b0710f7903aa2df70a1ecd + uses: chromaui/action@44caff7e88d584b04f79f04e31e819f9a95d4d8f with: token: ${{ secrets.GITHUB_TOKEN }} projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index f058c712031..28498461d3f 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -23,7 +23,7 @@ jobs: crowdin_project_id: "308189" steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -32,13 +32,13 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase" - name: Download translations - uses: bitwarden/gh-actions/crowdin@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/crowdin@a30e9c3d658dc97c4c2e61ec749fdab64b83386c env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} diff --git a/.github/workflows/deploy-eu-prod-web.yml b/.github/workflows/deploy-eu-prod-web.yml new file mode 100644 index 00000000000..d2cadd295ba --- /dev/null +++ b/.github/workflows/deploy-eu-prod-web.yml @@ -0,0 +1,60 @@ +--- +name: Deploy Web to EU-PRD Cloud + +on: + workflow_dispatch: + inputs: + tag: + description: "Branch name to deploy (examples: 'master', 'feature/sm')" + required: true + type: string + default: master + +jobs: + azure-deploy: + name: Deploy to Azure + runs-on: ubuntu-22.04 + env: + _WEB_ARTIFACT: "web-*-cloud-euprd.zip" + steps: + - name: Login to Azure - EU Subscription + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + with: + creds: ${{ secrets.AZURE_KV_EU_PRD_SERVICE_PRINCIPAL }} + + - name: Retrieve Storage Account connection string + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c + with: + keyvault: webvault-westeurope-prod + secrets: "sa-bitwarden-web-vault-dev-key-temp" + + - name: Download latest cloud asset + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + branch: ${{ github.event.inputs.tag }} + artifacts: ${{ env._WEB_ARTIFACT }} + + - name: Unzip build asset + working-directory: apps/web + run: unzip ${{ env._WEB_ARTIFACT }} + + - name: Empty container in Storage Account + run: | + az storage blob delete-batch \ + --source '$web' \ + --pattern '*' \ + --connection-string "${{ steps.retrieve-secrets.outputs.sa-bitwarden-web-vault-dev-key-temp }}" + + - name: Deploy to Azure Storage Account + working-directory: apps/web + run: | + az storage blob upload-batch \ + --source "./build" \ + --destination '$web' \ + --connection-string "${{ steps.retrieve-secrets.outputs.sa-bitwarden-web-vault-dev-key-temp }}" \ + --overwrite \ + --no-progress diff --git a/.github/workflows/deploy-eu-qa-web.yml b/.github/workflows/deploy-eu-qa-web.yml new file mode 100644 index 00000000000..a5b161e5dab --- /dev/null +++ b/.github/workflows/deploy-eu-qa-web.yml @@ -0,0 +1,60 @@ +--- +name: Deploy Web to EU-QA Cloud + +on: + workflow_dispatch: + inputs: + tag: + description: "Branch name to deploy (examples: 'master', 'feature/sm')" + required: true + type: string + default: master + +jobs: + azure-deploy: + name: Deploy to Azure + runs-on: ubuntu-22.04 + env: + _WEB_ARTIFACT: "web-*-cloud-euqa.zip" + steps: + - name: Login to Azure - EU Subscription + uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 + with: + creds: ${{ secrets.AZURE_KV_EU_QA_SERVICE_PRINCIPAL }} + + - name: Retrieve Storage Account connection string + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c + with: + keyvault: webvaulteu-westeurope-qa + secrets: "sa-bitwarden-web-vault-dev-key-temp" + + - name: Download latest cloud asset + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c + with: + workflow: build-web.yml + path: apps/web + workflow_conclusion: success + branch: ${{ github.event.inputs.tag }} + artifacts: ${{ env._WEB_ARTIFACT }} + + - name: Unzip build asset + working-directory: apps/web + run: unzip ${{ env._WEB_ARTIFACT }} + + - name: Empty container in Storage Account + run: | + az storage blob delete-batch \ + --source '$web' \ + --pattern '*' \ + --connection-string "${{ steps.retrieve-secrets.outputs.sa-bitwarden-web-vault-dev-key-temp }}" + + - name: Deploy to Azure Storage Account + working-directory: apps/web + run: | + az storage blob upload-batch \ + --source "./build" \ + --destination '$web' \ + --connection-string "${{ steps.retrieve-secrets.outputs.sa-bitwarden-web-vault-dev-key-temp }}" \ + --overwrite \ + --no-progress diff --git a/.github/workflows/deploy-non-prod-web.yml b/.github/workflows/deploy-non-prod-web.yml index e0b6977a781..512fefb5340 100644 --- a/.github/workflows/deploy-non-prod-web.yml +++ b/.github/workflows/deploy-non-prod-web.yml @@ -7,14 +7,17 @@ on: inputs: environment: description: 'Environment' - required: true default: 'QA' type: choice options: - QA - - POC2 - - eudevtest + workflow_call: + inputs: + environment: + description: 'Environment' + default: 'QA' + type: string jobs: setup: @@ -61,10 +64,10 @@ jobs: description: 'Deployment from branch ${{ github.ref_name }}' - name: Checkout Repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Download latest cloud asset - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-web.yml path: apps/web @@ -77,7 +80,7 @@ jobs: run: unzip ${{ env._ENVIRONMENT_ARTIFACT }} - name: Checkout Repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ env._ENVIRONMENT_BRANCH }} path: deployment diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2cc004987a1..a3c3efdd19d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Lint filenames (no capital characters) run: | diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml index c9f9b20c62d..11447afa7d4 100644 --- a/.github/workflows/release-browser.yml +++ b/.github/workflows/release-browser.yml @@ -27,7 +27,7 @@ jobs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -41,7 +41,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/release-version-check@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -56,7 +56,7 @@ jobs: needs: setup steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Testing locales - extName length run: | @@ -103,7 +103,7 @@ jobs: - name: Download latest Release build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-browser.yml workflow_conclusion: success @@ -116,7 +116,7 @@ jobs: - name: Dry Run - Download latest master build artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-browser.yml workflow_conclusion: success diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index 406b345c2fe..6186f0d6dfc 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -43,7 +43,7 @@ jobs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -57,7 +57,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/release-version-check@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -78,7 +78,7 @@ jobs: - name: Download all Release artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-cli.yml path: apps/cli @@ -87,7 +87,7 @@ jobs: - name: Dry Run - Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-cli.yml path: apps/cli @@ -141,7 +141,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -150,19 +150,19 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "snapcraft-store-token" - name: Install Snap - uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0 + uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 with: snapcraft_token: ${{ steps.retrieve-secrets.outputs.snapcraft-store-token }} - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-cli.yml path: apps/cli @@ -172,7 +172,7 @@ jobs: - name: Dry Run - Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-cli.yml path: apps/cli @@ -195,7 +195,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -204,7 +204,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "cli-choco-api-key" @@ -220,7 +220,7 @@ jobs: - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-cli.yml path: apps/cli/dist @@ -230,7 +230,7 @@ jobs: - name: Dry Run - Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-cli.yml path: apps/cli/dist @@ -243,7 +243,7 @@ jobs: shell: pwsh run: | cd dist - choco push + choco push --source=https://push.chocolatey.org/ npm: name: Publish NPM @@ -254,7 +254,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -263,14 +263,14 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "npm-api-key" - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-cli.yml path: apps/cli/build @@ -280,7 +280,7 @@ jobs: - name: Dry Run - Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-cli.yml path: apps/cli/build diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml index f9a5e4d5ad3..cf2ab64a56a 100644 --- a/.github/workflows/release-desktop-beta.yml +++ b/.github/workflows/release-desktop-beta.yml @@ -23,7 +23,7 @@ jobs: build_number: ${{ steps.increment-version.outputs.build_number }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check run: | @@ -47,7 +47,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/release-version-check@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: release-type: 'Initial Release' project-type: ts @@ -115,7 +115,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} @@ -211,7 +211,7 @@ jobs: _PACKAGE_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} @@ -231,7 +231,7 @@ jobs: node-gyp install $(node -v) - name: Install AST - uses: bitwarden/gh-actions/install-ast@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/install-ast@a30e9c3d658dc97c4c2e61ec749fdab64b83386c - name: Set up environment run: choco install checksum --no-progress @@ -249,7 +249,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "code-signing-vault-url, @@ -406,7 +406,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} @@ -535,7 +535,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} @@ -737,7 +737,7 @@ jobs: working-directory: apps/desktop steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.setup.outputs.branch-name }} @@ -932,7 +932,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "aws-electron-access-id, @@ -1011,7 +1011,7 @@ jobs: - release steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup git config run: | diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index e8832528143..2dc8bb3b313 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -53,7 +53,7 @@ jobs: release-channel: ${{ steps.release-channel.outputs.channel }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -67,7 +67,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/release-version-check@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -110,7 +110,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "aws-electron-access-id, @@ -123,7 +123,7 @@ jobs: - name: Download all artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-desktop.yml workflow_conclusion: success @@ -132,7 +132,7 @@ jobs: - name: Dry Run - Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-desktop.yml workflow_conclusion: success @@ -185,7 +185,7 @@ jobs: --endpoint-url https://${CF_ACCOUNT}.r2.cloudflarestorage.com - name: Get checksum files - uses: bitwarden/gh-actions/get-checksum@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-checksum@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: packages_dir: "apps/desktop/artifacts" file_path: "apps/desktop/artifacts/sha256-checksums.txt" @@ -254,7 +254,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout Repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -263,7 +263,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "snapcraft-store-token" @@ -279,7 +279,7 @@ jobs: - name: Download Snap artifact if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-desktop.yml workflow_conclusion: success @@ -289,7 +289,7 @@ jobs: - name: Dry Run - Download Snap artifact if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-desktop.yml workflow_conclusion: success @@ -315,7 +315,7 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout Repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Print Environment run: | @@ -329,7 +329,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "cli-choco-api-key" @@ -347,7 +347,7 @@ jobs: - name: Download choco artifact if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-desktop.yml workflow_conclusion: success @@ -357,7 +357,7 @@ jobs: - name: Dry Run - Download choco artifact if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-desktop.yml workflow_conclusion: success @@ -368,5 +368,5 @@ jobs: - name: Push to Chocolatey if: ${{ github.event.inputs.release_type != 'Dry Run' }} shell: pwsh - run: choco push + run: choco push --source=https://push.chocolatey.org/ working-directory: apps/desktop/dist diff --git a/.github/workflows/release-qa-web.yml b/.github/workflows/release-qa-web.yml deleted file mode 100644 index 60f38e9d320..00000000000 --- a/.github/workflows/release-qa-web.yml +++ /dev/null @@ -1,84 +0,0 @@ ---- -name: QA - Web Release - -on: - workflow_dispatch: {} - -jobs: - cfpages-deploy: - name: Deploy Web Vault to QA CloudFlare Pages branch - runs-on: ubuntu-20.04 - steps: - - name: Create GitHub deployment - uses: chrnorm/deployment-action@d42cde7132fcec920de534fffc3be83794335c00 # v2.0.5 - id: deployment - with: - token: '${{ secrets.GITHUB_TOKEN }}' - initial-status: 'in_progress' - environment-url: http://vault.qa.bitwarden.pw - environment: 'Web Vault - QA' - description: 'Deployment from branch ${{ github.ref_name }}' - - - name: Checkout Repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - - name: Download latest cloud asset - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 - with: - workflow: build-web.yml - path: apps/web - workflow_conclusion: success - branch: ${{ github.ref_name }} - artifacts: web-*-cloud-QA.zip - - - name: Unzip cloud asset - working-directory: apps/web - run: unzip web-*-cloud-QA.zip - - - name: Checkout Repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - with: - ref: cf-pages-qa - path: deployment - - - name: Setup git config - run: | - git config --global user.name "GitHub Action Bot" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --global url."https://github.com/".insteadOf ssh://git@github.com/ - git config --global url."https://".insteadOf ssh:// - - - name: Deploy CloudFlare Pages - run: | - rm -rf ./* - cp -R ../apps/web/build/* . - working-directory: deployment - - - name: Push new ver to cf-pages-qa - run: | - if [ -n "$(git status --porcelain)" ]; then - git add . - git commit -m "Deploy ${{ github.ref_name }} to QA Cloudflare pages" - git push -u origin cf-pages-qa - else - echo "No changes to commit!"; - fi - working-directory: deployment - - - name: Update deployment status to Success - if: ${{ success() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - environment-url: http://vault.qa.bitwarden.pw - state: 'success' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} - - - name: Update deployment status to Failure - if: ${{ failure() }} - uses: chrnorm/deployment-status@2afb7d27101260f4a764219439564d954d10b5b0 # v2.0.1 - with: - token: '${{ secrets.GITHUB_TOKEN }}' - environment-url: http://vault.qa.bitwarden.pw - state: 'failure' - deployment-id: ${{ steps.deployment.outputs.deployment_id }} diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 1ba24a8369d..601d788449c 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -24,7 +24,7 @@ jobs: tag_version: ${{ steps.version.outputs.tag }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -38,7 +38,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/release-version-check@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -65,12 +65,12 @@ jobs: echo "Github Release Option: $_RELEASE_OPTION" - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 ########## DockerHub ########## - name: Setup DCT id: setup-dct - uses: bitwarden/gh-actions/setup-docker-trust@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/setup-docker-trust@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: azure-creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} azure-keyvault-name: "bitwarden-ci" @@ -156,13 +156,13 @@ jobs: - name: Retrieve bot secrets id: retrieve-bot-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: bitwarden-ci secrets: "github-pat-bitwarden-devops-bot-repo-scope" - name: Checkout GH pages repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: repository: bitwarden/web-vault-pages path: ghpages-deployment @@ -170,7 +170,7 @@ jobs: - name: Download latest cloud asset if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-web.yml path: assets @@ -180,7 +180,7 @@ jobs: - name: Dry Run - Download latest cloud asset if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-web.yml path: assets @@ -253,7 +253,7 @@ jobs: - name: Download latest build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-web.yml path: apps/web/artifacts @@ -264,7 +264,7 @@ jobs: - name: Dry Run - Download latest build artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: workflow: build-web.yml path: apps/web/artifacts diff --git a/.github/workflows/staged-rollout-desktop.yml b/.github/workflows/staged-rollout-desktop.yml index 7221028df2e..477192b5055 100644 --- a/.github/workflows/staged-rollout-desktop.yml +++ b/.github/workflows/staged-rollout-desktop.yml @@ -26,7 +26,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "aws-electron-access-id, diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 870b5a6d980..55363a329ea 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,10 +22,10 @@ defaults: jobs: test: name: Run tests - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Set up Node uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 @@ -72,6 +72,9 @@ jobs: - windows-latest steps: + - name: Rust version check + run: rustup --version + - name: Install gnome-keyring if: ${{ matrix.os=='ubuntu-latest' }} run: | @@ -79,14 +82,7 @@ jobs: sudo apt-get install -y gnome-keyring dbus-x11 - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - - name: Install rust - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 - with: - toolchain: stable - profile: minimal - override: true + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Build working-directory: ./apps/desktop/desktop_native diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index 991b25eef94..2c13ec05b38 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -18,7 +18,7 @@ jobs: version_number: ${{ steps.version.outputs.new-version }} steps: - name: Checkout Branch - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Calculate bumped version id: version @@ -39,15 +39,11 @@ jobs: echo "new-version=$NEW_VER" >> $GITHUB_OUTPUT trigger_version_bump: - name: "Trigger desktop version bump workflow" - runs-on: ubuntu-22.04 - needs: - - setup - steps: - - name: Bump version to ${{ needs.setup.outputs.version_number }} - uses: ./.github/workflows/version-bump.yml - secrets: - AZURE_PROD_KV_CREDENTIALS: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - with: - version_number: ${{ needs.setup.outputs.version_number }} - client: "Desktop" + name: Bump version to ${{ needs.setup.outputs.version_number }} + needs: setup + uses: ./.github/workflows/version-bump.yml + secrets: + AZURE_PROD_KV_CREDENTIALS: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + with: + version_number: ${{ needs.setup.outputs.version_number }} + client: "Desktop" diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index cebe740b9d1..f30a935c4bc 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout Branch - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure - Prod Subscription uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 @@ -49,7 +49,7 @@ jobs: - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: keyvault: "bitwarden-ci" secrets: "github-gpg-private-key, github-gpg-private-key-passphrase" @@ -86,14 +86,14 @@ jobs: - name: Bump Browser Version - Manifest if: ${{ github.event.inputs.client == 'Browser' || github.event.inputs.client == 'All' }} - uses: bitwarden/gh-actions/version-bump@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/version-bump@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: version: ${{ github.event.inputs.version_number }} file_path: "apps/browser/src/manifest.json" - name: Bump Browser Version - Manifest v3 if: ${{ github.event.inputs.client == 'Browser' || github.event.inputs.client == 'All' }} - uses: bitwarden/gh-actions/version-bump@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/version-bump@a30e9c3d658dc97c4c2e61ec749fdab64b83386c with: version: ${{ github.event.inputs.version_number }} file_path: "apps/browser/src/manifest.v3.json" diff --git a/.github/workflows/workflow-linter.yml b/.github/workflows/workflow-linter.yml index 20525879d5a..9dced5ee530 100644 --- a/.github/workflows/workflow-linter.yml +++ b/.github/workflows/workflow-linter.yml @@ -8,4 +8,4 @@ on: jobs: call-workflow: - uses: bitwarden/gh-actions/.github/workflows/workflow-linter.yml@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/.github/workflows/workflow-linter.yml@a30e9c3d658dc97c4c2e61ec749fdab64b83386c diff --git a/.storybook/main.ts b/.storybook/main.ts index a7f12f469ba..acc6e2a56db 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -15,6 +15,7 @@ const config: StorybookConfig = { "@storybook/addon-links", "@storybook/addon-essentials", "@storybook/addon-a11y", + "@storybook/addon-designs", { name: "@storybook/addon-docs", options: { diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index d7d37a71e7c..0bc9fc5bacb 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -101,6 +101,7 @@ const preview: Preview = { }, options: { storySort: { + method: "alphabetical", order: ["Documentation", ["Introduction", "Colors", "Icons"], "Component Library"], }, }, diff --git a/apps/browser/package.json b/apps/browser/package.json index 4872af87d3f..5e1ad9bfd8d 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2023.5.0", + "version": "2023.7.1", "scripts": { "build": "webpack", "build:mv3": "cross-env MANIFEST_VERSION=3 webpack", diff --git a/apps/browser/postcss.config.js b/apps/browser/postcss.config.js new file mode 100644 index 00000000000..c4513687e89 --- /dev/null +++ b/apps/browser/postcss.config.js @@ -0,0 +1,4 @@ +/* eslint-disable no-undef */ +module.exports = { + plugins: [require("tailwindcss"), require("autoprefixer"), require("postcss-nested")], +}; diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 519115d2a81..bf021b10513 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "تحديث" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "إظهار خيارات قائمة السياق" }, @@ -1444,34 +1450,34 @@ "message": "هل أنت متأكد من أنك تريد استعادة هذا العنصر؟" }, "restoredItem": { - "message": "Item restored" + "message": "تم استعادة العنصر" }, "vaultTimeoutLogOutConfirmation": { - "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" + "message": "سيؤدي تسجيل الخروج إلى إزالة جميع إمكانية الوصول إلى خزنتك ويتطلب المصادقة عبر الإنترنت بعد انتهاء المهلة. هل أنت متأكد من أنك تريد استخدام هذا الإعداد؟" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Timeout action confirmation" + "message": "تأكيد إجراء المهلة" }, "autoFillAndSave": { - "message": "Auto-fill and save" + "message": "التعبئة التلقائية والحفظ" }, "autoFillSuccessAndSavedUri": { - "message": "Item auto-filled and URI saved" + "message": "تم تعبئة العنصر تلقائياً وحفظ عنوان URI" }, "autoFillSuccess": { - "message": "Item auto-filled " + "message": "ملء العنصر تلقائياً " }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "تحذير: هذه صفحة HTTP غير آمنة، وأي معلومات تقدمها يمكن رؤيتها وتغييرها من قبل الآخرين. تم حفظ تسجيل الدخول هذا في الأصل على صفحة آمنة (HTTPS)." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "هل مازلت ترغب في ملء هذا الدخول؟" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "يتم استضافة النموذج من قبل نطاق مختلف عن عنوان URI الخاص بتسجيل الدخول المحفوظ. اختر موافق للملء التلقائي على أي حال، أو ألغ للتوقف." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "لمنع هذا التحذير في المستقبل، حفظ هذا الرابط، $HOSTNAME$ إلى عنصر تسجيل الدخول الخاص بك Bitwarden لهذا الموقع.", "placeholders": { "hostname": { "content": "$1", @@ -1480,22 +1486,22 @@ } }, "setMasterPassword": { - "message": "Set master password" + "message": "تعيين كلمة مرور رئيسية" }, "currentMasterPass": { - "message": "Current master password" + "message": "كلمة المرور الرئيسية الحالية" }, "newMasterPass": { - "message": "New master password" + "message": "كلمة مرور رئيسية جديدة" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "تأكيد كلمة المرور الرئيسية الجديدة" }, "masterPasswordPolicyInEffect": { - "message": "One or more organization policies require your master password to meet the following requirements:" + "message": "1 - تتطلب سياسة واحدة أو أكثر من سياسات المؤسسة كلمة مرورك الرئيسية لتلبية المتطلبات التالية:" }, "policyInEffectMinComplexity": { - "message": "Minimum complexity score of $SCORE$", + "message": "الحد الأدنى لدرجة التعقيد $SCORE$", "placeholders": { "score": { "content": "$1", @@ -1504,7 +1510,7 @@ } }, "policyInEffectMinLength": { - "message": "Minimum length of $LENGTH$", + "message": "الحد الأدنى لطول $LENGTH$", "placeholders": { "length": { "content": "$1", @@ -1513,16 +1519,16 @@ } }, "policyInEffectUppercase": { - "message": "Contain one or more uppercase characters" + "message": "يحتوي على حرف كبير واحد أو أكثر" }, "policyInEffectLowercase": { - "message": "Contain one or more lowercase characters" + "message": "يحتوي على واحد أو أكثر من الأحرف الصغيرة" }, "policyInEffectNumbers": { - "message": "Contain one or more numbers" + "message": "يحتوي على رقم واحد أو أكثر" }, "policyInEffectSpecial": { - "message": "Contain one or more of the following special characters $CHARS$", + "message": "يحتوي على واحد أو أكثر من الأحرف الخاصة التالية $CHARS$", "placeholders": { "chars": { "content": "$1", @@ -1534,7 +1540,7 @@ "message": "كلمة المرور الرئيسية الجديدة لا تفي بمتطلبات السياسة العامة." }, "acceptPolicies": { - "message": "By checking this box you agree to the following:" + "message": "من خلال تحديد هذا المربع فإنك توافق على ما يلي:" }, "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." @@ -1618,13 +1624,13 @@ "message": "An organization policy is affecting your ownership options." }, "excludedDomains": { - "message": "Excluded domains" + "message": "النطاقات المستبعدة" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "message": "Bitwarden لن يطلب حفظ تفاصيل تسجيل الدخول لهذه النطاقات. يجب عليك تحديث الصفحة حتى تصبح التغييرات سارية المفعول." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "$DOMAIN$ نطاق غير صالح", "placeholders": { "domain": { "content": "$1", @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index 0c12f845d51..26d26ac38a2 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Güncəllə" }, + "notificationUnlockDesc": { + "message": "Avto-doldurma tələblərini tamamlamaq üçün Bitwarden anbarınızın kilidini açın." + }, + "notificationUnlock": { + "message": "Kilidi aç" + }, "enableContextMenuItem": { "message": "Konteks menyu seçimlərini göstər" }, @@ -1462,16 +1468,16 @@ "message": "Element avto-dolduruldu" }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "Xəbərdarlıq: Bu, güvənli olmayan bir HTTP səhifəsidir və göndərdiyiniz istənilən məlumat başqaları tərəfindən görünə və dəyişdirilə bilər. Bu Giriş, orijinal olaraq güvənli (HTTPS) bir səhifədə saxlanılmışdır." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "Hələ də bu girişi doldurmaq istəyirsiniz?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "Form sahibliyi, saxlanılmış girişinizin URI-ından fərqli bir domen tərəfindən həyata keçirilir. Yenə də avto-doldurmaq üçün \"Oldu\"ya, dayandırmaq üçün \"İmtina\"ya basın." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "Gələcəkdə bu xəbərdarlığın qarşısını almaq üçün, $HOSTNAME$ URI-nı bu sayt üçün Bitwarden giriş elementinizdə saxlayın.", "placeholders": { "hostname": { "content": "$1", @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Bölgə" + "loggingInOn": { + "message": "Giriş edilir" }, "opensInANewWindow": { "message": "Yeni bir pəncərədə açılır" }, - "eu": { - "message": "AB", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ABŞ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Müraciət rədd edildi. Bu səhifəyə baxmaq üçün icazəniz yoxdur." + }, + "general": { + "message": "Ümumi" + }, + "display": { + "message": "Ekran" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 80800f4aa38..946b2dc5d9d 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Абнавіць" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Паказваць параметры кантэкстнага меню" }, @@ -1462,16 +1468,16 @@ "message": "Аўтазапоўнены элемент" }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "Папярэджанне: гэта старонка HTTP не абаронена. Любая інфармацыя, якую вы адпраўляеце тэарэтычна можа перахоплена і зменена любым карыстальнікам. Гэты лагін першапачаткова захаваны на абароненай старонцы (HTTPS)." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "Вы ўсё яшчэ хочаце запоўніць гэты лагін?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "Форма размешчана на іншым дамене, які адрозніваецца ад URI вашага захаванага лагіна. Націсніце \"Добра\", каб усё роўна запоўніць або \"Скасаваць\" для спынення." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "Каб больш не атрымліваць гэта папярэджанне, захавайце гэты URI, $HOSTNAME$ у свае элементы ўваходу Bitwarden для гэтага сайта.", "placeholders": { "hostname": { "content": "$1", @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Адкрываць у новым акне" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Доступ забаронены. У вас не дастаткова правоў для прагляду гэтай старонкі." + }, + "general": { + "message": "Асноўныя" + }, + "display": { + "message": "Адлюстраванне" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index b17692bc83b..04a9f08050d 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Да, нека се обнови сега" }, + "notificationUnlockDesc": { + "message": "Отключете трезора си в Битуорден, за да завършите заявката за автоматично попълване." + }, + "notificationUnlock": { + "message": "Отключване" + }, "enableContextMenuItem": { "message": "Показване на опции в контекстното меню" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Вписване в" }, "opensInANewWindow": { "message": "Отваря се в нов прозорец" }, - "eu": { - "message": "ЕС", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "САЩ", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Отказан достъп. Нямате право за преглед на страницата." + }, + "general": { + "message": "Общи" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index 76143e7619a..aef8c25bfeb 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "হ্যাঁ, এখনই হালনাগাদ করুন" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index b3047a98789..4f85dde0c37 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 91bbfdb48b4..916eeea79f4 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Actualitza" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Mostra les opcions del menú contextual" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Regió" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "S'obri en una finestra nova" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EUA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Accés denegat. No teniu permís per veure aquesta pàgina." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Mostra" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index d83282e08a4..de48e4c237d 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Aktualizovat" }, + "notificationUnlockDesc": { + "message": "Pro dokončení požadavku na automatické vyplnění odemkněte Váš trezor na Bitwardenu." + }, + "notificationUnlock": { + "message": "Odemknout" + }, "enableContextMenuItem": { "message": "Zobrazit volby v kontextovém menu" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Přihlašování na" }, "opensInANewWindow": { "message": "Otevře se v novém okně" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Přístup byl odepřen. Nemáte oprávnění k zobrazení této stránky." + }, + "general": { + "message": "Obecné" + }, + "display": { + "message": "Zobrazení" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index 69d26333a84..2d0dc622f72 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - Free Password Manager", + "message": "Bitwarden - Rheolydd cyfineiriau am ddim", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { @@ -11,13 +11,13 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Log in or create a new account to access your secure vault." + "message": "Mewngofnodwch neu crëwch gyfrif newydd i gael mynediad i'ch cell ddiogel." }, "createAccount": { - "message": "Create account" + "message": "Creu cyfrif" }, "login": { - "message": "Log in" + "message": "Mewngofnodi" }, "enterpriseSingleSignOn": { "message": "Enterprise single sign-on" @@ -26,16 +26,16 @@ "message": "Cancel" }, "close": { - "message": "Close" + "message": "Cau" }, "submit": { "message": "Submit" }, "emailAddress": { - "message": "Email address" + "message": "Cyfeiriad ebost" }, "masterPass": { - "message": "Master password" + "message": "Prif gyfrinair" }, "masterPassDesc": { "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." @@ -53,46 +53,46 @@ "message": "Tab" }, "vault": { - "message": "Vault" + "message": "Cell" }, "myVault": { - "message": "My vault" + "message": "Fy nghell" }, "allVaults": { - "message": "All vaults" + "message": "Pob cell" }, "tools": { - "message": "Tools" + "message": "Offer" }, "settings": { - "message": "Settings" + "message": "Gosodiadau" }, "currentTab": { - "message": "Current tab" + "message": "Y tab cyfredol" }, "copyPassword": { - "message": "Copy password" + "message": "Copïo cyfrinair" }, "copyNote": { "message": "Copy note" }, "copyUri": { - "message": "Copy URI" + "message": "Copïo URI" }, "copyUsername": { - "message": "Copy username" + "message": "Copïo enw defnyddiwr" }, "copyNumber": { - "message": "Copy number" + "message": "Copïo rhif" }, "copySecurityCode": { "message": "Copy security code" }, "autoFill": { - "message": "Auto-fill" + "message": "Llenwi'n awtomatig" }, "generatePasswordCopied": { - "message": "Generate password (copied)" + "message": "Cynhyrchu cyfrinair (wedi'i gopïo)" }, "copyElementIdentifier": { "message": "Copy custom field name" @@ -101,19 +101,19 @@ "message": "No matching logins" }, "unlockVaultMenu": { - "message": "Unlock your vault" + "message": "Datgloi'ch cell" }, "loginToVaultMenu": { - "message": "Log in to your vault" + "message": "Mewngofnodi i'ch cell" }, "autoFillInfo": { "message": "There are no logins available to auto-fill for the current browser tab." }, "addLogin": { - "message": "Add a login" + "message": "Ychwanegu manylion mewngofnodi" }, "addItem": { - "message": "Add item" + "message": "Ychwanegu eitem" }, "passwordHint": { "message": "Password hint" @@ -125,25 +125,25 @@ "message": "Get master password hint" }, "continue": { - "message": "Continue" + "message": "Parhau" }, "sendVerificationCode": { "message": "Send a verification code to your email" }, "sendCode": { - "message": "Send code" + "message": "Anfod cod" }, "codeSent": { - "message": "Code sent" + "message": "Cod wedi'i anfon" }, "verificationCode": { - "message": "Verification code" + "message": "Cod dilysu" }, "confirmIdentity": { - "message": "Confirm your identity to continue." + "message": "Cadarnhewch eich hunaniaeth i barhau." }, "account": { - "message": "Account" + "message": "Cyfrif" }, "changeMasterPassword": { "message": "Change master password" @@ -160,43 +160,43 @@ "message": "Two-step login" }, "logOut": { - "message": "Log out" + "message": "Allgofnodi" }, "about": { - "message": "About" + "message": "Ynghylch" }, "version": { - "message": "Version" + "message": "Fersiwn" }, "save": { - "message": "Save" + "message": "Cadw" }, "move": { - "message": "Move" + "message": "Symud" }, "addFolder": { - "message": "Add folder" + "message": "Ychwanegu ffolder" }, "name": { - "message": "Name" + "message": "Enw" }, "editFolder": { - "message": "Edit folder" + "message": "Golygu ffolder" }, "deleteFolder": { - "message": "Delete folder" + "message": "Dileu'r ffolder" }, "folders": { - "message": "Folders" + "message": "Ffolderi" }, "noFolders": { - "message": "There are no folders to list." + "message": "Does dim ffolderi i'w rhestru." }, "helpFeedback": { - "message": "Help & feedback" + "message": "Cymorth ac adborth" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "Canolfan gymorth Bitwarden" }, "communityForums": { "message": "Explore Bitwarden community forums" @@ -205,26 +205,26 @@ "message": "Contact Bitwarden support" }, "sync": { - "message": "Sync" + "message": "Cysoni" }, "syncVaultNow": { - "message": "Sync vault now" + "message": "Cysoni'r gell nawr" }, "lastSync": { - "message": "Last sync:" + "message": "Wedi'i chysoni ddiwethaf:" }, "passGen": { - "message": "Password generator" + "message": "Cynhyrchydd cyfrineiriau" }, "generator": { - "message": "Generator", + "message": "Cynhyrchydd", "description": "Short for 'Password Generator'." }, "passGenInfo": { - "message": "Automatically generate strong, unique passwords for your logins." + "message": "Cynhyrchu cyfrineiriau cryf ac unigryw ar gyfer eich cyfrifon yn awtomatig." }, "bitWebVault": { - "message": "Bitwarden web vault" + "message": "Cell we Bitwarden" }, "importItems": { "message": "Import items" @@ -233,41 +233,41 @@ "message": "Select" }, "generatePassword": { - "message": "Generate password" + "message": "Cynhyrchu cyfrinair" }, "regeneratePassword": { - "message": "Regenerate password" + "message": "Ailgynhyrchu cyfrinair" }, "options": { - "message": "Options" + "message": "Dewisiadau" }, "length": { - "message": "Length" + "message": "Hyd" }, "uppercase": { - "message": "Uppercase (A-Z)" + "message": "Priflythrennau (A-Z)" }, "lowercase": { - "message": "Lowercase (a-z)" + "message": "Llythrennau bach (a-z)" }, "numbers": { - "message": "Numbers (0-9)" + "message": "Rhifau (0-9)" }, "specialCharacters": { - "message": "Special characters (!@#$%^&*)" + "message": "Nodau arbennig (!@#$%^&*)" }, "numWords": { - "message": "Number of words" + "message": "Nifer o eiriau" }, "wordSeparator": { - "message": "Word separator" + "message": "Gwahanydd geiriau" }, "capitalize": { - "message": "Capitalize", + "message": "Priflythrennu", "description": "Make the first letter of a work uppercase." }, "includeNumber": { - "message": "Include number" + "message": "Cynnwys rhif" }, "minNumbers": { "message": "Minimum numbers" @@ -279,43 +279,43 @@ "message": "Avoid ambiguous characters" }, "searchVault": { - "message": "Search vault" + "message": "Chwilio'r gell" }, "edit": { - "message": "Edit" + "message": "Golygu" }, "view": { "message": "View" }, "noItemsInList": { - "message": "There are no items to list." + "message": "Does dim eitemau i'w rhestru." }, "itemInformation": { "message": "Item information" }, "username": { - "message": "Username" + "message": "Enw defnyddiwr" }, "password": { - "message": "Password" + "message": "Cyfrinair" }, "passphrase": { - "message": "Passphrase" + "message": "Cyfrinymadrodd" }, "favorite": { - "message": "Favorite" + "message": "Ffefrynnu" }, "notes": { - "message": "Notes" + "message": "Nodiadau" }, "note": { - "message": "Note" + "message": "Nodyn" }, "editItem": { "message": "Edit item" }, "folder": { - "message": "Folder" + "message": "Ffolder" }, "deleteItem": { "message": "Delete item" @@ -324,16 +324,16 @@ "message": "View item" }, "launch": { - "message": "Launch" + "message": "Lansio" }, "website": { - "message": "Website" + "message": "Gwefan" }, "toggleVisibility": { "message": "Toggle visibility" }, "manage": { - "message": "Manage" + "message": "Rheoli" }, "other": { "message": "Other" @@ -348,13 +348,13 @@ "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." }, "verifyIdentity": { - "message": "Verify identity" + "message": "Gwirio'ch hunaniaeth" }, "yourVaultIsLocked": { - "message": "Your vault is locked. Verify your identity to continue." + "message": "Mae eich cell dan glo. Gwiriwch eich hunaniaeth i barhau." }, "unlock": { - "message": "Unlock" + "message": "Datgloi" }, "loggedInAsOn": { "message": "Logged in as $EMAIL$ on $HOSTNAME$.", @@ -370,46 +370,46 @@ } }, "invalidMasterPassword": { - "message": "Invalid master password" + "message": "Prif gyfrinair annilys" }, "vaultTimeout": { - "message": "Vault timeout" + "message": "Cloi'r gell" }, "lockNow": { "message": "Lock now" }, "immediately": { - "message": "Immediately" + "message": "ar unwaith" }, "tenSeconds": { - "message": "10 seconds" + "message": "ar ôl 10 eiliad" }, "twentySeconds": { - "message": "20 seconds" + "message": "ar ôl 20 eiliad" }, "thirtySeconds": { - "message": "30 seconds" + "message": "ar ôl 30 eiliad" }, "oneMinute": { - "message": "1 minute" + "message": "ar ôl munud" }, "twoMinutes": { - "message": "2 minutes" + "message": "ar ôl 2 funud" }, "fiveMinutes": { - "message": "5 minutes" + "message": "ar ôl 5 munud" }, "fifteenMinutes": { - "message": "15 minutes" + "message": "ar ôl chwarter awr" }, "thirtyMinutes": { - "message": "30 minutes" + "message": "ar ôl hanner awr" }, "oneHour": { - "message": "1 hour" + "message": "ar ôl awr" }, "fourHours": { - "message": "4 hours" + "message": "ar ôl 4 awr" }, "onLocked": { "message": "On system lock" @@ -418,28 +418,28 @@ "message": "On browser restart" }, "never": { - "message": "Never" + "message": "byth" }, "security": { - "message": "Security" + "message": "Diogelwch" }, "errorOccurred": { "message": "An error has occurred" }, "emailRequired": { - "message": "Email address is required." + "message": "Mae angen cyfeiriad ebost." }, "invalidEmail": { - "message": "Invalid email address." + "message": "Cyfeiriad ebost annilys." }, "masterPasswordRequired": { - "message": "Master password is required." + "message": "Mae angen prif gyfrinair." }, "confirmMasterPasswordRequired": { - "message": "Master password retype is required." + "message": "Mae angen aildeipio'r prif gyfrinair." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "Rhaid i'r prif gyfrinair gynnwys o leiaf $VALUE$ nod.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -452,16 +452,16 @@ "message": "Master password confirmation does not match." }, "newAccountCreated": { - "message": "Your new account has been created! You may now log in." + "message": "Mae eich cyfrif newydd wedi cael ei greu! Gallwch bellach fewngofnodi." }, "masterPassSent": { - "message": "We've sent you an email with your master password hint." + "message": "Rydym ni wedi anfon ebost atoch gydag awgrym ar gyfer eich prif gyfrinair." }, "verificationCodeRequired": { - "message": "Verification code is required." + "message": "Mae angen cod dilysu." }, "invalidVerificationCode": { - "message": "Invalid verification code" + "message": "Cod dilysu annilys" }, "valueCopied": { "message": "$VALUE$ copied", @@ -480,10 +480,10 @@ "message": "Logged out" }, "loginExpired": { - "message": "Your login session has expired." + "message": "Mae eich sesiwn wedi dod i ben." }, "logOutConfirmation": { - "message": "Are you sure you want to log out?" + "message": "Ydych chi'n siŵr eich bod am allgofnodi?" }, "yes": { "message": "Yes" @@ -495,7 +495,7 @@ "message": "An unexpected error has occurred." }, "nameRequired": { - "message": "Name is required." + "message": "Mae angen enw." }, "addedFolder": { "message": "Folder added" @@ -547,7 +547,7 @@ } }, "newUri": { - "message": "New URI" + "message": "URI newydd" }, "addedItem": { "message": "Item added" @@ -556,10 +556,10 @@ "message": "Item saved" }, "deleteItemConfirmation": { - "message": "Do you really want to send to the trash?" + "message": "Ydych chi wir eisiau anfon i'r sbwriel?" }, "deletedItem": { - "message": "Item sent to trash" + "message": "Anfonwyd yr eitem i'r sbwriel" }, "overwritePassword": { "message": "Overwrite password" @@ -583,7 +583,7 @@ "message": "Search type" }, "noneFolder": { - "message": "No folder", + "message": "Dim ffolder", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { @@ -616,7 +616,7 @@ "message": "Should Bitwarden remember this password for you?" }, "notificationAddSave": { - "message": "Save" + "message": "Cadw" }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" @@ -628,7 +628,13 @@ "message": "Do you want to update this password in Bitwarden?" }, "notificationChangeSave": { - "message": "Update" + "message": "Diweddaru" + }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" }, "enableContextMenuItem": { "message": "Show context menu options" @@ -644,17 +650,17 @@ "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." }, "theme": { - "message": "Theme" + "message": "Thema" }, "themeDesc": { "message": "Change the application's color theme." }, "dark": { - "message": "Dark", + "message": "Tywyll", "description": "Dark color" }, "light": { - "message": "Light", + "message": "Golau", "description": "Light color" }, "solarizedDark": { @@ -662,13 +668,13 @@ "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { - "message": "Export vault" + "message": "Allforio'r gell" }, "fileFormat": { - "message": "File format" + "message": "Fformat y ffeil" }, "warning": { - "message": "WARNING", + "message": "RHYBUDD", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "confirmVaultExport": { @@ -699,7 +705,7 @@ "message": "Move to organization" }, "share": { - "message": "Share" + "message": "Rhannu" }, "movedItemToOrg": { "message": "$ITEMNAME$ moved to $ORGNAME$", @@ -718,7 +724,7 @@ "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." }, "learnMore": { - "message": "Learn more" + "message": "Dysgu mwy" }, "authenticatorKeyTotp": { "message": "Authenticator key (TOTP)" @@ -730,7 +736,7 @@ "message": "Copy verification code" }, "attachments": { - "message": "Attachments" + "message": "Atodiadau" }, "deleteAttachment": { "message": "Delete attachment" @@ -751,7 +757,7 @@ "message": "Attachment saved" }, "file": { - "message": "File" + "message": "Ffeil" }, "selectFile": { "message": "Select a file" @@ -766,16 +772,16 @@ "message": "You cannot use this feature until you update your encryption key." }, "premiumMembership": { - "message": "Premium membership" + "message": "Aelodaeth uwch" }, "premiumManage": { - "message": "Manage membership" + "message": "Rheoli'ch aelodaeth" }, "premiumManageAlert": { "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" }, "premiumRefresh": { - "message": "Refresh membership" + "message": "Adnewyddu'ch aelodaeth" }, "premiumNotCurrentMember": { "message": "You are not currently a Premium member." @@ -814,7 +820,7 @@ "message": "Thank you for supporting Bitwarden." }, "premiumPrice": { - "message": "All for just $PRICE$ /year!", + "message": "Hyn oll am $PRICE$ y flwyddyn!", "placeholders": { "price": { "content": "$1", @@ -862,7 +868,7 @@ } }, "rememberMe": { - "message": "Remember me" + "message": "Fy nghofio i" }, "sendVerificationCodeEmailAgain": { "message": "Send verification code email again" @@ -880,7 +886,7 @@ "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." }, "webAuthnNewTabOpen": { - "message": "Open new tab" + "message": "Agor tab newydd" }, "webAuthnAuthenticate": { "message": "Authenticate WebAuthn" @@ -901,7 +907,7 @@ "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." }, "recoveryCodeTitle": { - "message": "Recovery code" + "message": "Cod adfer" }, "authenticatorAppTitle": { "message": "Authenticator app" @@ -931,7 +937,7 @@ "message": "Use any WebAuthn compatible security key to access your account." }, "emailTitle": { - "message": "Email" + "message": "Ebost" }, "emailDesc": { "message": "Verification codes will be emailed to you." @@ -943,7 +949,7 @@ "message": "Specify the base URL of your on-premises hosted Bitwarden installation." }, "customEnvironment": { - "message": "Custom environment" + "message": "Amgylchedd addasedig" }, "customEnvironmentFooter": { "message": "For advanced users. You can specify the base URL of each service independently." @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -973,13 +979,13 @@ "message": "Auto-fill on page load" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "Llenwi'n awtomatig wrth i dudalen lwytho os canfyddir ffurflen mewngofnodi." }, "experimentalFeature": { "message": "Compromised or untrusted websites can exploit auto-fill on page load." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Dysgu mwy am lenwi'n awtomatig" }, "defaultAutoFillOnPageLoad": { "message": "Default autofill setting for login items" @@ -991,7 +997,7 @@ "message": "Auto-fill on page load (if set up in Options)" }, "autoFillOnPageLoadUseDefault": { - "message": "Use default setting" + "message": "Defnyddio'r gosodiad rhagosodedig" }, "autoFillOnPageLoadYes": { "message": "Auto-fill on page load" @@ -1012,13 +1018,13 @@ "message": "Generate and copy a new random password to the clipboard" }, "commandLockVaultDesc": { - "message": "Lock the vault" + "message": "Cloi'r gell" }, "privateModeWarning": { "message": "Private mode support is experimental and some features are limited." }, "customFields": { - "message": "Custom fields" + "message": "Meysydd addasedig" }, "copyValue": { "message": "Copy value" @@ -1027,13 +1033,13 @@ "message": "Value" }, "newCustomField": { - "message": "New custom field" + "message": "Maes addasedig newydd" }, "dragToSort": { "message": "Drag to sort" }, "cfTypeText": { - "message": "Text" + "message": "Testun" }, "cfTypeHidden": { "message": "Hidden" @@ -1056,10 +1062,10 @@ "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Dangos eiconau gwefannau" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Dangos delwedd adnabyddadwy wrth ymyl pob eitem." }, "enableBadgeCounter": { "message": "Show badge counter" @@ -1068,67 +1074,67 @@ "message": "Indicate how many logins you have for the current web page." }, "cardholderName": { - "message": "Cardholder name" + "message": "Enw ar y cerdyn" }, "number": { - "message": "Number" + "message": "Rhif" }, "brand": { "message": "Brand" }, "expirationMonth": { - "message": "Expiration month" + "message": "Mis dod i ben" }, "expirationYear": { - "message": "Expiration year" + "message": "Blwyddyn dod i ben" }, "expiration": { - "message": "Expiration" + "message": "Dod i ben" }, "january": { - "message": "January" + "message": "Ionawr" }, "february": { - "message": "February" + "message": "Chwefror" }, "march": { - "message": "March" + "message": "Mawrth" }, "april": { - "message": "April" + "message": "Ebrill" }, "may": { - "message": "May" + "message": "Mai" }, "june": { - "message": "June" + "message": "Mehefin" }, "july": { - "message": "July" + "message": "Gorffennaf" }, "august": { - "message": "August" + "message": "Awst" }, "september": { - "message": "September" + "message": "Medi" }, "october": { - "message": "October" + "message": "Hydref" }, "november": { - "message": "November" + "message": "Tachwedd" }, "december": { - "message": "December" + "message": "Rhagfyr" }, "securityCode": { - "message": "Security code" + "message": "Cod diogelwch" }, "ex": { "message": "ex." }, "title": { - "message": "Title" + "message": "Teitl" }, "mr": { "message": "Mr" @@ -1146,119 +1152,119 @@ "message": "Mx" }, "firstName": { - "message": "First name" + "message": "Enw cyntaf" }, "middleName": { - "message": "Middle name" + "message": "Enw canol" }, "lastName": { - "message": "Last name" + "message": "Cyfenw" }, "fullName": { - "message": "Full name" + "message": "Enw llawn" }, "identityName": { "message": "Identity name" }, "company": { - "message": "Company" + "message": "Cwmni" }, "ssn": { "message": "Social Security number" }, "passportNumber": { - "message": "Passport number" + "message": "Rhif pasbort" }, "licenseNumber": { - "message": "License number" + "message": "Rhif trwydded" }, "email": { - "message": "Email" + "message": "Ebost" }, "phone": { - "message": "Phone" + "message": "Ffôn" }, "address": { - "message": "Address" + "message": "Cyfeiriad" }, "address1": { - "message": "Address 1" + "message": "Cyfeiriad 1" }, "address2": { - "message": "Address 2" + "message": "Cyfeiriad 2" }, "address3": { - "message": "Address 3" + "message": "Cyfeiriad 3" }, "cityTown": { - "message": "City / Town" + "message": "Tref / Dinas" }, "stateProvince": { - "message": "State / Province" + "message": "Talaith / Rhanbarth" }, "zipPostalCode": { - "message": "Zip / Postal code" + "message": "Cod post / zip" }, "country": { - "message": "Country" + "message": "Gwlad" }, "type": { - "message": "Type" + "message": "Math" }, "typeLogin": { - "message": "Login" + "message": "Manylion mewngofnodi" }, "typeLogins": { - "message": "Logins" + "message": "Manylion mewngofnodi" }, "typeSecureNote": { - "message": "Secure note" + "message": "Nodyn diogel" }, "typeCard": { - "message": "Card" + "message": "Cerdyn" }, "typeIdentity": { - "message": "Identity" + "message": "Hunaniaeth" }, "passwordHistory": { "message": "Password history" }, "back": { - "message": "Back" + "message": "Yn ôl" }, "collections": { - "message": "Collections" + "message": "Casgliadau" }, "favorites": { - "message": "Favorites" + "message": "Ffefrynnau" }, "popOutNewWindow": { - "message": "Pop out to a new window" + "message": "Syumd i ffenestr newydd" }, "refresh": { "message": "Refresh" }, "cards": { - "message": "Cards" + "message": "Cardiau" }, "identities": { - "message": "Identities" + "message": "Eitemau hunaniaeth" }, "logins": { - "message": "Logins" + "message": "Manylion mewngofnodi" }, "secureNotes": { - "message": "Secure notes" + "message": "Nodiadau diogel" }, "clear": { - "message": "Clear", + "message": "Clirio", "description": "To clear something out. example: To clear browser history." }, "checkPassword": { - "message": "Check if password has been exposed." + "message": "Gwirio a ydy'r cyfrinair wedi'i ddatgelu." }, "passwordExposed": { - "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "message": "Mae'r cyfrinair hwn wedi cael ei ddatgelu $VALUE$ o weithiau mewn achosion o dorri data. Dylech chi ei newid.", "placeholders": { "value": { "content": "$1", @@ -1267,7 +1273,7 @@ } }, "passwordSafe": { - "message": "This password was not found in any known data breaches. It should be safe to use." + "message": "Chafodd y cyfrinair hwn mo'i ganfod mewn unrhyw achos hysbys o dorri data. Dylai fod yn iawn i'w ddefnyddio." }, "baseDomain": { "message": "Base domain", @@ -1307,24 +1313,24 @@ "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "Current URI", + "message": "URI cyfredol", "description": "The URI of one of the current open tabs in the browser." }, "organization": { - "message": "Organization", + "message": "Sefydliad", "description": "An entity of multiple related people (ex. a team or business organization)." }, "types": { "message": "Types" }, "allItems": { - "message": "All items" + "message": "Pob eitem" }, "noPasswordsInList": { - "message": "There are no passwords to list." + "message": "Does dim cyfrineiriau i'w rhestru." }, "remove": { - "message": "Remove" + "message": "Tynnu" }, "default": { "message": "Default" @@ -1351,44 +1357,44 @@ "message": "There are no collections to list." }, "ownership": { - "message": "Ownership" + "message": "Perchnogaeth" }, "whoOwnsThisItem": { - "message": "Who owns this item?" + "message": "Pwy sy'n berchen ar yr eitem hon?" }, "strong": { - "message": "Strong", + "message": "Cryf", "description": "ex. A strong password. Scale: Weak -> Good -> Strong" }, "good": { - "message": "Good", + "message": "Da", "description": "ex. A good password. Scale: Weak -> Good -> Strong" }, "weak": { - "message": "Weak", + "message": "Gwan", "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Weak master password" + "message": "Prif gyfrinair gwan" }, "weakMasterPasswordDesc": { - "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + "message": "Mae'r prif gyfrinair rydych chi wedi'i ddewis yn wan. Dylech ddefnyddio prif gyfrinair (neu gyfrinymadrodd) cryf i amddiffyn eich cyfrif Bitwarden. Ydych chi'n siŵr eich bod am ddefnyddio'r prif gyfrinair hwn?" }, "pin": { "message": "PIN", "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { - "message": "Unlock with PIN" + "message": "Datgloi â PIN" }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, "pinRequired": { - "message": "PIN code is required." + "message": "Mae angen cod PIN." }, "invalidPin": { - "message": "Invalid PIN code." + "message": "Cod PIN annilys." }, "unlockWithBiometrics": { "message": "Unlock with biometrics" @@ -1422,11 +1428,11 @@ "description": "Verb form: to make secure or inaccesible by" }, "trash": { - "message": "Trash", + "message": "Sbwriel", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Search trash" + "message": "Chwilio drwy'r sbwriel" }, "permanentlyDeleteItem": { "message": "Permanently delete item" @@ -1438,7 +1444,7 @@ "message": "Item permanently deleted" }, "restoreItem": { - "message": "Restore item" + "message": "Adfer yr eitem" }, "restoreItemConfirmation": { "message": "Are you sure you want to restore this item?" @@ -1480,13 +1486,13 @@ } }, "setMasterPassword": { - "message": "Set master password" + "message": "Gosod prif gyfrinair" }, "currentMasterPass": { "message": "Current master password" }, "newMasterPass": { - "message": "New master password" + "message": "Prif gyfrinair newydd" }, "confirmNewMasterPass": { "message": "Confirm new master password" @@ -1534,7 +1540,7 @@ "message": "Your new master password does not meet the policy requirements." }, "acceptPolicies": { - "message": "By checking this box you agree to the following:" + "message": "Drwy dicio'r blwch hwn, rydych yn cytuno i'r canlynol:" }, "acceptPoliciesRequired": { "message": "Terms of Service and Privacy Policy have not been acknowledged." @@ -1543,7 +1549,7 @@ "message": "Terms of Service" }, "privacyPolicy": { - "message": "Privacy Policy" + "message": "Polisi preifatrwydd" }, "hintEqualsPassword": { "message": "Your password hint cannot be the same as your password." @@ -1618,13 +1624,13 @@ "message": "An organization policy is affecting your ownership options." }, "excludedDomains": { - "message": "Excluded domains" + "message": "Parthau wedi'u heithrio" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "message": "Fydd Bitwarden ddim yn gofyn i gadw manylion mewngofnodi'r parthau hyn. Rhaid i chi ail-lwytho'r dudalen i newidiadau ddod i rym." }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ is not a valid domain", + "message": "Dyw $DOMAIN$ ddim yn barth dilys", "placeholders": { "domain": { "content": "$1", @@ -1637,21 +1643,21 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "searchSends": { - "message": "Search Sends", + "message": "Chwilio drwy Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "addSend": { - "message": "Add Send", + "message": "Ychwanegu Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { - "message": "Text" + "message": "Testun" }, "sendTypeFile": { - "message": "File" + "message": "Ffeil" }, "allSends": { - "message": "All Sends", + "message": "Pob Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { @@ -1675,7 +1681,7 @@ "message": "Remove Password" }, "delete": { - "message": "Delete" + "message": "Dileu" }, "removedPassword": { "message": "Password removed" @@ -1718,14 +1724,14 @@ "message": "The file you want to send." }, "deletionDate": { - "message": "Deletion date" + "message": "Dyddiad dileu" }, "deletionDateDesc": { "message": "The Send will be permanently deleted on the specified date and time.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { - "message": "Expiration date" + "message": "Dyddiad dod i ben" }, "expirationDateDesc": { "message": "If set, access to this Send will expire on the specified date and time.", @@ -1744,7 +1750,7 @@ } }, "custom": { - "message": "Custom" + "message": "Addasedig" }, "maximumAccessCount": { "message": "Maximum Access Count" @@ -1812,7 +1818,7 @@ "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." }, "sendFileCalloutHeader": { - "message": "Before you start" + "message": "Cyn i chi ddechrau" }, "sendFirefoxCustomDatePopoutMessage1": { "message": "To use a calendar style date picker", @@ -1827,16 +1833,16 @@ "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" }, "expirationDateIsInvalid": { - "message": "The expiration date provided is not valid." + "message": "Dyw'r dyddiad dod i ben a roddwyd ddim yn ddilys." }, "deletionDateIsInvalid": { - "message": "The deletion date provided is not valid." + "message": "Dyw'r dyddiad dileu a roddwyd ddim yn ddilys." }, "expirationDateAndTimeRequired": { - "message": "An expiration date and time are required." + "message": "Mae angen rhoi dyddiad ac amser dod i ben." }, "deletionDateAndTimeRequired": { - "message": "A deletion date and time are required." + "message": "Mae angen rhoi dyddiad ac amser dileu." }, "dateParsingError": { "message": "There was an error saving your deletion and expiration dates." @@ -1881,7 +1887,7 @@ "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." }, "selectFolder": { - "message": "Select folder..." + "message": "Dewis ffolder..." }, "ssoCompleteRegistration": { "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." @@ -1989,7 +1995,7 @@ } }, "error": { - "message": "Error" + "message": "Gwall" }, "regenerateUsername": { "message": "Regenerate username" @@ -2023,13 +2029,13 @@ "message": "Website name" }, "whatWouldYouLikeToGenerate": { - "message": "What would you like to generate?" + "message": "Beth hoffech chi ei gynhyrchu?" }, "passwordType": { - "message": "Password type" + "message": "Math o gyfrinair" }, "service": { - "message": "Service" + "message": "Gwasanaeth" }, "forwardedEmail": { "message": "Forwarded email alias" @@ -2045,7 +2051,7 @@ "message": "API Access Token" }, "apiKey": { - "message": "API Key" + "message": "Allwedd API" }, "ssoKeyConnectorError": { "message": "Key connector error: make sure key connector is available and working correctly." @@ -2120,7 +2126,7 @@ "message": "Remember email" }, "loginWithDevice": { - "message": "Log in with device" + "message": "Mewngofnodi â dyfais" }, "loginWithDeviceEnabledInfo": { "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" @@ -2135,7 +2141,7 @@ "message": "Resend notification" }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "Gweld pob dewis mewngofnodi" }, "notificationSentDevice": { "message": "A notification has been sent to your device." @@ -2159,7 +2165,7 @@ "message": "Check known data breaches for this password" }, "important": { - "message": "Important:" + "message": "Pwysig:" }, "masterPasswordHint": { "message": "Your master password cannot be recovered if you forget it!" @@ -2177,10 +2183,10 @@ "message": "Your organization policies have turned on auto-fill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "Sut i lenwi'n awtomatig" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Dewiswch eitem o'r dudalen hon neu ddefnyddio'r llwybr byr: $COMMAND$", "placeholders": { "command": { "content": "$1", @@ -2192,10 +2198,10 @@ "message": "Select an item from this page or set a shortcut in settings." }, "gotIt": { - "message": "Got it" + "message": "Iawn" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Gosodiadau llenwi awtomatig" }, "autofillShortcut": { "message": "Auto-fill keyboard shortcut" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Mynediad wedi ei wrthod. Does gennych chi ddim caniatâd i weld y dudalen hon." + }, + "general": { + "message": "Cyffredinol" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 5aebf5dd80d..58dbe45aec2 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Opdatér" }, + "notificationUnlockDesc": { + "message": "Oplås din Bitwarden boks for at færdiggøre autoudfyldanmodningen." + }, + "notificationUnlock": { + "message": "Oplås" + }, "enableContextMenuItem": { "message": "Vis indstillinger i kontekstmenuen" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logger ind på" }, "opensInANewWindow": { "message": "Åbnes i et nyt vindue" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Adgang nægtet. Nødvendig tilladelse til at se siden mangler." + }, + "general": { + "message": "Generelt" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index c7827d4ddc4..d48d1ec04c2 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -11,7 +11,7 @@ "description": "Extension description" }, "loginOrCreateNewAccount": { - "message": "Du musst dich anmelden oder einen neuen Account erstellen, um auf den Tresor zugreifen zu können." + "message": "Melde dich an oder erstelle ein neues Konto, um auf deinen Tresor zuzugreifen." }, "createAccount": { "message": "Konto erstellen" @@ -294,7 +294,7 @@ "message": "Eintragsinformationen" }, "username": { - "message": "Nutzername" + "message": "Benutzername" }, "password": { "message": "Passwort" @@ -357,7 +357,7 @@ "message": "Entsperren" }, "loggedInAsOn": { - "message": "Eingeloggt als $EMAIL$ auf $HOSTNAME$.", + "message": "Angemeldet als $EMAIL$ auf $HOSTNAME$.", "placeholders": { "email": { "content": "$1", @@ -409,7 +409,7 @@ "message": "1 Stunde" }, "fourHours": { - "message": "4 Stunde" + "message": "4 Stunden" }, "onLocked": { "message": "Wenn System gesperrt" @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Aktualisieren" }, + "notificationUnlockDesc": { + "message": "Entsperre deinen Bitwarden Tresor, um die Auto-Ausfüllen-Anfrage abzuschließen." + }, + "notificationUnlock": { + "message": "Entsperren" + }, "enableContextMenuItem": { "message": "Kontextmenüoptionen anzeigen" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API Server-URL" }, "webVaultUrl": { "message": "URL des Web-Tresor-Servers" @@ -1170,7 +1176,7 @@ "message": "Reisepassnummer" }, "licenseNumber": { - "message": "Führerscheinnummer" + "message": "Lizenznummer" }, "email": { "message": "E-Mail" @@ -1582,7 +1588,7 @@ "message": "Desktop-Kommunikation unterbrochen" }, "nativeMessagingWrongUserDesc": { - "message": "Die Desktop-Anwendung ist in ein anderes Konto eingeloggt. Bitte stelle sicher, dass beide Anwendungen mit demselben Konto angemeldet sind." + "message": "Die Desktop-Anwendung ist in einem anderen Konto angemeldet. Bitte stelle sicher, dass beide Anwendungen mit demselben Konto angemeldet sind." }, "nativeMessagingWrongUserTitle": { "message": "Konten stimmen nicht überein" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Anmelden bei" }, "opensInANewWindow": { "message": "Wird in einem neuen Fenster geöffnet" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Zugriff verweigert. Du hast keine Berechtigung, diese Seite anzuzeigen." + }, + "general": { + "message": "Allgemein" + }, + "display": { + "message": "Anzeige" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 4f85e42e08f..9a3ab302bce 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ναι, Ενημέρωση Τώρα" }, + "notificationUnlockDesc": { + "message": "Ξεκλειδώστε το θησαυ/κιο Bitwarden σας για να ολοκληρώσετε το αίτημα αυτόματης πλήρωσης." + }, + "notificationUnlock": { + "message": "Ξεκλείδωμα" + }, "enableContextMenuItem": { "message": "Εμφάνιση επιλογών μενού περιβάλλοντος" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Σύνδεση ως" }, "opensInANewWindow": { "message": "Ανοίγει σε νέο παράθυρο" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Δεν επιτρέπεται η πρόσβαση. Δεν έχετε άδεια για να δείτε αυτή τη σελίδα." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 97a8d3cc4ee..e31b317b03b 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2233,23 +2239,27 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" }, "accessDenied": { "message": "Access denied. You do not have permission to view this page." }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" + }, "loginPasskey": { "message": "This login uses a passkey" }, diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index 653ff32074c..9627efab01d 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index 3fe6222cfcf..5903b01eb3b 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Yes, update now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index afd3ea4ce87..e9dd0024495 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Actualizar" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Mostrar las opciones de menú contextuales" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Región" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Abre en una nueva ventana" }, - "eu": { - "message": "Unión Europea", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EE.UU.", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Acceso denegado. No tiene permiso para ver esta página." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 02ee8d04384..7ae023a60f5 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Jah, uuenda" }, + "notificationUnlockDesc": { + "message": "Ava Bitwardeni hoidla, et automaattäide lõpuni viia." + }, + "notificationUnlock": { + "message": "Lukusta lahti" + }, "enableContextMenuItem": { "message": "Kuva parema kliki menüü valikud" }, @@ -1462,16 +1468,16 @@ "message": "Kirje täideti" }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "Hoiatus: See on ebaturvaline HTTP lehekülg. Teised osapooled võivad sinu sisestatud infot potentsiaalselt näha ja muuta. Algselt oli see kirje salvestatud turvalise (HTTPS) lehe jaoks." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "Soovid kirje automaattäita?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "See vorm on majutatud teistsugusel domeenil kui sinu salvestatud URI. Vajuta OK, et automaattäita või Tühista, et täitmine peatada." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "Selleks, et antud teavitust edaspidi ei kuvataks, salvesta see URI $HOSTNAME$ Bitwardeni kirjesse.", "placeholders": { "hostname": { "content": "$1", @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Piirkond" + "loggingInOn": { + "message": "Sisselogimas kui" }, "opensInANewWindow": { "message": "Avaneb uues aknas" }, - "eu": { - "message": "EL", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Ligipääs keelatud. Sul pole lubatud seda lehekülge vaadata." + }, + "general": { + "message": "Üldine" + }, + "display": { + "message": "Kuvamine" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index e2189ce6a68..eaab1c4b4b9 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -196,7 +196,7 @@ "message": "Laguntza eta iritziak" }, "helpCenter": { - "message": "Bitwarden Help center" + "message": "Bitwarden Laguntza zentroa" }, "communityForums": { "message": "Explore Bitwarden community forums" @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Eguneratu" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Erakutsi laster-menuko aukerak" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index 0e4a59e164b..5ebfe79be2b 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "به‌روزرسانی" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "نمایش گزینه‌های منوی زمینه" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "در پنجره جدید باز می‌شود" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "دسترسی رد شد. شما اجازه مشاهده این صفحه را ندارید." + }, + "general": { + "message": "عمومی" + }, + "display": { + "message": "نمایش" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index 69b77b26123..e95aa2bc803 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -3,11 +3,11 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden – Ilmainen salasananhallinta", + "message": "Bitwarden – Ilmainen salasanahallinta", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Turvallinen ja ilmainen salasanojen hallinta kaikille laitteillesi.", + "message": "Turvallinen ja ilmainen salasanahallinta kaikille laitteillesi.", "description": "Extension description" }, "loginOrCreateNewAccount": { @@ -224,7 +224,7 @@ "message": "Luo kirjautumistiedoillesi automaattisesti vahvoja, ainutlaatuisia salasanoja." }, "bitWebVault": { - "message": "Bitwardenin verkkoholvi" + "message": "Bitwarden Verkkoholvi" }, "importItems": { "message": "Tuo kohteita" @@ -288,7 +288,7 @@ "message": "Näytä" }, "noItemsInList": { - "message": "Ei näytettäviä kohteita." + "message": "Näytettäviä kohteita ei ole." }, "itemInformation": { "message": "Kohteen tiedot" @@ -587,7 +587,7 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Kysy lisätäänkö kirjautimistieto" + "message": "Kysy lisätäänkö kirjautumistieto" }, "addLoginNotificationDesc": { "message": "Kysy lisätäänkö uusi kohde, jos holvissa ei vielä ole sopivaa kohdetta." @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Päivitä" }, + "notificationUnlockDesc": { + "message": "Viimeistele automaattitäytön pyyntö avaamalla Bitwarden-holvisi lukitus." + }, + "notificationUnlock": { + "message": "Avaa" + }, "enableContextMenuItem": { "message": "Näytä sisältövalikon valinnat" }, @@ -2123,7 +2129,7 @@ "message": "Laitteella kirjautuminen" }, "loginWithDeviceEnabledInfo": { - "message": "Laitteella kirjautuminen on määritettävä Bitwarden-mobiilisovelluksen asetuksista. Tarvitsetko eri vaihtoehdon?" + "message": "Laitteella kirjautuminen on määritettävä Bitwarden-sovelluksen asetuksista. Tarvitsetko eri vaihtoehdon?" }, "fingerprintPhraseHeader": { "message": "Tunnistelauseke" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Alue" + "loggingInOn": { + "message": "Kirjaudutaan sijaintiin" }, "opensInANewWindow": { "message": "Avautuu uudessa ikkunassa" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Pääsy estetty. Sinulla ei ole oikeutta avata sivua." + }, + "general": { + "message": "Yleiset" + }, + "display": { + "message": "Ulkoasu" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index e98884c2007..c6082c51669 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "I-update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Ipakita ang mga opsyon ng menu ng konteksto" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index 8f4e769c695..d5216ae72d7 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Mettre à jour" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Déverrouiller" + }, "enableContextMenuItem": { "message": "Afficher les options du menu contextuel" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Région" + "loggingInOn": { + "message": "Connexion sur" }, "opensInANewWindow": { "message": "S'ouvre dans une nouvelle fenêtre" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Accès refusé. Vous n'avez pas l'autorisation de voir cette page." + }, + "general": { + "message": "Général" + }, + "display": { + "message": "Affichage" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index 69d26333a84..63dd227e52b 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index fc90bade6c0..64c8bf51176 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "כן, עדכן עכשיו" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "כללי" + }, + "display": { + "message": "תצוגה" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index df561ad0e47..c91afe71cf3 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Yes, Update Now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "संदर्भ मेनू विकल्प दिखाएं" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index 37ecb3de8c8..65bbc664fdd 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ažuriraj" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Prikaži opcije kotekstualnog izbornika" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index c5e8214b635..bd106eac48d 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Frissítés" }, + "notificationUnlockDesc": { + "message": "A Bitwarden széf feloldása az automatikus kitöltési kérés teljesítéséhez." + }, + "notificationUnlock": { + "message": "Feloldás" + }, "enableContextMenuItem": { "message": "Helyi menü opciók megjelenítése" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Régió" + "loggingInOn": { + "message": "Bejelentkezés:" }, "opensInANewWindow": { "message": "Megnyitás új ablakban" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "A hozzáférés megtagadásra került. Nincs jogosultság az oldal megtekintésére." + }, + "general": { + "message": "Általános" + }, + "display": { + "message": "Megjelenítés" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index 6addc264fb2..724e8bc30d0 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Iya, Perbarui Sekarang" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 1971331fd98..20f338b39e1 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Aggiorna" }, + "notificationUnlockDesc": { + "message": "Sblocca la tua cassaforte di Bitwarden per completare la richiesta di riempimento automatico." + }, + "notificationUnlock": { + "message": "Sblocca" + }, "enableContextMenuItem": { "message": "Mostra opzioni nel menu contestuale" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Regione" + "loggingInOn": { + "message": "Accedendo su" }, "opensInANewWindow": { "message": "Si apre in una nuova finestra" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Accesso negato. Non hai i permessi necessari per visualizzare questa pagina." + }, + "general": { + "message": "Generale" + }, + "display": { + "message": "Schermo" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index 630dfb3e217..e52752179b7 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "今すぐ更新する" }, + "notificationUnlockDesc": { + "message": "Bitwarden 保管庫をロック解除して自動入力リクエストを完了してください。" + }, + "notificationUnlock": { + "message": "ロック解除" + }, "enableContextMenuItem": { "message": "コンテキストメニューオプションを表示" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "リージョン" + "loggingInOn": { + "message": "ログイン先" }, "opensInANewWindow": { "message": "新しいウィンドウで開く" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "米国", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "アクセスが拒否されました。このページを表示する権限がありません。" + }, + "general": { + "message": "全般" + }, + "display": { + "message": "表示" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index 2f484324f39..569277e8e34 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 69d26333a84..63dd227e52b 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index baa61fad177..3a9a33dda1a 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "ಹೌದು, ಈಗ ನವೀಕರಿಸಿ" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index 962fe7347cf..50cadc8a949 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "예, 지금 변경하겠습니다." }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index e6a9dbdc5c6..b1dc314612c 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -56,7 +56,7 @@ "message": "Saugykla" }, "myVault": { - "message": "Saugykla" + "message": "Mano saugykla" }, "allVaults": { "message": "Visos saugyklos" @@ -596,13 +596,13 @@ "message": "Rodyti korteles skirtuko puslapyje" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Pateikti kortelių elementų skirtuko puslapyje sąrašą, kad būtų lengva automatiškai užpildyti." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Rodyti tapatybes skirtuko puslapyje" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Pateikti tapatybės elementų skirtuko puslapyje, kad būtų lengva automatiškai užpildyti." }, "clearClipboard": { "message": "Išvalyti iškarpinę", @@ -613,10 +613,10 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Ar „Bitwarden“ turėtų prisiminti šį slaptažodį?" + "message": "Ar Bitwarden turėtų įsiminti šį slaptažodį už tave?" }, "notificationAddSave": { - "message": "Taip, išsaugoti dabar" + "message": "Išsaugoti" }, "enableChangedPasswordNotification": { "message": "Paprašyti atnaujinti esamą prisijungimą" @@ -625,10 +625,16 @@ "message": "Paprašyti atnaujinti prisijungimo slaptažodį, kai pakeitimas aptiktas svetainėje." }, "notificationChangeDesc": { - "message": "Ar norite atnaujinti šį slaptažodį „Bitwarden“?" + "message": "Ar nori atnaujinti šį slaptažodį Bitwarden?" }, "notificationChangeSave": { - "message": "Taip, atnaujinti dabar" + "message": "Atnaujinti" + }, + "notificationUnlockDesc": { + "message": "Atrakink savo Bitwarden saugyklą, kad užpildytum automatinio užpildymo užklausą." + }, + "notificationUnlock": { + "message": "Atrakinti" }, "enableContextMenuItem": { "message": "Rodyti kontekstinio meniu pasririnkimus" @@ -658,7 +664,7 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarized dark", + "message": "Saulėtas tamsą", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { @@ -748,7 +754,7 @@ "message": "Priedų nėra." }, "attachmentSaved": { - "message": "Priedas buvo išsaugotas." + "message": "Priedas išsaugotas" }, "file": { "message": "Failas" @@ -757,13 +763,13 @@ "message": "Pasirinkite failą." }, "maxFileSize": { - "message": "Failai negali būti didesni už 500 MB." + "message": "Didžiausias failo dydis – 500 MB." }, "featureUnavailable": { "message": "Funkcija neprieinama" }, "updateKey": { - "message": "Negalite naudoti šios funkcijos, kol neatnaujinsite šifravimo raktą." + "message": "Negali naudotis šia funkcija, kol neatnaujinsi šifravimo raktą." }, "premiumMembership": { "message": "Premium narystė" @@ -781,7 +787,7 @@ "message": "Neturite Premium narystės." }, "premiumSignUpAndGet": { - "message": "Prisijungite prie Premium narystės ir gaukite:" + "message": "Prisijunk prie Premium narystės ir gauk:" }, "ppremiumSignUpStorage": { "message": "1 GB užšifruotos vietos diske bylų prisegimams." @@ -790,10 +796,10 @@ "message": "Papildomos dviejų žingsių prisijungimo opcijos, tokios kaip YubiKey, FIDO U2F ir Duo." }, "ppremiumSignUpReports": { - "message": "Slaptažodžio higiena, prieigos sveikata ir duomenų nutekinimo ataskaitos, kad jūsų seifas būtų saugus." + "message": "Slaptažodžio higiena, prieigos sveikata ir duomenų nutekinimo ataskaitos, kad tavo saugyklas būtų saugus." }, "ppremiumSignUpTotp": { - "message": "TOTP patvirtinimo kodų (2FA) generatorius prisijungimams prie jūsų saugyklos." + "message": "TOTP patvirtinimo kodų (2FA) generatorius prisijungimams prie tavo saugyklos." }, "ppremiumSignUpSupport": { "message": "Prioritetinis klientų aptarnavimas." @@ -802,13 +808,13 @@ "message": "Visos būsimos Premium savybės. Daugiau jau greitai!" }, "premiumPurchase": { - "message": "Įsigyti Premium planą" + "message": "Įsigyti Premium" }, "premiumPurchaseAlert": { - "message": "Jūs galite įsigyti Premium narystę bitwarden.com puslapyje. Ar norite aplankyti šį puslapį dabar?" + "message": "Gali įsigyti Premium narystę bitwarden.com interneto saugykloje. Ar nori aplankyti svetainėje dabar?" }, "premiumCurrentMember": { - "message": "Jūs esate Premium narys!" + "message": "Tu esi Premium narys!" }, "premiumCurrentMemberThanks": { "message": "Dėkojame, kad remiate Bitwarden." @@ -829,22 +835,22 @@ "message": "Kopijuoti vienkartinį kodą (TOTP) automatiškai" }, "disableAutoTotpCopyDesc": { - "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + "message": "Jei prisijungimas turi autentifikatoriaus raktą, nukopijuokite TOTP tikrinimo kodą į iškarpinę, kai automatiškai užpildysite prisijungimą." }, "enableAutoBiometricsPrompt": { "message": "Paleidžiant patvirtinti biometrinius duomenis" }, "premiumRequired": { - "message": "Tik su Premium naryste" + "message": "Premium reikalinga" }, "premiumRequiredDesc": { "message": "Premium narystė reikalinga šiai funkcijai naudoti." }, "enterVerificationCodeApp": { - "message": "Įveskite 6 skaitmenų patvirtinimo kodą iš jūsų autentifikavimo aplikacijos." + "message": "Įvesk 6 skaitmenų patvirtinimo kodą iš tavo autentifikavimo aplikacijos." }, "enterVerificationCodeEmail": { - "message": "Įveskite 6 skaitmenų prisijungimo kodą, kuris buvo išsiųstas $EMAIL$ el. paštu.", + "message": "Įvesk 6 skaitmenų prisijungimo kodą, kuris buvo išsiųstas $EMAIL$ el. paštu.", "placeholders": { "email": { "content": "$1", @@ -871,34 +877,34 @@ "message": "Naudoti dar vieną dviejų žingsnių prisijungimo metodą" }, "insertYubiKey": { - "message": "Insert your YubiKey into your computer's USB port, then touch its button." + "message": "Įkišk YubiKey į savo kompiuterio USB prievadą, tada paliesk jo mygtuką." }, "insertU2f": { - "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + "message": "Įkišk savo saugos raktą į kompiuterio USB prievadą. Jei jame yra mygtukas, paliesk jį." }, "webAuthnNewTab": { - "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." + "message": "Norint pradėti WebAuthn 2FA patikrinimą. Spustelėk toliau esantį mygtuką, kad atsidarytų naujas skirtukas, ir sek naujame skirtuke pateiktas instrukcijas." }, "webAuthnNewTabOpen": { "message": "Atidaryti naują skirtuką" }, "webAuthnAuthenticate": { - "message": "Authenticate WebAuthn" + "message": "Autentifikuoti WebAuthn" }, "loginUnavailable": { "message": "Prisijungimas nepasiekiamas" }, "noTwoStepProviders": { - "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." + "message": "Šioje paskyroje nustatytas dviejų žingsnių prisijungimas, tačiau, nė vienas iš sukonfigūruotų dviejų žingsnių paslaugų teikėjų nėra palaikomas šioje interneto naršyklėje." }, "noTwoStepProviders2": { - "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." + "message": "Prašome naudoti palaikomą interneto naršyklę (pvz., Chrome) ir/arba pridėti papildomus paslaugų teikėjus, kurie geriau palaikomi įvairiose interneto naršyklėse (pvz., autentifikavimo programėlę)." }, "twoStepOptions": { "message": "Dviejų žingsnių prisijungimo parinktys" }, "recoveryCodeDesc": { - "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." + "message": "Praradai prieigą prie visų savo dviejų veiksnių teikėjų? Naudok atkūrimo kodą, kad iš savo paskyros išjungtum visus dviejų veiksnių teikėjus." }, "recoveryCodeTitle": { "message": "Atkūrimo kodas" @@ -907,46 +913,46 @@ "message": "Autentifikavimo programa" }, "authenticatorAppDesc": { - "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", + "message": "Naudok autentifikatoriaus programėlę (pvz., Authy arba Google Autentifikatorius), kad sugeneruotum laiko patikrinimo kodus.", "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." }, "yubiKeyTitle": { - "message": "YubiKey OTP Security Key" + "message": "YubiKey OTP saugumo raktas" }, "yubiKeyDesc": { - "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." + "message": "Naudok YubiKey, kad prisijungtum prie savo paskyros. Veikia su YubiKey 4, 4 Nano, 4C ir NEO įrenginiais." }, "duoDesc": { - "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "message": "Patvirtink su Duo Security naudodami Duo Mobile programą, SMS žinutę, telefono skambutį arba U2F saugumo raktą.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "message": "Patikrink su Duo Security savo organizacijai naudodamasis Duo Mobile programą, SMS žinutę, telefono skambutį arba U2F saugumo raktą.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn compatible security key to access your account." + "message": "Naudok bet kurį WebAuthn palaikantį saugumo raktą, kad galėtum naudotis savo paskyra." }, "emailTitle": { "message": "El. paštas" }, "emailDesc": { - "message": "Verification codes will be emailed to you." + "message": "Patvirtinimo kodai bus atsiųsti el. paštu tau." }, "selfHostedEnvironment": { - "message": "Self-hosted environment" + "message": "Savarankiškai sukurta aplinka" }, "selfHostedEnvironmentFooter": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation." + "message": "Nurodyk pagrindinį URL adresą savo patalpose esančio Bitwarden diegimo." }, "customEnvironment": { "message": "Individualizuota aplinka" }, "customEnvironmentFooter": { - "message": "For advanced users. You can specify the base URL of each service independently." + "message": "Pažengusiems naudotojams. Galite nurodyti kiekvienos paslaugos pagrindinį URL adresą atskirai." }, "baseUrl": { "message": "Serverio URL" @@ -967,13 +973,13 @@ "message": "Piktogramų serverio URL" }, "environmentSaved": { - "message": "Environment URLs saved" + "message": "Aplinkos URL adresai išsaugoti" }, "enableAutoFillOnPageLoad": { "message": "Automatiškai užpildyti užsikrovus puslapiui" }, "enableAutoFillOnPageLoadDesc": { - "message": "If a login form is detected, auto-fill when the web page loads." + "message": "Jei aptikta prisijungimo forma, automatiškai užpildyti, kai kraunamas tinklalapis." }, "experimentalFeature": { "message": "Compromised or untrusted websites can exploit auto-fill on page load." @@ -1537,7 +1543,7 @@ "message": "By checking this box you agree to the following:" }, "acceptPoliciesRequired": { - "message": "Terms of Service and Privacy Policy have not been acknowledged." + "message": "Paslaugų teikimo sąlygos ir privatumo politika nebuvo pripažinti." }, "termsOfService": { "message": "Paslaugų teikimo paslaugos" @@ -1552,13 +1558,13 @@ "message": "Gerai" }, "desktopSyncVerificationTitle": { - "message": "Desktop sync verification" + "message": "Darbalaukio sinchronizavimo verifikavimas" }, "desktopIntegrationVerificationText": { - "message": "Please verify that the desktop application shows this fingerprint: " + "message": "Patikrink, ar darbalaukio programoje rodomas šis pirštų atspaudas: " }, "desktopIntegrationDisabledTitle": { - "message": "Browser integration is not set up" + "message": "Naršyklės integracija nėra nustatyta" }, "desktopIntegrationDisabledDesc": { "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." @@ -2105,10 +2111,10 @@ } }, "loginWithMasterPassword": { - "message": "Log in with master password" + "message": "Prisijungti su pagrindiniu slaptažodžiu" }, "loggingInAs": { - "message": "Logging in as" + "message": "Prisijungimas kaip" }, "notYou": { "message": "Ne jūs?" @@ -2117,13 +2123,13 @@ "message": "Ar jūs naujas čia?" }, "rememberEmail": { - "message": "Remember email" + "message": "Prisiminti el. paštą" }, "loginWithDevice": { "message": "Prisijunkite naudodami įrenginį" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "Prisijungti su įrenginiu turi būti nustatyta Bitwarden aplikacijos nustatymuose. Reikia kito pasirinkimo?" }, "fingerprintPhraseHeader": { "message": "Fingerprint phrase" @@ -2177,10 +2183,10 @@ "message": "Your organization policies have turned on auto-fill on page load." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "Kaip automatiškai užpildyti" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Pasirink elementą iš šio puslapio arba naudok trumpąjį klavišą: $COMMAND$", "placeholders": { "command": { "content": "$1", @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Prieiga uždrausta. Neturi teisės peržiūrėti šį puslapį." + }, + "general": { + "message": "Bendra" + }, + "display": { + "message": "Rodyti" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 38c892aaede..bd42b3bcbbf 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Jā, atjaunināt" }, + "notificationUnlockDesc": { + "message": "Jāatslēdz Bitwarden glabātava, lai pabeigtu automātiskās aizpildīšanas pieprasījumu." + }, + "notificationUnlock": { + "message": "Atslēgt" + }, "enableContextMenuItem": { "message": "Rādīt konteksta izvēlnes iespējas" }, @@ -841,10 +847,10 @@ "message": "Ir nepieciešama Premium dalība, lai izmantotu šo iespēju." }, "enterVerificationCodeApp": { - "message": "Ievadi 6 ciparu apstiprinājuma kodu no autentificētāja lietotnes!" + "message": "Jāievada 6 ciparu apstiprinājuma kods no autentificētāja lietotnes." }, "enterVerificationCodeEmail": { - "message": "Ievadi 6 ciparu apstiprinājuma kodu, kas tika nosūtīts uz $EMAIL$.", + "message": "Jāievada 6 ciparu apstiprinājuma kods, kas tika nosūtīts uz $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -1537,7 +1543,7 @@ "message": "Atzīmējot šo rūtiņu, Tu piekrīti sekojošajam:" }, "acceptPoliciesRequired": { - "message": "Nav apstiprināti izmantošanas nosacījumi un privātuma politika." + "message": "Nav apstiprināti izmantošanas noteikumi un privātuma nosacījumi." }, "termsOfService": { "message": "Izmantošanas nosacījumi" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Apgabals" + "loggingInOn": { + "message": "Piesakās" }, "opensInANewWindow": { "message": "Atver jaunā logā" }, - "eu": { - "message": "ES", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ASV", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Piekļuve liegta. Nav nepieciešamo atļauju, lai skatītu šo lapu." + }, + "general": { + "message": "Vispārīgi" + }, + "display": { + "message": "Attēlojums" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index 4c4e9936e0f..ad8f6083c22 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "ശരി, ഇപ്പോൾ അപ്ഡേറ്റ് ചെയ്യുക" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json new file mode 100644 index 00000000000..70b41cafbdb --- /dev/null +++ b/apps/browser/src/_locales/mr/messages.json @@ -0,0 +1,2251 @@ +{ + "appName": { + "message": "Bitwarden" + }, + "extName": { + "message": "Bitwarden - विनामूल्य पासवर्ड व्यवस्थापक", + "description": "Extension name, MUST be less than 40 characters (Safari restriction)" + }, + "extDesc": { + "message": "तुमच्या सर्व उपकरणांसाठी एक सुरक्षित व विनामूल्य पासवर्ड व्यवस्थापक.", + "description": "Extension description" + }, + "loginOrCreateNewAccount": { + "message": "तुमच्या सुरक्षित तिजोरीत पोहचण्यासाठी लॉग इन करा किंवा नवीन खाते उघडा." + }, + "createAccount": { + "message": "खाते तयार करा" + }, + "login": { + "message": "प्रवेश करा" + }, + "enterpriseSingleSignOn": { + "message": "Enterprise single sign-on" + }, + "cancel": { + "message": "रद्द" + }, + "close": { + "message": "मिटवा" + }, + "submit": { + "message": "पाठवा" + }, + "emailAddress": { + "message": "ईमेल पत्ता" + }, + "masterPass": { + "message": "मुख्य पासवर्ड" + }, + "masterPassDesc": { + "message": "The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it." + }, + "masterPassHintDesc": { + "message": "A master password hint can help you remember your password if you forget it." + }, + "reTypeMasterPass": { + "message": "Re-type master password" + }, + "masterPassHint": { + "message": "मुख्य पासवर्डचा संकेत (पर्यायी)" + }, + "tab": { + "message": "टॅब" + }, + "vault": { + "message": "तिजोरी" + }, + "myVault": { + "message": "माझी तिजोरी" + }, + "allVaults": { + "message": "सर्व तिजोऱ्या" + }, + "tools": { + "message": "साधने" + }, + "settings": { + "message": "मांडणी" + }, + "currentTab": { + "message": "वर्तमान टॅब" + }, + "copyPassword": { + "message": "पासवर्ड कॉपी करा" + }, + "copyNote": { + "message": "टीप कॉपी करा" + }, + "copyUri": { + "message": "URI कॉपी करा" + }, + "copyUsername": { + "message": "वापरकर्तानाव कॉपी करा" + }, + "copyNumber": { + "message": "क्रमांक कॉपी करा" + }, + "copySecurityCode": { + "message": "सुरक्षा कोड कॉपी करा" + }, + "autoFill": { + "message": "स्वयंभरण" + }, + "generatePasswordCopied": { + "message": "Generate password (copied)" + }, + "copyElementIdentifier": { + "message": "Copy custom field name" + }, + "noMatchingLogins": { + "message": "No matching logins" + }, + "unlockVaultMenu": { + "message": "तिजोरी उघडा" + }, + "loginToVaultMenu": { + "message": "तिजोरीत प्रवेश करा" + }, + "autoFillInfo": { + "message": "There are no logins available to auto-fill for the current browser tab." + }, + "addLogin": { + "message": "लॉगिन जोडा" + }, + "addItem": { + "message": "वस्तू जोडा" + }, + "passwordHint": { + "message": "पासवर्ड संकेत" + }, + "enterEmailToGetHint": { + "message": "Enter your account email address to receive your master password hint." + }, + "getMasterPasswordHint": { + "message": "मुख्य पासवर्ड संकेत मिळवा" + }, + "continue": { + "message": "पुढे" + }, + "sendVerificationCode": { + "message": "तुमच्या ईमेलवर एक सत्यापन कोड पाठवा" + }, + "sendCode": { + "message": "कोड पाठवा" + }, + "codeSent": { + "message": "कोड पाठवला" + }, + "verificationCode": { + "message": "सत्यापन कोड" + }, + "confirmIdentity": { + "message": "पुढे जाण्यासाठी तुमच्या ओळखीची पुष्टी करा." + }, + "account": { + "message": "खाते" + }, + "changeMasterPassword": { + "message": "मुख्य पासवर्ड बदला" + }, + "fingerprintPhrase": { + "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." + }, + "yourAccountsFingerprint": { + "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": "दोन टप्प्यात लॉगिन" + }, + "logOut": { + "message": "बाहेर पडा" + }, + "about": { + "message": "आमच्या विषयी" + }, + "version": { + "message": "आवृत्ती" + }, + "save": { + "message": "साठवा" + }, + "move": { + "message": "हलवा" + }, + "addFolder": { + "message": "फोल्डर जोडा" + }, + "name": { + "message": "नाव" + }, + "editFolder": { + "message": "फोल्डर संपादित करा" + }, + "deleteFolder": { + "message": "फोल्डर खोडून टाका" + }, + "folders": { + "message": "Folders" + }, + "noFolders": { + "message": "There are no folders to list." + }, + "helpFeedback": { + "message": "Help & feedback" + }, + "helpCenter": { + "message": "Bitwarden Help center" + }, + "communityForums": { + "message": "Explore Bitwarden community forums" + }, + "contactSupport": { + "message": "Contact Bitwarden support" + }, + "sync": { + "message": "संकालन" + }, + "syncVaultNow": { + "message": "Sync vault now" + }, + "lastSync": { + "message": "Last sync:" + }, + "passGen": { + "message": "पासवर्ड जनित्र" + }, + "generator": { + "message": "जनित्र", + "description": "Short for 'Password Generator'." + }, + "passGenInfo": { + "message": "Automatically generate strong, unique passwords for your logins." + }, + "bitWebVault": { + "message": "Bitwarden web vault" + }, + "importItems": { + "message": "वस्तू आयात करा" + }, + "select": { + "message": "Select" + }, + "generatePassword": { + "message": "Generate password" + }, + "regeneratePassword": { + "message": "पासवर्ड पुनर्जनित करा" + }, + "options": { + "message": "पर्याय" + }, + "length": { + "message": "लांबी" + }, + "uppercase": { + "message": "Uppercase (A-Z)" + }, + "lowercase": { + "message": "Lowercase (a-z)" + }, + "numbers": { + "message": "Numbers (0-9)" + }, + "specialCharacters": { + "message": "Special characters (!@#$%^&*)" + }, + "numWords": { + "message": "Number of words" + }, + "wordSeparator": { + "message": "Word separator" + }, + "capitalize": { + "message": "Capitalize", + "description": "Make the first letter of a work uppercase." + }, + "includeNumber": { + "message": "Include number" + }, + "minNumbers": { + "message": "Minimum numbers" + }, + "minSpecial": { + "message": "Minimum special" + }, + "avoidAmbChar": { + "message": "Avoid ambiguous characters" + }, + "searchVault": { + "message": "Search vault" + }, + "edit": { + "message": "Edit" + }, + "view": { + "message": "View" + }, + "noItemsInList": { + "message": "There are no items to list." + }, + "itemInformation": { + "message": "Item information" + }, + "username": { + "message": "Username" + }, + "password": { + "message": "Password" + }, + "passphrase": { + "message": "वाक्यांश" + }, + "favorite": { + "message": "आवडते" + }, + "notes": { + "message": "टिप" + }, + "note": { + "message": "Note" + }, + "editItem": { + "message": "वस्तू संपादित करा" + }, + "folder": { + "message": "फोल्डर" + }, + "deleteItem": { + "message": "वस्तू खोडून टाका" + }, + "viewItem": { + "message": "वस्तू बघा" + }, + "launch": { + "message": "उघडा" + }, + "website": { + "message": "संकेतस्थळ" + }, + "toggleVisibility": { + "message": "दृश्यात उलटवा" + }, + "manage": { + "message": "व्यवस्थापन" + }, + "other": { + "message": "इतर" + }, + "rateExtension": { + "message": "विस्तारकाचे मूल्यांकन करा" + }, + "rateExtensionDesc": { + "message": "चांगला अभिप्राय देऊन आम्हाला मदत करा!" + }, + "browserNotSupportClipboard": { + "message": "Your web browser does not support easy clipboard copying. Copy it manually instead." + }, + "verifyIdentity": { + "message": "ओळख सत्यापित करा" + }, + "yourVaultIsLocked": { + "message": "तुमची तिजोरीला कुलूप लावले आहे. पुढे जाण्यासाठी तुमची ओळख सत्यापित करा." + }, + "unlock": { + "message": "कुलूप उघडा" + }, + "loggedInAsOn": { + "message": "Logged in as $EMAIL$ on $HOSTNAME$.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "hostname": { + "content": "$2", + "example": "bitwarden.com" + } + } + }, + "invalidMasterPassword": { + "message": "अवैध मुख्य पासवर्ड" + }, + "vaultTimeout": { + "message": "Vault timeout" + }, + "lockNow": { + "message": "Lock now" + }, + "immediately": { + "message": "Immediately" + }, + "tenSeconds": { + "message": "10 seconds" + }, + "twentySeconds": { + "message": "20 seconds" + }, + "thirtySeconds": { + "message": "30 seconds" + }, + "oneMinute": { + "message": "1 minute" + }, + "twoMinutes": { + "message": "2 minutes" + }, + "fiveMinutes": { + "message": "5 minutes" + }, + "fifteenMinutes": { + "message": "15 minutes" + }, + "thirtyMinutes": { + "message": "30 minutes" + }, + "oneHour": { + "message": "1 hour" + }, + "fourHours": { + "message": "4 hours" + }, + "onLocked": { + "message": "On system lock" + }, + "onRestart": { + "message": "On browser restart" + }, + "never": { + "message": "Never" + }, + "security": { + "message": "Security" + }, + "errorOccurred": { + "message": "An error has occurred" + }, + "emailRequired": { + "message": "Email address is required." + }, + "invalidEmail": { + "message": "Invalid email address." + }, + "masterPasswordRequired": { + "message": "Master password is required." + }, + "confirmMasterPasswordRequired": { + "message": "Master password retype is required." + }, + "masterPasswordMinlength": { + "message": "Master password must be at least $VALUE$ characters long.", + "description": "The Master Password must be at least a specific number of characters long.", + "placeholders": { + "value": { + "content": "$1", + "example": "8" + } + } + }, + "masterPassDoesntMatch": { + "message": "Master password confirmation does not match." + }, + "newAccountCreated": { + "message": "Your new account has been created! You may now log in." + }, + "masterPassSent": { + "message": "We've sent you an email with your master password hint." + }, + "verificationCodeRequired": { + "message": "Verification code is required." + }, + "invalidVerificationCode": { + "message": "Invalid verification code" + }, + "valueCopied": { + "message": "$VALUE$ copied", + "description": "Value has been copied to the clipboard.", + "placeholders": { + "value": { + "content": "$1", + "example": "Password" + } + } + }, + "autofillError": { + "message": "Unable to auto-fill the selected item on this page. Copy and paste the information instead." + }, + "loggedOut": { + "message": "Logged out" + }, + "loginExpired": { + "message": "Your login session has expired." + }, + "logOutConfirmation": { + "message": "Are you sure you want to log out?" + }, + "yes": { + "message": "Yes" + }, + "no": { + "message": "No" + }, + "unexpectedError": { + "message": "An unexpected error has occurred." + }, + "nameRequired": { + "message": "Name is required." + }, + "addedFolder": { + "message": "Folder added" + }, + "changeMasterPass": { + "message": "Change master password" + }, + "changeMasterPasswordConfirmation": { + "message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "twoStepLoginConfirmation": { + "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "editedFolder": { + "message": "Folder saved" + }, + "deleteFolderConfirmation": { + "message": "Are you sure you want to delete this folder?" + }, + "deletedFolder": { + "message": "Folder deleted" + }, + "gettingStartedTutorial": { + "message": "Getting started tutorial" + }, + "gettingStartedTutorialVideo": { + "message": "Watch our getting started tutorial to learn how to get the most out of the browser extension." + }, + "syncingComplete": { + "message": "Syncing complete" + }, + "syncingFailed": { + "message": "Syncing failed" + }, + "passwordCopied": { + "message": "Password copied" + }, + "uri": { + "message": "URI" + }, + "uriPosition": { + "message": "URI $POSITION$", + "description": "A listing of URIs. Ex: URI 1, URI 2, URI 3, etc.", + "placeholders": { + "position": { + "content": "$1", + "example": "2" + } + } + }, + "newUri": { + "message": "New URI" + }, + "addedItem": { + "message": "Item added" + }, + "editedItem": { + "message": "Item saved" + }, + "deleteItemConfirmation": { + "message": "Do you really want to send to the trash?" + }, + "deletedItem": { + "message": "Item sent to trash" + }, + "overwritePassword": { + "message": "Overwrite password" + }, + "overwritePasswordConfirmation": { + "message": "Are you sure you want to overwrite the current password?" + }, + "overwriteUsername": { + "message": "Overwrite username" + }, + "overwriteUsernameConfirmation": { + "message": "Are you sure you want to overwrite the current username?" + }, + "searchFolder": { + "message": "Search folder" + }, + "searchCollection": { + "message": "Search collection" + }, + "searchType": { + "message": "Search type" + }, + "noneFolder": { + "message": "No folder", + "description": "This is the folder for uncategorized items" + }, + "enableAddLoginNotification": { + "message": "Ask to add login" + }, + "addLoginNotificationDesc": { + "message": "Ask to add an item if one isn't found in your vault." + }, + "showCardsCurrentTab": { + "message": "Show cards on Tab page" + }, + "showCardsCurrentTabDesc": { + "message": "List card items on the Tab page for easy auto-fill." + }, + "showIdentitiesCurrentTab": { + "message": "Show identities on Tab page" + }, + "showIdentitiesCurrentTabDesc": { + "message": "List identity items on the Tab page for easy auto-fill." + }, + "clearClipboard": { + "message": "Clear clipboard", + "description": "Clipboard is the operating system thing where you copy/paste data to on your device." + }, + "clearClipboardDesc": { + "message": "Automatically clear copied values from your clipboard.", + "description": "Clipboard is the operating system thing where you copy/paste data to on your device." + }, + "notificationAddDesc": { + "message": "Should Bitwarden remember this password for you?" + }, + "notificationAddSave": { + "message": "Save" + }, + "enableChangedPasswordNotification": { + "message": "Ask to update existing login" + }, + "changedPasswordNotificationDesc": { + "message": "Ask to update a login's password when a change is detected on a website." + }, + "notificationChangeDesc": { + "message": "Do you want to update this password in Bitwarden?" + }, + "notificationChangeSave": { + "message": "Update" + }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, + "enableContextMenuItem": { + "message": "Show context menu options" + }, + "contextMenuItemDesc": { + "message": "Use a secondary click to access password generation and matching logins for the website. " + }, + "defaultUriMatchDetection": { + "message": "Default URI match detection", + "description": "Default URI match detection for auto-fill." + }, + "defaultUriMatchDetectionDesc": { + "message": "Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill." + }, + "theme": { + "message": "Theme" + }, + "themeDesc": { + "message": "Change the application's color theme." + }, + "dark": { + "message": "Dark", + "description": "Dark color" + }, + "light": { + "message": "Light", + "description": "Light color" + }, + "solarizedDark": { + "message": "Solarized dark", + "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." + }, + "exportVault": { + "message": "Export vault" + }, + "fileFormat": { + "message": "File format" + }, + "warning": { + "message": "WARNING", + "description": "WARNING (should stay in capitalized letters if the language permits)" + }, + "confirmVaultExport": { + "message": "Confirm vault export" + }, + "exportWarningDesc": { + "message": "This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it." + }, + "encExportKeyWarningDesc": { + "message": "This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file." + }, + "encExportAccountWarningDesc": { + "message": "Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account." + }, + "exportMasterPassword": { + "message": "Enter your master password to export your vault data." + }, + "shared": { + "message": "Shared" + }, + "learnOrg": { + "message": "Learn about organizations" + }, + "learnOrgConfirmation": { + "message": "Bitwarden allows you to share your vault items with others by using an organization. Would you like to visit the bitwarden.com website to learn more?" + }, + "moveToOrganization": { + "message": "Move to organization" + }, + "share": { + "message": "Share" + }, + "movedItemToOrg": { + "message": "$ITEMNAME$ moved to $ORGNAME$", + "placeholders": { + "itemname": { + "content": "$1", + "example": "Secret Item" + }, + "orgname": { + "content": "$2", + "example": "Company Name" + } + } + }, + "moveToOrgDesc": { + "message": "Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved." + }, + "learnMore": { + "message": "Learn more" + }, + "authenticatorKeyTotp": { + "message": "Authenticator key (TOTP)" + }, + "verificationCodeTotp": { + "message": "Verification code (TOTP)" + }, + "copyVerificationCode": { + "message": "Copy verification code" + }, + "attachments": { + "message": "Attachments" + }, + "deleteAttachment": { + "message": "Delete attachment" + }, + "deleteAttachmentConfirmation": { + "message": "Are you sure you want to delete this attachment?" + }, + "deletedAttachment": { + "message": "Attachment deleted" + }, + "newAttachment": { + "message": "Add new attachment" + }, + "noAttachments": { + "message": "No attachments." + }, + "attachmentSaved": { + "message": "Attachment saved" + }, + "file": { + "message": "File" + }, + "selectFile": { + "message": "Select a file" + }, + "maxFileSize": { + "message": "Maximum file size is 500 MB." + }, + "featureUnavailable": { + "message": "Feature unavailable" + }, + "updateKey": { + "message": "You cannot use this feature until you update your encryption key." + }, + "premiumMembership": { + "message": "Premium membership" + }, + "premiumManage": { + "message": "Manage membership" + }, + "premiumManageAlert": { + "message": "You can manage your membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumRefresh": { + "message": "Refresh membership" + }, + "premiumNotCurrentMember": { + "message": "You are not currently a Premium member." + }, + "premiumSignUpAndGet": { + "message": "Sign up for a Premium membership and get:" + }, + "ppremiumSignUpStorage": { + "message": "1 GB encrypted storage for file attachments." + }, + "ppremiumSignUpTwoStep": { + "message": "Additional two-step login options such as YubiKey, FIDO U2F, and Duo." + }, + "ppremiumSignUpReports": { + "message": "Password hygiene, account health, and data breach reports to keep your vault safe." + }, + "ppremiumSignUpTotp": { + "message": "TOTP verification code (2FA) generator for logins in your vault." + }, + "ppremiumSignUpSupport": { + "message": "Priority customer support." + }, + "ppremiumSignUpFuture": { + "message": "All future Premium features. More coming soon!" + }, + "premiumPurchase": { + "message": "Purchase Premium" + }, + "premiumPurchaseAlert": { + "message": "You can purchase Premium membership on the bitwarden.com web vault. Do you want to visit the website now?" + }, + "premiumCurrentMember": { + "message": "You are a Premium member!" + }, + "premiumCurrentMemberThanks": { + "message": "Thank you for supporting Bitwarden." + }, + "premiumPrice": { + "message": "All for just $PRICE$ /year!", + "placeholders": { + "price": { + "content": "$1", + "example": "$10" + } + } + }, + "refreshComplete": { + "message": "Refresh complete" + }, + "enableAutoTotpCopy": { + "message": "Copy TOTP automatically" + }, + "disableAutoTotpCopyDesc": { + "message": "If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login." + }, + "enableAutoBiometricsPrompt": { + "message": "Ask for biometrics on launch" + }, + "premiumRequired": { + "message": "Premium required" + }, + "premiumRequiredDesc": { + "message": "A Premium membership is required to use this feature." + }, + "enterVerificationCodeApp": { + "message": "Enter the 6 digit verification code from your authenticator app." + }, + "enterVerificationCodeEmail": { + "message": "Enter the 6 digit verification code that was emailed to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "verificationCodeEmailSent": { + "message": "Verification email sent to $EMAIL$.", + "placeholders": { + "email": { + "content": "$1", + "example": "example@gmail.com" + } + } + }, + "rememberMe": { + "message": "Remember me" + }, + "sendVerificationCodeEmailAgain": { + "message": "Send verification code email again" + }, + "useAnotherTwoStepMethod": { + "message": "Use another two-step login method" + }, + "insertYubiKey": { + "message": "Insert your YubiKey into your computer's USB port, then touch its button." + }, + "insertU2f": { + "message": "Insert your security key into your computer's USB port. If it has a button, touch it." + }, + "webAuthnNewTab": { + "message": "To start the WebAuthn 2FA verification. Click the button below to open a new tab and follow the instructions provided in the new tab." + }, + "webAuthnNewTabOpen": { + "message": "Open new tab" + }, + "webAuthnAuthenticate": { + "message": "Authenticate WebAuthn" + }, + "loginUnavailable": { + "message": "Login unavailable" + }, + "noTwoStepProviders": { + "message": "This account has two-step login set up, however, none of the configured two-step providers are supported by this web browser." + }, + "noTwoStepProviders2": { + "message": "Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported across web browsers (such as an authenticator app)." + }, + "twoStepOptions": { + "message": "Two-step login options" + }, + "recoveryCodeDesc": { + "message": "Lost access to all of your two-factor providers? Use your recovery code to turn off all two-factor providers from your account." + }, + "recoveryCodeTitle": { + "message": "Recovery code" + }, + "authenticatorAppTitle": { + "message": "Authenticator app" + }, + "authenticatorAppDesc": { + "message": "Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.", + "description": "'Authy' and 'Google Authenticator' are product names and should not be translated." + }, + "yubiKeyTitle": { + "message": "YubiKey OTP Security Key" + }, + "yubiKeyDesc": { + "message": "Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices." + }, + "duoDesc": { + "message": "Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "duoOrganizationDesc": { + "message": "Verify with Duo Security for your organization using the Duo Mobile app, SMS, phone call, or U2F security key.", + "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." + }, + "webAuthnTitle": { + "message": "FIDO2 WebAuthn" + }, + "webAuthnDesc": { + "message": "Use any WebAuthn compatible security key to access your account." + }, + "emailTitle": { + "message": "Email" + }, + "emailDesc": { + "message": "Verification codes will be emailed to you." + }, + "selfHostedEnvironment": { + "message": "Self-hosted environment" + }, + "selfHostedEnvironmentFooter": { + "message": "Specify the base URL of your on-premises hosted Bitwarden installation." + }, + "customEnvironment": { + "message": "Custom environment" + }, + "customEnvironmentFooter": { + "message": "For advanced users. You can specify the base URL of each service independently." + }, + "baseUrl": { + "message": "Server URL" + }, + "apiUrl": { + "message": "API server URL" + }, + "webVaultUrl": { + "message": "Web vault server URL" + }, + "identityUrl": { + "message": "Identity server URL" + }, + "notificationsUrl": { + "message": "Notifications server URL" + }, + "iconsUrl": { + "message": "Icons server URL" + }, + "environmentSaved": { + "message": "Environment URLs saved" + }, + "enableAutoFillOnPageLoad": { + "message": "Auto-fill on page load" + }, + "enableAutoFillOnPageLoadDesc": { + "message": "If a login form is detected, auto-fill when the web page loads." + }, + "experimentalFeature": { + "message": "Compromised or untrusted websites can exploit auto-fill on page load." + }, + "learnMoreAboutAutofill": { + "message": "Learn more about auto-fill" + }, + "defaultAutoFillOnPageLoad": { + "message": "Default autofill setting for login items" + }, + "defaultAutoFillOnPageLoadDesc": { + "message": "You can turn off auto-fill on page load for individual login items from the item's Edit view." + }, + "itemAutoFillOnPageLoad": { + "message": "Auto-fill on page load (if set up in Options)" + }, + "autoFillOnPageLoadUseDefault": { + "message": "Use default setting" + }, + "autoFillOnPageLoadYes": { + "message": "Auto-fill on page load" + }, + "autoFillOnPageLoadNo": { + "message": "Do not auto-fill on page load" + }, + "commandOpenPopup": { + "message": "Open vault popup" + }, + "commandOpenSidebar": { + "message": "Open vault in sidebar" + }, + "commandAutofillDesc": { + "message": "Auto-fill the last used login for the current website" + }, + "commandGeneratePasswordDesc": { + "message": "Generate and copy a new random password to the clipboard" + }, + "commandLockVaultDesc": { + "message": "Lock the vault" + }, + "privateModeWarning": { + "message": "Private mode support is experimental and some features are limited." + }, + "customFields": { + "message": "Custom fields" + }, + "copyValue": { + "message": "Copy value" + }, + "value": { + "message": "Value" + }, + "newCustomField": { + "message": "New custom field" + }, + "dragToSort": { + "message": "Drag to sort" + }, + "cfTypeText": { + "message": "Text" + }, + "cfTypeHidden": { + "message": "Hidden" + }, + "cfTypeBoolean": { + "message": "Boolean" + }, + "cfTypeLinked": { + "message": "Linked", + "description": "This describes a field that is 'linked' (tied) to another field." + }, + "linkedValue": { + "message": "Linked value", + "description": "This describes a value that is 'linked' (tied) to another value." + }, + "popup2faCloseMessage": { + "message": "Clicking outside the popup window to check your email for your verification code will cause this popup to close. Do you want to open this popup in a new window so that it does not close?" + }, + "popupU2fCloseMessage": { + "message": "This browser cannot process U2F requests in this popup window. Do you want to open this popup in a new window so that you can log in using U2F?" + }, + "enableFavicon": { + "message": "Show website icons" + }, + "faviconDesc": { + "message": "Show a recognizable image next to each login." + }, + "enableBadgeCounter": { + "message": "Show badge counter" + }, + "badgeCounterDesc": { + "message": "Indicate how many logins you have for the current web page." + }, + "cardholderName": { + "message": "Cardholder name" + }, + "number": { + "message": "Number" + }, + "brand": { + "message": "Brand" + }, + "expirationMonth": { + "message": "Expiration month" + }, + "expirationYear": { + "message": "Expiration year" + }, + "expiration": { + "message": "Expiration" + }, + "january": { + "message": "January" + }, + "february": { + "message": "February" + }, + "march": { + "message": "March" + }, + "april": { + "message": "April" + }, + "may": { + "message": "May" + }, + "june": { + "message": "June" + }, + "july": { + "message": "July" + }, + "august": { + "message": "August" + }, + "september": { + "message": "September" + }, + "october": { + "message": "October" + }, + "november": { + "message": "November" + }, + "december": { + "message": "December" + }, + "securityCode": { + "message": "Security code" + }, + "ex": { + "message": "ex." + }, + "title": { + "message": "Title" + }, + "mr": { + "message": "Mr" + }, + "mrs": { + "message": "Mrs" + }, + "ms": { + "message": "Ms" + }, + "dr": { + "message": "Dr" + }, + "mx": { + "message": "Mx" + }, + "firstName": { + "message": "First name" + }, + "middleName": { + "message": "Middle name" + }, + "lastName": { + "message": "Last name" + }, + "fullName": { + "message": "Full name" + }, + "identityName": { + "message": "Identity name" + }, + "company": { + "message": "Company" + }, + "ssn": { + "message": "Social Security number" + }, + "passportNumber": { + "message": "Passport number" + }, + "licenseNumber": { + "message": "License number" + }, + "email": { + "message": "Email" + }, + "phone": { + "message": "Phone" + }, + "address": { + "message": "Address" + }, + "address1": { + "message": "Address 1" + }, + "address2": { + "message": "Address 2" + }, + "address3": { + "message": "Address 3" + }, + "cityTown": { + "message": "City / Town" + }, + "stateProvince": { + "message": "State / Province" + }, + "zipPostalCode": { + "message": "Zip / Postal code" + }, + "country": { + "message": "Country" + }, + "type": { + "message": "Type" + }, + "typeLogin": { + "message": "Login" + }, + "typeLogins": { + "message": "Logins" + }, + "typeSecureNote": { + "message": "Secure note" + }, + "typeCard": { + "message": "Card" + }, + "typeIdentity": { + "message": "Identity" + }, + "passwordHistory": { + "message": "Password history" + }, + "back": { + "message": "Back" + }, + "collections": { + "message": "Collections" + }, + "favorites": { + "message": "Favorites" + }, + "popOutNewWindow": { + "message": "Pop out to a new window" + }, + "refresh": { + "message": "Refresh" + }, + "cards": { + "message": "Cards" + }, + "identities": { + "message": "Identities" + }, + "logins": { + "message": "Logins" + }, + "secureNotes": { + "message": "Secure notes" + }, + "clear": { + "message": "Clear", + "description": "To clear something out. example: To clear browser history." + }, + "checkPassword": { + "message": "Check if password has been exposed." + }, + "passwordExposed": { + "message": "This password has been exposed $VALUE$ time(s) in data breaches. You should change it.", + "placeholders": { + "value": { + "content": "$1", + "example": "2" + } + } + }, + "passwordSafe": { + "message": "This password was not found in any known data breaches. It should be safe to use." + }, + "baseDomain": { + "message": "Base domain", + "description": "Domain name. Ex. website.com" + }, + "domainName": { + "message": "Domain name", + "description": "Domain name. Ex. website.com" + }, + "host": { + "message": "Host", + "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." + }, + "exact": { + "message": "Exact" + }, + "startsWith": { + "message": "Starts with" + }, + "regEx": { + "message": "Regular expression", + "description": "A programming term, also known as 'RegEx'." + }, + "matchDetection": { + "message": "Match detection", + "description": "URI match detection for auto-fill." + }, + "defaultMatchDetection": { + "message": "Default match detection", + "description": "Default URI match detection for auto-fill." + }, + "toggleOptions": { + "message": "Toggle options" + }, + "toggleCurrentUris": { + "message": "Toggle current URIs", + "description": "Toggle the display of the URIs of the currently open tabs in the browser." + }, + "currentUri": { + "message": "Current URI", + "description": "The URI of one of the current open tabs in the browser." + }, + "organization": { + "message": "Organization", + "description": "An entity of multiple related people (ex. a team or business organization)." + }, + "types": { + "message": "Types" + }, + "allItems": { + "message": "All items" + }, + "noPasswordsInList": { + "message": "There are no passwords to list." + }, + "remove": { + "message": "Remove" + }, + "default": { + "message": "Default" + }, + "dateUpdated": { + "message": "Updated", + "description": "ex. Date this item was updated" + }, + "dateCreated": { + "message": "Created", + "description": "ex. Date this item was created" + }, + "datePasswordUpdated": { + "message": "Password updated", + "description": "ex. Date this password was updated" + }, + "neverLockWarning": { + "message": "Are you sure you want to use the \"Never\" option? Setting your lock options to \"Never\" stores your vault's encryption key on your device. If you use this option you should ensure that you keep your device properly protected." + }, + "noOrganizationsList": { + "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + }, + "noCollectionsInList": { + "message": "There are no collections to list." + }, + "ownership": { + "message": "Ownership" + }, + "whoOwnsThisItem": { + "message": "Who owns this item?" + }, + "strong": { + "message": "Strong", + "description": "ex. A strong password. Scale: Weak -> Good -> Strong" + }, + "good": { + "message": "Good", + "description": "ex. A good password. Scale: Weak -> Good -> Strong" + }, + "weak": { + "message": "Weak", + "description": "ex. A weak password. Scale: Weak -> Good -> Strong" + }, + "weakMasterPassword": { + "message": "Weak master password" + }, + "weakMasterPasswordDesc": { + "message": "The master password you have chosen is weak. You should use a strong master password (or a passphrase) to properly protect your Bitwarden account. Are you sure you want to use this master password?" + }, + "pin": { + "message": "PIN", + "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." + }, + "unlockWithPin": { + "message": "Unlock with PIN" + }, + "setYourPinCode": { + "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." + }, + "pinRequired": { + "message": "PIN code is required." + }, + "invalidPin": { + "message": "Invalid PIN code." + }, + "unlockWithBiometrics": { + "message": "Unlock with biometrics" + }, + "awaitDesktop": { + "message": "Awaiting confirmation from desktop" + }, + "awaitDesktopDesc": { + "message": "Please confirm using biometrics in the Bitwarden desktop application to set up biometrics for browser." + }, + "lockWithMasterPassOnRestart": { + "message": "Lock with master password on browser restart" + }, + "selectOneCollection": { + "message": "You must select at least one collection." + }, + "cloneItem": { + "message": "Clone item" + }, + "clone": { + "message": "Clone" + }, + "passwordGeneratorPolicyInEffect": { + "message": "One or more organization policies are affecting your generator settings." + }, + "vaultTimeoutAction": { + "message": "Vault timeout action" + }, + "lock": { + "message": "Lock", + "description": "Verb form: to make secure or inaccesible by" + }, + "trash": { + "message": "Trash", + "description": "Noun: a special folder to hold deleted items" + }, + "searchTrash": { + "message": "Search trash" + }, + "permanentlyDeleteItem": { + "message": "Permanently delete item" + }, + "permanentlyDeleteItemConfirmation": { + "message": "Are you sure you want to permanently delete this item?" + }, + "permanentlyDeletedItem": { + "message": "Item permanently deleted" + }, + "restoreItem": { + "message": "Restore item" + }, + "restoreItemConfirmation": { + "message": "Are you sure you want to restore this item?" + }, + "restoredItem": { + "message": "Item restored" + }, + "vaultTimeoutLogOutConfirmation": { + "message": "Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?" + }, + "vaultTimeoutLogOutConfirmationTitle": { + "message": "Timeout action confirmation" + }, + "autoFillAndSave": { + "message": "Auto-fill and save" + }, + "autoFillSuccessAndSavedUri": { + "message": "Item auto-filled and URI saved" + }, + "autoFillSuccess": { + "message": "Item auto-filled " + }, + "insecurePageWarning": { + "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + }, + "insecurePageWarningFillPrompt": { + "message": "Do you still wish to fill this login?" + }, + "autofillIframeWarning": { + "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + }, + "autofillIframeWarningTip": { + "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "placeholders": { + "hostname": { + "content": "$1", + "example": "www.example.com" + } + } + }, + "setMasterPassword": { + "message": "Set master password" + }, + "currentMasterPass": { + "message": "Current master password" + }, + "newMasterPass": { + "message": "New master password" + }, + "confirmNewMasterPass": { + "message": "Confirm new master password" + }, + "masterPasswordPolicyInEffect": { + "message": "One or more organization policies require your master password to meet the following requirements:" + }, + "policyInEffectMinComplexity": { + "message": "Minimum complexity score of $SCORE$", + "placeholders": { + "score": { + "content": "$1", + "example": "4" + } + } + }, + "policyInEffectMinLength": { + "message": "Minimum length of $LENGTH$", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "policyInEffectUppercase": { + "message": "Contain one or more uppercase characters" + }, + "policyInEffectLowercase": { + "message": "Contain one or more lowercase characters" + }, + "policyInEffectNumbers": { + "message": "Contain one or more numbers" + }, + "policyInEffectSpecial": { + "message": "Contain one or more of the following special characters $CHARS$", + "placeholders": { + "chars": { + "content": "$1", + "example": "!@#$%^&*" + } + } + }, + "masterPasswordPolicyRequirementsNotMet": { + "message": "Your new master password does not meet the policy requirements." + }, + "acceptPolicies": { + "message": "By checking this box you agree to the following:" + }, + "acceptPoliciesRequired": { + "message": "Terms of Service and Privacy Policy have not been acknowledged." + }, + "termsOfService": { + "message": "Terms of Service" + }, + "privacyPolicy": { + "message": "Privacy Policy" + }, + "hintEqualsPassword": { + "message": "Your password hint cannot be the same as your password." + }, + "ok": { + "message": "Ok" + }, + "desktopSyncVerificationTitle": { + "message": "Desktop sync verification" + }, + "desktopIntegrationVerificationText": { + "message": "Please verify that the desktop application shows this fingerprint: " + }, + "desktopIntegrationDisabledTitle": { + "message": "Browser integration is not set up" + }, + "desktopIntegrationDisabledDesc": { + "message": "Browser integration is not set up in the Bitwarden desktop application. Please set it up in the settings within the desktop application." + }, + "startDesktopTitle": { + "message": "Start the Bitwarden desktop application" + }, + "startDesktopDesc": { + "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + }, + "errorEnableBiometricTitle": { + "message": "Unable to set up biometrics" + }, + "errorEnableBiometricDesc": { + "message": "Action was canceled by the desktop application" + }, + "nativeMessagingInvalidEncryptionDesc": { + "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + }, + "nativeMessagingInvalidEncryptionTitle": { + "message": "Desktop communication interrupted" + }, + "nativeMessagingWrongUserDesc": { + "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + }, + "nativeMessagingWrongUserTitle": { + "message": "Account missmatch" + }, + "biometricsNotEnabledTitle": { + "message": "Biometrics not set up" + }, + "biometricsNotEnabledDesc": { + "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + }, + "biometricsNotSupportedTitle": { + "message": "Biometrics not supported" + }, + "biometricsNotSupportedDesc": { + "message": "Browser biometrics is not supported on this device." + }, + "nativeMessaginPermissionErrorTitle": { + "message": "Permission not provided" + }, + "nativeMessaginPermissionErrorDesc": { + "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + }, + "nativeMessaginPermissionSidebarTitle": { + "message": "Permission request error" + }, + "nativeMessaginPermissionSidebarDesc": { + "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + }, + "personalOwnershipSubmitError": { + "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available collections." + }, + "personalOwnershipPolicyInEffect": { + "message": "An organization policy is affecting your ownership options." + }, + "excludedDomains": { + "message": "Excluded domains" + }, + "excludedDomainsDesc": { + "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + }, + "excludedDomainsInvalidDomain": { + "message": "$DOMAIN$ is not a valid domain", + "placeholders": { + "domain": { + "content": "$1", + "example": "googlecom" + } + } + }, + "send": { + "message": "Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "searchSends": { + "message": "Search Sends", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "addSend": { + "message": "Add Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeText": { + "message": "Text" + }, + "sendTypeFile": { + "message": "File" + }, + "allSends": { + "message": "All Sends", + "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", + "description": "This text will be displayed after a Send has been accessed the maximum amount of times." + }, + "expired": { + "message": "Expired" + }, + "pendingDeletion": { + "message": "Pending deletion" + }, + "passwordProtected": { + "message": "Password protected" + }, + "copySendLink": { + "message": "Copy Send link", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "removePassword": { + "message": "Remove Password" + }, + "delete": { + "message": "Delete" + }, + "removedPassword": { + "message": "Password removed" + }, + "deletedSend": { + "message": "Send deleted", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendLink": { + "message": "Send link", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "disabled": { + "message": "Disabled" + }, + "removePasswordConfirmation": { + "message": "Are you sure you want to remove the password?" + }, + "deleteSend": { + "message": "Delete Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "deleteSendConfirmation": { + "message": "Are you sure you want to delete this Send?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "editSend": { + "message": "Edit Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTypeHeader": { + "message": "What type of Send is this?", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNameDesc": { + "message": "A friendly name to describe this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendFileDesc": { + "message": "The file you want to send." + }, + "deletionDate": { + "message": "Deletion date" + }, + "deletionDateDesc": { + "message": "The Send will be permanently deleted on the specified date and time.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "expirationDate": { + "message": "Expiration date" + }, + "expirationDateDesc": { + "message": "If set, access to this Send will expire on the specified date and time.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "oneDay": { + "message": "1 day" + }, + "days": { + "message": "$DAYS$ days", + "placeholders": { + "days": { + "content": "$1", + "example": "2" + } + } + }, + "custom": { + "message": "Custom" + }, + "maximumAccessCount": { + "message": "Maximum Access Count" + }, + "maximumAccessCountDesc": { + "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendPasswordDesc": { + "message": "Optionally require a password for users to access this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendNotesDesc": { + "message": "Private notes about this Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDisableDesc": { + "message": "Deactivate this Send so that no one can access it.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendShareDesc": { + "message": "Copy this Send's link to clipboard upon save.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendTextDesc": { + "message": "The text you want to send." + }, + "sendHideText": { + "message": "Hide this Send's text by default.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "currentAccessCount": { + "message": "Current access count" + }, + "createSend": { + "message": "New Send", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "newPassword": { + "message": "New password" + }, + "sendDisabled": { + "message": "Send removed", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendDisabledWarning": { + "message": "Due to an enterprise policy, you are only able to delete an existing Send.", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "createdSend": { + "message": "Send created", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "editedSend": { + "message": "Send saved", + "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + }, + "sendLinuxChromiumFileWarning": { + "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." + }, + "sendFirefoxFileWarning": { + "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner." + }, + "sendSafariFileWarning": { + "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + }, + "sendFileCalloutHeader": { + "message": "Before you start" + }, + "sendFirefoxCustomDatePopoutMessage1": { + "message": "To use a calendar style date picker", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read '**To use a calendar style date picker ** click here to pop out your window.'" + }, + "sendFirefoxCustomDatePopoutMessage2": { + "message": "click here", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker **click here** to pop out your window.'" + }, + "sendFirefoxCustomDatePopoutMessage3": { + "message": "to pop out your window.", + "description": "This will be used as part of a larger sentence, broken up to include links. The full sentence will read 'To use a calendar style date picker click here **to pop out your window.**'" + }, + "expirationDateIsInvalid": { + "message": "The expiration date provided is not valid." + }, + "deletionDateIsInvalid": { + "message": "The deletion date provided is not valid." + }, + "expirationDateAndTimeRequired": { + "message": "An expiration date and time are required." + }, + "deletionDateAndTimeRequired": { + "message": "A deletion date and time are required." + }, + "dateParsingError": { + "message": "There was an error saving your deletion and expiration dates." + }, + "hideEmail": { + "message": "Hide my email address from recipients." + }, + "sendOptionsPolicyInEffect": { + "message": "One or more organization policies are affecting your Send options." + }, + "passwordPrompt": { + "message": "Master password re-prompt" + }, + "passwordConfirmation": { + "message": "Master password confirmation" + }, + "passwordConfirmationDesc": { + "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + }, + "emailVerificationRequired": { + "message": "Email verification required" + }, + "emailVerificationRequiredDesc": { + "message": "You must verify your email to use this feature. You can verify your email in the web vault." + }, + "updatedMasterPassword": { + "message": "Updated master password" + }, + "updateMasterPassword": { + "message": "Update master password" + }, + "updateMasterPasswordWarning": { + "message": "Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update it now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + }, + "updateWeakMasterPasswordWarning": { + "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + }, + "resetPasswordPolicyAutoEnroll": { + "message": "Automatic enrollment" + }, + "resetPasswordAutoEnrollInviteWarning": { + "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + }, + "selectFolder": { + "message": "Select folder..." + }, + "ssoCompleteRegistration": { + "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + }, + "hours": { + "message": "Hours" + }, + "minutes": { + "message": "Minutes" + }, + "vaultTimeoutPolicyInEffect": { + "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyWithActionInEffect": { + "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + }, + "action": { + "content": "$3", + "example": "Lock" + } + } + }, + "vaultTimeoutActionPolicyInEffect": { + "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "placeholders": { + "action": { + "content": "$1", + "example": "Lock" + } + } + }, + "vaultTimeoutTooLarge": { + "message": "Your vault timeout exceeds the restrictions set by your organization." + }, + "vaultExportDisabled": { + "message": "Vault export unavailable" + }, + "personalVaultExportPolicyInEffect": { + "message": "One or more organization policies prevents you from exporting your individual vault." + }, + "copyCustomFieldNameInvalidElement": { + "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + }, + "copyCustomFieldNameNotUnique": { + "message": "No unique identifier found." + }, + "convertOrganizationEncryptionDesc": { + "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "placeholders": { + "organization": { + "content": "$1", + "example": "My Org Name" + } + } + }, + "leaveOrganization": { + "message": "Leave organization" + }, + "removeMasterPassword": { + "message": "Remove master password" + }, + "removedMasterPassword": { + "message": "Master password removed" + }, + "leaveOrganizationConfirmation": { + "message": "Are you sure you want to leave this organization?" + }, + "leftOrganization": { + "message": "You have left the organization." + }, + "toggleCharacterCount": { + "message": "Toggle character count" + }, + "sessionTimeout": { + "message": "Your session has timed out. Please go back and try logging in again." + }, + "exportingPersonalVaultTitle": { + "message": "Exporting individual vault" + }, + "exportingPersonalVaultDescription": { + "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included.", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "error": { + "message": "Error" + }, + "regenerateUsername": { + "message": "Regenerate username" + }, + "generateUsername": { + "message": "Generate username" + }, + "usernameType": { + "message": "Username type" + }, + "plusAddressedEmail": { + "message": "Plus addressed email", + "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" + }, + "plusAddressedEmailDesc": { + "message": "Use your email provider's sub-addressing capabilities." + }, + "catchallEmail": { + "message": "Catch-all email" + }, + "catchallEmailDesc": { + "message": "Use your domain's configured catch-all inbox." + }, + "random": { + "message": "Random" + }, + "randomWord": { + "message": "Random word" + }, + "websiteName": { + "message": "Website name" + }, + "whatWouldYouLikeToGenerate": { + "message": "What would you like to generate?" + }, + "passwordType": { + "message": "Password type" + }, + "service": { + "message": "Service" + }, + "forwardedEmail": { + "message": "Forwarded email alias" + }, + "forwardedEmailDesc": { + "message": "Generate an email alias with an external forwarding service." + }, + "hostname": { + "message": "Hostname", + "description": "Part of a URL." + }, + "apiAccessToken": { + "message": "API Access Token" + }, + "apiKey": { + "message": "API Key" + }, + "ssoKeyConnectorError": { + "message": "Key connector error: make sure key connector is available and working correctly." + }, + "premiumSubcriptionRequired": { + "message": "Premium subscription required" + }, + "organizationIsDisabled": { + "message": "Organization suspended." + }, + "disabledOrganizationFilterError": { + "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + }, + "loggingInTo": { + "message": "Logging in to $DOMAIN$", + "placeholders": { + "domain": { + "content": "$1", + "example": "example.com" + } + } + }, + "settingsEdited": { + "message": "Settings have been edited" + }, + "environmentEditedClick": { + "message": "Click here" + }, + "environmentEditedReset": { + "message": "to reset to pre-configured settings" + }, + "serverVersion": { + "message": "Server version" + }, + "selfHosted": { + "message": "Self-hosted" + }, + "thirdParty": { + "message": "Third-party" + }, + "thirdPartyServerMessage": { + "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "placeholders": { + "servername": { + "content": "$1", + "example": "ThirdPartyServerName" + } + } + }, + "lastSeenOn": { + "message": "last seen on: $DATE$", + "placeholders": { + "date": { + "content": "$1", + "example": "Jun 15, 2015" + } + } + }, + "loginWithMasterPassword": { + "message": "Log in with master password" + }, + "loggingInAs": { + "message": "Logging in as" + }, + "notYou": { + "message": "Not you?" + }, + "newAroundHere": { + "message": "New around here?" + }, + "rememberEmail": { + "message": "Remember email" + }, + "loginWithDevice": { + "message": "Log in with device" + }, + "loginWithDeviceEnabledInfo": { + "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + }, + "fingerprintPhraseHeader": { + "message": "Fingerprint phrase" + }, + "fingerprintMatchInfo": { + "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + }, + "resendNotification": { + "message": "Resend notification" + }, + "viewAllLoginOptions": { + "message": "View all log in options" + }, + "notificationSentDevice": { + "message": "A notification has been sent to your device." + }, + "logInInitiated": { + "message": "Log in initiated" + }, + "exposedMasterPassword": { + "message": "Exposed Master Password" + }, + "exposedMasterPasswordDesc": { + "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + }, + "weakAndExposedMasterPassword": { + "message": "Weak and Exposed Master Password" + }, + "weakAndBreachedMasterPasswordDesc": { + "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + }, + "checkForBreaches": { + "message": "Check known data breaches for this password" + }, + "important": { + "message": "Important:" + }, + "masterPasswordHint": { + "message": "Your master password cannot be recovered if you forget it!" + }, + "characterMinimum": { + "message": "$LENGTH$ character minimum", + "placeholders": { + "length": { + "content": "$1", + "example": "14" + } + } + }, + "autofillPageLoadPolicyActivated": { + "message": "Your organization policies have turned on auto-fill on page load." + }, + "howToAutofill": { + "message": "How to auto-fill" + }, + "autofillSelectInfoWithCommand": { + "message": "Select an item from this page or use the shortcut: $COMMAND$", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillSelectInfoWithoutCommand": { + "message": "Select an item from this page or set a shortcut in settings." + }, + "gotIt": { + "message": "Got it" + }, + "autofillSettings": { + "message": "Auto-fill settings" + }, + "autofillShortcut": { + "message": "Auto-fill keyboard shortcut" + }, + "autofillShortcutNotSet": { + "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + }, + "autofillShortcutText": { + "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "autofillShortcutTextSafari": { + "message": "Default auto-fill shortcut: $COMMAND$.", + "placeholders": { + "command": { + "content": "$1", + "example": "CTRL+Shift+L" + } + } + }, + "loggingInOn": { + "message": "Logging in on" + }, + "opensInANewWindow": { + "message": "Opens in a new window" + }, + "usDomain": { + "message": "bitwarden.com" + }, + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" + } +} diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 69d26333a84..63dd227e52b 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 8ede2fb9389..0e4904dcd15 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ja, oppdater nå" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Vis alternativer for kontekstmeny" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 69d26333a84..63dd227e52b 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index 68a6ba26b1f..7ff5ec8b36b 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ja, nu bijwerken" }, + "notificationUnlockDesc": { + "message": "Ontgrendel je Bitwarden-kluis om het auto-invulverzoek te voltooien." + }, + "notificationUnlock": { + "message": "Ontgrendelen" + }, "enableContextMenuItem": { "message": "Contextmenu-opties weergeven" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Regio" + "loggingInOn": { + "message": "Inloggen op" }, "opensInANewWindow": { "message": "Opent in een nieuw venster" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Toegang geweigerd. Je hebt geen toestemming om deze pagina te bekijken." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 69d26333a84..63dd227e52b 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 69d26333a84..63dd227e52b 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index de2c505ced3..f010699118b 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Zaktualizuj" }, + "notificationUnlockDesc": { + "message": "Odblokuj swój sejf Bitwarden, aby ukończyć żądanie autouzupełniania." + }, + "notificationUnlock": { + "message": "Odblokuj" + }, "enableContextMenuItem": { "message": "Pokaż opcje menu kontekstowego" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logowanie do" }, "opensInANewWindow": { "message": "Otwiera w nowym oknie" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Odmowa dostępu. Nie masz uprawnień do przeglądania tej strony." + }, + "general": { + "message": "Ogólne" + }, + "display": { + "message": "Wyświetl" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 87585d561d0..d0370af24e9 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -202,7 +202,7 @@ "message": "Explore os fóruns da comunidade" }, "contactSupport": { - "message": "Contact Bitwarden support" + "message": "Contate o suporte Bitwarden" }, "sync": { "message": "Sincronizar" @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Atualizar" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Mostrar opções de menu de contexto" }, @@ -1489,7 +1495,7 @@ "message": "New master password" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "Confirme a nova senha mestre" }, "masterPasswordPolicyInEffect": { "message": "Uma ou mais políticas da organização exigem que a sua senha mestra cumpra aos seguintes requisitos:" @@ -2189,7 +2195,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Selecione um item desta página ou defina um atalho nas configurações." }, "gotIt": { "message": "Entendi" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "Abrir em uma nova janela" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Acesso negado. Você não tem permissão para ver esta página." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 06474f83c48..5254144a08b 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "extName": { - "message": "Bitwarden - gestor de palavras-passe", + "message": "Bitwarden - Gestor de Palavras-passe", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { @@ -101,7 +101,7 @@ "message": "Sem credenciais correspondentes" }, "unlockVaultMenu": { - "message": "Desbloqueie o seu cofre" + "message": "Desbloquear o cofre" }, "loginToVaultMenu": { "message": "Inicie sessão para abrir o seu cofre" @@ -153,7 +153,7 @@ "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": "Frase da impressão digital da sua conta", + "message": "Frase de impressão digital da sua conta", "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": { @@ -224,7 +224,7 @@ "message": "Gera automaticamente palavras-passe fortes e únicas para as suas credenciais." }, "bitWebVault": { - "message": "Cofre web Bitwarden" + "message": "Cofre Web Bitwarden" }, "importItems": { "message": "Importar itens" @@ -345,7 +345,7 @@ "message": "Por favor, considere ajudar-nos com uma boa avaliação!" }, "browserNotSupportClipboard": { - "message": "O seu navegador web não suporta a cópia fácil da área de transferência. Em vez disso, copie manualmente." + "message": "O seu navegador Web não suporta a cópia fácil da área de transferência. Em vez disso, copie manualmente." }, "verifyIdentity": { "message": "Verificar identidade" @@ -373,7 +373,7 @@ "message": "Palavra-passe mestra inválida" }, "vaultTimeout": { - "message": "Expiração do cofre" + "message": "Tempo limite do cofre" }, "lockNow": { "message": "Bloquear agora" @@ -439,7 +439,7 @@ "message": "É necessário reescrever a palavra-passe mestra." }, "masterPasswordMinlength": { - "message": "Master password must be at least $VALUE$ characters long.", + "message": "A palavra-passe mestra deve ter pelo menos $VALUE$ caracteres.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -464,7 +464,7 @@ "message": "Código de verificação inválido" }, "valueCopied": { - "message": "$VALUE$ copiado(a)", + "message": "$VALUE$ copiado", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -587,22 +587,22 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Ask to add login" + "message": "Pedir para adicionar credencial" }, "addLoginNotificationDesc": { "message": "Pedir para adicionar um item se não o encontrar no seu cofre." }, "showCardsCurrentTab": { - "message": "Show cards on Tab page" + "message": "Mostrar cartões na página Separador" }, "showCardsCurrentTabDesc": { - "message": "List card items on the Tab page for easy auto-fill." + "message": "Listar itens de cartões na página Separador para facilitar o preenchimento automático." }, "showIdentitiesCurrentTab": { - "message": "Show identities on Tab page" + "message": "Mostrar identidades na página Separador" }, "showIdentitiesCurrentTabDesc": { - "message": "List identity items on the Tab page for easy auto-fill." + "message": "Listar itens de identidades na página Separador para facilitar o preenchimento automático." }, "clearClipboard": { "message": "Limpar área de transferência", @@ -619,10 +619,10 @@ "message": "Guardar" }, "enableChangedPasswordNotification": { - "message": "Ask to update existing login" + "message": "Pedir para atualizar credencial existente" }, "changedPasswordNotificationDesc": { - "message": "Ask to update a login's password when a change is detected on a website." + "message": "Pedir para atualizar a palavra-passe de uma credencial quando for detetada uma alteração num site." }, "notificationChangeDesc": { "message": "Pretende atualizar esta palavra-passe no Bitwarden?" @@ -630,11 +630,17 @@ "notificationChangeSave": { "message": "Atualizar" }, + "notificationUnlockDesc": { + "message": "Desbloqueie o seu cofre Bitwarden para completar o pedido de preenchimento automático." + }, + "notificationUnlock": { + "message": "Desbloquear" + }, "enableContextMenuItem": { - "message": "Show context menu options" + "message": "Mostrar opções do menu de contexto" }, "contextMenuItemDesc": { - "message": "Use a secondary click to access password generation and matching logins for the website. " + "message": "Utilize um clique secundário para aceder à geração de palavras-passe e às credenciais correspondentes do site. " }, "defaultUriMatchDetection": { "message": "Deteção de correspondência de URI predefinida", @@ -658,7 +664,7 @@ "description": "Light color" }, "solarizedDark": { - "message": "Solarized Dark", + "message": "Solarized (escuro)", "description": "'Solarized' is a noun and the name of a color scheme. It should not be translated." }, "exportVault": { @@ -678,7 +684,7 @@ "message": "Esta exportação contém os dados do seu cofre num formato não encriptado. Não deve armazenar ou enviar o ficheiro exportado através de canais não seguros (como o e-mail). Elimine-o imediatamente após terminar a sua utilização." }, "encExportKeyWarningDesc": { - "message": "Esta exportação encripta os seus dados utilizando a chave de encriptação da sua conta. Se alguma vez mudar a chave de encriptação da sua conta, deve exportar novamente, uma vez que não conseguirá desencriptar este ficheiro de exportação." + "message": "Esta exportação encripta os seus dados utilizando a chave de encriptação da sua conta. Se alguma vez regenerar a chave de encriptação da sua conta, deve exportar novamente, uma vez que não conseguirá desencriptar este ficheiro de exportação." }, "encExportAccountWarningDesc": { "message": "As chaves de encriptação da conta são únicas para cada conta de utilizador Bitwarden, pelo que não é possível importar uma exportação encriptada para uma conta diferente." @@ -772,7 +778,7 @@ "message": "Gerir subscrição" }, "premiumManageAlert": { - "message": "Pode gerir a sua subscrição no cofre web bitwarden.com. Pretende visitar o site agora?" + "message": "Pode gerir a sua subscrição no cofre Web bitwarden.com. Pretende visitar o site agora?" }, "premiumRefresh": { "message": "Atualizar subscrição" @@ -805,7 +811,7 @@ "message": "Adquirir Premium" }, "premiumPurchaseAlert": { - "message": "Pode adquirir uma subscrição Premium no cofre web bitwarden.com. Pretende visitar o site agora?" + "message": "Pode adquirir uma subscrição Premium no cofre Web bitwarden.com. Pretende visitar o site agora?" }, "premiumCurrentMember": { "message": "É um membro Premium!" @@ -826,13 +832,13 @@ "message": "Atualização concluída" }, "enableAutoTotpCopy": { - "message": "Copy TOTP automatically" + "message": "Copiar TOTP automaticamente" }, "disableAutoTotpCopyDesc": { "message": "Se uma credencial tiver uma chave de autenticação, copie o código de verificação TOTP para a sua área de transferência quando preencher automaticamente o início de sessão." }, "enableAutoBiometricsPrompt": { - "message": "Ask for biometrics on launch" + "message": "Pedir biometria ao iniciar" }, "premiumRequired": { "message": "É necessária uma subscrição Premium" @@ -862,7 +868,7 @@ } }, "rememberMe": { - "message": "Memorizar-me" + "message": "Memorizar" }, "sendVerificationCodeEmailAgain": { "message": "Enviar e-mail com o código de verificação novamente" @@ -889,10 +895,10 @@ "message": "Início de sessão indisponível" }, "noTwoStepProviders": { - "message": "Esta conta tem a verificação de dois passos configurada, no entanto, nenhum dos fornecedores da verificação de dois passos configurada é suportado por este navegador web." + "message": "Esta conta tem a verificação de dois passos configurada, no entanto, nenhum dos fornecedores da verificação de dois passos configurada é suportado por este navegador Web." }, "noTwoStepProviders2": { - "message": "Por favor, utilize um navegador web suportado (como o Chrome) e/ou adicione fornecedores adicionais que sejam mais bem suportados nos navegadores web (como uma aplicação de autenticação)." + "message": "Por favor, utilize um navegador Web suportado (como o Chrome) e/ou adicione fornecedores adicionais que sejam mais bem suportados nos navegadores web (como uma aplicação de autenticação)." }, "twoStepOptions": { "message": "Opções de verificação de dois passos" @@ -955,7 +961,7 @@ "message": "URL do servidor da API" }, "webVaultUrl": { - "message": "URL do servidor do cofre web" + "message": "URL do servidor do cofre Web" }, "identityUrl": { "message": "URL do servidor de identidade" @@ -973,13 +979,13 @@ "message": "Preencher automaticamente ao carregar a página" }, "enableAutoFillOnPageLoadDesc": { - "message": "Se for detetado um formulário de início de sessão, o preenchimento automático é efetuado quando a página web é carregada." + "message": "Se for detetado um formulário de início de sessão, o preenchimento automático é efetuado quando a página Web é carregada." }, "experimentalFeature": { - "message": "Compromised or untrusted websites can exploit auto-fill on page load." + "message": "Os sites comprometidos ou não confiáveis podem explorar o preenchimento automático ao carregar a página." }, "learnMoreAboutAutofill": { - "message": "Learn more about auto-fill" + "message": "Saber mais sobre o preenchimento automático" }, "defaultAutoFillOnPageLoad": { "message": "Definição de preenchimento automático predefinido para itens de início de sessão" @@ -1056,16 +1062,16 @@ "message": "Este navegador não pode processar pedidos U2F nesta janela pop-up. Pretende abrir este pop-up numa nova janela para poder iniciar sessão utilizando o U2F?" }, "enableFavicon": { - "message": "Show website icons" + "message": "Mostrar ícones do site" }, "faviconDesc": { - "message": "Show a recognizable image next to each login." + "message": "Mostrar uma imagem reconhecível junto a cada credencial." }, "enableBadgeCounter": { - "message": "Show badge counter" + "message": "Mostrar distintivo de contador" }, "badgeCounterDesc": { - "message": "Indicate how many logins you have for the current web page." + "message": "Indica quantas credenciais tem para a página Web atual." }, "cardholderName": { "message": "Titular do cartão" @@ -1134,16 +1140,16 @@ "message": "Sr." }, "mrs": { - "message": "Sra." + "message": "Sr.ª" }, "ms": { - "message": "Sra." + "message": "Menina" }, "dr": { "message": "Dr." }, "mx": { - "message": "Mx" + "message": "Neutro" }, "firstName": { "message": "Nome próprio" @@ -1278,7 +1284,7 @@ "description": "Domain name. Ex. website.com" }, "host": { - "message": "Servidor", + "message": "Domínio", "description": "A URL's host value. For example, the host of https://sub.domain.com:443 is 'sub.domain.com:443'." }, "exact": { @@ -1338,7 +1344,7 @@ "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Palavra-passe atualizada", + "message": "Palavra-passe atualizada a", "description": "ex. Date this password was updated" }, "neverLockWarning": { @@ -1415,7 +1421,7 @@ "message": "Uma ou mais políticas da organização estão a afetar as suas definições do gerador." }, "vaultTimeoutAction": { - "message": "Ação de expiração do cofre" + "message": "Ação de tempo limite do cofre" }, "lock": { "message": "Bloquear", @@ -1450,7 +1456,7 @@ "message": "Ao terminar sessão removerá todo o acesso ao seu cofre e requer autenticação online após o período de tempo limite. Tem a certeza de que pretende utilizar esta definição?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Confirmação de expiração do cofre" + "message": "Confirmação da ação de tempo limite" }, "autoFillAndSave": { "message": "Preencher automaticamente e guardar" @@ -1462,16 +1468,16 @@ "message": "Item preenchido automaticamente " }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "Aviso: Esta é uma página HTTP não segura, e qualquer informação que submeta pode ser vista e alterada por outros. Esta credencial foi originalmente guardada numa página segura (HTTPS)." }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "Ainda deseja preencher este início de sessão?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "O formulário está alojado num domínio diferente do URI da sua credencial guardada. Selecione OK para preencher automaticamente na mesma ou Cancelar para parar." }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "Para evitar este aviso no futuro, guarde este URI, $HOSTNAME$, no seu item de início de sessão do Bitwarden deste site.", "placeholders": { "hostname": { "content": "$1", @@ -1483,10 +1489,10 @@ "message": "Definir palavra-passe mestra" }, "currentMasterPass": { - "message": "Current master password" + "message": "Palavra-passe mestra atual" }, "newMasterPass": { - "message": "New master password" + "message": "Nova palavra-passe mestra" }, "confirmNewMasterPass": { "message": "Confirmar a nova palavra-passe mestra" @@ -1567,61 +1573,61 @@ "message": "Iniciar a aplicação para computador Bitwarden" }, "startDesktopDesc": { - "message": "The Bitwarden desktop application needs to be started before unlock with biometrics can be used." + "message": "A aplicação para computador do Bitwarden tem de ser iniciada antes de se poder utilizar o desbloqueio com biometria." }, "errorEnableBiometricTitle": { - "message": "Unable to set up biometrics" + "message": "Não é possível configurar a biometria" }, "errorEnableBiometricDesc": { - "message": "Action was canceled by the desktop application" + "message": "A ação foi cancelada pela aplicação para computador" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Desktop application invalidated the secure communication channel. Please retry this operation" + "message": "A aplicação para computador invalidou o canal de comunicação seguro. Por favor, tente novamente esta operação" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Desktop communication interrupted" + "message": "Interrupção da comunicação com o computador" }, "nativeMessagingWrongUserDesc": { - "message": "The desktop application is logged into a different account. Please ensure both applications are logged into the same account." + "message": "A aplicação para computador tem a sessão iniciada numa conta diferente. Por favor, certifique-se de que ambas as aplicações têm a sessão iniciada na mesma conta." }, "nativeMessagingWrongUserTitle": { - "message": "Account missmatch" + "message": "Incompatibilidade de contas" }, "biometricsNotEnabledTitle": { - "message": "Biometrics not set up" + "message": "Biometria não configurada" }, "biometricsNotEnabledDesc": { - "message": "Browser biometrics requires desktop biometric to be set up in the settings first." + "message": "A biometria do navegador requer que a biometria do computador seja primeiro configurada nas definições." }, "biometricsNotSupportedTitle": { - "message": "Biometrics not supported" + "message": "Biometria não suportada" }, "biometricsNotSupportedDesc": { - "message": "Browser biometrics is not supported on this device." + "message": "A biometria do navegador não é suportada neste dispositivo." }, "nativeMessaginPermissionErrorTitle": { - "message": "Permission not provided" + "message": "Autorização não concedida" }, "nativeMessaginPermissionErrorDesc": { - "message": "Without permission to communicate with the Bitwarden Desktop Application we cannot provide biometrics in the browser extension. Please try again." + "message": "Sem autorização para comunicar com a aplicação para computador do Bitwarden, não podemos fornecer dados biométricos na extensão do navegador. Por favor, tente novamente." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Permission request error" + "message": "Erro no pedido de autorização" }, "nativeMessaginPermissionSidebarDesc": { - "message": "This action cannot be done in the sidebar, please retry the action in the popup or popout." + "message": "Esta ação não pode ser realizada na barra lateral. Por favor, repita a ação no pop-up ou no popout." }, "personalOwnershipSubmitError": { - "message": "Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available collections." + "message": "Devido a uma política empresarial, está impedido de guardar itens no seu cofre pessoal. Altere a opção Propriedade para uma organização e escolha entre as coleções disponíveis." }, "personalOwnershipPolicyInEffect": { - "message": "An organization policy is affecting your ownership options." + "message": "Uma política da organização está a afetar as suas opções de propriedade." }, "excludedDomains": { - "message": "Excluded domains" + "message": "Domínios excluídos" }, "excludedDomainsDesc": { - "message": "Bitwarden will not ask to save login details for these domains. You must refresh the page for changes to take effect." + "message": "O Bitwarden não pedirá para guardar os detalhes de início de sessão destes domínios. É necessário atualizar a página para que as alterações tenham efeito." }, "excludedDomainsInvalidDomain": { "message": "$DOMAIN$ não é um domínio válido", @@ -1732,10 +1738,10 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "oneDay": { - "message": "1 day" + "message": "1 dia" }, "days": { - "message": "$DAYS$ days", + "message": "$DAYS$ dias", "placeholders": { "days": { "content": "$1", @@ -1747,55 +1753,55 @@ "message": "Personalizado" }, "maximumAccessCount": { - "message": "Maximum Access Count" + "message": "Número máximo de acessos" }, "maximumAccessCountDesc": { - "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", + "message": "Se definido, os utilizadores deixarão de poder aceder a este Send quando a contagem máxima de acessos for atingida.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendPasswordDesc": { - "message": "Optionally require a password for users to access this Send.", + "message": "Opcionalmente, exigir uma palavra-passe para os utilizadores acederem a este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendNotesDesc": { - "message": "Private notes about this Send.", + "message": "Notas privadas sobre este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Deactivate this Send so that no one can access it.", + "message": "Desative este Send para que ninguém possa aceder ao mesmo.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Copy this Send's link to clipboard upon save.", + "message": "Copiar o link deste Send para a área de transferência ao guardar.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { - "message": "The text you want to send." + "message": "O texto que deseja enviar." }, "sendHideText": { - "message": "Hide this Send's text by default.", + "message": "Ocultar o texto deste Send por defeito.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { - "message": "Current access count" + "message": "Número de acessos atual" }, "createSend": { - "message": "New Send", + "message": "Novo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { "message": "Nova palavra-passe" }, "sendDisabled": { - "message": "Send removed", + "message": "Send removido", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Due to an enterprise policy, you are only able to delete an existing Send.", + "message": "Devido a uma política da empresa, só é possível eliminar um Send existente.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Send created", + "message": "Send criado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -1803,13 +1809,13 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { - "message": "In order to choose a file, open the extension in the sidebar (if possible) or pop out to a new window by clicking this banner." + "message": "Para escolher um ficheiro, abra a extensão na barra lateral (se possível) ou abra uma nova janela clicando neste banner." }, "sendFirefoxFileWarning": { - "message": "In order to choose a file using Firefox, open the extension in the sidebar or pop out to a new window by clicking this banner." + "message": "Para escolher um ficheiro utilizando o Firefox, abra a extensão na barra lateral ou abra uma nova janela clicando neste banner." }, "sendSafariFileWarning": { - "message": "In order to choose a file using Safari, pop out to a new window by clicking this banner." + "message": "Para escolher um ficheiro utilizando o Safari, abra uma nova janela clicando neste banner." }, "sendFileCalloutHeader": { "message": "Antes de começar" @@ -1848,19 +1854,19 @@ "message": "Uma ou mais políticas da organização estão a afetar as suas opções do Send." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "Pedir novamente a palavra-passe mestra" }, "passwordConfirmation": { - "message": "Master password confirmation" + "message": "Confirmação da palavra-passe mestra" }, "passwordConfirmationDesc": { - "message": "This action is protected. To continue, please re-enter your master password to verify your identity." + "message": "Esta ação está protegida. Para continuar, por favor, reintroduza a sua palavra-passe mestra para verificar a sua identidade." }, "emailVerificationRequired": { - "message": "Email verification required" + "message": "Verificação de e-mail necessária" }, "emailVerificationRequiredDesc": { - "message": "You must verify your email to use this feature. You can verify your email in the web vault." + "message": "Tem de verificar o seu e-mail para utilizar esta funcionalidade. Pode verificar o seu e-mail no cofre Web." }, "updatedMasterPassword": { "message": "Palavra-passe mestra atualizada" @@ -1878,13 +1884,13 @@ "message": "Inscrição automática" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password." + "message": "Esta organização tem uma política empresarial que o inscreverá automaticamente na redefinição de palavra-passe. A inscrição permitirá que os administradores da organização alterem a sua palavra-passe mestra." }, "selectFolder": { "message": "Selecionar pasta..." }, "ssoCompleteRegistration": { - "message": "In order to complete logging in with SSO, please set a master password to access and protect your vault." + "message": "Para concluir o início de sessão com SSO, por favor, defina uma palavra-passe mestra para aceder e proteger o seu cofre." }, "hours": { "message": "Horas" @@ -1893,7 +1899,7 @@ "message": "Minutos" }, "vaultTimeoutPolicyInEffect": { - "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", + "message": "As políticas da sua organização definiram o tempo limite máximo permitido do cofre de $HOURS$ hora(s) e $MINUTES$ minuto(s).", "placeholders": { "hours": { "content": "$1", @@ -1906,7 +1912,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "As políticas da sua organização estão a afetar o tempo limite do cofre. O tempo limite máximo permitido do cofre é de $HOURS$ hora(s) e $MINUTES$ minuto(s). A sua ação de tempo limite do cofre está definida para $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -1923,7 +1929,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "As políticas da sua organização definiram a ação de tempo limite do cofre para $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -1932,22 +1938,22 @@ } }, "vaultTimeoutTooLarge": { - "message": "Your vault timeout exceeds the restrictions set by your organization." + "message": "O tempo limite do seu cofre excede as restrições definidas pela sua organização." }, "vaultExportDisabled": { - "message": "Vault export unavailable" + "message": "Exportação de cofre indisponível" }, "personalVaultExportPolicyInEffect": { "message": "Uma ou mais políticas da organização impedem-no de exportar o seu cofre pessoal." }, "copyCustomFieldNameInvalidElement": { - "message": "Unable to identify a valid form element. Try inspecting the HTML instead." + "message": "Não foi possível identificar um elemento de formulário válido. Em alternativa, tente inspecionar o HTML." }, "copyCustomFieldNameNotUnique": { - "message": "No unique identifier found." + "message": "Não foi encontrado um identificador único." }, "convertOrganizationEncryptionDesc": { - "message": "$ORGANIZATION$ is using SSO with a self-hosted key server. A master password is no longer required to log in for members of this organization.", + "message": "A $ORGANIZATION$ está a utilizar o SSO com um servidor de chaves auto-hospedado. Já não é necessária uma palavra-passe mestra para iniciar sessão para os membros desta organização.", "placeholders": { "organization": { "content": "$1", @@ -1971,7 +1977,7 @@ "message": "Saiu da organização." }, "toggleCharacterCount": { - "message": "Toggle character count" + "message": "Mostrar/ocultar contagem de caracteres" }, "sessionTimeout": { "message": "A sua sessão expirou. Por favor, volte atrás e tente iniciar sessão novamente." @@ -2001,17 +2007,17 @@ "message": "Tipo de nome de utilizador" }, "plusAddressedEmail": { - "message": "Plus addressed email", + "message": "E-mail com subendereço", "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Use your email provider's sub-addressing capabilities." + "message": "Utilize as capacidades de subendereçamento do seu fornecedor de e-mail." }, "catchallEmail": { - "message": "Catch-all email" + "message": "E-mail de captura geral" }, "catchallEmailDesc": { - "message": "Use your domain's configured catch-all inbox." + "message": "Utilize a caixa de entrada de captura geral configurada para o seu domínio." }, "random": { "message": "Aleatório" @@ -2032,13 +2038,13 @@ "message": "Serviço" }, "forwardedEmail": { - "message": "Forwarded email alias" + "message": "Alias de e-mail reencaminhado" }, "forwardedEmailDesc": { - "message": "Generate an email alias with an external forwarding service." + "message": "Gerar um alias de e-mail com um serviço de reencaminhamento externo." }, "hostname": { - "message": "Hostname", + "message": "Nome de domínio", "description": "Part of a URL." }, "apiAccessToken": { @@ -2048,16 +2054,16 @@ "message": "Chave da API" }, "ssoKeyConnectorError": { - "message": "Key connector error: make sure key connector is available and working correctly." + "message": "Erro no Key Connector: certifique-se de que o Key Connector está disponível e a funcionar corretamente." }, "premiumSubcriptionRequired": { "message": "É necessária uma subscrição Premium" }, "organizationIsDisabled": { - "message": "Organization suspended." + "message": "Organização suspensa." }, "disabledOrganizationFilterError": { - "message": "Items in suspended Organizations cannot be accessed. Contact your Organization owner for assistance." + "message": "Não é possível aceder aos itens de organizações suspensas. Contacte o proprietário da organização para obter assistência." }, "loggingInTo": { "message": "A iniciar sessão em $DOMAIN$", @@ -2078,16 +2084,16 @@ "message": "para voltar às definições predefinidas" }, "serverVersion": { - "message": "Server version" + "message": "Versão do servidor" }, "selfHosted": { - "message": "Self-hosted" + "message": "Auto-hospedado" }, "thirdParty": { - "message": "Third-party" + "message": "De terceiros" }, "thirdPartyServerMessage": { - "message": "Connected to third-party server implementation, $SERVERNAME$. Please verify bugs using the official server, or report them to the third-party server.", + "message": "Ligado à implementação de um servidor de terceiros, $SERVERNAME$. Por favor, verifique os erros utilizando o servidor oficial ou reporte-os ao servidor de terceiros.", "placeholders": { "servername": { "content": "$1", @@ -2096,7 +2102,7 @@ } }, "lastSeenOn": { - "message": "last seen on: $DATE$", + "message": "visto pela última vez em: $DATE$", "placeholders": { "date": { "content": "$1", @@ -2120,52 +2126,52 @@ "message": "Memorizar e-mail" }, "loginWithDevice": { - "message": "Log in with device" + "message": "Iniciar sessão com o dispositivo" }, "loginWithDeviceEnabledInfo": { - "message": "Log in with device must be set up in the settings of the Bitwarden app. Need another option?" + "message": "O início de sessão com o dispositivo deve ser ativado nas definições da aplicação Bitwarden. Necessita de outra opção?" }, "fingerprintPhraseHeader": { - "message": "Fingerprint phrase" + "message": "Frase de impressão digital" }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + "message": "Por favor, certifique-se de que o cofre está desbloqueado e que a frase de impressão digital corresponde à do outro dispositivo." }, "resendNotification": { - "message": "Resend notification" + "message": "Reenviar notificação" }, "viewAllLoginOptions": { - "message": "View all log in options" + "message": "Ver todas as opções de início de sessão" }, "notificationSentDevice": { - "message": "A notification has been sent to your device." + "message": "Foi enviada uma notificação para o seu dispositivo." }, "logInInitiated": { - "message": "Log in initiated" + "message": "A preparar o início de sessão" }, "exposedMasterPassword": { - "message": "Exposed Master Password" + "message": "Palavra-passe mestra exposta" }, "exposedMasterPasswordDesc": { - "message": "Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password?" + "message": "Palavra-passe encontrada numa violação de dados. Utilize uma palavra-passe única para proteger a sua conta. Tem a certeza de que pretende utilizar uma palavra-passe exposta?" }, "weakAndExposedMasterPassword": { - "message": "Weak and Exposed Master Password" + "message": "Palavra-passe mestra fraca e exposta" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password?" + "message": "Palavra-passe fraca identificada e encontrada numa violação de dados. Utilize uma palavra-passe forte e única para proteger a sua conta. Tem a certeza de que pretende utilizar esta palavra-passe?" }, "checkForBreaches": { - "message": "Check known data breaches for this password" + "message": "Verificar violações de dados conhecidas para esta palavra-passe" }, "important": { - "message": "Important:" + "message": "Importante:" }, "masterPasswordHint": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "A sua palavra-passe mestra não pode ser recuperada se a esquecer!" }, "characterMinimum": { - "message": "$LENGTH$ character minimum", + "message": "$LENGTH$ caracteres no mínimo", "placeholders": { "length": { "content": "$1", @@ -2174,13 +2180,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Your organization policies have turned on auto-fill on page load." + "message": "As políticas da sua organização ativaram o preenchimento automático ao carregar a página." }, "howToAutofill": { - "message": "How to auto-fill" + "message": "Como preencher automaticamente" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this page or use the shortcut: $COMMAND$", + "message": "Selecione um item desta página ou utilize o atalho: $COMMAND$", "placeholders": { "command": { "content": "$1", @@ -2189,22 +2195,22 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this page or set a shortcut in settings." + "message": "Selecione um item desta página ou defina um atalho nas definições." }, "gotIt": { - "message": "Got it" + "message": "Percebido" }, "autofillSettings": { - "message": "Auto-fill settings" + "message": "Definições de preenchimento automático" }, "autofillShortcut": { - "message": "Auto-fill keyboard shortcut" + "message": "Atalho de teclado de preenchimento automático" }, "autofillShortcutNotSet": { - "message": "The auto-fill shortcut is not set. Change this in the browser's settings." + "message": "O atalho de preenchimento automático não está definido. Altere-o nas definições do navegador." }, "autofillShortcutText": { - "message": "The auto-fill shortcut is: $COMMAND$. Change this in the browser's settings.", + "message": "O atalho de preenchimento automático é: $COMMAND$. Altere-o nas definições do navegador.", "placeholders": { "command": { "content": "$1", @@ -2213,7 +2219,7 @@ } }, "autofillShortcutTextSafari": { - "message": "Default auto-fill shortcut: $COMMAND$.", + "message": "Atalho de preenchimento automático predefinido: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Região" + "loggingInOn": { + "message": "A iniciar sessão em" }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "Abrir numa nova janela" }, - "eu": { - "message": "UE", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "EUA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Acesso negado. Não tem permissão para visualizar esta página." + }, + "general": { + "message": "Geral" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 47a684aa1ae..f4369278d64 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Actualizare" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Afișați opțiunile meniului contextual" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index 9da7f861dc8..f9c9b0141ab 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Обновить" }, + "notificationUnlockDesc": { + "message": "Разблокируйте свое хранилище Bitwarden для завершения запроса автозаполнения." + }, + "notificationUnlock": { + "message": "Разблокировать" + }, "enableContextMenuItem": { "message": "Показать опции контекстного меню" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Войти на" }, "opensInANewWindow": { "message": "Откроется в новом окне" }, - "eu": { - "message": "Европа", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "США", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Доступ запрещен. У вас нет разрешения на просмотр этой страницы." + }, + "general": { + "message": "Основное" + }, + "display": { + "message": "Отображение" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 94baba9b6da..0f209dd000b 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "යාවත්කාල" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index 2fa04daf3df..bccc8a74ce5 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Aktualizovať" }, + "notificationUnlockDesc": { + "message": "Odomknite svoj Bitwarden trezor a dokončite žiadosť o automatické vyplnenie." + }, + "notificationUnlock": { + "message": "Odomknúť" + }, "enableContextMenuItem": { "message": "Zobraziť možnosti kontextovej ponuky" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Región" + "loggingInOn": { + "message": "Prihlásenie na" }, "opensInANewWindow": { "message": "Otvárať v novom okne" }, - "eu": { - "message": "EÚ", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "USA", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Prístup zamietnutý. Nemáte oprávnenie na zobrazenie tejto stránky." + }, + "general": { + "message": "Všeobecné" + }, + "display": { + "message": "Zobrazenie" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 53c32c686c5..64f3415ae27 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -464,7 +464,7 @@ "message": "Neveljavna koda za preverjanje" }, "valueCopied": { - "message": "$VALUE$ kopirano", + "message": "$VALUE$ kopirana", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Da, posodobi zdaj" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Prikaži možnosti kontekstnega menuja" }, @@ -1042,11 +1048,11 @@ "message": "Logična vrednost" }, "cfTypeLinked": { - "message": "Linked", + "message": "Povezano polje", "description": "This describes a field that is 'linked' (tied) to another field." }, "linkedValue": { - "message": "Linked value", + "message": "Povezana vrednost", "description": "This describes a value that is 'linked' (tied) to another value." }, "popup2faCloseMessage": { @@ -1762,18 +1768,18 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisableDesc": { - "message": "Onemogoči to pošiljko, da nihče ne more dostopati do nje", + "message": "Onemogoči to pošiljko, da nihče ne more dostopati do nje.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendShareDesc": { - "message": "Kopiraj povezavo te pošiljke v odložišče po shranjevanju", + "message": "Kopiraj povezavo te pošiljke v odložišče, ko shranim.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTextDesc": { "message": "Besedilo, ki ga želite poslati" }, "sendHideText": { - "message": "Privzeto skrij besedilo te pošiljke", + "message": "Privzeto skrij besedilo te pošiljke.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "currentAccessCount": { @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Odpre se v novem oknu" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 952ae901451..38ba6e1a4b1 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Ажурирај" }, + "notificationUnlockDesc": { + "message": "Откључати Bitwarden сеф да би извршили ауто-пуњење." + }, + "notificationUnlock": { + "message": "Откључај" + }, "enableContextMenuItem": { "message": "Прикажи контекстни мени" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Регион" + "loggingInOn": { + "message": "Пријављено на" }, "opensInANewWindow": { "message": "Отвара се у новом прозору" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Одбијен приступ. Немате дозволу да видите ову страницу." + }, + "general": { + "message": "Опште" + }, + "display": { + "message": "Приказ" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 79afc8729d5..36ebb906412 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Uppdatera" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Visa alternativ för snabbmenyn" }, @@ -952,7 +958,7 @@ "message": "Server-URL" }, "apiUrl": { - "message": "API server-URL" + "message": "API-server-URL" }, "webVaultUrl": { "message": "Webbvalvsserver-URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logga in på" }, "opensInANewWindow": { "message": "Öppnas i ett nytt fönster" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 69d26333a84..63dd227e52b 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Update" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Show context menu options" }, @@ -952,7 +958,7 @@ "message": "Server URL" }, "apiUrl": { - "message": "API Server URL" + "message": "API server URL" }, "webVaultUrl": { "message": "Web vault server URL" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 1e43987ab06..667c26a1e12 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Yes, Update Now" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "แสดงตัวเลือกเมนูบริบท" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index cdc8e109fe4..23727c5af9a 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Güncelle" }, + "notificationUnlockDesc": { + "message": "Otomatik doldurma isteğini tamamlamak için Bitwarden kasanızın kilidini açın." + }, + "notificationUnlock": { + "message": "Kilidi aç" + }, "enableContextMenuItem": { "message": "Bağlam menüsü seçeneklerini göster" }, @@ -2042,7 +2048,7 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "API erişim anahtarı" + "message": "API erişim token'ı" }, "apiKey": { "message": "API anahtarı" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Bölge" + "loggingInOn": { + "message": "Giriş yapılan konum" }, "opensInANewWindow": { "message": "Yeni pencerede açılır" }, - "eu": { - "message": "AB", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "ABD", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Erişim engellendi. Bu sayfayı görüntüleme iznine sahip değilsiniz." + }, + "general": { + "message": "Genel" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 1969bc33624..45177b5bdea 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Оновити" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Показувати в контекстному меню" }, @@ -675,7 +681,7 @@ "message": "Підтвердити експорт сховища" }, "exportWarningDesc": { - "message": "Експортовані дані вашого сховища знаходяться в незашифрованому вигляді. Вам не слід зберігати чи надсилати їх через незахищені канали (наприклад, е-поштою). Після використання негайно видаліть їх." + "message": "Ваші експортовані дані сховища незашифровані. Не зберігайте і не надсилайте їх незахищеними каналами (як-от електронна пошта). Після використання негайно видаліть їх." }, "encExportKeyWarningDesc": { "message": "Цей експорт шифрує ваші дані за допомогою ключа шифрування облікового запису. Якщо ви коли-небудь оновите ключ шифрування облікового запису, необхідно виконати експорт знову, оскільки не зможете розшифрувати цей файл експорту." @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Регіон" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Відкривається у новому вікні" }, - "eu": { - "message": "ЄС", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "США", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Доступ заборонено. У вас немає дозволу на перегляд цієї сторінки." + }, + "general": { + "message": "Загальні" + }, + "display": { + "message": "Екран" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index fee4c66f3a9..0bb3aaefb85 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "Cập nhật" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "Hiển thị tuỳ chọn menu ngữ cảnh" }, @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { "message": "Opens in a new window" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "Access denied. You do not have permission to view this page." + }, + "general": { + "message": "General" + }, + "display": { + "message": "Display" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index 2275865d060..4f5d42ef1ad 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -263,7 +263,7 @@ "message": "单词分隔符" }, "capitalize": { - "message": "大写", + "message": "首字母大写", "description": "Make the first letter of a work uppercase." }, "includeNumber": { @@ -357,7 +357,7 @@ "message": "解锁" }, "loggedInAsOn": { - "message": "以 $EMAIL$ 在 $HOSTNAME$ 上登录。", + "message": "已在 $HOSTNAME$ 上以 $EMAIL$ 身份登录。", "placeholders": { "email": { "content": "$1", @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "更新" }, + "notificationUnlockDesc": { + "message": "解锁 Bitwarden 密码库以完成自动填充请求。" + }, + "notificationUnlock": { + "message": "解锁​​​​" + }, "enableContextMenuItem": { "message": "显示上下文菜单选项" }, @@ -946,7 +952,7 @@ "message": "自定义环境" }, "customEnvironmentFooter": { - "message": "适用于高级用户。你可以分别指定各个服务的基础 URL。" + "message": "适用于高级用户。您可以分别指定各个服务的基础 URL。" }, "baseUrl": { "message": "服务器 URL" @@ -2054,10 +2060,10 @@ "message": "需要高级版订阅" }, "organizationIsDisabled": { - "message": "组织已暂停。" + "message": "组织已停用。" }, "disabledOrganizationFilterError": { - "message": "无法访问已暂停组织中的项目。请联系您的组织所有者获取帮助。" + "message": "无法访问已停用组织中的项目。请联系您的组织所有者获取协助。" }, "loggingInTo": { "message": "正在登录到 $DOMAIN$", @@ -2123,7 +2129,7 @@ "message": "设备登录" }, "loginWithDeviceEnabledInfo": { - "message": "必须在 Bitwarden 应用程序的设置中启用设备登录。需要其他选项吗?" + "message": "设备登录必须在 Bitwarden 应用程序的设置中设启用。需要其他选项吗?" }, "fingerprintPhraseHeader": { "message": "指纹短语" @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "区域" + "loggingInOn": { + "message": "登录到" }, "opensInANewWindow": { "message": "在新窗口中打开" }, - "eu": { - "message": "欧盟", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "美国", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "访问被拒绝。您没有权限查看此页面。" + }, + "general": { + "message": "常规" + }, + "display": { + "message": "显示" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index 42e082f136b..c7350529d77 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -630,6 +630,12 @@ "notificationChangeSave": { "message": "更新" }, + "notificationUnlockDesc": { + "message": "Unlock your Bitwarden vault to complete the auto-fill request." + }, + "notificationUnlock": { + "message": "Unlock" + }, "enableContextMenuItem": { "message": "顯示內容選單選項" }, @@ -952,7 +958,7 @@ "message": "伺服器 URL" }, "apiUrl": { - "message": "API 伺服器 URL" + "message": "API 伺服器網址" }, "webVaultUrl": { "message": "網頁版密碼庫伺服器 URL" @@ -976,7 +982,7 @@ "message": "網頁載入時如果偵測到登入表單,則執行自動填入。" }, "experimentalFeature": { - "message": "被竊取或不可信任的網站可以利用自動填入功能在網頁載入時竊取資訊。" + "message": "被入侵或不可信任的網站可以利用自動填入功能在網頁載入時竊取資訊。" }, "learnMoreAboutAutofill": { "message": "進一步瞭解「自動填入」功能" @@ -1462,16 +1468,16 @@ "message": "項目已自動填入" }, "insecurePageWarning": { - "message": "Warning: This is an unsecured HTTP page, and any information you submit can potentially be seen and changed by others. This Login was originally saved on a secure (HTTPS) page." + "message": "警告:這是不安全的 HTTP 頁面,任何您送出的資訊均可能被其他人看見和更改。此登入資訊原先是在安全的 (HTTPS) 頁面儲存的。" }, "insecurePageWarningFillPrompt": { - "message": "Do you still wish to fill this login?" + "message": "您依然想要填充此登入資訊嗎?" }, "autofillIframeWarning": { - "message": "The form is hosted by a different domain than the URI of your saved login. Choose OK to auto-fill anyway, or Cancel to stop." + "message": "這個表單寄放在不同的網域,而非您儲存登入資訊的 URI。選擇「確認」則依然自動填入,「取消」則停止本動作。" }, "autofillIframeWarningTip": { - "message": "To prevent this warning in the future, save this URI, $HOSTNAME$, to your Bitwarden login item for this site.", + "message": "若以後不想再跳出這個警告,請儲存 URI「$HOSTNAME$」到您這個網站的 Bitwarden 登入項目。", "placeholders": { "hostname": { "content": "$1", @@ -1483,13 +1489,13 @@ "message": "設定主密碼" }, "currentMasterPass": { - "message": "Current master password" + "message": "目前的主密碼" }, "newMasterPass": { - "message": "New master password" + "message": "新的主密碼" }, "confirmNewMasterPass": { - "message": "Confirm new master password" + "message": "確認新主密碼" }, "masterPasswordPolicyInEffect": { "message": "一個或多個組織原則要求您的主密碼須符合下列條件:" @@ -1872,7 +1878,7 @@ "message": "您的主密碼最近被您的組織管理者變更過。若要存取密碼庫,您必須立即更新主密碼。繼續操作會登出目前的登入階段,並要求您重新登入。其他裝置上的活動登入階段最多會保持一個小時。" }, "updateWeakMasterPasswordWarning": { - "message": "Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." + "message": "您的主密碼不符合您的組織政策之一或多個要求。您必須立即更新您的主密碼以存取密碼庫。進行此操作將登出您目前的工作階段,需要您重新登入。其他裝置上的工作階段可能繼續長達一小時。" }, "resetPasswordPolicyAutoEnroll": { "message": "自動註冊" @@ -1906,7 +1912,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", + "message": "您的組織原則正在影響您的密碼庫逾時時間。密碼庫逾時時間最多可以設定到 $HOURS$ 小時 $MINUTES$ 分鐘。您密碼庫的逾時動作是設為 $ACTION$。", "placeholders": { "hours": { "content": "$1", @@ -1923,7 +1929,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "您的組織原則已將密碼庫逾時動作設為 $ACTION$。", "placeholders": { "action": { "content": "$1", @@ -2221,18 +2227,25 @@ } } }, - "region": { - "message": "Region" + "loggingInOn": { + "message": "Logging in on" }, "opensInANewWindow": { - "message": "Opens in a new window" + "message": "在新視窗開啟" }, - "eu": { - "message": "EU", - "description": "European Union" + "usDomain": { + "message": "bitwarden.com" }, - "us": { - "message": "US", - "description": "United States" + "euDomain": { + "message": "bitwarden.eu" + }, + "accessDenied": { + "message": "拒絕存取。您沒有檢視此頁面的權限。" + }, + "general": { + "message": "一般" + }, + "display": { + "message": "顯示" } } diff --git a/apps/browser/src/autofill/background/context-menus.background.ts b/apps/browser/src/autofill/background/context-menus.background.ts index 681f86cdf67..bc26353cbd9 100644 --- a/apps/browser/src/autofill/background/context-menus.background.ts +++ b/apps/browser/src/autofill/background/context-menus.background.ts @@ -30,6 +30,7 @@ export default class ContextMenusBackground { msg.data.commandToRetry.msg.data, msg.data.commandToRetry.sender.tab ); + await BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar"); } } ); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 1f733f252c8..1cb006fa3a2 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -5,12 +5,14 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { ThemeType } from "@bitwarden/common/enums"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service"; import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import AddUnlockVaultQueueMessage from "../../background/models/add-unlock-vault-queue-message"; import AddChangePasswordQueueMessage from "../../background/models/addChangePasswordQueueMessage"; import AddLoginQueueMessage from "../../background/models/addLoginQueueMessage"; import AddLoginRuntimeMessage from "../../background/models/addLoginRuntimeMessage"; @@ -22,7 +24,11 @@ import { BrowserStateService } from "../../platform/services/abstractions/browse import { AutofillService } from "../services/abstractions/autofill.service"; export default class NotificationBackground { - private notificationQueue: (AddLoginQueueMessage | AddChangePasswordQueueMessage)[] = []; + private notificationQueue: ( + | AddLoginQueueMessage + | AddChangePasswordQueueMessage + | AddUnlockVaultQueueMessage + )[] = []; constructor( private autofillService: AutofillService, @@ -30,7 +36,8 @@ export default class NotificationBackground { private authService: AuthService, private policyService: PolicyService, private folderService: FolderService, - private stateService: BrowserStateService + private stateService: BrowserStateService, + private environmentService: EnvironmentService ) {} async init() { @@ -51,10 +58,7 @@ export default class NotificationBackground { async processMessage(msg: any, sender: chrome.runtime.MessageSender) { switch (msg.command) { case "unlockCompleted": - if (msg.data.target !== "notification.background") { - return; - } - await this.processMessage(msg.data.commandToRetry.msg, msg.data.commandToRetry.sender); + await this.handleUnlockCompleted(msg.data, sender); break; case "bgGetDataForTab": await this.getDataForTab(sender.tab, msg.responseCommand); @@ -80,7 +84,9 @@ export default class NotificationBackground { if ((await this.authService.getAuthStatus()) < AuthenticationStatus.Unlocked) { const retryMessage: LockedVaultPendingNotificationsItem = { commandToRetry: { - msg: msg, + msg: { + command: msg, + }, sender: sender, }, target: "notification.background", @@ -112,6 +118,9 @@ export default class NotificationBackground { break; } break; + case "promptForLogin": + await this.unlockVault(sender.tab); + break; default: break; } @@ -167,11 +176,21 @@ export default class NotificationBackground { isVaultLocked: this.notificationQueue[i].wasVaultLocked, theme: await this.getCurrentTheme(), removeIndividualVault: await this.removeIndividualVault(), + webVaultURL: await this.environmentService.getWebVaultUrl(), }, }); } else if (this.notificationQueue[i].type === NotificationQueueMessageType.ChangePassword) { BrowserApi.tabSendMessageData(tab, "openNotificationBar", { type: "change", + typeData: { + isVaultLocked: this.notificationQueue[i].wasVaultLocked, + theme: await this.getCurrentTheme(), + webVaultURL: await this.environmentService.getWebVaultUrl(), + }, + }); + } else if (this.notificationQueue[i].type === NotificationQueueMessageType.UnlockVault) { + BrowserApi.tabSendMessageData(tab, "openNotificationBar", { + type: "unlock", typeData: { isVaultLocked: this.notificationQueue[i].wasVaultLocked, theme: await this.getCurrentTheme(), @@ -301,6 +320,20 @@ export default class NotificationBackground { } } + private async unlockVault(tab: chrome.tabs.Tab) { + const currentAuthStatus = await this.authService.getAuthStatus(); + if (currentAuthStatus !== AuthenticationStatus.Locked || this.notificationQueue.length) { + return; + } + + const loginDomain = Utils.getDomain(tab.url); + if (!loginDomain) { + return; + } + + this.pushUnlockVaultToQueue(loginDomain, tab); + } + private async pushChangePasswordToQueue( cipherId: string, loginDomain: string, @@ -323,6 +356,20 @@ export default class NotificationBackground { await this.checkNotificationQueue(tab); } + private async pushUnlockVaultToQueue(loginDomain: string, tab: chrome.tabs.Tab) { + this.removeTabFromNotificationQueue(tab); + const message: AddUnlockVaultQueueMessage = { + type: NotificationQueueMessageType.UnlockVault, + domain: loginDomain, + tabId: tab.id, + expires: new Date(new Date().getTime() + 0.5 * 60000), // 30 seconds + wasVaultLocked: true, + }; + this.notificationQueue.push(message); + await this.checkNotificationQueue(tab); + this.removeTabFromNotificationQueue(tab); + } + private async saveOrUpdateCredentials(tab: chrome.tabs.Tab, edit: boolean, folderId?: string) { for (let i = this.notificationQueue.length - 1; i >= 0; i--) { const queueMessage = this.notificationQueue[i]; @@ -459,4 +506,22 @@ export default class NotificationBackground { this.policyService.policyAppliesToActiveUser$(PolicyType.PersonalOwnership) ); } + + private async handleUnlockCompleted( + messageData: LockedVaultPendingNotificationsItem, + sender: chrome.runtime.MessageSender + ): Promise { + if (messageData.commandToRetry.msg.command === "autofill_login") { + await BrowserApi.tabSendMessageData(sender.tab, "closeNotificationBar"); + } + + if (messageData.target !== "notification.background") { + return; + } + + await this.processMessage( + messageData.commandToRetry.msg.command, + messageData.commandToRetry.sender + ); + } } diff --git a/apps/browser/src/autofill/background/tabs.background.ts b/apps/browser/src/autofill/background/tabs.background.ts index 0f724c84dd5..0655fd23b62 100644 --- a/apps/browser/src/autofill/background/tabs.background.ts +++ b/apps/browser/src/autofill/background/tabs.background.ts @@ -21,6 +21,8 @@ export default class TabsBackground { } this.focusedWindowId = windowId; + await this.main.refreshBadge(); + await this.main.refreshMenu(); this.main.messagingService.send("windowChanged"); }); diff --git a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts index 2eccc03c12b..d4f72e56633 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts @@ -81,6 +81,12 @@ export class CipherContextMenuHandler { ); } + static async windowsOnFocusChangedListener(windowId: number, serviceCache: CachedServices) { + const cipherContextMenuHandler = await CipherContextMenuHandler.create(serviceCache); + const tab = await BrowserApi.getTabFromCurrentWindow(); + await cipherContextMenuHandler.update(tab?.url); + } + static async tabsOnActivatedListener( activeInfo: chrome.tabs.TabActiveInfo, serviceCache: CachedServices diff --git a/apps/browser/src/autofill/commands/autofill-tab-command.ts b/apps/browser/src/autofill/commands/autofill-tab-command.ts index 4910a6cf6fa..b51edd929ee 100644 --- a/apps/browser/src/autofill/commands/autofill-tab-command.ts +++ b/apps/browser/src/autofill/commands/autofill-tab-command.ts @@ -46,6 +46,7 @@ export class AutofillTabCommand { onlyEmptyFields: false, onlyVisibleFields: false, fillNewPassword: true, + allowTotpAutofill: true, }); } diff --git a/apps/browser/src/autofill/content/autofill.js b/apps/browser/src/autofill/content/autofill.js index 052fd1120fe..f6db33af97d 100644 --- a/apps/browser/src/autofill/content/autofill.js +++ b/apps/browser/src/autofill/content/autofill.js @@ -751,8 +751,8 @@ ].join('\n\n'); if ( - // At least one of the `savedURLs` uses SSL - savedURLs.some(url => url.startsWith('https://')) && + // At least one of the `savedURLs` uses SSL for the current page + savedURLs.some(url => url.startsWith(`https://${window.location.hostname}`)) && // The current page is not using SSL document.location.protocol === 'http:' && // There are password inputs on the page diff --git a/apps/browser/src/autofill/content/notification-bar.ts b/apps/browser/src/autofill/content/notification-bar.ts index 330196dc648..5bccd1d2a22 100644 --- a/apps/browser/src/autofill/content/notification-bar.ts +++ b/apps/browser/src/autofill/content/notification-bar.ts @@ -3,6 +3,7 @@ import ChangePasswordRuntimeMessage from "../../background/models/changePassword import AutofillField from "../models/autofill-field"; import { WatchedForm } from "../models/watched-form"; import { FormData } from "../services/abstractions/autofill.service"; +import { UserSettings } from "../types"; interface HTMLElementWithFormOpId extends HTMLElement { formOpId: string; @@ -26,10 +27,64 @@ interface HTMLElementWithFormOpId extends HTMLElement { * and async scripts to finish loading. * https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContentLoaded_event */ -document.addEventListener("DOMContentLoaded", (event) => { - // Do not show the notification bar on the Bitwarden vault - // because they can add logins and change passwords there - if (window.location.hostname.endsWith("vault.bitwarden.com")) { +document.addEventListener("DOMContentLoaded", async (event) => { + // These are preferences for whether to show the notification bar based on the user's settings + // and they are set in the Settings > Options page in the browser extension. + let disabledAddLoginNotification = false; + let disabledChangedPasswordNotification = false; + let showNotificationBar = true; + + // Look up the active user id from storage + const activeUserIdKey = "activeUserId"; + let activeUserId: string; + await chrome.storage.local.get(activeUserIdKey, (obj: any) => { + if (obj == null || obj[activeUserIdKey] == null) { + return; + } + activeUserId = obj[activeUserIdKey]; + }); + + // Look up the user's settings from storage + await chrome.storage.local.get(activeUserId, (obj: any) => { + if (obj?.[activeUserId] == null) { + return; + } + + const userSettings: UserSettings = obj[activeUserId].settings; + + // Do not show the notification bar on the Bitwarden vault + // because they can add logins and change passwords there + if (window.location.origin === userSettings.serverConfig.environment.vault) { + showNotificationBar = false; + + return; + } + + // NeverDomains is a dictionary of domains that the user has chosen to never + // show the notification bar on (for login detail collection or password change). + // It is managed in the Settings > Excluded Domains page in the browser extension. + // Example: '{"bitwarden.com":null}' + const excludedDomainsDict = userSettings.neverDomains; + + if ( + excludedDomainsDict != null && + // eslint-disable-next-line + excludedDomainsDict.hasOwnProperty(window.location.hostname) + ) { + return; + } + + // Set local disabled preferences + disabledAddLoginNotification = userSettings.disableAddLoginNotification; + disabledChangedPasswordNotification = userSettings.disableChangedPasswordNotification; + + if (!disabledAddLoginNotification || !disabledChangedPasswordNotification) { + // If the user has not disabled both notifications, then handle the initial page change (null -> actual page) + handlePageChange(); + } + }); + + if (!showNotificationBar) { return; } @@ -77,53 +132,6 @@ document.addEventListener("DOMContentLoaded", (event) => { ]); const changePasswordButtonContainsNames = new Set(["pass", "change", "contras", "senha"]); - // These are preferences for whether to show the notification bar based on the user's settings - // and they are set in the Settings > Options page in the browser extension. - let disabledAddLoginNotification = false; - let disabledChangedPasswordNotification = false; - - // Look up the active user id from storage - const activeUserIdKey = "activeUserId"; - let activeUserId: string; - chrome.storage.local.get(activeUserIdKey, (obj: any) => { - if (obj == null || obj[activeUserIdKey] == null) { - return; - } - activeUserId = obj[activeUserIdKey]; - }); - - // Look up the user's settings from storage - chrome.storage.local.get(activeUserId, (obj: any) => { - if (obj?.[activeUserId] == null) { - return; - } - - const userSettings = obj[activeUserId].settings; - - // NeverDomains is a dictionary of domains that the user has chosen to never - // show the notification bar on (for login detail collection or password change). - // It is managed in the Settings > Excluded Domains page in the browser extension. - // Example: '{"bitwarden.com":null}' - const excludedDomainsDict = userSettings.neverDomains; - - if ( - excludedDomainsDict != null && - // eslint-disable-next-line - excludedDomainsDict.hasOwnProperty(window.location.hostname) - ) { - return; - } - - // Set local disabled preferences - disabledAddLoginNotification = userSettings.disableAddLoginNotification; - disabledChangedPasswordNotification = userSettings.disableChangedPasswordNotification; - - if (!disabledAddLoginNotification || !disabledChangedPasswordNotification) { - // If the user has not disabled both notifications, then handle the initial page change (null -> actual page) - handlePageChange(); - } - }); - // Message Processing // Listen for messages from the background script @@ -834,6 +842,7 @@ document.addEventListener("DOMContentLoaded", (event) => { isVaultLocked: typeData.isVaultLocked, theme: typeData.theme, removeIndividualVault: typeData.removeIndividualVault, + webVaultURL: typeData.webVaultURL, }; const barQueryString = new URLSearchParams(barQueryParams).toString(); const barPage = "notification/bar.html?" + barQueryString; diff --git a/apps/browser/src/autofill/notification/bar.html b/apps/browser/src/autofill/notification/bar.html index deec7fd512c..a6be58de70a 100644 --- a/apps/browser/src/autofill/notification/bar.html +++ b/apps/browser/src/autofill/notification/bar.html @@ -51,4 +51,13 @@ + + diff --git a/apps/browser/src/autofill/notification/bar.ts b/apps/browser/src/autofill/notification/bar.ts index 59367dabee4..dcc4ce010f6 100644 --- a/apps/browser/src/autofill/notification/bar.ts +++ b/apps/browser/src/autofill/notification/bar.ts @@ -28,9 +28,20 @@ function load() { notificationEdit: chrome.i18n.getMessage("edit"), notificationChangeSave: chrome.i18n.getMessage("notificationChangeSave"), notificationChangeDesc: chrome.i18n.getMessage("notificationChangeDesc"), + notificationUnlock: chrome.i18n.getMessage("notificationUnlock"), + notificationUnlockDesc: chrome.i18n.getMessage("notificationUnlockDesc"), }; - document.getElementById("logo-link").title = i18n.appName; + const logoLink = document.getElementById("logo-link") as HTMLAnchorElement; + logoLink.title = i18n.appName; + + // Update logo link to user's regional domain + const webVaultURL = getQueryVariable("webVaultURL"); + const newVaultURL = webVaultURL && decodeURIComponent(webVaultURL); + + if (newVaultURL && newVaultURL !== logoLink.href) { + logoLink.href = newVaultURL; + } // i18n for "Add" template const addTemplate = document.getElementById("template-add") as HTMLTemplateElement; @@ -63,6 +74,13 @@ function load() { changeTemplate.content.getElementById("change-text").textContent = i18n.notificationChangeDesc; + const unlockTemplate = document.getElementById("template-unlock") as HTMLTemplateElement; + + const unlockButton = unlockTemplate.content.getElementById("unlock-vault"); + unlockButton.textContent = i18n.notificationUnlock; + + unlockTemplate.content.getElementById("unlock-text").textContent = i18n.notificationUnlockDesc; + // i18n for body content const closeButton = document.getElementById("close-button"); closeButton.title = i18n.close; @@ -71,6 +89,8 @@ function load() { handleTypeAdd(); } else if (getQueryVariable("type") === "change") { handleTypeChange(); + } else if (getQueryVariable("type") === "unlock") { + handleTypeUnlock(); } closeButton.addEventListener("click", (e) => { @@ -163,6 +183,17 @@ function handleTypeChange() { }); } +function handleTypeUnlock() { + setContent(document.getElementById("template-unlock") as HTMLTemplateElement); + + const unlockButton = document.getElementById("unlock-vault"); + unlockButton.addEventListener("click", (e) => { + sendPlatformMessage({ + command: "bgReopenPromptForLogin", + }); + }); +} + function setContent(template: HTMLTemplateElement) { const content = document.getElementById("content"); while (content.firstChild) { diff --git a/apps/browser/src/autofill/services/abstractions/autofill.service.ts b/apps/browser/src/autofill/services/abstractions/autofill.service.ts index b3ad26f0a0b..18830b32102 100644 --- a/apps/browser/src/autofill/services/abstractions/autofill.service.ts +++ b/apps/browser/src/autofill/services/abstractions/autofill.service.ts @@ -21,6 +21,7 @@ export interface AutoFillOptions { fillNewPassword?: boolean; skipLastUsed?: boolean; allowUntrustedIframe?: boolean; + allowTotpAutofill?: boolean; } export interface FormData { diff --git a/apps/browser/src/autofill/services/autofill-constants.ts b/apps/browser/src/autofill/services/autofill-constants.ts index fcab50712c9..58c295c0c21 100644 --- a/apps/browser/src/autofill/services/autofill-constants.ts +++ b/apps/browser/src/autofill/services/autofill-constants.ts @@ -20,6 +20,17 @@ export class AutoFillConstants { "benutzer id", ]; + static readonly TotpFieldNames: string[] = [ + "totp", + "2fa", + "mfa", + "totpcode", + "2facode", + "mfacode", + "twofactor", + "twofactorcode", + ]; + static readonly PasswordFieldIgnoreList: string[] = [ "onetimepassword", "captcha", diff --git a/apps/browser/src/autofill/services/autofill.service.ts b/apps/browser/src/autofill/services/autofill.service.ts index 54e7a833b65..9ced0104b8e 100644 --- a/apps/browser/src/autofill/services/autofill.service.ts +++ b/apps/browser/src/autofill/services/autofill.service.ts @@ -32,6 +32,7 @@ export interface GenerateFillScriptOptions { onlyEmptyFields: boolean; onlyVisibleFields: boolean; fillNewPassword: boolean; + allowTotpAutofill: boolean; cipher: CipherView; tabUrl: string; defaultUriMatch: UriMatchType; @@ -127,69 +128,72 @@ export default class AutofillService implements AutofillServiceInterface { const defaultUriMatch = (await this.stateService.getDefaultUriMatch()) ?? UriMatchType.Domain; let didAutofill = false; - options.pageDetails.forEach((pd) => { - // make sure we're still on correct tab - if (pd.tab.id !== tab.id || pd.tab.url !== tab.url) { - return; - } - - const fillScript = this.generateFillScript(pd.details, { - skipUsernameOnlyFill: options.skipUsernameOnlyFill || false, - onlyEmptyFields: options.onlyEmptyFields || false, - onlyVisibleFields: options.onlyVisibleFields || false, - fillNewPassword: options.fillNewPassword || false, - cipher: options.cipher, - tabUrl: tab.url, - defaultUriMatch: defaultUriMatch, - }); - - if (!fillScript || !fillScript.script || !fillScript.script.length) { - return; - } - - if ( - fillScript.untrustedIframe && - options.allowUntrustedIframe != undefined && - !options.allowUntrustedIframe - ) { - this.logService.info("Auto-fill on page load was blocked due to an untrusted iframe."); - return; - } - - // Add a small delay between operations - fillScript.properties.delay_between_operations = 20; - - didAutofill = true; - if (!options.skipLastUsed) { - this.cipherService.updateLastUsedDate(options.cipher.id); - } - - BrowserApi.tabSendMessage( - tab, - { - command: "fillForm", - fillScript: fillScript, - url: tab.url, - }, - { frameId: pd.frameId } - ); - - if ( - options.cipher.type !== CipherType.Login || - totpPromise || - !options.cipher.login.totp || - (!canAccessPremium && !options.cipher.organizationUseTotp) - ) { - return; - } - - totpPromise = this.stateService.getDisableAutoTotpCopy().then((disabled) => { - if (!disabled) { - return this.totpService.getCode(options.cipher.login.totp); + await Promise.all( + options.pageDetails.map(async (pd) => { + // make sure we're still on correct tab + if (pd.tab.id !== tab.id || pd.tab.url !== tab.url) { + return; } - return null; - }); - }); + + const fillScript = await this.generateFillScript(pd.details, { + skipUsernameOnlyFill: options.skipUsernameOnlyFill || false, + onlyEmptyFields: options.onlyEmptyFields || false, + onlyVisibleFields: options.onlyVisibleFields || false, + fillNewPassword: options.fillNewPassword || false, + allowTotpAutofill: options.allowTotpAutofill || false, + cipher: options.cipher, + tabUrl: tab.url, + defaultUriMatch: defaultUriMatch, + }); + + if (!fillScript || !fillScript.script || !fillScript.script.length) { + return; + } + + if ( + fillScript.untrustedIframe && + options.allowUntrustedIframe != undefined && + !options.allowUntrustedIframe + ) { + this.logService.info("Auto-fill on page load was blocked due to an untrusted iframe."); + return; + } + + // Add a small delay between operations + fillScript.properties.delay_between_operations = 20; + + didAutofill = true; + if (!options.skipLastUsed) { + this.cipherService.updateLastUsedDate(options.cipher.id); + } + + BrowserApi.tabSendMessage( + tab, + { + command: "fillForm", + fillScript: fillScript, + url: tab.url, + }, + { frameId: pd.frameId } + ); + + if ( + options.cipher.type !== CipherType.Login || + totpPromise || + !options.cipher.login.totp || + (!canAccessPremium && !options.cipher.organizationUseTotp) + ) { + return; + } + + totpPromise = this.stateService.getDisableAutoTotpCopy().then((disabled) => { + if (!disabled) { + return this.totpService.getCode(options.cipher.login.totp); + } + return null; + }); + }) + ); if (didAutofill) { this.eventCollectionService.collect(EventType.Cipher_ClientAutofilled, options.cipher.id); @@ -244,6 +248,7 @@ export default class AutofillService implements AutofillServiceInterface { onlyVisibleFields: !fromCommand, fillNewPassword: fromCommand, allowUntrustedIframe: fromCommand, + allowTotpAutofill: fromCommand, }); // Update last used index as autofill has succeed @@ -280,10 +285,10 @@ export default class AutofillService implements AutofillServiceInterface { return tab; } - private generateFillScript( + private async generateFillScript( pageDetails: AutofillPageDetails, options: GenerateFillScriptOptions - ): AutofillScript { + ): Promise { if (!pageDetails || !options.cipher) { return null; } @@ -333,7 +338,12 @@ export default class AutofillService implements AutofillServiceInterface { switch (options.cipher.type) { case CipherType.Login: - fillScript = this.generateLoginFillScript(fillScript, pageDetails, filledFields, options); + fillScript = await this.generateLoginFillScript( + fillScript, + pageDetails, + filledFields, + options + ); break; case CipherType.Card: fillScript = this.generateCardFillScript(fillScript, pageDetails, filledFields, options); @@ -353,20 +363,22 @@ export default class AutofillService implements AutofillServiceInterface { return fillScript; } - private generateLoginFillScript( + private async generateLoginFillScript( fillScript: AutofillScript, pageDetails: AutofillPageDetails, filledFields: { [id: string]: AutofillField }, options: GenerateFillScriptOptions - ): AutofillScript { + ): Promise { if (!options.cipher.login) { return null; } const passwords: AutofillField[] = []; const usernames: AutofillField[] = []; + const totps: AutofillField[] = []; let pf: AutofillField = null; let username: AutofillField = null; + let totp: AutofillField = null; const login = options.cipher.login; fillScript.savedUrls = login?.uris?.filter((u) => u.match != UriMatchType.Never).map((u) => u.uri) ?? []; @@ -397,13 +409,6 @@ export default class AutofillService implements AutofillServiceInterface { continue; } - const passwordFieldsForForm: AutofillField[] = []; - passwordFields.forEach((passField) => { - if (formKey === passField.form) { - passwordFieldsForForm.push(passField); - } - }); - passwordFields.forEach((passField) => { pf = passField; passwords.push(pf); @@ -420,6 +425,19 @@ export default class AutofillService implements AutofillServiceInterface { usernames.push(username); } } + + if (options.allowTotpAutofill && login.totp) { + totp = this.findTotpField(pageDetails, pf, false, false, false); + + if (!totp && !options.onlyVisibleFields) { + // not able to find any viewable totp fields. maybe there are some "hidden" ones? + totp = this.findTotpField(pageDetails, pf, true, true, false); + } + + if (totp) { + totps.push(totp); + } + } }); } @@ -442,18 +460,42 @@ export default class AutofillService implements AutofillServiceInterface { usernames.push(username); } } + + if (options.allowTotpAutofill && login.totp && pf.elementNumber > 0) { + totp = this.findTotpField(pageDetails, pf, false, false, true); + + if (!totp && !options.onlyVisibleFields) { + // not able to find any viewable username fields. maybe there are some "hidden" ones? + totp = this.findTotpField(pageDetails, pf, true, true, true); + } + + if (totp) { + totps.push(totp); + } + } } - if (!passwordFields.length && !options.skipUsernameOnlyFill) { + if (!passwordFields.length) { // No password fields on this page. Let's try to just fuzzy fill the username. pageDetails.fields.forEach((f) => { if ( + !options.skipUsernameOnlyFill && f.viewable && (f.type === "text" || f.type === "email" || f.type === "tel") && AutofillService.fieldIsFuzzyMatch(f, AutoFillConstants.UsernameFieldNames) ) { usernames.push(f); } + + if ( + options.allowTotpAutofill && + f.viewable && + (f.type === "text" || f.type === "number") && + (AutofillService.fieldIsFuzzyMatch(f, AutoFillConstants.TotpFieldNames) || + f.autoCompleteType === "one-time-code") + ) { + totps.push(f); + } }); } @@ -477,6 +519,20 @@ export default class AutofillService implements AutofillServiceInterface { AutofillService.fillByOpid(fillScript, p, login.password); }); + if (options.allowTotpAutofill) { + await Promise.all( + totps.map(async (t) => { + if (Object.prototype.hasOwnProperty.call(filledFields, t.opid)) { + return; + } + + filledFields[t.opid] = t; + const totpValue = await this.totpService.getCode(login.totp); + AutofillService.fillByOpid(fillScript, t, totpValue); + }) + ); + } + fillScript = AutofillService.setFillScriptForFocus(filledFields, fillScript); return fillScript; } @@ -678,6 +734,15 @@ export default class AutofillService implements AutofillServiceInterface { let exp: string = null; for (let i = 0; i < CreditCardAutoFillConstants.MonthAbbr.length; i++) { if ( + this.fieldAttrsContain( + fillFields.exp, + CreditCardAutoFillConstants.MonthAbbr[i] + + "/" + + CreditCardAutoFillConstants.YearAbbrLong[i] + ) + ) { + exp = fullMonth + "/" + fullYear; + } else if ( this.fieldAttrsContain( fillFields.exp, CreditCardAutoFillConstants.MonthAbbr[i] + @@ -690,12 +755,12 @@ export default class AutofillService implements AutofillServiceInterface { } else if ( this.fieldAttrsContain( fillFields.exp, - CreditCardAutoFillConstants.MonthAbbr[i] + + CreditCardAutoFillConstants.YearAbbrLong[i] + "/" + - CreditCardAutoFillConstants.YearAbbrLong[i] + CreditCardAutoFillConstants.MonthAbbr[i] ) ) { - exp = fullMonth + "/" + fullYear; + exp = fullYear + "/" + fullMonth; } else if ( this.fieldAttrsContain( fillFields.exp, @@ -709,12 +774,12 @@ export default class AutofillService implements AutofillServiceInterface { } else if ( this.fieldAttrsContain( fillFields.exp, - CreditCardAutoFillConstants.YearAbbrLong[i] + - "/" + - CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.MonthAbbr[i] + + "-" + + CreditCardAutoFillConstants.YearAbbrLong[i] ) ) { - exp = fullYear + "/" + fullMonth; + exp = fullMonth + "-" + fullYear; } else if ( this.fieldAttrsContain( fillFields.exp, @@ -728,12 +793,12 @@ export default class AutofillService implements AutofillServiceInterface { } else if ( this.fieldAttrsContain( fillFields.exp, - CreditCardAutoFillConstants.MonthAbbr[i] + + CreditCardAutoFillConstants.YearAbbrLong[i] + "-" + - CreditCardAutoFillConstants.YearAbbrLong[i] + CreditCardAutoFillConstants.MonthAbbr[i] ) ) { - exp = fullMonth + "-" + fullYear; + exp = fullYear + "-" + fullMonth; } else if ( this.fieldAttrsContain( fillFields.exp, @@ -747,12 +812,10 @@ export default class AutofillService implements AutofillServiceInterface { } else if ( this.fieldAttrsContain( fillFields.exp, - CreditCardAutoFillConstants.YearAbbrLong[i] + - "-" + - CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.YearAbbrLong[i] + CreditCardAutoFillConstants.MonthAbbr[i] ) ) { - exp = fullYear + "-" + fullMonth; + exp = fullYear + fullMonth; } else if ( this.fieldAttrsContain( fillFields.exp, @@ -764,10 +827,10 @@ export default class AutofillService implements AutofillServiceInterface { } else if ( this.fieldAttrsContain( fillFields.exp, - CreditCardAutoFillConstants.YearAbbrLong[i] + CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.YearAbbrLong[i] ) ) { - exp = fullYear + fullMonth; + exp = fullMonth + fullYear; } else if ( this.fieldAttrsContain( fillFields.exp, @@ -776,13 +839,6 @@ export default class AutofillService implements AutofillServiceInterface { partYear != null ) { exp = fullMonth + partYear; - } else if ( - this.fieldAttrsContain( - fillFields.exp, - CreditCardAutoFillConstants.MonthAbbr[i] + CreditCardAutoFillConstants.YearAbbrLong[i] - ) - ) { - exp = fullMonth + fullYear; } if (exp != null) { @@ -1258,6 +1314,43 @@ export default class AutofillService implements AutofillServiceInterface { return usernameField; } + private findTotpField( + pageDetails: AutofillPageDetails, + passwordField: AutofillField, + canBeHidden: boolean, + canBeReadOnly: boolean, + withoutForm: boolean + ) { + let totpField: AutofillField = null; + for (let i = 0; i < pageDetails.fields.length; i++) { + const f = pageDetails.fields[i]; + if (AutofillService.forCustomFieldsOnly(f)) { + continue; + } + + if ( + !f.disabled && + (canBeReadOnly || !f.readonly) && + (withoutForm || f.form === passwordField.form) && + (canBeHidden || f.viewable) && + (f.type === "text" || f.type === "number") && + AutofillService.fieldIsFuzzyMatch(f, AutoFillConstants.TotpFieldNames) + ) { + totpField = f; + + if ( + this.findMatchingFieldIndex(f, AutoFillConstants.TotpFieldNames) > -1 || + f.autoCompleteType === "one-time-code" + ) { + // We found an exact match. No need to keep looking. + break; + } + } + } + + return totpField; + } + private findMatchingFieldIndex(field: AutofillField, names: string[]): number { for (let i = 0; i < names.length; i++) { if (names[i].indexOf("=") > -1) { @@ -1267,6 +1360,12 @@ export default class AutofillService implements AutofillServiceInterface { if (this.fieldPropertyIsPrefixMatch(field, "htmlName", names[i], "name")) { return i; } + if (this.fieldPropertyIsPrefixMatch(field, "label-left", names[i], "label")) { + return i; + } + if (this.fieldPropertyIsPrefixMatch(field, "label-right", names[i], "label")) { + return i; + } if (this.fieldPropertyIsPrefixMatch(field, "label-tag", names[i], "label")) { return i; } @@ -1284,6 +1383,12 @@ export default class AutofillService implements AutofillServiceInterface { if (this.fieldPropertyIsMatch(field, "htmlName", names[i])) { return i; } + if (this.fieldPropertyIsMatch(field, "label-left", names[i])) { + return i; + } + if (this.fieldPropertyIsMatch(field, "label-right", names[i])) { + return i; + } if (this.fieldPropertyIsMatch(field, "label-tag", names[i])) { return i; } @@ -1405,7 +1510,7 @@ export default class AutofillService implements AutofillServiceInterface { } static hasValue(str: string): boolean { - return str && str !== ""; + return Boolean(str && str !== ""); } static setFillScriptForFocus( diff --git a/apps/browser/src/autofill/types/index.ts b/apps/browser/src/autofill/types/index.ts new file mode 100644 index 00000000000..d6891325353 --- /dev/null +++ b/apps/browser/src/autofill/types/index.ts @@ -0,0 +1,41 @@ +import { Region } from "@bitwarden/common/platform/abstractions/environment.service"; +import { VaultTimeoutAction } from "@bitwarden/common/src/enums/vault-timeout-action.enum"; + +export type UserSettings = { + avatarColor: string | null; + environmentUrls: { + api: string | null; + base: string | null; + events: string | null; + icons: string | null; + identity: string | null; + keyConnector: string | null; + notifications: string | null; + webVault: string | null; + }; + pinProtected: { [key: string]: any }; + region: Region; + serverConfig: { + environment: { + api: string | null; + cloudRegion: string | null; + identity: string | null; + notifications: string | null; + sso: string | null; + vault: string | null; + }; + featureStates: { [key: string]: any }; + gitHash: string; + server: { [key: string]: any }; + utcDate: string; + version: string; + }; + settings: { + equivalentDomains: string[][]; + }; + neverDomains?: { [key: string]: any }; + disableAddLoginNotification?: boolean; + disableChangedPasswordNotification?: boolean; + vaultTimeout: number; + vaultTimeoutAction: VaultTimeoutAction; +}; diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index acef263d699..fa8a18d7ade 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -7,11 +7,9 @@ import { NotificationsService as NotificationsServiceAbstraction } from "@bitwar import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; import { SettingsService as SettingsServiceAbstraction } from "@bitwarden/common/abstractions/settings.service"; import { TotpService as TotpServiceAbstraction } from "@bitwarden/common/abstractions/totp.service"; -import { UserVerificationApiServiceAbstraction } from "@bitwarden/common/abstractions/userVerification/userVerification-api.service.abstraction"; -import { UserVerificationService as UserVerificationServiceAbstraction } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; import { VaultTimeoutSettingsService as VaultTimeoutSettingsServiceAbstraction } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service"; -import { InternalOrganizationService as InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; +import { InternalOrganizationServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { InternalPolicyService as InternalPolicyServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { ProviderService as ProviderServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/provider.service"; @@ -21,6 +19,8 @@ import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/auth/ab import { KeyConnectorService as KeyConnectorServiceAbstraction } from "@bitwarden/common/auth/abstractions/key-connector.service"; import { TokenService as TokenServiceAbstraction } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/auth/abstractions/two-factor.service"; +import { UserVerificationApiServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification-api.service.abstraction"; +import { UserVerificationService as UserVerificationServiceAbstraction } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; import { TokenService } from "@bitwarden/common/auth/services/token.service"; @@ -120,6 +120,7 @@ import { Account } from "../models/account"; import { BrowserApi } from "../platform/browser/browser-api"; import { flagEnabled } from "../platform/flags"; import { UpdateBadge } from "../platform/listeners/update-badge"; +import BrowserPopoutWindowService from "../platform/popup/browser-popout-window.service"; import { BrowserStateService as StateServiceAbstraction } from "../platform/services/abstractions/browser-state.service"; import { BrowserCryptoService } from "../platform/services/browser-crypto.service"; import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; @@ -207,6 +208,7 @@ export default class MainBackground { configService: ConfigServiceAbstraction; configApiService: ConfigApiServiceAbstraction; popupUtilsService: PopupUtilsService; + browserPopoutWindowService: BrowserPopoutWindowService; // Passed to the popup for Safari to workaround issues with theming, downloading, etc. backgroundWindow = window; @@ -394,7 +396,7 @@ export default class MainBackground { // AuthService should send the messages to the background not popup. send = (subscriber: string, arg: any = {}) => { const message = Object.assign({}, { command: subscriber }, arg); - that.runtimeBackground.processMessage(message, that as any); + that.runtimeBackground.processMessage(message, that as any, null); }; })(); this.authService = new AuthService( @@ -526,6 +528,7 @@ export default class MainBackground { this.authService, this.environmentService ); + this.browserPopoutWindowService = new BrowserPopoutWindowService(); this.popupUtilsService = new PopupUtilsService(this.isPrivateMode); this.fido2UserInterfaceService = new BrowserFido2UserInterfaceService(this.popupUtilsService); @@ -570,7 +573,8 @@ export default class MainBackground { this.environmentService, this.messagingService, this.logService, - this.configService + this.configService, + this.browserPopoutWindowService ); this.nativeMessagingBackground = new NativeMessagingBackground( this.cryptoService, @@ -597,7 +601,8 @@ export default class MainBackground { this.authService, this.policyService, this.folderService, - this.stateService + this.stateService, + this.environmentService ); this.tabsBackground = new TabsBackground(this, this.notificationBackground); @@ -703,6 +708,9 @@ export default class MainBackground { return new Promise((resolve) => { setTimeout(async () => { await this.environmentService.setUrlsFromStorage(); + // Workaround to ignore stateService.activeAccount until URLs are set + // TODO: Remove this when implementing ticket PM-2637 + this.environmentService.initialized = true; if (!this.isPrivateMode) { await this.refreshBadge(); } diff --git a/apps/browser/src/background/models/add-unlock-vault-queue-message.ts b/apps/browser/src/background/models/add-unlock-vault-queue-message.ts new file mode 100644 index 00000000000..9ddde271008 --- /dev/null +++ b/apps/browser/src/background/models/add-unlock-vault-queue-message.ts @@ -0,0 +1,6 @@ +import NotificationQueueMessage from "./notificationQueueMessage"; +import { NotificationQueueMessageType } from "./notificationQueueMessageType"; + +export default class AddUnlockVaultQueueMessage extends NotificationQueueMessage { + type: NotificationQueueMessageType.UnlockVault; +} diff --git a/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts b/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts index ec697b16994..53f8405cd50 100644 --- a/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts +++ b/apps/browser/src/background/models/lockedVaultPendingNotificationsItem.ts @@ -1,6 +1,9 @@ export default class LockedVaultPendingNotificationsItem { commandToRetry: { - msg: any; + msg: { + command: string; + data?: any; + }; sender: chrome.runtime.MessageSender; }; target: string; diff --git a/apps/browser/src/background/models/notificationQueueMessageType.ts b/apps/browser/src/background/models/notificationQueueMessageType.ts index f5e4115c4f5..2ce1a1840d8 100644 --- a/apps/browser/src/background/models/notificationQueueMessageType.ts +++ b/apps/browser/src/background/models/notificationQueueMessageType.ts @@ -1,4 +1,5 @@ export enum NotificationQueueMessageType { AddLogin = 0, ChangePassword = 1, + UnlockVault = 2, } diff --git a/apps/browser/src/background/nativeMessaging.background.ts b/apps/browser/src/background/nativeMessaging.background.ts index 94c9ca1fa8c..742cd39f15c 100644 --- a/apps/browser/src/background/nativeMessaging.background.ts +++ b/apps/browser/src/background/nativeMessaging.background.ts @@ -59,8 +59,8 @@ export class NativeMessagingBackground { private port: browser.runtime.Port | chrome.runtime.Port; private resolver: any = null; - private privateKey: ArrayBuffer = null; - private publicKey: ArrayBuffer = null; + private privateKey: Uint8Array = null; + private publicKey: Uint8Array = null; private secureSetupResolve: any = null; private sharedSecret: SymmetricCryptoKey; private appId: string; @@ -129,7 +129,7 @@ export class NativeMessagingBackground { const encrypted = Utils.fromB64ToArray(message.sharedSecret); const decrypted = await this.cryptoFunctionService.rsaDecrypt( - encrypted.buffer, + encrypted, this.privateKey, EncryptionAlgorithm ); @@ -321,7 +321,7 @@ export class NativeMessagingBackground { if (message.response === "unlocked") { await this.cryptoService.setKey( - new SymmetricCryptoKey(Utils.fromB64ToArray(message.keyB64).buffer) + new SymmetricCryptoKey(Utils.fromB64ToArray(message.keyB64)) ); // Verify key is correct by attempting to decrypt a secret diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 901d7258f2c..3c2ac7a96cc 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -8,6 +8,7 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { AutofillService } from "../autofill/services/abstractions/autofill.service"; import { BrowserApi } from "../platform/browser/browser-api"; +import { BrowserPopoutWindowService } from "../platform/popup/abstractions/browser-popout-window.service"; import { BrowserEnvironmentService } from "../platform/services/browser-environment.service"; import BrowserPlatformUtilsService from "../platform/services/browser-platform-utils.service"; @@ -31,7 +32,8 @@ export default class RuntimeBackground { private environmentService: BrowserEnvironmentService, private messagingService: MessagingService, private logService: LogService, - private configService: ConfigServiceAbstraction + private configService: ConfigServiceAbstraction, + private browserPopoutWindowService: BrowserPopoutWindowService ) { // onInstalled listener must be wired up before anything else, so we do it in the ctor chrome.runtime.onInstalled.addListener((details: any) => { @@ -80,7 +82,7 @@ export default class RuntimeBackground { if (this.lockedVaultPendingNotifications?.length > 0) { item = this.lockedVaultPendingNotifications.pop(); - BrowserApi.closeBitwardenExtensionTab(); + await this.browserPopoutWindowService.closeLoginPrompt(); } await this.main.refreshBadge(); @@ -119,7 +121,8 @@ export default class RuntimeBackground { await this.main.openPopup(); break; case "promptForLogin": - BrowserApi.openBitwardenExtensionTab("popup/index.html", true); + case "bgReopenPromptForLogin": + await this.browserPopoutWindowService.openLoginPrompt(sender.tab?.windowId); break; case "openAddEditCipher": { const addEditCipherUrl = @@ -247,6 +250,7 @@ export default class RuntimeBackground { cipher: this.main.loginToAutoFill, pageDetails: this.pageDetailsToAutoFill, fillNewPassword: true, + allowTotpAutofill: true, }); if (totpCode != null) { diff --git a/apps/browser/src/manifest.json b/apps/browser/src/manifest.json index e7b0533d608..4eadf4bb552 100644 --- a/apps/browser/src/manifest.json +++ b/apps/browser/src/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2023.5.0", + "version": "2023.7.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", @@ -107,7 +107,7 @@ "applications": { "gecko": { "id": "{446900e4-71c2-419f-a6a7-df9c091e268b}", - "strict_min_version": "42.0" + "strict_min_version": "91.0" } }, "sidebar_action": { diff --git a/apps/browser/src/manifest.v3.json b/apps/browser/src/manifest.v3.json index dbcf5101855..2a366053ce3 100644 --- a/apps/browser/src/manifest.v3.json +++ b/apps/browser/src/manifest.v3.json @@ -3,7 +3,7 @@ "minimum_chrome_version": "102.0", "name": "__MSG_extName__", "short_name": "__MSG_appName__", - "version": "2023.5.0", + "version": "2023.7.1", "description": "__MSG_extDesc__", "default_locale": "en", "author": "Bitwarden Inc.", @@ -118,7 +118,7 @@ "applications": { "gecko": { "id": "{446900e4-71c2-419f-a6a7-df9c091e268b}", - "strict_min_version": "42.0" + "strict_min_version": "91.0" } }, "sidebar_action": { diff --git a/apps/browser/src/platform/background.ts b/apps/browser/src/platform/background.ts index 949991df9f0..f7913dade9f 100644 --- a/apps/browser/src/platform/background.ts +++ b/apps/browser/src/platform/background.ts @@ -8,6 +8,7 @@ import { onCommandListener, onInstallListener, runtimeMessageListener, + windowsOnFocusChangedListener, tabsOnActivatedListener, tabsOnReplacedListener, tabsOnUpdatedListener, @@ -18,6 +19,7 @@ if (BrowserApi.manifestVersion === 3) { chrome.runtime.onInstalled.addListener(onInstallListener); chrome.alarms.onAlarm.addListener(onAlarmListener); registerAlarms(); + chrome.windows.onFocusChanged.addListener(windowsOnFocusChangedListener); chrome.tabs.onActivated.addListener(tabsOnActivatedListener); chrome.tabs.onReplaced.addListener(tabsOnReplacedListener); chrome.tabs.onUpdated.addListener(tabsOnUpdatedListener); diff --git a/apps/browser/src/platform/browser/browser-api.ts b/apps/browser/src/platform/browser/browser-api.ts index cb9778832e6..0dd9773970c 100644 --- a/apps/browser/src/platform/browser/browser-api.ts +++ b/apps/browser/src/platform/browser/browser-api.ts @@ -19,6 +19,24 @@ export class BrowserApi { return chrome.runtime.getManifest().manifest_version; } + static getWindow(windowId?: number): Promise | void { + if (!windowId) { + return; + } + + return new Promise((resolve) => + chrome.windows.get(windowId, { populate: true }, (window) => resolve(window)) + ); + } + + static async createWindow(options: chrome.windows.CreateData): Promise { + return new Promise((resolve) => + chrome.windows.create(options, (window) => { + resolve(window); + }) + ); + } + static async getTabFromCurrentWindowId(): Promise | null { return await BrowserApi.tabsQueryFirst({ active: true, @@ -107,6 +125,10 @@ export class BrowserApi { chrome.tabs.sendMessage(tabId, message, options, responseCallback); } + static async removeTab(tabId: number) { + await chrome.tabs.remove(tabId); + } + static async getPrivateModeWindows(): Promise { return (await browser.windows.getAll()).filter((win) => win.incognito); } @@ -167,7 +189,7 @@ export class BrowserApi { } const tabToClose = tabs[tabs.length - 1]; - chrome.tabs.remove(tabToClose.id); + BrowserApi.removeTab(tabToClose.id); } static createNewWindow( diff --git a/apps/browser/src/platform/listeners/index.ts b/apps/browser/src/platform/listeners/index.ts index cf4950023f3..60e304402aa 100644 --- a/apps/browser/src/platform/listeners/index.ts +++ b/apps/browser/src/platform/listeners/index.ts @@ -6,6 +6,11 @@ import { onCommandListener } from "./on-command-listener"; import { onInstallListener } from "./on-install-listener"; import { UpdateBadge } from "./update-badge"; +const windowsOnFocusChangedListener = combine([ + UpdateBadge.windowsOnFocusChangedListener, + CipherContextMenuHandler.windowsOnFocusChangedListener, +]); + const tabsOnActivatedListener = combine([ UpdateBadge.tabsOnActivatedListener, CipherContextMenuHandler.tabsOnActivatedListener, @@ -33,6 +38,7 @@ const runtimeMessageListener = combine< ]); export { + windowsOnFocusChangedListener, tabsOnActivatedListener, tabsOnReplacedListener, tabsOnUpdatedListener, diff --git a/apps/browser/src/platform/listeners/update-badge.ts b/apps/browser/src/platform/listeners/update-badge.ts index 4623ff30f05..89b620ad6fe 100644 --- a/apps/browser/src/platform/listeners/update-badge.ts +++ b/apps/browser/src/platform/listeners/update-badge.ts @@ -42,6 +42,13 @@ export class UpdateBadge { "deletedCipher", ]; + static async windowsOnFocusChangedListener( + windowId: number, + serviceCache: Record + ) { + await new UpdateBadge(self).run({ windowId, existingServices: serviceCache }); + } + static async tabsOnActivatedListener( activeInfo: chrome.tabs.TabActiveInfo, serviceCache: Record diff --git a/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts b/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts new file mode 100644 index 00000000000..ca22e369d80 --- /dev/null +++ b/apps/browser/src/platform/popup/abstractions/browser-popout-window.service.ts @@ -0,0 +1,6 @@ +interface BrowserPopoutWindowService { + openLoginPrompt(senderWindowId: number): Promise; + closeLoginPrompt(): Promise; +} + +export { BrowserPopoutWindowService }; diff --git a/apps/browser/src/platform/popup/browser-popout-window.service.ts b/apps/browser/src/platform/popup/browser-popout-window.service.ts new file mode 100644 index 00000000000..bfec3e690ba --- /dev/null +++ b/apps/browser/src/platform/popup/browser-popout-window.service.ts @@ -0,0 +1,64 @@ +import { BrowserApi } from "../browser/browser-api"; + +import { BrowserPopoutWindowService as BrowserPopupWindowServiceInterface } from "./abstractions/browser-popout-window.service"; + +class BrowserPopoutWindowService implements BrowserPopupWindowServiceInterface { + private singleActionPopoutTabIds: Record = {}; + private defaultPopoutWindowOptions: chrome.windows.CreateData = { + type: "normal", + focused: true, + width: 500, + height: 800, + }; + + async openLoginPrompt(senderWindowId: number) { + await this.closeLoginPrompt(); + await this.openPopoutWindow( + senderWindowId, + "popup/index.html?uilocation=popout", + "loginPrompt" + ); + } + + async closeLoginPrompt() { + await this.closeSingleActionPopout("loginPrompt"); + } + + private async openPopoutWindow( + senderWindowId: number, + popupWindowURL: string, + singleActionPopoutKey: string + ) { + const senderWindow = senderWindowId && (await BrowserApi.getWindow(senderWindowId)); + const url = chrome.extension.getURL(popupWindowURL); + const offsetRight = 15; + const offsetTop = 90; + const popupWidth = this.defaultPopoutWindowOptions.width; + const windowOptions = senderWindow + ? { + ...this.defaultPopoutWindowOptions, + url, + left: senderWindow.left + senderWindow.width - popupWidth - offsetRight, + top: senderWindow.top + offsetTop, + } + : { ...this.defaultPopoutWindowOptions, url }; + + const popupWindow = await BrowserApi.createWindow(windowOptions); + + if (!singleActionPopoutKey) { + return; + } + this.singleActionPopoutTabIds[singleActionPopoutKey] = popupWindow?.tabs[0].id; + } + + private async closeSingleActionPopout(popoutKey: string) { + const tabId = this.singleActionPopoutTabIds[popoutKey]; + if (!tabId) { + return; + } + await BrowserApi.removeTab(tabId); + this.singleActionPopoutTabIds[popoutKey] = null; + } +} + +export default BrowserPopoutWindowService; diff --git a/apps/browser/src/platform/services/browser-platform-utils.service.ts b/apps/browser/src/platform/services/browser-platform-utils.service.ts index 79c52d615fb..018b1c623dc 100644 --- a/apps/browser/src/platform/services/browser-platform-utils.service.ts +++ b/apps/browser/src/platform/services/browser-platform-utils.service.ts @@ -314,10 +314,6 @@ export default class BrowserPlatformUtilsService implements PlatformUtilsService return false; } - if (this.isFirefox()) { - return parseInt((await browser.runtime.getBrowserInfo()).version.split(".")[0], 10) >= 87; - } - return true; } diff --git a/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts b/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts index d2da5f6fc1a..49465414721 100644 --- a/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts +++ b/apps/browser/src/platform/services/local-backed-session-storage.service.spec.ts @@ -21,9 +21,7 @@ describe("Browser Session Storage Service", () => { let localStorage: BrowserLocalStorageService; let sessionStorage: BrowserMemoryStorageService; - const key = new SymmetricCryptoKey( - Utils.fromUtf8ToArray("00000000000000000000000000000000").buffer - ); + const key = new SymmetricCryptoKey(Utils.fromUtf8ToArray("00000000000000000000000000000000")); let getSessionKeySpy: jest.SpyInstance; const mockEnc = (input: string) => Promise.resolve(new EncString("ENCRYPTED" + input)); diff --git a/apps/browser/src/popup/app-routing.module.ts b/apps/browser/src/popup/app-routing.module.ts index c2e2a78b094..360637343bc 100644 --- a/apps/browser/src/popup/app-routing.module.ts +++ b/apps/browser/src/popup/app-routing.module.ts @@ -34,11 +34,11 @@ import { ShareComponent } from "../vault/popup/components/vault/share.component" import { VaultFilterComponent } from "../vault/popup/components/vault/vault-filter.component"; import { VaultItemsComponent } from "../vault/popup/components/vault/vault-items.component"; import { ViewComponent } from "../vault/popup/components/vault/view.component"; +import { FolderAddEditComponent } from "../vault/popup/settings/folder-add-edit.component"; import { DebounceNavigationService } from "./services/debounceNavigationService"; import { AutofillComponent } from "./settings/autofill.component"; import { ExcludedDomainsComponent } from "./settings/excluded-domains.component"; -import { FolderAddEditComponent } from "./settings/folder-add-edit.component"; import { FoldersComponent } from "./settings/folders.component"; import { HelpAndFeedbackComponent } from "./settings/help-and-feedback.component"; import { OptionsComponent } from "./settings/options.component"; diff --git a/apps/browser/src/popup/app.module.ts b/apps/browser/src/popup/app.module.ts index bc8e17eb05f..a367c4a152b 100644 --- a/apps/browser/src/popup/app.module.ts +++ b/apps/browser/src/popup/app.module.ts @@ -53,6 +53,7 @@ import { VaultItemsComponent } from "../vault/popup/components/vault/vault-items import { VaultSelectComponent } from "../vault/popup/components/vault/vault-select.component"; import { ViewCustomFieldsComponent } from "../vault/popup/components/vault/view-custom-fields.component"; import { ViewComponent } from "../vault/popup/components/vault/view.component"; +import { FolderAddEditComponent } from "../vault/popup/settings/folder-add-edit.component"; import { AppRoutingModule } from "./app-routing.module"; import { AppComponent } from "./app.component"; @@ -64,7 +65,6 @@ import { ServicesModule } from "./services/services.module"; import { AboutComponent } from "./settings/about.component"; import { AutofillComponent } from "./settings/autofill.component"; import { ExcludedDomainsComponent } from "./settings/excluded-domains.component"; -import { FolderAddEditComponent } from "./settings/folder-add-edit.component"; import { FoldersComponent } from "./settings/folders.component"; import { HelpAndFeedbackComponent } from "./settings/help-and-feedback.component"; import { OptionsComponent } from "./settings/options.component"; diff --git a/apps/browser/src/popup/main.ts b/apps/browser/src/popup/main.ts index 0772f3c7f09..ef69e0342fc 100644 --- a/apps/browser/src/popup/main.ts +++ b/apps/browser/src/popup/main.ts @@ -4,6 +4,7 @@ import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; import BrowserPlatformUtilsService from "../platform/services/browser-platform-utils.service"; require("./scss/popup.scss"); +require("./scss/tailwind.css"); import { AppModule } from "./app.module"; diff --git a/apps/browser/src/popup/scss/tailwind.css b/apps/browser/src/popup/scss/tailwind.css new file mode 100644 index 00000000000..7e12c1d6770 --- /dev/null +++ b/apps/browser/src/popup/scss/tailwind.css @@ -0,0 +1,5 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@import "../../../../../libs/components/src/tw-theme.css"; diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index 1b3244064bf..7b269800987 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -15,7 +15,6 @@ import { NotificationsService } from "@bitwarden/common/abstractions/notificatio import { SearchService as SearchServiceAbstraction } from "@bitwarden/common/abstractions/search.service"; import { SettingsService } from "@bitwarden/common/abstractions/settings.service"; import { TotpService } from "@bitwarden/common/abstractions/totp.service"; -import { UserVerificationService } from "@bitwarden/common/abstractions/userVerification/userVerification.service.abstraction"; import { VaultTimeoutService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeout.service"; import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vaultTimeout/vaultTimeoutSettings.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; @@ -31,6 +30,7 @@ import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-con import { LoginService as LoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/login.service"; import { TokenService } from "@bitwarden/common/auth/abstractions/token.service"; import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor.service"; +import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; import { LoginService } from "@bitwarden/common/auth/services/login.service"; import { AppIdService } from "@bitwarden/common/platform/abstractions/app-id.service"; diff --git a/apps/browser/src/popup/settings/options.component.html b/apps/browser/src/popup/settings/options.component.html index 3f60d4e68f6..a356be5f735 100644 --- a/apps/browser/src/popup/settings/options.component.html +++ b/apps/browser/src/popup/settings/options.component.html @@ -21,7 +21,7 @@ > - General + {{ "general" | i18n }} @@ -122,7 +122,7 @@ > - Display + {{ "display" | i18n }} diff --git a/apps/browser/src/popup/settings/premium.component.ts b/apps/browser/src/popup/settings/premium.component.ts index 426347ada97..459cd2a6cb2 100644 --- a/apps/browser/src/popup/settings/premium.component.ts +++ b/apps/browser/src/popup/settings/premium.component.ts @@ -4,6 +4,7 @@ import { Component } from "@angular/core"; import { DialogServiceAbstraction } from "@bitwarden/angular/services/dialog"; import { PremiumComponent as BasePremiumComponent } from "@bitwarden/angular/vault/components/premium.component"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; +import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; @@ -24,13 +25,26 @@ export class PremiumComponent extends BasePremiumComponent { logService: LogService, private location: Location, private currencyPipe: CurrencyPipe, - dialogService: DialogServiceAbstraction + dialogService: DialogServiceAbstraction, + environmentService: EnvironmentService ) { - super(i18nService, platformUtilsService, apiService, logService, stateService, dialogService); + super( + i18nService, + platformUtilsService, + apiService, + logService, + stateService, + dialogService, + environmentService + ); // Support old price string. Can be removed in future once all translations are properly updated. const thePrice = this.currencyPipe.transform(this.price, "$"); - this.priceString = i18nService.t("premiumPrice", thePrice); + // Safari extension crashes due to $1 appearing in the price string ($10.00). Escape the $ to fix. + const formattedPrice = this.platformUtilsService.isSafari() + ? thePrice.replace("$", "$$$") + : thePrice; + this.priceString = i18nService.t("premiumPrice", formattedPrice); if (this.priceString.indexOf("%price%") > -1) { this.priceString = this.priceString.replace("%price%", thePrice); } diff --git a/apps/browser/src/tools/popup/generator/generator.component.html b/apps/browser/src/tools/popup/generator/generator.component.html index 83b2c6dee78..5c9c7492014 100644 --- a/apps/browser/src/tools/popup/generator/generator.component.html +++ b/apps/browser/src/tools/popup/generator/generator.component.html @@ -19,7 +19,11 @@ {{ "passwordGeneratorPolicyInEffect" | i18n }}
-
+
-
+
@@ -18,13 +18,7 @@
- +
diff --git a/apps/browser/src/popup/settings/folder-add-edit.component.ts b/apps/browser/src/vault/popup/settings/folder-add-edit.component.ts similarity index 93% rename from apps/browser/src/popup/settings/folder-add-edit.component.ts rename to apps/browser/src/vault/popup/settings/folder-add-edit.component.ts index 781dbff5721..9acd0a7b4f3 100644 --- a/apps/browser/src/popup/settings/folder-add-edit.component.ts +++ b/apps/browser/src/vault/popup/settings/folder-add-edit.component.ts @@ -1,4 +1,5 @@ import { Component } from "@angular/core"; +import { FormBuilder } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { first } from "rxjs/operators"; @@ -24,7 +25,8 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent { private router: Router, private route: ActivatedRoute, logService: LogService, - dialogService: DialogServiceAbstraction + dialogService: DialogServiceAbstraction, + formBuilder: FormBuilder ) { super( folderService, @@ -32,7 +34,8 @@ export class FolderAddEditComponent extends BaseFolderAddEditComponent { i18nService, platformUtilsService, logService, - dialogService + dialogService, + formBuilder ); } diff --git a/apps/browser/store/locales/cy/copy.resx b/apps/browser/store/locales/cy/copy.resx index 191198691d4..776ad256b0f 100644 --- a/apps/browser/store/locales/cy/copy.resx +++ b/apps/browser/store/locales/cy/copy.resx @@ -118,10 +118,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bitwarden – Free Password Manager + Bitwarden - Rheolydd cyfineiriau am ddim - A secure and free password manager for all of your devices + Rheolydd diogel a rhad ac am ddim ar gyfer eich holl ddyfeisiau Bitwarden, Inc. is the parent company of 8bit Solutions LLC. @@ -152,7 +152,7 @@ Secure and share sensitive data within your Bitwarden Vault from any browser, mo - A secure and free password manager for all of your devices + Rheolydd diogel a rhad ac am ddim ar gyfer eich holl ddyfeisiau Sync and access your vault from multiple devices @@ -170,6 +170,6 @@ Secure and share sensitive data within your Bitwarden Vault from any browser, mo Automatically generate strong, random, and secure passwords - Your information is managed securely using AES-256 bit encryption + Mae eich gwybodaeth yn cael ei reoli'n ddiogel gan ddefnyddio manyleb amgryptio AES 256 did diff --git a/apps/browser/store/locales/de/copy.resx b/apps/browser/store/locales/de/copy.resx index 026999c3107..139a6026fdf 100644 --- a/apps/browser/store/locales/de/copy.resx +++ b/apps/browser/store/locales/de/copy.resx @@ -139,7 +139,7 @@ Bitwarden bietet Teams und Enterprise Pläne für Unternehmen an, damit du Passw Warum Bitwarden: Weltklasse Verschlüsselung -Passwörter sind durch erweiterte Ende-zu-Ende-Verschlüsselung (AES-256 Bit, salted hashtag und PBKDF2 SHA-256) so bleiben deine Daten sicher und privat. +Passwörter sind durch erweiterte Ende-zu-Ende-Verschlüsselung (AES-256 Bit, salted hashing und PBKDF2 SHA-256) so bleiben deine Daten sicher und privat. Integrierter Passwortgenerator Generiere starke, einzigartige und zufällige Passwörter basierend auf Sicherheitsanforderungen für jede Website, die du häufig besuchst. diff --git a/apps/browser/store/locales/fi/copy.resx b/apps/browser/store/locales/fi/copy.resx index 689fdb75b58..da3b59575fd 100644 --- a/apps/browser/store/locales/fi/copy.resx +++ b/apps/browser/store/locales/fi/copy.resx @@ -118,10 +118,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bitwarden – Ilmainen salasananhallinta + Bitwarden – Ilmainen salasanahallinta - Turvallinen ja ilmainen salasanojen hallinta kaikille laitteillesi + Turvallinen ja ilmainen salasanahallinta kaikille laitteillesi Bitwarden, Inc. on 8bit Solutions LLC:n emoyhtiö. @@ -152,7 +152,7 @@ Suojaa, käytä ja jaa Bitwarden-holvisi arkaluontoisia tietoja kaikilla selaimi - Turvallinen ja ilmainen salasanojen hallinta kaikille laitteillesi + Turvallinen ja ilmainen salasanahallinta kaikille laitteillesi Synkronoi ja hallitse holviasi useilla laitteilla diff --git a/apps/browser/store/locales/lt/copy.resx b/apps/browser/store/locales/lt/copy.resx index d2aa4024c07..01bd250546f 100644 --- a/apps/browser/store/locales/lt/copy.resx +++ b/apps/browser/store/locales/lt/copy.resx @@ -124,31 +124,31 @@ Saugi ir nemokama slaptažodžių tvarkyklė visiems įrenginiams - Bitwarden, Inc. is the parent company of 8bit Solutions LLC. + Bitwarden, Inc. yra pagrindinė 8bit Solutions LLC įmonė. -NAMED BEST PASSWORD MANAGER BY THE VERGE, U.S. NEWS & WORLD REPORT, CNET, AND MORE. +ĮVARDINTA GERIAUSIU SLAPTAŽODŽIŲ TVARKYTOJU. -Manage, store, secure, and share unlimited passwords across unlimited devices from anywhere. Bitwarden delivers open source password management solutions to everyone, whether at home, at work, or on the go. +Tvarkykite, saugokite, saugokite ir bendrinkite neribotą skaičių slaptažodžių neribotuose įrenginiuose iš bet kurios vietos. Bitwarden teikia atvirojo kodo slaptažodžių valdymo sprendimus visiems – tiek namuose, tiek darbe, tiek keliaujant. -Generate strong, unique, and random passwords based on security requirements for every website you frequent. +Generuokite stiprius, unikalius ir atsitiktinius slaptažodžius pagal saugos reikalavimus kiekvienai lankomai svetainei. -Bitwarden Send quickly transmits encrypted information --- files and plaintext -- directly to anyone. +Bitwarden Send greitai perduoda užšifruotą informaciją – failus ir paprastą tekstą – tiesiogiai bet kam. -Bitwarden offers Teams and Enterprise plans for companies so you can securely share passwords with colleagues. +Bitwarden siūlo komandų ir įmonių planus įmonėms, kad galėtumėte saugiai dalytis slaptažodžiais su kolegomis. -Why Choose Bitwarden: +Kodėl rinktis Bitwarden: -World-Class Encryption -Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashing, and PBKDF2 SHA-256) so your data stays secure and private. +Pasaulinės klasės šifravimas +Slaptažodžiai yra apsaugoti naudojant pažangų šifravimą nuo galo iki galo (AES-256 bitai, žyma su grotelėmis ir PBKDF2 SHA-256), todėl jūsų duomenys išliks saugūs ir privatūs. -Built-in Password Generator -Generate strong, unique, and random passwords based on security requirements for every website you frequent. +Integruotas slaptažodžių generatorius +Generuokite stiprius, unikalius ir atsitiktinius slaptažodžius pagal saugos reikalavimus kiekvienai lankomai svetainei. -Global Translations -Bitwarden translations exist in 40 languages and are growing, thanks to our global community. +Pasauliniai vertimai +Bitwarden vertimai egzistuoja 40 kalbose ir vis daugėja mūsų pasaulinės bendruomenės dėka. -Cross-Platform Applications -Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more. +Įvairių platformų programos +Apsaugokite ir bendrinkite neskelbtinus duomenis savo Bitwarden Vault iš bet kurios naršyklės, mobiliojo įrenginio ar stalinio kompiuterio OS ir kt. diff --git a/apps/browser/store/locales/mr/copy.resx b/apps/browser/store/locales/mr/copy.resx new file mode 100644 index 00000000000..191198691d4 --- /dev/null +++ b/apps/browser/store/locales/mr/copy.resx @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bitwarden – Free Password Manager + + + A secure and free password manager for all of your devices + + + Bitwarden, Inc. is the parent company of 8bit Solutions LLC. + +NAMED BEST PASSWORD MANAGER BY THE VERGE, U.S. NEWS & WORLD REPORT, CNET, AND MORE. + +Manage, store, secure, and share unlimited passwords across unlimited devices from anywhere. Bitwarden delivers open source password management solutions to everyone, whether at home, at work, or on the go. + +Generate strong, unique, and random passwords based on security requirements for every website you frequent. + +Bitwarden Send quickly transmits encrypted information --- files and plaintext -- directly to anyone. + +Bitwarden offers Teams and Enterprise plans for companies so you can securely share passwords with colleagues. + +Why Choose Bitwarden: + +World-Class Encryption +Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashing, and PBKDF2 SHA-256) so your data stays secure and private. + +Built-in Password Generator +Generate strong, unique, and random passwords based on security requirements for every website you frequent. + +Global Translations +Bitwarden translations exist in 40 languages and are growing, thanks to our global community. + +Cross-Platform Applications +Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more. + + + + A secure and free password manager for all of your devices + + + Sync and access your vault from multiple devices + + + Manage all your logins and passwords from a secure vault + + + Quickly auto-fill your login credentials into any website that you visit + + + Your vault is also conveniently accessible from the right-click menu + + + Automatically generate strong, random, and secure passwords + + + Your information is managed securely using AES-256 bit encryption + + diff --git a/apps/browser/store/locales/pt_PT/copy.resx b/apps/browser/store/locales/pt_PT/copy.resx index 199b5e9810a..845a94a3ca7 100644 --- a/apps/browser/store/locales/pt_PT/copy.resx +++ b/apps/browser/store/locales/pt_PT/copy.resx @@ -118,37 +118,37 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bitwarden - Gestor de palavras-passe gratuito + Bitwarden - Gestor de Palavras-passe Gratuito Um gestor de palavras-passe seguro e gratuito para todos os seus dispositivos - Bitwarden, Inc. is the parent company of 8bit Solutions LLC. + A Bitwarden, Inc. é a empresa-mãe da 8bit Solutions LLC. -NAMED BEST PASSWORD MANAGER BY THE VERGE, U.S. NEWS & WORLD REPORT, CNET, AND MORE. +NOMEADO O MELHOR GESTOR DE PALAVRAS-PASSE PELO THE VERGE, U.S. NEWS & WORLD REPORT, CNET E MUITO MAIS. -Manage, store, secure, and share unlimited passwords across unlimited devices from anywhere. Bitwarden delivers open source password management solutions to everyone, whether at home, at work, or on the go. +Gerir, armazenar, proteger e partilhar palavras-passe ilimitadas em dispositivos ilimitados a partir de qualquer lugar. O Bitwarden fornece soluções de gestão de palavras-passe de código aberto para todos, seja em casa, no trabalho ou onde estiver. -Generate strong, unique, and random passwords based on security requirements for every website you frequent. +Gera palavras-passe fortes, únicas e aleatórias com base em requisitos de segurança para todos os sites que frequenta. -Bitwarden Send quickly transmits encrypted information --- files and plaintext -- directly to anyone. +O Bitwarden Send transmite rapidamente informações encriptadas - ficheiros e texto simples - diretamente a qualquer pessoa. -Bitwarden offers Teams and Enterprise plans for companies so you can securely share passwords with colleagues. +O Bitwarden oferece os planos Equipas e Empresarial destinados a empresas, para que possa partilhar de forma segura as palavras-passe com os seus colegas. -Why Choose Bitwarden: +Razões para escolher o Bitwarden: -World-Class Encryption -Passwords are protected with advanced end-to-end encryption (AES-256 bit, salted hashing, and PBKDF2 SHA-256) so your data stays secure and private. +Encriptação de classe mundial +As palavras-passe são protegidas com encriptação avançada de ponta a ponta (AES-256 bit, salted hashtag e PBKDF2 SHA-256) para que os seus dados permaneçam seguros e privados. -Built-in Password Generator -Generate strong, unique, and random passwords based on security requirements for every website you frequent. +Gerador de palavras-passe incorporado +Gera palavras-passe fortes, únicas e aleatórias com base nos requisitos de segurança para todos os sites que frequenta. -Global Translations -Bitwarden translations exist in 40 languages and are growing, thanks to our global community. +Traduções globais +O Bitwarden está traduzido em 40 idiomas e está a crescer, graças à nossa comunidade global. -Cross-Platform Applications -Secure and share sensitive data within your Bitwarden Vault from any browser, mobile device, or desktop OS, and more. +Aplicações multiplataforma +Proteja e partilhe dados confidenciais no seu cofre Bitwarden a partir de qualquer navegador, dispositivo móvel ou sistema operativo de computador, e muito mais. diff --git a/apps/browser/tailwind.config.js b/apps/browser/tailwind.config.js new file mode 100644 index 00000000000..affbddf2b2d --- /dev/null +++ b/apps/browser/tailwind.config.js @@ -0,0 +1,6 @@ +/* eslint-disable no-undef, @typescript-eslint/no-var-requires */ +const config = require("../../libs/components/tailwind.config.base"); + +config.content = ["./src/**/*.{html,ts}", "../../libs/components/src/**/*.{html,ts}"]; + +module.exports = config; diff --git a/apps/browser/tsconfig.json b/apps/browser/tsconfig.json index 7744c082f17..9220b89c424 100644 --- a/apps/browser/tsconfig.json +++ b/apps/browser/tsconfig.json @@ -10,8 +10,10 @@ "sourceMap": true, "baseUrl": ".", "paths": { - "@bitwarden/common/*": ["../../libs/common/src/*"], "@bitwarden/angular/*": ["../../libs/angular/src/*"], + "@bitwarden/auth": ["../../libs/auth/src"], + "@bitwarden/common/*": ["../../libs/common/src/*"], + "@bitwarden/components": ["../../libs/components/src"], "@bitwarden/exporter/*": ["../../libs/exporter/src/*"] }, "useDefineForClassFields": false diff --git a/apps/browser/webpack.config.js b/apps/browser/webpack.config.js index 3274004177a..711d0a7e7ba 100644 --- a/apps/browser/webpack.config.js +++ b/apps/browser/webpack.config.js @@ -42,6 +42,16 @@ const moduleRules = [ }, type: "asset/resource", }, + { + test: /\.css$/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + }, + "css-loader", + "postcss-loader", + ], + }, { test: /\.scss$/, use: [ diff --git a/apps/cli/package.json b/apps/cli/package.json index d6577a9f337..7c6e50e22a2 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/cli", "description": "A secure and free password manager for all of your devices.", - "version": "2023.5.0", + "version": "2023.7.0", "keywords": [ "bitwarden", "password", diff --git a/apps/cli/src/admin-console/commands/confirm.command.ts b/apps/cli/src/admin-console/commands/confirm.command.ts index 912c8417753..be1264c399b 100644 --- a/apps/cli/src/admin-console/commands/confirm.command.ts +++ b/apps/cli/src/admin-console/commands/confirm.command.ts @@ -51,7 +51,7 @@ export class ConfirmCommand { } const publicKeyResponse = await this.apiService.getUserPublicKey(orgUser.userId); const publicKey = Utils.fromB64ToArray(publicKeyResponse.publicKey); - const key = await this.cryptoService.rsaEncrypt(orgKey.key, publicKey.buffer); + const key = await this.cryptoService.rsaEncrypt(orgKey.key, publicKey); const req = new OrganizationUserConfirmRequest(); req.key = key.encryptedString; await this.organizationUserService.postOrganizationUserConfirm( diff --git a/apps/cli/src/commands/get.command.ts b/apps/cli/src/commands/get.command.ts index 44a94fb430d..265e24c9d4e 100644 --- a/apps/cli/src/commands/get.command.ts +++ b/apps/cli/src/commands/get.command.ts @@ -513,7 +513,7 @@ export class GetCommand extends DownloadCommand { try { const response = await this.apiService.getUserPublicKey(id); const pubKey = Utils.fromB64ToArray(response.publicKey); - fingerprint = await this.cryptoService.getFingerprint(id, pubKey.buffer); + fingerprint = await this.cryptoService.getFingerprint(id, pubKey); } catch { // eslint-disable-next-line } diff --git a/apps/cli/src/commands/serve.command.ts b/apps/cli/src/commands/serve.command.ts index 92e8747bc33..8808dcaafb8 100644 --- a/apps/cli/src/commands/serve.command.ts +++ b/apps/cli/src/commands/serve.command.ts @@ -245,6 +245,10 @@ export class ServeCommand { }); router.post("/unlock", async (ctx, next) => { + // Do not allow guessing password location through serve command + delete ctx.request.query.passwordFile; + delete ctx.request.query.passwordEnv; + const response = await this.unlockCommand.run( ctx.request.body.password == null ? null : (ctx.request.body.password as string), ctx.request.query diff --git a/apps/cli/src/platform/services/node-env-secure-storage.service.ts b/apps/cli/src/platform/services/node-env-secure-storage.service.ts index 80e3cea64c4..491ec32cb62 100644 --- a/apps/cli/src/platform/services/node-env-secure-storage.service.ts +++ b/apps/cli/src/platform/services/node-env-secure-storage.service.ts @@ -47,7 +47,7 @@ export class NodeEnvSecureStorageService implements AbstractStorageService { throw new Error("No session key available."); } const encValue = await this.cryptoService().encryptToBytes( - Utils.fromB64ToArray(plainValue).buffer, + Utils.fromB64ToArray(plainValue), sessionKey ); if (encValue == null) { @@ -81,7 +81,7 @@ export class NodeEnvSecureStorageService implements AbstractStorageService { private getSessionKey() { try { if (process.env.BW_SESSION != null) { - const sessionBuffer = Utils.fromB64ToArray(process.env.BW_SESSION).buffer; + const sessionBuffer = Utils.fromB64ToArray(process.env.BW_SESSION); if (sessionBuffer != null) { const sessionKey = new SymmetricCryptoKey(sessionBuffer); if (sessionBuffer != null) { diff --git a/apps/cli/src/tools/send/commands/receive.command.ts b/apps/cli/src/tools/send/commands/receive.command.ts index 486afed2613..52cff0b462e 100644 --- a/apps/cli/src/tools/send/commands/receive.command.ts +++ b/apps/cli/src/tools/send/commands/receive.command.ts @@ -121,7 +121,7 @@ export class SendReceiveCommand extends DownloadCommand { } } - private async getUnlockedPassword(password: string, keyArray: ArrayBuffer) { + private async getUnlockedPassword(password: string, keyArray: Uint8Array) { const passwordHash = await this.cryptoFunctionService.pbkdf2( password, keyArray, @@ -134,7 +134,7 @@ export class SendReceiveCommand extends DownloadCommand { private async sendRequest( url: string, id: string, - key: ArrayBuffer + key: Uint8Array ): Promise { try { const sendResponse = await this.sendApiService.postSendAccess( diff --git a/apps/desktop/native-messaging-test-runner/src/native-message.service.ts b/apps/desktop/native-messaging-test-runner/src/native-message.service.ts index a6a535a73d0..4782389b7f8 100644 --- a/apps/desktop/native-messaging-test-runner/src/native-message.service.ts +++ b/apps/desktop/native-messaging-test-runner/src/native-message.service.ts @@ -225,8 +225,8 @@ export default class NativeMessageService { } private async getSharedKeyForKey(key: string): Promise { - const dataBuffer = Utils.fromB64ToArray(key).buffer; - const privKey = Utils.fromB64ToArray(config.testRsaPrivateKey).buffer; + const dataBuffer = Utils.fromB64ToArray(key); + const privKey = Utils.fromB64ToArray(config.testRsaPrivateKey); return new SymmetricCryptoKey( await this.nodeCryptoFunctionService.rsaDecrypt(dataBuffer, privKey, "sha1") diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 5b04709763b..2aa4d3e26c5 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@bitwarden/desktop", "description": "A secure and free password manager for all of your devices.", - "version": "2023.5.1", + "version": "2023.7.2", "keywords": [ "bitwarden", "password", diff --git a/apps/desktop/postcss.config.js b/apps/desktop/postcss.config.js new file mode 100644 index 00000000000..c4513687e89 --- /dev/null +++ b/apps/desktop/postcss.config.js @@ -0,0 +1,4 @@ +/* eslint-disable no-undef */ +module.exports = { + plugins: [require("tailwindcss"), require("autoprefixer"), require("postcss-nested")], +}; diff --git a/apps/desktop/src/app/app.component.ts b/apps/desktop/src/app/app.component.ts index d3829d4e638..320c93a05ef 100644 --- a/apps/desktop/src/app/app.component.ts +++ b/apps/desktop/src/app/app.component.ts @@ -10,6 +10,7 @@ import { } from "@angular/core"; import { DomSanitizer } from "@angular/platform-browser"; import { Router } from "@angular/router"; +import { ipcRenderer } from "electron"; import { IndividualConfig, ToastrService } from "ngx-toastr"; import { firstValueFrom, Subject, takeUntil } from "rxjs"; @@ -221,7 +222,7 @@ export class AppComponent implements OnInit, OnDestroy { this.systemService.cancelProcessReload(); break; case "reloadProcess": - (window.location as any).reload(true); + ipcRenderer.send("reload-process"); break; case "syncStarted": break; diff --git a/apps/desktop/src/app/layout/account-switcher.component.html b/apps/desktop/src/app/layout/account-switcher.component.html index 2cba2163905..d6fd137bff3 100644 --- a/apps/desktop/src/app/layout/account-switcher.component.html +++ b/apps/desktop/src/app/layout/account-switcher.component.html @@ -42,7 +42,7 @@ (backdropClick)="close()" (detach)="close()" [cdkConnectedOverlayOpen]="showSwitcher && isOpen" - [cdkConnectedOverlayPositions]="overlayPostition" + [cdkConnectedOverlayPositions]="overlayPosition" cdkConnectedOverlayMinWidth="250px" >
-
+
-
+
-
Bitwarden

{{ "logInInitiated" | i18n }}

diff --git a/apps/desktop/src/auth/login/login.component.html b/apps/desktop/src/auth/login/login.component.html index e21df43e3ab..978f8df562f 100644 --- a/apps/desktop/src/auth/login/login.component.html +++ b/apps/desktop/src/auth/login/login.component.html @@ -25,7 +25,8 @@ />
- + +