diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index def03c714d7..187f500828c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,7 +8,7 @@ apps/desktop/desktop_native @bitwarden/team-platform-dev apps/desktop/desktop_native/objc/src/native/autofill @bitwarden/team-autofill-dev apps/desktop/desktop_native/core/src/autofill @bitwarden/team-autofill-dev -## No ownership fo Cargo.lock and Cargo.toml to allow dependency updates +## No ownership for Cargo.lock and Cargo.toml to allow dependency updates apps/desktop/desktop_native/Cargo.lock apps/desktop/desktop_native/Cargo.toml @@ -18,6 +18,7 @@ apps/cli/src/auth @bitwarden/team-auth-dev apps/desktop/src/auth @bitwarden/team-auth-dev apps/web/src/app/auth @bitwarden/team-auth-dev libs/auth @bitwarden/team-auth-dev +libs/user-core @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 @@ -81,13 +82,26 @@ bitwarden_license/bit-web/src/app/billing @bitwarden/team-billing-dev apps/browser/src/platform @bitwarden/team-platform-dev apps/cli/src/platform @bitwarden/team-platform-dev apps/desktop/macos @bitwarden/team-platform-dev +apps/desktop/scripts @bitwarden/team-platform-dev apps/desktop/src/platform @bitwarden/team-platform-dev +apps/desktop/resources @bitwarden/team-platform-dev apps/web/src/app/platform @bitwarden/team-platform-dev libs/angular/src/platform @bitwarden/team-platform-dev libs/common/src/platform @bitwarden/team-platform-dev libs/common/spec @bitwarden/team-platform-dev libs/common/src/state-migrations @bitwarden/team-platform-dev libs/platform @bitwarden/team-platform-dev +libs/storage-core @bitwarden/team-platform-dev +libs/logging @bitwarden/team-platform-dev +libs/storage-test-utils @bitwarden/team-platform-dev +libs/messaging @bitwarden/team-platform-dev +libs/messaging-internal @bitwarden/team-platform-dev +libs/serialization @bitwarden/team-platform-dev +libs/guid @bitwarden/team-platform-dev +libs/client-type @bitwarden/team-platform-dev +libs/core-test-utils @bitwarden/team-platform-dev +libs/state @bitwarden/team-platform-dev +libs/state-test-utils @bitwarden/team-platform-dev # Web utils used across app and connectors apps/web/src/utils/ @bitwarden/team-platform-dev # Web core and shared files @@ -117,6 +131,9 @@ apps/web/src/translation-constants.ts @bitwarden/team-platform-dev .github/workflows/version-auto-bump.yml @bitwarden/team-platform-dev # ESLint custom rules libs/eslint @bitwarden/team-platform-dev +# Typescript tooling +tsconfig.base.json @bitwarden/team-platform-dev +nx.json @bitwarden/team-platform-dev ## Autofill team files ## apps/browser/src/autofill @bitwarden/team-autofill-dev @@ -125,9 +142,13 @@ libs/common/src/autofill @bitwarden/team-autofill-dev apps/desktop/macos/autofill-extension @bitwarden/team-autofill-dev apps/desktop/src/app/components/fido2placeholder.component.ts @bitwarden/team-autofill-dev apps/desktop/desktop_native/windows_plugin_authenticator @bitwarden/team-autofill-dev +apps/desktop/desktop_native/autotype @bitwarden/team-autofill-dev +.github/workflows/test-browser-interactions.yml @bitwarden/team-autofill-dev # DuckDuckGo integration apps/desktop/native-messaging-test-runner @bitwarden/team-autofill-dev apps/desktop/src/services/duckduckgo-message-handler.service.ts @bitwarden/team-autofill-dev +apps/desktop/src/services/encrypted-message-handler.service.ts @bitwarden/team-autofill-dev +.github/workflows/alert-ddg-files-modified.yml @bitwarden/team-autofill-dev # SSH Agent apps/desktop/desktop_native/core/src/ssh_agent @bitwarden/team-autofill-dev @bitwarden/wg-ssh-keys @@ -137,6 +158,7 @@ libs/components @bitwarden/team-ui-foundation libs/ui @bitwarden/team-ui-foundation apps/browser/src/platform/popup/layout @bitwarden/team-ui-foundation apps/browser/src/popup/app-routing.animations.ts @bitwarden/team-ui-foundation +apps/browser/src/popup/components/extension-anon-layout-wrapper @bitwarden/team-ui-foundation apps/web/src/app/layouts @bitwarden/team-ui-foundation @@ -189,3 +211,4 @@ apps/web/src/locales/en/messages.json # To track that effort please see https://bitwarden.atlassian.net/browse/PM-21636 **/tsconfig.json @bitwarden/team-platform-dev **/jest.config.js @bitwarden/team-platform-dev +**/project.jsons @bitwarden/team-platform-dev diff --git a/.github/ISSUE_TEMPLATE/browser.yml b/.github/ISSUE_TEMPLATE/browser.yml index 23a0e4276bf..6f5c9dd0051 100644 --- a/.github/ISSUE_TEMPLATE/browser.yml +++ b/.github/ISSUE_TEMPLATE/browser.yml @@ -1,4 +1,4 @@ -name: Browser Bug Report +name: Browser Extension Bug Report description: File a bug report labels: [bug, browser] body: diff --git a/.github/ISSUE_TEMPLATE/desktop.yml b/.github/ISSUE_TEMPLATE/desktop.yml index 6fd6f1d1c2b..129ba510664 100644 --- a/.github/ISSUE_TEMPLATE/desktop.yml +++ b/.github/ISSUE_TEMPLATE/desktop.yml @@ -73,6 +73,7 @@ body: - Homebrew - Chocolatey - Snap + - Flatpak - Other validations: required: true diff --git a/.github/ISSUE_TEMPLATE/web.yml b/.github/ISSUE_TEMPLATE/web.yml index 80429112fbd..d7989e40af1 100644 --- a/.github/ISSUE_TEMPLATE/web.yml +++ b/.github/ISSUE_TEMPLATE/web.yml @@ -1,4 +1,4 @@ -name: Web Bug Report +name: Web App Bug Report description: File a bug report labels: [bug, web] body: @@ -77,6 +77,7 @@ body: - Opera - Brave - Vivaldi + - DuckDuckGo validations: required: true - type: input diff --git a/.github/codecov.yml b/.github/codecov.yml index d9d59f9de28..ba4c4b48163 100644 --- a/.github/codecov.yml +++ b/.github/codecov.yml @@ -44,6 +44,7 @@ component_management: - component_id: key-management-keys name: Key Management - Keys paths: + - apps/desktop/src/key-management/electron-key.service.ts - libs/key-management/src/kdf-config.service.ts - libs/key-management/src/key.service.ts - libs/common/src/key-management/master-password/** diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 8ad9ad1b360..906bbbd7125 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -144,6 +144,10 @@ "@electron/notarize", "@electron/rebuild", "@ngtools/webpack", + "@nx/devkit", + "@nx/eslint", + "@nx/jest", + "@nx/js", "@types/chrome", "@types/firefox-webext-browser", "@types/glob", @@ -210,6 +214,7 @@ "simplelog", "style-loader", "sysinfo", + "ts-node", "ts-loader", "tsconfig-paths-webpack-plugin", "type-fest", @@ -393,17 +398,7 @@ reviewers: ["team:team-vault-dev"], }, { - matchPackageNames: [ - "@types/argon2-browser", - "aes", - "argon2", - "argon2-browser", - "big-integer", - "cbc", - "rsa", - "russh-cryptovec", - "sha2", - ], + matchPackageNames: ["aes", "big-integer", "cbc", "rsa", "russh-cryptovec", "sha2"], description: "Key Management owned dependencies", commitMessagePrefix: "[deps] KM:", reviewers: ["team:team-key-management-dev"], diff --git a/.github/whitelist-capital-letters.txt b/.github/whitelist-capital-letters.txt index 653f6591c7f..db5097e5268 100644 --- a/.github/whitelist-capital-letters.txt +++ b/.github/whitelist-capital-letters.txt @@ -34,3 +34,4 @@ ./apps/browser/src/safari/safari/Info.plist ./apps/browser/src/safari/desktop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ./SECURITY.md +./libs/nx-plugin/src/generators/files/README.md__tmpl__ diff --git a/.github/workflows/alert-ddg-files-modified.yml b/.github/workflows/alert-ddg-files-modified.yml new file mode 100644 index 00000000000..61bb7f1e8af --- /dev/null +++ b/.github/workflows/alert-ddg-files-modified.yml @@ -0,0 +1,50 @@ +name: DDG File Change Monitor + +on: + pull_request: + branches: [ main ] + types: [ opened, synchronize ] + +jobs: + check-files: + name: Check files + runs-on: ubuntu-22.04 + permissions: + contents: read + pull-requests: write + steps: + - name: Checkout code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Get changed files + id: changed-files + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + with: + list-files: shell + filters: | + monitored: + - 'apps/desktop/native-messaging-test-runner/**' + - 'apps/desktop/src/services/duckduckgo-message-handler.service.ts' + - 'apps/desktop/src/services/encrypted-message-handler.service.ts' + + - name: Comment on PR if monitored files changed + if: steps.changed-files.outputs.monitored == 'true' + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const changedFiles = `${{ steps.changed-files.outputs.monitored_files }}`.split(' ').filter(file => file.trim() !== ''); + + const message = `⚠️🦆 **DuckDuckGo Integration files have been modified in this PR:** + + ${changedFiles.map(file => `- \`${file}\``).join('\n')} + + Please run the DuckDuckGo native messaging test runner from this branch using [these instructions](https://contributing.bitwarden.com/getting-started/clients/desktop/native-messaging-test-runner) and ensure it functions properly.`; + + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: message + }); diff --git a/.github/workflows/auto-branch-updater.yml b/.github/workflows/auto-branch-updater.yml index dc4a43fc34e..3f67388fd0c 100644 --- a/.github/workflows/auto-branch-updater.yml +++ b/.github/workflows/auto-branch-updater.yml @@ -22,6 +22,8 @@ jobs: env: _BOT_EMAIL: 106330231+bitwarden-devops-bot@users.noreply.github.com _BOT_NAME: bitwarden-devops-bot + permissions: + contents: write steps: - name: Setup id: setup diff --git a/.github/workflows/auto-reply-discussions.yml b/.github/workflows/auto-reply-discussions.yml index 8becc7471c5..83970ab3619 100644 --- a/.github/workflows/auto-reply-discussions.yml +++ b/.github/workflows/auto-reply-discussions.yml @@ -8,6 +8,9 @@ jobs: reply: name: Auto-reply runs-on: ubuntu-22.04 + permissions: + discussions: write + contents: read steps: - name: Get discussion label and template name diff --git a/.github/workflows/build-browser-target.yml b/.github/workflows/build-browser-target.yml index a2ae48d419b..e89a41c1009 100644 --- a/.github/workflows/build-browser-target.yml +++ b/.github/workflows/build-browser-target.yml @@ -28,6 +28,8 @@ jobs: check-run: name: Check PR run uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + permissions: + contents: read run-workflow: name: Build Browser @@ -35,4 +37,8 @@ jobs: if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} uses: ./.github/workflows/build-browser.yml secrets: inherit + permissions: + contents: write + pull-requests: write + id-token: write diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index f7b8eeabefe..be140b9a20e 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -41,6 +41,9 @@ defaults: run: shell: bash +permissions: + contents: read + jobs: setup: name: Setup @@ -75,10 +78,8 @@ jobs: - name: Check secrets id: check-secrets - env: - AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} run: | - has_secrets=${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL != '' }} + has_secrets=${{ secrets.AZURE_CLIENT_ID != '' }} echo "has_secrets=$has_secrets" >> $GITHUB_OUTPUT @@ -161,10 +162,6 @@ jobs: FILES=$(find . -maxdepth 1 -type f) for FILE in $FILES; do cp "$FILE" browser-source/; done - # Copy patches to the Browser source directory - mkdir -p browser-source/patches - cp -r patches/* browser-source/patches - # Copy apps/browser to the Browser source directory mkdir -p browser-source/apps/browser cp -r apps/browser/* browser-source/apps/browser @@ -266,6 +263,29 @@ jobs: working-directory: browser-source/ run: npm link ../sdk-internal + - name: Check source file size + if: ${{ startsWith(matrix.name, 'firefox') }} + run: | + # Declare variable as indexed array + declare -a FILES + + # Search for source files that are greater than 5M + TARGET_DIR='./browser-source/apps/browser' + while IFS=' ' read -r RESULT; do + FILES+=("$RESULT") + done < <(find $TARGET_DIR -size +5M) + + # Validate results and provide messaging + if [[ ${#FILES[@]} -ne 0 ]]; then + echo "File(s) exceeds size limit: 5MB" + for FILE in ${FILES[@]}; do + echo "- $(du --si $FILE)" + done + echo "ERROR Firefox rejects extension uploads that contain files larger than 5MB" + # Invoke failure + exit 1 + fi + - name: Build extension run: npm run ${{ matrix.npm_command }} working-directory: browser-source/apps/browser @@ -281,6 +301,9 @@ jobs: build-safari: name: Build Safari runs-on: macos-13 + permissions: + contents: read + id-token: write needs: - setup - locales-test @@ -306,10 +329,19 @@ jobs: node --version npm --version - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "KEYCHAIN-PASSWORD" - name: Download Provisioning Profiles secrets env: @@ -345,9 +377,12 @@ jobs: az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Set up keychain env: - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain @@ -419,6 +454,10 @@ jobs: name: Crowdin Push if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' runs-on: ubuntu-22.04 + permissions: + contents: write + pull-requests: write + id-token: write needs: - build - build-safari @@ -428,10 +467,12 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -440,8 +481,11 @@ jobs: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Upload Sources - uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 + uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -457,6 +501,9 @@ jobs: name: Check for failures if: always() runs-on: ubuntu-22.04 + permissions: + contents: read + id-token: write needs: - setup - locales-test @@ -472,11 +519,13 @@ jobs: && contains(needs.*.result, 'failure') run: exit 1 - - name: Login to Azure - Prod Subscription - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure if: failure() + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -486,6 +535,10 @@ jobs: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" + - name: Log out from Azure + if: failure() + uses: bitwarden/gh-actions/azure-logout@main + - name: Notify Slack on failure uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() diff --git a/.github/workflows/build-cli-target.yml b/.github/workflows/build-cli-target.yml index 6b493d4e6d9..54865ddaddd 100644 --- a/.github/workflows/build-cli-target.yml +++ b/.github/workflows/build-cli-target.yml @@ -28,6 +28,8 @@ jobs: check-run: name: Check PR run uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + permissions: + contents: read run-workflow: name: Build CLI @@ -35,4 +37,7 @@ jobs: if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} uses: ./.github/workflows/build-cli.yml secrets: inherit + permissions: + contents: read + id-token: write diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index e89ca59a297..73b765f207a 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -46,10 +46,13 @@ defaults: run: working-directory: apps/cli +permissions: + contents: read + jobs: setup: name: Setup - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 outputs: package_version: ${{ steps.retrieve-package-version.outputs.package_version }} node_version: ${{ steps.retrieve-node-version.outputs.node_version }} @@ -58,7 +61,7 @@ jobs: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - ref: ${{ github.event.pull_request.head.sha }} + ref: ${{ github.event.pull_request.head.sha }} - name: Get Package Version id: retrieve-package-version @@ -76,41 +79,43 @@ jobs: - name: Check secrets id: check-secrets - env: - AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} run: | - has_secrets=${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL != '' }} + has_secrets=${{ secrets.AZURE_CLIENT_ID != '' }} echo "has_secrets=$has_secrets" >> $GITHUB_OUTPUT + cli: name: CLI ${{ matrix.os.base }}${{ matrix.os.target_suffix }} - ${{ matrix.license_type.readable }} strategy: matrix: os: - [ - { base: "linux", distro: "ubuntu-22.04", target_suffix: "" }, - { base: "linux", distro: "ubuntu-22.04-arm", target_suffix: "-arm64" }, - { base: "mac", distro: "macos-13", target_suffix: "" }, - { base: "mac", distro: "macos-14", target_suffix: "-arm64" } - ] + [ + { base: "linux", distro: "ubuntu-22.04", target_suffix: "" }, + { base: "linux", distro: "ubuntu-22.04-arm", target_suffix: "-arm64" }, + { base: "mac", distro: "macos-13", target_suffix: "" }, + { base: "mac", distro: "macos-14", target_suffix: "-arm64" } + ] license_type: [ { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, { build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } ] runs-on: ${{ matrix.os.distro }} - needs: - - setup + needs: setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} - _WIN_PKG_FETCH_VERSION: 20.11.1 + _WIN_PKG_FETCH_VERSION: 22.15.1 _WIN_PKG_VERSION: 3.5 + permissions: + contents: read + id-token: write + steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - ref: ${{ github.event.pull_request.head.sha }} + ref: ${{ github.event.pull_request.head.sha }} - name: Setup Unix Vars run: | @@ -152,11 +157,82 @@ jobs: - name: Build & Package Unix run: npm run dist:${{ matrix.license_type.build_prefix }}:${{ env.SHORT_RUNNER_OS }}${{ matrix.os.target_suffix }} --quiet + - name: Login to Azure + if: ${{ matrix.os.base == 'mac' && needs.setup.outputs.has_secrets == 'true' }} + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get certificates + if: ${{ matrix.os.base == 'mac' && needs.setup.outputs.has_secrets == 'true' }} + run: | + mkdir -p $HOME/certificates + + az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/devid-app-cert | + jq -r .value | base64 -d > $HOME/certificates/devid-app-cert.p12 + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + if: ${{ matrix.os.base == 'mac' && needs.setup.outputs.has_secrets == 'true' }} + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "KEYCHAIN-PASSWORD,APP-STORE-CONNECT-AUTH-KEY,APP-STORE-CONNECT-TEAM-ISSUER" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + + - name: Set up keychain + if: ${{ matrix.os.base == 'mac' && needs.setup.outputs.has_secrets == 'true' }} + env: + KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} + run: | + security create-keychain -p $KEYCHAIN_PASSWORD build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p $KEYCHAIN_PASSWORD build.keychain + security set-keychain-settings -lut 1200 build.keychain + + security import "$HOME/certificates/devid-app-cert.p12" -k build.keychain -P "" \ + -T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productbuild + + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $KEYCHAIN_PASSWORD build.keychain + + - name: Sign binary + if: ${{ matrix.os.base == 'mac' && needs.setup.outputs.has_secrets == 'true' }} + env: + MACOS_CERTIFICATE_NAME: "Developer ID Application: 8bit Solutions LLC" + run: codesign --sign "$MACOS_CERTIFICATE_NAME" --verbose=3 --force --options=runtime --entitlements ./entitlements.plist --timestamp ./dist/${{ matrix.license_type.build_prefix }}/${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}/bw + - name: Zip Unix run: | cd ./dist/${{ matrix.license_type.build_prefix }}/${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }} zip ../../bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-${{ env._PACKAGE_VERSION }}.zip ./bw + - name: Set up private auth key + if: ${{ matrix.os.base == 'mac' && needs.setup.outputs.has_secrets == 'true' }} + run: | + mkdir ~/private_keys + cat << EOF > ~/private_keys/AuthKey_6TV9MKN3GP.p8 + ${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-AUTH-KEY }} + EOF + + - name: Notarize app + if: ${{ matrix.os.base == 'mac' && needs.setup.outputs.has_secrets == 'true' }} + env: + APP_STORE_CONNECT_TEAM_ISSUER: ${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-TEAM-ISSUER }} + APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP + APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 + run: | + echo "Create keychain profile" + xcrun notarytool store-credentials "notarytool-profile" --key-id "$APP_STORE_CONNECT_AUTH_KEY" --key "$APP_STORE_CONNECT_AUTH_KEY_PATH" --issuer "$APP_STORE_CONNECT_TEAM_ISSUER" + + codesign --sign "Developer ID Application: 8bit Solutions LLC" --verbose=3 --force --options=runtime --timestamp ./dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-${{ env._PACKAGE_VERSION }}.zip + + echo "Notarize app" + xcrun notarytool submit ./dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-${{ env._PACKAGE_VERSION }}.zip --keychain-profile "notarytool-profile" --wait + - name: Version Test run: | unzip "./dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-${{ env._PACKAGE_VERSION }}.zip" -d "./test" @@ -168,13 +244,6 @@ jobs: exit 1 fi - - name: Create checksums Unix - run: | - cd ./dist - shasum -a 256 bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-${{ env._PACKAGE_VERSION }}.zip \ - | awk '{split($0, a); print a[1]}' > bw${{ - matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-sha256-${{ env._PACKAGE_VERSION }}.txt - - name: Upload unix zip asset uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: @@ -182,12 +251,21 @@ jobs: path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - - name: Upload unix checksum asset - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 - with: - name: bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-${{ env.LOWER_RUNNER_OS }}${{ matrix.os.target_suffix }}-sha256-${{ env._PACKAGE_VERSION }}.txt - if-no-files-found: error + # We want to confirm the CLI is runnable using the dependencies defined in `apps/cli/package.json`. + - name: Remove node_modules (root) + run: rm -rf node_modules + working-directory: ./ + + - name: Remove package.json (root) + run: rm package.json + working-directory: ./ + + - name: Install (CLI) + run: npm i + + - name: Output help + run: node ./build/bw.js --help + cli-windows: name: Windows - ${{ matrix.license_type.readable }} @@ -199,12 +277,14 @@ jobs: { build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } ] runs-on: windows-2022 - needs: - - setup + permissions: + contents: read + id-token: write + needs: setup env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} - _WIN_PKG_FETCH_VERSION: 20.11.1 + _WIN_PKG_FETCH_VERSION: 22.15.1 _WIN_PKG_VERSION: 3.5 steps: - name: Check out repo @@ -283,11 +363,13 @@ jobs: ResourceHacker -open version-info.rc -save version-info.res -action compile ResourceHacker -open %WIN_PKG_BUILT% -save %WIN_PKG_BUILT% -action addoverwrite -resource version-info.res - - name: Login to Azure + - name: Log in to Azure if: ${{ needs.setup.outputs.has_secrets == 'true' }} - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -301,6 +383,10 @@ jobs: code-signing-client-secret, code-signing-cert-name" + - name: Log out from Azure + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + uses: bitwarden/gh-actions/azure-logout@main + - name: Install run: npm ci working-directory: ./ @@ -364,11 +450,6 @@ jobs: Throw "Version test failed." } - - name: Create checksums Windows - run: | - checksum -f="./dist/bw${{ matrix.license_type.artifact_prefix }}-windows-${env:_PACKAGE_VERSION}.zip" ` - -t sha256 | Out-File -Encoding ASCII ./dist/bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${env:_PACKAGE_VERSION}.txt - - name: Upload windows zip asset uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: @@ -376,13 +457,6 @@ jobs: path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-windows-${{ env._PACKAGE_VERSION }}.zip if-no-files-found: error - - name: Upload windows checksum asset - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 - with: - name: bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/bw${{ matrix.license_type.artifact_prefix }}-windows-sha256-${{ env._PACKAGE_VERSION }}.txt - if-no-files-found: error - - name: Upload Chocolatey asset if: matrix.license_type.build_prefix == 'bit' uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 @@ -442,13 +516,6 @@ jobs: with: path: apps/cli/dist/snap - - name: Create checksum - run: | - cd dist/snap - ls -alth - sha256sum bw_${{ env._PACKAGE_VERSION }}_amd64.snap \ - | awk '{split($0, a); print a[1]}' > bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt - - name: Install Snap run: sudo snap install dist/snap/bw*.snap --dangerous @@ -473,18 +540,14 @@ jobs: path: apps/cli/dist/snap/bw_${{ env._PACKAGE_VERSION }}_amd64.snap if-no-files-found: error - - name: Upload snap checksum asset - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 - with: - name: bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt - path: apps/cli/dist/snap/bw-snap-sha256-${{ env._PACKAGE_VERSION }}.txt - if-no-files-found: error - check-failures: name: Check for failures if: always() - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 + permissions: + contents: read + id-token: write needs: - setup - cli @@ -499,11 +562,13 @@ jobs: && contains(needs.*.result, 'failure') run: exit 1 - - name: Login to Azure - Prod Subscription - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure if: failure() + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -513,6 +578,10 @@ jobs: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" + - name: Log out from Azure + if: failure() + uses: bitwarden/gh-actions/azure-logout@main + - name: Notify Slack on failure uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() diff --git a/.github/workflows/build-desktop-target.yml b/.github/workflows/build-desktop-target.yml index fa21b3fe5d9..96a0e6880f8 100644 --- a/.github/workflows/build-desktop-target.yml +++ b/.github/workflows/build-desktop-target.yml @@ -28,6 +28,8 @@ jobs: check-run: name: Check PR run uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + permissions: + contents: read run-workflow: name: Build Desktop @@ -35,4 +37,8 @@ jobs: if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} uses: ./.github/workflows/build-desktop.yml secrets: inherit + permissions: + contents: write + pull-requests: write + id-token: write diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index fab0df693cb..366d439fb45 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -46,6 +46,9 @@ defaults: run: shell: bash +permissions: + contents: read + jobs: electron-verify: name: Verify Electron Version @@ -144,10 +147,8 @@ jobs: - name: Check secrets id: check-secrets - env: - AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} run: | - has_secrets=${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL != '' }} + has_secrets=${{ secrets.AZURE_CLIENT_ID != '' }} echo "has_secrets=$has_secrets" >> $GITHUB_OUTPUT linux: @@ -401,6 +402,9 @@ jobs: runs-on: windows-2022 needs: - setup + permissions: + contents: read + id-token: write defaults: run: shell: pwsh @@ -425,7 +429,7 @@ jobs: - name: Install AST run: dotnet tool install --global AzureSignTool --version 4.0.1 - - name: Set up environmentF + - name: Set up environment run: choco install checksum --no-progress - name: Print environment @@ -435,11 +439,13 @@ jobs: choco --version rustup show - - name: Login to Azure + - name: Log in to Azure if: ${{ needs.setup.outputs.has_secrets == 'true' }} - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -453,6 +459,10 @@ jobs: code-signing-client-secret, code-signing-cert-name" + - name: Log out from Azure + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + uses: bitwarden/gh-actions/azure-logout@main + - name: Install Node dependencies run: npm ci working-directory: ./ @@ -499,7 +509,7 @@ jobs: run: | npm run pack:win - - name: Pack & Sign (dev) + - name: Pack & Sign if: ${{ needs.setup.outputs.has_secrets == 'true' }} env: ELECTRON_BUILDER_SIGN: 1 @@ -652,6 +662,9 @@ jobs: runs-on: macos-13 needs: - setup + permissions: + contents: read + id-token: write env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} @@ -697,11 +710,21 @@ jobs: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Login to Azure + - name: Log in to Azure if: ${{ needs.setup.outputs.has_secrets == 'true' }} - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "KEYCHAIN-PASSWORD" - name: Download Provisioning Profiles secrets if: ${{ needs.setup.outputs.has_secrets == 'true' }} @@ -744,10 +767,14 @@ jobs: az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 + - name: Log out from Azure + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + uses: bitwarden/gh-actions/azure-logout@main + - name: Set up keychain if: ${{ needs.setup.outputs.has_secrets == 'true' }} env: - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain @@ -847,6 +874,10 @@ jobs: if: ${{ needs.setup.outputs.has_secrets == 'true' }} uses: ./.github/workflows/build-browser.yml secrets: inherit + permissions: + contents: write + pull-requests: write + id-token: write macos-package-github: @@ -857,6 +888,9 @@ jobs: - browser-build - macos-build - setup + permissions: + contents: read + id-token: write env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} @@ -902,10 +936,19 @@ jobs: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "KEYCHAIN-PASSWORD,APP-STORE-CONNECT-AUTH-KEY,APP-STORE-CONNECT-TEAM-ISSUER" - name: Download Provisioning Profiles secrets env: @@ -946,9 +989,12 @@ jobs: az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Set up keychain env: - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain @@ -1052,12 +1098,12 @@ jobs: run: | mkdir ~/private_keys cat << EOF > ~/private_keys/AuthKey_6TV9MKN3GP.p8 - ${{ secrets.APP_STORE_CONNECT_AUTH_KEY }} + ${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-AUTH-KEY }} EOF - name: Build application (dist) env: - APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + APP_STORE_CONNECT_TEAM_ISSUER: ${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-TEAM-ISSUER }} APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 CSC_FOR_PULL_REQUEST: true @@ -1100,6 +1146,9 @@ jobs: - browser-build - macos-build - setup + permissions: + contents: read + id-token: write env: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} @@ -1145,10 +1194,19 @@ jobs: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "KEYCHAIN-PASSWORD,APP-STORE-CONNECT-AUTH-KEY,APP-STORE-CONNECT-TEAM-ISSUER" - name: Retrieve Slack secret id: retrieve-slack-secret @@ -1196,9 +1254,12 @@ jobs: az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Set up keychain env: - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain @@ -1302,12 +1363,12 @@ jobs: run: | mkdir ~/private_keys cat << EOF > ~/private_keys/AuthKey_6TV9MKN3GP.p8 - ${{ secrets.APP_STORE_CONNECT_AUTH_KEY }} + ${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-AUTH-KEY }} EOF - name: Build application for App Store env: - APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + APP_STORE_CONNECT_TEAM_ISSUER: ${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-TEAM-ISSUER }} APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP APP_STORE_CONNECT_AUTH_KEY_PATH: ~/private_keys/AuthKey_6TV9MKN3GP.p8 CSC_FOR_PULL_REQUEST: true @@ -1331,7 +1392,7 @@ jobs: cat << EOF > ~/secrets/appstoreconnect-fastlane.json { - "issuer_id": "${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }}", + "issuer_id": "${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-TEAM-ISSUER }}", "key_id": "6TV9MKN3GP", "key": "$KEY_WITHOUT_NEWLINES" } @@ -1343,7 +1404,7 @@ jobs: github.event_name != 'pull_request_target' && (inputs.testflight_distribute || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/rc' || github.ref == 'refs/heads/hotfix-rc-desktop') env: - APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + APP_STORE_CONNECT_TEAM_ISSUER: ${{ steps.get-kv-secrets.outputs.APP-STORE-CONNECT-TEAM-ISSUER }} APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP BRANCH: ${{ github.ref }} run: | @@ -1393,6 +1454,10 @@ jobs: - windows - macos-package-github - macos-package-mas + permissions: + contents: write + pull-requests: write + id-token: write runs-on: ubuntu-22.04 steps: - name: Check out repo @@ -1400,10 +1465,12 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -1412,8 +1479,11 @@ jobs: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Upload Sources - uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 + uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -1439,6 +1509,9 @@ jobs: - macos-package-github - macos-package-mas - crowdin-push + permissions: + contents: read + id-token: write steps: - name: Check if any job failed if: | @@ -1447,11 +1520,13 @@ jobs: && contains(needs.*.result, 'failure') run: exit 1 - - name: Login to Azure - Prod Subscription - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure if: failure() + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -1461,6 +1536,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Notify Slack on failure uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() @@ -1468,3 +1546,4 @@ jobs: SLACK_WEBHOOK_URL: ${{ steps.retrieve-secrets.outputs.devops-alerts-slack-webhook-url }} with: status: ${{ job.status }} + diff --git a/.github/workflows/build-web-target.yml b/.github/workflows/build-web-target.yml index ca10e6d46f2..2f9e201ac60 100644 --- a/.github/workflows/build-web-target.yml +++ b/.github/workflows/build-web-target.yml @@ -27,6 +27,8 @@ jobs: check-run: name: Check PR run uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + permissions: + contents: read run-workflow: name: Build Web @@ -34,4 +36,9 @@ jobs: if: ${{ github.event.pull_request.head.repo.full_name != github.repository }} uses: ./.github/workflows/build-web.yml secrets: inherit + permissions: + contents: write + pull-requests: write + id-token: write + security-events: write diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 019647f594a..f00ae07fba3 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -51,6 +51,9 @@ env: _AZ_REGISTRY: bitwardenprod.azurecr.io _GITHUB_PR_REPO_NAME: ${{ github.event.pull_request.head.repo.full_name }} +permissions: + contents: read + jobs: setup: name: Setup @@ -78,10 +81,8 @@ jobs: - name: Check secrets id: check-secrets - env: - AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} run: | - has_secrets=${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL != '' }} + has_secrets=${{ secrets.AZURE_CLIENT_ID != '' }} echo "has_secrets=$has_secrets" >> $GITHUB_OUTPUT @@ -202,11 +203,13 @@ jobs: uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 ########## ACRs ########## - - name: Login to Prod Azure + - name: Log in to Azure if: ${{ needs.setup.outputs.has_secrets == 'true' }} - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Log into Prod container registry if: ${{ needs.setup.outputs.has_secrets == 'true' }} @@ -277,7 +280,7 @@ jobs: IMAGE_NAME: ${{ steps.image-name.outputs.name }} run: | mkdir build - docker run --rm --volume $(pwd)/build:/temp --entrypoint bash \ + docker run --rm --volume $(pwd)/build:/temp --entrypoint sh \ $IMAGE_NAME -c "cp -r ./ /temp" zip -r web-${{ env._VERSION }}-${{ matrix.artifact_name }}.zip build @@ -326,11 +329,19 @@ jobs: - name: Log out of Docker run: docker logout $_AZ_REGISTRY + - name: Log out from Azure + if: ${{ needs.setup.outputs.has_secrets == 'true' }} + uses: bitwarden/gh-actions/azure-logout@main + crowdin-push: name: Crowdin Push if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' needs: build-containers + permissions: + contents: write + pull-requests: write + id-token: write runs-on: ubuntu-24.04 steps: - name: Check out repo @@ -338,10 +349,12 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -350,8 +363,11 @@ jobs: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Upload Sources - uses: crowdin/github-action@30849777a3cba6ee9a09e24e195272b8287a0a5b # v1.20.4 + uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} @@ -368,11 +384,15 @@ jobs: if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' runs-on: ubuntu-24.04 needs: build-containers + permissions: + id-token: write steps: - - name: Login to Azure - CI Subscription - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve github PAT secrets id: retrieve-secret-pat @@ -381,6 +401,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "github-pat-bitwarden-devops-bot-repo-scope" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Trigger web vault deploy using GitHub Run ID uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: @@ -407,6 +430,8 @@ jobs: - build-containers - crowdin-push - trigger-web-vault-deploy + permissions: + id-token: write steps: - name: Check if any job failed if: | @@ -415,11 +440,13 @@ jobs: && contains(needs.*.result, 'failure') run: exit 1 - - name: Login to Azure - Prod Subscription - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main if: failure() with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -429,6 +456,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "devops-alerts-slack-webhook-url" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Notify Slack on failure uses: act10ns/slack@44541246747a30eb3102d87f7a4cc5471b0ffb7d # v2.1.0 if: failure() diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml index 78733bc5a8b..d0b9cab4c45 100644 --- a/.github/workflows/chromatic.yml +++ b/.github/workflows/chromatic.yml @@ -15,6 +15,8 @@ jobs: check-run: name: Check PR run uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + permissions: + contents: read chromatic: name: Chromatic @@ -23,6 +25,7 @@ jobs: permissions: contents: read pull-requests: write + id-token: write steps: - name: Check out repo @@ -30,13 +33,13 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 - + - name: Get changed files id: get-changed-files-for-chromatic uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 with: filters: | - storyFiles: + storyFiles: - "apps/!(cli)/**" - "bitwarden_license/bit-web/src/app/**" - "libs/!(eslint)/**" @@ -74,14 +77,34 @@ jobs: if: steps.get-changed-files-for-chromatic.outputs.storyFiles == 'true' run: npm run build-storybook:ci + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "CHROMATIC-PROJECT-TOKEN" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Publish to Chromatic uses: chromaui/action@e8cc4c31775280b175a3c440076c00d19a9014d7 # v11.28.2 with: token: ${{ secrets.GITHUB_TOKEN }} - projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + projectToken: ${{ steps.get-kv-secrets.outputs.CHROMATIC-PROJECT-TOKEN }} storybookBuildDir: ./storybook-static exitOnceUploaded: true onlyChanged: true - externals: "[\"libs/components/**/*.scss\", \"libs/components/**/*.css\", \"libs/components/tailwind.config*.js\"]" + externals: | + libs/components/**/*.scss + libs/components/**/*.css + libs/components/tailwind.config*.js # Rather than use an `if` check on the whole publish step, we need to tell Chromatic to skip so that any Chromatic-spawned actions are properly skipped skip: ${{ steps.get-changed-files-for-chromatic.outputs.storyFiles == 'false' }} diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 2fc035ec038..0b891203855 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -10,6 +10,9 @@ jobs: crowdin-sync: name: Autosync runs-on: ubuntu-24.04 + permissions: + contents: read + id-token: write strategy: fail-fast: false matrix: @@ -21,22 +24,19 @@ jobs: - app_name: web crowdin_project_id: "308189" steps: - - name: Generate GH App token - uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 - id: app-token + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - app-id: ${{ secrets.BW_GHAPP_ID }} - private-key: ${{ secrets.BW_GHAPP_KEY }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - - name: Checkout repo - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main with: - token: ${{ steps.app-token.outputs.token }} - - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + keyvault: gh-org-bitwarden + secrets: "BW-GHAPP-ID,BW-GHAPP-KEY" - name: Retrieve secrets id: retrieve-secrets @@ -45,6 +45,21 @@ jobs: keyvault: "bitwarden-ci" secrets: "crowdin-api-token, github-gpg-private-key, github-gpg-private-key-passphrase" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + + - name: Generate GH App token + uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 + id: app-token + with: + app-id: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-ID }} + private-key: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-KEY }} + + - name: Checkout repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + token: ${{ steps.app-token.outputs.token }} + - name: Download translations uses: bitwarden/gh-actions/crowdin@main env: diff --git a/.github/workflows/deploy-web.yml b/.github/workflows/deploy-web.yml index 1cde8dd636a..d3788dc77b9 100644 --- a/.github/workflows/deploy-web.yml +++ b/.github/workflows/deploy-web.yml @@ -66,9 +66,9 @@ jobs: environment_url: ${{ steps.config.outputs.environment_url }} environment_name: ${{ steps.config.outputs.environment_name }} environment_artifact: ${{ steps.config.outputs.environment_artifact }} - azure_login_creds: ${{ steps.config.outputs.azure_login_creds }} - retrive_secrets_keyvault: ${{ steps.config.outputs.retrive_secrets_keyvault }} - sync_utility: ${{ steps.config.outputs.sync_utility }} + azure_login_client_key_name: ${{ steps.config.outputs.azure_login_client_key_name }} + azure_login_subscription_id_key_name: ${{ steps.config.outputs.azure_login_subscription_id_key_name }} + retrieve_secrets_keyvault: ${{ steps.config.outputs.retrieve_secrets_keyvault }} sync_delete_destination_files: ${{ steps.config.outputs.sync_delete_destination_files }} slack_channel_name: ${{ steps.config.outputs.slack_channel_name }} steps: @@ -81,48 +81,51 @@ jobs: case ${{ inputs.environment }} in "USQA") - echo "azure_login_creds=AZURE_KV_US_QA_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT - echo "retrive_secrets_keyvault=bw-webvault-rlktusqa-kv" >> $GITHUB_OUTPUT + echo "azure_login_client_key_name=AZURE_CLIENT_ID_USQA" >> $GITHUB_OUTPUT + echo "azure_login_subscription_id_key_name=AZURE_SUBSCRIPTION_ID_USQA" >> $GITHUB_OUTPUT + echo "retrieve_secrets_keyvault=bw-webvault-rlktusqa-kv" >> $GITHUB_OUTPUT echo "environment_artifact=web-*-cloud-QA.zip" >> $GITHUB_OUTPUT echo "environment_name=Web Vault - US QA Cloud" >> $GITHUB_OUTPUT echo "environment_url=http://vault.$ENV_NAME_LOWER.bitwarden.pw" >> $GITHUB_OUTPUT echo "slack_channel_name=alerts-deploy-qa" >> $GITHUB_OUTPUT ;; "EUQA") - echo "azure_login_creds=AZURE_KV_EU_QA_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT - echo "retrive_secrets_keyvault=webvaulteu-westeurope-qa" >> $GITHUB_OUTPUT + echo "azure_login_client_key_name=AZURE_CLIENT_ID_EUQA" >> $GITHUB_OUTPUT + echo "azure_login_subscription_id_key_name=AZURE_SUBSCRIPTION_ID_EUQA" >> $GITHUB_OUTPUT + echo "retrieve_secrets_keyvault=webvaulteu-westeurope-qa" >> $GITHUB_OUTPUT echo "environment_artifact=web-*-cloud-euqa.zip" >> $GITHUB_OUTPUT echo "environment_name=Web Vault - EU QA Cloud" >> $GITHUB_OUTPUT echo "environment_url=http://vault.$ENV_NAME_LOWER.bitwarden.pw" >> $GITHUB_OUTPUT echo "slack_channel_name=alerts-deploy-qa" >> $GITHUB_OUTPUT ;; "USPROD") - echo "azure_login_creds=AZURE_KV_US_PROD_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT - echo "retrive_secrets_keyvault=bw-webvault-klrt-kv" >> $GITHUB_OUTPUT + echo "azure_login_client_key_name=AZURE_CLIENT_ID_USPROD" >> $GITHUB_OUTPUT + echo "azure_login_subscription_id_key_name=AZURE_SUBSCRIPTION_ID_USPROD" >> $GITHUB_OUTPUT + echo "retrieve_secrets_keyvault=bw-webvault-klrt-kv" >> $GITHUB_OUTPUT echo "environment_artifact=web-*-cloud-COMMERCIAL.zip" >> $GITHUB_OUTPUT echo "environment_name=Web Vault - US Production Cloud" >> $GITHUB_OUTPUT echo "environment_url=http://vault.bitwarden.com" >> $GITHUB_OUTPUT echo "slack_channel_name=alerts-deploy-prd" >> $GITHUB_OUTPUT ;; "EUPROD") - echo "azure_login_creds=AZURE_KV_EU_PRD_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT - echo "retrive_secrets_keyvault=webvault-westeurope-prod" >> $GITHUB_OUTPUT + echo "azure_login_client_key_name=AZURE_CLIENT_ID_EUPROD" >> $GITHUB_OUTPUT + echo "azure_login_subscription_id_key_name=AZURE_SUBSCRIPTION_ID_EUPROD" >> $GITHUB_OUTPUT + echo "retrieve_secrets_keyvault=webvault-westeurope-prod" >> $GITHUB_OUTPUT echo "environment_artifact=web-*-cloud-euprd.zip" >> $GITHUB_OUTPUT echo "environment_name=Web Vault - EU Production Cloud" >> $GITHUB_OUTPUT echo "environment_url=http://vault.bitwarden.eu" >> $GITHUB_OUTPUT echo "slack_channel_name=alerts-deploy-prd" >> $GITHUB_OUTPUT ;; "USDEV") - echo "azure_login_creds=AZURE_KV_US_DEV_SERVICE_PRINCIPAL" >> $GITHUB_OUTPUT - echo "retrive_secrets_keyvault=webvault-eastus-dev" >> $GITHUB_OUTPUT + echo "azure_login_client_key_name=AZURE_CLIENT_ID_USDEV" >> $GITHUB_OUTPUT + echo "azure_login_subscription_id_key_name=AZURE_SUBSCRIPTION_ID_USDEV" >> $GITHUB_OUTPUT + echo "retrieve_secrets_keyvault=webvault-eastus-dev" >> $GITHUB_OUTPUT echo "environment_artifact=web-*-cloud-usdev.zip" >> $GITHUB_OUTPUT echo "environment_name=Web Vault - US Development Cloud" >> $GITHUB_OUTPUT echo "environment_url=http://vault.$ENV_NAME_LOWER.bitwarden.pw" >> $GITHUB_OUTPUT echo "slack_channel_name=alerts-deploy-dev" >> $GITHUB_OUTPUT ;; esac - # Set the sync utility to use for deployment to the environment (az-sync or azcopy) - echo "sync_utility=azcopy" >> $GITHUB_OUTPUT - name: Environment Protection env: @@ -180,6 +183,9 @@ jobs: name: Check if Web artifact is present runs-on: ubuntu-22.04 needs: setup + permissions: + contents: read + id-token: write env: _ENVIRONMENT_ARTIFACT: ${{ needs.setup.outputs.environment_artifact }} outputs: @@ -209,11 +215,13 @@ jobs: branch: ${{ inputs.branch-or-tag }} artifacts: ${{ env._ENVIRONMENT_ARTIFACT }} - - name: Login to Azure + - name: Log in to Azure if: ${{ steps.download-latest-artifacts.outcome == 'failure' }} - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets for Build trigger if: ${{ steps.download-latest-artifacts.outcome == 'failure' }} @@ -223,6 +231,10 @@ jobs: keyvault: "bitwarden-ci" secrets: "github-pat-bitwarden-devops-bot-repo-scope" + - name: Log out from Azure + if: ${{ steps.download-latest-artifacts.outcome == 'failure' }} + uses: bitwarden/gh-actions/azure-logout@main + - name: 'Trigger build web for missing branch/tag ${{ inputs.branch-or-tag }}' if: ${{ steps.download-latest-artifacts.outcome == 'failure' }} uses: convictional/trigger-workflow-and-wait@f69fa9eedd3c62a599220f4d5745230e237904be # v1.6.5 @@ -262,6 +274,8 @@ jobs: - artifact-check runs-on: ubuntu-22.04 if: ${{ always() && ( contains( inputs.environment , 'QA' ) || contains( inputs.environment , 'DEV' ) ) }} + permissions: + id-token: write outputs: channel_id: ${{ steps.slack-message.outputs.channel_id }} ts: ${{ steps.slack-message.outputs.ts }} @@ -277,7 +291,9 @@ jobs: event: 'start' commit-sha: ${{ needs.artifact-check.outputs.artifact_build_commit }} url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }} - AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} update-summary: name: Display commit @@ -302,6 +318,9 @@ jobs: _ENVIRONMENT_URL: ${{ needs.setup.outputs.environment_url }} _ENVIRONMENT_NAME: ${{ needs.setup.outputs.environment_name }} _ENVIRONMENT_ARTIFACT: ${{ needs.setup.outputs.environment_artifact }} + permissions: + id-token: write + deployments: write steps: - name: Create GitHub deployment uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 @@ -309,33 +328,12 @@ jobs: with: token: '${{ secrets.GITHUB_TOKEN }}' initial-status: 'in_progress' - environment_url: ${{ env._ENVIRONMENT_URL }} + environment-url: ${{ env._ENVIRONMENT_URL }} environment: ${{ env._ENVIRONMENT_NAME }} task: 'deploy' description: 'Deployment from branch/tag: ${{ inputs.branch-or-tag }}' ref: ${{ needs.artifact-check.outputs.artifact_build_commit }} - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 - with: - creds: ${{ secrets[needs.setup.outputs.azure_login_creds] }} - - - name: Retrieve Storage Account connection string for az sync - if: ${{ needs.setup.outputs.sync_utility == 'az-sync' }} - id: retrieve-secrets-az-sync - uses: bitwarden/gh-actions/get-keyvault-secrets@main - with: - keyvault: ${{ needs.setup.outputs.retrive_secrets_keyvault }} - secrets: "sa-bitwarden-web-vault-dev-key-temp" - - - name: Retrieve Storage Account name and SPN credentials for azcopy - if: ${{ needs.setup.outputs.sync_utility == 'azcopy' }} - id: retrieve-secrets-azcopy - uses: bitwarden/gh-actions/get-keyvault-secrets@main - with: - keyvault: ${{ needs.setup.outputs.retrive_secrets_keyvault }} - secrets: "sa-bitwarden-web-vault-name,sp-bitwarden-web-vault-password,sp-bitwarden-web-vault-appid,sp-bitwarden-web-vault-tenant" - - name: 'Download latest cloud asset using GitHub Run ID: ${{ inputs.build-web-run-id }}' if: ${{ inputs.build-web-run-id }} uses: bitwarden/gh-actions/download-artifacts@main @@ -362,28 +360,32 @@ jobs: working-directory: apps/web run: unzip ${{ env._ENVIRONMENT_ARTIFACT }} - - name: Sync to Azure Storage Account using az storage blob sync - if: ${{ needs.setup.outputs.sync_utility == 'az-sync' }} - working-directory: apps/web - run: | - az storage blob sync \ - --source "./build" \ - --container '$web' \ - --connection-string "${{ steps.retrieve-secrets-az-sync.outputs.sa-bitwarden-web-vault-dev-key-temp }}" \ - --delete-destination=${{ inputs.force-delete-destination }} + - name: Login to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets[needs.setup.outputs.azure_login_subscription_id_key_name] }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets[needs.setup.outputs.azure_login_client_key_name] }} + + - name: Retrieve Storage Account name + id: retrieve-secrets-azcopy + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: ${{ needs.setup.outputs.retrieve_secrets_keyvault }} + secrets: "sa-bitwarden-web-vault-name" - name: Sync to Azure Storage Account using azcopy - if: ${{ needs.setup.outputs.sync_utility == 'azcopy' }} working-directory: apps/web env: - AZCOPY_AUTO_LOGIN_TYPE: SPN - AZCOPY_SPA_APPLICATION_ID: ${{ steps.retrieve-secrets-azcopy.outputs.sp-bitwarden-web-vault-appid }} - AZCOPY_SPA_CLIENT_SECRET: ${{ steps.retrieve-secrets-azcopy.outputs.sp-bitwarden-web-vault-password }} - AZCOPY_TENANT_ID: ${{ steps.retrieve-secrets-azcopy.outputs.sp-bitwarden-web-vault-tenant }} + AZCOPY_AUTO_LOGIN_TYPE: AZCLI + AZCOPY_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} run: | azcopy sync ./build 'https://${{ steps.retrieve-secrets-azcopy.outputs.sa-bitwarden-web-vault-name }}.blob.core.windows.net/$web/' \ --delete-destination=${{ inputs.force-delete-destination }} --compare-hash="MD5" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Debug sync logs if: ${{ inputs.debug }} run: cat /home/runner/.azcopy/*.log @@ -397,7 +399,7 @@ jobs: uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' - environment_url: ${{ env._ENVIRONMENT_URL }} + environment-url: ${{ env._ENVIRONMENT_URL }} state: 'success' deployment-id: ${{ steps.deployment.outputs.deployment_id }} @@ -406,7 +408,7 @@ jobs: uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 with: token: '${{ secrets.GITHUB_TOKEN }}' - environment_url: ${{ env._ENVIRONMENT_URL }} + environment-url: ${{ env._ENVIRONMENT_URL }} state: 'failure' deployment-id: ${{ steps.deployment.outputs.deployment_id }} @@ -419,6 +421,8 @@ jobs: - notify-start - azure-deploy - artifact-check + permissions: + id-token: write steps: - name: Notify Slack with result uses: bitwarden/gh-actions/report-deployment-status-to-slack@main @@ -431,4 +435,6 @@ jobs: url: https://github.com/bitwarden/clients/actions/runs/${{ github.run_id }} commit-sha: ${{ needs.artifact-check.outputs.artifact_build_commit }} update-ts: ${{ needs.notify-start.outputs.ts }} - AZURE_KV_CI_SERVICE_PRINCIPAL: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} diff --git a/.github/workflows/enforce-labels.yml b/.github/workflows/enforce-labels.yml index 40ddfe7739f..12a771fd3c0 100644 --- a/.github/workflows/enforce-labels.yml +++ b/.github/workflows/enforce-labels.yml @@ -4,6 +4,9 @@ on: workflow_call: pull_request: types: [labeled, unlabeled, opened, edited, synchronize] +permissions: + contents: read + pull-requests: read jobs: enforce-label: name: EnforceLabel diff --git a/.github/workflows/lint-crowdin-config.yml b/.github/workflows/lint-crowdin-config.yml new file mode 100644 index 00000000000..38a3ef59ea7 --- /dev/null +++ b/.github/workflows/lint-crowdin-config.yml @@ -0,0 +1,55 @@ +name: Lint Crowdin Config + +on: + pull_request: + types: [opened, synchronize] + paths: + - '**/crowdin.yml' + +jobs: + lint-crowdin-config: + name: Lint Crowdin Config ${{ matrix.app.name }} + runs-on: ubuntu-24.04 + permissions: + contents: read + id-token: write + strategy: + matrix: + app: [ + { name: 'web', project_id: '308189', config_path: 'apps/web/crowdin.yml' }, + { name: 'desktop', project_id: '299360', config_path: 'apps/desktop/crowdin.yml' }, + { name: 'browser', project_id: '268134', config_path: 'apps/browser/crowdin.yml' } + ] + steps: + - name: Check out repo + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 1 + + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Retrieve secrets + id: retrieve-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: "bitwarden-ci" + secrets: "crowdin-api-token" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + + - name: Lint ${{ matrix.app.name }} config + uses: crowdin/github-action@f214c8723025f41fc55b2ad26e67b60b80b1885d # v2.7.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CROWDIN_PROJECT_ID: ${{ matrix.app.project_id }} + CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} + with: + dryrun_action: true + command: 'config lint' + command_args: '--verbose -c ${{ matrix.app.config_path }}' diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4fbef027c7c..4246d623f04 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -22,6 +22,9 @@ defaults: run: shell: bash +permissions: + contents: read + jobs: lint: name: Lint diff --git a/.github/workflows/locales-lint.yml b/.github/workflows/locales-lint.yml index 8c9447ea50f..0c8148d4c28 100644 --- a/.github/workflows/locales-lint.yml +++ b/.github/workflows/locales-lint.yml @@ -8,6 +8,9 @@ on: paths: - '**/messages.json' +permissions: + contents: read + jobs: lint: name: Lint diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml index d758e6f11c9..efb0f541d70 100644 --- a/.github/workflows/publish-cli.yml +++ b/.github/workflows/publish-cli.yml @@ -48,6 +48,10 @@ jobs: defaults: run: working-directory: . + permissions: + contents: read + deployments: write + steps: - name: Branch check if: ${{ inputs.publish_type != 'Dry Run' }} @@ -86,6 +90,10 @@ jobs: name: Deploy Snap runs-on: ubuntu-22.04 needs: setup + permissions: + contents: read + packages: read + id-token: write if: inputs.snap_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release_version }} @@ -93,10 +101,12 @@ jobs: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -105,6 +115,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "snapcraft-store-token" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Install Snap uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 @@ -123,6 +136,10 @@ jobs: name: Deploy Choco runs-on: windows-2022 needs: setup + permissions: + contents: read + packages: read + id-token: write if: inputs.choco_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release_version }} @@ -130,10 +147,12 @@ jobs: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -142,6 +161,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "cli-choco-api-key" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Setup Chocolatey run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ env: @@ -163,6 +185,10 @@ jobs: name: Publish NPM runs-on: ubuntu-22.04 needs: setup + permissions: + contents: read + packages: read + id-token: write if: inputs.npm_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release_version }} @@ -170,10 +196,12 @@ jobs: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -182,6 +210,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "npm-api-key" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Download and set up artifact run: | mkdir -p build @@ -210,6 +241,10 @@ jobs: - npm - snap - choco + permissions: + contents: read + deployments: write + if: ${{ always() && inputs.publish_type != 'Dry Run' }} steps: - name: Check if any job failed diff --git a/.github/workflows/publish-desktop.yml b/.github/workflows/publish-desktop.yml index ae631165db9..aafc4d25ed4 100644 --- a/.github/workflows/publish-desktop.yml +++ b/.github/workflows/publish-desktop.yml @@ -42,6 +42,9 @@ jobs: release_channel: ${{ steps.release_channel.outputs.channel }} tag_name: ${{ steps.version.outputs.tag_name }} deployment_id: ${{ steps.deployment.outputs.deployment_id }} + permissions: + contents: read + deployments: write steps: - name: Branch check if: ${{ inputs.publish_type != 'Dry Run' }} @@ -106,14 +109,21 @@ jobs: name: Electron blob publish runs-on: ubuntu-22.04 needs: setup + permissions: + contents: read + packages: read + id-token: write + deployments: write env: _PKG_VERSION: ${{ needs.setup.outputs.release_version }} _RELEASE_TAG: ${{ needs.setup.outputs.tag_name }} steps: - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -124,6 +134,9 @@ jobs: aws-electron-access-key, aws-electron-bucket-name" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Create artifacts directory run: mkdir -p apps/desktop/artifacts @@ -176,6 +189,9 @@ jobs: name: Deploy Snap runs-on: ubuntu-22.04 needs: setup + permissions: + contents: read + id-token: write if: inputs.snap_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release_version }} @@ -184,10 +200,12 @@ jobs: - name: Checkout Repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -196,6 +214,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "snapcraft-store-token" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Install Snap uses: samuelmeuli/action-snapcraft@d33c176a9b784876d966f80fb1b461808edc0641 # v2.1.1 @@ -220,6 +241,9 @@ jobs: name: Deploy Choco runs-on: windows-2022 needs: setup + permissions: + contents: read + id-token: write if: inputs.choco_publish env: _PKG_VERSION: ${{ needs.setup.outputs.release_version }} @@ -233,10 +257,12 @@ jobs: dotnet --version dotnet nuget --version - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -245,6 +271,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "cli-choco-api-key" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Setup Chocolatey run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/ env: @@ -271,6 +300,9 @@ jobs: - electron-blob - snap - choco + permissions: + contents: read + deployments: write if: ${{ always() && inputs.publish_type != 'Dry Run' }} steps: - name: Check if any job failed diff --git a/.github/workflows/publish-web.yml b/.github/workflows/publish-web.yml index 69b29086d36..a6f0f1be066 100644 --- a/.github/workflows/publish-web.yml +++ b/.github/workflows/publish-web.yml @@ -24,6 +24,8 @@ jobs: outputs: release_version: ${{ steps.version.outputs.version }} tag_version: ${{ steps.version.outputs.tag }} + permissions: + contents: read steps: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -52,6 +54,10 @@ jobs: name: Release self-host docker runs-on: ubuntu-22.04 needs: setup + permissions: + id-token: write + contents: read + deployments: write env: _BRANCH_NAME: ${{ github.ref_name }} _RELEASE_VERSION: ${{ needs.setup.outputs.release_version }} @@ -69,10 +75,12 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 ########## ACR ########## - - name: Login to Azure - PROD Subscription - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Login to Azure ACR run: az acr login -n bitwardenprod @@ -121,6 +129,9 @@ jobs: docker push $_AZ_REGISTRY/web-sh:latest fi + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Update deployment status to Success if: ${{ inputs.publish_type != 'Dry Run' && success() }} uses: chrnorm/deployment-status@9a72af4586197112e0491ea843682b5dc280d806 # v2.0.3 @@ -147,11 +158,15 @@ jobs: runs-on: ubuntu-22.04 needs: - setup + permissions: + id-token: write steps: - - name: Log in to Azure - CI subscription - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve GitHub PAT secrets id: retrieve-secret-pat @@ -160,6 +175,9 @@ jobs: keyvault: "bitwarden-ci" secrets: "github-pat-bitwarden-devops-bot-repo-scope" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Trigger self-host build uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: diff --git a/.github/workflows/release-browser.yml b/.github/workflows/release-browser.yml index 498f8748959..ac79287f84d 100644 --- a/.github/workflows/release-browser.yml +++ b/.github/workflows/release-browser.yml @@ -22,6 +22,8 @@ jobs: setup: name: Setup runs-on: ubuntu-22.04 + permissions: + contents: read outputs: release_version: ${{ steps.version.outputs.version }} steps: @@ -53,6 +55,8 @@ jobs: name: Locales Test runs-on: ubuntu-22.04 needs: setup + permissions: + contents: read steps: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -89,6 +93,8 @@ jobs: needs: - setup - locales-test + permissions: + contents: write steps: - name: Download latest Release build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index 519fee1989b..2d7be2e186e 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -18,6 +18,9 @@ defaults: run: working-directory: apps/cli +permissions: + contents: read + jobs: setup: name: Setup @@ -52,6 +55,8 @@ jobs: name: Release runs-on: ubuntu-22.04 needs: setup + permissions: + contents: write steps: - name: Download all Release artifacts if: ${{ inputs.release_type != 'Dry Run' }} @@ -78,24 +83,15 @@ jobs: PKG_VERSION: ${{ needs.setup.outputs.release_version }} with: artifacts: "apps/cli/bw-oss-windows-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-oss-windows-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-windows-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-windows-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-oss-macos-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-oss-macos-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-oss-macos-arm64-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-oss-macos-arm64-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-macos-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-macos-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-macos-arm64-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-macos-arm64-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-oss-linux-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-oss-linux-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bw-linux-${{ env.PKG_VERSION }}.zip, - apps/cli/bw-linux-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bitwarden-cli.${{ env.PKG_VERSION }}.nupkg, apps/cli/bw_${{ env.PKG_VERSION }}_amd64.snap, - apps/cli/bw-snap-sha256-${{ env.PKG_VERSION }}.txt, apps/cli/bitwarden-cli-${{ env.PKG_VERSION }}-npm-build.zip" commit: ${{ github.sha }} tag: cli-v${{ env.PKG_VERSION }} diff --git a/.github/workflows/release-desktop-beta.yml b/.github/workflows/release-desktop-beta.yml index a5e374395d8..e3eb9090cb7 100644 --- a/.github/workflows/release-desktop-beta.yml +++ b/.github/workflows/release-desktop-beta.yml @@ -15,6 +15,8 @@ jobs: setup: name: Setup runs-on: ubuntu-22.04 + permissions: + contents: write outputs: release_version: ${{ steps.version.outputs.version }} release_channel: ${{ steps.release_channel.outputs.channel }} @@ -115,6 +117,8 @@ jobs: name: Linux Build runs-on: ubuntu-22.04 needs: setup + permissions: + contents: read env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} @@ -204,6 +208,9 @@ jobs: name: Windows Build runs-on: windows-2022 needs: setup + permissions: + contents: read + id-token: write defaults: run: shell: pwsh @@ -237,10 +244,12 @@ jobs: npm --version choco --version - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -253,6 +262,9 @@ jobs: code-signing-client-secret, code-signing-cert-name" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Install Node dependencies run: npm ci working-directory: ./ @@ -394,6 +406,9 @@ jobs: name: MacOS Build runs-on: macos-13 needs: setup + permissions: + contents: read + id-token: write env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} @@ -438,6 +453,20 @@ jobs: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "KEYCHAIN-PASSWORD" + - name: Download Provisioning Profiles secrets env: ACCOUNT_NAME: bitwardenci @@ -472,9 +501,12 @@ jobs: az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Set up keychain env: - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain @@ -528,6 +560,10 @@ jobs: needs: - setup - macos-build + permissions: + contents: read + packages: read + id-token: write env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} @@ -572,10 +608,19 @@ jobs: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "KEYCHAIN-PASSWORD,APPLE-ID-USERNAME,APPLE-ID-PASSWORD" - name: Download Provisioning Profiles secrets env: @@ -611,9 +656,12 @@ jobs: az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Set up keychain env: - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain @@ -702,8 +750,8 @@ jobs: - name: Build application (dist) env: - APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + APPLE_ID_USERNAME: ${{ steps.get-kv-secrets.outputs.APPLE-ID-USERNAME }} + APPLE_ID_PASSWORD: ${{ steps.get-kv-secrets.outputs.APPLE-ID-PASSWORD }} run: npm run pack:mac - name: Upload .zip artifact @@ -741,6 +789,10 @@ jobs: needs: - setup - macos-build + permissions: + contents: read + packages: read + id-token: write env: _PACKAGE_VERSION: ${{ needs.setup.outputs.release_version }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} @@ -785,6 +837,20 @@ jobs: path: apps/browser/dist/Safari key: ${{ runner.os }}-${{ github.run_id }}-safari-extension + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-clients + secrets: "KEYCHAIN-PASSWORD,APPLE-ID-USERNAME,APPLE-ID-PASSWORD" + - name: Download Provisioning Profiles secrets env: ACCOUNT_NAME: bitwardenci @@ -819,9 +885,12 @@ jobs: az keyvault secret show --id https://bitwarden-ci.vault.azure.net/certificates/macdev-cert | jq -r .value | base64 -d > $HOME/certificates/macdev-cert.p12 + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Set up keychain env: - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ steps.get-kv-secrets.outputs.KEYCHAIN-PASSWORD }} run: | security create-keychain -p $KEYCHAIN_PASSWORD build.keychain security default-keychain -s build.keychain @@ -911,8 +980,8 @@ jobs: - name: Build application for App Store run: npm run pack:mac:mas env: - APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} + APPLE_ID_USERNAME: ${{ steps.get-kv-secrets.outputs.APPLE-ID-USERNAME }} + APPLE_ID_PASSWORD: ${{ steps.get-kv-secrets.outputs.APPLE-ID-PASSWORD }} - name: Upload .pkg artifact uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 @@ -931,6 +1000,10 @@ jobs: - macos-build - macos-package-github - macos-package-mas + permissions: + contents: read + id-token: write + deployments: write steps: - name: Create GitHub deployment uses: chrnorm/deployment-action@55729fcebec3d284f60f5bcabbd8376437d696b1 # v2.0.7 @@ -942,10 +1015,12 @@ jobs: description: 'Deployment ${{ needs.setup.outputs.release_version }} to channel ${{ needs.setup.outputs.release_channel }} from branch ${{ needs.setup.outputs.branch_name }}' task: release - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -956,6 +1031,9 @@ jobs: aws-electron-access-key, aws-electron-bucket-name" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Download all artifacts uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: @@ -1008,6 +1086,8 @@ jobs: - macos-package-github - macos-package-mas - release + permissions: + contents: write steps: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index 57143747a86..5ce0da4cb4b 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -17,10 +17,15 @@ defaults: run: shell: bash +permissions: + contents: read + jobs: setup: name: Setup runs-on: ubuntu-22.04 + permissions: + contents: write outputs: release_version: ${{ steps.version.outputs.version }} release_channel: ${{ steps.release_channel.outputs.channel }} @@ -89,12 +94,6 @@ jobs: working-directory: apps/desktop/artifacts run: mv Bitwarden-${{ env.PKG_VERSION }}-universal.pkg Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive - - name: Get checksum files - uses: bitwarden/gh-actions/get-checksum@main - with: - packages_dir: "apps/desktop/artifacts" - file_path: "apps/desktop/artifacts/sha256-checksums.txt" - - name: Create Release uses: ncipollo/release-action@cdcc88a9acf3ca41c16c37bb7d21b9ad48560d87 # v1.15.0 if: ${{ steps.release_channel.outputs.channel == 'latest' && github.event.inputs.release_type != 'Dry Run' }} @@ -125,8 +124,7 @@ jobs: apps/desktop/artifacts/Bitwarden-${{ env.PKG_VERSION }}-universal.pkg.archive, apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}.yml, apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}-linux.yml, - apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}-mac.yml, - apps/desktop/artifacts/sha256-checksums.txt" + apps/desktop/artifacts/${{ env.RELEASE_CHANNEL }}-mac.yml" commit: ${{ github.sha }} tag: desktop-v${{ env.PKG_VERSION }} name: Desktop v${{ env.PKG_VERSION }} diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 0301b814796..5a3c29d29fc 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -18,6 +18,8 @@ jobs: setup: name: Setup runs-on: ubuntu-22.04 + permissions: + contents: read outputs: release_version: ${{ steps.version.outputs.version }} tag_version: ${{ steps.version.outputs.tag }} @@ -50,6 +52,8 @@ jobs: runs-on: ubuntu-22.04 needs: - setup + permissions: + contents: write steps: - name: Download latest build artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} diff --git a/.github/workflows/repository-management.yml b/.github/workflows/repository-management.yml index 8ab74adf543..ecb8e448a8a 100644 --- a/.github/workflows/repository-management.yml +++ b/.github/workflows/repository-management.yml @@ -37,6 +37,7 @@ on: required: false type: string +permissions: {} jobs: setup: @@ -58,55 +59,19 @@ jobs: echo "branch=$BRANCH" >> $GITHUB_OUTPUT - - cut_branch: - name: Cut branch - if: ${{ needs.setup.outputs.branch == 'rc' }} - needs: setup - runs-on: ubuntu-24.04 - steps: - - name: Generate GH App token - uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 - id: app-token - with: - app-id: ${{ secrets.BW_GHAPP_ID }} - private-key: ${{ secrets.BW_GHAPP_KEY }} - - - name: Check out target ref - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - ref: ${{ inputs.target_ref }} - token: ${{ steps.app-token.outputs.token }} - - - name: Check if ${{ needs.setup.outputs.branch }} branch exists - env: - BRANCH_NAME: ${{ needs.setup.outputs.branch }} - run: | - if [[ $(git ls-remote --heads origin $BRANCH_NAME) ]]; then - echo "$BRANCH_NAME already exists! Please delete $BRANCH_NAME before running again." >> $GITHUB_STEP_SUMMARY - exit 1 - fi - - - name: Cut branch - env: - BRANCH_NAME: ${{ needs.setup.outputs.branch }} - run: | - git switch --quiet --create $BRANCH_NAME - git push --quiet --set-upstream origin $BRANCH_NAME - - bump_version: name: Bump Version if: ${{ always() }} runs-on: ubuntu-24.04 - needs: - - cut_branch - - setup + needs: setup outputs: version_browser: ${{ steps.set-final-version-output.outputs.version_browser }} version_cli: ${{ steps.set-final-version-output.outputs.version_cli }} version_desktop: ${{ steps.set-final-version-output.outputs.version_desktop }} version_web: ${{ steps.set-final-version-output.outputs.version_web }} + permissions: + id-token: write + steps: - name: Validate version input format if: ${{ inputs.version_number_override != '' }} @@ -114,12 +79,29 @@ jobs: with: version: ${{ inputs.version_number_override }} + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "BW-GHAPP-ID,BW-GHAPP-KEY" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Generate GH App token uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 id: app-token with: - app-id: ${{ secrets.BW_GHAPP_ID }} - private-key: ${{ secrets.BW_GHAPP_KEY }} + app-id: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-ID }} + private-key: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-KEY }} - name: Check out branch uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -442,59 +424,59 @@ jobs: if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} run: git push - - cherry_pick: - name: Cherry-Pick Commit(s) + cut_branch: + name: Cut branch if: ${{ needs.setup.outputs.branch == 'rc' }} - runs-on: ubuntu-24.04 needs: - - bump_version - setup + - bump_version + runs-on: ubuntu-24.04 + permissions: + id-token: write + steps: + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "BW-GHAPP-ID,BW-GHAPP-KEY" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Generate GH App token uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 id: app-token with: - app-id: ${{ secrets.BW_GHAPP_ID }} - private-key: ${{ secrets.BW_GHAPP_KEY }} + app-id: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-ID }} + private-key: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-KEY }} - - name: Check out main branch + - name: Check out target ref uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - fetch-depth: 0 - ref: main + ref: ${{ inputs.target_ref }} token: ${{ steps.app-token.outputs.token }} - - name: Configure Git + - name: Check if ${{ needs.setup.outputs.branch }} branch exists + env: + BRANCH_NAME: ${{ needs.setup.outputs.branch }} run: | - git config --local user.email "actions@github.com" - git config --local user.name "Github Actions" + if [[ $(git ls-remote --heads origin $BRANCH_NAME) ]]; then + echo "$BRANCH_NAME already exists! Please delete $BRANCH_NAME before running again." >> $GITHUB_STEP_SUMMARY + exit 1 + fi - - name: Perform cherry-pick(s) + - name: Cut branch + env: + BRANCH_NAME: ${{ needs.setup.outputs.branch }} run: | - # Function for cherry-picking - cherry_pick () { - local package_path="apps/$1/package.json" - local source_branch=$2 - local destination_branch=$3 - - # Get project commit/version from source branch - git switch $source_branch - SOURCE_COMMIT=$(git log --reverse --pretty=format:"%H" --max-count=1 $package_path) - SOURCE_VERSION=$(cat $package_path | jq -r '.version') - - # Get project commit/version from destination branch - git switch $destination_branch - DESTINATION_VERSION=$(cat $package_path | jq -r '.version') - - if [[ "$DESTINATION_VERSION" != "$SOURCE_VERSION" ]]; then - git cherry-pick --strategy-option=theirs -x $SOURCE_COMMIT - git push -u origin $destination_branch - fi - } - - # Cherry-pick from 'main' into 'rc' - cherry_pick browser main rc - cherry_pick cli main rc - cherry_pick desktop main rc - cherry_pick web main rc + git switch --quiet --create $BRANCH_NAME + git push --quiet --set-upstream origin $BRANCH_NAME diff --git a/.github/workflows/retrieve-current-desktop-rollout.yml b/.github/workflows/retrieve-current-desktop-rollout.yml index 2ab3072f566..c45453ed9d0 100644 --- a/.github/workflows/retrieve-current-desktop-rollout.yml +++ b/.github/workflows/retrieve-current-desktop-rollout.yml @@ -11,11 +11,15 @@ jobs: rollout: name: Retrieve Rollout Percentage runs-on: ubuntu-22.04 + permissions: + id-token: write steps: - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -26,6 +30,9 @@ jobs: aws-electron-access-key, aws-electron-bucket-name" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Download channel update info files from S3 env: AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml index 59ef1e0734e..57774fa9991 100644 --- a/.github/workflows/scan.yml +++ b/.github/workflows/scan.yml @@ -10,79 +10,47 @@ on: pull_request: types: [opened, synchronize, reopened] branches-ignore: - - main + - "main" pull_request_target: types: [opened, synchronize, reopened] branches: - "main" +permissions: {} + jobs: check-run: name: Check PR run uses: bitwarden/gh-actions/.github/workflows/check-run.yml@main + permissions: + contents: read sast: - name: SAST scan - runs-on: ubuntu-22.04 + name: Checkmarx + uses: bitwarden/gh-actions/.github/workflows/_checkmarx.yml@main needs: check-run + secrets: + AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} permissions: contents: read pull-requests: write security-events: write - - steps: - - name: Check out repo - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - ref: ${{ github.event.pull_request.head.sha }} - - - name: Scan with Checkmarx - uses: checkmarx/ast-github-action@184bf2f64f55d1c93fd6636d539edf274703e434 # 2.0.41 - env: - INCREMENTAL: "${{ contains(github.event_name, 'pull_request') && '--sast-incremental' || '' }}" - with: - project_name: ${{ github.repository }} - cx_tenant: ${{ secrets.CHECKMARX_TENANT }} - base_uri: https://ast.checkmarx.net/ - cx_client_id: ${{ secrets.CHECKMARX_CLIENT_ID }} - cx_client_secret: ${{ secrets.CHECKMARX_SECRET }} - additional_params: | - --report-format sarif \ - --filter "state=TO_VERIFY;PROPOSED_NOT_EXPLOITABLE;CONFIRMED;URGENT" \ - --output-path . ${{ env.INCREMENTAL }} - - - name: Upload Checkmarx results to GitHub - uses: github/codeql-action/upload-sarif@d68b2d4edb4189fd2a5366ac14e72027bd4b37dd # v3.28.2 - with: - sarif_file: cx_result.sarif - sha: ${{ contains(github.event_name, 'pull_request') && github.event.pull_request.head.sha || github.sha }} - ref: ${{ contains(github.event_name, 'pull_request') && format('refs/pull/{0}/head', github.event.pull_request.number) || github.ref }} + id-token: write quality: - name: Quality scan - runs-on: ubuntu-22.04 + name: Sonar + uses: bitwarden/gh-actions/.github/workflows/_sonar.yml@main needs: check-run + secrets: + AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} + AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} permissions: contents: read pull-requests: write - - steps: - - name: Check out repo - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - fetch-depth: 0 - ref: ${{ github.event.pull_request.head.sha }} - - - name: Scan with SonarCloud - uses: sonarsource/sonarqube-scan-action@2500896589ef8f7247069a56136f8dc177c27ccf # v5.2.0 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - with: - args: > - -Dsonar.organization=${{ github.repository_owner }} - -Dsonar.projectKey=${{ github.repository_owner }}_${{ github.event.repository.name }} - -Dsonar.tests=. - -Dsonar.sources=. - -Dsonar.test.inclusions=**/*.spec.ts - -Dsonar.exclusions=**/*.spec.ts - -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} + id-token: write + with: + sonar-test-inclusions: "**/*.spec.ts" + sonar-exclusions: "**/*.spec.ts" diff --git a/.github/workflows/staged-rollout-desktop.yml b/.github/workflows/staged-rollout-desktop.yml index 4ec3af3be97..4adf81100bd 100644 --- a/.github/workflows/staged-rollout-desktop.yml +++ b/.github/workflows/staged-rollout-desktop.yml @@ -18,11 +18,15 @@ jobs: rollout: name: Update Rollout Percentage runs-on: ubuntu-22.04 + permissions: + id-token: write steps: - - name: Login to Azure - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} - name: Retrieve secrets id: retrieve-secrets @@ -33,6 +37,9 @@ jobs: aws-electron-access-key, aws-electron-bucket-name" + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Download channel update info files from S3 env: AWS_ACCESS_KEY_ID: ${{ steps.retrieve-secrets.outputs.aws-electron-access-id }} diff --git a/.github/workflows/stale-bot.yml b/.github/workflows/stale-bot.yml index abb292f53f3..13acde2b0fc 100644 --- a/.github/workflows/stale-bot.yml +++ b/.github/workflows/stale-bot.yml @@ -8,6 +8,11 @@ jobs: stale: name: 'Check for stale issues and PRs' runs-on: ubuntu-22.04 + permissions: + actions: write + contents: read + issues: write + pull-requests: write steps: - name: 'Run stale action' uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 diff --git a/.github/workflows/test-browser-interactions.yml b/.github/workflows/test-browser-interactions.yml new file mode 100644 index 00000000000..872b4c35264 --- /dev/null +++ b/.github/workflows/test-browser-interactions.yml @@ -0,0 +1,74 @@ +name: Autofill BIT checks + +on: + workflow_run: + workflows: ["Build Browser"] + types: + - completed + +jobs: + check-files: + name: Check files + runs-on: ubuntu-22.04 + permissions: + actions: read + contents: read + id-token: write + steps: + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "BW-GHAPP-ID,BW-GHAPP-KEY" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + + - name: Generate GH App token + uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 + id: app-token + with: + app-id: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-ID }} + private-key: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-KEY }} + owner: bitwarden + repositories: browser-interactions-testing + permission-actions: write + + - name: Checkout code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Get changed files + id: changed-files + uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 + with: + list-files: shell + ref: ${{ github.event.workflow_run.head_branch }} + token: ${{ secrets.GITHUB_TOKEN }} + filters: | + monitored: + - 'apps/browser/src/autofill/**' + - 'apps/browser/src/background/**' + - 'apps/browser/src/platform/services/browser-script-injector.service.ts' + + - name: Trigger test-all workflow in browser-interactions-testing + if: steps.changed-files.outputs.monitored == 'true' + uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3.0.0 + with: + token: ${{ steps.app-token.outputs.token }} + repository: "bitwarden/browser-interactions-testing" + event-type: trigger-bit-tests + client-payload: |- + { + "origin_issue": ${{ github.event.workflow_run.pull_requests[0].number }}, + "origin_branch": "${{ github.event.workflow_run.pull_requests[0].head.ref }}" + } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 64cc86f1db6..a8bfd368884 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,6 +10,8 @@ on: pull_request: types: [ opened, synchronize ] +permissions: {} + jobs: testing: @@ -134,7 +136,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install rust - uses: dtolnay/rust-toolchain@c5a29ddb4d9d194e7c84ec8c3fba61b1c31fee8c # stable + uses: dtolnay/rust-toolchain@b3b07ba8b418998c39fb20f53e8b695cdcc8de1b # stable with: toolchain: stable components: llvm-tools diff --git a/.github/workflows/version-auto-bump.yml b/.github/workflows/version-auto-bump.yml index e8bd1dde246..3cb5646886a 100644 --- a/.github/workflows/version-auto-bump.yml +++ b/.github/workflows/version-auto-bump.yml @@ -9,13 +9,33 @@ jobs: bump-version: name: Bump Desktop Version runs-on: ubuntu-24.04 + permissions: + id-token: write + contents: write steps: + - name: Log in to Azure + uses: bitwarden/gh-actions/azure-login@main + with: + subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + tenant_id: ${{ secrets.AZURE_TENANT_ID }} + client_id: ${{ secrets.AZURE_CLIENT_ID }} + + - name: Get Azure Key Vault secrets + id: get-kv-secrets + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: gh-org-bitwarden + secrets: "BW-GHAPP-ID,BW-GHAPP-KEY" + + - name: Log out from Azure + uses: bitwarden/gh-actions/azure-logout@main + - name: Generate GH App token uses: actions/create-github-app-token@30bf6253fa41bdc8d1501d202ad15287582246b4 # v2.0.3 id: app-token with: - app-id: ${{ secrets.BW_GHAPP_ID }} - private-key: ${{ secrets.BW_GHAPP_KEY }} + app-id: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-ID }} + private-key: ${{ steps.get-kv-secrets.outputs.BW-GHAPP-KEY }} - name: Check out target ref uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 diff --git a/.gitignore b/.gitignore index e865fa6a8fb..0fa968aa47c 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,9 @@ build # Testing coverage junit.xml +## The "base" root level folder is expected for some local tests that do +## comparisons between the current branch and a base branch (usually main) +base/ # Misc *.crx diff --git a/.nvmrc b/.nvmrc index 9a2a0e219c9..53d1c14db37 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20 +v22 diff --git a/apps/browser/jest.config.js b/apps/browser/jest.config.js index 0d1034f0eac..14cd959810e 100644 --- a/apps/browser/jest.config.js +++ b/apps/browser/jest.config.js @@ -1,6 +1,6 @@ const { pathsToModuleNameMapper } = require("ts-jest"); -const { compilerOptions } = require("./tsconfig"); +const { compilerOptions } = require("../../tsconfig.base"); const sharedConfig = require("../../libs/shared/jest.config.angular"); @@ -9,9 +9,9 @@ module.exports = { ...sharedConfig, setupFilesAfterEnv: ["/test.setup.ts"], moduleNameMapper: pathsToModuleNameMapper( - { "@bitwarden/common/spec": ["../../libs/common/spec"], ...(compilerOptions?.paths ?? {}) }, + { "@bitwarden/common/spec": ["libs/common/spec"], ...(compilerOptions?.paths ?? {}) }, { - prefix: "/", + prefix: "/../../", }, ), }; diff --git a/apps/browser/package.json b/apps/browser/package.json index c44743add7c..e75d2b235db 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -1,6 +1,6 @@ { "name": "@bitwarden/browser", - "version": "2025.5.1", + "version": "2025.8.0", "scripts": { "build": "npm run build:chrome", "build:chrome": "cross-env BROWSER=chrome MANIFEST_VERSION=3 NODE_OPTIONS=\"--max-old-space-size=8192\" webpack", diff --git a/apps/browser/src/_locales/ar/messages.json b/apps/browser/src/_locales/ar/messages.json index 0a8ba5b1164..ee723217f2a 100644 --- a/apps/browser/src/_locales/ar/messages.json +++ b/apps/browser/src/_locales/ar/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "البحث في الخزانة" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "تعديل" }, @@ -1173,6 +1176,12 @@ "message": "أوه لا! لم نتمكن من حفظ هذا. حاول إدخال التفاصيل يدويا.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "اسأل عن تحديث تسجيل الدخول الحالي" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "الميزة غير متوفرة" }, - "encryptionKeyMigrationRequired": { - "message": "مطلوب نقل مفتاح التشفير. الرجاء تسجيل الدخول بواسطة مخزن الويب لتحديث مفتاح التشفير الخاص بك." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "العضوية المميزة" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "رمز الأمان" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "مثال." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "مفتاح SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "جديد $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "تعيين رمز PIN الخاص بك لإلغاء قفل Bitwarden. سيتم إعادة تعيين إعدادات PIN الخاصة بك إذا قمت بتسجيل الخروج بالكامل من التطبيق." }, - "setYourPinCode1": { - "message": "سيتم استخدام رَقَم التعريف الشخصي الخاص بك لفتح Bitwarden بدلاً من كلمة المرور الرئيسية. سيتم حذف رَقَم التعريف الشخصي الخاص بك إذا قمت بتسجيل الخروج بالكامل من Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "رمز PIN مطلوب." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "لقد حالت سياسة المؤسسة دون استيراد العناصر إلى خزانتك الشخصية." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "النطاقات", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "تغيير" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "تغيير كلمة المرور - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "يجب عليك تأكيد بريدك الإلكتروني لاستخدام هذه الميزة. يمكنك تأكيد بريدك الإلكتروني في خزانة الويب." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "تحديث كلمة المرور الرئيسية" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "كلمة المرور الرئيسية مكشوفة" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "موافقة الجهاز مطلوبة. حدّد خيار الموافقة أدناه:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "طلب موافقة المدير" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/az/messages.json b/apps/browser/src/_locales/az/messages.json index a38c590e4d4..1d26f50bca6 100644 --- a/apps/browser/src/_locales/az/messages.json +++ b/apps/browser/src/_locales/az/messages.json @@ -14,7 +14,7 @@ "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "Güvənli seyfinizə müraciət etmək üçün giriş edin və ya yeni bir hesab yaradın." + "message": "Güvənli seyfinizə erişmək üçün giriş edin və ya yeni bir hesab yaradın." }, "inviteAccepted": { "message": "Dəvət qəbul edildi" @@ -59,7 +59,7 @@ "message": "Ana parol" }, "masterPassDesc": { - "message": "Ana parol, seyfinizə müraciət etmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur." + "message": "Ana parol, seyfinizə erişmək üçün istifadə edəcəyiniz paroldur. Ana parolu yadda saxlamaq çox vacibdir. Unutsanız, parolu bərpa etməyin heç bir yolu yoxdur." }, "masterPassHintDesc": { "message": "Ana parol məsləhəti, unutduğunuz parolunuzu xatırlamağınıza kömək edir." @@ -350,7 +350,7 @@ "message": "Bitwarden Sirr Meneceri" }, "continueToSecretsManagerPageDesc": { - "message": "Bitwarden Sirr Meneceri ilə developer sirlərini güvənli bir şəkildə saxlayın, idarə edin və paylaşın. Daha ətraflı bitwarden.com veb saytında öyrənə bilərsiniz." + "message": "Bitwarden Sirr Meneceri ilə gəlişdirici sirlərini güvənli bir şəkildə saxlayın, idarə edin və paylaşın. Daha ətraflı bitwarden.com veb saytında öyrənə bilərsiniz." }, "passwordlessDotDev": { "message": "Passwordless.dev" @@ -547,6 +547,9 @@ "searchVault": { "message": "Seyfdə axtar" }, + "resetSearch": { + "message": "Axtarışı sıfırla" + }, "edit": { "message": "Düzəliş et" }, @@ -1173,6 +1176,12 @@ "message": "Bunu saxlaya bilmədik. Məlumatları manual daxil etməyə çalışın.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Parolunuzu dəyişdirdikdən sonra yeni parolunuzla giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saat ərzində çıxış sonlandırılacaq." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Hesabın geri qaytarılması prosesini tamamlamaq üçün ana parolunuzu dəyişdirin." + }, "enableChangedPasswordNotification": { "message": "Mövcud girişin güncəllənməsini soruş" }, @@ -1207,10 +1216,10 @@ "message": "Konteks menyu seçimlərini göstər" }, "contextMenuItemDesc": { - "message": "Veb sayt üçün parol yaratmaq və uyuşan giriş məlumatlarına müraciət etmək üçün sağ klikləməni istifadə edin." + "message": "Veb sayt üçün parol yaradılmasına və uyuşan giriş məlumatlarına erişmək üçün sağ klikləməni istifadə edin." }, "contextMenuItemDescAlt": { - "message": "Veb sayt üçün parol yaratmaq və uyuşan giriş məlumatlarına müraciət etmək üçün sağ klikləməni istifadə edin. Giriş etmiş bütün hesablara aiddir." + "message": "Veb sayt üçün parol yaradılmasına və uyuşan giriş məlumatlarına erişmək üçün sağ klikləməni istifadə edin. Giriş etmiş bütün hesablara aiddir." }, "defaultUriMatchDetection": { "message": "İlkin URI uyuşma aşkarlaması", @@ -1281,16 +1290,16 @@ "message": "Seyfi xaricə köçürməyi təsdiqlə" }, "exportWarningDesc": { - "message": "Xaricə köçürdüyünüz bu fayldakı datanız şifrələnməmiş formatdadır. Bu faylı güvənli olmayan kanallar (e-poçt kimi) üzərində saxlamamalı və ya göndərməməlisiniz. İşiniz bitdikdən sonra faylı dərhal silin." + "message": "Bu xaricə köçürmədəki seyf veriləriniz şifrələnməmiş formatdadır. Bu xaricə köçürülmüş faylı güvənli olmayan kanallar (e-poçt kimi) üzərində saxlamamalı və ya göndərməməlisiniz. İşiniz bitdikdən sonra faylı dərhal silin." }, "encExportKeyWarningDesc": { - "message": "Xaricə köçürdüyünüz bu fayldakı data, hesabınızın şifrələmə açarı istifadə edilərək şifrələnir. Hesabınızın şifrələmə açarını dəyişdirsəniz, bu faylın şifrəsini aça bilməyəcəksiniz və onu yenidən xaricə köçürməli olacaqsınız." + "message": "Bu xaricə köçürmə, verilərinizi hesabınızın şifrələmə açarını istifadə edərək şifrələyir. Hesabınızın şifrələmə açarını dəyişdirsəniz, bu faylın şifrəsini aça bilməyəcəksiniz və onu yenidən xaricə köçürməli olacaqsınız." }, "encExportAccountWarningDesc": { "message": "Hesab şifrələmə açarları, hər Bitwarden istifadəçi hesabı üçün unikaldır, buna görə də şifrələnmiş bir xaricə köçürməni, fərqli bir hesaba köçürə bilməzsiniz." }, "exportMasterPassword": { - "message": "Seyf datanızı xaricə köçürmək üçün ana parolunuzu daxil edin." + "message": "Seyf verilərinizi xaricə köçürmək üçün ana parolunuzu daxil edin." }, "shared": { "message": "Paylaşılan" @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Özəllik əlçatmazdır" }, - "encryptionKeyMigrationRequired": { - "message": "Şifrələmə açarının daşınması tələb olunur. Şifrələmə açarınızı güncəlləmək üçün lütfən veb seyfinizə giriş edin." + "legacyEncryptionUnsupported": { + "message": "Köhnə şifrələmə artıq dəstəklənmir. Hesabınızı geri qaytarmaq üçün lütfən dəstəklə əlaqə saxlayın." }, "premiumMembership": { "message": "Premium üzvlük" @@ -1390,13 +1399,13 @@ "message": "Fayl qoşmaları üçün 1 GB şifrələnmiş anbar sahəsi" }, "premiumSignUpEmergency": { - "message": "Fövqəladə hal müraciəti" + "message": "Fövqəladə hal erişimi." }, "premiumSignUpTwoStepOptions": { "message": "YubiKey və Duo kimi mülkiyyətçi iki addımlı giriş seçimləri." }, "ppremiumSignUpReports": { - "message": "Seyfinizi güvəndə saxlamaq üçün parol gigiyenası, hesab sağlamlığı və data pozuntusu hesabatları." + "message": "Seyfinizi güvəndə saxlamaq üçün parol gigiyenası, hesab sağlamlığı və veri pozuntusu hesabatları." }, "ppremiumSignUpTotp": { "message": "Seyfinizdəki girişlər üçün TOTP doğrulama kodu (2FA) yaradıcısı." @@ -1514,7 +1523,7 @@ "message": "İki addımlı giriş üsulunu seçin" }, "recoveryCodeDesc": { - "message": "İki faktorlu provayderlərinə müraciəti itirmisiniz? Geri qaytarma kodunuzu istifadə edərək hesabınızdakı bütün iki faktorlu provayderləri sıradan çıxarda bilərsiniz." + "message": "İki faktorlu provayderlərinizə erişə bilmirsiniz? Geri qaytarma kodunuzu istifadə edərək hesabınızdakı bütün iki faktorlu provayderləri söndürün." }, "recoveryCodeTitle": { "message": "Geri qaytarma kodu" @@ -1530,7 +1539,7 @@ "message": "Yubico OTP Güvənlik Açarı" }, "yubiKeyDesc": { - "message": "Hesabınıza müraciət etmək üçün bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazları ilə işləyir." + "message": "Hesabınıza erişmək üçün bir YubiKey istifadə edin. YubiKey 4, 4 Nano, 4C və NEO cihazları ilə işləyir." }, "duoDescV2": { "message": "Duo Security tərəfindən yaradılan kodu daxil edin.", @@ -1544,7 +1553,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Hesabınıza müraciət etmək üçün WebAuthn özəllikli istənilən bir güvənlik açarı istifadə edin." + "message": "Hesabınıza erişmək üçün istənilən WebAuthn uyumlu güvənlik açarını istifadə edin." }, "emailTitle": { "message": "E-poçt" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Güvənlik kodu" }, + "cardNumber": { + "message": "kart nömrəsi" + }, "ex": { "message": "məs." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH açarı" }, + "typeNote": { + "message": "Not" + }, "newItemHeader": { "message": "Yeni $TYPE$", "placeholders": { @@ -2008,7 +2023,7 @@ "message": "Parolun ifşalanıb ifşalanmadığını yoxlayın." }, "passwordExposed": { - "message": "Bu parol, məlumat pozuntularında $VALUE$ dəfə üzə çıxıb. Dəyişdirməyi məsləhət görürük.", + "message": "Bu parol, veri pozuntularında $VALUE$ dəfə üzə çıxıb. Dəyişdirməyi məsləhət görürük.", "placeholders": { "value": { "content": "$1", @@ -2017,7 +2032,7 @@ } }, "passwordSafe": { - "message": "Bu parol, məlumat pozuntularında qeydə alınmayıb. Rahatlıqla istifadə edə bilərsiniz." + "message": "Bu parol, veri pozuntularında qeydə alınmayıb. Rahatlıqla istifadə edə bilərsiniz." }, "baseDomain": { "message": "Baza domeni", @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Bitwarden-in kilidini açmaq üçün PIN kodunuzu ayarlayın. Tətbiqdən tam çıxış etdikdə PIN ayarlarınız sıfırlanacaq." }, - "setYourPinCode1": { - "message": "Bitwarden kilidini açmaq üçün ana parolunuzun əvəzinə PIN-iniz istifadə ediləcək. Bitwarden-dən tamamilə çıxış etdikdə PIN-iniz sıfırlanacaq." + "setPinCode": { + "message": "Bitwarden-in kilidini açmaq üçün bu PIN-i istifadə edə bilərsiniz. Tətbiqdən tam çıxış etsəniz, PIN-iniz sıfırlanacaq." }, "pinRequired": { "message": "PIN kod lazımdır." @@ -2260,7 +2275,7 @@ "message": "Artıq hesabınız var?" }, "vaultTimeoutLogOutConfirmation": { - "message": "Çıxış etdikdə, seyfinizə bütün müraciətiniz dayanacaq və vaxt bitməsindən sonra onlayn kimlik doğrulaması tələb olunacaq. Bu ayarı istifadə etmək istədiyinizə əminsiniz?" + "message": "Çıxış etdikdə, seyfinizə erişiminiz tamamilə dayanacaq və vaxt bitdikdən sonra onlayn kimlik doğrulaması tələb olunacaq. Bu ayarı istifadə etmək istədiyinizə əminsiniz?" }, "vaultTimeoutLogOutConfirmationTitle": { "message": "Vaxt bitmə əməliyyat təsdiqi" @@ -2386,7 +2401,7 @@ "message": "Oldu" }, "errorRefreshingAccessToken": { - "message": "Müraciət tokeni təzələmə xətası" + "message": "Erişim tokeni təzələmə xətası" }, "errorRefreshingAccessTokenDesc": { "message": "Təzələmə tokeni və ya API açarlar tapılmadı. Lütfən çıxış edib yenidən giriş etməyə çalışın." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Bir təşkilat siyasəti, elementlərin fərdi seyfinizə köçürülməsini əngəllədi." }, + "restrictCardTypeImport": { + "message": "Kart element növləri daxilə köçürülə bilmir" + }, + "restrictCardTypeImportDesc": { + "message": "1 və ya daha çox təşkilat tərəfindən təyin edilən bir siyasət, kartların seyfinizə köçürülməsini əngəlləyir." + }, "domainsTitle": { "message": "Domenlər", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Dəyişdir" }, + "changePassword": { + "message": "Parolu dəyişdir", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Parolu dəyişdir - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Riskli parollar" + }, "atRiskPasswords": { "message": "Riskli parollar" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Bu saytdakı parolunuz risk altındadır. $ORGANIZATION$ onu dəyişdirməyinizi tələb edir.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$, bu parolun risk altında olduğu üçün dəyişdirməyinizi istəyir. Parolu dəyişdirmək üçün hesabınızın ayarlarına gedin.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Riskli bir parolu incələ və dəyişdir" }, @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Maksimal müraciət sayına çatıldı", + "message": "Maksimum erişim sayına çatıldı", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2762,7 +2810,7 @@ "message": "Özəl" }, "sendPasswordDescV3": { - "message": "Alıcıların bu \"Send\"ə müraciət etməsi üçün ixtiyari bir parol əlavə edin.", + "message": "Alıcıların bu \"Send\"ə erişməsi üçün ixtiyari bir parol əlavə edin.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Bu özəlliyi istifadə etmək üçün e-poçtunuzu doğrulamalısınız. E-poçtunuzu veb seyfdə doğrulaya bilərsiniz." }, + "masterPasswordSuccessfullySet": { + "message": "Ana parol uğurla təyin edildi" + }, "updatedMasterPassword": { "message": "Güncəllənmiş ana parol" }, @@ -2890,13 +2941,13 @@ "message": "Ana parolu güncəllə" }, "updateMasterPasswordWarning": { - "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir administrator tərəfindən dəyişdirildi. Seyfə müraciət etmək üçün onu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış edəcəksiniz və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təzəlikcə təşkilatınızdakı bir inzibatçı tərəfindən dəyişdirildi. Seyfə erişmək üçün onu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış edəcəksiniz və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "updateWeakMasterPasswordWarning": { - "message": "Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Seyfə müraciət üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." + "message": "Ana parolunuz təşkilatınızdakı siyasətlərdən birinə və ya bir neçəsinə uyğun gəlmir. Seyfə erişmək üçün ana parolunuzu indi güncəlləməlisiniz. Davam etsəniz, hazırkı seansdan çıxış etmiş və təkrar giriş etməli olacaqsınız. Digər cihazlardakı aktiv seanslar bir saata qədər aktiv qalmağa davam edə bilər." }, "tdeDisabledMasterPasswordRequired": { - "message": "Təşkilatınız, güvənli cihaz şifrələməsini sıradan çıxartdı. Seyfinizə müraciət etmək üçün lütfən ana parol təyin edin." + "message": "Təşkilatınız, güvənli cihaz şifrələməsini sıradan çıxartdı. Seyfinizə erişmək üçün lütfən ana parol təyin edin." }, "resetPasswordPolicyAutoEnroll": { "message": "Avtomatik yazılma" @@ -3094,7 +3145,7 @@ "message": "Bitwarden, aşağıda sadalanan seyf element(lər)inin şifrəsini aça bilmədi." }, "contactCSToAvoidDataLossPart1": { - "message": "Əlavə data itkisini önləmək üçün", + "message": "Əlavə veri itkisini önləmək üçün", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { @@ -3311,7 +3362,7 @@ "description": "Part of a URL." }, "apiAccessToken": { - "message": "API müraciət tokeni" + "message": "API erişim tokeni" }, "apiKey": { "message": "API açar" @@ -3326,7 +3377,7 @@ "message": "Təşkilat dayandırıldı." }, "disabledOrganizationFilterError": { - "message": "Dayandırılmış Təşkilatlardakı elementlərə müraciət edilə bilmir. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın." + "message": "Fəaliyyəti dayandırılmış Təşkilatlardakı elementlərə erişilə bilməz. Kömək üçün Təşkilatınızın sahibi ilə əlaqə saxlayın." }, "loggingInTo": { "message": "$DOMAIN$ domeninə giriş edilir", @@ -3415,20 +3466,45 @@ "logInRequestSent": { "message": "Tələb göndərildi" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "$DEVICE$ cihazında $EMAIL$ üçün giriş tələbi təsdiqləndi", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Başqa bir cihazdan giriş cəhdinə rədd cavabı verdiniz. Bu siz idinizsə, cihazla yenidən giriş etməyə çalışın." + }, + "device": { + "message": "Cihaz" + }, + "loginStatus": { + "message": "Giriş statusu" + }, + "masterPasswordChanged": { + "message": "Ana parol saxlanıldı" + }, "exposedMasterPassword": { "message": "İfşa olunmuş ana parol" }, "exposedMasterPasswordDesc": { - "message": "Parol, məlumat pozuntusunda tapıldı. Hesabınızı qorumaq üçün unikal bir parol istifadə edin. İfşa olunmuş bir parol istifadə etmək istədiyinizə əminsiniz?" + "message": "Parol, veri pozuntusunda tapıldı. Hesabınızı qorumaq üçün unikal bir parol istifadə edin. İfşa olunmuş bir parol istifadə etmək istədiyinizə əminsiniz?" }, "weakAndExposedMasterPassword": { "message": "Zəif və ifşa olunmuş ana parol" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Zəif parol məlumat pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?" + "message": "Zəif parol, veri pozuntusunda aşkarlandı və tapıldı. Hesabınızı qorumaq üçün güclü və unikal bir parol istifadə edin. Bu parolu istifadə etmək istədiyinizə əminsiniz?" }, "checkForBreaches": { - "message": "Bu parol üçün bilinən məlumat pozuntularını yoxlayın" + "message": "Bu parol üçün bilinən veri pozuntularını yoxlayın" }, "important": { "message": "Vacib:" @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Gələcək girişləri problemsiz etmək üçün bu cihazı xatırla" }, + "manageDevices": { + "message": "Cihazları idarə et" + }, + "currentSession": { + "message": "Hazırkı seans" + }, + "mobile": { + "message": "Mobil", + "description": "Mobile app" + }, + "extension": { + "message": "Uzantı", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Masaüstü", + "description": "Desktop app" + }, + "webVault": { + "message": "Veb seyf" + }, + "webApp": { + "message": "Veb tətbiq" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Tələb gözlənir" + }, + "firstLogin": { + "message": "İlk giriş" + }, + "trusted": { + "message": "Güvənli" + }, + "needsApproval": { + "message": "Təsdiq lazımdır" + }, + "devices": { + "message": "Cihazlar" + }, + "accessAttemptBy": { + "message": "$EMAIL$ ilə erişim cəhdi", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Erişimi təsdiqlə" + }, + "denyAccess": { + "message": "Erişimə rədd cavabı ver" + }, + "time": { + "message": "Vaxt" + }, + "deviceType": { + "message": "Cihaz növü" + }, + "loginRequest": { + "message": "Giriş tələbi" + }, + "thisRequestIsNoLongerValid": { + "message": "Bu tələb artıq yararsızdır." + }, + "loginRequestHasAlreadyExpired": { + "message": "Giriş tələbinin müddəti artıq bitib." + }, + "justNow": { + "message": "İndicə" + }, + "requestedXMinutesAgo": { + "message": "$MINUTES$ dəqiqə əvvəl tələb göndərildi", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Cihaz təsdiqi tələb olunur. Aşağıdan bir təsdiq variantı seçin:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Admin təsdiqini tələb et" }, + "unableToCompleteLogin": { + "message": "Giriş prosesi tamamlana bilmir" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Güvəndiyiniz bir cihazda giriş etməli və ya inzibatçınızdan sizə bir parol təyin etməsini xahiş etməlisiniz." + }, "ssoIdentifierRequired": { "message": "Təşkilat SSO identifikatoru tələb olunur." }, @@ -3558,7 +3728,7 @@ "description": "European Union" }, "accessDenied": { - "message": "Müraciət rədd edildi. Bu səhifəyə baxmaq üçün icazəniz yoxdur." + "message": "Erişim rədd edildi. Bu səhifəyə baxmaq üçün icazəniz yoxdur." }, "general": { "message": "Ümumi" @@ -3603,7 +3773,7 @@ "message": "Təşkilata güvənilmir" }, "emergencyAccessTrustWarning": { - "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu istifadəçiyə fövqəladə hal müraciəti icazəsini verdiyinizi və onun barmaq izinin hesabında görünən barmaq izi ilə uyuşduğunu təsdiqləyin" + "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu istifadəçiyə fövqəladə hal erişim icazəsini verdiyinizi və onun barmaq izinin hesabında görünən barmaq izi ilə uyuşduğunu təsdiqləyin" }, "orgTrustWarning": { "message": "Hesabınızın təhlükəsizliyi üçün yalnız bu təşkilatın üzvüsünüzsə, hesab geri qaytarma fəaldırsa və aşağıda görünən barmaq izi təşkilatın barmaq izi ilə uyuşursa davam edin." @@ -3614,20 +3784,12 @@ "trustUser": { "message": "İstifadəçiyə güvən" }, - "sendsNoItemsTitle": { - "message": "Aktiv \"Send\" yoxdur", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Şifrələnmiş məlumatları hər kəslə güvənli şəkildə paylaşmaq üçün \"Send\"i istifadə edin.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send, həssas məlumatlar təhlükəsizdir", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "İstənilən platformada faylları və dataları hər kəslə paylaşın. İfşa olunmağı məhdudlaşdıraraq məlumatlarınız ucdan-uca şifrələnmiş qalacaq.", + "message": "İstənilən platformada faylları və veriləri hər kəslə güvənli şəkildə paylaşın. Məlumatlarınız, ifşa olunmamaq üçün ucdan-uca şifrələnmiş qalacaq.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3858,14 +4020,14 @@ "message": "Yox say" }, "importData": { - "message": "Datanı daxilə köçür", + "message": "Veriləri daxilə köçür", "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" }, "importError": { "message": "Daxilə köçürmə xətası" }, "importErrorDesc": { - "message": "Daxilə köçürməyə çalışdığınız data ilə bağlı bir problem var. Lütfən mənbə faylınızda aşağıda sadalanan xətaları həll edib yenidən sınayın." + "message": "Daxilə köçürməyə çalışdığınız verilərlə bağlı bir problem var. Lütfən mənbə faylınızda aşağıda sadalanan xətaları həll edib yenidən sınayın." }, "resolveTheErrorsBelowAndTryAgain": { "message": "Aşağıdakı xətaları həll edin və yenidən sınayın." @@ -3874,7 +4036,7 @@ "message": "Açıqlama" }, "importSuccess": { - "message": "Data uğurla daxilə köçürüldü" + "message": "Verilər uğurla daxilə köçürüldü" }, "importSuccessNumberOfItems": { "message": "Cəmi $AMOUNT$ element daxilə köçürüldü.", @@ -3925,7 +4087,7 @@ "message": "Cəmi" }, "importWarning": { - "message": "Datanı $ORGANIZATION$ təşkilatına köçürürsünüz. Datanızı bu təşkilatın üzvləri ilə paylaşa bilərsiniz. Davam etmək istəyirsiniz?", + "message": "Veriləri $ORGANIZATION$ təşkilatına köçürürsünüz. Veriləriniz, bu təşkilatın üzvləri ilə paylaşıla bilər. Davam etmək istəyirsiniz?", "placeholders": { "organization": { "content": "$1", @@ -3946,13 +4108,13 @@ "message": "Duo-nu başlat" }, "importFormatError": { - "message": "Data doğru format edilməyib. Lütfən daxilə köçürmə faylınızı yoxlayıb yenidən sınayın." + "message": "Verilər düzgün format olunmayıb. Lütfən daxilə köçürmə faylınızı yoxlayıb yenidən sınayın." }, "importNothingError": { "message": "Heç nə daxilə köçürülmədi." }, "importEncKeyError": { - "message": "Xaricə köçürülən faylın şifrəsi açılarkən xəta baş verdi. Şifrələmə açarınız, datanı xaricə köçürmək üçün istifadə edilən şifrələmə açarı ilə uyuşmur." + "message": "Xaricə köçürülən faylın şifrəsi açılarkən xəta baş verdi. Şifrələmə açarınız, veriləri xaricə köçürmək üçün istifadə edilən şifrələmə açarı ilə uyuşmur." }, "invalidFilePassword": { "message": "Yararsız fayl parolu, lütfən xaricə köçürmə faylını yaradarkən daxil etdiyiniz parolu istifadə edin." @@ -4011,19 +4173,19 @@ "message": "Seyfi daxilə köçürməyi təsdiqlə" }, "confirmVaultImportDesc": { - "message": "Bu fayl parolla qorunur. Məlumatları daxilə köçürmək üçün fayl parolunu daxil edin." + "message": "Bu fayl parolla qorunur. Veriləri daxilə köçürmək üçün fayl parolunu daxil edin." }, "confirmFilePassword": { "message": "Fayl parolunu təsdiqlə" }, "exportSuccess": { - "message": "Seyf datası xaricə köçürüldü" + "message": "Seyf veriləri xaricə köçürüldü" }, "typePasskey": { "message": "Keçid açarı" }, "accessing": { - "message": "Müraciət edilir" + "message": "Erişilir" }, "loggedInExclamation": { "message": "Giriş edildi!" @@ -4089,7 +4251,7 @@ "message": "Çox faktorlu kimlik doğrulama ləğv edildi" }, "noLastPassDataFound": { - "message": "LastPass datası tapılmadı" + "message": "LastPass veriləri tapılmadı" }, "incorrectUsernameOrPassword": { "message": "Yanlış istifadəçi adı və ya parol" @@ -4195,7 +4357,7 @@ "message": "sahiblik edən" }, "useDeviceOrHardwareKey": { - "message": "Cihazınızı və ya avadanlıq açarınızı istifadə edin" + "message": "Cihazınızı və ya donanım açarınızı istifadə edin" }, "justOnce": { "message": "Yalnız bir dəfə" @@ -4216,6 +4378,26 @@ "message": "Ortaq formatlar", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI uyuşma aşkarlaması, Bitwarden-in avto-doldurma təkliflərini necə müəyyən etdiyini göstərir.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Müntəzəm ifadə\", kimlik məlumatlarının ifşa olunma riskini artıran qabaqcıl bir seçimdir.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"İlə başlayır\", kimlik məlumatlarının ifşa olunma riskini artıran qabaqcıl bir seçimdir.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Uyuşma aşkarlaması barədə daha çox", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Qabaqcıl seçimlər", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Brauzer ayarları ilə davam edilsin?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Kopyala: $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Kopyala: $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4499,7 +4681,7 @@ "description": "Used as a label to indicate that the user is the owner of an item." }, "contactYourOrgAdmin": { - "message": "Deaktiv edilmiş təşkilatlardakı elementlərə müraciət edilə bilməz. Kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." + "message": "Deaktiv edilmiş təşkilatlardakı elementlərə erişilə bilməz. Kömək üçün təşkilatınızın sahibi ilə əlaqə saxlayın." }, "additionalInformation": { "message": "Əlavə məlumat" @@ -4556,13 +4738,13 @@ "message": "Mobil tətbiqi əldə et" }, "getTheMobileAppDesc": { - "message": "Bitwarden mobil tətbiqi ilə parollarınıza hər yerdən müraciət edin." + "message": "Bitwarden mobil tətbiqi ilə parollarınıza hər yerdən erişin." }, "getTheDesktopApp": { "message": "Masaüstü tətbiqi əldə et" }, "getTheDesktopAppDesc": { - "message": "Seyfinizə brauzer olmadan müraciət edin, sonra həm masaüstü tətbiqində, həm də brauzer uzantısında kilid açma prosesini sürətləndirmək üçün biometrik ilə kilid açma prosesini qurun." + "message": "Seyfinizə brauzer olmadan erişin, sonra həm masaüstü tətbiqində, həm də brauzer uzantısında kilid açma prosesini sürətləndirmək üçün biometrik ilə kilid açma prosesini qurun." }, "downloadFromBitwardenNow": { "message": "İndi bitwarden.com saytından endir" @@ -4715,7 +4897,7 @@ "message": "Yüklənir" }, "data": { - "message": "Data" + "message": "Veri" }, "passkeys": { "message": "Keçid açarı", @@ -4733,10 +4915,10 @@ "message": "Təyin et" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Yalnız bu kolleksiyalara müraciəti olan təşkilat üzvləri bu elementi görə biləcək." + "message": "Yalnız bu kolleksiyalara erişimi olan təşkilat üzvləri bu elementi görə biləcək." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Yalnız bu kolleksiyalara müraciəti olan təşkilat üzvləri bu elementləri görə biləcək." + "message": "Yalnız bu kolleksiyalara erişimi olan təşkilat üzvləri bu elementləri görə biləcək." }, "bulkCollectionAssignmentWarning": { "message": "$TOTAL_COUNT$ element seçmisiniz. Düzəliş icazəniz olmadığı üçün $READONLY_COUNT$ elementi güncəlləyə bilməzsiniz.", @@ -4763,10 +4945,10 @@ "message": "Xana etiketi" }, "textHelpText": { - "message": "Təhlükəsizlik sualları kimi datalar üçün mətn xanalarını istifadə edin" + "message": "Təhlükəsizlik sualları kimi verilər üçün mətn xanalarını istifadə edin" }, "hiddenHelpText": { - "message": "Parol kimi həssas datalar üçün gizli xanaları istifadə edin" + "message": "Parol kimi həssas verilər üçün gizli xanaları istifadə edin" }, "checkBoxHelpText": { "message": "\"E-poçtu xatırla\" kimi formun təsdiq qutusunu avto-doldurmaq istəyirsinizsə təsdiq qutularını istifadə edin" @@ -5038,11 +5220,14 @@ "message": "Seyfinizin kilidini saniyələr ərzində açın" }, "unlockVaultDesc": { - "message": "Seyfinizə daha cəld müraciət etmək üçün kilid açma və bitmə vaxtı ayarlarını özəlləşdirə bilərsiniz." + "message": "Seyfinizə daha cəld erişmək üçün kilid açma və bitmə vaxtı ayarlarını özəlləşdirə bilərsiniz." }, "unlockPinSet": { "message": "PIN ilə kilid açma təyini" }, + "unlockWithBiometricSet": { + "message": "Kilidi biometriklə aç ayarı" + }, "authenticating": { "message": "Kimlik doğrulama" }, @@ -5287,7 +5472,7 @@ "message": "Bütün hesablarınız üçün güclü, unikal parollar yaratmaq və saxlamaq üçün yaradıcını istifadə edin." }, "secureDevices": { - "message": "Datanız, ehtiyacınız olan vaxt yanınızdadır" + "message": "Veriləriniz, ehtiyacınız olan vaxt yanınızdadır" }, "secureDevicesBody": { "message": "Bitwarden mobil, brauzer və masaüstü tətbiqləri ilə limitsiz cihaz arasında limitsiz parol saxlayın." @@ -5311,7 +5496,7 @@ "message": "Hazırkı səhifə üçün elementləri avto-doldur" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Asan müraciət üçün elementləri sevimlilərə əlavə et" + "message": "Asan erişmək üçün elementləri sevimlilərə əlavə et" }, "hasItemsVaultNudgeBodyThree": { "message": "Seyfinizdə başqa bir şey axtarın" @@ -5347,13 +5532,13 @@ "message": "Kimliklərinizlə, uzun qeydiyyat və ya əlaqə xanalarını daha tez avtomatik doldurun." }, "newNoteNudgeTitle": { - "message": "Həssas datalarınızı güvənli şəkildə saxlayın" + "message": "Həssas verilərinizi güvənli şəkildə saxlayın" }, "newNoteNudgeBody": { - "message": "Notlarla, bankçılıq və ya sığorta təfsilatları kimi həssas dataları təhlükəsiz saxlayın." + "message": "Notlarla, bankçılıq və ya sığorta təfsilatları kimi həssas veriləri təhlükəsiz saxlayın." }, "newSshNudgeTitle": { - "message": "Gəlişdirici dostu SSH müraciəti" + "message": "Gəlişdirici dostu SSH erişimi" }, "newSshNudgeBodyOne": { "message": "Açarlarınızı saxlayın və sürətli, şifrələnmiş kimlik doğrulama üçün SSH agentinə bağlayın.", @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Bu səhifəyə baxmaq icazəniz yoxdur. Fərqli hesabla giriş etməyə çalışın." + }, + "wasmNotSupported": { + "message": "WebAssembly brauzerinizdə dəstəklənmir və ya fəal deyil. WebAssembly, Bitwarden tətbiqini istifadə etmək üçün tələb olunur.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Daha çox göstər" + }, + "showLess": { + "message": "Daha az göstər" } } diff --git a/apps/browser/src/_locales/be/messages.json b/apps/browser/src/_locales/be/messages.json index 888569cd588..d6090123878 100644 --- a/apps/browser/src/_locales/be/messages.json +++ b/apps/browser/src/_locales/be/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Пошук у сховішчы" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Рэдагаваць" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Пытацца пра абнаўленні існуючага лагіна" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Функцыя недаступна" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Прэміяльны статус" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Код бяспекі" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "напр." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Ключ SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Новы $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Прызначце PIN-код для разблакіроўкі Bitwarden. Налады PIN-кода будуць скінуты, калі вы калі-небудзь цалкам выйдзеце з праграмы." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Патрабуецца PIN-код." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Дамены", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Вы павінны праверыць свой адрас электроннай пошты, каб выкарыстоўваць гэту функцыю. Зрабіць гэта можна ў вэб-сховішчы." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Асноўны пароль абноўлены" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Скампраметаваны асноўны пароль" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Патрабуецца ўхваленне прылады. Выберыце параметры ўхвалення ніжэй:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Запытаць ухваленне адміністратара" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "Няма актыўных Send'аў", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Выкарыстоўвайце Send'ы, каб бяспечна абагуляць зашыфраваную інфармацыю з іншымі.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/bg/messages.json b/apps/browser/src/_locales/bg/messages.json index ac99ce4376e..3b411cd088c 100644 --- a/apps/browser/src/_locales/bg/messages.json +++ b/apps/browser/src/_locales/bg/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Търсене в трезора" }, + "resetSearch": { + "message": "Нулиране на търсенето" + }, "edit": { "message": "Редактиране" }, @@ -1173,6 +1176,12 @@ "message": "О, не! Запазването не беше успешно. Опитайте да въведете данните ръчно.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "След като промените паролата си, ще трябва да се впишете отново с новата си парола. Сесиите на други устройства също ще бъдат прекратени в рамките на един час." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Променете главната си парола, за да завършите възстановяването на акаунта." + }, "enableChangedPasswordNotification": { "message": "Питане за обновяване на съществуващ запис" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Функцията е недостъпна" }, - "encryptionKeyMigrationRequired": { - "message": "Необходима е промяна на шифриращия ключ. Впишете се в трезора си по уеб, за да обновите своя шифриращ ключ." + "legacyEncryptionUnsupported": { + "message": "Остарелият метод на шифроване вече не се поддържа. Моля, свържете се с поддръжката, за да възстановите акаунта си." }, "premiumMembership": { "message": "Платен абонамент" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Код за сигурност" }, + "cardNumber": { + "message": "номер на карта" + }, "ex": { "message": "напр." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH ключ" }, + "typeNote": { + "message": "Бележка" + }, "newItemHeader": { "message": "Ново $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Задайте ПИН за отключване на Bitwarden. Настройките за ПИН се изчистват при всяко пълно излизане от програмата." }, - "setYourPinCode1": { - "message": "Вашият ПИН ще бъде ползван за отключване на Битуорден, вместо главната парола. Той ще бъде нулиран, ако някога се отпишете напълно от Битуорден." + "setPinCode": { + "message": "Може да използвате този ПИН за отключване на Битуорден. Вашият ПИН ще се нулира ако в някакъв момент се отпишете напълно от приложението." }, "pinRequired": { "message": "Необходим е ПИН." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Политика на организацията забранява да внасяте елементи в личния си трезор." }, + "restrictCardTypeImport": { + "message": "Картовите елементи не могат да бъдат внесени" + }, + "restrictCardTypeImportDesc": { + "message": "Политика, зададена от 1 или повече организации, не позволява да внасяте карти в трезорите си." + }, "domainsTitle": { "message": "Домейни", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Промяна" }, + "changePassword": { + "message": "Промяна на паролата", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Промяна на паролата – $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Парола в риск" + }, "atRiskPasswords": { "message": "Пароли в риск" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Вашата парола за този уеб сайт е в риск. $ORGANIZATION$ изисква от Вас да я смените.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ иска от Вас да смените тази парола, защото е в риск. Отидете в настройките на акаунта си, за да смените паролата си.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Преглед и промяна на една парола в риск" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Трябва да потвърдите е-пощата си, за да използвате тази функционалност. Можете да го направите в уеб-трезора." }, + "masterPasswordSuccessfullySet": { + "message": "Главната парола е зададена успешно" + }, "updatedMasterPassword": { "message": "Главната парола е променена" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Заявката е изпратена" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Заявката за вписване за $EMAIL$ на $DEVICE$ е одобрена", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Вие отказахте опит за вписване от друго устройство. Ако това сте били Вие, опитайте да се впишете от устройството отново." + }, + "device": { + "message": "Устройство" + }, + "loginStatus": { + "message": "Състояние на вписването" + }, + "masterPasswordChanged": { + "message": "Главната парола е запазена" + }, "exposedMasterPassword": { "message": "Разкрита главна парола" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Запомняне на това устройство, така че в бъдеще вписването да бъде по-лесно" }, + "manageDevices": { + "message": "Управление на устройствата" + }, + "currentSession": { + "message": "Текуща сесия" + }, + "mobile": { + "message": "Мобилно приложение", + "description": "Mobile app" + }, + "extension": { + "message": "Добавка за браузър", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Работен плот", + "description": "Desktop app" + }, + "webVault": { + "message": "Трезор по уеб" + }, + "webApp": { + "message": "Приложение по уеб" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Чакаща заявка" + }, + "firstLogin": { + "message": "Първо вписване" + }, + "trusted": { + "message": "Доверено" + }, + "needsApproval": { + "message": "Изисква одобрение" + }, + "devices": { + "message": "Устройства" + }, + "accessAttemptBy": { + "message": "Опит за достъп от $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Разрешаване на достъпа" + }, + "denyAccess": { + "message": "Отказване на достъпа" + }, + "time": { + "message": "Време" + }, + "deviceType": { + "message": "Вид устройство" + }, + "loginRequest": { + "message": "Заявка за вписване" + }, + "thisRequestIsNoLongerValid": { + "message": "Тази заявка вече не е активна." + }, + "loginRequestHasAlreadyExpired": { + "message": "Заявката за вписване вече е изтекла." + }, + "justNow": { + "message": "Току-що" + }, + "requestedXMinutesAgo": { + "message": "Заявено преди $MINUTES$ минути", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Изисква се одобрение на устройството. Изберете начин за одобрение по-долу:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Подаване на заявка за одобрение от администратор" }, + "unableToCompleteLogin": { + "message": "Вписването не може да бъде завършено" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Трябва да се впишете на доверено устройство или да помолите администратора си да Ви зададе парола." + }, "ssoIdentifierRequired": { "message": "Идентификаторът за еднократна идентификация на организация е задължителен." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Даване на доверие на потребителя" }, - "sendsNoItemsTitle": { - "message": "Няма активни Изпращания", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Използвайте Изпращане, за да споделите безопасно шифрована информация с някого.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Изпращайте чувствителна информация сигурно", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Често използвани формати", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Разпознаването на съвпадения чрез адреса е начинът, по който Битуорден определя кои елементи да предложи за автоматично попълване.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "„Регулярен израз“ е по-сложен метод, който е и по-рисков, тъй като може да застраши сигурността на данните за вписване.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "„Започва с“ е по-сложен метод, който е и по-рисков, тъй като може да застраши сигурността на данните за вписване.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Повече относно разпознаването на съвпадения", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Разширени настройки", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Продължаване към настройките на браузъра?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Копиране на $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Копиране на $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Зададен е ПИН код за отключване" }, + "unlockWithBiometricSet": { + "message": "Отключване с биометричен набор" + }, "authenticating": { "message": "Удостоверяване" }, @@ -5067,7 +5252,7 @@ "description": "Represents the ~ key in screen reader content as a readable word" }, "backtickCharacterDescriptor": { - "message": "Backtick", + "message": "Обратен апостроф", "description": "Represents the ` key in screen reader content as a readable word" }, "exclamationCharacterDescriptor": { @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Нямате права за преглед на тази страница. Опитайте да се впишете с друг акаунт." + }, + "wasmNotSupported": { + "message": "WebAssembly не е включено или не се поддържа от Вашия браузър. За ползването на приложението на Битуорден е необходимо WebAssembly да работи.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Показване на повече" + }, + "showLess": { + "message": "Показване на по-малко" } } diff --git a/apps/browser/src/_locales/bn/messages.json b/apps/browser/src/_locales/bn/messages.json index fe386c53e62..55baca0dad2 100644 --- a/apps/browser/src/_locales/bn/messages.json +++ b/apps/browser/src/_locales/bn/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "ভল্ট খুঁজুন" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "সম্পাদনা" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "বৈশিষ্ট্য অনুপলব্ধ" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "প্রিমিয়াম সদস্য" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "নিরাপত্তা কোড" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "উদাহরণ" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Bitwarden আনলক করার জন্য আপনার পিন কোডটি সেট করুন। আপনি যদি অ্যাপ্লিকেশনটি থেকে পুরোপুরি লগ আউট করেন তবে আপনার পিন সেটিংস রিসেট করা হবে।" }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "পিন কোড প্রয়োজন।" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "প্রধান পাসওয়ার্ড আপডেট করা হয়েছে" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/bs/messages.json b/apps/browser/src/_locales/bs/messages.json index b7982ba4981..7ad375dabf0 100644 --- a/apps/browser/src/_locales/bs/messages.json +++ b/apps/browser/src/_locales/bs/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ca/messages.json b/apps/browser/src/_locales/ca/messages.json index 005c100f105..3edfb98eba2 100644 --- a/apps/browser/src/_locales/ca/messages.json +++ b/apps/browser/src/_locales/ca/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logotip de Bitwarden" }, "extName": { "message": "Bitwarden - Gestor de contrasenyes", @@ -547,6 +547,9 @@ "searchVault": { "message": "Cerca en la caixa forta" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edita" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Demana d'actualitzar els inicis de sessió existents" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Característica no disponible" }, - "encryptionKeyMigrationRequired": { - "message": "Cal migrar la clau de xifratge. Inicieu la sessió a la caixa forta web per actualitzar la clau de xifratge." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Subscripció Premium" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Codi de seguretat" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Clau SSH" }, + "typeNote": { + "message": "Nota" + }, "newItemHeader": { "message": "Nou $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Configureu el vostre codi PIN per desbloquejar Bitwarden. La configuració del PIN es restablirà si tanqueu la sessió definitivament." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Es necessita el codi PIN." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Una política d'organització ha bloquejat la importació d'elements a la vostra caixa forta individual." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Dominis", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Canvia" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Heu de verificar el correu electrònic per utilitzar aquesta característica. Podeu verificar el vostre correu electrònic a la caixa forta web." }, + "masterPasswordSuccessfullySet": { + "message": "La contrasenya mestra s'ha configurat correctament" + }, "updatedMasterPassword": { "message": "Contrasenya mestra actualitzada" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Sol·licitud enviada" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Contrasenya mestra exposada" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Cal l'aprovació del dispositiu. Seleccioneu una opció d'aprovació a continuació:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Sol·liciteu l'aprovació de l'administrador" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Es requereix un identificador SSO de l'organització." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No hi ha Sends actius", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Utilitzeu Send per compartir informació xifrada de manera segura amb qualsevol persona.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Formats comuns", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Voleu continuar a la configuració del navegador?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Desbloqueja amb conjunt biomètric" + }, "authenticating": { "message": "S'està autenticant" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/cs/messages.json b/apps/browser/src/_locales/cs/messages.json index 6fc2d1ddb34..0c117fded02 100644 --- a/apps/browser/src/_locales/cs/messages.json +++ b/apps/browser/src/_locales/cs/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Vyhledat v trezoru" }, + "resetSearch": { + "message": "Resetovat hledání" + }, "edit": { "message": "Upravit" }, @@ -1003,7 +1006,7 @@ "message": "Prohledat složku" }, "searchCollection": { - "message": "Prohledat kolekci" + "message": "Prohledat sbírku" }, "searchType": { "message": "Typ hledání" @@ -1173,6 +1176,12 @@ "message": "Ale ne! Nemohli jsme to uložit. Zkuste zadat podrobnosti ručně.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Po změně hesla se budete muset přihlásit pomocí svého nového hesla. Aktivní relace na jiných zařízeních budou odhlášeny do jedné hodiny." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Pro dokončení obnovy účtu změňte hlavní heslo." + }, "enableChangedPasswordNotification": { "message": "Zeptat se na aktualizaci existujícího přihlášení" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funkce je nedostupná" }, - "encryptionKeyMigrationRequired": { - "message": "Vyžaduje se migrace šifrovacího klíče. Pro aktualizaci šifrovacího klíče se přihlaste přes webový trezor." + "legacyEncryptionUnsupported": { + "message": "Staré šifrování již není podporováno. Kontaktujte podporu pro obnovení Vašeho účtu." }, "premiumMembership": { "message": "Prémiové členství" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Bezpečnostní kód" }, + "cardNumber": { + "message": "číslo karty" + }, "ex": { "message": "např." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH klíč" }, + "typeNote": { + "message": "Poznámka" + }, "newItemHeader": { "message": "Nové $TYPE$", "placeholders": { @@ -1965,10 +1980,10 @@ "message": "Zpět" }, "collections": { - "message": "Kolekce" + "message": "Sbírky" }, "nCollections": { - "message": "$COUNT$ kolekcí", + "message": "$COUNT$ sbírek", "placeholders": { "count": { "content": "$1", @@ -2111,7 +2126,7 @@ "message": "Nepatříte do žádné organizace. Organizace umožňují bezpečné sdílení položek s ostatními uživateli." }, "noCollectionsInList": { - "message": "Žádné kolekce k zobrazení." + "message": "Žádné sbírky k zobrazení." }, "ownership": { "message": "Vlastnictví" @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Nastavte svůj PIN kód pro odemknutí trezoru. Pokud se zcela odhlásíte z aplikace bude Váš aktuální PIN resetován." }, - "setYourPinCode1": { - "message": "Váš PIN bude použit k odemknutí Bitwardenu namísto hlavního hesla. Pokud se někdy plně odhlásíte z Bitwarden, Váš PIN kód se obnoví." + "setPinCode": { + "message": "Tento PIN můžete použít k odemknutí Bitwardenu. Váš PIN bude resetován, pokud seněkdy úplně odhlásíte z aplikace." }, "pinRequired": { "message": "Je vyžadován PIN kód." @@ -2184,7 +2199,7 @@ "message": "Vyžadovat hlavní heslo při restartu prohlížeče" }, "selectOneCollection": { - "message": "Musíte vybrat alespoň jednu kolekci." + "message": "Musíte vybrat alespoň jednu sbírku." }, "cloneItem": { "message": "Duplikovat položku" @@ -2476,7 +2491,7 @@ "message": "Tuto akci nelze provést v postranním panelu, zkuste akci znovu v novém okně." }, "personalOwnershipSubmitError": { - "message": "Z důvodu podnikových zásad nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte z dostupných kolekcí." + "message": "Z důvodu podnikových zásad nemůžete ukládat položky do svého osobního trezoru. Změňte vlastnictví položky na organizaci a poté si vyberte dostupných sbírek." }, "personalOwnershipPolicyInEffect": { "message": "Zásady organizace ovlivňují možnosti vlastnictví." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Zásady organizace zablokovaly importování položek do Vašeho osobního trezoru." }, + "restrictCardTypeImport": { + "message": "Nelze importovat typy položek karty" + }, + "restrictCardTypeImportDesc": { + "message": "Zásady nastavené 1 nebo více organizací Vám brání v importu karet do Vašeho trezoru." + }, "domainsTitle": { "message": "Domény", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Změnit" }, + "changePassword": { + "message": "Změnit heslo", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Změnit heslo - $ITEMNAME$", "placeholders": { @@ -2524,11 +2549,14 @@ } } }, + "atRiskPassword": { + "message": "Ohrožené heslo" + }, "atRiskPasswords": { "message": "Ohrožená hesla" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ Vás žádá o změnu 1 hesla, protože je v ohrožení.", + "message": "$ORGANIZATION$ Vás žádá o změnu 1 hesla, protože je ohroženo.", "placeholders": { "organization": { "content": "$1", @@ -2537,7 +2565,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ Vás žádá o změnu $COUNT$ hesel, protože jsou v ohrožení.", + "message": "$ORGANIZATION$ Vás žádá o změnu $COUNT$ hesel, protože jsou ohrožena.", "placeholders": { "organization": { "content": "$1", @@ -2550,7 +2578,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Vaše organizace Vás žádají o změnu $COUNT$ hesel, protože jsou v ohrožení.", + "message": "Vaše organizace Vás žádají o změnu $COUNT$ hesel, protože jsou ohrožena.", "placeholders": { "count": { "content": "$1", @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Vaše heslo pro tuto stránku je ohrožené. $ORGANIZATION$ Vás požádala, abyste jej změnili.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ chce, abyste změnili toto heslo, protože je ohrožené. Přejděte do nastavení účtu a změňte heslo.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Zkontrolovat a změnit jedno ohrožené heslo" }, @@ -2577,20 +2625,20 @@ "message": "Aktualizujte svá nastavení, abyste mohli rychle automaticky vyplňovat hesla a generovat nová hesla." }, "reviewAtRiskLogins": { - "message": "Kontrola rizikových přihlášení" + "message": "Kontrola ohrožených přihlášení" }, "reviewAtRiskPasswords": { - "message": "Kontrola rizikových hesel" + "message": "Kontrola ohrožených hesel" }, "reviewAtRiskLoginsSlideDesc": { "message": "Hesla Vaší organizace jsou ohrožena, protože jsou slabá, opakovaně používaná nebo odhalená.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Ilustrace seznamu přihlášení, která jsou riziková." + "message": "Ilustrace seznamu přihlášení, která jsou ohrožená." }, "generatePasswordSlideDesc": { - "message": "Rychle vygeneruje silné, unikátní heslo s nabídkou automatického vyplňování Bitwarden na rizikových stránkách.", + "message": "Rychle vygeneruje silné, unikátní heslo s nabídkou automatického vyplňování Bitwarden na ohrožených stránkách.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Abyste mohli tuto funkci používat, musíte ověřit svůj e-mail. Svůj e-mail můžete ověřit ve webovém trezoru." }, + "masterPasswordSuccessfullySet": { + "message": "Hlavní heslo bylo úspěšně nastaveno" + }, "updatedMasterPassword": { "message": "Hlavní heslo bylo aktualizováno" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Požadavek odeslán" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Požadavek na přihlášení byl schválen pro $EMAIL$ na $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Pokus o přihlášení byl zamítnut z jiného zařízení. Pokud jste to Vy, zkuste se znovu přihlásit do zařízení." + }, + "device": { + "message": "Zařízení" + }, + "loginStatus": { + "message": "Stav přihlášení" + }, + "masterPasswordChanged": { + "message": "Hlavní heslo bylo uloženo" + }, "exposedMasterPassword": { "message": "Odhalené hlavní heslo" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Zapamatovat si toto zařízení pro bezproblémové budoucí přihlášení" }, + "manageDevices": { + "message": "Spravovat zařízení" + }, + "currentSession": { + "message": "Aktuální relace" + }, + "mobile": { + "message": "Mobil", + "description": "Mobile app" + }, + "extension": { + "message": "Rozšíření", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Počítač", + "description": "Desktop app" + }, + "webVault": { + "message": "Webový trezor" + }, + "webApp": { + "message": "Webová aplikace" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Čekající požadavek" + }, + "firstLogin": { + "message": "První přihlášení" + }, + "trusted": { + "message": "Důvěryhodný" + }, + "needsApproval": { + "message": "Vyžaduje schválení" + }, + "devices": { + "message": "Zařízení" + }, + "accessAttemptBy": { + "message": "Pokus o přístup z $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potvrdit přístup" + }, + "denyAccess": { + "message": "Zamítnout přístup" + }, + "time": { + "message": "Čas" + }, + "deviceType": { + "message": "Typ zařízení" + }, + "loginRequest": { + "message": "Požadavek na přihlášení" + }, + "thisRequestIsNoLongerValid": { + "message": "Tento požadavek již není platný." + }, + "loginRequestHasAlreadyExpired": { + "message": "Požadavek na přihlášení již vypršel." + }, + "justNow": { + "message": "Právě teď" + }, + "requestedXMinutesAgo": { + "message": "Požadováno před $MINUTES$ minutami", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Vyžaduje se schválení zařízení. Vyberte možnost schválení níže:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Žádost o schválení správcem" }, + "unableToCompleteLogin": { + "message": "Nelze dokončit přihlášení" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Musíte se přihlásit na důvěryhodném zařízení nebo požádat správce, aby Vám přiřadil heslo." + }, "ssoIdentifierRequired": { "message": "Je vyžadován SSO identifikátor organizace." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Důvěřovat uživateli" }, - "sendsNoItemsTitle": { - "message": "Žádná aktivní Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Použijte Send pro bezpečné sdílení šifrovaných informací s kýmkoliv.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Posílejte citlivé informace bezpečně", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3967,7 +4129,7 @@ "message": "Zvolte složku" }, "selectImportCollection": { - "message": "Zvolte kolekci" + "message": "Zvolte sbírku" }, "importTargetHint": { "message": "Pokud chcete obsah importovaného souboru přesunout do složky $DESTINATION$, vyberte tuto volbu", @@ -4153,7 +4315,7 @@ "message": "Zkuste to znovu nebo vyhledejte e-mail od LastPass pro ověření, že jste to Vy." }, "collection": { - "message": "Kolekce" + "message": "Sbírka" }, "lastPassYubikeyDesc": { "message": "Vložte YubiKey spojený s Vaším účtem LastPass do USB portu Vašeho počítače a stiskněte jeho tlačítko." @@ -4216,6 +4378,26 @@ "message": "Společné formáty", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Detekce shody URI je způsob, jakým Bitwarden identifikuje návrhy automatického vyplňování.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regulární výraz\" je pokročilá volba se zvýšeným rizikem odhalení přihlašovacích údajů.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Začíná na\" je pokročilá volba se zvýšeným rizikem odhalení přihlašovacích údajů.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Další informace o detekci shody", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Rozšířené volby", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Pokračovat do nastavení prohlížeče?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Kopírovat $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Kopírovat $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4417,7 +4599,7 @@ "message": "Žádné hodnoty ke zkopírování" }, "assignToCollections": { - "message": "Přiřadit ke kolekcím" + "message": "Přiřadit ke sbírkám" }, "copyEmail": { "message": "Kopírovat e-mail" @@ -4441,7 +4623,7 @@ "message": "Vzhled" }, "errorAssigningTargetCollection": { - "message": "Chyba při přiřazování cílové kolekce." + "message": "Chyba při přiřazování do cílové sbírky." }, "errorAssigningTargetFolder": { "message": "Chyba při přiřazování cílové složky." @@ -4733,10 +4915,10 @@ "message": "Přiřadit" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Jen členové organizace s přístupem k těmto kolekcím budou moci vidět položku." + "message": "Jen členové organizace s přístupem k těmto sbírkám budou moci vidět položku." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Jen členové organizace s přístupem k těmto kolekcím budou moci vidět položky." + "message": "Jen členové organizace s přístupem k těmto sbírkám budou moci vidět položky." }, "bulkCollectionAssignmentWarning": { "message": "Vybrali jste $TOTAL_COUNT$ položek. Nemůžete aktualizovat $READONLY_COUNT$ položek, protože nemáte oprávnění k úpravám.", @@ -4837,7 +5019,7 @@ } }, "selectCollectionsToAssign": { - "message": "Vyberte kolekce pro přiřazení" + "message": "Vyberte sbírky pro přiřazení" }, "personalItemTransferWarningSingular": { "message": "1 položka bude trvale převedena do vybrané organizace. Tuto položku již nebudete vlastnit." @@ -4874,7 +5056,7 @@ } }, "successfullyAssignedCollections": { - "message": "Kolekce byly úspěšně přiřazeny" + "message": "Sbírky byly úspěšně přiřazeny" }, "nothingSelected": { "message": "Nevybrali jste žádné položky." @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "PIN pro odemknutí byl nastaven" }, + "unlockWithBiometricSet": { + "message": "Odemknout pomocí biometrie" + }, "authenticating": { "message": "Ověřování" }, @@ -5242,7 +5427,7 @@ "message": "SSH klíč byl úspěšně importován" }, "cannotRemoveViewOnlyCollections": { - "message": "Nemůžete odebrat kolekce s oprávněními jen pro zobrazení: $COLLECTIONS$", + "message": "Nemůžete odebrat sbírky s oprávněními jen pro zobrazení: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Nemáte oprávnění k zobrazení této stránky. Zkuste se přihlásit jiným účtem." + }, + "wasmNotSupported": { + "message": "WebAssembly není ve Vašem prohlížeči podporováno nebo není povoleno. WebAssembly je vyžadováno pro použití aplikace Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Zobrazit více" + }, + "showLess": { + "message": "Zobrazit méně" } } diff --git a/apps/browser/src/_locales/cy/messages.json b/apps/browser/src/_locales/cy/messages.json index eec15c8ed9a..8307b994fe0 100644 --- a/apps/browser/src/_locales/cy/messages.json +++ b/apps/browser/src/_locales/cy/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logo Bitwarden" }, "extName": { "message": "Rheolydd cyfrineiriau Bitwarden", @@ -335,7 +335,7 @@ "message": "Mwy gan Bitwarden" }, "continueToBitwardenDotCom": { - "message": "Continue to bitwarden.com?" + "message": "Parhau i bitwarden.com?" }, "bitwardenForBusiness": { "message": "Bitwarden for Business" @@ -547,6 +547,9 @@ "searchVault": { "message": "Chwilio'r gell" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Golygu" }, @@ -668,13 +671,13 @@ "message": "Mae eich cell ar glo. Gwiriwch eich hunaniaeth i barhau." }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Mae eich cell ar glo" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Mae eich cyfrif ar glo" }, "or": { - "message": "or" + "message": "neu" }, "unlock": { "message": "Datgloi" @@ -762,7 +765,7 @@ "message": "Your master password cannot be recovered if you forget it!" }, "masterPassHintLabel": { - "message": "Master password hint" + "message": "Awgrym o'ch prif gyfrinair" }, "errorOccurred": { "message": "Bu gwall" @@ -799,13 +802,13 @@ "message": "Mae eich cyfrif wedi cael ei greu!" }, "youHaveBeenLoggedIn": { - "message": "You have been logged in!" + "message": "Rydych wedi cael eich mewngofnodi!" }, "youSuccessfullyLoggedIn": { "message": "You successfully logged in" }, "youMayCloseThisWindow": { - "message": "You may close this window" + "message": "Gallwch cau'r ffenestr hon bellach" }, "masterPassSent": { "message": "Rydym ni wedi anfon ebost atoch gydag awgrym ar gyfer eich prif gyfrinair." @@ -860,7 +863,7 @@ "message": "Logged out" }, "loggedOutDesc": { - "message": "You have been logged out of your account." + "message": "Rydych wedi cael eich allgofnodi o'ch cyfrif." }, "loginExpired": { "message": "Mae eich sesiwn wedi dod i ben." @@ -872,13 +875,13 @@ "message": "Mewngofnodi i Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Rhowch y cod a anfonwyd i'ch ebost" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Rhowch y cod o'ch ap dilysu" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Gwasgwch eich YubiKey i ddilysu" }, "duoTwoFactorRequiredPageSubtitle": { "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." @@ -929,13 +932,13 @@ "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." }, "twoStepLoginConfirmationTitle": { - "message": "Continue to web app?" + "message": "Parhau i'r ap gwe?" }, "editedFolder": { "message": "Ffolder wedi'i chadw" }, "deleteFolderConfirmation": { - "message": "Are you sure you want to delete this folder?" + "message": "Ydych chi'n sicr yr hoffech chi ddileu'r ffolder hon?" }, "deletedFolder": { "message": "Ffolder wedi'i dileu" @@ -1076,11 +1079,11 @@ "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Golygu cyn cadw", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Hysbysiad newydd" }, "labelWithNotification": { "message": "$LABEL$: New notification", @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Gofyn i ddiweddaru manylion mewngofnodi sy'n bodoli eisoes" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Aelodaeth uwch" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Cod diogelwch" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "engh." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Allwedd SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "$TYPE$ newydd", "placeholders": { @@ -2090,7 +2105,7 @@ "message": "Tynnu" }, "default": { - "message": "Default" + "message": "Rhagosodiad" }, "dateUpdated": { "message": "Updated", @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Mae angen cod PIN." @@ -2222,7 +2237,7 @@ "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Addasu'r gell" }, "vaultTimeoutAction": { "message": "Vault timeout action" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Cyfrineiriau mewn perygl" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Diweddarwyd y prif gyfrinair" }, @@ -3132,7 +3183,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Defnyddiwch $RECOMMENDED$ neu fwy o eiriau i gynhyrchu cyfrinymadrodd cryff.", + "message": " Defnyddiwch $RECOMMENDED$ neu fwy o eiriau i gynhyrchu cyfrinymadrodd cryf.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4023,7 +4185,7 @@ "message": "Passkey" }, "accessing": { - "message": "Accessing" + "message": "Yn cysylltu â" }, "loggedInExclamation": { "message": "Logged in!" @@ -4180,7 +4342,7 @@ "message": "Account limit reached. Log out of an account to add another." }, "active": { - "message": "active" + "message": "gweithredol" }, "locked": { "message": "locked" @@ -4216,6 +4378,26 @@ "message": "Fformatau cyffredin", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4654,7 +4836,7 @@ "message": "Delete website" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Rhagosodiad ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -4703,10 +4885,10 @@ } }, "enableAnimations": { - "message": "Enable animations" + "message": "Galluogi animeiddio" }, "showAnimations": { - "message": "Show animations" + "message": "Dangos animeiddio" }, "addAccount": { "message": "Ychwanegu cyfrif" @@ -4930,7 +5112,7 @@ "message": "Text Sends" }, "accountActions": { - "message": "Account actions" + "message": "Gweithredoedd y cyfrif" }, "showNumberOfAutofillSuggestions": { "message": "Show number of login autofill suggestions on extension icon" @@ -4939,7 +5121,7 @@ "message": "Show quick copy actions on Vault" }, "systemDefault": { - "message": "System default" + "message": "Rhagosodiad y sytem" }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5206,13 +5391,13 @@ "message": "Beta" }, "extensionWidth": { - "message": "Extension width" + "message": "Lled yr estyniad" }, "wide": { - "message": "Wide" + "message": "Llydan" }, "extraWide": { - "message": "Extra wide" + "message": "Llydan iawn" }, "sshKeyWrongPassword": { "message": "The password you entered is incorrect." @@ -5260,7 +5445,7 @@ "message": "Change at-risk password" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Dewisiadau'r gell" }, "emptyVaultDescription": { "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/da/messages.json b/apps/browser/src/_locales/da/messages.json index 066ef9c9d9a..0ff87e6e14f 100644 --- a/apps/browser/src/_locales/da/messages.json +++ b/apps/browser/src/_locales/da/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Søg i boks" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Redigér" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Bed om at opdatere eksisterende login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funktion ikke tilgængelig" }, - "encryptionKeyMigrationRequired": { - "message": "Krypteringsnøglemigrering nødvendig. Log ind gennem web-boksen for at opdatere krypteringsnøglen." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium-medlemskab" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Sikkerhedskode" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "eks." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH-nøgle" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Ny $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Indstil din pinkode til at låse Bitwarden op. Dine pin-indstillinger nulstilles, hvis du nogensinde logger helt ud af programmet." }, - "setYourPinCode1": { - "message": "PIN-koden vil blive brugt til oplåsning af Bitwarden i stedet for hovedadgangskoden. PIN-koden nulstilles, hvis man logger helt ud af Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Pinkode er påkrævet." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "En organisationspolitik hindrer import af emner til den individuelle boks." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domæner", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Du skal bekræfte din e-mail for at bruge denne funktion. Du kan bekræfte din e-mail i web-boksen." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Hovedadgangskode opdateret" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Kompromitteret hovedadgangskode" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Husk denne enhed for at gøre fremtidige indlogninger gnidningsløse" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Enhedsgodkendelse kræves. Vælg en godkendelsesmulighed nedenfor:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Anmod om admin-godkendelse" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organisations SSO-identifikator kræves." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "Ingen aktive Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Brug Send til at dele krypterede oplysninger sikkert med nogen.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Almindelige formater", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Fortsæt til Browserindstillinger?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Godkender" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/de/messages.json b/apps/browser/src/_locales/de/messages.json index f9818afe58f..ffaf490fbf8 100644 --- a/apps/browser/src/_locales/de/messages.json +++ b/apps/browser/src/_locales/de/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Tresor durchsuchen" }, + "resetSearch": { + "message": "Suche zurücksetzen" + }, "edit": { "message": "Bearbeiten" }, @@ -1060,7 +1063,7 @@ "message": "Soll Bitwarden sich dieses Passwort merken?" }, "notificationAddSave": { - "message": "Ja, jetzt speichern" + "message": "Speichern" }, "notificationViewAria": { "message": "$ITEMNAME$ anzeigen, öffnet sich in neuem Fenster", @@ -1173,6 +1176,12 @@ "message": "Oh nein! Das konnten wir nicht speichern. Versuch, die Details manuell einzugeben.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Nachdem du dein Passwort geändert hast, musst du dich mit deinem neuen Passwort anmelden. Aktive Sitzungen auf anderen Geräten werden innerhalb einer Stunde abgemeldet." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Ändere dein Master-Passwort, um die Kontowiederherstellung abzuschließen." + }, "enableChangedPasswordNotification": { "message": "Nach dem Aktualisieren bestehender Zugangsdaten fragen" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funktion nicht verfügbar" }, - "encryptionKeyMigrationRequired": { - "message": "Verschlüsselungscode-Migration erforderlich. Bitte melde dich über den Web-Tresor an, um deinen Verschlüsselungscode zu aktualisieren." + "legacyEncryptionUnsupported": { + "message": "Die veraltete Verschlüsselung wird nicht mehr unterstützt. Bitte kontaktiere den Support, um dein Konto wiederherzustellen." }, "premiumMembership": { "message": "Premium-Mitgliedschaft" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Sicherheitscode" }, + "cardNumber": { + "message": "Kartennummer" + }, "ex": { "message": "Bsp." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH-Schlüssel" }, + "typeNote": { + "message": "Notiz" + }, "newItemHeader": { "message": "Neue $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Gebe deinen PIN-Code für das Entsperren von Bitwarden ein. Deine PIN-Einstellungen werden zurückgesetzt, wenn du dich vollständig von der Anwendung abmeldest." }, - "setYourPinCode1": { - "message": "Deine PIN wird verwendet, um Bitwarden anstatt deines Master-Passworts zu entsperren. Deine PIN wird zurückgesetzt, wenn du dich jemals vollständig von Bitwarden abgemeldet hast." + "setPinCode": { + "message": "Du kannst diese PIN verwenden, um Bitwarden zu entsperren. Deine PIN wird zurückgesetzt, wenn du dich vollständig aus der Anwendung abmeldest." }, "pinRequired": { "message": "PIN-Code ist erforderlich." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Eine Organisationsrichtlinie hat das Importieren von Einträgen in deinen persönlichen Tresor deaktiviert." }, + "restrictCardTypeImport": { + "message": "Karten-Eintragstypen können nicht importiert werden" + }, + "restrictCardTypeImportDesc": { + "message": "Eine von einer oder mehreren Organisationen festgelegte Richtlinie verhindert, dass du Karten in deinen Tresor importieren kannst." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Ändern" }, + "changePassword": { + "message": "Passwort ändern", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Passwort ändern - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Gefährdetes Passwort" + }, "atRiskPasswords": { "message": "Gefährdete Passwörter" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Dein Passwort für diese Website ist gefährdet. $ORGANIZATION$ hat darum gebeten, dass du es änderst.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ möchte, dass du dieses Passwort änderst, da es gefährdet ist. Wechsel zu deinen Kontoeinstellungen, um das Passwort zu ändern.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Überprüfe und ändere ein gefährdetes Passwort" }, @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Maximale Zugriffsanzahl erreicht", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Du musst deine E-Mail Adresse verifizieren, um diese Funktion nutzen zu können. Du kannst deine E-Mail im Web-Tresor verifizieren." }, + "masterPasswordSuccessfullySet": { + "message": "Master-Passwort erfolgreich festgelegt" + }, "updatedMasterPassword": { "message": "Master-Passwort aktualisiert" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Anfrage gesendet" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Anmeldeanfrage für $EMAIL$ auf $DEVICE$ genehmigt", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Du hast einen Anmeldeversuch von einem anderen Gerät abgelehnt. Wenn du das wirklich warst, versuche dich erneut mit dem Gerät anzumelden." + }, + "device": { + "message": "Gerät" + }, + "loginStatus": { + "message": "Anmeldestatus" + }, + "masterPasswordChanged": { + "message": "Master-Passwort gespeichert" + }, "exposedMasterPassword": { "message": "Kompromittiertes Master-Passwort" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Dieses Gerät merken, um zukünftige Anmeldungen reibungslos zu gestalten" }, + "manageDevices": { + "message": "Geräte verwalten" + }, + "currentSession": { + "message": "Aktuelle Sitzung" + }, + "mobile": { + "message": "Mobile App", + "description": "Mobile app" + }, + "extension": { + "message": "Erweiterung", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web-Tresor" + }, + "webApp": { + "message": "Web-App" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Anfrage ausstehend" + }, + "firstLogin": { + "message": "Erste Anmeldung" + }, + "trusted": { + "message": "Vertrauenswürdig" + }, + "needsApproval": { + "message": "Benötigt Genehmigung" + }, + "devices": { + "message": "Geräte" + }, + "accessAttemptBy": { + "message": "Zugriffsversuch von $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Zugriff bestätigen" + }, + "denyAccess": { + "message": "Zugriff ablehnen" + }, + "time": { + "message": "Zeit" + }, + "deviceType": { + "message": "Gerätetyp" + }, + "loginRequest": { + "message": "Anmeldungsanfrage" + }, + "thisRequestIsNoLongerValid": { + "message": "Diese Anfrage ist nicht mehr gültig." + }, + "loginRequestHasAlreadyExpired": { + "message": "Anmeldeanfrage ist bereits abgelaufen." + }, + "justNow": { + "message": "Gerade eben" + }, + "requestedXMinutesAgo": { + "message": "Vor $MINUTES$ Minuten angefordert", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Geräte-Genehmigung erforderlich. Wähle unten eine Genehmigungsoption aus:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Admin-Genehmigung anfragen" }, + "unableToCompleteLogin": { + "message": "Anmeldung kann nicht abgeschlossen werden" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Du musst dich auf einem vertrauenswürdigen Gerät anmelden oder deinem Administrator bitten, dir ein Passwort zuzuweisen." + }, "ssoIdentifierRequired": { "message": "SSO-Kennung der Organisation erforderlich." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Benutzer vertrauen" }, - "sendsNoItemsTitle": { - "message": "Keine aktiven Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Verwende Send, um verschlüsselte Informationen sicher mit anderen zu teilen.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Sensible Informationen sicher versenden", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Gängigste Formate", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Die URI-Übereinstimmungserkennung ist die Methode, mit der Bitwarden Auto-Ausfüllen-Vorschläge erkennt.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regulärer Ausdruck\" ist eine erweiterte Option mit erhöhtem Risiko der Kompromittierung von Zugangsdaten.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Beginnt mit\" ist eine erweiterte Option mit erhöhtem Risiko der Kompromittierung von Zugangsdaten.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Mehr über die Übereinstimmungs-Erkennung", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Erweiterte Optionen", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Weiter zu den Browsereinstellungen?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "$FIELD$, $VALUE$ kopieren", + "copyFieldCipherName": { + "message": "$FIELD$, $CIPHERNAME$ kopieren", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Entsperr-PIN festgelegt" }, + "unlockWithBiometricSet": { + "message": "Mit Biometrie entsperren eingerichtet" + }, "authenticating": { "message": "Authentifizierung" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Du hast keine Berechtigung, diese Seite anzuzeigen. Versuche dich mit einem anderen Konto anzumelden." + }, + "wasmNotSupported": { + "message": "WebAssembly wird von deinem Browser nicht unterstützt oder ist nicht aktiviert. WebAssembly wird benötigt, um die Bitwarden-App nutzen zu können.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Mehr anzeigen" + }, + "showLess": { + "message": "Weniger anzeigen" } } diff --git a/apps/browser/src/_locales/el/messages.json b/apps/browser/src/_locales/el/messages.json index 9d55ed3f0c7..4ce77543a45 100644 --- a/apps/browser/src/_locales/el/messages.json +++ b/apps/browser/src/_locales/el/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Αναζήτηση στο vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Επεξεργασία" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ζητήστε να ενημερώσετε την υπάρχουσα σύνδεση" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Μη διαθέσιμη λειτουργία" }, - "encryptionKeyMigrationRequired": { - "message": "Απαιτείται μεταφορά κλειδιού κρυπτογράφησης. Παρακαλούμε συνδεθείτε μέσω του διαδικτυακού θησαυ/κίου για να ενημερώσετε το κλειδί κρυπτογράφησης." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Συνδρομή Premium" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Κωδικός ασφαλείας" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "πχ." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Κλειδί SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Νέα $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Ορίστε τον κωδικό PIN για να ξεκλειδώσετε το Bitwarden. Οι ρυθμίσεις PIN θα επαναρυθμιστούν αν αποσυνδεθείτε πλήρως από την εφαρμογή." }, - "setYourPinCode1": { - "message": "Το PIN σας θα χρησιμοποιείται για το ξεκλείδωμα του Bitwarden αντί του κύριου κωδικού πρόσβασης. Αν αποσυνδεθείτε εντελώς από το Bitwarden, θα γίνει επαναφορά του PIN σας." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Απαιτείται κωδικός PIN." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Μια οργανωτική πολιτική έχει αποτρέψει την εισαγωγή στοιχείων στο προσωπικό θησαυ/κιο σας." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Τομείς", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Αλλαγή" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Αλλαγή κωδικού πρόσβασης - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Κωδικοί πρόσβασης σε κίνδυνο" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Πρέπει να επαληθεύσετε το email σας για να χρησιμοποιήσετε αυτή τη δυνατότητα. Μπορείτε να επαληθεύσετε το email σας στο web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Ενημερώθηκε ο κύριος κωδικός πρόσβασης" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Εκτεθειμένος Κύριος Κωδικός Πρόσβασης" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Απομνημόνευση αυτής της συσκευής για την αυτόματες συνδέσεις στο μέλλον" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Απαιτείται έγκριση συσκευής. Επιλέξτε μια επιλογή έγκρισης παρακάτω:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Αίτηση έγκρισης διαχειριστή" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Απαιτείται αναγνωριστικό οργανισμού SSO." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "Κανένα ενεργό Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Χρήση Send για ασφαλή κοινοποίηση κρυπτογραφημένων πληροφοριών με οποιονδήποτε.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Κοινοί τύποι", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Συνεχίστε στις ρυθμίσεις περιηγητή;", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Ταυτοποίηση" }, @@ -5230,16 +5415,16 @@ "message": "Enter password" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "Το κλειδί SSH δεν είναι έγκυρο" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "Ο τύπος κλειδιού SSH δεν υποστηρίζεται" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Εισαγωγή κλειδιού από το πρόχειρο" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "Επιτυχής εισαγωγή κλειδιού SSH" }, "cannotRemoveViewOnlyCollections": { "message": "Δεν μπορείτε να αφαιρέσετε συλλογές που έχουν μόνο δικαιώματα Προβολής: $COLLECTIONS$", @@ -5293,10 +5478,10 @@ "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 ειδοποίηση" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Εισαγωγή υπαρχόντων κωδικών πρόσβασης" }, "emptyVaultNudgeBody": { "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index 6a57da0f671..f8dde376b35 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2910,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3442,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3535,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3556,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3641,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4242,6 +4377,26 @@ "commonImportFormats": { "message": "Common formats", "description": "Label indicating the most common import formats" + }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption":{ + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", @@ -4426,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5070,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5411,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/en_GB/messages.json b/apps/browser/src/_locales/en_GB/messages.json index bc9452a7cad..8acf75e2ee5 100644 --- a/apps/browser/src/_locales/en_GB/messages.json +++ b/apps/browser/src/_locales/en_GB/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "e.g." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organisation policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organisations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organisation SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/en_IN/messages.json b/apps/browser/src/_locales/en_IN/messages.json index ef329ac551c..281caeac0d5 100644 --- a/apps/browser/src/_locales/en_IN/messages.json +++ b/apps/browser/src/_locales/en_IN/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "e.g." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organisation policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organisations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated Master Password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organisation SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/es/messages.json b/apps/browser/src/_locales/es/messages.json index 7b970f996a9..0e1185148df 100644 --- a/apps/browser/src/_locales/es/messages.json +++ b/apps/browser/src/_locales/es/messages.json @@ -197,7 +197,7 @@ "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { - "message": "Autorrellenar" + "message": "Autocompletar" }, "autoFillLogin": { "message": "Autocompletar inicio de sesión" @@ -547,6 +547,9 @@ "searchVault": { "message": "Buscar en caja fuerte" }, + "resetSearch": { + "message": "Restablecer búsqueda" + }, "edit": { "message": "Editar" }, @@ -881,13 +884,13 @@ "message": "Pulsa tu YubiKey para identificarte" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Se requiere inicio de sesión en dos pasos para tu cuenta. Sigue los pasos siguientes para terminar de iniciar sesión." + "message": "Se requiere el inicio de sesión en dos pasos de Duo en tu cuenta. Sigue los siguientes pasos para terminar de iniciar sesión." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Sigue los pasos de abajo para terminar de iniciar sesión." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Sigue los siguientes pasos para terminar de iniciar sesión con tu clave de seguridad." }, "restartRegistration": { "message": "Reiniciar registro" @@ -1076,14 +1079,14 @@ "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Editar antes de guardar", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Nueva notificación" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$: Nueva notificación", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1093,15 +1096,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "guardado en Bitwarden.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "actualizado en Bitwarden.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Seleccionar $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1113,27 +1116,27 @@ } }, "saveAsNewLoginAction": { - "message": "Save as new login", + "message": "Guardar como nuevo inicio de sesión", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Update login", + "message": "Actualizar inicio de sesión", "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "Desbloquea para guardar este inicio de sesión", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { - "message": "Save login", + "message": "Guardar inicio de sesión", "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Actualizar inicio de sesión existente", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Login saved", + "message": "Inicio de sesión guardado", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { @@ -1141,7 +1144,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "¡Buen trabajo! Has dado los pasos para que tú y $ORGANIZATION$ seáis más seguros.", "placeholders": { "organization": { "content": "$1" @@ -1150,7 +1153,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "Gracias por hacer $ORGANIZATION$ más seguro. Tienes $TASK_COUNT$ contraseñas más que actualizar.", "placeholders": { "organization": { "content": "$1" @@ -1162,7 +1165,7 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Cambiar siguiente contraseña", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { @@ -1170,9 +1173,15 @@ "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "Oh no! We couldn't save this. Try entering the details manually.", + "message": "¡Oh no! No pudimos guardar esto. Intenta introducir los datos manualmente.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Solicitar la actualización de los datos de inicio de sesión existentes" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Característica no disponible" }, - "encryptionKeyMigrationRequired": { - "message": "Se requiere migración de la clave de cifrado. Por favor, inicie sesión a través de la caja fuerte para actualizar su clave de cifrado." + "legacyEncryptionUnsupported": { + "message": "La encriptación antigua ya no está soportada. Por favor, contacta con soporte para recuperar tu cuenta." }, "premiumMembership": { "message": "Membresía Premium" @@ -1411,7 +1420,7 @@ "message": "Comprar Premium" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Puedes comprar el Premium desde los ajustes de tu cuenta en la aplicación web de Bitwarden." }, "premiumCurrentMember": { "message": "¡Eres un miembro Premium!" @@ -1447,7 +1456,7 @@ "message": "Copiar TOTP automáticamente" }, "disableAutoTotpCopyDesc": { - "message": "Si tu entrada tiene una clave de autenticación adjunta, el código de verificación TOTP es copiado automáticamente al portapapeles cuando autorellenas una entrada." + "message": "Si tu entrada tiene una clave de autenticación, copiar el código de verificación TOTP a tu portapapeles cuando autocompletes el inicio de sesión." }, "enableAutoBiometricsPrompt": { "message": "Pedir datos biométricos al ejecutar" @@ -1474,14 +1483,14 @@ } }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "No volver a preguntar en este dispositivo durante 30 días" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Selecciona otro método", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Usa tu código de recuperación" }, "insertU2f": { "message": "Inserta tu llave de seguridad en el puerto USB de tu equipo. Si tiene un botón, púlsalo." @@ -1493,10 +1502,10 @@ "message": "Autenticar WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Leer clave de seguridad" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Esperando interacción de la clave de seguridad..." }, "loginUnavailable": { "message": "Entrada no disponible" @@ -1511,7 +1520,7 @@ "message": "Opciones de la autenticación en dos pasos" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Selecciona un método de inicio de sesión en dos pasos" }, "recoveryCodeDesc": { "message": "¿Has perdido el acceso a todos tus métodos de autenticación en dos pasos? Utiliza tu código de recuperación para deshabilitar todos los métodos de autenticación en dos pasos de tu cuenta." @@ -1600,13 +1609,13 @@ "message": "Sugerencias de autocompletar" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "Encuentra fácilmente sugerencias de autocompletado" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "Desactiva los ajustes de autocompletado de tu navegador para que no entren en conflicto con Bitwarden." }, "turnOffBrowserAutofill": { - "message": "Turn off $BROWSER$ autofill", + "message": "Desactivar autocompletado de $BROWSER$", "placeholders": { "browser": { "content": "$1", @@ -1615,22 +1624,22 @@ } }, "turnOffAutofill": { - "message": "Turn off autofill" + "message": "Desactivar autocompletado" }, "showInlineMenuLabel": { - "message": "Show autofill suggestions on form fields" + "message": "Mostrar sugerencias de autocompletado en campos de formulario" }, "showInlineMenuIdentitiesLabel": { - "message": "Display identities as suggestions" + "message": "Mostrar identidades como sugerencias" }, "showInlineMenuCardsLabel": { "message": "Mostrar tarjetas como sugerencias" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Display suggestions when icon is selected" + "message": "Mostrar sugerencias cuando el icono esté seleccionado" }, "showInlineMenuOnFormFieldsDescAlt": { - "message": "Applies to all logged in accounts." + "message": "Se aplica a todas las cuentas a las que se haya iniciado sesión." }, "turnOffBrowserBuiltInPasswordManagerSettings": { "message": "Desactive la configuración del gestor de contraseñas del navegador para evitar conflictos." @@ -1654,25 +1663,25 @@ "message": "Autocompletar al cargar la página" }, "enableAutoFillOnPageLoad": { - "message": "Habilitar autorrellenar al cargar la página" + "message": "Autocompletar al cargar la página" }, "enableAutoFillOnPageLoadDesc": { - "message": "Si se detecta un formulario, realizar automáticamente un autorellenado cuando la web cargue." + "message": "Si se detecta un formulario de inicio de sesión, autocompletar cuando cargue la página web." }, "experimentalFeature": { - "message": "Los sitios web vulnerados o no confiables pueden explotar el autorelleno al cargar la página." + "message": "Los sitios web vulnerados o no confiables pueden explotar el autocompletado al cargar la página." }, "learnMoreAboutAutofillOnPageLoadLinkText": { "message": "Más información sobre riesgos" }, "learnMoreAboutAutofill": { - "message": "Más información sobre el relleno automático" + "message": "Más información sobre el autocompletado" }, "defaultAutoFillOnPageLoad": { "message": "Configuración de autorrelleno por defecto para elementos de inicio de sesión" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Después de activar el autorelleno en Carga de página, puede activar o desactivar la función para entradas individuales. Esta es la configuración predeterminada para elementos de inicio de sesión que no están configurados por separado." + "message": "Puedes desactivar el autocompletado al cargar la página para elementos individuales de inicio de sesión desde la vista de Edición del elemento." }, "itemAutoFillOnPageLoad": { "message": "Auto-relleno en carga de página (si está habilitado en opciones)" @@ -1693,13 +1702,13 @@ "message": "Abrir caja fuerte en la barra lateral" }, "commandAutofillLoginDesc": { - "message": "Autofill the last used login for the current website" + "message": "Autocompletar el último inicio de sesión usado para el sitio web actual" }, "commandAutofillCardDesc": { - "message": "Autofill the last used card for the current website" + "message": "Autocompletar la última tarjeta usada para el sitio web actual" }, "commandAutofillIdentityDesc": { - "message": "Autofill the last used identity for the current website" + "message": "Autocompletar la última identidad usada para el sitio web actual" }, "commandGeneratePasswordDesc": { "message": "Generar y copiar una nueva contraseña aleatoria al portapapeles." @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Código de seguridad" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ej." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Llave SSH" }, + "typeNote": { + "message": "Nota" + }, "newItemHeader": { "message": "Nuevo $TYPE$", "placeholders": { @@ -1959,7 +1974,7 @@ "message": "Borrar historial del generador" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "Si continúas, todas las entradas se eliminarán permanentemente del historial del generador. ¿Estás seguro de que quieres continuar?" }, "back": { "message": "Atrás" @@ -2024,7 +2039,7 @@ "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Dominio base (recomendado)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Establece tu código PIN para desbloquear Bitwarden. Tus ajustes de PIN se reiniciarán si alguna vez cierras tu sesión completamente de la aplicación." }, - "setYourPinCode1": { - "message": "Su PIN se utilizará para desbloquear Bitwarden en lugar de su contraseña maestra. Su PIN se restablecerá si alguna vez cierra completamente la sesión de Bitwarden." + "setPinCode": { + "message": "Puedes usar este PIN para desbloquear Bitwarden. Tu PIN se reiniciará si alguna vez cierras la sesión de la aplicación por completo." }, "pinRequired": { "message": "Código PIN requerido." @@ -2205,7 +2220,7 @@ "message": "Usar esta contraseña" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Usar esta frase de contraseña" }, "useThisUsername": { "message": "Usar este nombre de usuario" @@ -2266,16 +2281,16 @@ "message": "Confirmación de la acción del tiempo de espera" }, "autoFillAndSave": { - "message": "Autorellenar y guardar" + "message": "Autocompletar y guardar" }, "fillAndSave": { "message": "Rellenar y guardar" }, "autoFillSuccessAndSavedUri": { - "message": "Objeto autorellenado y URI guardada" + "message": "Elemento autocompletado y URI guardada" }, "autoFillSuccess": { - "message": "Objeto autorellenado" + "message": "Elemento autocompletado " }, "insecurePageWarning": { "message": "Atención: Esta es una página HTTP no segura, y cualquier información que envíes puede ser vista y cambiada por otros. Este inicio de sesión fue guardado originalmente en una página segura (HTTPS)." @@ -2377,7 +2392,7 @@ "message": "Política de privacidad" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Tu nueva contraseña no puede ser igual a tu contraseña actual." }, "hintEqualsPassword": { "message": "Tu contraseña no puede ser idéntica a la pista de contraseña." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Una política organizacional ha bloqueado la importación de elementos a su caja fuerte personal." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "Una política establecida en 1 o más organizaciones te impide importar tarjetas a tus cajas fuertes." + }, "domainsTitle": { "message": "Dominios", "description": "A category title describing the concept of web domains" @@ -2507,7 +2528,7 @@ "message": "El autorrelleno y otras funcionalidades relacionadas no se ofrecerán para estos sitios web. Debe actualizar la página para que los cambios surtan efecto." }, "autofillBlockedNoticeV2": { - "message": "Autorelleno está desactivado para este sitio web." + "message": "Autocompletado está bloqueado para este sitio web." }, "autofillBlockedNoticeGuidance": { "message": "Cambia esto en los ajustes" @@ -2515,6 +2536,10 @@ "change": { "message": "Cambiar" }, + "changePassword": { + "message": "Cambiar contraseña", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Cambiar contraseña - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Contraseña en riesgo" + }, "atRiskPasswords": { "message": "Contraseñas de riesgo" }, @@ -2550,7 +2578,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Tus organizaciones te están solicitando que cambies las $COUNT$ contraseñas porque están en riesgo.", "placeholders": { "count": { "content": "$1", @@ -2558,11 +2586,31 @@ } } }, + "atRiskChangePrompt": { + "message": "La contraseña para este sitio está en riesgo. $ORGANIZATION$ ha solicitado que la cambies.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ quiere que cambies esta contraseña porque está en riesgo. Navega a los ajustes de tu cuenta para cambiar la contraseña.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Revisa y cambia una contraseña en riesgo" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Revisa y cambia $COUNT$ contraseñas en riesgo", "placeholders": { "count": { "content": "$1", @@ -2577,7 +2625,7 @@ "message": "Update your settings so you can quickly autofill your passwords and generate new ones" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Revisar inicios de sesión en riesgo" }, "reviewAtRiskPasswords": { "message": "Revisar contraseñas de riesgo" @@ -2590,7 +2638,7 @@ "message": "Illustration of a list of logins that are at-risk." }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Genera rápidamente una contraseña segura y única con el menú de autocompletado de Bitwarden en el sitio en riesgo.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { @@ -2647,7 +2695,7 @@ "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ views left", + "message": "$ACCESSCOUNT$ visualizaciones restantes", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -2661,7 +2709,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "Send details", + "message": "Detalles del Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { @@ -2678,11 +2726,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Número máximo de accesos alcanzado", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { - "message": "Hide text by default" + "message": "Ocultar texto por defecto" }, "expired": { "message": "Caducado" @@ -2729,7 +2777,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Are you sure you want to permanently delete this Send?", + "message": "¿Estás seguro de que quieres eliminar permanentemente este Send?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -2740,7 +2788,7 @@ "message": "Fecha de eliminación" }, "deletionDateDescV2": { - "message": "The Send will be permanently deleted on this date.", + "message": "El Send se borrará permanentemente en esta fecha.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -2762,7 +2810,7 @@ "message": "Personalizado" }, "sendPasswordDescV3": { - "message": "Add an optional password for recipients to access this Send.", + "message": "Añade una contraseña opcional para que los destinatarios accedan a este Send.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -2785,15 +2833,15 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "¡Send creado con éxito!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { - "message": "The Send will be available to anyone with the link for the next 1 hour.", + "message": "El Send estará disponible a cualquiera que tenga el enlace durante la próxima hora.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHours": { - "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "message": "El Send estará disponible a cualquier que tenga el enlace durante las próximas $HOURS$ horas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "hours": { @@ -2803,11 +2851,11 @@ } }, "sendExpiresInDaysSingle": { - "message": "The Send will be available to anyone with the link for the next 1 day.", + "message": "El Send estará disponible a cualquier que tenga el enlace durante el próximo día.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInDays": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "El Send estará disponible a cualquier que tenga el enlace durante los próximos $DAYS$ días.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2817,7 +2865,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Enlace del Send copiado", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Debes verificar tu correo electrónico para usar esta función. Puedes verificar tu correo electrónico en la caja fuerte web." }, + "masterPasswordSuccessfullySet": { + "message": "Contraseña maestra establecida correctamente" + }, "updatedMasterPassword": { "message": "Contraseña maestra actualizada" }, @@ -2955,7 +3006,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "$HOURS$ hora(s) y $MINUTES$ minuto(s) como máximo.", "placeholders": { "hours": { "content": "$1", @@ -3055,7 +3106,7 @@ "message": "Exportando caja fuerte personal" }, "exportingIndividualVaultDescription": { - "message": "Solo se exportarán los elementos individuales de la caja fuerte asociados con $EMAIL$. Los elementos de la bóveda de la organización no se incluirán. Solo se exportará la información de los elementos individuales y no incluirá adjuntos asociados.", + "message": "Solo se exportarán los elementos individuales de la caja fuerte asociados a $EMAIL$. Los elementos de la caja fuerte de la organización no se incluirán. Solo se exportará la información de los elementos de la caja fuerte y no se incluirá adjuntos asociados.", "placeholders": { "email": { "content": "$1", @@ -3132,7 +3183,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " Usa $RECOMMENDED$ palabras o más para generar una frase de contraseña segura.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3177,7 +3228,7 @@ "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Elige un dominio que esté soportado por el servicio seleccionado", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -3233,7 +3284,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ ha rechazado tu solicitud. Por favor, contacta con tu proveedor del servicio para obtener asistencia.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3243,7 +3294,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ ha rechazado tu solicitud $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Solicitud enviada" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Dispositivo" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Contraseña maestra guardada" + }, "exposedMasterPassword": { "message": "Contraseña maestra comprometida" }, @@ -3449,7 +3525,7 @@ "message": "Las políticas de su organización han activado autocompletar al cargar la página." }, "howToAutofill": { - "message": "Cómo autorellenar" + "message": "Cómo autocompletar" }, "autofillSelectInfoWithCommand": { "message": "Selecciona un elemento de esta pantalla, usa el acceso directo $COMMAND$ o explora otras opciones en ajustes.", @@ -3508,14 +3584,102 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Gestionar dispositivos" + }, + "currentSession": { + "message": "Sesión actual" + }, + "mobile": { + "message": "Móvil", + "description": "Mobile app" + }, + "extension": { + "message": "Extensión", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Escritorio", + "description": "Desktop app" + }, + "webVault": { + "message": "Caja fuerte Web" + }, + "webApp": { + "message": "Aplicación Web" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Solicitud pendiente" + }, + "firstLogin": { + "message": "Primer inicio de sesión" + }, + "trusted": { + "message": "De confianza" + }, + "needsApproval": { + "message": "Necesita aprobación" + }, + "devices": { + "message": "Dispositivos" + }, + "accessAttemptBy": { + "message": "Intento de acceso de $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirmar acceso" + }, + "denyAccess": { + "message": "Denegar acceso" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Tipo de Dispositivo" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Se requiere aprobación del dispositivo. Seleccione una opción de aprobación a continuación:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Aprobación del dispositivo requerida" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "Selecciona una opción de aprobación abajo" }, "rememberThisDevice": { "message": "Recordar este dispositivo" @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Solicitar aprobación del administrador" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Se requiere un identificador único de inicio de sesión de la organización." }, @@ -3585,22 +3755,22 @@ "message": "Falta el correo electrónico del usuario" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "Correo electrónico del usuario activo no encontrado. Cerrando sesión." }, "deviceTrusted": { "message": "Dispositivo de confianza" }, "trustOrganization": { - "message": "Trust organization" + "message": "Confiar en la organización" }, "trust": { - "message": "Trust" + "message": "Confiar" }, "doNotTrust": { - "message": "Do not trust" + "message": "No confiar" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "La organización no es de confianza" }, "emergencyAccessTrustWarning": { "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" @@ -3612,22 +3782,14 @@ "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." }, "trustUser": { - "message": "Trust user" - }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + "message": "Confiar con el usuario" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Envía información sensible de forma segura", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Comparte archivos y datos de forma segura con cualquiera, en cualquier plataforma. Tu información permanecerá encriptada de extremo a extremo, limitando su exposición.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3784,7 +3946,7 @@ "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { - "message": "Unlock your account to view autofill suggestions", + "message": "Desbloquea tu cuenta para ver sugerencias de autocompletado", "description": "Text to display in overlay when the account is locked." }, "unlockAccount": { @@ -3792,7 +3954,7 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Unlock your account, opens in a new window", + "message": "Desbloquea tu cuenta, se abre en una nueva ventana", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { @@ -3800,7 +3962,7 @@ "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { - "message": "Time remaining before current TOTP expires", + "message": "Tiempo restante antes de que el TOTP actual expire", "description": "Aria label for the totp seconds displayed in the inline menu for autofill" }, "fillCredentialsFor": { @@ -3824,11 +3986,11 @@ "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { - "message": "New login", + "message": "Nuevo inicio de sesión", "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Add new vault login item, opens in a new window", + "message": "Añadir nuevo elemento de inicio de sesión a la caja fuerte, se abre en una nueva ventana", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -4023,10 +4185,10 @@ "message": "Clave de acceso" }, "accessing": { - "message": "Accessing" + "message": "Accediendo" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "¡Sesión iniciada!" }, "passkeyNotCopied": { "message": "La clave de acceso no se copiará" @@ -4038,7 +4200,7 @@ "message": "Verificación requerida por el sitio inicial. Esta característica aún no está implementada para cuentas sin contraseña maestra." }, "logInWithPasskeyQuestion": { - "message": "Log in with passkey?" + "message": "¿Iniciar sesión con clave de acceso?" }, "passkeyAlreadyExists": { "message": "Ya existe una clave de acceso para esta aplicación." @@ -4050,10 +4212,10 @@ "message": "No tiene un inicio de sesión que coincida para este sitio." }, "noMatchingLoginsForSite": { - "message": "No matching logins for this site" + "message": "No hay inicios de sesión coincidentes para este sitio" }, "searchSavePasskeyNewLogin": { - "message": "Search or save passkey as new login" + "message": "Busca o guarda la clave de acceso como nuevo inicio de sesión" }, "confirm": { "message": "Confirmar" @@ -4065,10 +4227,10 @@ "message": "Guardar clave de acceso como nuevo inicio de sesión" }, "chooseCipherForPasskeySave": { - "message": "Choose a login to save this passkey to" + "message": "Elige un inicio de sesión al que guardar esta clave de acceso" }, "chooseCipherForPasskeyAuth": { - "message": "Choose a passkey to log in with" + "message": "Elige una clave de acceso para iniciar sesión en" }, "passkeyItem": { "message": "Elemento de clave de acceso" @@ -4216,12 +4378,32 @@ "message": "Formatos comunes", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { - "message": "Continue to browser settings?", + "message": "¿Continuar a los ajustes del navegador?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { - "message": "Continue to Help Center?", + "message": "¿Continuar al Centro de Ayuda?", "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { @@ -4294,10 +4476,10 @@ "message": "Clave de acceso eliminada" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Sugerencias de autocompletado" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Elementos sugeridos" }, "autofillSuggestionsTip": { "message": "Guarda un elemento de inicio de sesión para este sitio para autocompletar" @@ -4362,7 +4544,7 @@ } }, "viewItemTitleWithField": { - "message": "View item - $ITEMNAME$ - $FIELD$", + "message": "Ver elemento - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4386,7 +4568,7 @@ } }, "autofillTitleWithField": { - "message": "Autofill - $ITEMNAME$ - $FIELD$", + "message": "Autocompletar - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4417,7 +4599,7 @@ "message": "No hay valores para copiar" }, "assignToCollections": { - "message": "Assign to collections" + "message": "Asignar a colecciones" }, "copyEmail": { "message": "Copiar correo electrónico" @@ -4547,25 +4729,25 @@ } }, "downloadBitwarden": { - "message": "Download Bitwarden" + "message": "Descargar Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Download Bitwarden on all devices" + "message": "Descargar Bitwarden en todos los dispositivos" }, "getTheMobileApp": { - "message": "Get the mobile app" + "message": "Obtén la aplicación móvil" }, "getTheMobileAppDesc": { "message": "Access your passwords on the go with the Bitwarden mobile app." }, "getTheDesktopApp": { - "message": "Get the desktop app" + "message": "Obtén la aplicación de escritorio" }, "getTheDesktopAppDesc": { "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Descarga desde bitwarden.com ahora" }, "getItOnGooglePlay": { "message": "Consíguela en Google Play" @@ -4589,10 +4771,10 @@ "message": "Filter vault" }, "filterApplied": { - "message": "One filter applied" + "message": "Un filtro aplicado" }, "filterAppliedPlural": { - "message": "$COUNT$ filters applied", + "message": "$COUNT$ filtros aplicados", "placeholders": { "count": { "content": "$1", @@ -4626,10 +4808,10 @@ "message": "Credenciales de inicio de sesión" }, "authenticatorKey": { - "message": "Authenticator key" + "message": "Clave de autenticador" }, "autofillOptions": { - "message": "Autofill options" + "message": "Opciones de autocompletado" }, "websiteUri": { "message": "Página web (URI)" @@ -4645,7 +4827,7 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Sitio web añadido" }, "addWebsite": { "message": "Añadir página web" @@ -4688,7 +4870,7 @@ "message": "Tarjeta caducada" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Si la has renovado, actualiza la información de la tarjeta" }, "cardDetails": { "message": "Datos de la tarjeta" @@ -4718,7 +4900,7 @@ "message": "Datos" }, "passkeys": { - "message": "Passkeys", + "message": "Claves de acceso", "description": "A section header for a list of passkeys." }, "passwords": { @@ -4733,13 +4915,13 @@ "message": "Asignar" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Only organization members with access to these collections will be able to see the item." + "message": "Solo los miembros de la organización con acceso a estas colecciones podrán ver el elemento." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "Solo los miembros de la organización con acceso a estas colecciones podrán ver los elementos." }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "Has seleccionado $TOTAL_COUNT$ elementos. No puedes actualizar $READONLY_COUNT$ de los elementos porque no tienes permisos de edición.", "placeholders": { "total_count": { "content": "$1", @@ -4763,10 +4945,10 @@ "message": "Etiqueta de campo" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "Usa campos de texto para datos como preguntas de seguridad" }, "hiddenHelpText": { - "message": "Use hidden fields for sensitive data like a password" + "message": "Usa campos ocultos para datos sensibles como una contraseña" }, "checkBoxHelpText": { "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" @@ -4837,10 +5019,10 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Selecciona colecciones para asignar" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "1 elemento será transferido permanentemente a la organización seleccionada. Ya no serás el propietario de este elemento." }, "personalItemsTransferWarningPlural": { "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", @@ -4874,13 +5056,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Colecciones asignadas correctamente" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "No has seleccionado nada." }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Elementos movidos a $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4889,7 +5071,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Elemento movido a $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4933,13 +5115,13 @@ "message": "Acciones de cuenta" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Mostrar número de sugerencias de autocompletado de inicios de sesión en el icono de la extensión" }, "showQuickCopyActions": { "message": "Show quick copy actions on Vault" }, "systemDefault": { - "message": "System default" + "message": "Predeterminado del sistema" }, "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" @@ -4981,10 +5163,10 @@ "message": "File saved to device. Manage from your device downloads." }, "showCharacterCount": { - "message": "Show character count" + "message": "Mostrar número de caracteres" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Ocultar número de caracteres" }, "itemsInTrash": { "message": "Elementos en la papelera" @@ -5008,10 +5190,10 @@ "message": "No tiene permiso de editar este elemento" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "El desbloqueo biométrico no está disponible porque primero es necesario desbloquear con PIN o contraseña." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "El desbloqueo biométrico no está disponible actualmente." }, "biometricsStatusHelptextAutoSetupNeeded": { "message": "Biometric unlock is unavailable due to misconfigured system files." @@ -5020,10 +5202,10 @@ "message": "Biometric unlock is unavailable due to misconfigured system files." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "El desbloqueo biométrico no está disponible porque la aplicación de escritorio de Bitwarden está cerrada." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "El desbloqueo biométrico no está disponible porque no está habilitado para $EMAIL$ en la aplicación de escritorio Bitwarden.", "placeholders": { "email": { "content": "$1", @@ -5032,16 +5214,19 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "El desbloqueo biométrico no está disponible actualmente por una razón desconocida." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Desbloquea tu caja fuete en segundos" }, "unlockVaultDesc": { "message": "You can customize your unlock and timeout settings to more quickly access your vault." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "Desbloqueo con PIN establecido" + }, + "unlockWithBiometricSet": { + "message": "Desbloqueo con biometría establecido" }, "authenticating": { "message": "Autenticando" @@ -5230,16 +5415,16 @@ "message": "Introduzca la contraseña" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "La clave SSH es inválida" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "El tipo de clave SSH no está soportado" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Importar clave desde el portapapeles" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "Clave SSH importada con éxito" }, "cannotRemoveViewOnlyCollections": { "message": "No puedes eliminar colecciones con permisos de solo visualización: $COLLECTIONS$", @@ -5260,16 +5445,16 @@ "message": "Cambiar contraseña de riesgo" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Opciones de la caja fuerte" }, "emptyVaultDescription": { "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Bienvenido a Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Seguridad, priorizada" }, "securityPrioritizedBody": { "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." @@ -5278,7 +5463,7 @@ "message": "Quick and easy login" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Configura el desbloqueo biométrico y el autocompletado para iniciar sesión en tus cuentas sin tener que escribir ni una sola letra." }, "secureUser": { "message": "Level up your logins" @@ -5287,25 +5472,25 @@ "message": "Utilice el generador para crear y guardar contraseñas fuertes y únicas para todas sus cuentas." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Tus datos, dónde y cuándo los necesites" }, "secureDevicesBody": { "message": "Guarda contraseñas ilimitadas a través de dispositivos ilimitados con aplicaciones móviles, de navegador y de escritorio de Bitwarden." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 notificación" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Importar contraseñas existentes" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Usa el importador para transferir rápidamente inicios de sesión a Bitwarden sin añadirlos manualmente." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Importar ahora" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "¡Bienvenido a tu caja fuerte!" }, "hasItemsVaultNudgeBodyOne": { "message": "Autofill items for the current page" @@ -5317,7 +5502,7 @@ "message": "Search your vault for something else" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Ahorra tiempo con el autocompletado" }, "newLoginNudgeBodyOne": { "message": "Include a", @@ -5325,7 +5510,7 @@ "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "Sitio web", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, @@ -5341,16 +5526,16 @@ "message": "With cards, easily autofill payment forms securely and accurately." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Simplifica la creación de cuentas" }, "newIdentityNudgeBody": { "message": "With identities, quickly autofill long registration or contact forms." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Mantén tus datos sensibles seguros" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Con las notas, almacena de forma segura datos sensibles como datos bancarios o de seguros." }, "newSshNudgeTitle": { "message": "Developer-friendly SSH access" @@ -5361,28 +5546,38 @@ "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "Más información sobre el agente SSH", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Crea contraseñas rápidamente" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Crea fácilmente contraseñas seguras y únicas haciendo clic en", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "para ayudarte a mantener tus inicios de sesión seguros.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Crea fácilmente contraseñas seguras y únicas haciendo clic en el botón Generar contraseña para ayudarte a mantener tus inicios de sesión seguros.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "No tienes permisos para ver esta página. Intenta iniciar sesión con otra cuenta." + }, + "wasmNotSupported": { + "message": "WebAssembly no está soportado por tu navegador o no está habilitado. WebAssembly es necesario para usar la aplicación de Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/et/messages.json b/apps/browser/src/_locales/et/messages.json index 9ca7d15e72a..09e77bd361f 100644 --- a/apps/browser/src/_locales/et/messages.json +++ b/apps/browser/src/_locales/et/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Otsi hoidlast" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Muuda" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Paku olemasolevate andmete uuendamist" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funktsioon pole saadaval" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium versioon" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Turvakood" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "nt." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Uus $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Määra Bitwardeni lahtilukustamiseks PIN kood. Rakendusest täielikult välja logides nullitakse ka PIN koodi seaded." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Nõutakse PIN koodi." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Selle funktsiooni kasutamiseks pead kinnitama oma e-posti aadressi. Saad seda teha veebihoidlas." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Uuendas ülemparooli" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Ülemparool on haavatav" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Nõutav on seadme kinnitamine. Vali kinnitamise meetod alt:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Küsi admini kinnitust" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Nõutav on organisatsiooni SSO identifikaator." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/eu/messages.json b/apps/browser/src/_locales/eu/messages.json index 3c7192e465e..1cd1439e972 100644 --- a/apps/browser/src/_locales/eu/messages.json +++ b/apps/browser/src/_locales/eu/messages.json @@ -6,7 +6,7 @@ "message": "Bitwarden logo" }, "extName": { - "message": "Bitwarden Password Manager", + "message": "Bitwarden pasahitz kudeatzailea", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { @@ -32,13 +32,13 @@ "message": "Use single sign-on" }, "welcomeBack": { - "message": "Welcome back" + "message": "Ongi etorri berriro ere" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "Pasahitz sendo bat ezarri" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Finish creating your account by setting a password" + "message": "Amaitu zure kontua sortzen pasahitza ezarriz" }, "enterpriseSingleSignOn": { "message": "Enpresentzako saio hasiera bakarra" @@ -186,14 +186,14 @@ "message": "Copy website" }, "copyNotes": { - "message": "Copy notes" + "message": "Kopiatu oharrak" }, "copy": { - "message": "Copy", + "message": "Kopiatu", "description": "Copy to clipboard" }, "fill": { - "message": "Fill", + "message": "Bete", "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { @@ -209,10 +209,10 @@ "message": "Auto-bete nortasuna" }, "fillVerificationCode": { - "message": "Fill verification code" + "message": "Bete egiaztapen-kodea" }, "fillVerificationCodeAria": { - "message": "Fill Verification Code", + "message": "Bete egiaztapen-kodea", "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { @@ -231,7 +231,7 @@ "message": "Nortasunik ez" }, "addLoginMenu": { - "message": "Add login" + "message": "Gehitu logina" }, "addCardMenu": { "message": "Gehitu txartela" @@ -547,6 +547,9 @@ "searchVault": { "message": "Bilatu kutxa gotorrean" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Editatu" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Galdetu uneko saio-hasiera eguneratzeko" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Ezaugarria ez dago erabilgarri" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium bazkidea" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Segurtasun-kodea" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "adib." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Ezarri zure PIN kodea Bitwarden desblokeatzeko. Zure PIN-aren konfigurazioa berrezarriko da, noizbait aplikaziotik erabat saioa ixten baduzu." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN-a beharrezkoa da." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Emaila egiaztatu behar duzu funtzio hau erabiltzeko. Emaila web-eko kutxa gotorrean egiazta dezakezu." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Pasahitz nagusia eguneratuta" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Eskatu administratzailearen onarpena" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/fa/messages.json b/apps/browser/src/_locales/fa/messages.json index c40af49d97c..cfae87fd1a5 100644 --- a/apps/browser/src/_locales/fa/messages.json +++ b/apps/browser/src/_locales/fa/messages.json @@ -41,7 +41,7 @@ "message": "ایجاد حساب کاربری خود را با تنظیم کلمه عبور تکمیل کنید" }, "enterpriseSingleSignOn": { - "message": "ورود به سیستم پروژه" + "message": "ورود یکپارچه سازمانی" }, "cancel": { "message": "انصراف" @@ -258,13 +258,13 @@ "message": "حساب ایمیل" }, "requestHint": { - "message": "درخواست راهنمایی" + "message": "درخواست یادآور" }, "requestPasswordHint": { "message": "درخواست یادآور کلمه عبور" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "نشانی ایمیل حساب کاربری خود را وارد کنید تا راهنمای کلمه عبور برای شما ارسال شود" + "message": "نشانی ایمیل حساب کاربری خود را وارد کنید تا یادآور کلمه عبور برای شما ارسال شود" }, "getMasterPasswordHint": { "message": "دریافت یادآور کلمه عبور اصلی" @@ -294,7 +294,7 @@ "message": "با برنامه وب ادامه می‌دهید؟" }, "continueToWebAppDesc": { - "message": "ویژگی‌های بیشتر حساب Bitwarden خود را در برنامه وب کاوش کنید." + "message": "ویژگی‌های بیشتر حساب کاربری Bitwarden خود را در برنامه وب کاوش کنید." }, "continueToHelpCenter": { "message": "به مرکز راهنمایی ادامه می‌دهید؟" @@ -316,11 +316,11 @@ "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "yourAccountsFingerprint": { - "message": "عبارت اثر انگشت حساب شما", + "message": "عبارت اثر انگشت حساب کاربری شما", "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." }, "twoStepLogin": { - "message": "ورود دو مرحله ای" + "message": "ورود دو مرحله‌ای" }, "logOut": { "message": "خروج" @@ -407,7 +407,7 @@ "message": "برای سامان‌دهی موردهای گاوصندوق خود پوشه ایجاد کنید" }, "deleteFolderPermanently": { - "message": "مطمئنید می‌خواهید این پوشه را برای همیشه پاک کنید؟" + "message": "آیا مطمئنید می‌خواهید این پوشه را برای همیشه پاک کنید؟" }, "deleteFolder": { "message": "حذف پوشه" @@ -428,7 +428,7 @@ "message": "انجمن‌های Bitwarden را کاوش کنید" }, "contactSupport": { - "message": "پیام به پشتیبانیBitwarden" + "message": "پیام به پشتیبانی Bitwarden" }, "sync": { "message": "همگام‌سازی" @@ -547,6 +547,9 @@ "searchVault": { "message": "جستجوی گاوصندوق" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "ویرایش" }, @@ -575,13 +578,13 @@ "message": "مورد علاقه" }, "unfavorite": { - "message": "حذف از علایق" + "message": "حذف از مورد علاقه" }, "itemAddedToFavorites": { "message": "به موارد مورد علاقه افزوده شد" }, "itemRemovedFromFavorites": { - "message": "از علایق حذف شد" + "message": "از مورد علاقه حذف شد" }, "notes": { "message": "یادداشت‌ها" @@ -635,7 +638,7 @@ "message": "باز کردن امکانات" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "یک روش بازگشایی برای پایان زمان مجاز تنظیم کنید." + "message": "یک روش باز کردن قفل برای پایان زمان مجاز راه‌اندازی کنید." }, "unlockMethodNeeded": { "message": "یک روش باز کردن قفل را در تنظیمات راه‌اندازی کنید" @@ -653,7 +656,7 @@ "message": "به این افزونه امتیاز دهید" }, "browserNotSupportClipboard": { - "message": "مرورگر شما از کپی کلیپ بورد آسان پشتیبانی نمی‌کند. به جای آن به صورت دستی کپی کنید." + "message": "مرورگر شما از کپی حافظه موقت آسان پشتیبانی نمی‌کند. به جای آن به صورت دستی کپی کنید." }, "verifyYourIdentity": { "message": "هویت خود را تأیید کنید" @@ -741,10 +744,10 @@ "message": "4 ساعت" }, "onLocked": { - "message": "در قفل سیستم" + "message": "هنگام قفل سیستم" }, "onRestart": { - "message": "هنگام راه اندازی مجدد" + "message": "هنگام راه‌اندازی مجدد" }, "never": { "message": "هرگز" @@ -799,7 +802,7 @@ "message": "حساب کاربری جدید شما ایجاد شده است!" }, "youHaveBeenLoggedIn": { - "message": "شما با موفقیت وارد شدید!" + "message": "شما وارد شدید!" }, "youSuccessfullyLoggedIn": { "message": "شما با موفقیت وارد شدید" @@ -808,7 +811,7 @@ "message": "می‌توانید این پنجره را ببندید" }, "masterPassSent": { - "message": "ما یک ایمیل همراه با راهنمای کلمه عبور اصلی برایتان ارسال کردیم." + "message": "ما یک ایمیل همراه با یادآور کلمه عبور اصلی برایتان ارسال کردیم." }, "verificationCodeRequired": { "message": "کد تأیید مورد نیاز است." @@ -820,7 +823,7 @@ "message": "کد تأیید نامعتبر است" }, "valueCopied": { - "message": " کپی شده", + "message": "$VALUE$ کپی شد", "description": "Value has been copied to the clipboard.", "placeholders": { "value": { @@ -848,7 +851,7 @@ "message": "Bitwarden می‌تواند کدهای تأیید دو مرحله‌ای را ذخیره و پر کند. کلید را کپی کرده و در این فیلد قرار دهید." }, "totpHelperWithCapture": { - "message": "Bitwarden می‌تواند کدهای تأیید دو مرحله‌ای را ذخیره و پر کند. برای اسکن کد QR احراز هویت کننده این وب‌سایت، روی آیکون دوربین کلیک کنید یا کلید را کپی کرده و در این فیلد قرار دهید." + "message": "Bitwarden می‌تواند کدهای تأیید دو مرحله‌ای را ذخیره و پر کند. برای اسکن کد QR احراز هویت کننده این وب‌سایت، روی نماد دوربین کلیک کنید یا کلید را کپی کرده و در این فیلد قرار دهید." }, "learnMoreAboutAuthenticators": { "message": "درباره احراز هویت کننده‌ها بیشتر بدانید" @@ -860,7 +863,7 @@ "message": "خارج شد" }, "loggedOutDesc": { - "message": "شما از حساب خود خارج شده‌اید." + "message": "شما از حساب کاربری خود خارج شده‌اید." }, "loginExpired": { "message": "نشست ورود شما منقضی شده است." @@ -923,7 +926,7 @@ "message": "پوشه اضافه شد" }, "twoStepLoginConfirmation": { - "message": "ورود دو مرحله ای باعث می‌شود که حساب کاربری شما با استفاده از یک دستگاه دیگر مانند کلید امنیتی، برنامه احراز هویت، پیامک، تماس تلفنی و یا ایمیل، اعتبار خود را با ایمنی بیشتر اثبات کند. ورود دو مرحله ای می تواند در bitwarden.com فعال شود. آیا می‌خواهید از سایت بازدید کنید؟" + "message": "ورود دو مرحله‌ای باعث می شود که حساب کاربری شما با استفاده از یک دستگاه دیگر مانند کلید امنیتی، برنامه احراز هویت، پیامک، تماس تلفنی و یا رایانامه، اعتبار خود را با ایمنی بیشتر اثبات کند. ورود دو مرحله‌ای می‌تواند در bitwarden.com راه‌اندازی شود. آیا می‌خواهید از سایت بازدید کنید؟" }, "twoStepLoginConfirmationContent": { "message": "با راه‌اندازی ورود دو مرحله‌ای در برنامه وب Bitwarden، حساب کاربری خود را ایمن‌تر کنید." @@ -982,16 +985,16 @@ "message": "مورد ذخیره شد" }, "deleteItemConfirmation": { - "message": "واقعاً می‌خواهید این آیتم را به سطل زباله ارسال کنید؟" + "message": "واقعاً می‌خواهید این مورد را به سطل زباله ارسال کنید؟" }, "deletedItem": { - "message": "مورد به زباله‌ها فرستاده شد" + "message": "مورد به سطل زباله فرستاده شد" }, "overwritePassword": { "message": "بازنویسی کلمه عبور" }, "overwritePasswordConfirmation": { - "message": "آیا از بازنویسی بر روی پسورد فعلی مطمئن هستید؟" + "message": "آیا از بازنویسی بر روی کلمه عبور فعلی مطمئن هستید؟" }, "overwriteUsername": { "message": "بازنویسی نام کاربری" @@ -1022,7 +1025,7 @@ "message": "در صورتی که موردی در گاوصندوق شما یافت نشد، درخواست افزودن کنید." }, "addLoginNotificationDescAlt": { - "message": "اگر موردی در گاوصندوق شما یافت نشد، درخواست افزودن آن را بدهید. این مورد برای همه حساب‌های وارد شده اعمال می‌شود." + "message": "اگر موردی در گاوصندوق شما یافت نشد، درخواست افزودن آن را بدهید. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." }, "showCardsInVaultViewV2": { "message": "همیشه کارت‌ها را به‌عنوان پیشنهادهای پر کردن خودکار در نمای گاوصندوق نمایش بده" @@ -1049,11 +1052,11 @@ "message": "برای پر کردن، روی موردها در پیشنهادهای پرکردن خودکار کلیک کنید" }, "clearClipboard": { - "message": "پاکسازی کلیپ بورد", + "message": "پاکسازی حافظه موقت", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "به صورت خودکار، مقادیر کپی شده را از کلیپ بورد پاک کن.", + "message": "به صورت خودکار، مقادیر کپی شده را از حافظه موقت پاک کن.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { @@ -1173,6 +1176,12 @@ "message": "اوه نه! نتوانستیم این را ذخیره کنیم. لطفاً جزئیات را به‌صورت دستی وارد کنید.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "درخواست برای به‌روزرسانی ورود به سیستم موجود" }, @@ -1180,13 +1189,13 @@ "message": "هنگامی که تغییری در یک وب‌سایت شناسایی شد، درخواست به‌روزرسانی کلمه عبور ورود کن." }, "changedPasswordNotificationDescAlt": { - "message": "هنگامی که تغییری در کلمه عبور یک ورود در وب‌سایت شناسایی شود، درخواست به‌روزرسانی آن را بده. این مورد برای همه حساب‌های وارد شده اعمال می‌شود." + "message": "هنگامی که تغییری در کلمه عبور یک ورود در وب‌سایت شناسایی شود، درخواست به‌روزرسانی آن را بده. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." }, "enableUsePasskeys": { - "message": "برای ذخیره و استفاده از passkey اجازه بگیر" + "message": "درخواست برای ذخیره و استفاده از کلیدهای عبور" }, "usePasskeysDesc": { - "message": "درخواست ذخیره کلیدهای عبور جدید یا ورود با کلیدهای عبوری که در گاوصندوق شما ذخیره شده‌اند. این مورد برای همه حساب‌های وارد شده اعمال می‌شود." + "message": "درخواست ذخیره کلیدهای عبور جدید یا ورود با کلیدهای عبوری که در گاوصندوق شما ذخیره شده‌اند. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." }, "notificationChangeDesc": { "message": "آیا مایل به به‌روزرسانی این کلمه عبور در Bitwarden هستید؟" @@ -1207,7 +1216,7 @@ "message": "نمایش گزینه‌های منوی زمینه" }, "contextMenuItemDesc": { - "message": "از یک کلیک ثانویه برای دسترسی به تولید کلمه عبور و ورودهای منطبق برای وب سایت استفاده کن." + "message": "از یک کلیک ثانویه برای دسترسی به تولید کلمه عبور و ورودهای منطبق برای وب‌سایت استفاده کن." }, "contextMenuItemDescAlt": { "message": "برای دسترسی به تولید کلمه عبور و ورودهای منطبق با وب‌سایت، از کلیک ثانویه استفاده کنید. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." @@ -1226,7 +1235,7 @@ "message": "تغییر رنگ پوسته برنامه." }, "themeDescAlt": { - "message": "تغییر تم رنگی برنامه. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." + "message": "تغییر پوسته رنگی برنامه. این مورد برای همه حساب‌های کاربری وارد شده اعمال می‌شود." }, "dark": { "message": "تاریک", @@ -1255,7 +1264,7 @@ "message": "این کلمه عبور برای برون ریزی و درون ریزی این پرونده استفاده می‌شود" }, "accountRestrictedOptionDescription": { - "message": "برای رمزگذاری برون ریزی و محدود کردن درون ریزی فقط به حساب کاربری فعلی Bitwarden، از کلید رمزگذاری حساب خود که از نام کاربری و کلمه عبور اصلی حساب شما مشتق شده است استفاده کنید." + "message": "برای رمزگذاری برون ریزی و محدود کردن درون ریزی فقط به حساب کاربری فعلی Bitwarden، از کلید رمزگذاری حساب کاربری خود که از نام کاربری و کلمه عبور اصلی حساب کاربری شما مشتق شده است استفاده کنید." }, "passwordProtectedOptionDescription": { "message": "یک کلمه عبور برای پرونده به‌منظور رمزگذاری تنظیم کنید تا برون ریزی و درون ریزی آن به هر حساب Bitwarden با استفاده از کلمه عبور رمزگشایی شود." @@ -1270,7 +1279,7 @@ "message": "عدم تطابق \"کلمه عبور پرونده\" و \"تأیید کلمه عبور پرونده\" با یکدیگر." }, "warning": { - "message": "اخطار", + "message": "هشدار", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "warningCapitalized": { @@ -1284,7 +1293,7 @@ "message": "این برون ریزی شامل داده‌های گاوصندوق در یک قالب رمزنگاری نشده است. شما نباید آن را از طریق یک راه ارتباطی نا امن (مثل ایمیل) ذخیره یا ارسال کنید. به محض اینکه کارتان با آن تمام شد، آن را حذف کنید." }, "encExportKeyWarningDesc": { - "message": "این برون ریزی با استفاده از کلید رمزگذاری حساب شما، اطلاعاتتان را رمزگذاری می کند. اگر زمانی کلید رمزگذاری حساب خود را بچرخانید، باید دوباره خروجی بگیرید، چون قادر به رمزگشایی این پرونده برون ریزی نخواهید بود." + "message": "این برون ریزی با استفاده از کلید رمزگذاری حساب کاربری شما، اطلاعاتتان را رمزگذاری می کند. اگر زمانی کلید رمزگذاری حساب کاربری خود را تغییر دهید، باید دوباره خروجی بگیرید، چون قادر به رمزگشایی این پرونده برون ریزی نخواهید بود." }, "encExportAccountWarningDesc": { "message": "کلیدهای رمزگذاری حساب برای هر حساب کاربری Bitwarden منحصر به فرد است، بنابراین نمی‌توانید برون ریزی رمزگذاری شده را به حساب دیگری وارد کنید." @@ -1330,7 +1339,7 @@ "message": "کپی کد تأیید" }, "attachments": { - "message": "پیوست ها" + "message": "پیوست‌ها" }, "deleteAttachment": { "message": "حذف پیوست" @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "ویژگی موجود نیست" }, - "encryptionKeyMigrationRequired": { - "message": "انتقال کلید رمزگذاری مورد نیاز است. لطفاً از طریق گاوصندوق وب وارد شوید تا کلید رمزگذاری خود را به روز کنید." + "legacyEncryptionUnsupported": { + "message": "رمزنگاری قدیمی دیگر پشتیبانی نمی‌شود. لطفاً برای بازیابی حساب کاربری خود با پشتیبانی تماس بگیرید." }, "premiumMembership": { "message": "عضویت پرمیوم" @@ -1387,16 +1396,16 @@ "message": "برای عضویت پرمیوم ثبت نام کنید و دریافت کنید:" }, "ppremiumSignUpStorage": { - "message": "۱ گیگابایت فضای ذخیره سازی رمزگذاری شده برای پیوست های پرونده." + "message": "۱ گیگابایت فضای ذخیره‌سازی رمزگذاری شده برای پیوست‌های پرونده." }, "premiumSignUpEmergency": { "message": "دسترسی اضطراری." }, "premiumSignUpTwoStepOptions": { - "message": "گزینه های ورود اضافی دو مرحله ای مانند YubiKey و Duo." + "message": "گزینه‌های ورود اضافی دو مرحله‌ای مانند YubiKey و Duo." }, "ppremiumSignUpReports": { - "message": "گزارش‌های بهداشت کلمه عبور، سلامت حساب و نقض داده‌ها برای ایمن نگهداشتن گاوصندوق شما." + "message": "گزارش‌های بهداشت کلمه عبور، سلامت حساب کاربری و نقض داده‌ها برای ایمن نگهداشتن گاوصندوق شما." }, "ppremiumSignUpTotp": { "message": "تولید کننده کد تأیید (2FA) از نوع TOTP برای ورودهای در گاوصندوقتان." @@ -1411,7 +1420,7 @@ "message": "خرید پرمیوم" }, "premiumPurchaseAlertV2": { - "message": "می‌توانید نسخه پرمیوم را از تنظیمات حساب کاربری خود در اپلیکیشن وب Bitwarden خریداری کنید." + "message": "می‌توانید نسخه پرمیوم را از تنظیمات حساب کاربری خود در برنامه وب Bitwarden خریداری کنید." }, "premiumCurrentMember": { "message": "شما یک عضو پرمیوم هستید!" @@ -1423,7 +1432,7 @@ "message": "ارتقا به نسخه پرمیوم و دریافت:" }, "premiumPrice": { - "message": "تمامش فقط $PRICE$ در سال!", + "message": "تمامش فقط $PRICE$ /سال!", "placeholders": { "price": { "content": "$1", @@ -1447,10 +1456,10 @@ "message": "TOTP را به صورت خودکار کپی کن" }, "disableAutoTotpCopyDesc": { - "message": "اگر یک ورود دارای یک کلید احراز هویت باشد، هنگام پر کردن خودکار ورود، کد تأیید TOTP را در کلیپ بورد خود کپی کن." + "message": "اگر یک ورود دارای یک کلید احراز هویت باشد، هنگام پر کردن خودکار ورود، کد تأیید TOTP را در حافظه موقت خود کپی کن." }, "enableAutoBiometricsPrompt": { - "message": "درخواست بیومتریک هنگام راه اندازی" + "message": "درخواست بیومتریک هنگام راه‌اندازی" }, "premiumRequired": { "message": "در نسخه پرمیوم کار می‌کند" @@ -1484,7 +1493,7 @@ "message": "از کد بازیابی‌تان استفاده کنید" }, "insertU2f": { - "message": "کلید امنیتی خود را وارد پورت USB رایانه کنید، اگر دکمه ای دارد آن را بفشارید." + "message": "کلید امنیتی خود را وارد پورت USB رایانه کنید، اگر دکمه‌ای دارد آن را بفشارید." }, "openInNewTab": { "message": "گشودن در زبانهٔ جدید" @@ -1502,7 +1511,7 @@ "message": "ورود به سیستم در دسترس نیست" }, "noTwoStepProviders": { - "message": "ورود دو مرحله‌ای برای این حساب فعال است، با این حال، هیچ یک از ارائه‌دهندگان دو مرحله‌ای پیکربندی شده توسط این مرورگر وب پشتیبانی نمی‌شوند." + "message": "ورود دو مرحله‌ای برای این حساب کاربری فعال است، با این حال، هیچ یک از ارائه‌دهندگان دو مرحله‌ای پیکربندی شده توسط این مرورگر وب پشتیبانی نمی‌شوند." }, "noTwoStepProviders2": { "message": "لطفاً از یک مرورگر وب پشتیبانی شده (مانند کروم) استفاده کنید و یا ارائه دهندگان اضافی را که از مرورگر وب بهتر پشتیانی می‌کنند را اضافه کنید (مانند یک برنامه احراز هویت)." @@ -1541,10 +1550,10 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { - "message": "FIDO2 WebAuthn\n" + "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "برای دسترسی به حساب خود از هر کلید امنیتی فعال شده WebAuthn استفاده کنید." + "message": "برای دسترسی به حساب کاربری خود از هر کلید امنیتی فعال شده WebAuthn استفاده کنید." }, "emailTitle": { "message": "ایمیل" @@ -1587,7 +1596,7 @@ "message": "نشانی سرور اعلان‌ها" }, "iconsUrl": { - "message": "نشانی سرور آیکون ها" + "message": "نشانی سرور نمادها" }, "environmentSaved": { "message": "نشانی‌های اینترنتی محیط ذخیره شد" @@ -1627,7 +1636,7 @@ "message": "نمایش کارت‌ها به‌عنوان پیشنهاد" }, "showInlineMenuOnIconSelectionLabel": { - "message": "نمایش پیشنهادها هنگام انتخاب آیکون" + "message": "نمایش پیشنهادها هنگام انتخاب نماد" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "برای تمام حساب‌های کاربری وارد شده اعمال می‌شود." @@ -1647,7 +1656,7 @@ "description": "Overlay appearance select option for showing the field on focus of the input element" }, "autofillOverlayVisibilityOnButtonClick": { - "message": "وقتی آیکون پر کردن خودکار انتخاب شود", + "message": "وقتی نماد پر کردن خودکار انتخاب شود", "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { @@ -1675,7 +1684,7 @@ "message": "می‌توانید پر کردن خودکار هنگام بارگیری صفحه را برای موارد ورود به سیستم از نمای ویرایش مورد خاموش کنید." }, "itemAutoFillOnPageLoad": { - "message": "پر کردن خودکار بارگذاری صفحه (درصورت فعال بودن در گزینه ها)" + "message": "پر کردن خودکار بارگذاری صفحه (درصورت فعال بودن در گزینه‌ها)" }, "autoFillOnPageLoadUseDefault": { "message": "استفاده از تنظیمات پیش‌فرض" @@ -1693,16 +1702,16 @@ "message": "باز کردن گاوصندوق در نوار کناری" }, "commandAutofillLoginDesc": { - "message": "آخرین ورودی مورد استفاده برای وب سایت فعلی را به صورت خودکار پر کنید" + "message": "آخرین ورودی مورد استفاده برای وب‌سایت فعلی را به صورت خودکار پر کنید" }, "commandAutofillCardDesc": { - "message": "آخرین کارت مورد استفاده برای وب سایت فعلی را به صورت خودکار پر کنید" + "message": "آخرین کارت مورد استفاده برای وب‌سایت فعلی را به صورت خودکار پر کنید" }, "commandAutofillIdentityDesc": { - "message": "آخرین هویت مورد استفاده برای وب سایت فعلی را به صورت خودکار پر کنید" + "message": "آخرین هویت مورد استفاده برای وب‌سایت فعلی را به صورت خودکار پر کنید" }, "commandGeneratePasswordDesc": { - "message": "یک کلمه عبور تصادفی جدید ایجاد کنید و آن را در کلیپ بورد کپی کنید" + "message": "یک کلمه عبور تصادفی جدید ایجاد کنید و آن را در حافظه موقت کپی کنید" }, "commandLockVaultDesc": { "message": "قفل گاوصندوق" @@ -1806,7 +1815,7 @@ "message": "جولای" }, "august": { - "message": "آگوست‌" + "message": "اوت‌" }, "september": { "message": "سپتامبر" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "کد امنیتی" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "مثال." }, @@ -1842,7 +1854,7 @@ "message": "دکتر" }, "mx": { - "message": "عنوان" + "message": "بی جنسیت" }, "firstName": { "message": "نام" @@ -1890,7 +1902,7 @@ "message": "نشانی ۳" }, "cityTown": { - "message": "شهر / شهرک" + "message": "شهر / شهرستان" }, "stateProvince": { "message": "ایالت / استان" @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "کلید SSH" }, + "typeNote": { + "message": "یادداشت" + }, "newItemHeader": { "message": "$TYPE$ جدید", "placeholders": { @@ -1980,7 +1995,7 @@ "message": "مورد علاقه‌ها" }, "popOutNewWindow": { - "message": "به یک پنجره جدید پاپ بزن" + "message": "در پنجره‌ای جدید باز کن" }, "refresh": { "message": "تازه کردن" @@ -2008,7 +2023,7 @@ "message": "بررسی کنید که آیا کلمه عبور افشا شده است." }, "passwordExposed": { - "message": "این کلمه عبور $VALUE$ بار در رخنه داده‌ها افشا شده است. باید آن را تغییر دهید.", + "message": "این کلمه عبور $VALUE$ بار در نقض داده‌ها افشا شده است. باید آن را تغییر دهید.", "placeholders": { "value": { "content": "$1", @@ -2017,7 +2032,7 @@ } }, "passwordSafe": { - "message": "این کلمه عبور در هیچ رخنه داده ای شناخته نشده است. استفاده از آن باید ایمن باشد." + "message": "این کلمه عبور در هیچ یک از نقض‌های داده شناخته شده یافت نشد. استفاده از آن باید ایمن باشد." }, "baseDomain": { "message": "دامنه پایه", @@ -2054,10 +2069,10 @@ "description": "Default URI match detection for autofill." }, "toggleOptions": { - "message": "گزینه های تبدیل" + "message": "سوئیچ گزینه‌ها" }, "toggleCurrentUris": { - "message": "تغییر وضعیت نشانی های اینترنتی فعلی", + "message": "تغییر وضعیت نشانی‌های اینترنتی فعلی", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { @@ -2142,7 +2157,7 @@ "description": "PIN code. Ex. The short code (often numeric) that you use to unlock a device." }, "unlockWithPin": { - "message": "باز کردن با پین" + "message": "باز کردن با کد پین" }, "setYourPinTitle": { "message": "تنظیم کد پین" @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "کد پین خود را برای باز کردن Bitwarden تنظیم کنید. اگر به طور کامل از برنامه خارج شوید، تنظیمات پین شما از بین می‌رود." }, - "setYourPinCode1": { - "message": "کد پین شما برای باز کردن Bitwarden به جای کلمه عبور اصلی استفاده خواهد شد. در صورتی که کاملاً از Bitwarden خارج شوید، کد پین شما ریست خواهد شد." + "setPinCode": { + "message": "شما می‌توانید از این کد پین برای باز کردن قفل Bitwarden استفاده کنید. در صورتی که کامل از برنامه خارج شوید، کد پین شما مجدداً تنظیم خواهد شد." }, "pinRequired": { "message": "کد پین الزامیست." @@ -2163,10 +2178,10 @@ "message": "کد پین معتبر نیست." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "تعداد تلاش‌های ناموفق پین زیاد شد. خارج می‌شوید." + "message": "تعداد تلاش‌های ناموفق کد پین زیاد شد. خارج می‌شوید." }, "unlockWithBiometrics": { - "message": "با استفاده از بیومتریک باز کنید" + "message": "باز کردن قفل با بیومتریک" }, "unlockWithMasterPassword": { "message": "باز کردن قفل با کلمه عبور اصلی" @@ -2190,7 +2205,7 @@ "message": "مورد شبیه" }, "clone": { - "message": "شبیه سازی" + "message": "شبیه‌سازی" }, "passwordGenerator": { "message": "تولید کننده کلمه عبور" @@ -2199,13 +2214,13 @@ "message": "تولید کننده نام کاربری" }, "useThisEmail": { - "message": "از این ایمیل استفاده شود" + "message": "از این ایمیل استفاده کن" }, "useThisPassword": { "message": "از این کلمه عبور استفاده کن" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "از این عبارت عبور استفاده کن" }, "useThisUsername": { "message": "از این نام کاربری استفاده کن" @@ -2235,17 +2250,17 @@ "description": "Verb form: to make secure or inaccessible by" }, "trash": { - "message": "زباله‌ها", + "message": "سطل زباله", "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "جستجوی زباله‌ها" + "message": "جستجوی سطل زباله" }, "permanentlyDeleteItem": { "message": "حذف دائمی مورد" }, "permanentlyDeleteItemConfirmation": { - "message": "مطمئن هستید که می‌خواهید این مورد را برای همیشه پاک کنید؟" + "message": "آیا مطمئن هستید که می‌خواهید این مورد را برای همیشه پاک کنید؟" }, "permanentlyDeletedItem": { "message": "مورد برای همیشه حذف شد" @@ -2284,7 +2299,7 @@ "message": "آیا هنوز می‌خواهید این ورود را پر کنید؟" }, "autofillIframeWarning": { - "message": "فرم توسط دامنه ای متفاوت از نشانی اینترنتی ورود به سیستم ذخیره شده شما میزبانی می‌شود. به هر حال برای پر کردن خودکار، تأیید را انتخاب کنید یا برای توقف، لغو را انتخاب کنید." + "message": "فرم توسط دامنه‌ای متفاوت از نشانی اینترنتی ورود به سیستم ذخیره شده شما میزبانی می‌شود. به هر حال برای پر کردن خودکار، تأیید را انتخاب کنید یا برای توقف، لغو را انتخاب کنید." }, "autofillIframeWarningTip": { "message": "برای جلوگیری از این هشدار در آینده، این نشانی اینترنتی، $HOSTNAME$، را در مورد ورود Bitwarden خود برای این سایت ذخیره کنید.", @@ -2380,7 +2395,7 @@ "message": "کلمه عبور جدید شما نمی‌تواند با کلمه عبور فعلی‌تان یکسان باشد." }, "hintEqualsPassword": { - "message": "اشاره به کلمه عبور شما نمی‌تواند همان کلمه عبور شما باشد." + "message": "یادآور کلمه عبور شما نمی‌تواند همان کلمه عبور شما باشد." }, "ok": { "message": "تأیید" @@ -2422,10 +2437,10 @@ "message": "ارتباط دسکتاپ قطع شد" }, "nativeMessagingWrongUserDesc": { - "message": "برنامه دسکتاپ به یک حساب دیگر وارد شده است. لطفاً اطمینان حاصل کنید که هر دو برنامه به یک حساب وارد شده اند." + "message": "برنامه دسکتاپ به یک حساب کاربری دیگر وارد شده است. لطفاً اطمینان حاصل کنید که هر دو برنامه به یک حساب کاربری وارد شده اند." }, "nativeMessagingWrongUserTitle": { - "message": "عدم مطابقت حساب کاربری" + "message": "عدم تطابق حساب کاربری" }, "nativeMessagingWrongUserKeyTitle": { "message": "عدم تطابق کلید بیومتریک" @@ -2434,10 +2449,10 @@ "message": "باز کردن قفل بیومتریک ناموفق بود. کلید مخفی بیومتریک نتوانست گاوصندوق را باز کند. لطفاً دوباره تنظیمات بیومتریک را انجام دهید." }, "biometricsNotEnabledTitle": { - "message": "بیومتریک برپا نشده" + "message": "بیومتریک راه‌اندازی نشده" }, "biometricsNotEnabledDesc": { - "message": "بیومتریک مرورگر ابتدا نیاز به فعالسازی بیومتریک دسکتاپ در تنظیمات دارد." + "message": "بیومتریک مرورگر ابتدا نیاز به فعال‌سازی بیومتریک دسکتاپ در تنظیمات دارد." }, "biometricsNotSupportedTitle": { "message": "بیومتریک پشتیبانی نمی‌شود" @@ -2476,7 +2491,7 @@ "message": "این عمل را نمی‌توان در نوار کناری انجام داد، لطفاً اقدام را در پنجره بازشو بازخوانی کنید." }, "personalOwnershipSubmitError": { - "message": "به دلیل سیاست پرمیوم، برای ذخیره موارد در گاوصندوق شخصی خود محدود شده اید. گزینه مالکیت را به یک سازمان تغییر دهید و مجموعه های موجود را انتخاب کنید." + "message": "به دلیل سیاست پرمیوم، برای ذخیره موارد در گاوصندوق شخصی خود محدود شده‌اید. گزینه مالکیت را به یک سازمان تغییر دهید و مجموعه‌های موجود را انتخاب کنید." }, "personalOwnershipPolicyInEffect": { "message": "سیاست سازمانی بر تنظیمات مالکیت شما تأثیر می‌گذارد." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "یک سیاست سازمانی، درون ریزی موارد به گاوصندوق فردی شما را مسدود کرده است." }, + "restrictCardTypeImport": { + "message": "نمی‌توان انواع مورد کارت را درون ریزی کرد" + }, + "restrictCardTypeImportDesc": { + "message": "یک سیاست تعیین شده توسط یک یا چند سازمان، مانع از درون ریزی کارت‌ها به گاوصندوق‌های شما شده است." + }, "domainsTitle": { "message": "دامنه‌ها", "description": "A category title describing the concept of web domains" @@ -2495,10 +2516,10 @@ "message": "اطلاعات بیشتر درباره دامنه‌های مسدود شده" }, "excludedDomains": { - "message": "دامنه های مستثنی" + "message": "دامنه‌های مستثنی" }, "excludedDomainsDesc": { - "message": "Bitwarden برای ذخیره جزئیات ورود به سیستم این دامنه ها سوال نمی‌کند. برای اینکه تغییرات اعمال شود باید صفحه را تازه کنید." + "message": "Bitwarden برای ذخیره جزئیات ورود به سیستم این دامنه‌ها سوال نمی‌کند. برای اینکه تغییرات اعمال شود باید صفحه را تازه کنید." }, "excludedDomainsDescAlt": { "message": "Bitwarden برای هیچ یک از حساب‌های کاربری وارد شده، درخواست ذخیره اطلاعات ورود برای این دامنه‌ها را نخواهد داد. برای اعمال تغییرات باید صفحه را تازه‌سازی کنید." @@ -2515,6 +2536,10 @@ "change": { "message": "تغییر" }, + "changePassword": { + "message": "تغییر رمز عبور", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "تغییر کلمه عبور - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "کلمه عبور در معرض خطر" + }, "atRiskPasswords": { "message": "کلمات عبور در معرض خطر" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "کلمه عبور شما برای این سایت در معرض خطر است. $ORGANIZATION$ درخواست کرده است که آن را تغییر دهید.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ از شما می‌خواهد این کلمه عبور را تغییر دهید چون در معرض خطر است. برای تغییر کلمه عبور به تنظیمات حساب کاربری خود مراجعه کنید.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "بررسی و تغییر یک کلمه عبور در معرض خطر" }, @@ -2674,11 +2722,11 @@ "message": "پرونده" }, "allSends": { - "message": "همه ارسال ها", + "message": "همه ارسال‌ها", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "به حداکثر تعداد دسترسی رسیده است", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2718,7 +2766,7 @@ "message": "غیرفعال شد" }, "removePasswordConfirmation": { - "message": "مطمئنید که می‌خواهید کلمه عبور حذف شود؟" + "message": "آیا مطمئنید که می‌خواهید کلمه عبور حذف شود؟" }, "deleteSend": { "message": "ارسال حذف شد", @@ -2836,10 +2884,10 @@ "message": "برای انتخاب پرونده، پسوند را در نوار کناری باز کنید (در صورت امکان) یا با کلیک بر روی این بنر پنجره جدیدی باز کنید." }, "sendFirefoxFileWarning": { - "message": "برای انتخاب یک پرونده با استفاده از Firefox، افزونه را در نوار کناری باز کنید یا با کلیک بر روی این بنر پنجره جدیدی باز کنید." + "message": "برای انتخاب یک پرونده با استفاده از فایرفاکس، افزونه را در نوار کناری باز کنید یا با کلیک بر روی این بنر پنجره جدیدی باز کنید." }, "sendSafariFileWarning": { - "message": "برای انتخاب پرونده ای با استفاده از Safari، با کلیک روی این بنر پنجره جدیدی باز کنید." + "message": "برای انتخاب پرونده‌ای با استفاده از سافاری، با کلیک روی این بنر پنجره جدیدی باز کنید." }, "popOut": { "message": "باز کردن در پنجره جداگانه" @@ -2883,17 +2931,20 @@ "emailVerificationRequiredDesc": { "message": "برای استفاده از این ویژگی باید ایمیل خود را تأیید کنید. می‌توانید ایمیل خود را در گاوصندوق وب تأیید کنید." }, + "masterPasswordSuccessfullySet": { + "message": "کلمه عبور اصلی با موفقیت تنظیم شد" + }, "updatedMasterPassword": { - "message": "کلمه عبور اصلی به‌روز شد" + "message": "کلمه عبور اصلی به‌روزرسانی شد" }, "updateMasterPassword": { "message": "به‌روزرسانی کلمه عبور اصلی" }, "updateMasterPasswordWarning": { - "message": "کلمه عبور اصلی شما اخیراً توسط سرپرست سازمان‌تان تغییر کرده است. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." + "message": "کلمه عبور اصلی شما اخیراً توسط مدیر سازمان‌تان تغییر کرده است. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روزرسانی کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه‌های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." }, "updateWeakMasterPasswordWarning": { - "message": "کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روز کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." + "message": "کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روزرسانی کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه‌های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند." }, "tdeDisabledMasterPasswordRequired": { "message": "سازمان شما رمزگذاری دستگاه‌های مورد اعتماد را غیرفعال کرده است. لطفاً برای دسترسی به گاوصندوق خود یک کلمه عبور اصلی تنظیم کنید." @@ -2902,7 +2953,7 @@ "message": "ثبت نام خودکار" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "این سازمان دارای سیاست سازمانی ای است که به طور خودکار شما را در بازنشانی کلمه عبور ثبت نام می‌کند. این ثبت نام به مدیران سازمان اجازه می‌دهد تا کلمه عبور اصلی شما را تغییر دهند." + "message": "این سازمان دارای سیاست سازمانی است که به طور خودکار شما را در بازیابی کلمه عبور ثبت نام می‌کند. این ثبت نام به مدیران سازمان اجازه می‌دهد تا کلمه عبور اصلی شما را تغییر دهند." }, "selectFolder": { "message": "پوشه را انتخاب کنید..." @@ -2929,7 +2980,7 @@ } }, "verificationRequired": { - "message": "تایید لازم است", + "message": "تأیید لازم است", "description": "Default title for the user verification dialog." }, "hours": { @@ -2942,7 +2993,7 @@ "message": "نیازمندی‌های سیاست سازمانی بر گزینه‌های زمان پایان نشست شما اعمال شده است" }, "vaultTimeoutPolicyInEffect": { - "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است", + "message": "سیاست‌های سازمان‌تان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است.", "placeholders": { "hours": { "content": "$1", @@ -2981,7 +3032,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "سیاست‌های سازمانتان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است. عملگر مهلت زمانی گاوصندوق شما روی $ACTION$ تنظیم شده است.", + "message": "سیاست‌های سازمان‌تان بر مهلت زمانی گاوصندوق شما تأثیر می‌گذارد. حداکثر زمان مجاز گاوصندوق $HOURS$ ساعت و $MINUTES$ دقیقه است. عملگر مهلت زمانی گاوصندوق شما روی $ACTION$ تنظیم شده است.", "placeholders": { "hours": { "content": "$1", @@ -3007,7 +3058,7 @@ } }, "vaultTimeoutTooLarge": { - "message": "مهلت زمانی شما بیش از محدودیت های تعیین شده توسط سازمانتان است." + "message": "مهلت زمانی شما بیش از محدودیت‌های تعیین شده توسط سازمان‌تان است." }, "vaultExportDisabled": { "message": "برون ریزی گاوصندوق غیرفعال شده است" @@ -3040,10 +3091,10 @@ "message": "کلمه عبور اصلی حذف شد" }, "leaveOrganizationConfirmation": { - "message": "آيا مطمئن هستيد که می خواهيد سازمان های انتخاب شده را ترک کنيد؟" + "message": "آيا مطمئنید که می‌خواهيد سازمان انتخاب شده را ترک کنيد؟" }, "leftOrganization": { - "message": "شما از سازمان خارج شده اید." + "message": "شما از سازمان خارج شده‌اید." }, "toggleCharacterCount": { "message": "تغییر تعداد کاراکترها" @@ -3146,7 +3197,7 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "از قابلیت های آدرس دهی فرعی ارائه دهنده ایمیل خود استفاده کنید." + "message": "از قابلیت‌های آدرس دهی فرعی ارائه دهنده ایمیل خود استفاده کنید." }, "catchallEmail": { "message": "دریافت همه ایمیل‌ها" @@ -3277,7 +3328,7 @@ } }, "forwarderNoUrl": { - "message": "آدرس $SERVICENAME$ نامعتبر.", + "message": "نشانی $SERVICENAME$ نامعتبر.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -3392,7 +3443,7 @@ "message": "یک اعلان به دستگاه شما ارسال شده است." }, "notificationSentDevicePart1": { - "message": "قفل Bitwarden را در دستگاه خود یا در... باز کنید" + "message": "قفل Bitwarden را روی دستگاه خود باز کنید یا روی" }, "notificationSentDeviceAnchor": { "message": "برنامه وب" @@ -3415,20 +3466,45 @@ "logInRequestSent": { "message": "درخواست ارسال شد" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "کلمه عبور اصلی افشا شده" }, "exposedMasterPasswordDesc": { - "message": "کلمه عبور در نقض داده پیدا شد. از یک کلمه عبور منحصر به فرد برای محافظت از حساب خود استفاده کنید. آیا مطمئنید که می‌خواهید از یک کلمه عبور افشا شده استفاده کنید؟" + "message": "کلمه عبور در افشای داده پیدا شد. از یک کلمه عبور منحصربه‌فرد برای محافظت از حساب کاربری خود استفاده کنید. آیا مطمئنید که می‌خواهید از یک کلمه عبور افشا شده استفاده کنید؟" }, "weakAndExposedMasterPassword": { "message": "کلمه عبور اصلی ضعیف و افشا شده" }, "weakAndBreachedMasterPasswordDesc": { - "message": "کلمه عبور ضعیف شناسایی و در یک نقض داده پیدا شد. از یک کلمه عبور قوی و منحصر به فرد برای محافظت از حساب خود استفاده کنید. آیا مطمئنید که می‌خواهید از این کلمه عبور استفاده کنید؟" + "message": "کلمه عبور ضعیف شناسایی و در یک افشای داده پیدا شد. از یک کلمه عبور قوی و منحصربه‌فرد برای محافظت از حساب کاربری خود استفاده کنید. آیا مطمئنید که می‌خواهید از این کلمه عبور استفاده کنید؟" }, "checkForBreaches": { - "message": "نقض اطلاعات شناخته شده برای این کلمه عبور را بررسی کنید" + "message": "بررسی نقض‌های داده شناخته شده برای این کلمه عبور" }, "important": { "message": "مهم:" @@ -3479,7 +3555,7 @@ "message": "مدیریت میان‌برها" }, "autofillShortcut": { - "message": "میانبر صفحه کلید پر کردن خودکار" + "message": "میان‌بر صفحه کلید پر کردن خودکار" }, "autofillLoginShortcutNotSet": { "message": "میان‌بر ورود خودکار تنظیم نشده است. این مورد را در تنظیمات مرورگر تغییر دهید." @@ -3494,7 +3570,7 @@ } }, "autofillShortcutTextSafari": { - "message": "میانبر پر کردن خودکار پیش‌فرض: $COMMAND$.", + "message": "میان‌بر پر کردن خودکار پیش‌فرض: $COMMAND$.", "placeholders": { "command": { "content": "$1", @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "این دستگاه را به خاطر بسپار تا ورودهای بعدی بدون مشکل انجام شود" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "تأیید دستگاه لازم است. یک روش تأیید انتخاب کنید:" }, @@ -3529,11 +3693,17 @@ "requestAdminApproval": { "message": "درخواست تأیید مدیر" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "شناسه سازمان SSO مورد نیاز است." }, "creatingAccountOn": { - "message": "در حال ساخت حساب روی" + "message": "در حال ساخت حساب کاربری روی" }, "checkYourEmail": { "message": "ایمیل خود را چک کنید" @@ -3594,7 +3764,7 @@ "message": "اعتماد به سازمان" }, "trust": { - "message": "اطمینان" + "message": "اعتماد" }, "doNotTrust": { "message": "اعتماد نکنید" @@ -3614,14 +3784,6 @@ "trustUser": { "message": "به کاربر اعتماد کنید" }, - "sendsNoItemsTitle": { - "message": "ارسال‌های فعالی نیست", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "از ارسال برای اشتراک‌گذاری امن اطلاعات رمزگذاری شده با هر کسی استفاده کنید.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "اطلاعات حساس را به‌صورت ایمن ارسال کنید", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3865,7 +4027,7 @@ "message": "خطای درون ریزی" }, "importErrorDesc": { - "message": "مشکلی با داده‌هایی که سعی کردید وارد کنید وجود داشت. لطفاً خطاهای فهرست شده زیر را در فایل منبع خود برطرف کرده و دوباره امتحان کنید." + "message": "مشکلی با داده‌هایی که سعی کردید درون ریزی کنید وجود داشت. لطفاً خطاهای فهرست شده در زیر را در پرونده منبع خود برطرف کرده و دوباره امتحان کنید." }, "resolveTheErrorsBelowAndTryAgain": { "message": "خطاهای زیر را برطرف کرده و دوباره امتحان کنید." @@ -3937,7 +4099,7 @@ "message": "خطا در اتصال به سرویس Duo. از روش ورود دو مرحله‌ای دیگری استفاده کنید یا برای دریافت کمک با Duo تماس بگیرید." }, "duoRequiredForAccount": { - "message": "ورود دو مرحله ای Duo برای حساب کاربری شما لازم است." + "message": "ورود دو مرحله‌ای Duo برای حساب کاربری شما لازم است." }, "popoutExtension": { "message": "باز کردن پنجره جداگانه افزونه" @@ -3946,10 +4108,10 @@ "message": "اجرای Duo" }, "importFormatError": { - "message": "داده‌ها به درستی قالب‌بندی نشده‌اند. لطفا فایل وارد شده خود را بررسی و دوباره امتحان کنید." + "message": "داده‌ها به درستی قالب‌بندی نشده‌اند. لطفاً پرونده درون ریزی شده خود را بررسی و دوباره امتحان کنید." }, "importNothingError": { - "message": "چیزی وارد نشد." + "message": "چیزی درون ریزی نشد." }, "importEncKeyError": { "message": "خطا در رمزگشایی پرونده‌ی درون ریزی شده. کلید رمزگذاری شما با کلید رمزگذاری استفاده شده برای درون ریزی داده‌ها مطابقت ندارد." @@ -3961,7 +4123,7 @@ "message": "مقصد" }, "learnAboutImportOptions": { - "message": "درباره گزینه‌های برون ریزی خود بیاموزید" + "message": "درباره گزینه‌های درون ریزی خود بیاموزید" }, "selectImportFolder": { "message": "یک پوشه انتخاب کنید" @@ -3970,7 +4132,7 @@ "message": "انتخاب یک مجموعه" }, "importTargetHint": { - "message": "اگر می‌خواهید محتوای فایل وارد شده به $DESTINATION$ منتقل شود، این گزینه را انتخاب کنید", + "message": "اگر می‌خواهید محتوای پرونده درون ریزی شده به $DESTINATION$ منتقل شود، این گزینه را انتخاب کنید", "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", "placeholders": { "destination": { @@ -4032,10 +4194,10 @@ "message": "کلید عبور کپی نمی‌شود" }, "passkeyNotCopiedAlert": { - "message": "کلید عبور در مورد شبیه سازی شده کپی نمی‌شود. آیا می‌خواهید به شبیه سازی این مورد ادامه دهید؟" + "message": "کلید عبور در مورد شبیه‌سازی شده کپی نمی‌شود. آیا می‌خواهید به شبیه‌سازی این مورد ادامه دهید؟" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { - "message": "تأیید توسط سایت آغازگر الزامی است. این ویژگی هنوز برای حساب‌های بدون کلمه عبور اصلی اجرا نشده است." + "message": "تأیید توسط سایت آغازگر الزامی است. این ویژگی هنوز برای حساب‌های کاربری بدون کلمه عبور اصلی اجرا نشده است." }, "logInWithPasskeyQuestion": { "message": "با کلید عبور وارد می‌شوید؟" @@ -4047,10 +4209,10 @@ "message": "هیچ کلمه عبوری برای این برنامه یافت نشد." }, "noMatchingPasskeyLogin": { - "message": "شما هیچ ورود مشابهی برای این سایت ندارید." + "message": "شما هیچ ورود مشابهی برای این وب‌سایت ندارید." }, "noMatchingLoginsForSite": { - "message": "ورود منطبق برای این سایت یافت نشد" + "message": "ورود منطبق برای این وب‌سایت یافت نشد" }, "searchSavePasskeyNewLogin": { "message": "جستجو یا ذخیره کلید عبور به عنوان ورود جدید" @@ -4140,7 +4302,7 @@ "message": "لطفاً برای ورود، از اطلاعات کاربری شرکت خود استفاده کنید." }, "seeDetailedInstructions": { - "message": "دستورالعمل‌های کامل را در سایت راهنمای ما مشاهده کنید در", + "message": "دستورالعمل‌های کامل را در وب‌سایت راهنمای ما مشاهده کنید در", "description": "This is followed a by a hyperlink to the help website." }, "importDirectlyFromLastPass": { @@ -4162,7 +4324,7 @@ "message": "تعویض حساب کاربری" }, "switchAccounts": { - "message": "تعویض حساب‌ها" + "message": "تعویض حساب‌های کاربری" }, "switchToAccount": { "message": "تعویض به حساب کاربری" @@ -4177,7 +4339,7 @@ "message": "حساب کاربری در درسترس" }, "accountLimitReached": { - "message": "محدودیت حساب کاربری تکمیل شد. برای افزودن حساب کاربری دیگر، از یک حساب خارج شوید." + "message": "محدودیت حساب کاربری تکمیل شد. برای افزودن حساب کاربری دیگر، از یک حساب کاربری خارج شوید." }, "active": { "message": "فعال" @@ -4201,7 +4363,7 @@ "message": "فقط یک بار" }, "alwaysForThisSite": { - "message": "همیشه برای این سایت" + "message": "همیشه برای این وب‌سایت" }, "domainAddedToExcludedDomains": { "message": "دامنه $DOMAIN$ به دامنه‌های مستثنی اضافه شد.", @@ -4216,6 +4378,26 @@ "message": "فرمت‌های رایج", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "تشخیص تطابق نشانی اینترنتی روشی است که Bitwarden برای شناسایی پیشنهادهای پر کردن خودکار استفاده می‌کند.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"عبارت منظم\" یک گزینه پیشرفته است که خطر افشای اطلاعات ورود را افزایش می‌دهد.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"شروع با\" یک گزینه پیشرفته است که خطر افشای اطلاعات ورود را افزایش می‌دهد.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "اطلاعات بیشتر درباره‌ی تشخیص تطابق", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "تنظیمات پیشرفته", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "ادامه به تنظیمات مرورگر؟", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4300,7 +4482,7 @@ "message": "موارد پیشنهادی" }, "autofillSuggestionsTip": { - "message": "یک مورد ورود برای این سایت ذخیره کنید تا به‌صورت خودکار پر شود" + "message": "یک مورد ورود برای این وب‌سایت ذخیره کنید تا به‌صورت خودکار پر شود" }, "yourVaultIsEmpty": { "message": "گاوصندوق‌تان خالی است" @@ -4352,7 +4534,7 @@ } }, "viewItemTitle": { - "message": "مشاهده آیتم - $ITEMNAME$", + "message": "مشاهده مورد - $ITEMNAME$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "کپی $FIELD$، $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4426,7 +4608,7 @@ "message": "کپی تلفن" }, "copyAddress": { - "message": "کپی آدرس" + "message": "کپی نشانی" }, "adminConsole": { "message": "کنسول مدیر" @@ -4651,7 +4833,7 @@ "message": "افزودن وب‌سایت" }, "deleteWebsite": { - "message": "حذف وبسایت" + "message": "حذف وب‌سایت" }, "defaultLabel": { "message": "پیش‌فرض ($VALUE$)", @@ -4664,7 +4846,7 @@ } }, "showMatchDetection": { - "message": "نمایش تطبیق سایت $WEBSITE$", + "message": "نمایش شناسایی تطابق برای $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4673,7 +4855,7 @@ } }, "hideMatchDetection": { - "message": "مخفی کردن تطبیق سایت $WEBSITE$", + "message": "مخفی کردن شناسایی تطابق $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4775,7 +4957,7 @@ "message": "وقتی در پر کردن خودکار برای یک وب‌سایت خاص به مشکل برخوردید، از فیلد مرتبط استفاده کنید." }, "linkedLabelHelpText": { - "message": "شناسه Html، نام، aria-label یا محل نگهدار فیلد را وارد کنید." + "message": "شناسه html، نام، aria-label یا محل نگهدار فیلد را وارد کنید." }, "editField": { "message": "ویرایش فیلد" @@ -4877,7 +5059,7 @@ "message": "مجموعه‌ها با موفقیت اختصاص داده شدند" }, "nothingSelected": { - "message": "شما چیزی را انتخاب نکرده اید." + "message": "شما چیزی را انتخاب نکرده‌اید." }, "itemsMovedToOrg": { "message": "موارد به $ORGNAME$ منتقل شدند", @@ -4933,7 +5115,7 @@ "message": "فعالیت‌های حساب کاربری" }, "showNumberOfAutofillSuggestions": { - "message": "نمایش تعداد پیشنهادهای پر کردن خودکار ورود در آیکون افزونه" + "message": "نمایش تعداد پیشنهادهای پر کردن خودکار ورود در نماد افزونه" }, "showQuickCopyActions": { "message": "نمایش عملیات کپی سریع در گاوصندوق" @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "بازکردن قفل کد پین تنظیم شد" }, + "unlockWithBiometricSet": { + "message": "باز کردن قفل با بیومتریک تنظیم شد" + }, "authenticating": { "message": "در حال احراز هویت" }, @@ -5278,7 +5463,7 @@ "message": "ورود سریع و آسان" }, "quickLoginBody": { - "message": "قفل بیومتریک و پر کردن خودکار را تنظیم کنید تا بدون وارد کردن حتی یک حرف وارد حساب‌های خود شوید." + "message": "قفل بیومتریک و پر کردن خودکار را تنظیم کنید تا بدون وارد کردن حتی یک حرف وارد حساب‌های کاربری خود شوید." }, "secureUser": { "message": "ورودهای خود را ارتقا دهید" @@ -5290,7 +5475,7 @@ "message": "داده‌های شما، زمانی که نیاز دارید و در جایی که نیاز دارید" }, "secureDevicesBody": { - "message": "کلمه‌های عبور نامحدود را در دستگاه‌های نامحدود با اپلیکیشن‌های موبایل، مرورگر و دسکتاپ Bitwarden ذخیره کنید." + "message": "کلمه‌های عبور نامحدود را در دستگاه‌های نامحدود با برنامه‌های موبایل، مرورگر و دسکتاپ Bitwarden ذخیره کنید." }, "nudgeBadgeAria": { "message": "۱ اعلان" @@ -5379,10 +5564,20 @@ "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "با کلیک روی دکمه تولید رمز عبور، به‌راحتی کلمات عبور قوی و منحصر به‌ فرد ایجاد کنید تا ورودهای شما ایمن باقی بمانند.", + "message": "با کلیک روی دکمه تولید کلمه عبور، به‌راحتی کلمات عبور قوی و منحصر به‌ فرد ایجاد کنید تا ورودهای شما ایمن باقی بمانند.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { "message": "شما اجازه دسترسی به این صفحه را ندارید. لطفاً با حساب کاربری دیگری وارد شوید." + }, + "wasmNotSupported": { + "message": "WebAssembly در مرورگر شما پشتیبانی نمی‌شود یا فعال نیست. برای استفاده از برنامه Bitwarden، فعال بودن WebAssembly الزامی است.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/fi/messages.json b/apps/browser/src/_locales/fi/messages.json index c93e64a0443..ffd5caea1d3 100644 --- a/apps/browser/src/_locales/fi/messages.json +++ b/apps/browser/src/_locales/fi/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Etsi holvista" }, + "resetSearch": { + "message": "Nollaa haku" + }, "edit": { "message": "Muokkaa" }, @@ -887,7 +890,7 @@ "message": "Viimeistele kirjautuminen seuraamalla seuraavia vaiheita." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Seuraa alla olevia ohjeita, jotta pääset kirjautumaan suojausavaimellasi." }, "restartRegistration": { "message": "Aloita rekisteröityminen alusta" @@ -1063,7 +1066,7 @@ "message": "Tallenna" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "Näytä $ITEMNAME$. Avautuu uudessa ikkunassa", "placeholders": { "itemName": { "content": "$1" @@ -1093,15 +1096,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "tallennettu Bitwardeniin.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "päivitetty Bitwardeniin.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Valitse $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1121,7 +1124,7 @@ "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "Avaa tallentaaksesi tämä kirjautumistieto", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { @@ -1173,6 +1176,12 @@ "message": "Voi ei! Emme voineet tallentaa tätä. Yritä syöttää tiedot manuaalisesti.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Kun olet vaihtanut salasanaasi, sinun täytyy kirjautua sisään uudella salasanalla. Aktiiviset istunnot muilla laitteilla kirjataan ulos tunnin kuluessa." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Vaihda pääsalasanasi, jotta voit jatkaa tilin palautusta." + }, "enableChangedPasswordNotification": { "message": "Kysy päivitetäänkö kirjautumistieto" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Ominaisuus ei ole käytettävissä" }, - "encryptionKeyMigrationRequired": { - "message": "Salausavaimen siirto vaaditaan. Päivitä salausavaimesi kirjautumalla verkkoholviin." + "legacyEncryptionUnsupported": { + "message": "Vanhaa salausta ei enää tueta. Ota yhteyttä tukeen palauttaaksesi tilisi." }, "premiumMembership": { "message": "Premium-jäsenyys" @@ -1600,10 +1609,10 @@ "message": "Automaattitäytön ehdotukset" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "Löydä helposti automaattisen täytön ehdotukset" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "Poista käytöstä selaimesi oletuksena asetetut automaattisen täytön asetukset, joten ne eivät aiheuta ongelmia Bitwardenin kanssa." }, "turnOffBrowserAutofill": { "message": "Poista automaattitäyttö käytöstä selaimessa $BROWSER$", @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Turvakoodi (CVC/CVV)" }, + "cardNumber": { + "message": "kortin numero" + }, "ex": { "message": "esim." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH-avain" }, + "typeNote": { + "message": "Muistiinpano" + }, "newItemHeader": { "message": "Uusi $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Aseta PIN-koodi Bitwardenin avaukselle. PIN-asetukset tyhjentyvät, jos kirjaudut laajennuksesta kokonaan ulos." }, - "setYourPinCode1": { - "message": "PIN-koodia käytetään pääsalasanasi sijasta Bitwarenin avaukseen. Määritetty PIN-koodi tyhjennetään, jos kirjaudut kokonaan ulos Bitwardenista." + "setPinCode": { + "message": "Voit käyttää PIN-koodia avataksesi Bitwardenin. PIN-koodisi nollataan, mikäli kirjaudut täysin ulos sovelluksesta." }, "pinRequired": { "message": "PIN-koodi vaaditaan." @@ -2205,7 +2220,7 @@ "message": "Käytä tätä salasanaa" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Käytä tätä salalausetta" }, "useThisUsername": { "message": "Käytä tätä käyttäjätunnusta" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Organisaatiokäytäntö estää kohteiden tuonnin yksityiseen holviisi." }, + "restrictCardTypeImport": { + "message": "Ei voitu tuoda kortteja" + }, + "restrictCardTypeImportDesc": { + "message": "Käytäntö, jonka on asettanut 1 tai useampi organisaatiosi estää sinua tuomasta korttitietoja holviisi." + }, "domainsTitle": { "message": "Verkkotunnukset", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Vaihda" }, + "changePassword": { + "message": "Vaihda salasana", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Vaihda salasana - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Riskialttiit salasanat" + }, "atRiskPasswords": { "message": "Vaarantuneet salasanat" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Salasanasi tälle sivustolle ei ole turvallinen. $ORGANIZATION$ on ilmoittanut, että se tulisi vaihtaa.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ ovat pyytäneet, että vaihdat tämän salasnaan, sillä se ei ole turvallinen. Mene tilin asetuksiin ja vaihda salasana.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Tarkasta ja vaihda yksi vaarantunut salasana" }, @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Käyttökertojen enimmäismäärä on saavutettu", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Sinun on vahvistettava sähköpostiosoitteesi käyttääksesi ominaisuutta. Voit vahvistaa osoitteesi verkkoholvissa." }, + "masterPasswordSuccessfullySet": { + "message": "Pääsalasana asetettu" + }, "updatedMasterPassword": { "message": "Pääsalasanasi on vaihdettu" }, @@ -3022,13 +3073,13 @@ "message": "Yksilöllistä tunnistetta ei löytynyt." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Pääsalasanaa ei enää tarvita tämän organisaation jäsenille. Ole hyvä ja vahvista alla oleva verkkotunnus organisaation ylläpitäjän kanssa." }, "organizationName": { "message": "Organisaation nimi" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Key Connector URL" }, "leaveOrganization": { "message": "Poistu organisaatiosta" @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Pyyntö lähetetty" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Kirjautuminen hyväksytty tunnuksella $EMAIL$ laitteella $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Kirjautumispyyntö on estetty toiselta laitteelta. Jos se olit sinä, yritä kirjautua uudelleen samalla laitteella." + }, + "device": { + "message": "Laite" + }, + "loginStatus": { + "message": "Kirjautumisen tila" + }, + "masterPasswordChanged": { + "message": "Pääsalasana tallennettiin" + }, "exposedMasterPassword": { "message": "Paljastunut pääsalasana" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Muista tämä laite tehdäksesi tulevista kirjautumisista saumattomia" }, + "manageDevices": { + "message": "Hallinnoi laitteita" + }, + "currentSession": { + "message": "Nykyinen istunto" + }, + "mobile": { + "message": "Mobiili", + "description": "Mobile app" + }, + "extension": { + "message": "Laajennus", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Työpöytä", + "description": "Desktop app" + }, + "webVault": { + "message": "Verkkoholvi" + }, + "webApp": { + "message": "Verkkosovellus" + }, + "cli": { + "message": "Komentorivi" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Pyyntö odottaa" + }, + "firstLogin": { + "message": "Ensimmäinen kirjautuminen" + }, + "trusted": { + "message": "Luotettu" + }, + "needsApproval": { + "message": "Vaatii hyväksynnän" + }, + "devices": { + "message": "Laitteet" + }, + "accessAttemptBy": { + "message": "Kirjautumisyritys sähköpostilla $EMAIL$ ", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Hyväksy pääsy" + }, + "denyAccess": { + "message": "Estä pääsy" + }, + "time": { + "message": "Aika" + }, + "deviceType": { + "message": "Laitteen tyyppi" + }, + "loginRequest": { + "message": "Kirjautumispyyntö" + }, + "thisRequestIsNoLongerValid": { + "message": "Tämä pyyntö ei ole enää voimassa." + }, + "loginRequestHasAlreadyExpired": { + "message": "Kirjautumispyyntö on jo vanhentunut." + }, + "justNow": { + "message": "juuri nyt" + }, + "requestedXMinutesAgo": { + "message": "pyydetty $MINUTES$ minuuttia sitten", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Laitehyväksyntä vaaditaan. Valitse hyväksyntätapa alta:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Pyydä hyväksyntää ylläpidolta" }, + "unableToCompleteLogin": { + "message": "Kirjautuminen epäonnistui" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Sinun on kirjauduttava luotettuun laitteeseen tai pyydettävä järjestelmänvalvojaasi antamaan sinulle salasana." + }, "ssoIdentifierRequired": { "message": "Organisaation kertakirjautumistunniste tarvitaan." }, @@ -3603,31 +3773,23 @@ "message": "Organisaatio ei ole luotettu" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "Tilisi turvallisuuden varmistamiseksi, vahvista vain, jos olet antanut hätäpääsyn tälle käyttäjälle ja hänen sormenjälkensä vastaa sitä, mitä hänen tilillään näkyy" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "Tilisi turvallisuuden takaamiseksi jatka vain, jos olet tämän organisaation jäsen, tilin palautus on käytössä ja alla näkyvä sormenjälki vastaa organisaatiosi sormenjälkeä." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Tällä organisaatiolla on yrityskäytäntö, joka tulee ilmi, kun yrität palauttaa tiliäsi. Ilmoittautuminen sallii organisaation ylläpitäjien vaihtaa salasanasi. Jatka vain, jos tunnistat tämän organisaation ja alla näkyvän sormenjäljen, joka vastaa organisaation sormenjälkeä." }, "trustUser": { "message": "Luota käyttäjään" }, - "sendsNoItemsTitle": { - "message": "Aktiivisia Sendejä ei ole", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Sendillä voit jakaa salattuja tietoja turvallisesti kenelle tahansa.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Lähetä arkaluonteisia tietoja turvallisesti", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Jaa tiedostoja ja dataa turvallisesti kenen tahansa kanssa millä tahansa alustalla. Tiedot pysyvät päästä päähän salattuina.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4216,6 +4378,26 @@ "message": "Yleiset muodot", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI:n Säännöllinen lauseke -asetus on se tapa, jolla Bitwarden tekee automaattisen täytön.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "Säänöllinen lauseke -asetus on kehittynyt asetus, joka lisää kirjautumistietoja kaappausriskiä.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "Alkaa sanoilla -asetus on kehittynyt asetus, joka lisää kirjautumistietoja kaappausriskiä.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Lisätietoa vastaavuustunnistuksesta", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Lisäasetukset", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Avataanko selaimen asetukset?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Kopioi $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Kopioi $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4556,16 +4738,16 @@ "message": "Hanki mobiilisovellus" }, "getTheMobileAppDesc": { - "message": "Access your passwords on the go with the Bitwarden mobile app." + "message": "Pääse käsiksi salasanoihisi, jos et pääse tietokoneen ääreen Bitwarden-mobiilisovelluksella." }, "getTheDesktopApp": { "message": "Hanki työpöytäsovellus" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "Käytä holviasi ilman selainta ja aseta sitten lukitus biometriikan avulla nopeuttaaksesi lukituksen avaamista sekä työpöytäsovelluksessa että selaimessa." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Lataa bitwarden.comista nyt" }, "getItOnGooglePlay": { "message": "Hanki se Google Playstä" @@ -5035,13 +5217,16 @@ "message": "Biometrinen avaus ei ole tällä hetkellä käytettävissä tuntemattomasta syystä." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Avaa holvisi lukitus sekunneissa" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Voit muokata avaus- ja aikakatkaisuasetuksiasi päästäksesi holvisi nopeammin käsiksi." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "PIN asetettu" + }, + "unlockWithBiometricSet": { + "message": "Biometrinen kirjautuminen otettu käyttöön" }, "authenticating": { "message": "Todennetaan" @@ -5263,7 +5448,7 @@ "message": "Holvin asetukset" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Holvi suojaa muutakin kuin salasanojasi. Säilytä kirjautumsitietojen lisäksi kortteja, muistiinpanoja ja henkilötietoja turvallisesti." }, "introCarouselLabel": { "message": "Tervetuloa Bitwardeniin" @@ -5299,7 +5484,7 @@ "message": "Tuo olemassa olevat salasanat" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Käytä tuojaa siirtääksesi kirjautumisia nopeasti Bitwardeniin lisäämättä niitä manuaalisesti." }, "emptyVaultNudgeButton": { "message": "Tuo nyt" @@ -5308,19 +5493,19 @@ "message": "Tervetuloa holviisi!" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Täytä nykyisen sivun kohteet automaattisesti" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Suosikkikohteita helppoon käyttöön" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Etsi holvistasi jotain muuta" }, "newLoginNudgeTitle": { "message": "Säästä aikaa automaattitäytöllä" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Sisällytä a", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, @@ -5330,59 +5515,69 @@ "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": ", joten tämä kirjautuminen näkyy automaattisen täytön ehdotuksena.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Saumaton verkkomaksaminen" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Korteilla voit helposti täyttää automaattisesti maksulomakkeet turvallisesti ja oikein." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Yksinkertaista tilien luomista" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Identiteettien avulla täytä pitkät rekisteröinti- tai yhteydenottolomakkeet nopeasti automaattisesti." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Pidä arkaluonteiset tietosi turvassa" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Muistiinpanojen avulla tallennetaan turvallisesti arkaluonteiset tiedot, kuten pankkitiedot." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Kehittäjäystävällinen SSH-käyttö" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Säilytä avaimet ja yhdistä SSH-agenttiin, niin saat nopean ja salatun todennuksen.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "Lue lisää SSH-agentista", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Luo salasanat nopeasti" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Luo helposti vahvoja ja uniikkeja salasanoja klikkaamalla", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "auttaakssi sinua pitämään kirjautumisesi turvassa.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Luo helposti vahvoja ja uniikkeja salasanoja klikkaamalla Luo salasana -painiketta. Sen avuilla voit pitää kirjautumisesi turvallisina.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Sinulla ei ole oikeuksia tähän sivuun. Yritä kirjautua sisään toisella tilillä." + }, + "wasmNotSupported": { + "message": "WebAssembly ei ole tuettu selaimessasi tai se ei ole käytössä. WebAssembly vaaditaan, jotta voi käyttää Bitwardenia.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/fil/messages.json b/apps/browser/src/_locales/fil/messages.json index 6106ca7ed62..1682d21aa7f 100644 --- a/apps/browser/src/_locales/fil/messages.json +++ b/apps/browser/src/_locales/fil/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Hanapin ang vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "I-edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Tanungin ang update ng umiiral na login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Hindi magagamit ang tampok" }, - "encryptionKeyMigrationRequired": { - "message": "Kinakailangan ang paglilipat ng encryption key. Mangyaring mag-login sa pamamagitan ng web vault upang i-update ang iyong encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Pagiging miyembro ng premium" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Kodigo ng Seguridad" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Itakda ang iyong PIN code para sa pag-unlock ng Bitwarden. Ang iyong mga setting ng PIN ay ma-reset kung kailanman ay lubusang lumabas ka mula sa application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Kinakailangan ang PIN code." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Hinarang ng isang patakaran ng organisasyon ang pag-import ng mga item sa iyong vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Kailangan mong i-verify ang iyong email upang gamitin ang tampok na ito. Maaari mong i-verify ang iyong email sa web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "I-update ang master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Nakalantad na Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/fr/messages.json b/apps/browser/src/_locales/fr/messages.json index c9dae571046..1a4f466a41c 100644 --- a/apps/browser/src/_locales/fr/messages.json +++ b/apps/browser/src/_locales/fr/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logo de Bitwarden" }, "extName": { "message": "Gestionnaire de mots de passe Bitwarden", @@ -547,6 +547,9 @@ "searchVault": { "message": "Rechercher dans le coffre" }, + "resetSearch": { + "message": "Réinitialiser la recherche" + }, "edit": { "message": "Modifier" }, @@ -887,7 +890,7 @@ "message": "Suivez les étapes ci-dessous afin de réussir à vous connecter." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Suivez les étapes ci-dessous pour terminer la connexion avec votre clé de sécurité." }, "restartRegistration": { "message": "Redémarrer l'inscription" @@ -1063,7 +1066,7 @@ "message": "Enregistrer" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "Afficher $ITEMNAME$, s'ouvre dans une nouvelle fenêtre", "placeholders": { "itemName": { "content": "$1" @@ -1076,14 +1079,14 @@ "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Modifier avant d'enregistrer", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Nouvelle notification" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$: Nouvelle notification", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1093,15 +1096,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "enregistré dans Bitwarden.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "mis à jour dans Bitwarden.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Sélectionner $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1129,7 +1132,7 @@ "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Mettre à jour de l'identifiant existant", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -1141,7 +1144,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Bon travail ! Vous avez pris les mesures pour rendre vous et $ORGANIZATION$ plus sécurisés.", "placeholders": { "organization": { "content": "$1" @@ -1150,7 +1153,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "Merci d'avoir rendu $ORGANIZATION$ plus sécurisé. Il vous reste $TASK_COUNT$ mots de passe à mettre à jour.", "placeholders": { "organization": { "content": "$1" @@ -1162,7 +1165,7 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Changer le mot de passe suivant", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { @@ -1173,6 +1176,12 @@ "message": "Oh non ! Nous n'avons pas pu enregistrer cela. Essayez de saisir les détails manuellement.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Après avoir changé votre mot de passe, vous devrez vous connecter avec votre nouveau mot de passe. Les sessions actives sur d'autres appareils seront déconnectées dans l'heure qui suit." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Changez votre mot de passe principal pour finaliser la récupération de compte." + }, "enableChangedPasswordNotification": { "message": "Demander de mettre à jour un identifiant existant" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Fonctionnalité indisponible" }, - "encryptionKeyMigrationRequired": { - "message": "Migration de la clé de chiffrement nécessaire. Veuillez vous connecter sur le coffre web pour mettre à jour votre clé de chiffrement." + "legacyEncryptionUnsupported": { + "message": "Le chiffrement hérité n'est plus pris en charge. Veuillez contacter le support pour récupérer votre compte." }, "premiumMembership": { "message": "Adhésion Premium" @@ -1600,13 +1609,13 @@ "message": "Suggestions de saisie automatique" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "Trouver facilement des suggestions de remplissage automatique" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "Désactivez les paramètres de remplissage automatique de votre navigateur pour qu'ils n'entrent pas en conflit avec Bitwarden." }, "turnOffBrowserAutofill": { - "message": "Turn off $BROWSER$ autofill", + "message": "Désactiver le remplissage automatique de $BROWSER$", "placeholders": { "browser": { "content": "$1", @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Code de sécurité" }, + "cardNumber": { + "message": "numéro de carte" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Clé SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Créer un(e) $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Définissez votre code PIN pour déverrouiller Bitwarden. Les paramètres relatifs à votre code PIN seront réinitialisés si vous vous déconnectez complètement de l'application." }, - "setYourPinCode1": { - "message": "Votre code PIN sera utilisé pour déverrouiller Bitwarden au lieu de votre mot de passe principal. Votre code PIN sera réinitialisé si vous vous déconnectez complètement de Bitwarden." + "setPinCode": { + "message": "Vous pouvez utiliser ce code PIN pour déverrouiller Bitwarden. Votre code PIN sera réinitialisé si vous vous déconnectez complètement de l'application." }, "pinRequired": { "message": "Le code PIN est requis." @@ -2205,7 +2220,7 @@ "message": "Utiliser ce mot de passe" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Utilisez cette phrase secrète" }, "useThisUsername": { "message": "Utiliser ce nom d'utilisateur" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Une politique d'organisation a bloqué l'import d'éléments dans votre coffre personel." }, + "restrictCardTypeImport": { + "message": "Impossible d'importer des types d'éléments de carte" + }, + "restrictCardTypeImportDesc": { + "message": "Une politique définie par 1 ou plusieurs organisations vous empêche d'importer des cartes dans vos coffres." + }, "domainsTitle": { "message": "Domaines", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Modifier" }, + "changePassword": { + "message": "Changer le mot de passe", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Modifier le mot de passe - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Mot de passe à risque" + }, "atRiskPasswords": { "message": "Mots de passe à risque" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Votre mot de passe pour ce site est à risque. $ORGANIZATION$ vous a demandé de le modifier.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ souhaite que vous changiez ce mot de passe car il est à risque. Accédez aux paramètres de votre compte pour modifier le mot de passe.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Examiner et modifier un mot de passe à risque" }, @@ -2587,14 +2635,14 @@ "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Illustration of a list of logins that are at-risk." + "message": "Illustration d'une liste de connexions à risque." }, "generatePasswordSlideDesc": { "message": "Générez rapidement un mot de passe fort et unique grâce au menu de saisie automatique de Bitwarden sur le site à risque.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password." + "message": "Illustration du menu de remplissage automatique de Bitwarden affichant un mot de passe généré." }, "updateInBitwarden": { "message": "Mettre à jour dans Bitwarden" @@ -2604,7 +2652,7 @@ "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." + "message": "Illustration d'une notification de Bitwarden invitant l'utilisateur à mettre à jour la connexion." }, "turnOnAutofill": { "message": "Activer la saisie automatique" @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Nombre maximal d'accès atteint", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Vous devez vérifier votre courriel pour utiliser cette fonctionnalité. Vous pouvez vérifier votre courriel dans le coffre web." }, + "masterPasswordSuccessfullySet": { + "message": "Mot de passe principal défini avec succès" + }, "updatedMasterPassword": { "message": "Mot de passe principal mis à jour" }, @@ -3022,13 +3073,13 @@ "message": "Aucun identifiant unique trouvé." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Un mot de passe principal n’est plus requis pour les membres de l’organisation suivante. Veuillez confirmer le domaine ci-dessous auprès de l'administrateur de votre organisation." }, "organizationName": { "message": "Nom de l'organisation" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Domaine du connecteur clé" }, "leaveOrganization": { "message": "Quitter l'organisation" @@ -3064,7 +3115,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "Seuls les éléments individuels du coffre-fort, y compris les pièces jointes associées à $EMAIL$, seront exportés. Les éléments du coffre-fort de l'organisation ne seront pas inclus", "placeholders": { "email": { "content": "$1", @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Demande envoyée" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Demande de connexion approuvée pour $EMAIL$ sur $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Vous avez refusé une tentative de connexion depuis un autre appareil. Si c'était vous, essayez de vous reconnecter avec l'appareil." + }, + "device": { + "message": "Appareil" + }, + "loginStatus": { + "message": "Statut de connexion" + }, + "masterPasswordChanged": { + "message": "Mot de passe principal enregistré" + }, "exposedMasterPassword": { "message": "Mot de passe principal exposé" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Mémorisez cet appareil pour faciliter les futures connexions" }, + "manageDevices": { + "message": "Gérer les appareils" + }, + "currentSession": { + "message": "Session en cours" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Bureau", + "description": "Desktop app" + }, + "webVault": { + "message": "Coffre-fort Web" + }, + "webApp": { + "message": "Application web" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Demande en attente" + }, + "firstLogin": { + "message": "Première connexion" + }, + "trusted": { + "message": "Approuvé" + }, + "needsApproval": { + "message": "Requiert une approbation" + }, + "devices": { + "message": "Appareils" + }, + "accessAttemptBy": { + "message": "Tentative d'accès par $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirmer l'accès" + }, + "denyAccess": { + "message": "Refuser l'accès" + }, + "time": { + "message": "Temps" + }, + "deviceType": { + "message": "Type d'appareil" + }, + "loginRequest": { + "message": "Demande de connexion" + }, + "thisRequestIsNoLongerValid": { + "message": "Cette demande n'est plus valide." + }, + "loginRequestHasAlreadyExpired": { + "message": "La demande de connexion a déjà expiré." + }, + "justNow": { + "message": "À l’instant" + }, + "requestedXMinutesAgo": { + "message": "Demandé $MINUTES$ il y a quelques minutes", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "L'approbation de l'appareil est requise. Sélectionnez une option d'approbation ci-dessous :" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Demander l'approbation de l'administrateur" }, + "unableToCompleteLogin": { + "message": "Impossible de terminer la connexion" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Vous devez vous connecter sur un appareil de confiance ou demander à votre administrateur de vous attribuer un mot de passe." + }, "ssoIdentifierRequired": { "message": "Identifiant SSO de l'organisation requis." }, @@ -3591,7 +3761,7 @@ "message": "Appareil de confiance" }, "trustOrganization": { - "message": "Trust organization" + "message": "Faire confiance à l'organisation" }, "trust": { "message": "Faire confiance" @@ -3600,34 +3770,26 @@ "message": "Ne pas faire confiance" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "L'organisation n'est pas fiable" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "Pour la sécurité de votre compte, ne confirmez que si vous avez accordé un accès d'urgence à cet utilisateur et que son empreinte digitale correspond à ce qui est affiché dans son compte" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "Pour la sécurité de votre compte, ne procédez que si vous êtes membre de cette organisation, que la récupération de compte est activée et que l'empreinte digitale affichée ci-dessous correspond à l'empreinte digitale de l'organisation." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Cette organisation dispose d’une politique d’entreprise qui vous inscrira au recouvrement de compte. L'inscription permettra aux administrateurs de l'organisation de modifier votre mot de passe. Ne continuez que si vous reconnaissez cette organisation et que la phrase d'empreinte digitale affichée ci-dessous correspond à l'empreinte digitale de l'organisation." }, "trustUser": { - "message": "Trust user" - }, - "sendsNoItemsTitle": { - "message": "Pas de Send actif", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Utilisez Send pour partager en toute sécurité des informations chiffrées avec tout le monde.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + "message": "Faire confiance à l'utilisateur" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Envoyez des informations sensibles en toute sécurité", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Partagez des fichiers et des données en toute sécurité avec n'importe qui, sur n'importe quelle plateforme. Vos informations resteront cryptées de bout en bout tout en limitant l'exposition.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3758,7 +3920,7 @@ "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { - "message": "Désactivez la resaisie du mot de passe maître pour éditer ce champ", + "message": "Désactivez la ressaisie du mot de passe principal pour modifier ce champ", "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." }, "toggleSideNavigation": { @@ -4216,6 +4378,26 @@ "message": "Formats communs", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "La détection de correspondance d'URI est la manière dont Bitwarden identifie les suggestions de remplissage automatique.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Expression régulière\" est une option avancée présentant un risque accru d’exposition des informations d’identification.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Commence par\" est une option avancée présentant un risque accru d’exposition des informations d’identification.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "En savoir plus sur la détection des correspondances", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Options avancées", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continuer vers les paramètres du navigateur ?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4362,7 +4544,7 @@ } }, "viewItemTitleWithField": { - "message": "View item - $ITEMNAME$ - $FIELD$", + "message": "Afficher l'élément - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4386,7 +4568,7 @@ } }, "autofillTitleWithField": { - "message": "Autofill - $ITEMNAME$ - $FIELD$", + "message": "Remplissage automatique - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copier $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copier $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4556,22 +4738,22 @@ "message": "Télécharger l'application mobile" }, "getTheMobileAppDesc": { - "message": "Access your passwords on the go with the Bitwarden mobile app." + "message": "Accédez à vos mots de passe en déplacement avec l'application mobile Bitwarden." }, "getTheDesktopApp": { "message": "Télécharger l'application de bureau" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "Accédez à votre coffre-fort sans navigateur, puis configurez le déverrouillage avec la biométrie pour accélérer le déverrouillage à la fois dans l'application de bureau et dans l'extension du navigateur." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Téléchargez maintenant depuis bitwarden.com" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "Obtenez-le sur Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Télécharger depuis l’App Store" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Êtes-vous sûr de vouloir supprimer définitivement cette pièce jointe ?" @@ -4778,10 +4960,10 @@ "message": "Entrez l'identifiant html, le nom, l'étiquette aria ou l'espace réservé du champ." }, "editField": { - "message": "Éditer le champ" + "message": "Modifier le champ" }, "editFieldLabel": { - "message": "Éditer $LABEL$", + "message": "Modifier $LABEL$", "placeholders": { "label": { "content": "$1", @@ -5035,13 +5217,16 @@ "message": "Le déverrouillage par biométrie n'est pas disponible actuellement pour une raison inconnue." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Déverouillez votre coffre en quelques secondes" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Vous pouvez personnaliser vos paramètres de déverrouillage et de délai d'attente pour accéder plus rapidement à votre coffre-fort." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "Déverrouiller l'ensemble de codes PIN" + }, + "unlockWithBiometricSet": { + "message": "Déverrouiller avec l'ensemble biométrique" }, "authenticating": { "message": "Authentification" @@ -5055,7 +5240,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Enregistrer dans Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5260,129 +5445,139 @@ "message": "Changer le mot de passe à risque" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Options du coffre" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Le coffre-fort protège bien plus que vos mots de passe. Stockez ici en toute sécurité des identifiants, des cartes d'identité, des cartes et des notes sécurisés." }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Bienvenue sur Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Priorité à la sécurité" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "Enregistrez les identifiants, les cartes et les identités dans votre coffre-fort sécurisé. Bitwarden utilise un cryptage de bout en bout à connaissance nulle pour protéger ce qui est important pour vous." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Connexion rapide et facile" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Configurez le déverrouillage biométrique et le remplissage automatique pour vous connecter à vos comptes sans taper une seule lettre." }, "secureUser": { - "message": "Level up your logins" + "message": "Améliorez vos connexions" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Utilisez le générateur pour créer et enregistrer des mots de passe forts et uniques pour tous vos comptes." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Vos données, quand et où vous en avez besoin" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Enregistrez des mots de passe illimités sur un nombre illimité d'appareils avec les applications mobiles, de navigateur et de bureau Bitwarden." }, "nudgeBadgeAria": { "message": "1 notification" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Importer des mots de passe existants" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Utilisez l'importateur pour transférer rapidement les connexions vers Bitwarden sans les ajouter manuellement." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Importer maintenant" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Bienvenue dans votre coffre !" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Remplissage automatique des éléments de la page actuelle" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Articles préférés pour un accès facile" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Recherchez autre chose dans votre coffre-fort" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Gagnez du temps avec le remplissage automatique" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Inclure un", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "Site internet", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "cette connexion apparaît donc comme une suggestion de remplissage automatique.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Paiement en ligne transparent" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Avec les cartes, remplissez facilement et automatiquement les formulaires de paiement de manière sécurisée et précise." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Simplifiez la création de comptes" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Avec les identités, remplissez rapidement automatiquement les longs formulaires d'inscription ou de contact." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Gardez vos données sensibles en sécurité" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Avec des notes, stockez en toute sécurité des données sensibles telles que des informations bancaires ou d’assurance." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Accès SSH convivial pour les développeurs" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Stockez vos clés et connectez-vous à l'agent SSH pour une authentification rapide et cryptée.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "En savoir plus sur l'agent SSH", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Créez rapidement des mots de passe" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Créez facilement des mots de passe forts et uniques en cliquant sur", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "pour vous aider à garder vos connexions sécurisées.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Créez facilement des mots de passe forts et uniques en cliquant sur le bouton Générer un mot de passe pour vous aider à sécuriser vos connexions.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Vous n'avez pas les autorisations pour consulter cette page. Essayez de vous connecter avec un autre compte." + }, + "wasmNotSupported": { + "message": "WebAssembly n'est pas pris en charge sur votre navigateur ou n'est pas activé. WebAssembly est requis pour utiliser l'application Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/gl/messages.json b/apps/browser/src/_locales/gl/messages.json index ef99d2cb211..0698191f53e 100644 --- a/apps/browser/src/_locales/gl/messages.json +++ b/apps/browser/src/_locales/gl/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Buscar na caixa forte" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Editar" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ofrecer actualizar as credenciais xa gardadas" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Función non dispoñible" }, - "encryptionKeyMigrationRequired": { - "message": "Requírese mudar a clave de cifrado. Por favor, inicia sesión na aplicación web para actualizala." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Plan Prémium" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Código de seguridade" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Clave SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Novo $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Crea un PIN para abrir a caixa forte. Se algunha vez pechas a sesión en Bitwarden perderase a configuración deste PIN." }, - "setYourPinCode1": { - "message": "O PIN empregarase no lugar do contrasinal mestre para abrir a caixa forte. Se pechas a sesión en Bitwarden perderase a configuración do PIN." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN requirido." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Unha directiva da empresa impide importar entradas á túa caixa forte individual." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Dominios", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Debes verificar o teu correo electrónico para empregar esta función. Podes facelo dende a aplicación web." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Contrasinal mestre actualizado" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Contrasinal mestre filtrado" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Lembrar este dispositivo para futuros inicios de sesión imperceptibles" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Aprobación de dispositivo requirida. Selecciona unha das seguintes opcións:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Solicitar aprobación do administrador" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Identificador SSO da organización requirido." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "Sen Sends activos", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Usar send para compartir información cifrada con quen queiras.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Formatos comúns", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Ir ós axustes do navegador?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Autenticando" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/he/messages.json b/apps/browser/src/_locales/he/messages.json index 72dcdb70376..96dc5215051 100644 --- a/apps/browser/src/_locales/he/messages.json +++ b/apps/browser/src/_locales/he/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "חיפוש בכספת" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "ערוך" }, @@ -1173,6 +1176,12 @@ "message": "או לא! לא יכלנו לשמור זאת. נסה להזין את הפרטים באופן ידני.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "שאל אם לעדכן פרטי כניסה קיימת" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "התכונה אינה זמינה" }, - "encryptionKeyMigrationRequired": { - "message": "נדרשת הגירת מפתח הצפנה. נא להיכנס דרך כספת הרשת כדי לעדכן את מפתח ההצפנה שלך." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "חברות פרימיום" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "קוד אבטחה" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "לדוגמא" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "מפתח SSH" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "$TYPE$ חדש", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "קבע קוד PIN לביטול נעילת Bitwarden. הגדרות הPIN יאופסו אם תבצע יציאה מהתוכנה." }, - "setYourPinCode1": { - "message": "ה־PIN שלך ישמש לביטול נעילת Bitwarden במקום הסיסמה הראשית שלך. ה־PIN שלך יאופס אם אי פעם תצא באופן מלא מ־Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "נדרש קוד PIN." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "מדיניות ארגון חסמה ייבוא פריטים אל תוך הכספת האישית שלך." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "דומיינים", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "שינוי" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "שנה סיסמה - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "סיסמאות בסיכון" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "סקור ושנה סיסמה אחת בסיכון" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "עליך לאמת את הדוא\"ל שלך כדי להשתמש בתכונה זו. ניתן לאמת את הדוא\"ל שלך בכספת הרשת." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "סיסמה ראשית עודכנה" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "בקשה נשלחה" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "סיסמה ראשית חשופה" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "זכור מכשיר זה כדי להפוך כניסות עתידיות לחלקות" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "נדרש אישור מכשיר. בחר אפשרות אישור למטה:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "בקש אישור מנהל" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "נדרש מזהה SSO של הארגון." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "אין סֵנְדים פעילים", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "השתמש בסֵנְד כדי לשתף באופן מאובטח מידע מוצפן עם כל אחד.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "פורמטים נפוצים", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "להמשיך אל הגדרות הדפדפן?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "העתק $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "מאמת" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/hi/messages.json b/apps/browser/src/_locales/hi/messages.json index 06dd2c49390..35d7e8b2911 100644 --- a/apps/browser/src/_locales/hi/messages.json +++ b/apps/browser/src/_locales/hi/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "वॉल्ट खोजे" }, + "resetSearch": { + "message": "खोज रीसेट करें" + }, "edit": { "message": "संपादन करें" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "मौजूदा लॉगिन को अपडेट करने के लिए कहें" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature Unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium Membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security Code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "नोट" + }, "newItemHeader": { "message": "नया $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "बिटवर्डन को अनलॉक करने के लिए अपना पिन कोड सेट करें यदि आप कभी भी आवेदन से पूरी तरह लॉग आउट करते हैं तो आपकी पिन सेटिंग्स रीसेट हो जाएंगी।" }, - "setYourPinCode1": { - "message": "बिटवर्डन को अनलॉक करने के लिए आपके मास्टर पासवर्ड के बजाय आपके पिन का उपयोग किया जाएगा। यदि आप कभी भी बिटवर्डन से पूरी तरह लॉग आउट हो जाते हैं तो आपका पिन रीसेट हो जाएगा।" + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "पिन-कोड आवश्यक है |" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "इस सुविधा का उपयोग करने के लिए आपको अपने ईमेल को सत्यापित करना होगा। आप वेब वॉल्ट में अपने ईमेल को सत्यापित कर सकते हैं।" }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "अपडेट किया गया मास्टर पासवर्ड" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "उपयोगकर्ता पर भरोसा रखें" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/hr/messages.json b/apps/browser/src/_locales/hr/messages.json index f94a2e60b79..1a304a94d48 100644 --- a/apps/browser/src/_locales/hr/messages.json +++ b/apps/browser/src/_locales/hr/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Pretraži trezor" }, + "resetSearch": { + "message": "Ponovno postavljanje pretraživanja" + }, "edit": { "message": "Uredi" }, @@ -887,7 +890,7 @@ "message": "Prati korake za dovršetak prijave." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Prati korake za dovršetak prijave svojim sigurnosnim ključem." }, "restartRegistration": { "message": "Ponovno pokreni registraciju" @@ -1063,7 +1066,7 @@ "message": "Spremi" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "Pogledaj $ITEMNAME$, otvara u novom prozoru", "placeholders": { "itemName": { "content": "$1" @@ -1072,18 +1075,18 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationNewItemAria": { - "message": "New Item, opens in new window", + "message": "Nova stavka, otvara u novom prozoru", "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Uredi prije spremanja", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Nova obavijest" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$: Nova obavijest", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1093,15 +1096,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "spremljeno u Bitwarden.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "ažurirano u Bitwarenu.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Odaberi $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1121,15 +1124,15 @@ "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "Otključaj za spremanje ove prijave", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { - "message": "Save login", + "message": "Spremi prijavu", "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Ažuriraj postojeću prijavu", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -1141,7 +1144,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Odlično! Ti i $ORGANIZATION$ ste sada sigurniji.", "placeholders": { "organization": { "content": "$1" @@ -1150,7 +1153,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "Hvala što je $ORGANIZATION$ sada sigurnija. Imaš još $TASK_COUNT$ lozinku za ažuriranje.", "placeholders": { "organization": { "content": "$1" @@ -1162,7 +1165,7 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Promjeni sljedeću lozinku", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { @@ -1173,6 +1176,12 @@ "message": "Ups! Nismo mogli ovo spasiti. Pokušaj ručno unijeti detalje.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Nakon promjene lozinke, moraš se prijaviti s novom lozinkom. Aktivne sesije na drugim uređajima bit će odjavljene u roku od jednog sata." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Promijeni svoju glavnu lozinku za dovršetak oporavka računa." + }, "enableChangedPasswordNotification": { "message": "Upitaj za ažuriranje trenutne prijave" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Značajka nije dostupna" }, - "encryptionKeyMigrationRequired": { - "message": "Potrebna je migracija ključa za šifriranje. Prijavi se na web trezoru za ažuriranje ključa za šifriranje." + "legacyEncryptionUnsupported": { + "message": "Zastarjelo šifriranje više nije podržano. Obrati se podršci za oporavak računa." }, "premiumMembership": { "message": "Premium članstvo" @@ -1600,13 +1609,13 @@ "message": "Prijedlozi auto-ispune" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "Jednostavno pronađi prijedloge auto-ispune" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "Isključi postavke auto-ispune preglenika kako se ne bi kosile s Bitwardenom." }, "turnOffBrowserAutofill": { - "message": "Turn off $BROWSER$ autofill", + "message": "Isključi auto-ispunu za $BROWSER$", "placeholders": { "browser": { "content": "$1", @@ -1615,7 +1624,7 @@ } }, "turnOffAutofill": { - "message": "Turn off autofill" + "message": "Isključi auto-ispunu" }, "showInlineMenuLabel": { "message": "Prikaži prijedloge auto-ispune na poljima obrazaca" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Sigurnosni kôd" }, + "cardNumber": { + "message": "broj kartice" + }, "ex": { "message": "npr." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH ključ" }, + "typeNote": { + "message": "Bilješka" + }, "newItemHeader": { "message": "Novi $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Postavi svoj PIN kôd za otključavanje Bitwardena. Postavke PIN-a se resetiraju ako se potpuno odjaviš iz aplikacije." }, - "setYourPinCode1": { - "message": "Tvoj PIN će se koristiti za otključavanje Bitwardena umjesto glavne lozinke. PIN će se restirati ukoliko se odjaviš iz Bitwardena. " + "setPinCode": { + "message": "Ovim PIN-om možeš otključati Bitwarden. Tvoj PIN će se resetirati ako se ikada potpuno odjaviš iz aplikacije." }, "pinRequired": { "message": "Potreban je PIN." @@ -2205,7 +2220,7 @@ "message": "Koristi ovu lozinku" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Koristi ovu fraznu lozinku" }, "useThisUsername": { "message": "Koristi ovo korisničko ime" @@ -2377,7 +2392,7 @@ "message": "Pravila privatnosti" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Tvoja nova lozinka ne može biti ista kao tvoja trenutna lozinka." }, "hintEqualsPassword": { "message": "Podsjetnik za lozinku ne može biti isti kao lozinka." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Organizacijsko pravilo onemogućuje uvoz stavki u tvoj osobni trezor." }, + "restrictCardTypeImport": { + "message": "Ne mogu uvesti stavke vrste Platna kartica" + }, + "restrictCardTypeImportDesc": { + "message": "Pravila jedne ili više organizacija onemogućuju uvoz stavke vrste Platna kartica u tvoj trezor." + }, "domainsTitle": { "message": "Domene", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Promijeni" }, + "changePassword": { + "message": "Promijeni lozinku", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Promijeni lozinku - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Rizična lozinka" + }, "atRiskPasswords": { "message": "Rizične lozinke" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Tvoja lozinka za ovo mjesto je rizična. $ORGANIZATION$ zahtijeva da ju promijeniš.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ želi da promjeniš ovu lozinku jer je rizična. Promijeni lozinku u postavkama računa.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Pregledaj i promijeni jednu rizičnu lozinku" }, @@ -2587,14 +2635,14 @@ "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Illustration of a list of logins that are at-risk." + "message": "Ilustracija liste rizičnih prijava." }, "generatePasswordSlideDesc": { "message": "Brzo generiraj jake, jedinstvene lozinke koristeći Bitwarden dijalog auto-ispune direktno na stranici.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password." + "message": "Ilustracija Bitwarden dijaloga auto-ispune s prikazom generirane lozinke." }, "updateInBitwarden": { "message": "Ažuriraj u Bitwardenu" @@ -2604,7 +2652,7 @@ "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." + "message": "Ilustracija Bitwarden upita za ažuriranje prijave." }, "turnOnAutofill": { "message": "Uključi auto-ispunu" @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Dostignut najveći broj pristupanja", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Moraš ovjeriti svoju e-poštu u mrežnom trezoru za koritšenje ove značajke." }, + "masterPasswordSuccessfullySet": { + "message": "Glavna lozinka uspješno postavljena" + }, "updatedMasterPassword": { "message": "Glavna lozinka ažurirana" }, @@ -3022,13 +3073,13 @@ "message": "Nije nađen jedinstveni identifikator." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Glavna lozinka više nije obavezna za članove sljedeće organizacije. Provjeri prikazanu domenu sa svojim administratorom." }, "organizationName": { - "message": "Organization name" + "message": "Naziv Organizacije" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Domena konektora ključa" }, "leaveOrganization": { "message": "Napusti organizaciju" @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Zahtjev poslan" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Prijava za $EMAIL$ potvrđena na uređaju $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Odbijena je prijava na drugom uređaju. Ako si ovo stvarno ti, pokušaj se ponovno prijaviti uređajem." + }, + "device": { + "message": "Uređaj" + }, + "loginStatus": { + "message": "Status prijave" + }, + "masterPasswordChanged": { + "message": "Glavna lozinka promijenjena" + }, "exposedMasterPassword": { "message": "Ukradena glavna lozinka" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Zapamti ovaj uređaj kako bi buduće prijave bile brže" }, + "manageDevices": { + "message": "Upravljaj uređajima" + }, + "currentSession": { + "message": "Trenutna sesija" + }, + "mobile": { + "message": "Mobitel", + "description": "Mobile app" + }, + "extension": { + "message": "Proširenje", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web trezor" + }, + "webApp": { + "message": "Web aplikacija" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Zahtjev u tijeku" + }, + "firstLogin": { + "message": "Prva prijava" + }, + "trusted": { + "message": "Pouzdan" + }, + "needsApproval": { + "message": "Zahtijeva odobrenje" + }, + "devices": { + "message": "Uređaji" + }, + "accessAttemptBy": { + "message": "$EMAIL$ pokušava pristupiti", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potvrdi pristup" + }, + "denyAccess": { + "message": "Odbij pristup" + }, + "time": { + "message": "Vrijeme" + }, + "deviceType": { + "message": "Vrsta uređaja" + }, + "loginRequest": { + "message": "Zahtjev za prijavu" + }, + "thisRequestIsNoLongerValid": { + "message": "Ovaj zahtjev više nije valjan." + }, + "loginRequestHasAlreadyExpired": { + "message": "Zahtjev za prijavu je već istekao." + }, + "justNow": { + "message": "Upravo" + }, + "requestedXMinutesAgo": { + "message": "Zatraženo prije $MINUTES$ minute/a", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Potrebno je odobriti uređaj. Odaberi metodu odobravanja:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Zatraži odobrenje administratora" }, + "unableToCompleteLogin": { + "message": "Nije moguće dovršiti prijavu" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Moraš se prijaviti na pouzdanom uređaju ili zamoliti administratora da ti dodijeli lozinku." + }, "ssoIdentifierRequired": { "message": "Potreban je identifikator organizacije." }, @@ -3591,43 +3761,35 @@ "message": "Uređaj pouzdan" }, "trustOrganization": { - "message": "Trust organization" + "message": "Vjeruj organizaciji" }, "trust": { - "message": "Trust" + "message": "Vjeruj" }, "doNotTrust": { - "message": "Do not trust" + "message": "Nemoj vjerovati" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "Organizacija nije pouzdana" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "Radi sigurnosti tvojeg računa, potvrdi samo ako je ovom korisniku odobren pristup u nuždi i ako se otisak prsta podudara s onim prikazanim u računu" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "Radi sigurnosti tvojeg računa, nastavi samo ako si član ove organizacije, imaš omogućen oporavak računa i otisak prsta prikazan u nastavku odgovara otisku prsta organizacije." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Ova organizacija ima poslovno pravilo koje će te prijaviti za oporavak računa. Prijava će omogućiti administratorima organizacije da promijene tvoju lozinku. Nastavi samo ako prepoznaješ ovu organizaciju i ako se fraza otiska prsta prikazana u nastavku podudara s otiskom prsta organizacije." }, "trustUser": { - "message": "Trust user" - }, - "sendsNoItemsTitle": { - "message": "Nema aktivnih Sendova", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Koristi Send za sigurno slanje šifriranih podataka bilo kome.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + "message": "Vjeruj korisniku" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Sigurno pošalji osjetljive podatke", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Sigurno dijeli datoteke i podatke s bilo kime, na bilo kojoj platformi. Tvoji podaci ostaju kriptirani uz ograničenje izloženosti.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4216,6 +4378,26 @@ "message": "Uobičajeni oblici", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Otkrivanje podudaranja URI-ja je način na koji Bitwarden identificira prijedloge za auto-ispunu.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "„Regularni izraz” je napredna mogućnost s povećanim rizikom od otkrivanja vjerodajnica.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "„Počinje s” je napredna mogućnost s povećnim rizikom od otkrivanja vjerodajnica.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Više o otkrivanju podudaranja", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Napredne mogućnosti", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Nastavi na postavke preglednika?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4362,7 +4544,7 @@ } }, "viewItemTitleWithField": { - "message": "View item - $ITEMNAME$ - $FIELD$", + "message": "Pogledaj stavku - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4386,7 +4568,7 @@ } }, "autofillTitleWithField": { - "message": "Autofill - $ITEMNAME$ - $FIELD$", + "message": "Auto-ispuna - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Kopiraj $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Kopiraj $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4547,31 +4729,31 @@ } }, "downloadBitwarden": { - "message": "Download Bitwarden" + "message": "Preuzmi Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Download Bitwarden on all devices" + "message": "Preuzmi Bitwarden na svim uređajima" }, "getTheMobileApp": { - "message": "Get the mobile app" + "message": "Nabavi mobilnu aplikaciju" }, "getTheMobileAppDesc": { - "message": "Access your passwords on the go with the Bitwarden mobile app." + "message": "Pristupi svojim lozinkama bilo gdje s Bitwarden mobilnom aplikacijom." }, "getTheDesktopApp": { - "message": "Get the desktop app" + "message": "Nabavi aplikaciju za stolna računala" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "Pristupi svojem trezoru bez preglednika, a zatim postavi otključavanje biometrijom za brže otključavanje aplikacije za stolna računala i prošitenja preglednika." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Odmah preusmi s bitwarden.com" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "Nabavi u Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Nabavi u App Store" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Sigurno želiš trajno izbrisati ovaj privitak?" @@ -5035,13 +5217,16 @@ "message": "Biometrijsko otključavanje trenutno nije dostupno iz nepoznatog razloga." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Otključaj svoj trezor u trenu" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Možeš prilagoditi postavke otključavanja i vremena isteka za brže pristupanje svojem trezoru." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "PIN za otključavanje podešen" + }, + "unlockWithBiometricSet": { + "message": "Otključavanje biometrijom postavljeno" }, "authenticating": { "message": "Autentifikacija" @@ -5055,7 +5240,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Spremi u Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5260,129 +5445,139 @@ "message": "Promijeni rizičnu lozinku" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Mogućnosti trezora" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Trezor štiti više od lozinki. Sigurno spremi prijave, identitete, kartice i bilješke." }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Dobrodošli u Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Sigurnost je imperativ" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "Spremi prijave, kartice i identitete u svoj sigurni trezor. Bitwarden koristi end-to-end enkripciju bez znanja kako bi zaštitio ono što ti je važno." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Brza i jednostavna prijava" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Uključi biometrijsko otključavanje i auto-ispunu za prijavu bez utipkavanja ijednog slova." }, "secureUser": { - "message": "Level up your logins" + "message": "Podigni svoje prijave na višu razinu" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Koristi generator za stvaranje i spremanje jakih, jedinstvenih lozinki za sve svoje račune." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Tvoji podaci kada god i gdje god su ti potrebni" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Spremi neograničen broj lozinki na neograničenom broju uređaja s Bitwarden mobilnom aplikacijom, proširenjem za preglednik i aplikacijom za stolna računala." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 obavijest" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Uvezi postojeće lozinke" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Koristi uvoz za brzi prijenos prijava u Bitwarden bez ručnog dodavanja." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Uvezi odmah" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Dobrodošli u svoj trezor!" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Auto-ispuni stavke za trenutnu stranicu" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Favoriti za brzi pristup" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Nađi nešto drugo u svom trezoru" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Uštedi vrijeme s auto-ispunom" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Uključi", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "web stranicu", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "kako bi ova prijava bila predložena u auto-ispuni.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Jednostavna online kupnja" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "S karticama jednostavno i sigurno automatski ispunjavaš obrasce za plaćanje." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Pojednostavi stvaranje računa" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "S identitetima brzo automatski ispunjavaš duge registracijske i kontaktne obrasce." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Čuvaj svoje osjetljive podatke na sigurnom" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "S bilješkama sigurno pohrani svoje osjetljive podatke poput podataka o banci ili osiguranju." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "SSH pristup prilagođen programerima" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Pohrani svoje ključeve i poveži se sa SSH agentom za brzu, šifriranu autentifikaciju.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "Saznaj više o SSH agentu", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Brzo stvori lozinke" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Jednostavno stvori jake i jedinstvene lozinke odabirom tipke", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "kako bi tvoje prijave ostale sigurne.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Jednostavno stvori jake i sigurne lozinke odabirom tipke Generiraj lozinku kako bi tvoje prijave ostale sigurne.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Nemaš dozvolu za pregled ove stranice. Pokušaj se prijaviti s drugim računom." + }, + "wasmNotSupported": { + "message": "WebAssembly ili nije podržan ili nije omogućen u tvom pregledniku. WebAssembly je potreban za korištenje Bitwarden aplikacije.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/hu/messages.json b/apps/browser/src/_locales/hu/messages.json index 55c2ec433c8..a0fc88e047a 100644 --- a/apps/browser/src/_locales/hu/messages.json +++ b/apps/browser/src/_locales/hu/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Keresés a széfben" }, + "resetSearch": { + "message": "Keresés visszaállítása" + }, "edit": { "message": "Szerkesztés" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "A jelszó megváltoztatása után be kell jelentkezni az új jelszóval. Az aktív munkamenetek más eszközökön egy órán belül kijelentkeznek." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Módosítsuk a mesterjelszót a fiók helyreállításának befejezéséhez." + }, "enableChangedPasswordNotification": { "message": "Létező bejelentkezés frissítés kérése" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "A funkció nem érhető el." }, - "encryptionKeyMigrationRequired": { - "message": "Titkosítási kulcs migráció szükséges. Jelentkezzünk be a webes széfen keresztül a titkosítási kulcs frissítéséhez." + "legacyEncryptionUnsupported": { + "message": "A régi titkosítás már nem támogatott. Lépjünk kapcsolatba a támogatással a fiók helyreállításához." }, "premiumMembership": { "message": "Prémium tagság" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Biztonsági Kód" }, + "cardNumber": { + "message": "kártya szám" + }, "ex": { "message": "példa:" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH kulcs" }, + "typeNote": { + "message": "Jegyzet" + }, "newItemHeader": { "message": "Új $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "A pinkód beállítása a Bitwarden feloldásához. A pinkód beállítás alaphelyzetbe kerül, ha teljesen kijelentkezünk az alkalmazásból." }, - "setYourPinCode1": { - "message": "A Bitwarden feloldásához a PIN kódot használjuk a mesterjelszó helyett. A PIN kód alaphelyzetbe kerül, ha teljesen kijelentkezünk a Bitwardenből." + "setPinCode": { + "message": "Ezt a PIN kódot használhatjuk a Bitwarden feloldásához. A PIN kód alaphelyzetbe kerül, ha valaha is teljesen kijelentkezünk az alkalmazásból." }, "pinRequired": { "message": "A pinkód szükséges." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "A szervezeti politika blokkolta az elemek importálását az egyedi széfbe." }, + "restrictCardTypeImport": { + "message": "A kártya elem típusokat nem lehet importálni." + }, + "restrictCardTypeImportDesc": { + "message": "Egy vagy több szervezet által beállított szabályzat megakadályozza a kártyák importálását a széfekbe." + }, "domainsTitle": { "message": "Tartomány", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Módosítás" }, + "changePassword": { + "message": "Jelszó módosítása", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Jelszó módosítás - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Veszélyes jelszó" + }, "atRiskPasswords": { "message": "Veszélyes jelszavak" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "A webhely jelszava veszélyben van. $ORGANIZATION$ kérte a megváltoztatását.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ azt akarja, hogy változtassuk meg ezt a jelszót, mert veszélyben van. A jelszó módosításához navigáljunk fiók beállításokhoz.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Tekintsük át és módosítsuk az egyik veszélyeztetett jelszót." }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "A funkció használatához igazolni kell email címet. Az email cím a webtárban ellenőrizhető." }, + "masterPasswordSuccessfullySet": { + "message": "A mesterjelszó sikeresen beállításra került." + }, "updatedMasterPassword": { "message": "A mesterjelszó frissítésre került." }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "A kérés elküldésre került." }, + "loginRequestApprovedForEmailOnDevice": { + "message": "A bejelentkezési kérelem jóváhagyásra került: $EMAIL$ - $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Megtagadásra került egy bejelentkezési kísérletet egy másik eszközről. Ha valóban mi voltunk, próbáljunk meg újra bejelentkezni az eszközzel." + }, + "device": { + "message": "Eszköz" + }, + "loginStatus": { + "message": "Bejelentkezési állapot" + }, + "masterPasswordChanged": { + "message": "A mesterjelszó mentésre került." + }, "exposedMasterPassword": { "message": "Kiszivárgott mesterjelszó" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Emlékezés az eszközre, hogy zökkenőmentes legyen a jövőbeni bejelentkezés" }, + "manageDevices": { + "message": "Eszközök kezelése" + }, + "currentSession": { + "message": "Jelenlegi munkamenet" + }, + "mobile": { + "message": "Mobil", + "description": "Mobile app" + }, + "extension": { + "message": "Kiterjesztés", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Asztali", + "description": "Desktop app" + }, + "webVault": { + "message": "Webes széf" + }, + "webApp": { + "message": "Webalkalmazás" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Függőben lévő kérelem" + }, + "firstLogin": { + "message": "Első bejelentkezés" + }, + "trusted": { + "message": "Megbízható" + }, + "needsApproval": { + "message": "Jóváhagyást igényel" + }, + "devices": { + "message": "Eszközök" + }, + "accessAttemptBy": { + "message": "Bejelentkezési kísérlet $EMAIL$ segítségével", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Hozzáférés megerősítése" + }, + "denyAccess": { + "message": "Hozzáférés megtagadása" + }, + "time": { + "message": "Időpont" + }, + "deviceType": { + "message": "Eszköz típus" + }, + "loginRequest": { + "message": "Bejelentkezés kérés" + }, + "thisRequestIsNoLongerValid": { + "message": "A kérés a továbbiakban már nem érvényes." + }, + "loginRequestHasAlreadyExpired": { + "message": "A bejelentkezési kérés már lejárt." + }, + "justNow": { + "message": "Éppen most" + }, + "requestedXMinutesAgo": { + "message": "Kérve $MINUTES$ perccel ezelőtt", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Az eszköz jóváhagyása szükséges. Válasszunk egy jóváhagyási lehetőséget lentebb:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Adminisztrátori jóváhagyás kérés" }, + "unableToCompleteLogin": { + "message": "Nem lehet befejezni a bejelentkezést." + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Be kell jelentkezni egy megbízható eszközön vagy meg kell kérni az adminisztrátort, hogy rendeljen hozzá egy jelszót." + }, "ssoIdentifierRequired": { "message": "A szervezeti SSO azonosító megadása szükséges." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Megbízható felhasználó" }, - "sendsNoItemsTitle": { - "message": "Nincsenek natív Send elemek.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "A Send használatával biztonságosan megoszthatjuk a titkosított információkat bárkivel.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Érzékeny információt küldése biztonságosan", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Általános formátumok", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Az URI egyezés észlelése az, ahogyan a Bitwarden azonosítja az automatikus kitöltési javaslatokat.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "A \"Normál kifejezés“ egy fejlett opció, amely a hitelesítő adatok növekvő kiszivárgásának kockázatával.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "A \"Kezdés\" egy fejlett opció, amely a hitelesítő adatok kiszivárgásának növekvő kockázatával.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Bővebben az egyezés felismerésről", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Haladó opciók", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "$FIELD$, $VALUE$ másolása", + "copyFieldCipherName": { + "message": "$FIELD$, $CIPHERNAME$ másolása", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "PIN beállítás feloldása" }, + "unlockWithBiometricSet": { + "message": "Feloldás biometrikusan" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Nincs jogosultság az oldal megtekintéséhez. Próbáljunk meg másik fiókkal bejelentkezni." + }, + "wasmNotSupported": { + "message": "A WebAssembly nem támogatott a böngészőben vagy nincs engedélyezve. A WebAssembly szükséges a Bitwarden alkalmazás használatához.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Több megjelenítése" + }, + "showLess": { + "message": "Kevesebb megjelenítése" } } diff --git a/apps/browser/src/_locales/id/messages.json b/apps/browser/src/_locales/id/messages.json index ec27c6b6328..297b2d458e1 100644 --- a/apps/browser/src/_locales/id/messages.json +++ b/apps/browser/src/_locales/id/messages.json @@ -20,7 +20,7 @@ "message": "Undangan diterima" }, "createAccount": { - "message": "Buat Akun" + "message": "Buat akun" }, "newToBitwarden": { "message": "Baru menggunakan Bitwarden?" @@ -547,6 +547,9 @@ "searchVault": { "message": "Cari brankas" }, + "resetSearch": { + "message": "Atur ulang pencarian" + }, "edit": { "message": "Edit" }, @@ -1072,7 +1075,7 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationNewItemAria": { - "message": "New Item, opens in new window", + "message": "Benda baru, buka di jendela baru", "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { @@ -1093,15 +1096,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "telah disimpan ke Bitwarden.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "telah diperbarui di Bitwarden.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Pilih $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1121,7 +1124,7 @@ "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "Buka untuk menyimpan login ini", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { @@ -1173,6 +1176,12 @@ "message": "Oh tidak! Kami tidak bisa menyimpan ini. Cobalah memasukkan rincian secara manual.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Setelah mengubah kata sandi, Anda perlu masuk lagi dengan kata sandi baru. Sesi aktif di perangkat lain akan keluar dalam satu jam." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Ubah kata sandi utama Anda untuk menyelesaikan pemulihan akun." + }, "enableChangedPasswordNotification": { "message": "Tanyakan untuk memperbarui masuk yang sudah ada" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Fitur Tidak Tersedia" }, - "encryptionKeyMigrationRequired": { - "message": "Kunci enkripsi migrasi dibutuhkan. Silakan masuk melalui brankas web untuk memperbarui kunci enkripsi Anda." + "legacyEncryptionUnsupported": { + "message": "Enkripsi usang tidak lagi didukung. Silakan hubungi pendukung untuk memulihkan akun Anda." }, "premiumMembership": { "message": "Keanggotaan Premium" @@ -1600,13 +1609,13 @@ "message": "Saran isi otomatis" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "Temukan saran isi otomatis dengan mudah" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "Matikan pengaturan isi otomatis peramban Anda, sehingga tidak bertentangan dengan Bitwarden." }, "turnOffBrowserAutofill": { - "message": "Turn off $BROWSER$ autofill", + "message": "Matikan isi otomatis $BROWSER$", "placeholders": { "browser": { "content": "$1", @@ -1615,7 +1624,7 @@ } }, "turnOffAutofill": { - "message": "Turn off autofill" + "message": "Matikan isi otomatis" }, "showInlineMenuLabel": { "message": "Tampilkan saran isi otomatis pada kolom formulir" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Kode Keamanan" }, + "cardNumber": { + "message": "nomor kartu" + }, "ex": { "message": "mis." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Kunci SSH" }, + "typeNote": { + "message": "Catatan" + }, "newItemHeader": { "message": "$TYPE$ baru", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Setel kode PIN Anda untuk membuka kunci Bitwarden. Pengaturan PIN Anda akan diatur ulang jika Anda pernah keluar sepenuhnya dari aplikasi." }, - "setYourPinCode1": { - "message": "PIN Anda akan digunakan untuk membuka Bitwarden alih-alih dengan kata sandi utama Anda. PIN Anda akan diatur ulang apabila Anda pernah keluar sepenuhnya dari Bitwarden." + "setPinCode": { + "message": "Anda dapat menggunakan PIN ini untuk membuka Bitwarden. PIN Anda akan diatur ulang jika Anda keluar dari semua sesi aplikasi." }, "pinRequired": { "message": "Membutuhkan kode PIN." @@ -2205,7 +2220,7 @@ "message": "Gunakan kata sandi ini" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Gunakan frasa sandi ini" }, "useThisUsername": { "message": "Gunakan nama pengguna ini" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Sebuah kebijakan organisasi telah menghalangi mengimpor benda-benda ke brankas pribadi Anda." }, + "restrictCardTypeImport": { + "message": "Tidak dapat meingpor jenis item kartu" + }, + "restrictCardTypeImportDesc": { + "message": "Kebijakan yang diatur 1 atau lebih organisasi tidak mengizinkan Anda mengimpor kartu ke brankas." + }, "domainsTitle": { "message": "Domain", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Ubah" }, + "changePassword": { + "message": "Ubah kata sandi", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Ubah kata sandi - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Kata sandi yang berisiko" + }, "atRiskPasswords": { "message": "Kata sandi yang berrisiko" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Kata sandi Anda untuk situs ini dalam bahaya. $ORGANIZATION$ telah meminta Anda untuk mengubahnya.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ ingin Anda untuk mengubah kata sandi ini karena kata sandi itu dalam bahaya. Pergi ke pengaturan akun Anda untuk mengubah kata sandinya.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Tinjau dan ubah satu kata sandi berrisiko" }, @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Jumlah akses maksimum tercapai", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Anda harus memverifikasi email Anda untuk menggunakan fitur ini. Anda dapat memverifikasi email Anda di brankas web." }, + "masterPasswordSuccessfullySet": { + "message": "Kata sandi utama berhasil diatur" + }, "updatedMasterPassword": { "message": "Kata Sandi Utama Telah Diperbarui" }, @@ -3022,13 +3073,13 @@ "message": "Tidak ada pengidentifikasi unik yang ditemukan." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Sebuah kata sandi utama tidak lagi dibutuhkan untuk para anggota dari organisasi berikut. Silakan konfirmasi domain berikut kepada pengelola organisasi Anda." }, "organizationName": { - "message": "Organization name" + "message": "Nama organisasi" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Domain penghubung kunci" }, "leaveOrganization": { "message": "Tinggalkan Organisasi" @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Permintaan terkirim" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Permintaan masuk untuk $EMAIL$ di $DEVICE$ diizinkan", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Anda menolak percobaan masuk dari perangkat lain. Jika itu adalah Anda, mohon coba masuk kembali di perangkat tersebut." + }, + "device": { + "message": "Perangkat" + }, + "loginStatus": { + "message": "Status masuk" + }, + "masterPasswordChanged": { + "message": "Sandi utama disimpan" + }, "exposedMasterPassword": { "message": "Kata Sandi Utama yang Terpapar" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Ingat perangkat ini untuk membuat login berikutnya lebih lancar" }, + "manageDevices": { + "message": "Kelola perangkat" + }, + "currentSession": { + "message": "Sesi saat ini" + }, + "mobile": { + "message": "Seluler", + "description": "Mobile app" + }, + "extension": { + "message": "Pengaya", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Brankas web" + }, + "webApp": { + "message": "Aplikasi web" + }, + "cli": { + "message": "Antarmuka Baris Perintah" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Permintaan tertunda" + }, + "firstLogin": { + "message": "Masuk pertama" + }, + "trusted": { + "message": "Terpercaya" + }, + "needsApproval": { + "message": "Perlu persetujuan" + }, + "devices": { + "message": "Perangkat" + }, + "accessAttemptBy": { + "message": "Percobaan akses oleh $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Izinkan akses" + }, + "denyAccess": { + "message": "Tolak akses" + }, + "time": { + "message": "Waktu" + }, + "deviceType": { + "message": "Jenis Perangkat" + }, + "loginRequest": { + "message": "Permintaan masuk" + }, + "thisRequestIsNoLongerValid": { + "message": "Permintaan ini tidak lagi valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Permintaan masuk kedaluwarsa." + }, + "justNow": { + "message": "Baru saja" + }, + "requestedXMinutesAgo": { + "message": "Diminta $MINUTES$ menit yang lalu", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Persetujuan perangkat diperlukan. Pilih sebuah pilihan persetujuan berikut:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Minta persetujuan admin" }, + "unableToCompleteLogin": { + "message": "Gagal menyelesaikan proses masuk" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Anda harus masuk di perangkat terpercaya atau meminta administrator untuk membuat kata sandi Anda." + }, "ssoIdentifierRequired": { "message": "Pengenal SSO organisasi diperlukan." }, @@ -3614,20 +3784,12 @@ "trustUser": { "message": "Percayai pengguna" }, - "sendsNoItemsTitle": { - "message": "Tidak ada Send yang aktif", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Gunakan Send untuk membagikan informasi terenkripsi secara aman dengan siapapun.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Kirim informasi sensitif dengan aman", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Bagikan berkas-berkas dan data secara aman dengan siapa saja, pada platform apapun. Informasi Anda akan tetap terenkripsi dari ujung-ke-ujung sembari membatasi paparan.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4216,6 +4378,26 @@ "message": "Format umum", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Bitwarden mengenali saran isi otomatis menggunakan deteksi kecocokan URI.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Ekspresi regular\" adalah opsi lanjutan dengan risiko lebih besar untuk menyingkapkan identitas anda.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Bermula dengan\" adalah opsi lanjutan dengan risiko lebih besar untuk menyingkapkan identitas anda.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Ketahui lebih tentang deteksi kecocokan", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Opsi lanjutan", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Lanjutkan ke pengaturan peramban?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Salin $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Salin $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4568,10 +4750,10 @@ "message": "Unduh dari bitwarden.com sekarang" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "Dapatkan di Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Unduh di App Store" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Apakah Anda yakin ingin menghapus lampiran ini selamanya?" @@ -4874,13 +5056,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Berhasil menetapkan koleksi" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Anda belum memilih apa pun." }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Benda dipindah ke $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4889,7 +5071,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Benda dipindah ke $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4898,7 +5080,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ dipindah ke bawah, posisi $INDEX$ dari $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4918,25 +5100,25 @@ "message": "Lokasi Item" }, "fileSend": { - "message": "File Send" + "message": "Berkas Send" }, "fileSends": { - "message": "File Sends" + "message": "Berkas-berkas Send" }, "textSend": { - "message": "Text Send" + "message": "Teks Send" }, "textSends": { - "message": "Text Sends" + "message": "Teks Send" }, "accountActions": { "message": "Tindakan akun" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Tampilkan jumlah saran isi otomatis login pada ikon pengaya" }, "showQuickCopyActions": { - "message": "Show quick copy actions on Vault" + "message": "Tampilkan tindakan salin cepat pada Vault" }, "systemDefault": { "message": "Baku sistem" @@ -4972,58 +5154,58 @@ "message": "Coba lagi" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Minimal tenggat waktu ubahsuai adalah 1 menit." }, "additionalContentAvailable": { - "message": "Additional content is available" + "message": "Konten tambahan telah tersedia" }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Berkas tersimpan di perangkat. Kelola dari unduhan perangkat Anda." }, "showCharacterCount": { "message": "Tunjukkan cacah karakter" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Sembunyikan jumlah karakter" }, "itemsInTrash": { - "message": "Items in trash" + "message": "Benda-benda di tempat sampah" }, "noItemsInTrash": { - "message": "No items in trash" + "message": "Tidak ada benda di tempat sampah" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Benda-benda yang Anda hapus akan muncul di sini dan akan dihapus selamanya setelah 30 hari" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "Benda-benda yang berada di tempat sampah lebih dari 30 hari akan dihapus secara otomatis" }, "restore": { - "message": "Restore" + "message": "Pulihkan" }, "deleteForever": { - "message": "Delete forever" + "message": "Hapus selamanya" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Anda tidak memiliki izin untuk menyunting benda ini" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Buka dengan biometrik tidak tersedia karena memerlukan PIN atau kata sandi untuk membuka terlebih dahulu." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Buka dengan biometrik tidak tersedia untuk saat ini." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Buka dengan biometrik tidak tersedia karena pengaturan berkas-berkas sistem yang tidak sesuai." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Buka dengan biometrik tidak tersedia karena pengaturan berkas-berkas sistem yang tidak sesuai." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Buka dengan biometrik tidak tersedia karena aplikasi destop Bitwarden tertutup." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Buka dengan biometrik tidak tersedia karena tidak dinyalakan untuk $EMAIL$ pada aplikasi destop Bitwarden.", "placeholders": { "email": { "content": "$1", @@ -5032,22 +5214,25 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Buka dengan biometrik tidak tersedia untuk saat ini karena alasan yang tidak diketahui." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Buka brankas Anda dalam hitungan detik" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Anda dapat mengubahsuai pengaturan membuka dan waktu tenggat Anda agar dapat lebih cepat mengakses brankas Anda." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "PIN untuk membuka telah diatur" + }, + "unlockWithBiometricSet": { + "message": "Biometrik untuk membuka telah diatur" }, "authenticating": { - "message": "Authenticating" + "message": "Sedang memeriksa keaslian" }, "fillGeneratedPassword": { - "message": "Fill generated password", + "message": "Isi kata sandi yang dihasilkan", "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { @@ -5055,7 +5240,7 @@ "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Simpan ke Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { @@ -5260,67 +5445,67 @@ "message": "Ubah kata sandi yang berrisiko" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Pilihan brankas" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Brankas melindungi lebih dari kata sandi Anda. Simpan login aman, pengenal, kartu dan catatan secara aman di sini." }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Selamat datang ke Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Keamanan, diutamakan" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "Simpan login, kartu, dan pengenal ke brankas aman Anda. Bitwarden menggunakan ketidaktahuan, enkripsi dari ujung-ke-ujung untuk melindungi apa yang penting bagi Anda." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Masuk dengan cepat dan mudah" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Atur buka dengan biometrik dan isi otomatis untuk masuk ke akun-akun Anda tanpa mengetik sebuah huruf." }, "secureUser": { - "message": "Level up your logins" + "message": "Tingkatkan login Anda" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Gunakan penghasil untuk membuat dan menyimpan kata sandi yang kuat dan unit untuk semua akun Anda." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Data Anda, kapanpun dan dimanapun Anda membutuhkannya" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Simpan kata sandi tak terbatas lintas perangkat tak terbatas dengan Bitwarden untuk ponsel, peramban, dan aplikasi destop." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 pemberitahuan" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Impor kata sandi yang sudah ada" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Gunakan pengimpor untuk memindakan login dengan cepat ke Bitwarden tanpa menambahkannya secara manual." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Impor sekarang" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Selamat datang di brankas Anda!" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Benda-benda isi otomatis untuk halaman saat ini" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Benda yang disukai untuk akses cepat" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Cari brankas Anda untuk sesuatu yang lain" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Hemat waktu dengan isi otomatis" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Sertakan", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, @@ -5366,23 +5551,33 @@ "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Buat kata sandi dengan cepat" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Buat kata sandi yang kuat dan unik dengan mudah dengan menekan pada", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "untuk membantu Anda menyimpan login Anda dengan aman.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Buat kata sandi yang kuat dan unik dengan mudah dengan menekan pada tombol Buat kata sandi untuk membantu Anda menyimpan login Anda dengan aman.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Anda tidak memiliki izin untuk melihat halaman ini. Coba masuk dengan akun yang berbeda." + }, + "wasmNotSupported": { + "message": "WebAssembly tidak didukung atau tidak dinyalakan oleh peramban Anda. Web Assembly diperlukan untuk menggunakan aplikasi Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/it/messages.json b/apps/browser/src/_locales/it/messages.json index 77be022e58c..4e1c1d63e50 100644 --- a/apps/browser/src/_locales/it/messages.json +++ b/apps/browser/src/_locales/it/messages.json @@ -132,7 +132,7 @@ "message": "Copia password" }, "copyPassphrase": { - "message": "Copia passphrase" + "message": "Copia frase segreta" }, "copyNote": { "message": "Copia nota" @@ -462,13 +462,13 @@ "message": "Genera password" }, "generatePassphrase": { - "message": "Genera passphrase" + "message": "Genera frase segreta" }, "passwordGenerated": { "message": "Parola d'accesso generata" }, "passphraseGenerated": { - "message": "Frase d'accesso generata" + "message": "Frase segreta generata" }, "usernameGenerated": { "message": "Nome utente generato" @@ -547,6 +547,9 @@ "searchVault": { "message": "Cerca nella cassaforte" }, + "resetSearch": { + "message": "Svuota ricerca" + }, "edit": { "message": "Modifica" }, @@ -1113,11 +1116,11 @@ } }, "saveAsNewLoginAction": { - "message": "Salva come nuovo accesso", + "message": "Salva come nuovo login", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Aggiorna accesso", + "message": "Aggiorna login", "description": "Button text for updating an existing login entry." }, "unlockToSave": { @@ -1133,11 +1136,11 @@ "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Accesso salvato", + "message": "Login salvato", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Accesso aggiornato", + "message": "Login aggiornato", "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { @@ -1170,9 +1173,15 @@ "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "Oh no! Non abbiamo potuto salvarlo. Prova a inserire manualmente i dettagli.", + "message": "Oh no! Il salvataggio non è riuscito. Prova a inserire i dati manualmente.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Dopo aver cambiato la password, dovrai accedere con quella nuova. Le sessioni attive su altri dispositivi saranno disconnesse entro un'ora." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Cambia la password principale per completare il recupero dell'account." + }, "enableChangedPasswordNotification": { "message": "Chiedi di aggiornare il login esistente" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funzionalità non disponibile" }, - "encryptionKeyMigrationRequired": { - "message": "Migrazione della chiave di crittografia obbligatoria. Accedi tramite la cassaforte web per aggiornare la tua chiave di crittografia." + "legacyEncryptionUnsupported": { + "message": "La crittografia legacy non è più supportata. Contatta l'assistenza per recuperare il tuo account." }, "premiumMembership": { "message": "Abbonamento Premium" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Codice di sicurezza" }, + "cardNumber": { + "message": "numero carta" + }, "ex": { "message": "es." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Chiave SSH" }, + "typeNote": { + "message": "Nota" + }, "newItemHeader": { "message": "Nuovo $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Imposta il tuo codice PIN per sbloccare Bitwarden. Le tue impostazioni PIN saranno resettate se esci completamente dall'app." }, - "setYourPinCode1": { - "message": "Il tuo PIN sarà usato per sbloccare Bitwarden invece della password principale. Il PIN sarà ripristinato se ti disconnetterai completamente da Bitwarden." + "setPinCode": { + "message": "Puoi usare il PIN per sbloccare Bitwarden. Il PIN sarà disattivato ogni volta che ti scolleghi dall'account." }, "pinRequired": { "message": "Codice PIN obbligatorio." @@ -2205,7 +2220,7 @@ "message": "Usa questa password" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Usa questa frase segreta" }, "useThisUsername": { "message": "Usa questo nome utente" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Una politica dell'organizzazione ti impedisce di importare elementi nella tua cassaforte individuale." }, + "restrictCardTypeImport": { + "message": "Impossibile importare elementi di tipo carta" + }, + "restrictCardTypeImportDesc": { + "message": "Non puoi importare carte nelle tue casseforti a causa di una politica impostata da una o più organizzazioni." + }, "domainsTitle": { "message": "Domini", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Cambia" }, + "changePassword": { + "message": "Cambia password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Cambia parola d'accesso - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Password a rischio" + }, "atRiskPasswords": { "message": "Parola d'accesso a rischio" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "La tua password per questo sito è a rischio. $ORGANIZATION$ ha richiesto di modificarla.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ ti chiede di cambiare la tua password perché è a rischio. Vai alle impostazioni del tuo account per la modifica.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Rivedi e modifica una parola d'accesso a rischio" }, @@ -2583,7 +2631,7 @@ "message": "Rivedi parole d'accesso a rischio" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Le parole d'accesso dell'organizzazione sono a rischio perché sono deboli, riutilizzate, e/o esposte.", + "message": "Le password dell'organizzazione sono a rischio perché sono deboli, riutilizzate, e/o esposte.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Raggiunto il limite massimo degli accessi", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Devi verificare la tua email per usare questa funzionalità. Puoi verificare la tua email nella cassaforte web." }, + "masterPasswordSuccessfullySet": { + "message": "Password principale impostata correttamente" + }, "updatedMasterPassword": { "message": "Password principale aggiornata" }, @@ -3132,7 +3183,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Usa $RECOMMENDED$ parole o più per generare una passphrase forte.", + "message": " Usa $RECOMMENDED$ parole o più per generare una frase segreta forte.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Richiesta inviata" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Richiesta di accesso approvata per $EMAIL$ su $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Hai negato un tentativo di accesso da un altro dispositivo. Se eri davvero tu, prova di nuovo ad accedere con il dispositivo." + }, + "device": { + "message": "Dispositivo" + }, + "loginStatus": { + "message": "Stato login" + }, + "masterPasswordChanged": { + "message": "Password principale salvata" + }, "exposedMasterPassword": { "message": "Password principale violata" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Ricorda questo dispositivo per rendere immediati i futuri accessi" }, + "manageDevices": { + "message": "Gestisci dispositivi" + }, + "currentSession": { + "message": "Sessione in corso" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Estensione", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Cassaforte Web" + }, + "webApp": { + "message": "Bitwarden Web" + }, + "cli": { + "message": "Linea di comando" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Richiesta in attesa" + }, + "firstLogin": { + "message": "Primo accesso" + }, + "trusted": { + "message": "Attendibile" + }, + "needsApproval": { + "message": "In attesa di approvazione" + }, + "devices": { + "message": "Dispositivi" + }, + "accessAttemptBy": { + "message": "Tentativo di accesso da $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Conferma l'accesso" + }, + "denyAccess": { + "message": "Nega l'accesso" + }, + "time": { + "message": "Ora" + }, + "deviceType": { + "message": "Tipo di dispositivo" + }, + "loginRequest": { + "message": "Richiesta di accesso" + }, + "thisRequestIsNoLongerValid": { + "message": "Questa richiesta non è più valida." + }, + "loginRequestHasAlreadyExpired": { + "message": "La richiesta di accesso è scaduta." + }, + "justNow": { + "message": "Pochi secondi fa" + }, + "requestedXMinutesAgo": { + "message": "Richiesta: $MINUTES$ minuti fa", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Approvazione del dispositivo obbligatoria. Seleziona un'opzione di approvazione:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Richiedi approvazione dell'amministratore" }, + "unableToCompleteLogin": { + "message": "Impossibile completare l'accesso" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "È necessario accedere da un dispositivo attendibile oppure chiedere all'amministratore l'assegnazione di una password." + }, "ssoIdentifierRequired": { "message": "Identificatore SSO dell'organizzazione obbligatorio." }, @@ -3597,7 +3767,7 @@ "message": "Fidati" }, "doNotTrust": { - "message": "Non fidarti" + "message": "Non considerare affidabile" }, "organizationNotTrusted": { "message": "L'organizzazione non è fidata" @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Fidati dell'utente" }, - "sendsNoItemsTitle": { - "message": "Nessun Send attivo", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Utilizza un Send per condividere in modo sicuro le informazioni con qualsiasi utente.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Invia informazioni sensibili in modo sicuro", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3828,7 +3990,7 @@ "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Aggiungi un nuovo elemento \"login\" alla cassaforte, apri in una nuova finestra", + "message": "Aggiungi un nuovo elemento 'login' alla cassaforte (si apre in una nuova finestra)", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -4216,6 +4378,26 @@ "message": "Formati comuni", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "La corrispondenza URL è il metodo predefinito per identificare i suggerimenti di riempimento automatico.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "'Espressione regolare' è un'opzione avanzata con un maggior rischio di esporre le credenziali.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "'Inizia con' è un'opzione con un maggior rischio di esporre le credenziali.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Ulteriori informazioni sulla corrispondenza degli URL", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Opzioni avanzate", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continua sulle impostazioni del browser?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copia $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copia $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4562,7 +4744,7 @@ "message": "Scarica l'app desktop" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "Accedi alla tua cassaforte senza browser, quindi imposta lo sblocco biometrico per accelerare l'accesso sia all'app desktop che all'estensione." }, "downloadFromBitwardenNow": { "message": "Scarica ora da bitwarden.com" @@ -5038,11 +5220,14 @@ "message": "Sblocca la cassaforte in secondi" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Puoi personalizzare le impostazioni di sblocco e timeout per accedere più rapidamente alla tua cassaforte." }, "unlockPinSet": { "message": "Sblocca PIN impostato" }, + "unlockWithBiometricSet": { + "message": "Sblocca con i dati biometrici" + }, "authenticating": { "message": "Autenticazione" }, @@ -5263,126 +5448,136 @@ "message": "Opzioni cassaforte" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "La cassaforte protegge e tiene al sicuro non solo le password, ma anche le passkey, i nomi utente, le identità, le carte e le note." }, "introCarouselLabel": { "message": "Benvenuto su Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Sicurezza alla massima priorità" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "Salva login, carte e identità nella tua cassaforte sicura. Bitwarden usa la crittografia end-to-end e zero-knowledge per proteggere i tuoi dati." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Autenticazione facile e veloce" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Imposta lo sblocco biometrico e il riempimento automatico per accedere ai tuoi account senza digitare una sola lettera." }, "secureUser": { - "message": "Level up your logins" + "message": "Porta i tuoi login al livello successivo" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Usa il generatore per creare e salvare password forti e uniche per tutti i tuoi account." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "I tuoi dati, dove e quando ti servono" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Salva tutte le password che vuoi su un numero illimitato di dispositivi con le app Bitwarden per browser, mobile e desktop." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 notifica" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Importa password esistenti" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Usa l'importatore per trasferire rapidamente i login su Bitwarden senza aggiungerli manualmente." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Importa ora" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Benvenuto nella tua cassaforte!" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Riempimento automatico per questa pagina" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Trova facilmente gli elementi più usati grazie ai Preferiti" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Cerca altro nella tua cassaforte" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Accedi in un attimo grazie al riempimento automatico" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Includi", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "Sito", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "questo login appare come suggerimento per il riempimento automatico.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Accesso e pagamento online semplificati" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Con le carte memorizzate, riempi i campi di pagamento in modo facile e veloce." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Semplifica la creazione di account" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Con le identità, riempi in un attimo i moduli di registrazione per la creazione di account." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Mantieni al sicuro i tuoi dati sensibili" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Usa le note per memorizzare in modo sicuro i dati sensibili come i dettagli bancari o assicurativi." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Accesso SSH ideale per gli sviluppatori" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Memorizza le chiavi e connettiti con l'agente SSH per un'autenticazione crittografata veloce.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "Scopri di più sull'agente SSH", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Crea rapidamente password sicure" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Crea facilmente password forti e uniche cliccando su", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "per aiutarti a mantenere i tuoi login al sicuro.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Crea facilmente password forti e uniche cliccando sul pulsante 'Genera password' per aiutarti a mantenere al sicuro i tuoi login.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Non hai i permessi per visualizzare questa pagina. Prova ad accedere con un altro account." + }, + "wasmNotSupported": { + "message": "WebAssembly non è supportato dal browser o non è abilitato. WebAssembly è richiesto per utilizzare l'app Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Mostra di più" + }, + "showLess": { + "message": "Mostra di meno" } } diff --git a/apps/browser/src/_locales/ja/messages.json b/apps/browser/src/_locales/ja/messages.json index e66d0a2454c..9370a3ae6b1 100644 --- a/apps/browser/src/_locales/ja/messages.json +++ b/apps/browser/src/_locales/ja/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "保管庫を検索" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "編集" }, @@ -1173,6 +1176,12 @@ "message": "保存できませんでした。詳細を手動で入力してください。", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "既存のログイン情報の更新を尋ねる" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "サービスが利用できません" }, - "encryptionKeyMigrationRequired": { - "message": "暗号化キーの移行が必要です。暗号化キーを更新するには、ウェブ保管庫からログインしてください。" + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "プレミアム会員" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "セキュリティコード" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "例:" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH 鍵" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "$TYPE$ を新規作成", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Bitwarden のロックを解除するための PIN コードを設定します。アプリから完全にログアウトすると、PIN 設定はリセットされます。" }, - "setYourPinCode1": { - "message": "あなたの PIN はマスターパスワードの代わりに Bitwarden のロックを解除するために使用されます。Bitwarden から完全にログアウトすると PIN がリセットされます。" + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN コードが必要です。" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "組織のポリシーにより、個々の保管庫へのアイテムのインポートがブロックされました。" }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "ドメイン", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "変更" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "パスワードの変更 - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "リスクがあるパスワード" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "1 件の危険なパスワードを確認・変更する" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "この機能を使用するにはメールアドレスを確認する必要があります。ウェブ保管庫でメールアドレスを確認できます。" }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "マスターパスワードを更新しました" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "リクエストが送信されました" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "流出したマスターパスワード" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "このデバイスを記憶して今後のログインをシームレスにする" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "デバイスの承認が必要です。以下から承認オプションを選択してください:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "管理者の承認を要求する" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "組織の SSO ID が必要です。" }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "アクティブな Send なし", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Send を使用すると暗号化された情報を誰とでも安全に共有できます。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "一般的な形式", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "ブラウザの設定に進みますか?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "$FIELD$ 「$VALUE$」 をコピー", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "認証中" }, @@ -5260,7 +5445,7 @@ "message": "危険なパスワードの変更" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "保管庫オプション" }, "emptyVaultDescription": { "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ka/messages.json b/apps/browser/src/_locales/ka/messages.json index afd301305ff..6bbdb6f67f3 100644 --- a/apps/browser/src/_locales/ka/messages.json +++ b/apps/browser/src/_locales/ka/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "ჩასწორება" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "დომენები", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "ავთენტიკაცია" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/km/messages.json b/apps/browser/src/_locales/km/messages.json index 29223942fd6..d076ef01ef2 100644 --- a/apps/browser/src/_locales/km/messages.json +++ b/apps/browser/src/_locales/km/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/kn/messages.json b/apps/browser/src/_locales/kn/messages.json index 6065dec254f..f4ab488884a 100644 --- a/apps/browser/src/_locales/kn/messages.json +++ b/apps/browser/src/_locales/kn/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "ವಾಲ್ಟ್ ಹುಡುಕಿ" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "ಎಡಿಟ್" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "ವೈಶಿಷ್ಟ್ಯ ಲಭ್ಯವಿಲ್ಲ" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "ಪ್ರೀಮಿಯಂ ಸದಸ್ಯತ್ವ" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "ಭದ್ರತಾ ಕೋಡ್ " }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ಉದಾಹರಣೆ" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "ಬಿಟ್‌ವಾರ್ಡೆನ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನಿಮ್ಮ ಪಿನ್ ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಿ. ನೀವು ಎಂದಾದರೂ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಸಂಪೂರ್ಣವಾಗಿ ಲಾಗ್ out ಟ್ ಆಗಿದ್ದರೆ ನಿಮ್ಮ ಪಿನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮರುಹೊಂದಿಸಲಾಗುತ್ತದೆ." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "ಪಿನ್ ಕೋಡ್ ಅಗತ್ಯವಿದೆ." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು ನಿಮ್ಮ ಇಮೇಲ್ ಅನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬೇಕು. ವೆಬ್ ವಾಲ್ಟ್ನಲ್ಲಿ ನಿಮ್ಮ ಇಮೇಲ್ ಅನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬಹುದು." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ko/messages.json b/apps/browser/src/_locales/ko/messages.json index ef3402dc496..50725e73064 100644 --- a/apps/browser/src/_locales/ko/messages.json +++ b/apps/browser/src/_locales/ko/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Bitwarden 로고" }, "extName": { "message": "Bitwarden 비밀번호 관리자", @@ -465,10 +465,10 @@ "message": "암호 생성" }, "passwordGenerated": { - "message": "Password generated" + "message": "비밀번호 생성됨" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "패스프레이즈 생성됨" }, "usernameGenerated": { "message": "Username generated" @@ -547,6 +547,9 @@ "searchVault": { "message": "보관함 검색" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "편집" }, @@ -744,7 +747,7 @@ "message": "시스템 잠금 시" }, "onRestart": { - "message": "브라우저 다시 시작 시" + "message": "브라우저 재시작 시" }, "never": { "message": "안함" @@ -1013,7 +1016,7 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "로그인을 추가할 건지 물어보기" + "message": "로그인 추가 확인" }, "vaultSaveOptionsTitle": { "message": "보관함 옵션들을 저장하기" @@ -1025,7 +1028,7 @@ "message": "보관함에 항목이 없을 경우 추가하라는 메시지를 표시합니다. 모든 로그인된 계정에 적용됩니다." }, "showCardsInVaultViewV2": { - "message": "보관함 보기에서 언제나 카드 자동 완성 제안을 표시" + "message": "보관함 보기에서 자동 완성 제안으로 카드를 항상 표시" }, "showCardsCurrentTab": { "message": "탭 페이지에 카드 표시" @@ -1034,7 +1037,7 @@ "message": "간편한 자동완성을 위해 탭에 카드 항목들을 나열" }, "showIdentitiesInVaultViewV2": { - "message": "보관함 보기에서 언제나 신원의 자동 완성 제안을 표시" + "message": "보관함 보기에서 자동 채우기 제안으로 신원을 항상 표시" }, "showIdentitiesCurrentTab": { "message": "탭 페이지에 신원들을 표시" @@ -1046,7 +1049,7 @@ "message": "보관함 보기에서 항목을 클릭하여 자동 완성" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "자동 완성 제안에서 항목 클릭으로 채우기" }, "clearClipboard": { "message": "클립보드 비우기", @@ -1173,8 +1176,14 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { - "message": "현재 로그인으로 업데이트할 건지 묻기" + "message": "기존 로그인 정보 업데이트 확인" }, "changedPasswordNotificationDesc": { "message": "웹사이트에서 변경 사항이 감지되면 로그인 비밀번호를 업데이트하라는 메시지를 표시합니다." @@ -1204,7 +1213,7 @@ "message": "추가 옵션" }, "enableContextMenuItem": { - "message": "문맥 매뉴 옵션 표시" + "message": "컨텍스트 메뉴 옵션 표시" }, "contextMenuItemDesc": { "message": "우클릭을 사용하여, 비밀번호 생성과 웹사이트 로그인 매칭에 접근하세요" @@ -1255,10 +1264,10 @@ "message": "이 비밀번호는 이 파일을 파일 내보내거나, 가져오는데 사용됩니다." }, "accountRestrictedOptionDescription": { - "message": "내보내기를 당신의 계정의 사용자이름과 마스터비밀번호로부터 파생된 계정 암호화 키를 사용하여 암호화하고, 현재의 Bitwarden 계정으로만 가져오도록 제한합니다." + "message": "당신 계정의 사용자 이름과 마스터 비밀번호를 통한 암호화 키로 내보내기 파일을 암호화 하고, 현재의 Bitwarden 계정으로만 가져올 수 있도록 제한합니다." }, "passwordProtectedOptionDescription": { - "message": "파일에 비밀번호를 설정하여 내보내기를 암호화하고, 어느 Bitwarden 계정으로든 그 비밀번호로 해독하여 가져오기 합니다." + "message": "파일에 비밀번호를 설정하여 내보내기 파일을 암호화하며, 그 비밀번호만 입력하면 어느 Bitwarden 계정으로든 가져올 수 있습니다." }, "exportTypeHeading": { "message": "내보내기 유형" @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "기능 사용할 수 없음" }, - "encryptionKeyMigrationRequired": { - "message": "암호화 키 마이그레이션이 필요합니다. 웹 볼트를 통해 로그인하여 암호화 키를 업데이트하세요." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "프리미엄 멤버십" @@ -1477,17 +1486,17 @@ "message": "Don't ask again on this device for 30 days" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "다른 방법 시도", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "복구 코드 사용" }, "insertU2f": { "message": "보안 키를 컴퓨터의 USB 포트에 삽입하고 버튼이 있는 경우 누르세요." }, "openInNewTab": { - "message": "Open in new tab" + "message": "새 탭에서 열기" }, "webAuthnAuthenticate": { "message": "WebAuthn 인증" @@ -1621,13 +1630,13 @@ "message": "양식 필드에 자동 완성 제안 표시" }, "showInlineMenuIdentitiesLabel": { - "message": "신원를 제안으로 표시" + "message": "신원을 제안으로 표시" }, "showInlineMenuCardsLabel": { "message": "카드를 제안으로 표시" }, "showInlineMenuOnIconSelectionLabel": { - "message": "아이콘을 선택할 때 제안을 표시" + "message": "아이콘 선택 시 제안 표시" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "로그인한 모든 계정에 적용" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "보안 코드" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "예)" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH 키" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "새 $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Bitwarden 잠금해제에 사용될 PIN 코드를 설정합니다. 이 애플리케이션에서 완전히 로그아웃할 경우 PIN 설정이 초기화됩니다." }, - "setYourPinCode1": { - "message": "PIN은 마스터 비밀번호 대신 Bitwarden 잠금해제에 사용됩니다. Bitwarden에서 완전히 로그아웃하면 PIN이 재설정됩니다." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN 코드가 필요합니다." @@ -2181,7 +2196,7 @@ "message": "브라우저 다시 시작 시 마스터 비밀번호로 잠금" }, "lockWithMasterPassOnRestart1": { - "message": "브라우저 다시 시작 시 마스터 비밀번호가 필요합니다" + "message": "브라우저 재시작 시 마스터 비밀번호 요구" }, "selectOneCollection": { "message": "반드시 하나 이상의 컬렉션을 선택해야 합니다." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "조직 정책으로 인해 개별 보관함으로 항목을 가져오는 것이 차단되었습니다." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "도메인", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "이 기능을 사용하려면 이메일 인증이 필요합니다. 웹 보관함에서 이메일을 인증할 수 있습니다." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "마스터 비밀번호 변경됨" }, @@ -3064,7 +3115,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "$EMAIL$ 계정과 관련된 개인 보관함 항목과 첨부 파일만 내보내집니다. 조직 보관함 항목은 포함되지 않습니다.", "placeholders": { "email": { "content": "$1", @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "노출된 마스터 비밀번호" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "향후 로그인을 원활하게 하기 위해 이 기기 기억하기" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "기기 승인이 필요합니다. 아래에서 승인 옵션을 선택하세요:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "관리자 인증 필요" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "조직의 SSO 식별자가 필요합니다" }, @@ -3614,20 +3784,12 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "활성화된 Send없음", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Send를 사용하여 암호화된 정보를 어느 사람과도 안전하게 공유합니다.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "플랫폼에 구애받지 않고 누구에게나 파일과 데이터를 안전하게 공유하세요. 전송하는 정보는 종단 간 암호화로 보호되어 외부 노출이 최소화됩니다.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4216,6 +4378,26 @@ "message": "일반적인 형식", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Bitwarden에서 자동 채우기 제안을 식별하는 방법은 URI 일치 감지입니다.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "브라우저 설정으로 이동하시겠습니까?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "인증 중" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/lt/messages.json b/apps/browser/src/_locales/lt/messages.json index 82952be642c..fa53a42a4b7 100644 --- a/apps/browser/src/_locales/lt/messages.json +++ b/apps/browser/src/_locales/lt/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Ieškoti saugykloje" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Keisti" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Paprašyti atnaujinti esamą prisijungimą" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funkcija neprieinama" }, - "encryptionKeyMigrationRequired": { - "message": "Reikalinga šifravimo rakto migracija. Prisijunkite per žiniatinklio saugyklą, kad atnaujintumėte šifravimo raktą." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium narystė" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Apsaugos kodas" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "pvz." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Naujas $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Nustatykite savo PIN kodą, kad atrakintumėte „Bitwarden“. Jūsų PIN nustatymai bus nustatyti iš naujo, jei kada nors visiškai atsijungsite nuo programos." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN kodas yra privalomas." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Organizacijos politika blokavo elementų importavimą į Jūsų individualią saugyklą." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domenai", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Turite patvirtinti savo el. paštą, kad galėtumėte naudotis šia funkcija. Savo el. pašto adresą galite patvirtinti žiniatinklio saugykloje." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Naujasis pagrindinis slaptažodis" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Įrenginio patvirtinimas reikalingas. Pasirink patvirtinimo būdą toliau:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Prašyti administratoriaus patvirtinimo" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organizacijos SSO identifikatorius yra reikalingas." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "Nėra aktyvų „Sends“", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Naudokite „Send“, kad saugiai bendrintumėte užšifruotą informaciją su bet kuriuo asmeniu.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/lv/messages.json b/apps/browser/src/_locales/lv/messages.json index 23e6d015853..89f502c5e49 100644 --- a/apps/browser/src/_locales/lv/messages.json +++ b/apps/browser/src/_locales/lv/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Meklēt glabātavā" }, + "resetSearch": { + "message": "Atiestatīt meklēšanu" + }, "edit": { "message": "Labot" }, @@ -1173,6 +1176,12 @@ "message": "Ak nē! Mēs nevarējā šo saglabāt. Jāmēģina pašrocīgi ievadīt informāciju.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Pēc savas paroles nomainīšanas būs nepieciešams pieteikties ar jauno paroli. Spēkā esošajās sesijās citās ierīcēs stundas laikā notiks atteikšanās." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Jānomaina sava galvenā'parole, lai pabeigtu konta atkopi." + }, "enableChangedPasswordNotification": { "message": "Vaicāt atjaunināt esošu pieteikšanās vienumu" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Iespēja nav pieejama" }, - "encryptionKeyMigrationRequired": { - "message": "Nepieciešama šifrēšanas atslēgas nomaiņa. Lūgums pieteikties tīmekļa glabātavā, lai atjauninātu savu šifrēšanas atslēgu." + "legacyEncryptionUnsupported": { + "message": "Mantota šifrēšana vairs netiek atbalstīta. Lūgums sazināties ar atbalstu, lai atkoptu savu kontu." }, "premiumMembership": { "message": "Premium dalība" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Drošības kods" }, + "cardNumber": { + "message": "kartes numurs" + }, "ex": { "message": "piem." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH atslēga" }, + "typeNote": { + "message": "Piezīme" + }, "newItemHeader": { "message": "Jauns/a $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Iestatīt PIN kodu Bitwarden atslēgšanai. PIN iestatījumi tiks atiestatīti pēc pilnīgas izrakstīšanās no lietotnes." }, - "setYourPinCode1": { - "message": "PIN būs izmantojams galvenās paroles vietā, lai atslēgtu Bitwarden. PIN tiks atiestatīts, ja kādreiz notiks pilnīga izrakstīšanās no Bitwarden." + "setPinCode": { + "message": "Šo PIN var izmantot, lai atslēgtu Bitwarden. PIN tiks atiestatīts pēc pilnīgas atteikšanās lietotnē." }, "pinRequired": { "message": "Ir nepieciešams PIN kods." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Apvienības nosacījums neļauj ievietot ārējos vienumus savā personīgajā glabātavā." }, + "restrictCardTypeImport": { + "message": "Nevar ievietot karšu vienumu veidus" + }, + "restrictCardTypeImportDesc": { + "message": "Pamatnostādne, ko ir iestatījusi viena vai vairākas apvienības, liedz karšu ievietošanu savās glabātavās." + }, "domainsTitle": { "message": "Domēna vārdi", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Mainīt" }, + "changePassword": { + "message": "Mainīt paroli", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Mainīt paroli - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Riskam pakļauta parole" + }, "atRiskPasswords": { "message": "Riskam pakļautās paroles" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Šīs vietnes parole ir pakļauta riskam. $ORGANIZATION$ pieprasīja, lai tā tiktu nomainīta.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ vēlas, lai šī parole tiktu nomainīta, jo tā ir pakļauta riskam. Jādodas uz sava konta iestatījumiem, lai nomainītu paroli.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Pārskatīt un mainīt vienu riskam pakļautu paroli" }, @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Sasniegts lielākais pieļaujamais piekļuves reižu skaits", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Ir nepieciešams apliecināt savu e-pasta adresi, lai būtu iespējams izmantot šo iespēju. To var izdarīt tīmekļa glabātavā." }, + "masterPasswordSuccessfullySet": { + "message": "Galvenā parole sekmīgi iestatīta" + }, "updatedMasterPassword": { "message": "Galvenā parole atjaunināta" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Pieprasījums nosūtīts" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "$EMAIL$ pieteikšanās pieprasījums apstiprināts $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Tu noraidīji pieteikšanās mēģinājumu no citas ierīces. Ja tas biji Tu, mēģini pieteikties no ierīces vēlreiz!" + }, + "device": { + "message": "Ierīce" + }, + "loginStatus": { + "message": "Pieteikšanās stāvoklis" + }, + "masterPasswordChanged": { + "message": "Galvenā parole saglabāta" + }, "exposedMasterPassword": { "message": "Noplūdusi galvenā parole" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Atcerēties šo ierīci, lai nākotnes pieteikšanos padarītu plūdenāku" }, + "manageDevices": { + "message": "Pārvaldīt ierīces" + }, + "currentSession": { + "message": "Pašreizējā sesija" + }, + "mobile": { + "message": "Tālrunis", + "description": "Mobile app" + }, + "extension": { + "message": "Paplašinājums", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Darbvirsma", + "description": "Desktop app" + }, + "webVault": { + "message": "Tīmekļa glabātava" + }, + "webApp": { + "message": "Tīmekļa lietotne" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Pieprasījums gaida uz apstrādi" + }, + "firstLogin": { + "message": "Pirmā pieteikšanās" + }, + "trusted": { + "message": "Uzticama" + }, + "needsApproval": { + "message": "Nepieciešams apstiprinājums" + }, + "devices": { + "message": "Ierīces" + }, + "accessAttemptBy": { + "message": "$EMAIL$ piekļuves mēģinājums", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Apstiprināt piekļuvi" + }, + "denyAccess": { + "message": "Noraidīt piekļuvi" + }, + "time": { + "message": "Laiks" + }, + "deviceType": { + "message": "Ierīces veids" + }, + "loginRequest": { + "message": "Pieteikšanās pieprasījums" + }, + "thisRequestIsNoLongerValid": { + "message": "Šis pieprasījums vairs nav derīgs." + }, + "loginRequestHasAlreadyExpired": { + "message": "Pieteikšanās pieprasījuma derīgums jau ir beidzies." + }, + "justNow": { + "message": "Tikko" + }, + "requestedXMinutesAgo": { + "message": "Pieprasīts pirms $MINUTES$ minūtēm", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Nepieciešams ierīces apstiprinājums. Zemāk jāatlasa apstiprinājuma iespēja:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Pieprasīt pārvaldītāja apstiprinājumu" }, + "unableToCompleteLogin": { + "message": "Nevar pabeigt pieteikšanos" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Nepieciešams pieteikties uzticamā ierīcē vai vaicāt pārvaldītājam, lai piešķir paroli." + }, "ssoIdentifierRequired": { "message": "Ir nepieciešams apvienības SSO identifikators." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Uzticēties lietotājam" }, - "sendsNoItemsTitle": { - "message": "Nav spēkā esošu Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Send ir izmantojams, lai ar ikvienu droši kopīgotu šifrētu informāciju.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Drošā veidā nosūti jūtīgu informāciju", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Izplatīti veidoli", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI atbilstības noteikšana ir veids, kā Bitwarden atpazīst automātiskās aizpildes ieteikumus.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regulārā izteiksme\" ir lietpratējiem paredzēta iespēja ar paaugstinātu piekļuves datu atklāšanas bīstamību.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Sākas ar' ir lietpratējiem paredzēta iespēja ar paaugstinātu piekļuves datu atklāšanas bīstamību.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Vairāk par atbilstības noteikšanu", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Papildu iespējas", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Pāriet uz pārlūka iestatījumiem?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Ievietot starpliktuvē $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Ievietot starpliktuvē $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Atslēgšanas PIN iestatīts" }, + "unlockWithBiometricSet": { + "message": "Atslēgt ar biometriju" + }, "authenticating": { "message": "Autentificē" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Nav atļaujas apskatīt šo lapu. Jāmēģina pieteikties ar citu kontu." + }, + "wasmNotSupported": { + "message": "WebAssembly šajā pārlūkā netiek atbalstīts vai nav iespējots. WebAssebly ir nepieciešams, lai izmantotu Bitwarden lietotni.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Rādīt vairāk" + }, + "showLess": { + "message": "Rādīt mazāk" } } diff --git a/apps/browser/src/_locales/ml/messages.json b/apps/browser/src/_locales/ml/messages.json index cb75a35bf7c..ca1bbc69297 100644 --- a/apps/browser/src/_locales/ml/messages.json +++ b/apps/browser/src/_locales/ml/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "വാൾട് തിരയുക" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "തിരുത്തുക" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "സവിശേഷത ലഭ്യമല്ല" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "പ്രീമിയം അംഗത്വം" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "സുരക്ഷാ കോഡ്" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ഉദാഹരണം." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Bitwarden അൺലോക്കുചെയ്യുന്നതിന് തങ്ങളുടെ പിൻ കോഡ് സജ്ജമാക്കുക. തങ്ങൾ എപ്പോഴെങ്കിലും അപ്ലിക്കേഷനിൽ നിന്ന് പൂർണ്ണമായി ലോഗ് ഔട്ട് ചെയ്യുകയാണെങ്കിൽ, പിൻ ക്രമീകരണങ്ങൾ പുനസജ്ജമാക്കും." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "പിൻ കോഡ് നിർബന്ധമാണ്." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/mr/messages.json b/apps/browser/src/_locales/mr/messages.json index c269bef17b6..70059b1552e 100644 --- a/apps/browser/src/_locales/mr/messages.json +++ b/apps/browser/src/_locales/mr/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "तिजोरीत शोधा" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/my/messages.json b/apps/browser/src/_locales/my/messages.json index 29223942fd6..d076ef01ef2 100644 --- a/apps/browser/src/_locales/my/messages.json +++ b/apps/browser/src/_locales/my/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/nb/messages.json b/apps/browser/src/_locales/nb/messages.json index 3f23ead23e6..9e617957dc8 100644 --- a/apps/browser/src/_locales/nb/messages.json +++ b/apps/browser/src/_locales/nb/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Søk i hvelvet" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Rediger" }, @@ -759,7 +762,7 @@ "message": "Hovedpassord" }, "masterPassImportant": { - "message": "Your master password cannot be recovered if you forget it!" + "message": "Hovedpassordet kan ikke gjenopprettes hvis du glemmer det!" }, "masterPassHintLabel": { "message": "Få et hint om hovedpassordet" @@ -814,7 +817,7 @@ "message": "En verifiseringskode er påkrevd." }, "webauthnCancelOrTimeout": { - "message": "The authentication was cancelled or took too long. Please try again." + "message": "Autentiseringen ble avbrutt eller tok for lang tid. Prøv igjen." }, "invalidVerificationCode": { "message": "Ugyldig bekreftelseskode" @@ -1097,7 +1100,7 @@ "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "oppdatert i Bitwarden.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Spør om å oppdatere eksisterende innlogginger" }, @@ -1246,25 +1255,25 @@ "message": "Filformat" }, "fileEncryptedExportWarningDesc": { - "message": "This file export will be password protected and require the file password to decrypt." + "message": "Denne fileksporten vil bli passordbeskyttet og vil kreve filpassordet ved dekryptering." }, "filePassword": { "message": "Filpassord" }, "exportPasswordDescription": { - "message": "This password will be used to export and import this file" + "message": "Dette passordet brukes for eksport og import av denne filen" }, "accountRestrictedOptionDescription": { - "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + "message": "Bruk kontokrypteringsnøkkelen, avledet fra ditt kontobrukernavn og hovedpassord, for å kryptere eksporten og hindre import til andre kontoer enn den aktuelle Bitwarden-kontoen." }, "passwordProtectedOptionDescription": { - "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + "message": "Sett et filpassord for kryptering av eksporten. Bruk passordet for å dekryptere og importere til en hvilken som helst Bitwarden-konto." }, "exportTypeHeading": { "message": "Eksporttype" }, "accountRestricted": { - "message": "Account restricted" + "message": "Kontoen er begrenset" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { "message": "«Filpassord» og «Bekreft filpassord» stemmer ikke overens." @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Egenskapen er utilgjengelig" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium-medlemskap" @@ -1615,7 +1624,7 @@ } }, "turnOffAutofill": { - "message": "Turn off autofill" + "message": "Skru av autoutfylling" }, "showInlineMenuLabel": { "message": "Vis autoutfyll-forslag i tekstbokser" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Sikkerhetskode" }, + "cardNumber": { + "message": "kortnummer" + }, "ex": { "message": "f.eks." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH-nøkkel" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "Ny $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Angi PIN-koden din for å låse opp Bitwarden. PIN-innstillingene tilbakestilles hvis du logger deg helt ut av programmet." }, - "setYourPinCode1": { - "message": "PIN-koden din vil bli brukt til å låse opp Bitwarden i stedet for hovedpassordet ditt. PIN-koden din tilbakestilles hvis du noen gang logger deg helt ut av Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN-kode er påkrevd." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "En organisasjonsretningslinje har blokkert import av gjenstander til ditt individuelle hvelv." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domener", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Endre" }, + "changePassword": { + "message": "Endre passord", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Endre passord - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Maks antall tilganger er nådd", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Du må bekrefte e-posten din for å bruke denne funksjonen. Du kan bekrefte e-postadressen din i netthvelvet." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Oppdaterte hovedpassordet" }, @@ -3025,7 +3076,7 @@ "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." }, "organizationName": { - "message": "Organization name" + "message": "Organisasjonens navn" }, "keyConnectorDomain": { "message": "Key Connector domain" @@ -3055,7 +3106,7 @@ "message": "Eksporterer personlig hvelv" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Kun de individuelle hvelvgjenstandene som er assosiert med $EMAIL$ vil bli eksportert. Organisasjonshvelv-gjenstander vil ikke bli inkludert. Kun hvelvgjenstandsinfo vil bli eksportert og vil ikke inkludere assosierte vedlegg.", "placeholders": { "email": { "content": "$1", @@ -3073,7 +3124,7 @@ } }, "exportingOrganizationVaultTitle": { - "message": "Exporting organization vault" + "message": "Eksporterer organisasjonshvelv" }, "exportingOrganizationVaultDesc": { "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Forespørsel sendt" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Enhet" + }, + "loginStatus": { + "message": "Innloggingsstatus" + }, + "masterPasswordChanged": { + "message": "Hovedpassordet er endret" + }, "exposedMasterPassword": { "message": "Eksponert hovedpassord" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Gjeldende økt" + }, + "mobile": { + "message": "Mobil", + "description": "Mobile app" + }, + "extension": { + "message": "Utvidelse", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Skrivebord", + "description": "Desktop app" + }, + "webVault": { + "message": "Netthvelv" + }, + "webApp": { + "message": "Nettapp" + }, + "cli": { + "message": "Ledetekst" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Betrodd" + }, + "needsApproval": { + "message": "Trenger godkjenning" + }, + "devices": { + "message": "Enheter" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Bekreft tilgang" + }, + "denyAccess": { + "message": "Nekt tilgang" + }, + "time": { + "message": "Tid" + }, + "deviceType": { + "message": "Enhetstype" + }, + "loginRequest": { + "message": "Innloggingsforespørsel" + }, + "thisRequestIsNoLongerValid": { + "message": "Denne forespørselen er ikke lenger gyldig." + }, + "loginRequestHasAlreadyExpired": { + "message": "Innloggingsforespørselen har allerede utløpt." + }, + "justNow": { + "message": "Akkurat nå" + }, + "requestedXMinutesAgo": { + "message": "Forespurt for $MINUTES$ minutter siden", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,8 +3693,14 @@ "requestAdminApproval": { "message": "Be om administratorgodkjennelse" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { - "message": "Organization SSO identifier is required." + "message": "Organisasjonsidentifikator er påkrevd." }, "creatingAccountOn": { "message": "Oppretter en konto på" @@ -3558,7 +3728,7 @@ "description": "European Union" }, "accessDenied": { - "message": "Access denied. You do not have permission to view this page." + "message": "Ingen tilgang. Du har ikke tillatelse til å se denne siden." }, "general": { "message": "Generelt" @@ -3567,10 +3737,10 @@ "message": "Vis" }, "accountSuccessfullyCreated": { - "message": "Account successfully created!" + "message": "Kontoen ble vellykket opprettet!" }, "adminApprovalRequested": { - "message": "Admin approval requested" + "message": "Admin-godkjenning forespurt" }, "adminApprovalRequestSentToAdmins": { "message": "Forespørselen din har blitt sendt til administratoren din." @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Stol på brukler" }, - "sendsNoItemsTitle": { - "message": "Ingen aktive Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Bruk Send til å dele kryptert informasjon med noen.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3658,7 +3820,7 @@ } }, "inputForbiddenCharacters": { - "message": "The following characters are not allowed: $CHARACTERS$", + "message": "Følgende tegn er ikke tillatt: $CHARACTERS$", "placeholders": { "characters": { "content": "$1", @@ -3865,7 +4027,7 @@ "message": "Importeringsfeil" }, "importErrorDesc": { - "message": "There was a problem with the data you tried to import. Please resolve the errors listed below in your source file and try again." + "message": "Det oppstod et problem med dataene du prøvde å importere. Vennligst løs feilene listet nedenfor i kildefilen og prøv på nytt." }, "resolveTheErrorsBelowAndTryAgain": { "message": "Fiks feilene nedenfor og prøv igjen." @@ -3925,7 +4087,7 @@ "message": "Total" }, "importWarning": { - "message": "You are importing data to $ORGANIZATION$. Your data may be shared with members of this organization. Do you want to proceed?", + "message": "Du importerer data til $ORGANIZATION$. Dataene kan deles med medlemmer av denne organisasjonen. Vil du fortsette?", "placeholders": { "organization": { "content": "$1", @@ -3952,7 +4114,7 @@ "message": "Ingenting ble importert." }, "importEncKeyError": { - "message": "Error decrypting the exported file. Your encryption key does not match the encryption key used export the data." + "message": "Feil under dekryptering av den eksporterte filen. Krypteringsnøkkelen samsvarte ikke med krypteringsnøkkelen som ble brukt eksport av data." }, "invalidFilePassword": { "message": "Ugyldig filpassord, vennligst bruk passordet du skrev inn da du opprettet eksportfilen." @@ -3970,7 +4132,7 @@ "message": "Velg en samling" }, "importTargetHint": { - "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "message": "Velg dette alternativet hvis du vil flytte den importerte filens innhold til en $DESTINATION$", "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", "placeholders": { "destination": { @@ -4032,7 +4194,7 @@ "message": "Passkoden vil ikke bli kopiert" }, "passkeyNotCopiedAlert": { - "message": "The passkey will not be copied to the cloned item. Do you want to continue cloning this item?" + "message": "Passnøkkelen kopieres ikke til det klonede elementet. Vil du fortsette kloningen av denne gjenstanden?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "message": "Verification required by the initiating site. This feature is not yet implemented for accounts without master password." @@ -4216,6 +4378,26 @@ "message": "Vanlige formater", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Avanserte alternativer", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Vil du fortsette til nettleserinnstillingene?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Kopier $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4547,31 +4729,31 @@ } }, "downloadBitwarden": { - "message": "Download Bitwarden" + "message": "Last ned Bitwarden" }, "downloadBitwardenOnAllDevices": { "message": "Download Bitwarden on all devices" }, "getTheMobileApp": { - "message": "Get the mobile app" + "message": "Skaff deg mobilappen" }, "getTheMobileAppDesc": { "message": "Access your passwords on the go with the Bitwarden mobile app." }, "getTheDesktopApp": { - "message": "Get the desktop app" + "message": "Skaff deg skrivebordsappen" }, "getTheDesktopAppDesc": { "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Last ned fra bitwarden.com nå" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "Skaff den på Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Last ned fra App Store" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Are you sure you want to permanently delete this attachment?" @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Autentiserer" }, @@ -5293,7 +5478,7 @@ "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 varsel" }, "emptyVaultNudgeTitle": { "message": "Importer eksisterende passord" @@ -5320,12 +5505,12 @@ "message": "Spar tid med auto-utfylling" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Inkluder en", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "Nettsted", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ne/messages.json b/apps/browser/src/_locales/ne/messages.json index 29223942fd6..d076ef01ef2 100644 --- a/apps/browser/src/_locales/ne/messages.json +++ b/apps/browser/src/_locales/ne/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/nl/messages.json b/apps/browser/src/_locales/nl/messages.json index b98814df45e..4b38d8491aa 100644 --- a/apps/browser/src/_locales/nl/messages.json +++ b/apps/browser/src/_locales/nl/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Kluis doorzoeken" }, + "resetSearch": { + "message": "Zoekopdracht resetten" + }, "edit": { "message": "Bewerken" }, @@ -1173,6 +1176,12 @@ "message": "Oh nee! We konden dit niet opslaan. Probeer de gegevens handmatig in te voeren.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Na het wijzigen van je wachtwoord moet je inloggen met je nieuwe wachtwoord. Actieve sessies op andere apparaten worden binnen één uur uitgelogd." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Wijzig je hoofdwachtwoord om je account te herstellen." + }, "enableChangedPasswordNotification": { "message": "Vraag om bijwerken bestaande login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Functionaliteit niet beschikbaar" }, - "encryptionKeyMigrationRequired": { - "message": "Migratie van de encryptiesleutel vereist. Login via de website om je sleutel te bij te werken." + "legacyEncryptionUnsupported": { + "message": "Oude versleuteling wordt niet langer ondersteund. Neem contact op voor ondersteuning om je account te herstellen." }, "premiumMembership": { "message": "Premium-abonnement" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Beveiligingscode" }, + "cardNumber": { + "message": "kaartnummer" + }, "ex": { "message": "bijv." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH-sleutel" }, + "typeNote": { + "message": "Notitie" + }, "newItemHeader": { "message": "Nieuwe $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Stel je PIN-code in voor het ontgrendelen van Bitwarden. Je PIN-code wordt opnieuw ingesteld als je je ooit volledig afmeldt bij de applicatie." }, - "setYourPinCode1": { - "message": "Je pincode wordt gebruikt om Bitwarden te ontgrendelen in plaats van je hoofdwachtwoord. Je pincode wordt opnieuw ingesteld als je ooit volledig uitlogt op Bitwarden." + "setPinCode": { + "message": "Je kunt deze PIN gebruiken voor het ontgrendelen van Bitwarden. Je PIN wordt opnieuw ingesteld als je je ooit volledig afmeldt bij de applicatie." }, "pinRequired": { "message": "PIN-code is vereist." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Organisatiebeleid heeft het importeren van items in je persoonlijke kluis geblokkeerd." }, + "restrictCardTypeImport": { + "message": "Kan kaart item types niet importeren" + }, + "restrictCardTypeImportDesc": { + "message": "Een beleid ingesteld door 1 of meer organisaties voorkomt dat je kaarten naar je kluizen kunt importeren." + }, "domainsTitle": { "message": "Domeinen", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Wijzigen" }, + "changePassword": { + "message": "Wachtwoord wijzigen", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Wachtwoord wijzigen - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Risicovolle wachtwoorden" + }, "atRiskPasswords": { "message": "Risicovolle wachtwoorden" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Je wachtwoord voor deze website is een risico. $ORGANIZATION$ vraagt je deze te veranderen.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wil dat je dit wachtwoord verandert omdat het in gevaar is. Navigeer naar je accountinstellingen om het wachtwoord te wijzigen.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Eén risicovol wachtwoord beoordelen en wijzigen" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Je moet je e-mailadres verifiëren om deze functie te gebruiken. Je kunt je e-mailadres verifiëren in de kluis." }, + "masterPasswordSuccessfullySet": { + "message": "Hoofdwachtwoord succesvol ingesteld" + }, "updatedMasterPassword": { "message": "Hoofdwachtwoord bijgewerkt" }, @@ -3022,13 +3073,13 @@ "message": "Geen unieke id gevonden." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Voor leden van de volgende organisatie is een hoofdwachtwoord niet langer nodig. Bevestig het domein hieronder met de beheerder van je organisatie." }, "organizationName": { - "message": "Organization name" + "message": "Organisatienaam" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Key Connector domein" }, "leaveOrganization": { "message": "Organisatie verlaten" @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Verzoek verzonden" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Inloggen voor $EMAIL$ goedgekeurd op $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Je hebt een inlogpoging vanaf een ander apparaat geweigerd. Als je dit toch echt zelf was, probeer dan opnieuw in te loggen met het apparaat." + }, + "device": { + "message": "Apparaat" + }, + "loginStatus": { + "message": "Loginstatus" + }, + "masterPasswordChanged": { + "message": "Hoofdwachtwoord gewijzigd" + }, "exposedMasterPassword": { "message": "Gelekt hoofdwachtwoord" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Onthoud dit apparaat om in het vervolg naadloos in te loggen" }, + "manageDevices": { + "message": "Apparaten beheren" + }, + "currentSession": { + "message": "Huidige sessie" + }, + "mobile": { + "message": "Mobiel", + "description": "Mobile app" + }, + "extension": { + "message": "Extensie", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Webkluis" + }, + "webApp": { + "message": "Web-app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Verzoek in behandeling" + }, + "firstLogin": { + "message": "Eerst inloggen" + }, + "trusted": { + "message": "Vertrouwd" + }, + "needsApproval": { + "message": "Heeft goedkeuring nodig" + }, + "devices": { + "message": "Apparaten" + }, + "accessAttemptBy": { + "message": "Inlogpoging door $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Toegang bevestigen" + }, + "denyAccess": { + "message": "Toegang weigeren" + }, + "time": { + "message": "Tijd" + }, + "deviceType": { + "message": "Apparaattype" + }, + "loginRequest": { + "message": "Log-inverzoek" + }, + "thisRequestIsNoLongerValid": { + "message": "Dit verzoek is niet langer geldig." + }, + "loginRequestHasAlreadyExpired": { + "message": "Inlogverzoek is al verlopen." + }, + "justNow": { + "message": "Zojuist" + }, + "requestedXMinutesAgo": { + "message": "$MINUTES$ minuten geleden aangevraagd", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Apparaattoestemming vereist. Kies een goedkeuringsoptie hieronder:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Goedkeuring van beheerder vragen" }, + "unableToCompleteLogin": { + "message": "Kan login niet voltooien" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Je moet inloggen op een vertrouwd apparaat of je beheerder vragen om je een wachtwoord toe te wijzen." + }, "ssoIdentifierRequired": { "message": "Organisatie SSO-identificatie vereist." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Gebruiker vertrouwen" }, - "sendsNoItemsTitle": { - "message": "Geen actieve Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Gebruik Send voor het veilig delen van versleutelde informatie met wie dan ook.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Gevoelige informatie veilig versturen", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Veelvoorkomende formaten", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI-matche-detectie is hoe Bitwarden invulsuggesties herkent.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Reguliere expressie\" is een geavanceerde optie met een verhoogd risico op het blootstellen van inloggegevens.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Begint met\" is een geavanceerde optie met een verhoogd risico op het blootstellen van inloggegevens.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Lees meer over overeenkomstdetectie", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Geavanceerde opties", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Doorgaan naar browserinstellingen?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "$FIELD$, $VALUE$ kopiëren", + "copyFieldCipherName": { + "message": "$FIELD$, $CIPHERNAME$ kopiëren", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4571,7 +4753,7 @@ "message": "Download op Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Te downloaden in de App Store" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Weet je zeker dat je deze bijlage definitief wilt verwijderen?" @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "PIN-code ontgrendelen instellen" }, + "unlockWithBiometricSet": { + "message": "Met biometrische set ontgrendelen" + }, "authenticating": { "message": "Aan het inloggen" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Je hebt geen rechten om deze pagina te bekijken. Probeer in te loggen met een ander account." + }, + "wasmNotSupported": { + "message": "WebAssembly wordt niet ondersteund in je browser of is niet ingeschakeld. WebAssembly is vereist om de Bitwarden-app te gebruiken.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Meer weergeven" + }, + "showLess": { + "message": "Minder weergeven" } } diff --git a/apps/browser/src/_locales/nn/messages.json b/apps/browser/src/_locales/nn/messages.json index 29223942fd6..d076ef01ef2 100644 --- a/apps/browser/src/_locales/nn/messages.json +++ b/apps/browser/src/_locales/nn/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/or/messages.json b/apps/browser/src/_locales/or/messages.json index 29223942fd6..d076ef01ef2 100644 --- a/apps/browser/src/_locales/or/messages.json +++ b/apps/browser/src/_locales/or/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/pl/messages.json b/apps/browser/src/_locales/pl/messages.json index 80119b2be25..6e1029c613d 100644 --- a/apps/browser/src/_locales/pl/messages.json +++ b/apps/browser/src/_locales/pl/messages.json @@ -3,18 +3,18 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Logo Bitwarden" }, "extName": { - "message": "Menedżer Haseł Bitwarden", + "message": "Menedżer haseł Bitwarden", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "W domu, w pracy, lub w ruchu, Bitwarden z łatwością zabezpiecza Twoje hasła, passkeys i poufne informacje", + "message": "W domu, w pracy lub w podróży Bitwarden zabezpiecza wszystkie hasła, klucze dostępu i poufne informacje.", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { - "message": "Zaloguj się lub utwórz nowe konto, aby uzyskać dostęp do Twojego bezpiecznego sejfu." + "message": "Zaloguj się lub utwórz nowe konto, aby uzyskać dostęp do bezpiecznego sejfu." }, "inviteAccepted": { "message": "Zaproszenie zostało zaakceptowane" @@ -23,13 +23,13 @@ "message": "Utwórz konto" }, "newToBitwarden": { - "message": "Nowy użytkownik Bitwarden?" + "message": "Nowy w Bitwarden?" }, "logInWithPasskey": { - "message": "Zaloguj się używając klucza dostępu" + "message": "Logowanie kluczem dostępu" }, "useSingleSignOn": { - "message": "Użyj jednokrotnego logowania" + "message": "Użyj logowania jednokrotnego" }, "welcomeBack": { "message": "Witaj ponownie" @@ -38,7 +38,7 @@ "message": "Ustaw silne hasło" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Ukończ tworzenie konta poprzez ustawienie hasła" + "message": "Zakończ tworzenie konta poprzez ustawienie hasła" }, "enterpriseSingleSignOn": { "message": "Logowanie jednokrotne" @@ -65,7 +65,7 @@ "message": "Podpowiedź do hasła głównego może pomóc Ci przypomnieć hasło, jeśli je zapomnisz." }, "masterPassHintText": { - "message": "Jeśli zapomnisz hasła, podpowiedź hasła może zostać wysłana na Twój adres e-mail. $CURRENT$ z $MAXIMUM$ znaków.", + "message": "Podpowiedź do hasła zostanie wysłana na adres e-mail, jeśli je zapomnisz. Liczba znaków: $CURRENT$ / $MAXIMUM$.", "placeholders": { "current": { "content": "$1", @@ -84,7 +84,7 @@ "message": "Podpowiedź do hasła głównego (opcjonalnie)" }, "passwordStrengthScore": { - "message": "Siła hasła: $SCORE$", + "message": "Siła hasła wynosi $SCORE$", "placeholders": { "score": { "content": "$1", @@ -96,7 +96,7 @@ "message": "Dołącz do organizacji" }, "joinOrganizationName": { - "message": "Dołącz do $ORGANIZATIONNAME$", + "message": "Dołącz do organizacji $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -105,7 +105,7 @@ } }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Zakończ dołączanie do tej organizacji przez ustawienie hasła głównego." + "message": "Zakończ dołączanie do organizacji poprzez ustawienie hasła głównego." }, "tab": { "message": "Karta" @@ -132,7 +132,7 @@ "message": "Kopiuj hasło" }, "copyPassphrase": { - "message": "Skopiuj hasło wyrazowe" + "message": "Kopiuj hasło wyrazowe" }, "copyNote": { "message": "Kopiuj notatkę" @@ -159,19 +159,19 @@ "message": "Kopiuj numer PESEL" }, "copyPassportNumber": { - "message": "Skopiuj numer paszportu" + "message": "Kopiuj numer paszportu" }, "copyLicenseNumber": { - "message": "Kopiuj numer licencji" + "message": "Kopiuj numer prawa jazdy" }, "copyPrivateKey": { - "message": "Skopiuj klucz prywatny" + "message": "Kopiuj klucz prywatny" }, "copyPublicKey": { - "message": "Skopiuj klucz publiczny" + "message": "Kopiuj klucz publiczny" }, "copyFingerprint": { - "message": "Skopiuj odcisk palca" + "message": "Kopiuj odcisk klucza" }, "copyCustomField": { "message": "Kopiuj $FIELD$", @@ -193,26 +193,26 @@ "description": "Copy to clipboard" }, "fill": { - "message": "Wypełnij", + "message": "Uzupełnij", "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { "message": "Autouzupełnianie" }, "autoFillLogin": { - "message": "Autouzupełnianie logowania" + "message": "Uzupełnij dane logowania" }, "autoFillCard": { - "message": "Autouzupełnianie karty" + "message": "Uzupełnij kartę" }, "autoFillIdentity": { - "message": "Autouzupełnianie tożsamości" + "message": "Uzupełnij tożsamość" }, "fillVerificationCode": { - "message": "Wypełnij kod weryfikacyjny" + "message": "Uzupełnij kod weryfikacyjny" }, "fillVerificationCodeAria": { - "message": "Wypełnij kod weryfikacyjny", + "message": "Uzupełnij kod weryfikacyjny", "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { @@ -246,7 +246,7 @@ "message": "Zaloguj się do sejfu" }, "autoFillInfo": { - "message": "Brak danych logowania do użycia przez autouzupełnienie na obecnej karcie przeglądarki." + "message": "Brak dostępnych danych logowania dla obecnej karty przeglądarki." }, "addLogin": { "message": "Dodaj dane logowania" @@ -258,13 +258,13 @@ "message": "Adres e-mail konta" }, "requestHint": { - "message": "Poproś o podpowiedź" + "message": "Uzyskaj podpowiedź" }, "requestPasswordHint": { - "message": "Poproś o podpowiedź do hasła" + "message": "Uzyskaj podpowiedź do hasła" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Wprowadź adres e-mail swojego konta, a podpowiedź hasła zostanie wysłana do Ciebie" + "message": "Wpisz adres e-mail konta. Podpowiedź do hasła zostanie wysłana na adres e-mail" }, "getMasterPasswordHint": { "message": "Uzyskaj podpowiedź do hasła głównego" @@ -291,32 +291,32 @@ "message": "Zmień hasło główne" }, "continueToWebApp": { - "message": "Kontynuować do aplikacji internetowej?" + "message": "Przejść do aplikacji internetowej?" }, "continueToWebAppDesc": { - "message": "Odkryj więcej funkcji swojego konta Bitwarden w aplikacji internetowej." + "message": "Odkryj więcej funkcji konta Bitwarden w aplikacji internetowej." }, "continueToHelpCenter": { - "message": "Kontynuować do centrum pomocy?" + "message": "Przejść do centrum pomocy?" }, "continueToHelpCenterDesc": { "message": "Dowiedz się więcej o tym, jak korzystać z centrum pomocy Bitwarden." }, "continueToBrowserExtensionStore": { - "message": "Kontynuować do sklepu z rozszerzeniami przeglądarki?" + "message": "Przejść do sklepu z rozszerzeniami przeglądarki?" }, "continueToBrowserExtensionStoreDesc": { - "message": "Pomóż innym dowiedzieć się, czy Bitwarden jest dla nich odpowiedni. Odwiedź swój sklep z rozszerzeniami do przeglądarki i zostaw ocenę." + "message": "Pomóż innym sprawdzić, czy Bitwarden jest dla nich odpowiedni. Odwiedź sklep z rozszerzeniami przeglądarki i zostaw ocenę." }, "changeMasterPasswordOnWebConfirmation": { - "message": "Możesz zmienić swoje hasło główne w aplikacji internetowej Bitwarden." + "message": "Możesz zmienić hasło główne w aplikacji internetowej Bitwarden." }, "fingerprintPhrase": { "message": "Unikalny identyfikator konta", "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": "Unikalny identyfikator Twojego konta", + "message": "Twój unikalny identyfikator konta", "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": { @@ -335,34 +335,34 @@ "message": "Więcej od Bitwarden" }, "continueToBitwardenDotCom": { - "message": "Kontynuować do bitwarden.com?" + "message": "Przejść do bitwarden.com?" }, "bitwardenForBusiness": { - "message": "Bitwarden dla biznesu" + "message": "Bitwarden dla firm" }, "bitwardenAuthenticator": { "message": "Bitwarden Authenticator" }, "continueToAuthenticatorPageDesc": { - "message": "Bitwarden Authenticator pozwala na przechowywanie kluczy uwierzytelniających i generowanie kodów TOTP do dwuetapowego procesu weryfikacji. Dowiedz się więcej na stronie bitwarden.com" + "message": "Bitwarden Authenticator umożliwia przechowywanie kluczy uwierzytelniających i generowanie kodów TOTP dla weryfikacji dwustopniowej. Dowiedz się wiecej na bitwarden.com" }, "bitwardenSecretsManager": { - "message": "Menedżer sekretów Bitwarden" + "message": "Bitwarden Secrets Manager" }, "continueToSecretsManagerPageDesc": { - "message": "Bezpiecznie przechowuj, zarządzaj i udostępniaj sekrety programistów z Menedżerem sekretów Bitwarden. Dowiedz się więcej na stronie bitwarden.com." + "message": "Bezpiecznie przechowuj, zarządzaj i udostępniaj sekrety deweloperów za pomocą usługi Bitwarden Secrets Manager. Dowiedz się więcej na stronie bitwarden.com." }, "passwordlessDotDev": { "message": "Passwordless.dev" }, "continueToPasswordlessDotDevPageDesc": { - "message": "Twórz przyjemne i bezpieczne doświadczenia z logowaniem wolne od tradycyjnych haseł za pomocą Passwordless.dev. Dowiedz się więcej na stronie bitwarden.com." + "message": "Loguj się szybko i bezpiecznie bez tradycyjnych haseł za pomocą usługi Passwordless.dev. Dowiedz się więcej na stronie bitwarden.com." }, "freeBitwardenFamilies": { "message": "Darmowy plan rodzinny" }, "freeBitwardenFamiliesPageDesc": { - "message": "Masz prawo do bezpłatengo planu rodzinnego Bitwarden. Zrealizuj tę ofertę już dziś w aplikacji internetowej." + "message": "Kwalifikujesz się do bezpłatnego planu rodzinnego. Skorzystaj z oferty już dziś w aplikacji internetowej." }, "version": { "message": "Wersja" @@ -398,16 +398,16 @@ "message": "Nazwa folderu" }, "folderHintText": { - "message": "Zagnieżdżaj foldery dodając nazwę folderu nadrzędnego, a następnie “/”. Przykład: Społeczne/Fora" + "message": "Utwórz podfolder, dodając nazwę folderu nadrzędnego przed znakiem „/”. Przykład: Social/Forums" }, "noFoldersAdded": { "message": "Nie dodano folderów" }, "createFoldersToOrganize": { - "message": "Twórz foldery, aby zorganizować elementy swojego sejfu" + "message": "Twórz foldery, aby zorganizować elementy sejfu" }, "deleteFolderPermanently": { - "message": "Czy na pewno chcesz trwale usunąć ten folder?" + "message": "Czy na pewno chcesz usunąć trwale folder?" }, "deleteFolder": { "message": "Usuń folder" @@ -425,7 +425,7 @@ "message": "Centrum pomocy Bitwarden" }, "communityForums": { - "message": "Przeglądaj fora społeczności Bitwarden" + "message": "Odwiedź forum społeczności Bitwarden" }, "contactSupport": { "message": "Skontaktuj się z pomocą techniczną Bitwarden" @@ -447,7 +447,7 @@ "description": "Short for 'credential generator'." }, "passGenInfo": { - "message": "Automatycznie wygeneruj silne, unikatowe hasła dla swoich loginów." + "message": "Automatycznie generuj silne i unikalne hasła." }, "bitWebVaultApp": { "message": "Aplikacja internetowa Bitwarden" @@ -474,7 +474,7 @@ "message": "Nazwa użytkownika została wygenerowana" }, "emailGenerated": { - "message": "E-mail został wygenerowany" + "message": "Adres e-mail został wygenerowany" }, "regeneratePassword": { "message": "Wygeneruj ponownie hasło" @@ -490,7 +490,7 @@ "description": "Card header for password generator include block" }, "uppercaseDescription": { - "message": "Uwzględnij wielkie litery", + "message": "Wielkie litery", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -498,7 +498,7 @@ "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Uwzględnij małe litery", + "message": "Małe litery", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -506,7 +506,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Uwzględnij cyfry", + "message": "Cyfry", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -514,7 +514,7 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Uwzględnij znaki specjalne", + "message": "Znaki specjalne", "description": "Full description for the password generator special characters checkbox" }, "numWords": { @@ -531,30 +531,33 @@ "message": "Uwzględnij cyfry" }, "minNumbers": { - "message": "Minimalna liczba cyfr" + "message": "Min. liczba cyfr" }, "minSpecial": { - "message": "Minimalna liczba znaków specjalnych" + "message": "Min. liczba znaków specjalnych" }, "avoidAmbiguous": { "message": "Unikaj niejednoznacznych znaków", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Wymagania polityki przedsiębiorstwa zostały użyte do ustawienia opcji generatora.", + "message": "Zasady organizacji zostały zastosowane do opcji generatora.", "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Szukaj w sejfie" }, + "resetSearch": { + "message": "Zresetuj wyszukiwanie" + }, "edit": { "message": "Edytuj" }, "view": { - "message": "Zobacz" + "message": "Pokaż" }, "noItemsInList": { - "message": "Brak elementów." + "message": "Brak elementów do wyświetlenia." }, "itemInformation": { "message": "Informacje o elemencie" @@ -566,22 +569,22 @@ "message": "Hasło" }, "totp": { - "message": "Sekret uwierzytelniania" + "message": "Klucz uwierzytelniający" }, "passphrase": { "message": "Hasło wyrazowe" }, "favorite": { - "message": "Ulubione" + "message": "Dodaj do ulubionych" }, "unfavorite": { "message": "Usuń z ulubionych" }, "itemAddedToFavorites": { - "message": "Element dodany do ulubionych" + "message": "Element został dodany do ulubionych" }, "itemRemovedFromFavorites": { - "message": "Element usunięty z ulubionych" + "message": "Element został usunięty z ulubionych" }, "notes": { "message": "Notatki" @@ -602,16 +605,16 @@ "message": "Usuń element" }, "viewItem": { - "message": "Zobacz element" + "message": "Pokaż element" }, "launch": { "message": "Uruchom" }, "launchWebsite": { - "message": "Otwórz stronę" + "message": "Uruchom stronę internetową" }, "launchWebsiteName": { - "message": "Otwórz stronę internetową $ITEMNAME$", + "message": "Uruchom stronę internetową $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -620,10 +623,10 @@ } }, "website": { - "message": "Strona" + "message": "Strona internetowa" }, "toggleVisibility": { - "message": "Pokaż / Ukryj" + "message": "Pokaż / ukryj" }, "manage": { "message": "Zarządzaj" @@ -635,19 +638,19 @@ "message": "Opcje odblokowania" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Ustaw metodę odblokowania, aby zmienić czas blokowania sejfu." + "message": "Ustaw metodę odblokowania, aby zmienić sposób blokowania sejfu." }, "unlockMethodNeeded": { - "message": "Ustaw metodę odblokowania w Ustawieniach" + "message": "Ustaw metodę odblokowania w ustawieniach" }, "sessionTimeoutHeader": { - "message": "Limit czasu sesji" + "message": "Blokada aplikacji" }, "vaultTimeoutHeader": { "message": "Blokowanie sejfu" }, "otherOptions": { - "message": "Pozostałe opcje" + "message": "Inne opcje" }, "rateExtension": { "message": "Oceń rozszerzenie" @@ -656,10 +659,10 @@ "message": "Przeglądarka nie obsługuje łatwego kopiowania schowka. Skopiuj element ręcznie." }, "verifyYourIdentity": { - "message": "Potwierdź swoją tożsamość" + "message": "Zweryfikuj tożsamość" }, "weDontRecognizeThisDevice": { - "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na Twój e-mail, aby zweryfikować tożsamość." + "message": "Nie rozpoznajemy tego urządzenia. Wpisz kod wysłany na adres e-mail, aby zweryfikować swoją tożsamość." }, "continueLoggingIn": { "message": "Kontynuuj logowanie" @@ -668,10 +671,10 @@ "message": "Sejf jest zablokowany. Zweryfikuj swoją tożsamość, aby kontynuować." }, "yourVaultIsLockedV2": { - "message": "Twój sejf jest zablokowany" + "message": "Sejf jest zablokowany" }, "yourAccountIsLocked": { - "message": "Twoje konto jest zablokowane" + "message": "Konto jest zablokowane" }, "or": { "message": "lub" @@ -699,13 +702,13 @@ "message": "Blokowanie sejfu" }, "vaultTimeout1": { - "message": "Limit czasu" + "message": "Blokada aplikacji" }, "lockNow": { "message": "Zablokuj" }, "lockAll": { - "message": "Zablokuj wszystkie" + "message": "Zablokuj wszystko" }, "immediately": { "message": "Natychmiast" @@ -741,10 +744,10 @@ "message": "4 godziny" }, "onLocked": { - "message": "Po zablokowaniu komputera" + "message": "Po zablokowaniu urządzenia" }, "onRestart": { - "message": "Po restarcie przeglądarki" + "message": "Po uruchomieniu przeglądarki" }, "never": { "message": "Nigdy" @@ -759,7 +762,7 @@ "message": "Hasło główne" }, "masterPassImportant": { - "message": "Twoje hasło główne nie może zostać odzyskane, jeśli je zapomnisz!" + "message": "Zapomniane hasło główne nie może zostać odzyskane!" }, "masterPassHintLabel": { "message": "Podpowiedź do hasła głównego" @@ -780,7 +783,7 @@ "message": "Wymagane jest ponowne wpisanie hasła głównego." }, "masterPasswordMinlength": { - "message": "Hasło główne musi zawierać co najmniej $VALUE$ znaki(-ów).", + "message": "Hasło główne musi składać się z co najmniej $VALUE$ znaków.", "description": "The Master Password must be at least a specific number of characters long.", "placeholders": { "value": { @@ -796,19 +799,19 @@ "message": "Konto zostało utworzone! Teraz możesz się zalogować." }, "newAccountCreated2": { - "message": "Twoje nowe konto zostało utworzone!" + "message": "Nowe konto zostało utworzone!" }, "youHaveBeenLoggedIn": { - "message": "Zalogowano Cię!" + "message": "Zalogowano!" }, "youSuccessfullyLoggedIn": { - "message": "Zalogowałeś się pomyślnie" + "message": "Zalogowano" }, "youMayCloseThisWindow": { "message": "Możesz zamknąć to okno" }, "masterPassSent": { - "message": "Wysłaliśmy Tobie wiadomość e-mail z podpowiedzią do hasła głównego." + "message": "Wysłaliśmy wiadomość z podpowiedzią do hasła głównego." }, "verificationCodeRequired": { "message": "Kod weryfikacyjny jest wymagany." @@ -830,28 +833,28 @@ } }, "autofillError": { - "message": "Nie można zastosować autouzupełnienia na tej stronie. Skopiuj i wklej informacje ręcznie." + "message": "Nie można uzupełnić elementu na tej stronie internetowej. Skopiuj i wklej informacje ręcznie." }, "totpCaptureError": { - "message": "Nie można zeskanować kodu QR z bieżącej strony" + "message": "Nie można zeskanować kodu QR z obecnej strony" }, "totpCaptureSuccess": { "message": "Klucz uwierzytelniający został dodany" }, "totpCapture": { - "message": "Zeskanuj kod QR z bieżącej strony" + "message": "Zeskanuj kod QR z obecnej strony" }, "totpHelperTitle": { - "message": "Spraw, aby dwuetapowa weryfikacja była bezproblemowa" + "message": "Bezproblemowa weryfikacja dwustopniowa" }, "totpHelper": { - "message": "Bitwarden może przechowywać i wypełniać kody weryfikacyjne. Skopiuj i wklej klucz do tego pola." + "message": "Bitwarden może przechowywać i uzupełniać kody weryfikacyjne. Skopiuj i wklej klucz do tego pola." }, "totpHelperWithCapture": { - "message": "Bitwarden może przechowywać i wypełniać kody weryfikacyjne. Wybierz ikonę aparatu, aby zrobić zrzut ekranu z kodem QR lub skopiuj i wklej klucz do tego pola." + "message": "Bitwarden może przechowywać i uzupełniać kody weryfikacyjne. Wybierz ikonę aparatu, aby zrobić zrzut ekranu z kodem QR lub skopiuj i wklej klucz do tego pola." }, "learnMoreAboutAuthenticators": { - "message": "Dowiedz się więcej o uwierzytelniaczach" + "message": "Dowiedz się więcej o uwierzytelnianiu" }, "copyTOTP": { "message": "Kopiuj klucz uwierzytelniający (TOTP)" @@ -860,7 +863,7 @@ "message": "Wylogowano" }, "loggedOutDesc": { - "message": "Zostałeś wylogowany z konta." + "message": "Wylogowano z konta." }, "loginExpired": { "message": "Twoja sesja wygasła." @@ -872,31 +875,31 @@ "message": "Zaloguj się do Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Wpisz kod wysłany na Twój adres e-mail" + "message": "Wpisz kod został wysłany na adres e-mail" }, "enterTheCodeFromYourAuthenticatorApp": { "message": "Wpisz kod z aplikacji uwierzytelniającej" }, "pressYourYubiKeyToAuthenticate": { - "message": "Naciśnij YubiKey aby uwierzytelnić" + "message": "Naciśnij klucz YubiKey, aby uwierzytelnić" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Logowanie dwustopniowe Duo jest wymagane dla twojego konta. Wykonaj poniższe kroki, by dokończyć logowanie" + "message": "Logowanie dwustopniowe Duo jest wymagane. Wykonaj poniższe kroki, aby zakończyć logowanie." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Wykonaj poniższe kroki, by dokończyć logowanie" + "message": "Wykonaj poniższe kroki, by zakończyć logowanie." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { "message": "Wykonaj poniższe kroki, aby zakończyć logowanie za pomocą klucza bezpieczeństwa." }, "restartRegistration": { - "message": "Zrestartuj rejestrację" + "message": "Rozpocznij rejestrację od początku" }, "expiredLink": { "message": "Link wygasł" }, "pleaseRestartRegistrationOrTryLoggingIn": { - "message": "Zrestartuj rejestrację lub spróbuj się zalogować." + "message": "Rozpocznij rejestrację od początku lub spróbuj się zalogować." }, "youMayAlreadyHaveAnAccount": { "message": "Możesz mieć już konto" @@ -923,19 +926,19 @@ "message": "Folder został dodany" }, "twoStepLoginConfirmation": { - "message": "Logowanie dwustopniowe sprawia, że konto jest bardziej bezpieczne poprzez wymuszenie potwierdzenia logowania z innego urządzenia, takiego jak z klucza bezpieczeństwa, aplikacji uwierzytelniającej, wiadomości SMS, telefonu lub adresu e-mail. Logowanie dwustopniowe możesz włączyć w sejfie internetowym bitwarden.com. Czy chcesz przejść do tej strony?" + "message": "Logowanie dwustopniowe zwiększa bezpieczeństwo konta, wymagając weryfikacji logowania za pomocą innego urządzenia, takiego jak klucz bezpieczeństwa, aplikacja uwierzytelniająca, wiadomość SMS, połączenie telefoniczne lub wiadomość e-mail. Logowanie dwustopniowe możesz skonfigurować w sejfie internetowym bitwarden.com. Czy chcesz przejść do strony?" }, "twoStepLoginConfirmationContent": { - "message": "Spraw, aby Twoje konto było bezpieczniejsze poprzez skonfigurowanie dwustopniowego logowania w aplikacji internetowej Bitwarden." + "message": "Zwiększ bezpieczeństwo konta, konfigurując logowanie dwustopniowe w aplikacji internetowej Bitwarden." }, "twoStepLoginConfirmationTitle": { - "message": "Kontynuować do aplikacji internetowej?" + "message": "Przejść do aplikacji internetowej?" }, "editedFolder": { "message": "Folder został zapisany" }, "deleteFolderConfirmation": { - "message": "Czy na pewno chcesz usunąć ten folder?" + "message": "Czy na pewno chcesz usunąć folder?" }, "deletedFolder": { "message": "Folder został usunięty" @@ -944,7 +947,7 @@ "message": "Samouczek" }, "gettingStartedTutorialVideo": { - "message": "Obejrzyj samouczek, aby dowiedzieć się, jak najlepiej wykorzystać rozszerzenie przeglądarki." + "message": "Zobacz samouczek, aby dowiedzieć się, jak najlepiej wykorzystać rozszerzenie przeglądarki." }, "syncingComplete": { "message": "Synchronizacja została zakończona" @@ -982,7 +985,7 @@ "message": "Element został zapisany" }, "deleteItemConfirmation": { - "message": "Czy na pewno chcesz to usunąć?" + "message": "Czy na pewno chcesz usunąć?" }, "deletedItem": { "message": "Element został przeniesiony do kosza" @@ -1013,40 +1016,40 @@ "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Poproś o dodanie danych logowania" + "message": "Proponuj zapisywanie danych logowania" }, "vaultSaveOptionsTitle": { "message": "Opcje zapisywania w sejfie" }, "addLoginNotificationDesc": { - "message": "\"Dodaj powiadomienia logowania\" automatycznie wyświetla monit o zapisanie nowych danych logowania do sejfu przy każdym pierwszym logowaniu." + "message": "Proponuj dodanie elementu, jeśli nie ma go w sejfie." }, "addLoginNotificationDescAlt": { - "message": "Poproś o dodanie elementu, jeśli nie zostanie znaleziony w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." + "message": "Proponuj dodanie elementu, jeśli nie ma go w sejfie. Dotyczy wszystkich zalogowanych kont." }, "showCardsInVaultViewV2": { - "message": "Zawsze pokazuj karty jako sugestie autouzupełniania w widoku sejfu" + "message": "Zawsze pokazuj karty w sugestiach autouzupełniania" }, "showCardsCurrentTab": { "message": "Pokaż karty na stronie głównej" }, "showCardsCurrentTabDesc": { - "message": "Pokaż elementy karty na stronie głównej, aby ułatwić autouzupełnianie." + "message": "Wyświetla karty na głównej karcie sejfu." }, "showIdentitiesInVaultViewV2": { - "message": "Zawsze pokazuj tożsamości jako sugestie autouzupełniania w widoku sejfu" + "message": "Zawsze pokazuj tożsamości w sugestiach autouzupełniania" }, "showIdentitiesCurrentTab": { "message": "Pokaż tożsamości na stronie głównej" }, "showIdentitiesCurrentTabDesc": { - "message": "Pokaż elementy tożsamości na stronie głównej, aby ułatwić autouzupełnianie." + "message": "Wyświetla tożsamości na głównej karcie sejfu." }, "clickToAutofillOnVault": { - "message": "Kliknij na dane logowania, aby autouzupełnić w widoku Sejfu" + "message": "Kliknij na elementy, aby je uzupełnić" }, "clickToAutofill": { - "message": "Kliknij elementy w sugestii autouzupełniania, aby wypełnić" + "message": "Kliknij na elementy w sugestiach, aby je uzupełnić" }, "clearClipboard": { "message": "Wyczyść schowek", @@ -1057,13 +1060,13 @@ "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { - "message": "Czy Bitwarden powinien zapisać to hasło?" + "message": "Zapisać hasło?" }, "notificationAddSave": { "message": "Zapisz" }, "notificationViewAria": { - "message": "Wyświetl $ITEMNAME$, otworzy się w nowym oknie", + "message": "Pokaż $ITEMNAME$, otwiera się w nowym oknie", "placeholders": { "itemName": { "content": "$1" @@ -1113,7 +1116,7 @@ } }, "saveAsNewLoginAction": { - "message": "Zapisz jako nowy login", + "message": "Zapisz jako nowy dane logowania", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { @@ -1121,7 +1124,7 @@ "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Odblokuj, aby zapisać ten login", + "message": "Odblokuj, aby zapisać dane logowania", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { @@ -1129,11 +1132,11 @@ "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Zaktualizować istniejące dane logowania?", + "message": "Zaktualizuj dane logowania", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Dane logowania zapisane", + "message": "Dane logowania zostały zapisane", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { @@ -1141,7 +1144,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Świetna robota! Podjęto kroki mające na celu zwiększenie bezpieczeństwa Twojego oraz $ORGANIZATION$.", + "message": "Dobra robota! Twoje konto i organizacja $ORGANIZATION$ jest bezpieczniejsza.", "placeholders": { "organization": { "content": "$1" @@ -1166,36 +1169,42 @@ "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { - "message": "Błąd podczas zapisywania", + "message": "Wystąpił błąd podczas zapisywania", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "O nie! Nie mogliśmy zapisać tego. Spróbuj wprowadzić szczegóły ręcznie.", + "message": "O nie! Nie mogliśmy tego zapisać. Wpisz szczegóły ręcznie.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Po zmianie hasła zaloguj się za pomocą nowego hasła. Aktywne sesje na innych urządzeniach zostaną wylogowane w ciągu jednej godziny." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Zmień hasło główne, aby zakończyć odzyskiwanie konta." + }, "enableChangedPasswordNotification": { - "message": "Poproś o aktualizację istniejących danych logowania" + "message": "Proponuj aktualizuję obecnych danych logowania" }, "changedPasswordNotificationDesc": { - "message": "Poproś o aktualizację hasła danych logowania po wykryciu zmiany w witrynie." + "message": "Proponuj aktualizację hasła po wykryciu zmiany na stronie internetowej." }, "changedPasswordNotificationDescAlt": { - "message": "Poproś o aktualizację hasła, gdy zmiana zostanie wykryta na stronie. Dotyczy wszystkich zalogowanych kont." + "message": "Proponuj aktualizację hasła po wykryciu zmiany na stronie internetowej. Dotyczy wszystkich zalogowanych kont." }, "enableUsePasskeys": { - "message": "Pytaj o zapisywanie i używanie kluczy dostępu" + "message": "Proponuj zapisywanie i używanie kluczy dostępu" }, "usePasskeysDesc": { - "message": "Pytaj o zapisywanie nowych kluczy dostępu albo danych logowania z kluczy w Twoim sejfie. Dotyczy wszystkich zalogowanych kont." + "message": "Pytaj o zapisywanie nowych kluczy dostępu i używanie obecnych. Dotyczy wszystkich zalogowanych kont." }, "notificationChangeDesc": { - "message": "Czy chcesz zaktualizować to hasło w Bitwarden?" + "message": "Czy chcesz zaktualizować hasło w Bitwarden?" }, "notificationChangeSave": { "message": "Zaktualizuj" }, "notificationUnlockDesc": { - "message": "Odblokuj swój sejf Bitwarden, aby ukończyć żądanie autouzupełniania." + "message": "Odblokuj sejf Bitwarden, aby uzupełnić dane." }, "notificationUnlock": { "message": "Odblokuj" @@ -1204,20 +1213,20 @@ "message": "Dodatkowe opcje" }, "enableContextMenuItem": { - "message": "Pokaż opcje menu kontekstowego" + "message": "Pokaż opcje w menu kontekstowym" }, "contextMenuItemDesc": { - "message": "Użyj drugiego kliknięcia, aby uzyskać dostęp do generowania haseł i pasujących danych logowania do witryny." + "message": "Użyj drugiego kliknięcia, aby uzyskać dostęp do generatora hasła i pasujących danych logowania." }, "contextMenuItemDescAlt": { - "message": "Użyj drugiego kliknięcia, aby uzyskać dostęp do generowania haseł i pasujących danych logowania do witryny. Dotyczy wszystkich zalogowanych kont." + "message": "Użyj drugiego kliknięcia, aby uzyskać dostęp do generatora hasła i pasujących danych logowania. Dotyczy wszystkich zalogowanych kont." }, "defaultUriMatchDetection": { "message": "Domyślne wykrywanie dopasowania", "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Wybierz domyślny sposób wykrywania dopasowania adresów dla czynności takich jak autouzupełnianie." + "message": "Wybierz domyślne wykrywanie dopasowania dla autouzupełniania." }, "theme": { "message": "Motyw" @@ -1226,7 +1235,7 @@ "message": "Zmień motyw kolorystyczny aplikacji." }, "themeDescAlt": { - "message": "Zmień kolor motywu aplikacji. Dotyczy wszystkich zalogowanych kont." + "message": "Zmień motyw kolorystyczny aplikacji. Dotyczy wszystkich zalogowanych kont." }, "dark": { "message": "Ciemny", @@ -1246,31 +1255,31 @@ "message": "Format pliku" }, "fileEncryptedExportWarningDesc": { - "message": "Plik będzie chroniony hasłem, które będzie wymagane do odszyfrowania pliku." + "message": "Plik zostanie zaszyfrowany hasłem." }, "filePassword": { - "message": "Hasło do pliku" + "message": "Hasło pliku" }, "exportPasswordDescription": { "message": "Hasło będzie używane do eksportowania i importowania pliku" }, "accountRestrictedOptionDescription": { - "message": "Użyj klucza szyfrowania konta, pochodzącego z nazwy użytkownika konta i hasła głównego, aby zaszyfrować eksport i ograniczyć import tylko do bieżącego konta Bitwarden." + "message": "Użyj klucza szyfrowania konta, pochodzącego z nazwy użytkownika konta i hasła głównego, aby zaszyfrować eksport i ograniczyć import tylko do obecnego konta Bitwarden." }, "passwordProtectedOptionDescription": { - "message": "Ustaw hasło dla pliku, aby zaszyfrować eksport i zaimportować je na dowolne konto Bitwarden przy użyciu hasła do odszyfrowania." + "message": "Ustaw hasło pliku, aby zaszyfrować eksport i zaimportować je na dowolne konto Bitwarden przy użyciu hasła do odszyfrowania." }, "exportTypeHeading": { "message": "Rodzaj eksportu" }, "accountRestricted": { - "message": "Konto ograniczone" + "message": "Konto zostało ograniczone" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“Hasło pliku” i “Potwierdź hasło pliku“ nie pasują do siebie." + "message": "Hasła pliku nie pasują do siebie." }, "warning": { - "message": "UWAGA", + "message": "OSTRZEŻENIE", "description": "WARNING (should stay in capitalized letters if the language permits)" }, "warningCapitalized": { @@ -1281,7 +1290,7 @@ "message": "Potwierdź eksportowanie sejfu" }, "exportWarningDesc": { - "message": "Plik zawiera dane sejfu w niezaszyfrowanym formacie. Nie powinieneś go przechowywać, ani przesyłać poprzez niezabezpieczone kanały (takie jak poczta e-mail). Skasuj go natychmiast po użyciu." + "message": "Plik zawiera dane sejfu w niezaszyfrowanym formacie. Nie należy go przechowywać ani przesyłać poprzez niezabezpieczone kanały (takie jak poczta e-mail). Usuń go natychmiast po użyciu." }, "encExportKeyWarningDesc": { "message": "Dane eksportu zostaną zaszyfrowane za pomocą klucza szyfrowania konta. Jeśli kiedykolwiek zmienisz ten klucz, wyeksportuj dane ponownie, ponieważ nie będziesz w stanie odszyfrować tego pliku." @@ -1290,19 +1299,19 @@ "message": "Klucze szyfrowania konta są unikalne dla każdego użytkownika Bitwarden, więc nie możesz zaimportować zaszyfrowanego pliku eksportu na inne konto." }, "exportMasterPassword": { - "message": "Wpisz hasło główne, aby wyeksportować dane z sejfu." + "message": "Wpisz hasło główne, aby wyeksportować dane sejfu." }, "shared": { "message": "Udostępnione" }, "bitwardenForBusinessPageDesc": { - "message": "Bitwarden dla biznesu pozwala na udostępnianie zawartości sejfu innym osobom za pośrednictwem organizacji. Dowiedz się wiecej na bitwarden.com." + "message": "Bitwarden dla firm pozwala na udostępnianie zawartości sejfu innym użytkownikom za pośrednictwem organizacji. Dowiedz się więcej na stronie bitwarden.com." }, "moveToOrganization": { "message": "Przenieś do organizacji" }, "movedItemToOrg": { - "message": "Element $ITEMNAME$ został przeniesiony do organizacji $ORGNAME$", + "message": "Przeniesiono $ITEMNAME$ do $ORGNAME$", "placeholders": { "itemname": { "content": "$1", @@ -1315,7 +1324,7 @@ } }, "moveToOrgDesc": { - "message": "Wybierz organizację, do której chcesz przenieść ten element. Ta czynność spowoduje utratę własności elementu i przenosi te uprawnienia do organizacji." + "message": "Wybierz organizację, do której chcesz przenieść element. Przeniesienie spowoduje zmianę własności elementu na organizację." }, "learnMore": { "message": "Dowiedz się więcej" @@ -1336,7 +1345,7 @@ "message": "Usuń załącznik" }, "deleteAttachmentConfirmation": { - "message": "Czy na pewno chcesz usunąć ten załącznik?" + "message": "Czy na pewno chcesz usunąć załącznik?" }, "deletedAttachment": { "message": "Załącznik został usunięty" @@ -1354,7 +1363,7 @@ "message": "Plik" }, "fileToShare": { - "message": "Plik do udostępnienia" + "message": "Plik wysyłki" }, "selectFile": { "message": "Wybierz plik" @@ -1365,26 +1374,26 @@ "featureUnavailable": { "message": "Funkcja jest niedostępna" }, - "encryptionKeyMigrationRequired": { - "message": "Wymagana jest migracja klucza szyfrowania. Zaloguj się przez sejf internetowy, aby zaktualizować klucz szyfrowania." + "legacyEncryptionUnsupported": { + "message": "Starsze szyfrowanie nie jest już obsługiwane. Skontaktuj się z pomocą techniczną, aby odzyskać konto." }, "premiumMembership": { - "message": "Konto Premium" + "message": "Konto premium" }, "premiumManage": { - "message": "Zarządzaj kontem Premium" + "message": "Zarządzaj kontem premium" }, "premiumManageAlert": { - "message": "Kontem Premium możesz zarządzać na stronie sejfu bitwarden.com. Czy chcesz otworzyć tę stronę?" + "message": "Zarządzaj kontem premium na stronie internetowej bitwarden.com. Czy chcesz otworzyć stronę?" }, "premiumRefresh": { - "message": "Odśwież konto Premium" + "message": "Odśwież konto premium" }, "premiumNotCurrentMember": { - "message": "Nie posiadasz obecnie konta Premium." + "message": "Nie masz konta premium." }, "premiumSignUpAndGet": { - "message": "Zarejestruj konto Premium, aby otrzymać:" + "message": "Ulepsz konto do wersji premium, aby otrzymać:" }, "ppremiumSignUpStorage": { "message": "1 GB miejsca na zaszyfrowane załączniki." @@ -1393,13 +1402,13 @@ "message": "Dostęp awaryjny." }, "premiumSignUpTwoStepOptions": { - "message": "Własnościowe opcje logowania dwuetapowego, takie jak YubiKey i Duo." + "message": "Specjalne opcje logowania dwustopniowego, takie jak YubiKey i Duo." }, "ppremiumSignUpReports": { "message": "Raporty bezpieczeństwa haseł, stanu konta i raporty wycieków danych, aby Twoje dane były bezpieczne." }, "ppremiumSignUpTotp": { - "message": "Generator kodów weryfikacyjnych TOTP (2FA) dla danych logowania w Twoim sejfie." + "message": "Generator kodów weryfikacyjnych TOTP dla danych logowania w sejfie." }, "ppremiumSignUpSupport": { "message": "Priorytetowe wsparcie klienta." @@ -1408,22 +1417,22 @@ "message": "Wszystkie przyszłe funkcje premium. Więcej już wkrótce!" }, "premiumPurchase": { - "message": "Kup konto Premium" + "message": "Kup konto premium" }, "premiumPurchaseAlertV2": { - "message": "Możesz kupić Premium w ustawieniach konta w aplikacji internetowej Bitwarden." + "message": "Możesz kupić konto premium w aplikacji internetowej Bitwarden." }, "premiumCurrentMember": { - "message": "Posiadasz konto Premium!" + "message": "Masz konto premium!" }, "premiumCurrentMemberThanks": { "message": "Dziękujemy za wspieranie Bitwarden." }, "premiumFeatures": { - "message": "Uaktualnij do wersji Premium i otrzymaj:" + "message": "Ulepsz konto do wersji premium i otrzymaj:" }, "premiumPrice": { - "message": "Wszystko to jedynie za $PRICE$ /rok!", + "message": "Tylko $PRICE$ / rok!", "placeholders": { "price": { "content": "$1", @@ -1432,7 +1441,7 @@ } }, "premiumPriceV2": { - "message": "Wszystko tylko za $PRICE$ rocznie!", + "message": "Tylko $PRICE$ rocznie!", "placeholders": { "price": { "content": "$1", @@ -1447,25 +1456,25 @@ "message": "Kopiuj kod TOTP automatycznie" }, "disableAutoTotpCopyDesc": { - "message": "Jeśli dane logowania posiadają dołączony klucz uwierzytelniający TOTP, kod weryfikacyjny jest automatycznie kopiowany do schowka przy każdym autouzupełnianiu danych logowania." + "message": "Automatycznie kopiuje kod TOTP do schowka podczas autouzupełniania." }, "enableAutoBiometricsPrompt": { - "message": "Poproś o dane biometryczne przy uruchomieniu" + "message": "Wymagaj odblokowania biometrią po uruchomieniu przeglądarki" }, "premiumRequired": { - "message": "Konto Premium jest wymagane" + "message": "Konto premium jest wymagane" }, "premiumRequiredDesc": { - "message": "Konto Premium jest wymagane, aby skorzystać z tej funkcji." + "message": "Konto premium jest wymagane, aby skorzystać z tej funkcji." }, "authenticationTimeout": { - "message": "Limit czasu uwierzytelniania" + "message": "Przekroczono limit czasu uwierzytelniania" }, "authenticationSessionTimedOut": { - "message": "Upłynął limit czasu uwierzytelniania. Uruchom ponownie proces logowania." + "message": "Upłynął limit czasu uwierzytelniania. Zaloguj się ponownie." }, "verificationCodeEmailSent": { - "message": "Kod weryfikacyjny został wysłany na adres $EMAIL$.", + "message": "Wiadomość weryfikacyjna została wysłana na adres $EMAIL$.", "placeholders": { "email": { "content": "$1", @@ -1484,7 +1493,7 @@ "message": "Użyj kodu odzyskiwania" }, "insertU2f": { - "message": "Włóż klucz bezpieczeństwa do portu USB komputera. Jeśli klucz posiada przycisk, dotknij go." + "message": "Włóż klucz bezpieczeństwa do portu USB urządzenia. Jeśli klucz ma przycisk, dotknij go." }, "openInNewTab": { "message": "Otwórz w nowej karcie" @@ -1496,16 +1505,16 @@ "message": "Odczytaj klucz bezpieczeństwa" }, "awaitingSecurityKeyInteraction": { - "message": "Oczekiwanie na interakcję z kluczem bezpieczeństwa..." + "message": "Oczekiwanie na klucz bezpieczeństwa..." }, "loginUnavailable": { "message": "Logowanie jest niedostępne" }, "noTwoStepProviders": { - "message": "Konto posiada włączoną opcję logowania dwustopniowego, jednak ta przeglądarka nie wspiera żadnego ze skonfigurowanych mechanizmów autoryzacji dwustopniowej." + "message": "Konto jest zabezpieczone logowaniem dwustopniowym, ale żadna ze skonfigurowanych metod nie jest obsługiwana w tej przeglądarce." }, "noTwoStepProviders2": { - "message": "Proszę użyć obsługiwanej przeglądarki (takiej jak Chrome) i/lub dodać dodatkowych dostawców, którzy są lepiej wspierani przez przeglądarki internetowe (np. aplikacja uwierzytelniająca)." + "message": "Użyj obsługiwanej przeglądarki (np. Chrome) lub dodaj dodatkowe opcje logowania dwustopniowego, które są obsługiwane na różnych przeglądarkach (takie jak aplikacja uwierzytelniająca)." }, "twoStepOptions": { "message": "Opcje logowania dwustopniowego" @@ -1514,7 +1523,7 @@ "message": "Wybierz metodę logowania dwustopniowego" }, "recoveryCodeDesc": { - "message": "Utraciłeś dostęp do wszystkich swoich mechanizmów dwustopniowego logowania? Użyj kodów odzyskiwania, aby wyłączyć dwustopniowe logowanie na Twoim koncie." + "message": "Nie masz dostępu do logowania dwustopniowego? Użyj kodu odzyskiwania, aby je wyłączyć." }, "recoveryCodeTitle": { "message": "Kod odzyskiwania" @@ -1523,28 +1532,28 @@ "message": "Aplikacja uwierzytelniająca" }, "authenticatorAppDescV2": { - "message": "Wprowadź kod wygenerowany przez aplikację uwierzytelniającą, jak Bitwarden Authenticator.", + "message": "Wpisz kod wygenerowany przez aplikację uwierzytelniającą, taką jak Bitwarden Authenticator.", "description": "'Bitwarden Authenticator' is a product name and should not be translated." }, "yubiKeyTitleV2": { "message": "Klucz bezpieczeństwa Yubico OTP" }, "yubiKeyDesc": { - "message": "Użyj YubiKey jako metody dostępu do konta. Działa z YubiKey 4, 4 Nano, 4C i urządzeniami NEO." + "message": "Użyj klucza YubiKey, aby uzyskać dostęp do konta. Działa z urządzeniami YubiKey 4, 4 Nano, 4C i NEO." }, "duoDescV2": { - "message": "Wprowadź kod wygenerowany przez Duo Security.", + "message": "Wpisz kod wygenerowany przez Duo Security.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Weryfikacja dostępu do Twojej organizacji z użyciem Duo Security poprzez aplikację Duo Mobile, SMS, połączenie telefoniczne lub klucz bezpieczeństwa U2F.", + "message": "Weryfikacja Duo Security za pomocą aplikacji Duo Mobile, wiadomości SMS, połączenia telefonicznego lub klucza bezpieczeństwa U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Użyj dowolnego klucza bezpieczeństwa WebAuthn, aby uzyskać dostęp do swojego konta." + "message": "Użyj dowolnego klucza bezpieczeństwa WebAuthn, aby uzyskać dostęp do konta." }, "emailTitle": { "message": "Adres e-mail" @@ -1556,7 +1565,7 @@ "message": "Samodzielnie hostowane środowisko" }, "selfHostedBaseUrlHint": { - "message": "Określ bazowy adres URL swojej instalacji Bitwarden. Przykład: https://bitwarden.company.com" + "message": "Określ podstawowy adres URL instalacji Bitwarden. Przykład: https://bitwarden.mojafirma.pl" }, "selfHostedCustomEnvHeader": { "message": "Dla zaawansowanych konfiguracji możesz określić podstawowy adres URL niezależnie dla każdej usługi." @@ -1571,7 +1580,7 @@ "message": "Adres URL serwera" }, "selfHostBaseUrl": { - "message": "URL samodzielnie hostowanego serwera", + "message": "Adres URL hostowanego serwera", "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { @@ -1593,17 +1602,17 @@ "message": "Adresy URL środowiska zostały zapisane" }, "showAutoFillMenuOnFormFields": { - "message": "Pokaż menu autouzupełniania na polach formularza", + "message": "Pokaż menu autouzupełniania w polach formularza", "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { "message": "Sugestie autouzupełniania" }, "autofillSpotlightTitle": { - "message": "Łatwe znajdowanie sugestii autouzupełniania" + "message": "Łatwe wyszukiwanie sugestii autouzupełniania" }, "autofillSpotlightDesc": { - "message": "Wyłącz ustawienia autouzupełniania swojej przeglądarki, aby nie kolidowały z Bitwarden." + "message": "Wyłącz autouzupełnianie przeglądarki, aby uniknąć konfliktów z Bitwarden." }, "turnOffBrowserAutofill": { "message": "Wyłącz autouzupełnianie $BROWSER$", @@ -1615,52 +1624,52 @@ } }, "turnOffAutofill": { - "message": "Wyłącz autouzupełnienie" + "message": "Wyłącz autouzupełnianie" }, "showInlineMenuLabel": { "message": "Pokaż sugestie autouzupełniania na polach formularza" }, "showInlineMenuIdentitiesLabel": { - "message": "Pokazuj tożsamości jako sugestie" + "message": "Pokaż tożsamości w sugestiach" }, "showInlineMenuCardsLabel": { - "message": "Pokazuj karty jako sugestie" + "message": "Pokaż karty w sugestiach" }, "showInlineMenuOnIconSelectionLabel": { - "message": "Wyświetlaj sugestie, kiedy ikona jest zaznaczona" + "message": "Pokaż sugestie po kliknięciu ikony" }, "showInlineMenuOnFormFieldsDescAlt": { "message": "Dotyczy wszystkich zalogowanych kont." }, "turnOffBrowserBuiltInPasswordManagerSettings": { - "message": "Wyłącz wbudowany w przeglądarkę menedżer haseł, aby uniknąć konfliktów." + "message": "Wyłącz menedżer haseł przeglądarki, aby uniknąć konfliktów." }, "turnOffBrowserBuiltInPasswordManagerSettingsLink": { "message": "Edytuj ustawienia przeglądarki." }, "autofillOverlayVisibilityOff": { - "message": "Wył.", + "message": "Wyłączone", "description": "Overlay setting select option for disabling autofill overlay" }, "autofillOverlayVisibilityOnFieldFocus": { - "message": "Gdy pole jest zaznaczone", + "message": "Po kliknięciu pola", "description": "Overlay appearance select option for showing the field on focus of the input element" }, "autofillOverlayVisibilityOnButtonClick": { - "message": "Gdy wybrano ikonę autouzupełniania", + "message": "Po kliknięciu ikony autouzupełniania", "description": "Overlay appearance select option for showing the field on click of the overlay icon" }, "enableAutoFillOnPageLoadSectionTitle": { - "message": "Włącz autouzupełnianie po załadowaniu strony" + "message": "Autouzupełnianie po załadowaniu strony" }, "enableAutoFillOnPageLoad": { - "message": "Włącz autouzupełnianie po załadowaniu strony" + "message": "Uzupełniaj po załadowaniu strony" }, "enableAutoFillOnPageLoadDesc": { - "message": "Jeśli zostanie wykryty formularz logowania, automatycznie uzupełnij dane logowania po załadowaniu strony." + "message": "Dane logowania zostaną uzupełnione po wykryciu formularza logowania na stronie." }, "experimentalFeature": { - "message": "Zaatakowane lub niezaufane witryny internetowe mogą wykorzystać funkcję autouzupełniania podczas wczytywania strony, aby wyrządzić szkody." + "message": "Zaatakowane strony internetowe mogą wykorzystywać autouzupełnianie do przejęcia danych logowania." }, "learnMoreAboutAutofillOnPageLoadLinkText": { "message": "Dowiedz się więcej o ryzyku" @@ -1672,7 +1681,7 @@ "message": "Domyślne ustawienie autouzupełniania" }, "defaultAutoFillOnPageLoadDesc": { - "message": "Po włączeniu autouzupełnianiu po załadowaniu strony możesz włączyć lub wyłączyć tę funkcję dla poszczególnych wpisów." + "message": "Możesz wyłączyć autouzupełnianie po załadowaniu strony dla poszczególnych elementów w opcjach konkretnych elementów." }, "itemAutoFillOnPageLoad": { "message": "Automatycznie uzupełniaj po załadowaniu strony (jeśli włączono w opcjach)" @@ -1681,10 +1690,10 @@ "message": "Użyj domyślnego ustawienia" }, "autoFillOnPageLoadYes": { - "message": "Automatycznie uzupełniaj po załadowaniu strony" + "message": "Uzupełniaj po załadowaniu strony" }, "autoFillOnPageLoadNo": { - "message": "Nie uzupełniaj automatycznie po załadowaniu strony" + "message": "Nie uzupełniaj po załadowaniu strony" }, "commandOpenPopup": { "message": "Otwórz sejf w oknie" @@ -1696,13 +1705,13 @@ "message": "Autouzupełnianie korzysta z ostatnio używanych danych logowania na tej stronie" }, "commandAutofillCardDesc": { - "message": "Autouzupełnianie korzysta z ostatnio używanych danych karty na tej stronie" + "message": "Autouzupełnianie korzysta z ostatnio używanej karty na tej stronie" }, "commandAutofillIdentityDesc": { "message": "Autouzupełnianie korzysta z ostatnio używanej tożsamości na tej stronie" }, "commandGeneratePasswordDesc": { - "message": "Wygeneruj nowe losowe hasło i skopiuj je do schowka." + "message": "Wygeneruj nowe hasło i skopiuj je do schowka" }, "commandLockVaultDesc": { "message": "Zablokuj sejf" @@ -1729,7 +1738,7 @@ "message": "Tekst" }, "cfTypeHidden": { - "message": "Pole maskowane" + "message": "Ukryty tekst" }, "cfTypeBoolean": { "message": "Wartość logiczna" @@ -1749,16 +1758,16 @@ "message": "Kliknięcie poza okno, w celu sprawdzenia wiadomość z kodem weryfikacyjnym spowoduje, że zostanie ono zamknięte. Czy chcesz otworzyć nowe okno tak, aby się nie zamknęło?" }, "popupU2fCloseMessage": { - "message": "Ta przeglądarka nie może przetworzyć żądania U2F w tym oknie. Czy chcesz otworzyć nowe okno przeglądarki, aby zalogować się przy pomocy klucza U2F?" + "message": "Ta przeglądarka nie może przetworzyć żądania U2F w wyskakującym oknie. Czy chcesz otworzyć nowe okno przeglądarki, aby zalogować się przy pomocy klucza U2F?" }, "enableFavicon": { - "message": "Pokaż ikony witryn" + "message": "Pokaż ikony stron internetowych" }, "faviconDesc": { - "message": "Pokaż rozpoznawalny obraz obok danych logowania." + "message": "Pokaż rozpoznawalną ikonę obok danych logowania." }, "faviconDescAlt": { - "message": "Pokaż rozpoznawalny obraz obok każdego logowania. Dotyczy wszystkich zalogowanych kont." + "message": "Pokaż rozpoznawalną ikonę obok danych logowania. Dotyczy wszystkich zalogowanych kont." }, "enableBadgeCounter": { "message": "Pokaż licznik na ikonie" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Kod zabezpieczający" }, + "cardNumber": { + "message": "numer karty" + }, "ex": { "message": "np." }, @@ -1833,7 +1845,7 @@ "message": "Pan" }, "mrs": { - "message": "Mrs" + "message": "Pani (Mrs)" }, "ms": { "message": "Pani" @@ -1857,7 +1869,7 @@ "message": "Imię i nazwisko" }, "identityName": { - "message": "Nazwa profilu" + "message": "Nowa tożsamość" }, "company": { "message": "Firma" @@ -1875,7 +1887,7 @@ "message": "Adres e-mail" }, "phone": { - "message": "Telefon" + "message": "Numer telefonu" }, "address": { "message": "Adres" @@ -1911,7 +1923,7 @@ "message": "Dane logowania" }, "typeSecureNote": { - "message": "Bezpieczna notatka" + "message": "Notatka" }, "typeCard": { "message": "Karta" @@ -1922,8 +1934,11 @@ "typeSshKey": { "message": "Klucz SSH" }, + "typeNote": { + "message": "Notatka" + }, "newItemHeader": { - "message": "Nowy $TYPE$", + "message": "$TYPE$", "placeholders": { "type": { "content": "$1", @@ -1932,7 +1947,7 @@ } }, "editItemHeader": { - "message": "Edytuj $TYPE$", + "message": "$TYPE$", "placeholders": { "type": { "content": "$1", @@ -1941,7 +1956,7 @@ } }, "viewItemHeader": { - "message": "Zobacz $TYPE$", + "message": "Pokaż $TYPE$", "placeholders": { "type": { "content": "$1", @@ -1959,16 +1974,16 @@ "message": "Wyczyść historię generatora" }, "cleargGeneratorHistoryDescription": { - "message": "Jeśli zatwierdzisz, wszystkie wygenerowane hasła zostaną usunięte z historii generatora. Czy chcesz kontynuować mimo to?" + "message": "Wszystkie wpisy zostaną trwale usunięte z historii generatora. Czy na pewno chcesz kontynuować?" }, "back": { - "message": "Powrót" + "message": "Wstecz" }, "collections": { "message": "Kolekcje" }, "nCollections": { - "message": "Kolekcje: $COUNT$", + "message": "W $COUNT$ kolekcjach", "placeholders": { "count": { "content": "$1", @@ -1980,7 +1995,7 @@ "message": "Ulubione" }, "popOutNewWindow": { - "message": "Wyświetl w nowym oknie" + "message": "Otwórz w nowym oknie" }, "refresh": { "message": "Odśwież" @@ -1995,7 +2010,7 @@ "message": "Dane logowania" }, "secureNotes": { - "message": "Bezpieczne notatki" + "message": "Notatki" }, "sshKeys": { "message": "Klucze SSH" @@ -2008,7 +2023,7 @@ "message": "Sprawdź, czy hasło zostało ujawnione." }, "passwordExposed": { - "message": "To hasło znajduje się w $VALUE$ wykradzionej(ych) bazie(ach) danych. Należy je zmienić.", + "message": "Hasło zostało ujawnione $VALUE$ raz(y) w wyciekach danych. Zmień je.", "placeholders": { "value": { "content": "$1", @@ -2017,14 +2032,14 @@ } }, "passwordSafe": { - "message": "To hasło nie znajduje się w żadnej znanej wykradzionej bazie danych. Powinno być bezpieczne." + "message": "Hasło nie znajduje się w żadnym znanym wycieku danych. Powinno być bezpieczne." }, "baseDomain": { "message": "Domena podstawowa", "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Domena podstawowa (rekomendowana)", + "message": "Domena podstawowa (domyślne)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -2054,7 +2069,7 @@ "description": "Default URI match detection for autofill." }, "toggleOptions": { - "message": "Zmień opcje" + "message": "Przełącz opcje" }, "toggleCurrentUris": { "message": "Przełącz obecny URI", @@ -2075,7 +2090,7 @@ "message": "Wszystkie elementy" }, "noPasswordsInList": { - "message": "Brak haseł." + "message": "Brak haseł do wyświetlenia." }, "clearHistory": { "message": "Wyczyść historię" @@ -2084,13 +2099,13 @@ "message": "Brak zawartości do pokazania" }, "nothingGeneratedRecently": { - "message": "Nic nie zostało wygenerowane przez ciebie w ostatnim czasie" + "message": "Nic nie zostało wygenerowane w ostatnim czasie" }, "remove": { "message": "Usuń" }, "default": { - "message": "Domyślny" + "message": "Domyślna" }, "dateUpdated": { "message": "Zaktualizowano", @@ -2105,7 +2120,7 @@ "description": "ex. Date this password was updated" }, "neverLockWarning": { - "message": "Czy na pewno chcesz użyć opcji \"Nigdy\"? Ustawienie opcji blokady na \"Nigdy\" przechowuje klucz szyfrowania Twojego sejfu na urządzeniu. Jeśli używasz tej opcji upewnij się, że odpowiednio zabezpieczasz swoje urządzenie." + "message": "Czy na pewno chcesz użyć opcji „Nigdy”? Ustawienie blokady na „Nigdy” spowoduje przechowywanie klucza szyfrowania sejfu na urządzeniu. Upewnij się, że urządzenie jest odpowiednio chronione." }, "noOrganizationsList": { "message": "Nie należysz do żadnej organizacji. Organizacje pozwalają na bezpieczne udostępnianie elementów innym użytkownikom." @@ -2117,7 +2132,7 @@ "message": "Właściciel" }, "whoOwnsThisItem": { - "message": "Kto jest właścicielem tego elementu?" + "message": "Kto jest właścicielem elementu?" }, "strong": { "message": "Silne", @@ -2132,10 +2147,10 @@ "description": "ex. A weak password. Scale: Weak -> Good -> Strong" }, "weakMasterPassword": { - "message": "Słabe hasło główne" + "message": "Hasło główne jest słabe" }, "weakMasterPasswordDesc": { - "message": "Wybrane przez Ciebie hasło główne jest słabe. Powinieneś użyć silniejszego hasła (lub frazy), aby właściwie chronić swoje konto Bitwarden. Czy na pewno chcesz użyć tego hasła głównego?" + "message": "Użyj silniejszego hasła, aby odpowiednio chronić konto Bitwarden. Czy na pewno chcesz użyć tego hasła głównego?" }, "pin": { "message": "Kod PIN", @@ -2151,10 +2166,10 @@ "message": "Ustaw kod PIN" }, "setYourPinCode": { - "message": "Ustaw kod PIN do odblokowywania aplikacji Bitwarden. Ustawienia odblokowywania kodem PIN zostaną zresetowane po wylogowaniu." + "message": "Ustaw kod PIN do odblokowania aplikacji Bitwarden. Ustawienia kodu PIN zostaną zresetowane po wylogowaniu." }, - "setYourPinCode1": { - "message": "Twój PIN będzie używany do odblokowania Bitwardena zamiast hasła głównego. Twój kod PIN zostanie zresetowany jeśli kiedykolwiek wylogujesz się z Bitwarden." + "setPinCode": { + "message": "Możesz użyć tego kodu PIN do odblokowania aplikacji Bitwarden. Kod PIN zostanie zresetowany po wylogowaniu." }, "pinRequired": { "message": "Kod PIN jest wymagany." @@ -2163,25 +2178,25 @@ "message": "Kod PIN jest nieprawidłowy." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "Zbyt wiele nieprawidłowych prób wpisywania PIN. Wylogowywanie." + "message": "Zbyt wiele nieprawidłowych prób wpisywania kodu PIN. Trwa wylogowanie" }, "unlockWithBiometrics": { - "message": "Odblokuj danymi biometrycznymi" + "message": "Odblokuj biometrią" }, "unlockWithMasterPassword": { - "message": "Odblokuj za pomocą głównego hasła" + "message": "Odblokuj hasłem głównym" }, "awaitDesktop": { "message": "Oczekiwanie na potwierdzenie z aplikacji desktopowej" }, "awaitDesktopDesc": { - "message": "Włącz dane biometryczne w aplikacji desktopowej Bitwarden, aby włączyć tę samą funkcję w przeglądarce." + "message": "Włącz najpierw biometrię w aplikacji desktopowej Bitwarden, aby skonfigurować dane biometryczne w przeglądarce." }, "lockWithMasterPassOnRestart": { "message": "Zablokuj hasłem głównym po uruchomieniu przeglądarki" }, "lockWithMasterPassOnRestart1": { - "message": "Wymagaj hasła głównego przy ponownym uruchomieniu przeglądarki" + "message": "Wymagaj hasła głównego po uruchomieniu przeglądarki" }, "selectOneCollection": { "message": "Musisz wybrać co najmniej jedną kolekcję." @@ -2196,7 +2211,7 @@ "message": "Generator hasła" }, "usernameGenerator": { - "message": "Generator nazw użytkownika" + "message": "Generator nazwy użytkownika" }, "useThisEmail": { "message": "Użyj tego adresu e-mail" @@ -2211,14 +2226,14 @@ "message": "Użyj tej nazwy użytkownika" }, "securePasswordGenerated": { - "message": "Wygenerowane bezpieczne hasło! Nie zapomnij również zaktualizować hasła na stronie." + "message": "Bezpieczne hasło zostało wygenerowane! Nie zapomnij zaktualizować hasła na stronie internetowej." }, "useGeneratorHelpTextPartOne": { "message": "Użyj generatora", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": ", aby utworzyć mocne unikalne hasło", + "message": ", aby utworzyć silne i unikalne hasło", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { @@ -2228,7 +2243,7 @@ "message": "Sposób blokowania sejfu" }, "vaultTimeoutAction1": { - "message": "Akcja po przekroczeniu limitu czasu" + "message": "Sposób blokady" }, "lock": { "message": "Zablokuj", @@ -2245,7 +2260,7 @@ "message": "Usuń trwale element" }, "permanentlyDeleteItemConfirmation": { - "message": "Czy na pewno chcesz usunąć trwale ten element?" + "message": "Czy na pewno chcesz usunąć trwale element?" }, "permanentlyDeletedItem": { "message": "Element został trwale usunięty" @@ -2263,31 +2278,31 @@ "message": "Po wylogowaniu się z sejfu musisz ponownie zalogować się, aby uzyskać do niego dostęp. Czy na pewno chcesz użyć tego ustawienia?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Potwierdź sposób blokowania sejfu" + "message": "Potwierdź sposób blokady" }, "autoFillAndSave": { - "message": "Automatycznie uzupełnij i zapisz" + "message": "Uzupełnij i zapisz" }, "fillAndSave": { - "message": "Wypełnij i zapisz" + "message": "Uzupełnij i zapisz" }, "autoFillSuccessAndSavedUri": { "message": "URI został zapisany i automatycznie uzupełniony" }, "autoFillSuccess": { - "message": "Element został automatycznie uzupełniony " + "message": "Element został automatycznie uzupełniony" }, "insecurePageWarning": { - "message": "Ostrzeżenie: Jest to niezabezpieczona strona HTTP i wszelkie przekazane informacje mogą być potencjalnie widoczne i zmienione przez innych. Ten login został pierwotnie zapisany na stronie bezpiecznej (HTTPS)." + "message": "Ostrzeżenie: Jest to niezabezpieczona strona HTTP, to wszelkie przesłane informacje mogą być potencjalnie widoczne i zmienione przez inne osoby. Logowanie zostało pierwotnie zapisane na bezpiecznej stronie (HTTPS)." }, "insecurePageWarningFillPrompt": { - "message": "Nadal chcesz uzupełnić ten login?" + "message": "Czy chcesz uzupełnić dane logowania?" }, "autofillIframeWarning": { - "message": "Formularz jest hostowany przez inną domenę niż zapisany adres URI dla tego loginu. Wybierz OK, aby i tak automatycznie wypełnić lub anuluj, aby zatrzymać." + "message": "Formularz jest hostowany przez inną domenę niż URI zapisanych danych logowania. Kliknij OK, aby uzupełnić dane logowania lub Anuluj, aby zatrzymać." }, "autofillIframeWarningTip": { - "message": "Aby zapobiec temu ostrzeżeniu w przyszłości, zapisz ten URI, $HOSTNAME$, dla tej witryny.", + "message": "Aby uniknąć ostrzeżenia w przyszłości, zapisz URI $HOSTNAME$ w danych logowania.", "placeholders": { "hostname": { "content": "$1", @@ -2299,7 +2314,7 @@ "message": "Ustaw hasło główne" }, "currentMasterPass": { - "message": "Aktualne hasło główne" + "message": "Obecne hasło główne" }, "newMasterPass": { "message": "Nowe hasło główne" @@ -2350,16 +2365,16 @@ "message": "Nowe hasło główne nie spełnia wymaganych zasad." }, "receiveMarketingEmailsV2": { - "message": "Uzyskaj poradę, ogłoszenia i możliwości badawcze od Bitwarden w swojej skrzynce odbiorczej." + "message": "Otrzymuj porady, ogłoszenia i możliwości badawcze od Bitwarden na swoją skrzynkę odbiorczą." }, "unsubscribe": { "message": "Anuluj subskrypcję" }, "atAnyTime": { - "message": "w każdej chwili." + "message": "w dowolnym momencie." }, "byContinuingYouAgreeToThe": { - "message": "Kontynuując, zgadzasz się na" + "message": "Kontynuując, akceptujesz" }, "and": { "message": "i" @@ -2377,7 +2392,7 @@ "message": "Polityka prywatności" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Twoje nowe hasło nie może być takie samo jak Twoje aktualne hasło." + "message": "Nowe hasło nie może być takie samo jak obecne." }, "hintEqualsPassword": { "message": "Podpowiedź do hasła nie może być taka sama jak hasło." @@ -2386,16 +2401,16 @@ "message": "Ok" }, "errorRefreshingAccessToken": { - "message": "Błąd podczas odświeżania tokenu" + "message": "Wystąpił błąd podczas odświeżania tokena" }, "errorRefreshingAccessTokenDesc": { - "message": "Nie znaleziono tokenu odświeżającego ani kluczy API. Spróbuj wylogować się i zalogować ponownie." + "message": "Nie znaleziono tokena odświeżania ani kluczy API. Zaloguj się ponownie." }, "desktopSyncVerificationTitle": { "message": "Weryfikacja synchronizacji z aplikacją desktopową" }, "desktopIntegrationVerificationText": { - "message": "Zweryfikuj aplikację desktopową z wyświetlonym identyfikatorem: " + "message": "Zweryfikuj aplikację desktopową z identyfikatorem: " }, "desktopIntegrationDisabledTitle": { "message": "Połączenie z przeglądarką jest wyłączone" @@ -2407,10 +2422,10 @@ "message": "Uruchom aplikację desktopową Bitwarden" }, "startDesktopDesc": { - "message": "Aplikacja desktopowa Bitwarden, przed odblokowaniem danymi biometrycznymi, musi zostać ponownie uruchomiona." + "message": "Aplikacja desktopowa Bitwarden musi zostać uruchomiona przed odblokowaniem za pomocą biometrii." }, "errorEnableBiometricTitle": { - "message": "Nie można włączyć danych biometrycznych" + "message": "Nie można włączyć biometrii" }, "errorEnableBiometricDesc": { "message": "Operacja została anulowana przez aplikację desktopową" @@ -2422,46 +2437,46 @@ "message": "Komunikacja z aplikacją desktopową została przerwana" }, "nativeMessagingWrongUserDesc": { - "message": "W aplikacji desktopowej jesteś zalogowany na inne konto. Upewnij się, że w obu aplikacjach jesteś zalogowany na to same konto." + "message": "Aplikacja desktopowa jest zalogowana na inne konto. Upewnij się, że obie aplikacje są zalogowane na to samo konto." }, "nativeMessagingWrongUserTitle": { "message": "Konto jest niezgodne" }, "nativeMessagingWrongUserKeyTitle": { - "message": "Klucz biometryczny jest niepoprawny" + "message": "Klucz biometrii jest nieprawidłowy" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Odblokowanie biometryczne się nie powiodło. Sekretny klucz biometryczny nie odblokował sejfu. Spróbuj skonfigurować biometrię ponownie." + "message": "Odblokowanie biometrią nie powiodło się. Klucz biometrii nie odblokował sejfu. Spróbuj ponownie skonfigurować biometrię." }, "biometricsNotEnabledTitle": { - "message": "Dane biometryczne są wyłączone" + "message": "Biometria jest wyłączona" }, "biometricsNotEnabledDesc": { - "message": "Aby włączyć dane biometryczne w przeglądarce, musisz włączyć tę samą funkcję w ustawianiach aplikacji desktopowej." + "message": "Aby skonfigurować dane biometryczne w przeglądarce, włącz najpierw biometrię w aplikacji desktopowej." }, "biometricsNotSupportedTitle": { - "message": "Dane biometryczne nie są obsługiwane" + "message": "Biometria nie jest obsługiwana" }, "biometricsNotSupportedDesc": { - "message": "Dane biometryczne przeglądarki nie są obsługiwane na tym urządzeniu." + "message": "Biometria przeglądarki nie jest obsługiwana na tym urządzeniu." }, "biometricsNotUnlockedTitle": { - "message": "Użytkownik zablokowany lub wylogowany" + "message": "Użytkownik jest zablokowany lub wylogowany" }, "biometricsNotUnlockedDesc": { - "message": "Odblokuj tego użytkownika w aplikacji desktopowej i spróbuj ponownie." + "message": "Odblokuj użytkownika w aplikacji desktopowej i spróbuj ponownie." }, "biometricsNotAvailableTitle": { - "message": "Odblokowanie biometryczne jest niedostępne" + "message": "Odblokowanie biometrią jest niedostępne" }, "biometricsNotAvailableDesc": { - "message": "Odblokowanie biometryczne jest obecnie niedostępne. Spróbuj ponownie później." + "message": "Odblokowanie biometrią jest obecnie niedostępne. Spróbuj ponownie później." }, "biometricsFailedTitle": { - "message": "Dane biometryczne są błędne" + "message": "Logowanie biometrią nie powiodło się" }, "biometricsFailedDesc": { - "message": "Dane biometryczne nie mogę być użyte, rozważ użycie hasła głównego lub wylogowanie. Jeśli się to powtarza, skontaktuj się z pomocą techniczną Bitwarden." + "message": "Weryfikacja biometryczna nie powiodła się. Zaloguj się za pomocą hasła głównego. Jeśli problem się powtarza, skontaktuj się z pomocą techniczną Bitwarden." }, "nativeMessaginPermissionErrorTitle": { "message": "Uprawnienie nie zostało przyznane" @@ -2473,41 +2488,47 @@ "message": "Wystąpił błąd żądania uprawnienia" }, "nativeMessaginPermissionSidebarDesc": { - "message": "Ta operacja nie może zostać wykonana na pasku bocznym. Spróbuj ponownie w nowym oknie." + "message": "Akcji nie można wykonać na pasku bocznym. Otwórz rozszerzenie w oknie." }, "personalOwnershipSubmitError": { - "message": "Ze względu na zasadę przedsiębiorstwa, nie możesz zapisywać elementów w osobistym sejfie. Zmień właściciela elementu na organizację i wybierz jedną z dostępnych kolekcji." + "message": "Ze względu na zasadę organizacji, nie możesz zapisywać elementów w osobistym sejfie. Zmień właściciela elementu na organizację i wybierz jedną z dostępnych kolekcji." }, "personalOwnershipPolicyInEffect": { "message": "Zasada organizacji ma wpływ na opcję własności elementów." }, "personalOwnershipPolicyInEffectImports": { - "message": "Polityka organizacji zablokowała importowanie elementów do Twojego sejfu." + "message": "Zasada organizacji zablokowała importowanie elementów do osobistego sejfu." + }, + "restrictCardTypeImport": { + "message": "Nie można zaimportować karty" + }, + "restrictCardTypeImportDesc": { + "message": "Zasada ustawiona przez co najmniej 1 organizację uniemożliwia importowanie kart do sejfów." }, "domainsTitle": { "message": "Domeny", "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Zablokowane domeny" + "message": "Blokowane domeny" }, "learnMoreAboutBlockedDomains": { - "message": "Dowiedz się więcej o zablokowanych domenach" + "message": "Dowiedz się więcej o blokowanych domenach" }, "excludedDomains": { "message": "Wykluczone domeny" }, "excludedDomainsDesc": { - "message": "Aplikacja Bitwarden nie będzie proponować zapisywania danych logowania dla tych domen. Musisz odświeżyć stronę, aby zastosowywać zmiany." + "message": "Bitwarden nie będzie proponował zapisywania danych logowania dla tych domen. Odśwież stronę, aby zastosowywać zmiany." }, "excludedDomainsDescAlt": { - "message": "Aplikacja Bitwarden nie będzie proponować zapisywania danych logowania dla tych domen dla wszystkich zalogowanych kont. Musisz odświeżyć stronę, aby zastosowywać zmiany." + "message": "Bitwarden nie będzie proponował zapisywania danych logowania dla tych domen dla wszystkich zalogowanych kont. Odśwież stronę, aby zastosowywać zmiany." }, "blockedDomainsDesc": { - "message": "Autouzupełnianie i inne powiązane funkcje nie będą oferowane dla tych stron. Aby zmiany zaczęły obowiązywać, musisz odświeżyć stronę." + "message": "Autouzupełnianie będzie zablokowane dla tych stron internetowych. Zmiany zaczną obowiązywać po odświeżeniu strony." }, "autofillBlockedNoticeV2": { - "message": "Autouzupełnianie jest zablokowane dla tej witryny." + "message": "Autouzupełnianie będzie zablokowane dla tych stron intenretowych." }, "autofillBlockedNoticeGuidance": { "message": "Zmień to w ustawieniach" @@ -2515,6 +2536,10 @@ "change": { "message": "Zmień" }, + "changePassword": { + "message": "Zmień hasło", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Zmień hasło - $ITEMNAME$", "placeholders": { @@ -2524,11 +2549,14 @@ } } }, + "atRiskPassword": { + "message": "Zagrożone hasło" + }, "atRiskPasswords": { "message": "Zagrożone hasła" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ prosi o zmianę jednego hasła, ponieważ jest ono zagrożone.", + "message": "Organizacja $ORGANIZATION$ prosi o zmianę 1 hasła, ponieważ jest ono zagrożone.", "placeholders": { "organization": { "content": "$1", @@ -2537,7 +2565,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ prosi o zmianę $COUNT$ haseł, ponieważ są one zagrożone.", + "message": "Organizacja $ORGANIZATION$ prosi o zmianę $COUNT$ haseł, ponieważ są one zagrożone.", "placeholders": { "organization": { "content": "$1", @@ -2550,7 +2578,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Twoje organizacje proszą o zmianę $COUNT$ haseł, ponieważ są one zagrożone.", + "message": "Twoja organizacja prosi o zmianę $COUNT$ haseł, ponieważ są one zagrożone.", "placeholders": { "count": { "content": "$1", @@ -2558,8 +2586,28 @@ } } }, + "atRiskChangePrompt": { + "message": "Hasło dla tej strony internetowej jest zagrożone. Organizacja $ORGANIZATION$ prosi o jego zmianę.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "Organizacja $ORGANIZATION$ prosi o zmianę hasła, ponieważ jest ono zagrożone. Przejdź do ustawień konta, aby zmienić hasło.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { - "message": "Przejrzyj i zmień jedno zagrożone hasło" + "message": "Sprawdź i zmień 1 zagrożone hasło" }, "reviewAndChangeAtRiskPasswordsPlural": { "message": "Przejrzyj i zmień $COUNT$ zagrożonych haseł ", @@ -2574,43 +2622,43 @@ "message": "Zmień zagrożone hasła szybciej" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Zaktualizuj swoje ustawienia, aby szybko autouzupełniać hasła i generować nowe" + "message": "Zaktualizuj ustawienia, aby szybko uzupełniać hasła i generować nowe." }, "reviewAtRiskLogins": { - "message": "Przejrzyj zagrożone loginy" + "message": "Sprawdź zagrożone dane logowania" }, "reviewAtRiskPasswords": { - "message": "Przejrzyj zagrożone hasła" + "message": "Sprawdź zagrożone hasła" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Twoje hasła organizacji są zagrożone, ponieważ są słabe, ponownie używane i/lub narażone.", + "message": "Hasła w Twojej organizacji są zagrożone, ponieważ są słabe, identyczne lub ujawnione.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { "message": "Ilustracja listy danych logowania, które są zagrożone." }, "generatePasswordSlideDesc": { - "message": "Szybko wygeneruj silne, unikalne hasło z menu autouzupełniania Bitwarden na stronie narażonej na ryzyko.", + "message": "Wygeneruj silne i unikalne hasło dla zagrożonej strony internetowej za pomocą autouzupełniania Bitwarden.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Ilustracja menu autouzupełniania Bitwardena pokazująca wygenerowane hasło." + "message": "Ilustracja menu autouzupełniania Bitwarden pokazująca wygenerowane hasło." }, "updateInBitwarden": { - "message": "Aktualizacja w Bitwarden" + "message": "Zaktualizuj w Bitwarden" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden poprosi Cię o aktualizację hasła w menedżerze haseł.", + "message": "Bitwarden zaproponuje aktualizację hasła w menedżerze haseł.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Ilustracja powiadomienia Bitwardena, skłaniająca użytkownika do zaktualizowania danych logowania." + "message": "Ilustracja powiadomienia Bitwarden, zachęcająca użytkownika do zaktualizowania danych logowania." }, "turnOnAutofill": { - "message": "Włącz autouzupełnienie" + "message": "Włącz autouzupełnianie" }, "turnedOnAutofill": { - "message": "Włączono autouzupełnianie" + "message": "Autouzupełnianie zostało włączone" }, "dismiss": { "message": "Odrzuć" @@ -2625,7 +2673,7 @@ } }, "excludedDomainsInvalidDomain": { - "message": "$DOMAIN$ nie jest prawidłową nazwą domeny", + "message": "Domena $DOMAIN$ nie jest prawidłowa", "placeholders": { "domain": { "content": "$1", @@ -2634,16 +2682,16 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Zmiany w zablokowanych domenach zapisane" + "message": "Blokowane domeny zostały zapisane" }, "excludedDomainsSavedSuccess": { - "message": "Zmiany w wykluczonych domenach zapisane" + "message": "Wykluczone domeny zostały zapisane" }, "limitSendViews": { - "message": "Limit wyświetleń" + "message": "Maksymalna liczba wyświetleń" }, "limitSendViewsHint": { - "message": "Nikt nie może wyświetlić Send po osiągnieciu limitu.", + "message": "Po osiągnięciu limitu wysyłka będzie niedostępna.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { @@ -2657,18 +2705,18 @@ } }, "send": { - "message": "Wyślij", + "message": "Wysyłki", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "Szczegóły Send", + "message": "Szczegóły wysyłki", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { "message": "Tekst" }, "sendTypeTextToShare": { - "message": "Tekst do udostępnienia" + "message": "Tekst wysyłki" }, "sendTypeFile": { "message": "Plik" @@ -2682,13 +2730,13 @@ "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { - "message": "Domyślnie ukryj tekst" + "message": "Ukryj domyślnie tekst wysyłki" }, "expired": { "message": "Wygasła" }, "passwordProtected": { - "message": "Chroniona hasłem" + "message": "Zabezpieczone hasłem" }, "copyLink": { "message": "Kopiuj link" @@ -2715,7 +2763,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { - "message": "Wyłączona" + "message": "Wyłączone" }, "removePasswordConfirmation": { "message": "Czy na pewno chcesz usunąć hasło?" @@ -2725,11 +2773,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Czy na pewno chcesz usunąć tę wysyłkę?", + "message": "Czy na pewno chcesz usunąć wysyłkę?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Czy na pewno chcesz trwale usunąć to Send?", + "message": "Czy na pewno chcesz usunąć trwale wysyłkę?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -2740,7 +2788,7 @@ "message": "Data usunięcia" }, "deletionDateDescV2": { - "message": "Send zostanie trwale usunięte w tej dacie.", + "message": "W tym dniu wysyłka zostanie trwale usunięta.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -2759,10 +2807,10 @@ } }, "custom": { - "message": "Niestandardowe" + "message": "Niestandardowa" }, "sendPasswordDescV3": { - "message": "Zabezpiecz tę wiadomość hasłem, które będzie wymagane, aby uzyskać do niej dostęp.", + "message": "Zabezpiecz wysyłkę opcjonalnym hasłem.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -2777,7 +2825,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Ze względu na zasadę przedsiębiorstwa, tylko Ty możesz usunąć obecną wysyłkę.", + "message": "Ze względu na zasadę organizacji, tylko Ty możesz usunąć obecną wysyłkę.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { @@ -2785,15 +2833,15 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send został stworzony!", + "message": "Wysyłka została utworzona!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { - "message": "Wiadomość będzie dostępna dla każdego z dostępem do tego linku przez następną godzinę.", + "message": "Wysyłka będzie dostępna przez 1 godz.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHours": { - "message": "Wiadomość będzie dostępna dla każdego z dostępem do tego linku przez następne $HOURS$ godzin.", + "message": "Wysyłka będzie dostępna przez $HOURS$ godz.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "hours": { @@ -2803,11 +2851,11 @@ } }, "sendExpiresInDaysSingle": { - "message": "Wiadomość będzie dostępna dla każdego z dostępem do tego linku przez 1 dzień.", + "message": "Wysyłka będzie dostępna przez 1 dzień.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInDays": { - "message": "Wiadomość będzie dostępna dla każdego z dostępem do tego linku przez następne $DAYS$ dni.", + "message": "Wysyłka będzie dostępna przez $DAYS$ dni.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2817,7 +2865,7 @@ } }, "sendLinkCopied": { - "message": "Link Send został skopiowany", + "message": "Link wysyłki został skopiowany", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2825,24 +2873,24 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogText": { - "message": "Otworzyć rozszerzenie w nowym oknie?", + "message": "Otworzyć rozszerzenie w oknie?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { - "message": "Aby utworzyć plik Send, musisz wysunąć rozszerzenie do nowego okna.", + "message": "Otwórz okno rozszerzenia, aby utworzyć wysyłkę pliku.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { - "message": "Aby wybrać plik, otwórz rozszerzenie na pasku bocznym (jeśli to możliwe) lub w nowym oknie." + "message": "Aby wybrać plik, otwórz rozszerzenie na pasku bocznym lub w oknie." }, "sendFirefoxFileWarning": { - "message": "Aby wybrać plik za pomocą przeglądarki Firefox, otwórz rozszerzenie w nowym oknie." + "message": "Aby wybrać plik, otwórz rozszerzenie na pasku bocznym lub w oknie." }, "sendSafariFileWarning": { - "message": "Aby wybrać plik za pomocą przeglądarki Safari, otwórz rozszerzenie w nowym oknie." + "message": "Aby wybrać plik, otwórz rozszerzenie w oknie." }, "popOut": { - "message": "Odepnij" + "message": "Otwórz w nowym oknie" }, "sendFileCalloutHeader": { "message": "Zanim zaczniesz" @@ -2863,7 +2911,7 @@ "message": "Wystąpił błąd podczas zapisywania dat usunięcia i wygaśnięcia." }, "hideYourEmail": { - "message": "Ukryj mój adres e-mail przed oglądającymi." + "message": "Ukryj mój adres e-mail przed odbiorcami." }, "passwordPrompt": { "message": "Potwierdź hasłem głównym" @@ -2872,16 +2920,19 @@ "message": "Potwierdź hasło główne" }, "passwordConfirmationDesc": { - "message": "Ta operacja jest chroniona. Aby kontynuować, wpisz ponownie hasło główne." + "message": "Operacja jest chroniona. Aby kontynuować, wpisz ponownie hasło główne." }, "emailVerificationRequired": { "message": "Weryfikacja adresu e-mail jest wymagana" }, "emailVerifiedV2": { - "message": "E-mail zweryfikowany" + "message": "Adres e-mail został zweryfikowany" }, "emailVerificationRequiredDesc": { - "message": "Musisz zweryfikować adres e-mail, aby korzystać z tej funkcji. Adres możesz zweryfikować w sejfie internetowym." + "message": "Musisz zweryfikować adres e-mail, aby skorzystać z tej funkcji. Adres możesz zweryfikować w sejfie internetowym." + }, + "masterPasswordSuccessfullySet": { + "message": "Hasło główne zostało ustawione" }, "updatedMasterPassword": { "message": "Hasło główne zostało zaktualizowane" @@ -2890,10 +2941,10 @@ "message": "Zaktualizuj hasło główne" }, "updateMasterPasswordWarning": { - "message": "Hasło główne zostało zmienione przez administratora Twojej organizacji. Musisz je zaktualizować, aby uzyskać dostęp do sejfu. Ta czynność spowoduje wylogowanie z bieżącej sesji, przez co konieczne będzie ponowne zalogowanie się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę." + "message": "Hasło główne zostało zmienione przez administratora Twojej organizacji. Aby uzyskać dostęp do sejfu, zaktualizuj hasło główne. Kontynuowanie spowoduje wylogowanie z obecnej sesji i konieczność ponownego zalogowania się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę." }, "updateWeakMasterPasswordWarning": { - "message": "Twoje hasło główne nie spełnia jednej lub kilku zasad organizacji. Aby uzyskać dostęp do sejfu, musisz teraz zaktualizować swoje hasło główne. Kontynuacja wyloguje Cię z bieżącej sesji, wymagając zalogowania się ponownie. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie jedną godzinę." + "message": "Hasło główne nie spełnia co najmniej jednej zasady organizacji. Aby uzyskać dostęp do sejfu, zaktualizuj hasło główne. Kontynuowanie spowoduje wylogowanie z obecnej sesji i konieczność ponownego zalogowania się. Aktywne sesje na innych urządzeniach mogą pozostać aktywne przez maksymalnie godzinę." }, "tdeDisabledMasterPasswordRequired": { "message": "Twoja organizacja wyłączyła szyfrowanie zaufanego urządzenia. Ustaw hasło główne, aby uzyskać dostęp do sejfu." @@ -2902,7 +2953,7 @@ "message": "Automatyczne rejestrowanie użytkowników" }, "resetPasswordAutoEnrollInviteWarning": { - "message": "Ta organizacja posługuje się zasadą, która automatycznie rejestruje użytkowników do resetowania hasła. Rejestracja umożliwia administratorom organizacji zmianę Twojego hasła głównego." + "message": "Zasada organizacji umożliwia administratorom organizacji zmianę Twojego hasła głównego." }, "selectFolder": { "message": "Wybierz folder..." @@ -2912,7 +2963,7 @@ "description": "Used as a message within the notification bar when no folders are found" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "Uprawnienia w Twojej organizacji zostały zaktualizowane, musisz teraz ustawić hasło główne.", + "message": "Uprawnienia organizacji zostały zaktualizowane. Ustaw hasło główne.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { @@ -2920,7 +2971,7 @@ "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "z $TOTAL$ elementów", + "message": "z $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -2929,7 +2980,7 @@ } }, "verificationRequired": { - "message": "Wymagana weryfikacja", + "message": "Weryfikacja jest wymagana", "description": "Default title for the user verification dialog." }, "hours": { @@ -2939,10 +2990,10 @@ "message": "Minuty" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Wymagania polityki przedsiębiorstwa zostały zastosowane do twoich opcji przekrocznia limitu czasu" + "message": "Zasady organizacji zostały zastosowane do opcji blokowania sejfu" }, "vaultTimeoutPolicyInEffect": { - "message": "Zasady organizacji mają wpływ czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min.", + "message": "Zasady organizacji mają wpływ na czas blokowania sejfu. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min.", "placeholders": { "hours": { "content": "$1", @@ -2955,7 +3006,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ godzin(y) i $MINUTES$ minut(y) maksymalnie.", + "message": "Maksymalnie $HOURS$ godz. i $MINUTES$ min.", "placeholders": { "hours": { "content": "$1", @@ -2968,7 +3019,7 @@ } }, "vaultTimeoutPolicyMaximumError": { - "message": "Limit czasu przekracza ograniczenie ustawione przez Twoją organizację: $HOURS$ godzin(y) i $MINUTES$ minut(y) maksymalnie", + "message": "Czas blokowania sejfu przekracza zasady organizacji. Maksymalny dozwolony czas wynosi $HOURS$ godz. i $MINUTES$ min.", "placeholders": { "hours": { "content": "$1", @@ -2998,7 +3049,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Zasady organizacji ustawiły czas blokowania sejfu na $ACTION$.", + "message": "Zasady organizacji wymuszają sposób blokowania sejfu na $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -3007,7 +3058,7 @@ } }, "vaultTimeoutTooLarge": { - "message": "Czas blokowania sejfu przekracza limit określony przez organizację." + "message": "Czas blokowania aplikacji przekracza limit określony przez organizację." }, "vaultExportDisabled": { "message": "Eksportowanie sejfu jest niedostępne" @@ -3016,19 +3067,19 @@ "message": "Co najmniej jedna zasada organizacji uniemożliwia wyeksportowanie osobistego sejfu." }, "copyCustomFieldNameInvalidElement": { - "message": "Nie można zidentyfikować poprawnego elementu formularza. Spróbuj sprawdzić kod HTML." + "message": "Nie można zidentyfikować prawidłowego elementu formularza. Sprawdź kod HTML." }, "copyCustomFieldNameNotUnique": { "message": "Nie znaleziono unikatowego identyfikatora." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "Hasło główne nie jest już wymagane dla członków następującej organizacji. Proszę potwierdzić poniższą domenę u administratora organizacji." + "message": "Hasło główne nie jest już wymagane dla członków następującej organizacji. Potwierdź poniższą domenę z administratorem organizacji." }, "organizationName": { "message": "Nazwa organizacji" }, "keyConnectorDomain": { - "message": "Domena Key Connector'a" + "message": "Domena Key Connector" }, "leaveOrganization": { "message": "Opuść organizację" @@ -3040,13 +3091,13 @@ "message": "Hasło główne zostało usunięte" }, "leaveOrganizationConfirmation": { - "message": "Czy na pewno chcesz opuścić tę organizację?" + "message": "Czy na pewno chcesz opuścić organizację?" }, "leftOrganization": { - "message": "Nie należysz już do tej organizacji." + "message": "Opuszczono organizację." }, "toggleCharacterCount": { - "message": "Pokaż / Ukryj licznik znaków" + "message": "Pokaż / ukryj licznik znaków" }, "sessionTimeout": { "message": "Twoja sesja wygasła. Zaloguj się ponownie." @@ -3055,7 +3106,7 @@ "message": "Eksportowanie osobistego sejfu" }, "exportingIndividualVaultDescription": { - "message": "Z sejfu zostaną wyeksportowane tylko elementy powiązane z $EMAIL$. Elementy z sejfu organizacji nie będą uwzględnione. Tylko informacje o elemencie zostaną wyeksportowane i nie będą zawierać powiązanych załączników.", + "message": "Wyeksportowane zostaną tylko osobiste elementy konta $EMAIL$. Elementy organizacji nie zostaną uwzględnione. Wyeksportowane zostaną tylko informacje o elementach sejfu i nie będą one zawierać powiązanych załączników.", "placeholders": { "email": { "content": "$1", @@ -3064,7 +3115,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Tylko poszczególne elementy sejfu łącznie z załącznikami powiązanymi z $EMAIL$ zostaną wyeksportowane. Elementy sejfu organizacji nie będą dołączone", + "message": "Tylko osobisty sejf $EMAIL$ zostanie wyeksportowany. Elementy organizacji nie zostaną uwzględnione.", "placeholders": { "email": { "content": "$1", @@ -3076,7 +3127,7 @@ "message": "Eksportowanie sejfu organizacji" }, "exportingOrganizationVaultDesc": { - "message": "Tylko sejf organizacji powiązany z $ORGANIZATION$ zostanie wyeksportowany. Pozycje w poszczególnych sejfach lub innych organizacji nie będą uwzględnione.", + "message": "Tylko sejf organizacji $ORGANIZATION$ zostanie wyeksportowany. Elementy innych sejfów nie zostaną uwzględnione.", "placeholders": { "organization": { "content": "$1", @@ -3091,21 +3142,21 @@ "message": "Błąd odszyfrowywania" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden nie mógł odszyfrować elementów sejfu wymienionych poniżej." + "message": "Bitwarden nie mógł odszyfrować poniższych elementów sejfu." }, "contactCSToAvoidDataLossPart1": { "message": "Skontaktuj się z działem obsługi klienta,", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "aby uniknąć dalszej utraty danych.", + "message": "aby uniknąć dodatkowej utraty danych.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { "message": "Wygeneruj nazwę użytkownika" }, "generateEmail": { - "message": "Wygeneruj e-mail" + "message": "Wygeneruj adres e-mail" }, "spinboxBoundariesHint": { "message": "Wartość musi być pomiędzy $MIN$ a $MAX$.", @@ -3122,7 +3173,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Użyj $RECOMMENDED$ znaków lub więcej, aby wygenerować silne hasło.", + "message": "Użyj co najmniej $RECOMMENDED$ znaków, aby utworzyć silne hasło.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3132,7 +3183,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Użyj $RECOMMENDED$ słów lub więcej, aby wygenerować silne hasło.", + "message": "Użyj co najmniej $RECOMMENDED$ słów, aby wygenerować silne hasło wyrazowe.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3155,13 +3206,13 @@ "message": "Użyj skonfigurowanej skrzynki catch-all w swojej domenie." }, "random": { - "message": "Losowa" + "message": "Losowe" }, "randomWord": { "message": "Losowe słowo" }, "websiteName": { - "message": "Nazwa strony" + "message": "Nazwa strony internetowej" }, "service": { "message": "Usługa" @@ -3170,7 +3221,7 @@ "message": "Alias przekierowania" }, "forwardedEmailDesc": { - "message": "Wygeneruj alias adresu e-mail z zewnętrznej usługi przekierowania." + "message": "Wygeneruj alias za pomocą zewnętrznej usługi." }, "forwarderDomainName": { "message": "Domena adresu e-mail", @@ -3195,7 +3246,7 @@ } }, "forwarderGeneratedBy": { - "message": "Wygenerowane przez Bitwarden.", + "message": "Wygenerowano przez Bitwarden.", "description": "Displayed with the address on the forwarding service's configuration screen." }, "forwarderGeneratedByWithWebsite": { @@ -3209,7 +3260,7 @@ } }, "forwaderInvalidToken": { - "message": "Nieprawidłowy token API dla $SERVICENAME$", + "message": "Token API $SERVICENAME$ jest nieprawidłowy", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -3219,7 +3270,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Nieprawidłowy token API dla $SERVICENAME$, błąd: $ERRORMESSAGE$", + "message": "Token API $SERVICENAME$ jest nieprawidłowy: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3233,7 +3284,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ odrzucił Twoje żądanie. Skontaktuj się z dostawcą usług w celu uzyskania pomocy.", + "message": "$SERVICENAME$ odrzucił żądanie. Skontaktuj się z dostawcą usługi w celu uzyskania pomocy.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3243,7 +3294,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ odrzucił Twoje żądanie: $ERRORMESSAGE$", + "message": "$SERVICENAME$ odrzucił żądanie: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3257,7 +3308,7 @@ } }, "forwarderNoAccountId": { - "message": "Nie można uzyskać ID maskowanego konta e-mail dla $SERVICENAME$.", + "message": "Nie można uzyskać identyfikatora konta e-mail $SERVICENAME$.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -3267,7 +3318,7 @@ } }, "forwarderNoDomain": { - "message": "Nieprawidłowa domena $SERVICENAME$.", + "message": "Domena $SERVICENAME$ jest nieprawidłowa.", "description": "Displayed when the domain is empty or domain authorization failed at the forwarding service.", "placeholders": { "servicename": { @@ -3277,7 +3328,7 @@ } }, "forwarderNoUrl": { - "message": "Nieprawidłowy adres URL $SERVICENAME$.", + "message": "Adres URL $SERVICENAME$ jest nieprawidłowy.", "description": "Displayed when the url of the forwarding service wasn't supplied.", "placeholders": { "servicename": { @@ -3287,7 +3338,7 @@ } }, "forwarderUnknownError": { - "message": "Wystąpił nieznany błąd w $SERVICENAME$.", + "message": "Wystąpił nieznany błąd $SERVICENAME$.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -3297,7 +3348,7 @@ } }, "forwarderUnknownForwarder": { - "message": "Nieznana usługa przekierowania: '$SERVICENAME$'.", + "message": "Usługa „$SERVICENAME$” jest nieznana.", "description": "Displayed when the forwarding service is not supported.", "placeholders": { "servicename": { @@ -3317,10 +3368,10 @@ "message": "Klucz API" }, "ssoKeyConnectorError": { - "message": "Błąd serwera Key Connector: upewnij się, że serwer Key Connector jest dostępny i działa poprawnie." + "message": "Wystąpił błąd serwera Key Connector. Upewnij się, że serwer jest dostępny i działa poprawnie." }, "premiumSubcriptionRequired": { - "message": "Wymagana jest subskrypcja Premium" + "message": "Wymagana jest subskrypcja premium" }, "organizationIsDisabled": { "message": "Organizacja została zawieszona." @@ -3329,7 +3380,7 @@ "message": "Nie można uzyskać dostępu do elementów w zawieszonych organizacjach. Skontaktuj się z właścicielem organizacji, aby uzyskać pomoc." }, "loggingInTo": { - "message": "Logowanie do $DOMAIN$", + "message": "Logowanie na $DOMAIN$", "placeholders": { "domain": { "content": "$1", @@ -3347,7 +3398,7 @@ "message": "Inny dostawca" }, "thirdPartyServerMessage": { - "message": "Połączono z implementacją serwera innego dostawcy, $SERVERNAME$. Zweryfikuj błędy za pomocą oficjalnego serwera lub zgłoś je serwerowi innego dostawcy.", + "message": "Połączono z implementacją serwera innego dostawcy $SERVERNAME$. Zweryfikuj błędy za pomocą oficjalnego serwera lub zgłoś je serwerowi.", "placeholders": { "servername": { "content": "$1", @@ -3380,7 +3431,7 @@ "message": "Unikalny identyfikator konta" }, "fingerprintMatchInfo": { - "message": "Upewnij się, że sejf jest odblokowany, a unikalny identyfikator konta pasuje do drugiego urządzenia." + "message": "Upewnij się, że sejf jest odblokowany, a identyfikator pasuje do drugiego urządzenia." }, "resendNotification": { "message": "Wyślij ponownie powiadomienie" @@ -3392,49 +3443,74 @@ "message": "Powiadomienie zostało wysłane na urządzenie." }, "notificationSentDevicePart1": { - "message": "Odblokuj Bitwarden na swoim urządzeniu lub w" + "message": "Odblokuj Bitwarden na urządzeniu lub w" }, "notificationSentDeviceAnchor": { "message": "aplikacji internetowej" }, "notificationSentDevicePart2": { - "message": "Upewnij się, że fraza odcisku palca zgadza się z tą poniżej, zanim zatwierdzisz." + "message": "Upewnij się, że identyfikator jest zgodny." }, "aNotificationWasSentToYourDevice": { - "message": "Powiadomienie zostało wysłane na twoje urządzenie" + "message": "Powiadomienie zostało wysłane na urządzenie" }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "Zostaniesz powiadomiony po zatwierdzeniu prośby" + "message": "Zostaniesz powiadomiony po potwierdzeniu" }, "needAnotherOptionV1": { - "message": "Potrzebujesz innego sposobu?" + "message": "Potrzebujesz innej opcji?" }, "loginInitiated": { "message": "Logowanie rozpoczęte" }, "logInRequestSent": { - "message": "Żądanie wysłane" + "message": "Prośba została wysłana" + }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Logowanie potwierdzone dla $EMAIL$ na $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Odrzucono próby logowania z innego urządzenia. Jeśli to naprawdę Ty, spróbuj ponownie zalogować się za pomocą urządzenia." + }, + "device": { + "message": "Urządzenie" + }, + "loginStatus": { + "message": "Status logowania" + }, + "masterPasswordChanged": { + "message": "Hasło główne zostało zapisane" }, "exposedMasterPassword": { - "message": "Ujawnione hasło główne" + "message": "Hasło główne zostało ujawnione" }, "exposedMasterPasswordDesc": { - "message": "Hasło ujawnione w wyniku naruszenia ochrony danych. Użyj unikalnego hasła, aby chronić swoje konto. Czy na pewno chcesz użyć ujawnionego hasła?" + "message": "Hasło zostało ujawnione w wycieku danych. Użyj unikalnego hasła, aby chronić konto. Czy na pewno chcesz użyć ujawnionego hasła?" }, "weakAndExposedMasterPassword": { - "message": "Słabe i ujawnione hasło główne" + "message": "Hasło główne jest słabe i ujawnione" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Słabe hasło ujawnione w wyniku naruszenia ochrony danych. Użyj silnego i unikalnego hasła, aby chronić swoje konto. Czy na pewno chcesz użyć tego hasła?" + "message": "Hasło jest słabe i zostało ujawnione w wycieku danych. Użyj mocnego i unikalnego hasła, aby chronić konto. Czy na pewno chcesz użyć tego hasła?" }, "checkForBreaches": { - "message": "Sprawdź znane naruszenia ochrony danych tego hasła" + "message": "Sprawdź hasło w znanych wyciekach danych" }, "important": { "message": "Ważne:" }, "masterPasswordHint": { - "message": "Twoje hasło główne nie może zostać odzyskane, jeśli je zapomnisz!" + "message": "Zapomniane hasło główne nie może zostać odzyskane!" }, "characterMinimum": { "message": "Minimum znaków: $LENGTH$", @@ -3446,13 +3522,13 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Twoja organizacja włączyła autouzupełnianie podczas wczytywania strony." + "message": "Twoja organizacja włączyła autouzupełnianie po załadowaniu strony." }, "howToAutofill": { - "message": "Jak autouzupełniać" + "message": "Jak uzupełniać dane" }, "autofillSelectInfoWithCommand": { - "message": "Wybierz element z tego ekranu, użyj skrótu $COMMAND$ lub zobacz inne opcje w ustawieniach.", + "message": "Wybierz element, użyj skrótu $COMMAND$ lub zobacz inne opcje w ustawieniach.", "placeholders": { "command": { "content": "$1", @@ -3461,10 +3537,10 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Wybierz element z tego ekranu lub zobacz inne opcje w ustawieniach." + "message": "Wybierz element lub zobacz inne opcje w ustawieniach." }, "gotIt": { - "message": "Rozumiem" + "message": "Ok" }, "autofillSettings": { "message": "Ustawienia autouzupełniania" @@ -3479,13 +3555,13 @@ "message": "Zarządzaj skrótami" }, "autofillShortcut": { - "message": "Skrót klawiaturowy autouzupełniania" + "message": "Skrót klawiszowy autouzupełniania" }, "autofillLoginShortcutNotSet": { "message": "Skrót autouzupełniania nie jest ustawiony. Zmień to w ustawieniach przeglądarki." }, "autofillLoginShortcutText": { - "message": "Skrót autouzupełniania to: $COMMAND$. Zmień to w ustawieniach przeglądarki.", + "message": "Skrót autouzupełniania to $COMMAND$. Zmień skróty w ustawieniach przeglądarki.", "placeholders": { "command": { "content": "$1", @@ -3506,28 +3582,122 @@ "message": "Otwiera w nowym oknie" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Zapamiętaj to urządzenie, aby przyszłe logowania były bezproblemowe" + "message": "Zapamiętaj urządzenie, aby przyszłe logowania były bezproblemowe" + }, + "manageDevices": { + "message": "Zarządzaj urządzeniami" + }, + "currentSession": { + "message": "Obecna sesja" + }, + "mobile": { + "message": "Telefon", + "description": "Mobile app" + }, + "extension": { + "message": "Rozszerzenie", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Komputer", + "description": "Desktop app" + }, + "webVault": { + "message": "Sejf internetowy" + }, + "webApp": { + "message": "Aplikacja internetowa" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Oczekująca prośba" + }, + "firstLogin": { + "message": "Pierwsze logowanie" + }, + "trusted": { + "message": "Zaufane" + }, + "needsApproval": { + "message": "Potwierdzenie jest wymagane" + }, + "devices": { + "message": "Urządzenia" + }, + "accessAttemptBy": { + "message": "Próba dostępu przez $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potwierdź dostęp" + }, + "denyAccess": { + "message": "Odmów dostępu" + }, + "time": { + "message": "Czas" + }, + "deviceType": { + "message": "Rodzaj urządzenia" + }, + "loginRequest": { + "message": "Prośba logowania" + }, + "thisRequestIsNoLongerValid": { + "message": "Prośba nie jest już ważna." + }, + "loginRequestHasAlreadyExpired": { + "message": "Prośba logowania wygasła." + }, + "justNow": { + "message": "Teraz" + }, + "requestedXMinutesAgo": { + "message": "$MINUTES$ min temu", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } }, "deviceApprovalRequired": { - "message": "Wymagane zatwierdzenie urządzenia. Wybierz opcję zatwierdzenia poniżej:" + "message": "Potwierdzenie urządzenia jest wymagane. Wybierz opcję:" }, "deviceApprovalRequiredV2": { - "message": "Wymagane zatwierdzenie urządzenia" + "message": "Potwierdzenie urządzenia jest wymagane" }, "selectAnApprovalOptionBelow": { - "message": "Wybierz opcję zatwierdzenia poniżej" + "message": "Wybierz opcję potwierdzenia" }, "rememberThisDevice": { - "message": "Zapamiętaj to urządzenie" + "message": "Zapamiętaj urządzenie" }, "uncheckIfPublicDevice": { - "message": "Odznacz, jeśli używasz publicznego urządzenia" + "message": "Wyłącz na obcych urządzeniach" }, "approveFromYourOtherDevice": { - "message": "Zatwierdź z innego twojego urządzenia" + "message": "Potwierdź za pomocą innego urządzenia" }, "requestAdminApproval": { - "message": "Poproś administratora o zatwierdzenie" + "message": "Poproś administratora o potwierdzenie" + }, + "unableToCompleteLogin": { + "message": "Logowanie nie powiodło się" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Musisz zalogować się na zaufanym urządzeniu lub poprosić administratora o przypisanie hasła." }, "ssoIdentifierRequired": { "message": "Identyfikator organizacji jest wymagany." @@ -3539,26 +3709,26 @@ "message": "Sprawdź swoją pocztę e-mail" }, "followTheLinkInTheEmailSentTo": { - "message": "Kliknij łącze w wiadomości e-mail wysłanej do" + "message": "Kliknij link w wiadomości wysłanej na adres" }, "andContinueCreatingYourAccount": { "message": "i kontynuuj tworzenie konta." }, "noEmail": { - "message": "Brak wiadomości e-mail?" + "message": "Brak wiadomości?" }, "goBack": { "message": "Wróć" }, "toEditYourEmailAddress": { - "message": "aby edytować swój adres e-mail." + "message": ", aby edytować adres e-mail." }, "eu": { "message": "UE", "description": "European Union" }, "accessDenied": { - "message": "Odmowa dostępu. Nie masz uprawnień do przeglądania tej strony." + "message": "Odmowa dostępu. Nie masz uprawnień do wyświetlenia tej strony." }, "general": { "message": "Ogólne" @@ -3567,19 +3737,19 @@ "message": "Wyświetl" }, "accountSuccessfullyCreated": { - "message": "Konto pomyślnie utworzone!" + "message": "Konto zostało utworzone!" }, "adminApprovalRequested": { - "message": "Poproszono administratora o zatwierdzenie" + "message": "Poproszono administratora o potwierdzenie" }, "adminApprovalRequestSentToAdmins": { - "message": "Twoja prośba została wysłana do Twojego administratora." + "message": "Prośba została wysłana do administratora." }, "troubleLoggingIn": { - "message": "Problem z zalogowaniem?" + "message": "Problem z logowaniem?" }, "loginApproved": { - "message": "Logowanie zatwierdzone" + "message": "Logowanie zostało potwierdzone" }, "userEmailMissing": { "message": "Brak adresu e-mail użytkownika" @@ -3588,7 +3758,7 @@ "message": "Nie znaleziono aktywnego adresu e-mail. Trwa wylogowanie." }, "deviceTrusted": { - "message": "Zaufano urządzeniu" + "message": "Urządzenie zostało zaufane" }, "trustOrganization": { "message": "Zaufaj organizacji" @@ -3606,28 +3776,20 @@ "message": "Dla bezpieczeństwa Twojego konta potwierdź tylko, jeśli przyznano temu użytkownikowi dostęp awaryjny i jego odcisk palca pasuje do tego, co widnieje na jego koncie" }, "orgTrustWarning": { - "message": "Dla zapewnienia bezpieczeństwa konta kontynuuj tylko wtedy, gdy jesteś członkiem tej organizacji, włączono odzyskiwanie konta, a odcisk palca wyświetlany poniżej pasuje do odcisku palca organizacji." + "message": "Kontynuuj tylko wtedy, gdy jesteś członkiem organizacji, masz włączone odzyskiwanie konta, a unikalny identyfikator pasuje do organizacji." }, "orgTrustWarning1": { - "message": "Polityka korporacyjna tej organizacji umożliwia zapisanie Cię do programu odzyskiwania kont. Rejestracja umożliwi administratorom organizacji zmianę Twojego hasła. Możesz kontynuować tylko wtedy, gdy znasz tę organizację, a odcisk palca pokazany poniżej pasuje do odcisku palca tej organizacji." + "message": "Zasada organizacji pozwala administratorom organizacji na zmianę Twojego hasła. Kontynuuj tylko wtedy, gdy rozpoznajesz organizację, a unikalny identyfikator pasuje do organizacji." }, "trustUser": { "message": "Zaufaj użytkownikowi" }, - "sendsNoItemsTitle": { - "message": "Brak aktywnych wysyłek", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Użyj wysyłki, aby bezpiecznie dzielić się zaszyfrowanymi informacjami ze wszystkimi.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { - "message": "Wysyłaj bezpiecznie poufne informacje", + "message": "Wysyłaj poufne informacje w bezpieczny sposób", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Udostępniaj pliki i dane bezpiecznie każdemu, na każdej platformie. Twoje dane pozostaną zaszyfrowane end-to-end przy jednoczesnym ograniczeniu narażenia.", + "message": "Udostępniaj pliki i teksty każdemu na dowolnej platformie. Informacje będę szyfrowane end-to-end, zapewniając poufność.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3640,7 +3802,7 @@ "message": "Szukaj" }, "inputMinLength": { - "message": "Dane wejściowe muszą zawierać co najmniej $COUNT$ znaki(-ów).", + "message": "Dane wejściowe muszą składać się z co najmniej $COUNT$ znaków.", "placeholders": { "count": { "content": "$1", @@ -3685,17 +3847,17 @@ } }, "multipleInputEmails": { - "message": "Co najmniej 1 e-mail jest nieprawidłowy" + "message": "Co najmniej 1 adres e-mail jest nieprawidłowy" }, "inputTrimValidator": { "message": "Tekst nie może zawierać tylko spacji.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Dane wejściowe nie są adresem e-mail." + "message": "To nie jest adres e-mail." }, "fieldsNeedAttention": { - "message": "Pola powyżej wymagające Twojej uwagi: $COUNT$.", + "message": "Pola wymagające uwagi: $COUNT$.", "placeholders": { "count": { "content": "$1", @@ -3704,10 +3866,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 pole wymaga Twojej uwagi." + "message": "1 pole wymaga uwagi." }, "multipleFieldsNeedAttention": { - "message": "Pola wymagające Twojej uwagi: $COUNT$.", + "message": "Pola wymagające uwagi: $COUNT$.", "placeholders": { "count": { "content": "$1", @@ -3725,7 +3887,7 @@ "message": "Pobieranie opcji..." }, "multiSelectNotFound": { - "message": "Nie znaleziono żadnych pozycji" + "message": "Nie znaleziono elementów" }, "multiSelectClearAll": { "message": "Wyczyść wszystko" @@ -3754,7 +3916,7 @@ "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { - "message": "Automatyczne wypełnianie przy wczytywaniu strony zostało ustawione, aby używać ustawień domyślnych.", + "message": "Autouzupełnianie po załadowaniu strony zostało ustawione do domyślnych ustawień.", "description": "Toast message for informing the user that autofill on page load has been set to the default setting." }, "turnOffMasterPasswordPromptToEditField": { @@ -3765,7 +3927,7 @@ "message": "Przełącz nawigację boczną" }, "skipToContent": { - "message": "Przejdź do treści" + "message": "Przejdź do zawartości" }, "bitwardenOverlayButton": { "message": "Przycisk menu autouzupełniania Bitwarden", @@ -3780,11 +3942,11 @@ "description": "Page title in overlay" }, "unlockYourAccountToViewMatchingLogins": { - "message": "Odblokuj swoje konto, aby wyświetlić pasujące elementy", + "message": "Odblokuj konto, aby zobaczy pasujące dane logowania", "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { - "message": "Odblokuj swoje konto, aby zobaczyć sugestie autouzupełniania", + "message": "Odblokuj konto, aby zobaczyć sugestie autouzupełniania", "description": "Text to display in overlay when the account is locked." }, "unlockAccount": { @@ -3792,19 +3954,19 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Odblokuj swoje konto, otwiera się w nowym oknie", + "message": "Odblokuj konto, otwiera się w nowym oknie", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { - "message": "Kod weryfikacyjny jednorazowego hasła oparty na czasie", + "message": "Kod weryfikacyjny TOTP", "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { - "message": "Pozostały czas do wygaśnięcia bieżącego TOTP", + "message": "Pozostały czas do wygaśnięcia kodu TOTP", "description": "Aria label for the totp seconds displayed in the inline menu for autofill" }, "fillCredentialsFor": { - "message": "Wypełnij dane logowania dla", + "message": "Uzupełnij dane logowania dla", "description": "Screen reader text for when overlay item is in focused" }, "partialUsername": { @@ -3828,7 +3990,7 @@ "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Dodaj nowe dane logowania do sejfu, otwiera się w nowym oknie", + "message": "Dodaj nowe dane logowania, otwiera się w nowym oknie", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -3836,7 +3998,7 @@ "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Dodaj nową kartę do sejfu, otwiera się w nowym oknie", + "message": "Dodaj nową kartę, otwiera się w nowym oknie", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { @@ -3844,11 +4006,11 @@ "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { - "message": "Dodaj nową tożsamość do sejfu, otwiera się w nowym oknie", + "message": "Dodaj nową tożsamość, otwiera się w nowym oknie", "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { - "message": "Dostępne menu autouzupełniania Bitwarden. Naciśnij przycisk strzałki w dół, aby wybrać.", + "message": "Dostępne menu autouzupełniania Bitwarden. Kliknij strzałkę w dół, aby wybrać.", "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { @@ -3862,10 +4024,10 @@ "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" }, "importError": { - "message": "Błąd importu" + "message": "Błąd importowania" }, "importErrorDesc": { - "message": "Wystąpił problem z danymi, które chcesz zaimportować. Rozwiąż poniższe problemy w Twoim pliku i spróbuj ponownie." + "message": "Wystąpił problem podczas importowania danych. Usuń poniższe błędy w pliku źródłowym i spróbuj ponownie." }, "resolveTheErrorsBelowAndTryAgain": { "message": "Rozwiąż poniższe błędy i spróbuj ponownie." @@ -3874,7 +4036,7 @@ "message": "Opis" }, "importSuccess": { - "message": "Importowanie danych zakończone sukcesem" + "message": "Dane zostały zaimportowane" }, "importSuccessNumberOfItems": { "message": "Zaimportowano elementów: $AMOUNT$.", @@ -3892,16 +4054,16 @@ "message": "Weryfikacja dla tej akcji jest wymagana. Ustaw kod PIN, aby kontynuować." }, "setPin": { - "message": "Ustaw PIN" + "message": "Ustaw kod PIN" }, "verifyWithBiometrics": { - "message": "Weryfikuj za pomocą biometrii" + "message": "Zweryfikuj biometrią" }, "awaitingConfirmation": { "message": "Oczekiwanie na potwierdzenie" }, "couldNotCompleteBiometrics": { - "message": "Nie można ukończyć z użyciem biometrii." + "message": "Logowanie biometrią nie powiodło się" }, "needADifferentMethod": { "message": "Potrzebujesz innej metody?" @@ -3910,16 +4072,16 @@ "message": "Użyj hasła głównego" }, "usePin": { - "message": "Użyj PINu" + "message": "Użyj kodu PIN" }, "useBiometrics": { "message": "Użyj biometrii" }, "enterVerificationCodeSentToEmail": { - "message": "Wpisz kod weryfikacyjny, który został wysłany na adres e-mail." + "message": "Wpisz kod weryfikacyjny wysłany na adres e-mail." }, "resendCode": { - "message": "Wysłać kod ponownie" + "message": "Wyślij ponownie kod" }, "total": { "message": "Łącznie" @@ -3934,19 +4096,19 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Wystąpił błąd podczas połączenia z usługą Duo. Aby uzyskać pomoc, użyj innej metody dwustopniowego logowania lub skontaktuj się z Duo." + "message": "Wystąpił błąd podczas połączenia z usługą Duo. Użyj innej metody logowania dwustopniowego lub skontaktuj się z Duo w celu uzyskania pomocy." }, "duoRequiredForAccount": { - "message": "Dwustopniowe logowanie Duo jest wymagane dla Twojego konta." + "message": "Konto wymaga logowania dwustopniowego Duo." }, "popoutExtension": { - "message": "Otwórz rozszerzenie w nowym oknie" + "message": "Otwórz rozszerzenie w oknie" }, "launchDuo": { - "message": "Uruchom DUO" + "message": "Uruchom Duo" }, "importFormatError": { - "message": "Dane nie są poprawnie sformatowane. Sprawdź importowany plik i spróbuj ponownie." + "message": "Dane nie są prawidłowo sformatowane. Sprawdź plik i spróbuj ponownie." }, "importNothingError": { "message": "Nic nie zostało zaimportowane." @@ -3955,7 +4117,7 @@ "message": "Wystąpił błąd podczas odszyfrowywania pliku. Klucz szyfrowania nie pasuje do klucza użytego podczas eksportowania danych." }, "invalidFilePassword": { - "message": "Hasło do pliku jest nieprawidłowe. Użyj hasła które podano przy tworzeniu pliku eksportu." + "message": "Hasło pliku jest nieprawidłowe. Użyj prawidłowego hasła." }, "destination": { "message": "Miejsce docelowe" @@ -3970,7 +4132,7 @@ "message": "Wybierz kolekcję" }, "importTargetHint": { - "message": "Wybierz tę opcję, jeśli chcesz, aby zawartość zaimportowanego pliku została przeniesiona do $DESTINATION$", + "message": "Wybierz tę opcję, jeśli chcesz przenieść dane do $DESTINATION$", "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", "placeholders": { "destination": { @@ -3995,7 +4157,7 @@ "message": "Nie wybrano pliku" }, "orCopyPasteFileContents": { - "message": "lub skopiuj/wklej treść pliku" + "message": "lub wklej zawartość pliku" }, "instructionsFor": { "message": "Instrukcja dla $NAME$", @@ -4011,7 +4173,7 @@ "message": "Potwierdź importowanie sejfu" }, "confirmVaultImportDesc": { - "message": "Plik jest chroniony hasłem. Wprowadź hasło pliku, aby zaimportować dane." + "message": "Plik jest chroniony hasłem. Wpisz hasło pliku, aby zaimportować dane." }, "confirmFilePassword": { "message": "Potwierdź hasło pliku" @@ -4023,7 +4185,7 @@ "message": "Klucz dostępu" }, "accessing": { - "message": "Uzyskiwanie dostępu" + "message": "Logowanie na" }, "loggedInExclamation": { "message": "Zalogowano!" @@ -4032,28 +4194,28 @@ "message": "Klucz dostępu nie zostanie skopiowany" }, "passkeyNotCopiedAlert": { - "message": "Klucz dostępu nie zostanie skopiowany do sklonowanego elementu. Czy chcesz kontynuować klonowanie tego elementu?" + "message": "Klucz dostępu nie zostanie skopiowany do sklonowanego elementu. Czy chcesz kontynuować klonowanie elementu?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "message": "Weryfikacja jest wymagana przez stronę inicjującą. Ta funkcja nie jest jeszcze zaimplementowana dla kont bez hasła głównego." }, "logInWithPasskeyQuestion": { - "message": "Zalogować za pomocą klucza dostępu?" + "message": "Zalogować się kluczem dostępu?" }, "passkeyAlreadyExists": { - "message": "Klucz dostępu już istnieje dla tej aplikacji." + "message": "Klucz dostępu dla tej aplikacji już istnieje." }, "noPasskeysFoundForThisApplication": { "message": "Nie znaleziono klucza dostępu dla tej aplikacji." }, "noMatchingPasskeyLogin": { - "message": "Nie masz pasujących danych logowania do tej witryny." + "message": "Brak pasujących danych logowania do tej strony." }, "noMatchingLoginsForSite": { - "message": "Brak pasujących loginów dla tej witryny" + "message": "Brak pasujących danych logowania dla tej strony" }, "searchSavePasskeyNewLogin": { - "message": "Wyszukaj albo zapisz klucz dostępu jako nowy login" + "message": "Wyszukaj albo zapisz klucz dostępu jako nowe dane logowania" }, "confirm": { "message": "Potwierdź" @@ -4068,7 +4230,7 @@ "message": "Wybierz dane logowania, do których przypisać klucz dostępu" }, "chooseCipherForPasskeyAuth": { - "message": "Wybierz klucz dostępu, żeby się zalogować" + "message": "Wybierz klucz dostępu" }, "passkeyItem": { "message": "Element klucza dostępu" @@ -4077,52 +4239,52 @@ "message": "Zastąpić klucz dostępu?" }, "overwritePasskeyAlert": { - "message": "Ten element zawiera już klucz dostępu. Czy na pewno chcesz nadpisać bieżący klucza dostępu?" + "message": "Element zawiera już klucz dostępu. Czy na pewno chcesz zastąpić obecny klucz dostępu?" }, "featureNotSupported": { "message": "Funkcja nie jest jeszcze obsługiwana" }, "yourPasskeyIsLocked": { - "message": "Wymagane uwierzytelnienie, aby używać klucza dostępu. Sprawdź swoją tożsamość, aby kontynuować." + "message": "Aby użyć klucza dostępu, wymagane jest uwierzytelnienie. Zweryfikuj swoją tożsamość." }, "multifactorAuthenticationCancelled": { - "message": "Uwierzytelnianie wieloskładnikowe zostało anulowane" + "message": "Logowanie dwustopniowe zostało anulowane" }, "noLastPassDataFound": { "message": "Nie znaleziono danych LastPass" }, "incorrectUsernameOrPassword": { - "message": "Nieprawidłowa nazwa użytkownika lub hasło" + "message": "Nazwa użytkownika lub hasło są nieprawidłowe" }, "incorrectPassword": { - "message": "Błędne hasło" + "message": "Hasło jest nieprawidłowe" }, "incorrectCode": { - "message": "Błędny kod" + "message": "Kod jest nieprawidłowy" }, "incorrectPin": { - "message": "Niepoprawny PIN" + "message": "Kod PIN jest nieprawidłowy" }, "multifactorAuthenticationFailed": { - "message": "Uwierzytelnianie wieloskładnikowe nie powiodło się" + "message": "Logowanie dwustopniowe nie powiodło się" }, "includeSharedFolders": { "message": "Dołącz udostępnione foldery" }, "lastPassEmail": { - "message": "E-mail LastPass" + "message": "Adres e-mail LastPass" }, "importingYourAccount": { "message": "Importowanie konta..." }, "lastPassMFARequired": { - "message": "Wymagane jest uwierzytelnianie wieloskładnikowe LastPass" + "message": "Logowanie dwustopniowe LastPass jest wymagane" }, "lastPassMFADesc": { - "message": "Wprowadź jednorazowy kod z aplikacji uwierzytelniającej" + "message": "Wpisz jednorazowy kod z aplikacji uwierzytelniającej" }, "lastPassOOBDesc": { - "message": "Zatwierdź żądanie logowania w aplikacji uwierzytelniającej lub wprowadź jednorazowe hasło." + "message": "Potwierdź logowanie w aplikacji uwierzytelniającej lub wpisz jednorazowy kod." }, "passcode": { "message": "Kod" @@ -4131,10 +4293,10 @@ "message": "Hasło główne LastPass" }, "lastPassAuthRequired": { - "message": "Wymagane uwierzytelnianie LastPass" + "message": "Uwierzytelnianie LastPass jest wymagane" }, "awaitingSSO": { - "message": "Oczekiwanie na uwierzytelnianie SSO" + "message": "Oczekiwanie na logowanie jednokrotne" }, "awaitingSSODesc": { "message": "Kontynuuj logowanie przy użyciu danych firmowych." @@ -4150,13 +4312,13 @@ "message": "Importuj z CSV" }, "lastPassTryAgainCheckEmail": { - "message": "Spróbuj ponownie lub poszukaj wiadomości e-mail od LastPass, aby zweryfikować, że to Ty." + "message": "Spróbuj ponownie lub poszukaj wiadomości od LastPass, aby zweryfikować logowanie." }, "collection": { "message": "Kolekcja" }, "lastPassYubikeyDesc": { - "message": "Włóż YubiKey powiązany z Twoim kontem LastPass do portu USB komputera, a następnie naciśnij jego przycisk." + "message": "Włóż klucz YubiKey powiązany z kontem LastPass do portu USB urządzenia, a następnie dotknij jego przycisku." }, "switchAccount": { "message": "Przełącz konto" @@ -4195,16 +4357,16 @@ "message": "hostowany w" }, "useDeviceOrHardwareKey": { - "message": "Użyj swojego urządzenia lub klucza sprzętowego" + "message": "Użyj urządzenia lub klucza sprzętowego" }, "justOnce": { "message": "Tylko raz" }, "alwaysForThisSite": { - "message": "Zawsze dla tej witryny" + "message": "Zawsze dla tej strony" }, "domainAddedToExcludedDomains": { - "message": "$DOMAIN$ dodana do wykluczonych domen.", + "message": "Domena $DOMAIN$ została dodana do wykluczonych domen.", "placeholders": { "domain": { "content": "$1", @@ -4216,36 +4378,56 @@ "message": "Popularne formaty", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Wykrywanie dopasowania to sposób, w jaki Bitwarden identyfikuje sugestie autouzupełniania.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "„Wyrażenie regularne” jest zaawansowaną opcją zwiększającą ryzyko ujawnienia danych logowania.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "„Rozpoczyna się od” jest zaawansowaną opcją zwiększającą ryzyko ujawnienia danych logowania.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Dowiedz się więcej o wykrywaniu dopasowania", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Opcje zaawansowane", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { - "message": "Kontynuować do ustawień przeglądarki?", + "message": "Przejść do ustawień przeglądarki?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { - "message": "Kontynuować do centrum pomocy?", + "message": "Przejść do centrum pomocy?", "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { - "message": "Zmień ustawienia autouzupełniania przeglądarki i zarządzania hasłami.", + "message": "Zmień ustawienia autouzupełniania i haseł przeglądarki.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" }, "confirmContinueToHelpCenterKeyboardShortcutsContent": { - "message": "Możesz przeglądać i ustawiać skróty klawiaturowe rozszerzeń w ustawieniach przeglądarki.", + "message": "Możesz zmieniać skróty rozszerzenia w ustawieniach przeglądarki.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" }, "confirmContinueToBrowserPasswordManagementSettingsContent": { - "message": "Zmień ustawienia autouzupełniania przeglądarki i zarządzania hasłami.", + "message": "Zmień ustawienia autouzupełniania i haseł przeglądarki.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { - "message": "Możesz przeglądać i ustawiać skróty klawiaturowe rozszerzeń w ustawieniach przeglądarki.", + "message": "Możesz zmieniać skróty rozszerzenia w ustawieniach przeglądarki.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { - "message": "Czy Bitwarden ma być domyślnym menadżerem haseł?", + "message": "Ustawić Bitwarden jako domyślny menadżer haseł?", "description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutofillDescription": { - "message": "Ignorowanie tej opcji może spowodować konflikty pomiędzy menu autouzupełniania Bitwarden a przeglądarką.", + "message": "Zignorowanie tej opcji może spowodować konflikty pomiędzy autouzupełnianiem Bitwarden a przeglądarką.", "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutoFillSettings": { @@ -4265,7 +4447,7 @@ "description": "Button text for the setting that allows overriding the default browser autofill settings" }, "saveCipherAttemptSuccess": { - "message": "Pomyślnie zapisano dane logowania!", + "message": "Dane logowania zostały zapisane!", "description": "Notification message for when saving credentials has succeeded." }, "passwordSaved": { @@ -4273,7 +4455,7 @@ "description": "Notification message for when saving credentials has succeeded." }, "updateCipherAttemptSuccess": { - "message": "Pomyślnie zaktualizowano dane logowania!", + "message": "Dane logowania zostały zaktualizowane!", "description": "Notification message for when updating credentials has succeeded." }, "passwordUpdated": { @@ -4281,7 +4463,7 @@ "description": "Notification message for when updating credentials has succeeded." }, "saveCipherAttemptFailed": { - "message": "Błąd podczas zapisywania danych logowania. Sprawdź konsolę, aby uzyskać szczegóły.", + "message": "Wystąpił błąd podczas zapisywania danych logowania. Sprawdź konsolę, aby sprawdzić szczegóły.", "description": "Notification message for when saving credentials has failed." }, "success": { @@ -4300,19 +4482,19 @@ "message": "Sugerowane elementy" }, "autofillSuggestionsTip": { - "message": "Zapisz element logowania dla tej witryny, aby automatycznie wypełnić" + "message": "Zapisz dane logowania" }, "yourVaultIsEmpty": { - "message": "Twój sejf jest pusty" + "message": "Sejf jest pusty" }, "noItemsMatchSearch": { - "message": "Żaden element nie pasuje do Twojego wyszukiwania" + "message": "Brak pasujących elementów" }, "clearFiltersOrTryAnother": { "message": "Wyczyść filtry lub użyj innej frazy" }, "copyInfoTitle": { - "message": "Skopiuj informacje - $ITEMNAME$", + "message": "Kopiuj informacje - $ITEMNAME$", "description": "Title for a button that opens a menu with options to copy information from an item.", "placeholders": { "itemname": { @@ -4322,7 +4504,7 @@ } }, "copyNoteTitle": { - "message": "Skopiuj notatkę - $ITEMNAME$", + "message": "Kopiuj notatkę - $ITEMNAME$", "description": "Title for a button copies a note to the clipboard.", "placeholders": { "itemname": { @@ -4352,7 +4534,7 @@ } }, "viewItemTitle": { - "message": "Zobacz element - $ITEMNAME$", + "message": "Pokaż element - $ITEMNAME$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4362,7 +4544,7 @@ } }, "viewItemTitleWithField": { - "message": "Zobacz element - $ITEMNAME$ - $FIELD$", + "message": "Pokaż element - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4376,7 +4558,7 @@ } }, "autofillTitle": { - "message": "Autouzupełnij - $ITEMNAME$", + "message": "Uzupełnij - $ITEMNAME$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4386,7 +4568,7 @@ } }, "autofillTitleWithField": { - "message": "Autouzupełnij - $ITEMNAME$ - $FIELD$", + "message": "Uzupełnij - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Kopiuj $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Kopiuj $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4420,16 +4602,16 @@ "message": "Przypisz do kolekcji" }, "copyEmail": { - "message": "Skopiuj e-mail" + "message": "Kopiuj adres e-mail" }, "copyPhone": { - "message": "Skopiuj telefon" + "message": "Kopiuj numer telefonu" }, "copyAddress": { - "message": "Skopiuj adres" + "message": "Kopiuj adres" }, "adminConsole": { - "message": "Konsola Administracyjna" + "message": "Konsola administratora" }, "accountSecurity": { "message": "Bezpieczeństwo konta" @@ -4447,7 +4629,7 @@ "message": "Wystąpił błąd podczas przypisywania folderu." }, "viewItemsIn": { - "message": "Zobacz elementy w $NAME$", + "message": "Pokaż elementy w $NAME$", "description": "Button to view the contents of a folder or collection", "placeholders": { "name": { @@ -4467,7 +4649,7 @@ } }, "new": { - "message": "Nowy" + "message": "Nowy element" }, "removeItem": { "message": "Usuń $NAME$", @@ -4480,7 +4662,7 @@ } }, "itemsWithNoFolder": { - "message": "Elementy bez folderu" + "message": "Nieprzypisane" }, "itemDetails": { "message": "Szczegóły elementu" @@ -4508,19 +4690,19 @@ "message": "Historia elementu" }, "lastEdited": { - "message": "Ostatnio edytowany" + "message": "Zaktualizowano" }, "ownerYou": { "message": "Właściciel: Ty" }, "linked": { - "message": "Powiązane" + "message": "Powiązane pole" }, "copySuccessful": { - "message": "Kopiowanie zakończone sukcesem" + "message": "Skopiowano" }, "upload": { - "message": "Wyślij" + "message": "Prześlij" }, "addAttachment": { "message": "Dodaj załącznik" @@ -4550,22 +4732,22 @@ "message": "Pobierz Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Pobierz Bitwarden na wszystkich urządzeniach" + "message": "Bitwarden na inne urządzenia" }, "getTheMobileApp": { "message": "Pobierz aplikację mobilną" }, "getTheMobileAppDesc": { - "message": "Uzyskaj dostęp do haseł przy pomocy aplikacji mobilnej Bitwarden." + "message": "Uzyskaj dostęp do haseł za pomocą aplikacji mobilnej Bitwarden." }, "getTheDesktopApp": { "message": "Pobierz aplikację desktopową" }, "getTheDesktopAppDesc": { - "message": "Uzyskaj dostęp do sejfu bez przeglądarki, a następnie ustaw odblokowanie biometryczne, aby przyspieszyć odblokowanie zarówno w aplikacji desktopowej, jak i w rozszerzeniu przeglądarki." + "message": "Uzyskaj dostęp do sejfu bez przeglądarki. Skonfiguruj biometrię, aby przyśpieszyć odblokowywanie aplikacji." }, "downloadFromBitwardenNow": { - "message": "Pobierz teraz z bitwarden.com" + "message": "Pobierz z bitwarden.com" }, "getItOnGooglePlay": { "message": "Pobierz z Google Play" @@ -4574,7 +4756,7 @@ "message": "Pobierz z App Store" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Czy na pewno chcesz trwale usunąć ten załącznik?" + "message": "Czy na pewno chcesz usunąć trwale załącznik?" }, "premium": { "message": "Premium" @@ -4589,7 +4771,7 @@ "message": "Filtruj sejf" }, "filterApplied": { - "message": "Zastosowano jeden filtr" + "message": "Zastosowano 1 filtr" }, "filterAppliedPlural": { "message": "$COUNT$ filtrów zastosowanych", @@ -4604,7 +4786,7 @@ "message": "Dane osobowe" }, "identification": { - "message": "Tożsamość" + "message": "Identyfikacja" }, "contactInfo": { "message": "Daje kontaktowe" @@ -4619,7 +4801,7 @@ } }, "cardNumberEndsWith": { - "message": "numer karty kończy się", + "message": "numer karty kończący się", "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." }, "loginCredentials": { @@ -4645,7 +4827,7 @@ } }, "websiteAdded": { - "message": "Strona dodana" + "message": "Strona internetowa została dodana" }, "addWebsite": { "message": "Dodaj stronę internetową" @@ -4654,7 +4836,7 @@ "message": "Usuń stronę internetową" }, "defaultLabel": { - "message": "Domyślnie ($VALUE$)", + "message": "Domyślne ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -4664,7 +4846,7 @@ } }, "showMatchDetection": { - "message": "Pokaż wykrywanie dopasowań $WEBSITE$", + "message": "Pokaż wykrywanie dopasowania $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4673,7 +4855,7 @@ } }, "hideMatchDetection": { - "message": "Ukryj wykrywanie dopasowań $WEBSITE$", + "message": "Ukryj wykrywanie dopasowania $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4682,13 +4864,13 @@ } }, "autoFillOnPageLoad": { - "message": "Włącz autouzupełnianie po załadowaniu strony?" + "message": "Włączyć autouzupełnianie po załadowaniu strony?" }, "cardExpiredTitle": { "message": "Karta wygasła" }, "cardExpiredMessage": { - "message": "Jeśli ją wznowiłeś, zaktualizuj informacje o karcie" + "message": "Jeśli karta została odnowiona, zaktualizuj informacje o niej" }, "cardDetails": { "message": "Szczegóły karty" @@ -4712,7 +4894,7 @@ "message": "Dodaj konto" }, "loading": { - "message": "Wczytywanie" + "message": "Ładowanie" }, "data": { "message": "Dane" @@ -4726,7 +4908,7 @@ "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Zaloguj się za pomocą klucza dostępu", + "message": "Logowanie kluczem dostępu", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4757,7 +4939,7 @@ "message": "Dodaj" }, "fieldType": { - "message": "Typ pola" + "message": "Rodzaj pola" }, "fieldLabel": { "message": "Etykieta pola" @@ -4766,16 +4948,16 @@ "message": "Użyj pól tekstowych dla danych takich jak pytania bezpieczeństwa" }, "hiddenHelpText": { - "message": "Użyj ukrytych pól dla danych poufnych, takich jak hasło" + "message": "Użyj ukrytych pól dla danych poufnych takich jak hasło" }, "checkBoxHelpText": { - "message": "Użyj pól wyboru, jeśli chcesz automatycznie wypełnić pole wyboru formularza, np. zapamiętaj e-mail" + "message": "Użyj pól wyboru, gdy chcesz uzupełnić pole wyboru formularza, np. zapamiętaj adres e-mail" }, "linkedHelpText": { "message": "Użyj powiązanego pola, gdy masz problemy z autouzupełnianiem na konkretnej stronie internetowej." }, "linkedLabelHelpText": { - "message": "Wprowadź atrybut z HTML'a: id, name, aria-label lub placeholder." + "message": "Wpisz identyfikator, nazwę, etykietę lub tekst zastępczy pola HTML." }, "editField": { "message": "Edytuj pole" @@ -4808,7 +4990,7 @@ } }, "reorderToggleButton": { - "message": "Zmień kolejność $LABEL$. Użyj klawiszy ze strzałkami, aby przenieść element w górę lub w dół.", + "message": "Zmień kolejność pola $LABEL$. Użyj klawiszy ze strzałkami, aby przenieść element w górę lub w dół.", "placeholders": { "label": { "content": "$1", @@ -4817,10 +4999,10 @@ } }, "reorderWebsiteUriButton": { - "message": "Zmień kolejność URI strony. Użyj klawiszy ze strzałkami, aby przenieść element w górę lub w dół." + "message": "Zmień kolejność URI stron internetowych. Użyj klawiszy ze strzałkami, aby przenieść element w górę lub w dół." }, "reorderFieldUp": { - "message": "$LABEL$ przeniósł się w górę, pozycja $INDEX$ z $LENGTH$", + "message": "Pole $LABEL$ zostało przeniesione w górę. Pozycja $INDEX$ z $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4840,7 +5022,7 @@ "message": "Wybierz kolekcje do przypisania" }, "personalItemTransferWarningSingular": { - "message": "1 element zostanie trwale przeniesiony do wybranej organizacji. Nie będziesz już posiadać tego elementu." + "message": "Element zostanie przeniesiony do organizacji. Nie będziesz już właścicielem elementu." }, "personalItemsTransferWarningPlural": { "message": "$PERSONAL_ITEMS_COUNT$ elementów zostanie trwale przeniesionych do wybranej organizacji. Nie będziesz już posiadać tych elementów.", @@ -4852,7 +5034,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 przedmiot zostanie trwale przeniesiony do $ORG$. Nie będziesz już posiadać tego przedmiotu.", + "message": "Element zostanie przeniesiony do organizacji $ORG$. Nie będziesz już właścicielem elementu.", "placeholders": { "org": { "content": "$1", @@ -4874,13 +5056,13 @@ } }, "successfullyAssignedCollections": { - "message": "Pomyślnie przypisano kolekcje" + "message": "Przypisano kolekcje" }, "nothingSelected": { - "message": "Nie zaznaczyłeś żadnych elementów." + "message": "Nie zaznaczono żadnych elementów." }, "itemsMovedToOrg": { - "message": "Elementy przeniesione do $ORGNAME$", + "message": "Elementy zostały przeniesione do organizacji $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4889,7 +5071,7 @@ } }, "itemMovedToOrg": { - "message": "Element przeniesiony do $ORGNAME$", + "message": "Element został przeniesiony do organizacji $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4898,7 +5080,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ przeniósł się w dół, pozycja $INDEX$ z $LENGTH$", + "message": "Pole $LABEL$ zostało przeniesione w dół. Pozycja $INDEX$ z $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4918,13 +5100,13 @@ "message": "Lokalizacja elementu" }, "fileSend": { - "message": "Wysyłka pliku" + "message": "Plik wysyłki" }, "fileSends": { "message": "Wysyłki plików" }, "textSend": { - "message": "Wysyłka tekstu" + "message": "Tekst wysyłki" }, "textSends": { "message": "Wysyłki tekstów" @@ -4933,16 +5115,16 @@ "message": "Akcje konta" }, "showNumberOfAutofillSuggestions": { - "message": "Pokaż liczbę sugestii autouzupełniania logowania na ikonie rozszerzenia" + "message": "Pokaż liczbę sugestii autouzupełniania na ikonie rozszerzenia" }, "showQuickCopyActions": { - "message": "Pokaż akcje szybkiego kopiowania w Sejfie" + "message": "Pokaż akcje szybkiego kopiowania w sejfie" }, "systemDefault": { "message": "Domyślny systemu" }, "enterprisePolicyRequirementsApplied": { - "message": "Do tego ustalenia zastosowano wymogi polityki przedsiębiorstw" + "message": "Wymagania zasady organizacji zostały zastosowane" }, "sshPrivateKey": { "message": "Klucz prywatny" @@ -4951,34 +5133,34 @@ "message": "Klucz publiczny" }, "sshFingerprint": { - "message": "Odcisk palca" + "message": "Odcisk klucza" }, "sshKeyAlgorithm": { - "message": "Typ klucza" + "message": "Rodzaj klucza" }, "sshKeyAlgorithmED25519": { "message": "ED25519" }, "sshKeyAlgorithmRSA2048": { - "message": "RSA 2048-bitowy" + "message": "RSA 2048-bit" }, "sshKeyAlgorithmRSA3072": { - "message": "RSA 3072-bitowy" + "message": "RSA 3072-bit" }, "sshKeyAlgorithmRSA4096": { - "message": "RSA 4096-bitowy" + "message": "RSA 4096-bit" }, "retry": { - "message": "Powtórz" + "message": "Spróbuj ponownie" }, "vaultCustomTimeoutMinimum": { - "message": "Minimalny limit czasu niestandardowego wynosi 1 minutę." + "message": "Minimalny niestandardowy czas to 1 minuta." }, "additionalContentAvailable": { "message": "Dostępna jest dodatkowa zawartość" }, "fileSavedToDevice": { - "message": "Plik zapisany na urządzeniu. Zarządzaj plikiem na swoim urządzeniu." + "message": "Plik został zapisany na urządzeniu." }, "showCharacterCount": { "message": "Pokaż liczbę znaków" @@ -5002,28 +5184,28 @@ "message": "Przywróć" }, "deleteForever": { - "message": "Usuń na zawsze" + "message": "Usuń trwale" }, "noEditPermissions": { - "message": "Nie masz uprawnień do edycji tego elementu" + "message": "Nie masz uprawnień do edycji elementu" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Odblokowanie odciskiem palca jest niedostępne, ponieważ najpierw wymagane jest odblokowanie kodem PIN lub hasłem." + "message": "Odblokowanie biometrią jest niedostępne, ponieważ najpierw wymagane jest odblokowanie kodem PIN lub hasłem." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Odblokowanie biometryczne jest obecnie niedostępne." + "message": "Odblokowanie biometrią jest obecnie niedostępne." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Odblokowanie biometryczne jest niedostępne z powodu nieprawidłowej konfiguracji plików systemowych." + "message": "Odblokowanie biometrią jest niedostępne z powodu nieprawidłowej konfiguracji plików systemowych." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Odblokowanie biometryczne jest niedostępne z powodu nieprawidłowej konfiguracji plików systemowych." + "message": "Odblokowanie biometrią jest niedostępne z powodu nieprawidłowej konfiguracji plików systemowych." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Odblokowanie odciskiem palca jest niedostępne, ponieważ aplikacja desktopowa Bitwarden jest zamknięta." + "message": "Odblokowanie biometrią jest niedostępne z powodu zamkniętej aplikacji desktopowej Bitwarden." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Odblokowanie biometryczne jest niedostępne, ponieważ nie jest włączone dla $EMAIL$ w aplikacji desktopowej Bitwarden.", + "message": "Odblokowanie biometrią jest niedostępne, ponieważ nie zostało włączone dla konta $EMAIL$ w aplikacji desktopowej Bitwarden.", "placeholders": { "email": { "content": "$1", @@ -5035,13 +5217,16 @@ "message": "Odblokowanie biometryczne jest obecnie niedostępne z nieznanego powodu." }, "unlockVault": { - "message": "Odblokuj swój sejf w kilka sekund" + "message": "Odblokuj sejf w kilka sekund" }, "unlockVaultDesc": { - "message": "Możesz dostosować ustawienia odblokowania i limitu czasu, aby szybciej uzyskać dostęp do sejfu." + "message": "Możesz dostosować sposób i czas blokowania sejfu, aby uzyskać szybszy dostęp do sejfu." }, "unlockPinSet": { - "message": "Ustaw kod PIN odblokowujący" + "message": "Kod PIN został ustawiony" + }, + "unlockWithBiometricSet": { + "message": "Odblokuj biometrią" }, "authenticating": { "message": "Uwierzytelnianie" @@ -5079,23 +5264,23 @@ "description": "Represents the @ key in screen reader content as a readable word" }, "hashSignCharacterDescriptor": { - "message": "Hashtag", + "message": "Kratka", "description": "Represents the # key in screen reader content as a readable word" }, "dollarSignCharacterDescriptor": { - "message": "Znak dolara", + "message": "Dolar", "description": "Represents the $ key in screen reader content as a readable word" }, "percentSignCharacterDescriptor": { - "message": "Znak procenta", + "message": "Procent", "description": "Represents the % key in screen reader content as a readable word" }, "caretCharacterDescriptor": { - "message": "Daszek", + "message": "Kareta", "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { - "message": "Ampersand", + "message": "Et", "description": "Represents the & key in screen reader content as a readable word" }, "asteriskCharacterDescriptor": { @@ -5103,15 +5288,15 @@ "description": "Represents the * key in screen reader content as a readable word" }, "parenLeftCharacterDescriptor": { - "message": "Prawy nawias okrągły", + "message": "Lewy nawias", "description": "Represents the ( key in screen reader content as a readable word" }, "parenRightCharacterDescriptor": { - "message": "Prawy nawias okrągły", + "message": "Prawy nawias", "description": "Represents the ) key in screen reader content as a readable word" }, "hyphenCharacterDescriptor": { - "message": "Znak podkreślenia", + "message": "Podkreślnik", "description": "Represents the _ key in screen reader content as a readable word" }, "underscoreCharacterDescriptor": { @@ -5123,7 +5308,7 @@ "description": "Represents the + key in screen reader content as a readable word" }, "equalsCharacterDescriptor": { - "message": "Znak równości", + "message": "Równa się", "description": "Represents the = key in screen reader content as a readable word" }, "braceLeftCharacterDescriptor": { @@ -5143,11 +5328,11 @@ "description": "Represents the ] key in screen reader content as a readable word" }, "pipeCharacterDescriptor": { - "message": "Pionowa kreska", + "message": "Kreska pionowa", "description": "Represents the | key in screen reader content as a readable word" }, "backSlashCharacterDescriptor": { - "message": "Ukośnik wsteczny", + "message": "Ukośnik lewy", "description": "Represents the back slash key in screen reader content as a readable word" }, "colonCharacterDescriptor": { @@ -5167,11 +5352,11 @@ "description": "Represents the ' key in screen reader content as a readable word" }, "lessThanCharacterDescriptor": { - "message": "Mniejszy niż", + "message": "Mniej niż", "description": "Represents the < key in screen reader content as a readable word" }, "greaterThanCharacterDescriptor": { - "message": "Większy niż", + "message": "Więcej niż", "description": "Represents the > key in screen reader content as a readable word" }, "commaCharacterDescriptor": { @@ -5209,13 +5394,13 @@ "message": "Szerokość rozszerzenia" }, "wide": { - "message": "Szerokie" + "message": "Szeroka" }, "extraWide": { - "message": "Bardzo szerokie" + "message": "Bardzo szeroka" }, "sshKeyWrongPassword": { - "message": "Wprowadzone hasło jest nieprawidłowe." + "message": "Hasło jest nieprawidłowe." }, "importSshKey": { "message": "Importuj" @@ -5224,22 +5409,22 @@ "message": "Potwierdź hasło" }, "enterSshKeyPasswordDesc": { - "message": "Wprowadź hasło dla klucza SSH." + "message": "Wpisz hasło klucza SSH." }, "enterSshKeyPassword": { - "message": "Wprowadź hasło" + "message": "Wpisz hasło" }, "invalidSshKey": { "message": "Klucz SSH jest nieprawidłowy" }, "sshKeyTypeUnsupported": { - "message": "Typ klucza SSH nie jest obsługiwany" + "message": "Ten klucz SSH nie jest obsługiwany" }, "importSshKeyFromClipboard": { "message": "Importuj klucz ze schowka" }, "sshKeyImported": { - "message": "Klucz SSH zaimportowano pomyślnie" + "message": "Klucz SSH został zaimportowany" }, "cannotRemoveViewOnlyCollections": { "message": "Nie można usunąć kolekcji z uprawnieniami tylko do przeglądania: $COLLECTIONS$", @@ -5251,86 +5436,86 @@ } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Zaktualizuj aplikację na komputer" + "message": "Zaktualizuj aplikację desktopową" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "Aby używać odblokowywania biometrycznego, zaktualizuj aplikację na komputerze lub wyłącz odblokowywanie odciskiem palca w ustawieniach aplikacji na komputerze." + "message": "Aby używać biometrii, zaktualizuj aplikację desktopową." }, "changeAtRiskPassword": { - "message": "Zmień hasło zagrożone" + "message": "Zmień zagrożone hasło" }, "settingsVaultOptions": { - "message": "Ustawienia Sejfu" + "message": "Opcje sejfu" }, "emptyVaultDescription": { - "message": "Sejf chroni nie tylko Twoje hasła. Przechowuj tutaj bezpiecznie loginy, identyfikatory, karty i notatki." + "message": "Sejf chroni nie tylko hasła. Przechowuj bezpiecznie dane logowania, identyfikatory, karty i notatki." }, "introCarouselLabel": { "message": "Witaj w Bitwarden" }, "securityPrioritized": { - "message": "Bezpieczeństwo priorytetem" + "message": "Priorytetowe bezpieczeństwo" }, "securityPrioritizedBody": { - "message": "Zapisz dane logowania, karty i tożsamości w bezpiecznym sejfie. Bitwarden stosuje szyfrowanie end-to-end z wiedzą zerową, aby chronić to, co jest dla Ciebie ważne." + "message": "Zapisz dane logowania, karty i tożsamości w bezpiecznym sejfie. Bitwarden używa szyfrowania end-to-end w celu ochrony tego, co jest dla Ciebie ważne." }, "quickLogin": { "message": "Szybkie i łatwe logowanie" }, "quickLoginBody": { - "message": "Skonfiguruj odblokowanie i autouzupełnianie biometryczne, aby zalogować się na swoje konta bez wpisywania pojedynczej litery." + "message": "Skonfiguruj odblokowywanie biometryczne i autouzupełnianie, aby logować się do swoich kont bez wpisywania nawet jednej litery." }, "secureUser": { - "message": "Ulepsz swoje loginy" + "message": "Ulepsz swoje dane logowania" }, "secureUserBody": { - "message": "Użyj generatora do tworzenia i zapisywania silnych, unikalnych haseł dla wszystkich kont." + "message": "Użyj generatora, aby utworzyć i zapisać silne, unikalne hasła do wszystkich swoich kont." }, "secureDevices": { "message": "Twoje dane, kiedy i gdzie potrzebujesz" }, "secureDevicesBody": { - "message": "Zapisuj nieograniczoną liczbę haseł na nieograniczonej liczbie urządzeń dzięki aplikacjom Bitwarden na urządzenia mobilne, przeglądarki i komputery stacjonarne." + "message": "Zapisuj nieograniczoną liczbę haseł dzięki aplikacjom Bitwarden, które są dostępne na urządzeniach mobilnych, w przeglądarkach i na komputerach." }, "nudgeBadgeAria": { "message": "1 powiadomienie" }, "emptyVaultNudgeTitle": { - "message": "Importuj istniejące hasła" + "message": "Importuj obecne hasła" }, "emptyVaultNudgeBody": { - "message": "Użyj importera, aby szybko przenieść loginy do Bitwarden bez ręcznego dodawania ich." + "message": "Przenieś dane logowania do Bitwarden w sposób automatyczny." }, "emptyVaultNudgeButton": { "message": "Importuj teraz" }, "hasItemsVaultNudgeTitle": { - "message": "Witaj w Twoim Sejfie!" + "message": "Witaj w sejfie!" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autouzupełnianie elementów dla bieżącej strony" + "message": "Uzupełniaj elementy na stronie internetowej" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Ulubione elementy dla szybkiego dostępu" + "message": "Dodawaj do ulubionych wybrane elementy" }, "hasItemsVaultNudgeBodyThree": { - "message": "Przeszukaj swój sejf w poszukiwaniu czegoś innego" + "message": "Przeszukuj sejf w poszukiwaniu czegoś innego" }, "newLoginNudgeTitle": { "message": "Oszczędzaj czas dzięki autouzupełnianiu" }, "newLoginNudgeBodyOne": { - "message": "Dołącz", + "message": "Dodaj", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "stronę internetową, ", + "message": "stronę internetową", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "aby ten login pojawił się jako sugestia autouzupełniania.", + "message": ", aby dane logowania pojawiały się jako sugestia autouzupełniania.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, @@ -5338,25 +5523,25 @@ "message": "Bezproblemowe zamówienia online" }, "newCardNudgeBody": { - "message": "Z kartami łatwe autouzupełnianie formularzy płatności w sposób bezpieczny i dokładny." + "message": "Dzięki kartom możesz łatwo i bezpiecznie uzupełniać formularze płatności." }, "newIdentityNudgeTitle": { - "message": "Uprość tworzenie kont" + "message": "Łatwe tworzenie kont" }, "newIdentityNudgeBody": { - "message": "Z tożsamościami, szybko autouzupełnij długie formularze rejestracyjne lub kontaktowe." + "message": "Dzięki tożsamościom możesz szybko uzupełniać długie formularze rejestracyjne i kontaktowe." }, "newNoteNudgeTitle": { - "message": "Zachowaj bezpieczeństwo wrażliwych danych" + "message": "Chroń wrażliwe dane" }, "newNoteNudgeBody": { - "message": "Z notatkami bezpiecznie przechowuj dane szczególnie chronione, takie jak dane bankowe lub ubezpieczeniowe." + "message": "Dzięki notatkom możesz bezpiecznie przechowywać poufne dane, takie jak bankowe lub ubezpieczeniowe." }, "newSshNudgeTitle": { - "message": "Przyjazny dla deweloperów dostęp SSH" + "message": "Dostęp SSH przyjazny dla programistów" }, "newSshNudgeBodyOne": { - "message": "Przechowuj swoje klucze i połącz się z agentem SSH dla szybkiego, szyfrowanego uwierzytelniania.", + "message": "Przechowuj klucze i łącz się z agentem SSH w celu szybkiego, szyfrowanego uwierzytelniania.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, @@ -5366,23 +5551,33 @@ "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Szybko twórz hasła" + "message": "Szybkie tworzenie haseł" }, "generatorNudgeBodyOne": { - "message": "Łatwo twórz silne i unikalne hasła, klikając na", + "message": "Twórz silne i unikalne hasła, klikając przycisk", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": ", aby pomóc Ci zachować bezpieczeństwo Twoich danych logowania.", + "message": ", aby zapewnić bezpieczeństwo danych logowania.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Łatwo twórz silne i unikalne hasła, klikając na Wygeneruj Hasło, aby pomóc Ci zachować bezpieczeństwo Twoich danych logowania.", + "message": "Twórz silne i unikalne hasła, klikając przycisk Wygeneruj hasło, aby zapewnić bezpieczeństwo danych logowania.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "Nie masz uprawnień do przeglądania tej strony. Spróbuj zalogować się na inne konto." + "message": "Nie masz uprawnień do przeglądania tej strony. Zaloguj się na inne konto." + }, + "wasmNotSupported": { + "message": "WebAssembly nie jest obsługiwany w przeglądarce lub jest wyłączony. WebAssembly jest wymagany do korzystania z aplikacji Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Pokaż więcej" + }, + "showLess": { + "message": "Pokaż mniej" } } diff --git a/apps/browser/src/_locales/pt_BR/messages.json b/apps/browser/src/_locales/pt_BR/messages.json index 56a4ce3018b..ac5afdc9fce 100644 --- a/apps/browser/src/_locales/pt_BR/messages.json +++ b/apps/browser/src/_locales/pt_BR/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Pesquisar no Cofre" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Editar" }, @@ -1173,6 +1176,12 @@ "message": "Ops! Não foi possível salvar isso. Tente digitar os detalhes manualmente.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Pedir para atualizar os dados de login existentes" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funcionalidade Indisponível" }, - "encryptionKeyMigrationRequired": { - "message": "É necessário migrar sua chave de criptografia. Faça login através do cofre web para atualizar sua chave de criptografia." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Assinatura Premium" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Código de Segurança" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Chave SSH" }, + "typeNote": { + "message": "Nota" + }, "newItemHeader": { "message": "Nova $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Defina o seu código PIN para desbloquear o Bitwarden. Suas configurações de PIN serão redefinidas se alguma vez você encerrar completamente toda a sessão do aplicativo." }, - "setYourPinCode1": { - "message": "O seu PIN será usado para desbloquear o Bitwarden em vez da sua senha mestra. O seu PIN será redefinido se terminar sessão completa do Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "O código PIN é necessário." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "A política da organização bloqueou a importação de itens para o seu cofre." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domínios", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Alterar" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Alterar senha - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "Senhas em risco" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Revisar e alterar uma senha vulnerável" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Você precisa verificar o seu e-mail para usar este recurso. Você pode verificar seu e-mail no cofre web." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Senha mestra atualizada" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Pedido enviado" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Senha mestra comprometida" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Lembrar deste dispositivo para permanecer conectado" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Aprovação do dispositivo necessária. Selecione uma opção de aprovação abaixo:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Solicitar aprovação do administrador" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Identificador SSO da organização é necessário." }, @@ -3614,20 +3784,12 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "Nenhum Send ativo", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use o Send para compartilhar informação criptografa com qualquer um.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Envie informações sensíveis com segurança", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Compartilhe arquivos e dados com segurança, com qualquer pessoa e em qualquer plataforma. Suas informações ficarão sempre criptografadas de ponta a ponta, garantindo exposição mínima.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -4216,6 +4378,26 @@ "message": "Formatos comuns", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continuar nas configurações do navegador?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copiar $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4547,25 +4729,25 @@ } }, "downloadBitwarden": { - "message": "Download Bitwarden" + "message": "Baixar o Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Download Bitwarden on all devices" + "message": "Baixar o Bitwarden em todos os dispositivos" }, "getTheMobileApp": { - "message": "Get the mobile app" + "message": "Baixar o aplicativo para dispositivos móveis" }, "getTheMobileAppDesc": { - "message": "Access your passwords on the go with the Bitwarden mobile app." + "message": "Acesse as suas senhas em qualquer lugar com o aplicativo móvel Bitwarden." }, "getTheDesktopApp": { "message": "Get the desktop app" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "Acesse o seu cofre sem um navegador e, em seguida, configure o desbloqueio com dados biométricos para facilitar o desbloqueio tanto no aplicativo desktop quanto na extensão do navegador." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Baixar em bitwarden.com agora" }, "getItOnGooglePlay": { "message": "Get it on Google Play" @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Autenticando" }, @@ -5260,7 +5445,7 @@ "message": "Alterar senhas vulneráveis" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Opções do cofre" }, "emptyVaultDescription": { "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/pt_PT/messages.json b/apps/browser/src/_locales/pt_PT/messages.json index 50a2aeb20bd..aa926ac77b8 100644 --- a/apps/browser/src/_locales/pt_PT/messages.json +++ b/apps/browser/src/_locales/pt_PT/messages.json @@ -450,7 +450,7 @@ "message": "Gera automaticamente palavras-passe fortes e únicas para as suas credenciais." }, "bitWebVaultApp": { - "message": "Aplicação Web Bitwarden" + "message": "Aplicação web Bitwarden" }, "importItems": { "message": "Importar itens" @@ -547,6 +547,9 @@ "searchVault": { "message": "Procurar no cofre" }, + "resetSearch": { + "message": "Repor pesquisa" + }, "edit": { "message": "Editar" }, @@ -653,7 +656,7 @@ "message": "Classificar a extensã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." }, "verifyYourIdentity": { "message": "Verifique a sua identidade" @@ -929,7 +932,7 @@ "message": "Torne a sua conta mais segura configurando a verificação de dois passos na aplicação Web Bitwarden." }, "twoStepLoginConfirmationTitle": { - "message": "Continuar para a aplicação Web?" + "message": "Continuar para a aplicação web?" }, "editedFolder": { "message": "Pasta guardada" @@ -1173,6 +1176,12 @@ "message": "Oh não! Não conseguimos guardar isto. Tente introduzir os detalhes manualmente.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Depois de ter alterado a sua palavra-passe, é necessário iniciar sessão com a sua nova palavra-passe. As sessões ativas noutros dispositivos serão interrompidas dentro de uma hora." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Altere a sua palavra-passe mestra para concluir a recuperação da conta." + }, "enableChangedPasswordNotification": { "message": "Pedir para atualizar credencial existente" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funcionalidade indisponível" }, - "encryptionKeyMigrationRequired": { - "message": "É necessária a migração da chave de encriptação. Inicie sessão através do cofre Web para atualizar a sua chave de encriptação." + "legacyEncryptionUnsupported": { + "message": "A encriptação herdada já não é suportada. Por favor, contacte o suporte para recuperar a sua conta." }, "premiumMembership": { "message": "Subscrição Premium" @@ -1578,7 +1587,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" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Código de segurança" }, + "cardNumber": { + "message": "número do cartão" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Chave SSH" }, + "typeNote": { + "message": "Nota" + }, "newItemHeader": { "message": "Novo(a) $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Defina o seu código PIN para desbloquear o Bitwarden. As suas definições de PIN serão redefinidas se alguma vez terminar sessão por completo da aplicação." }, - "setYourPinCode1": { - "message": "O seu PIN será utilizado para desbloquear o Bitwarden em vez da sua palavra-passe mestra. O seu PIN será reposto se alguma vez terminar totalmente a sessão no Bitwarden." + "setPinCode": { + "message": "Pode utilizar este PIN para desbloquear o Bitwarden. O seu PIN será reposto se alguma vez terminar sessão completamente da aplicação." }, "pinRequired": { "message": "É necessário o código PIN." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Uma política da organização bloqueou a importação de itens para o seu cofre individual." }, + "restrictCardTypeImport": { + "message": "Não é possível importar tipos de itens de cartão" + }, + "restrictCardTypeImportDesc": { + "message": "Uma política definida por 1 ou mais organizações impede-o de importar cartões para os seus cofres." + }, "domainsTitle": { "message": "Domínios", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Alterar" }, + "changePassword": { + "message": "Alterar palavra-passe", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Alterar palavra-passe - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Palavra-passe em risco" + }, "atRiskPasswords": { "message": "Palavras-passe em risco" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "A sua palavra-passe deste site está em risco. A $ORGANIZATION$ pediu-lhe que a alterasse.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "A $ORGANIZATION$ pretende que altere esta palavra-passe porque está em risco. Navegue até às definições da sua conta para alterar a palavra-passe.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Rever e alterar uma palavra-passe em risco" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Tem de verificar o seu e-mail para utilizar esta funcionalidade. Pode verificar o seu e-mail no cofre Web." }, + "masterPasswordSuccessfullySet": { + "message": "Palavra-passe mestra definida com sucesso" + }, "updatedMasterPassword": { "message": "Palavra-passe mestra atualizada" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Pedido enviado" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Pedido de início de sessão aprovado para $EMAIL$ no $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Recusou uma tentativa de início de sessão de outro dispositivo. Se foi realmente o caso, tente iniciar sessão com o dispositivo novamente." + }, + "device": { + "message": "Dispositivo" + }, + "loginStatus": { + "message": "Estado do início de sessão" + }, + "masterPasswordChanged": { + "message": "Palavra-passe mestra guardada" + }, "exposedMasterPassword": { "message": "Palavra-passe mestra exposta" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Memorizar este dispositivo para facilitar futuros inícios de sessão" }, + "manageDevices": { + "message": "Gerir dispositivos" + }, + "currentSession": { + "message": "Sessão atual" + }, + "mobile": { + "message": "Móvel", + "description": "Mobile app" + }, + "extension": { + "message": "Extensão", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Computador", + "description": "Desktop app" + }, + "webVault": { + "message": "Cofre web" + }, + "webApp": { + "message": "Aplicação web" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Pedido pendente" + }, + "firstLogin": { + "message": "Primeiro início de sessão" + }, + "trusted": { + "message": "Confiável" + }, + "needsApproval": { + "message": "Precisa de aprovação" + }, + "devices": { + "message": "Dispositivos" + }, + "accessAttemptBy": { + "message": "Tentativa de acesso por $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirmar acesso" + }, + "denyAccess": { + "message": "Recusar acesso" + }, + "time": { + "message": "Hora" + }, + "deviceType": { + "message": "Tipo de dispositivo" + }, + "loginRequest": { + "message": "Pedido de início de sessão" + }, + "thisRequestIsNoLongerValid": { + "message": "Este pedido já não é válido." + }, + "loginRequestHasAlreadyExpired": { + "message": "O pedido de início de sessão já expirou." + }, + "justNow": { + "message": "Agora mesmo" + }, + "requestedXMinutesAgo": { + "message": "Pedido há $MINUTES$ minutos", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "É necessária a aprovação do dispositivo. Selecione uma opção de aprovação abaixo:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Pedir aprovação do administrador" }, + "unableToCompleteLogin": { + "message": "Não é possível concluir o início de sessão" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Tem de iniciar sessão num dispositivo de confiança ou pedir ao seu administrador que lhe atribua uma palavra-passe." + }, "ssoIdentifierRequired": { "message": "É necessário o identificador de SSO da organização." }, @@ -3558,7 +3728,7 @@ "description": "European Union" }, "accessDenied": { - "message": "Acesso negado. Não tem permissão para visualizar esta página." + "message": "Acesso negado. Não tem permissão para ver esta página." }, "general": { "message": "Geral" @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Confiar no utilizador" }, - "sendsNoItemsTitle": { - "message": "Sem Sends ativos", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Utilize o Send para partilhar de forma segura informações encriptadas com qualquer pessoa.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Envie informações sensíveis com segurança", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Formatos comuns", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "A deteção de correspondência de URI é a forma como o Bitwarden identifica sugestões de preenchimento automático.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "A \"expressão regular\" é uma opção avançada com um risco acrescido de exposição de credenciais.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Começa com\" é uma opção avançada com um risco acrescido de exposição de credenciais.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Mais informações sobre a deteção de correspondências", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Opções avançadas", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continuar para as definições do navegador?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copiar $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copiar $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4840,7 +5022,7 @@ "message": "Selecione as coleções a atribuir" }, "personalItemTransferWarningSingular": { - "message": "1 será permanentemente transferido para a organização selecionada. Este item deixará de lhe pertencer." + "message": "1 item será permanentemente transferido para a organização selecionada. Este item deixará de lhe pertencer." }, "personalItemsTransferWarningPlural": { "message": "$PERSONAL_ITEMS_COUNT$ itens serão permanentemente transferidos para a organização selecionada. Estes itens deixarão de lhe pertencer.", @@ -4852,7 +5034,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 será permanentemente transferido para a $ORG$. Este item deixará de lhe pertencer.", + "message": "1 item será permanentemente transferido para a $ORG$. Este item deixará de lhe pertencer.", "placeholders": { "org": { "content": "$1", @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Definição do PIN de desbloqueio" }, + "unlockWithBiometricSet": { + "message": "Desbloquear com conjunto biométrico" + }, "authenticating": { "message": "A autenticar" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Não tem permissões para ver esta página. Tente iniciar sessão com uma conta diferente." + }, + "wasmNotSupported": { + "message": "O WebAssembly não é suportado no seu navegador ou não está ativado. O WebAssembly é necessário para utilizar a app Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Mostrar mais" + }, + "showLess": { + "message": "Mostrar menos" } } diff --git a/apps/browser/src/_locales/ro/messages.json b/apps/browser/src/_locales/ro/messages.json index 375f97ef265..741b491da13 100644 --- a/apps/browser/src/_locales/ro/messages.json +++ b/apps/browser/src/_locales/ro/messages.json @@ -23,16 +23,16 @@ "message": "Creare cont" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Nou pe Bitwarden?" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Autentificare cu parolă" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "Autentificare unică" }, "welcomeBack": { - "message": "Welcome back" + "message": "Bine ați revenit" }, "setAStrongPassword": { "message": "Setați o parolă puternică" @@ -84,7 +84,7 @@ "message": "Indiciu pentru parola principală (opțional)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Nivelul de siguranța al parolei $SCORE$", "placeholders": { "score": { "content": "$1", @@ -132,7 +132,7 @@ "message": "Copiere parolă" }, "copyPassphrase": { - "message": "Copy passphrase" + "message": "Copiază întrebarea de siguranța" }, "copyNote": { "message": "Copiere notă" @@ -165,13 +165,13 @@ "message": "Copiați numărul de licență" }, "copyPrivateKey": { - "message": "Copy private key" + "message": "Copiază cheia de siguranța privată" }, "copyPublicKey": { - "message": "Copy public key" + "message": "Copiază cheia de siguranța publică" }, "copyFingerprint": { - "message": "Copy fingerprint" + "message": "Copiați amprenta" }, "copyCustomField": { "message": "Copiază $FIELD$", @@ -189,11 +189,11 @@ "message": "Copiază notițele" }, "copy": { - "message": "Copy", + "message": "Copiați", "description": "Copy to clipboard" }, "fill": { - "message": "Fill", + "message": "Completați", "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { @@ -209,10 +209,10 @@ "message": "Autocompletare identitate" }, "fillVerificationCode": { - "message": "Fill verification code" + "message": "Completați codul de verificare" }, "fillVerificationCodeAria": { - "message": "Fill Verification Code", + "message": "Completați Codul de Verificare", "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { @@ -398,7 +398,7 @@ "message": "Numele folderului" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Grupează un folder prin adăugarea numelui folderului părinte urmat de \"/\" Exemplu: Social/Forums" }, "noFoldersAdded": { "message": "No folders added" @@ -407,7 +407,7 @@ "message": "Create folders to organize your vault items" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Ești sigur că dorești să ștergi permanent acest fișier?" }, "deleteFolder": { "message": "Ștergere dosar" @@ -462,19 +462,19 @@ "message": "Generare parolă" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Creează întrebarea de siguranța" }, "passwordGenerated": { - "message": "Password generated" + "message": "Parola creată" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Întrebare de siguranța creată" }, "usernameGenerated": { - "message": "Username generated" + "message": "Nume de utilizator creat" }, "emailGenerated": { - "message": "Email generated" + "message": "E-mail creat" }, "regeneratePassword": { "message": "Regenerare parolă" @@ -490,7 +490,7 @@ "description": "Card header for password generator include block" }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Includeți caractere mari", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -498,7 +498,7 @@ "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "Includeți caractere mici", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -506,7 +506,7 @@ "description": "Label for the password generator lowercase character checkbox" }, "numbersDescription": { - "message": "Include numbers", + "message": "Includeți cifre", "description": "Full description for the password generator numbers checkbox" }, "numbersLabel": { @@ -514,7 +514,7 @@ "description": "Label for the password generator numbers checkbox" }, "specialCharactersDescription": { - "message": "Include special characters", + "message": "Includeți caractere speciale", "description": "Full description for the password generator special characters checkbox" }, "numWords": { @@ -537,7 +537,7 @@ "message": "Minim de caractere speciale" }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Evită caracterele ambigue", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { @@ -547,6 +547,9 @@ "searchVault": { "message": "Căutare în seif" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Editare" }, @@ -587,7 +590,7 @@ "message": "Note" }, "privateNote": { - "message": "Private note" + "message": "Notă privată" }, "note": { "message": "Notă" @@ -656,7 +659,7 @@ "message": "Browserul dvs. nu acceptă copierea în clipboard. Transcrieți datele manual." }, "verifyYourIdentity": { - "message": "Verify your identity" + "message": "Verificați- vă identitatea" }, "weDontRecognizeThisDevice": { "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." @@ -671,10 +674,10 @@ "message": "Your vault is locked" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Contul dumneavoastră este blocat" }, "or": { - "message": "or" + "message": "sau" }, "unlock": { "message": "Deblocare" @@ -851,7 +854,7 @@ "message": "Bitwarden poate stoca și completa coduri de verificare în doi pași. Selectați pictograma camerei foto pentru a face o captură de ecran a codului QR de autentificare al acestui site, sau copiați și lipiți cheia în acest câmp." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "Află mai multe despre autentificatori" }, "copyTOTP": { "message": "Copiați cheia de autentificare (TOTP)" @@ -875,7 +878,7 @@ "message": "Enter the code sent to your email" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Introdu codul din aplicația de autentificare" }, "pressYourYubiKeyToAuthenticate": { "message": "Press your YubiKey to authenticate" @@ -887,7 +890,7 @@ "message": "Follow the steps below to finish logging in." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Urmează pașii de mai jos pentru a finaliza autentificarea cu cheia de securitate." }, "restartRegistration": { "message": "Reporniți înregistrarea" @@ -929,7 +932,7 @@ "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." }, "twoStepLoginConfirmationTitle": { - "message": "Continue to web app?" + "message": "Continuați în aplicația web?" }, "editedFolder": { "message": "Dosar salvat" @@ -1046,7 +1049,7 @@ "message": "Click items to autofill on Vault view" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Faceți clic pe elementele din sugestia de completare automată pentru a completa" }, "clearClipboard": { "message": "Golire clipboard", @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Solicitați actualizarea autentificării existente" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funcție indisponibilă" }, - "encryptionKeyMigrationRequired": { - "message": "Este necesară migrarea cheilor de criptare. Autentificați-vă prin intermediul seifului web pentru a vă actualiza cheia de criptare." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Abonament Premium" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Cod de securitate" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Stabiliți codul PIN de deblocare Bitwarden. Setările codului PIN vor fi reinițializate dacă vă deconectați vreodată din aplicație." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Codul PIN este necesar." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Trebuie să vă verificați e-mailul pentru a utiliza această caracteristică. Puteți verifica e-mailul în seiful web." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Parola principală actualizată" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Parolă principală compromisă" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Este necesară aprobarea dispozitivului. Selectați o opțiune de autorizare de mai jos:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Cereți aprobarea administratorului" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Identificatorul SSO al organizației este necesar." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/ru/messages.json b/apps/browser/src/_locales/ru/messages.json index a6c16ca01ce..88fa89ac73e 100644 --- a/apps/browser/src/_locales/ru/messages.json +++ b/apps/browser/src/_locales/ru/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Поиск в хранилище" }, + "resetSearch": { + "message": "Сбросить поиск" + }, "edit": { "message": "Изменить" }, @@ -1173,6 +1176,12 @@ "message": "О нет! Мы не смогли сохранить это. Попробуйте ввести данные вручную.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "После смены пароля потребуется авторизоваться с новым паролем. Активные сессии на других устройствах будут завершены в течение одного часа." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Измените мастер-пароль, чтобы завершить восстановление аккаунта." + }, "enableChangedPasswordNotification": { "message": "Спрашивать при обновлении существующего логина" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Функция недоступна" }, - "encryptionKeyMigrationRequired": { - "message": "Требуется миграция ключа шифрования. Чтобы обновить ключ шифрования, войдите через веб-хранилище." + "legacyEncryptionUnsupported": { + "message": "Устаревшее шифрование больше не поддерживается. Для восстановления аккаунта обратитесь в службу поддержки." }, "premiumMembership": { "message": "Премиум" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Код безопасности" }, + "cardNumber": { + "message": "номер карты" + }, "ex": { "message": "напр." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Ключ SSH" }, + "typeNote": { + "message": "Заметка" + }, "newItemHeader": { "message": "Новый $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Установите PIN-код для разблокировки Bitwarden. Настройки PIN-кода будут сброшены, если вы когда-либо полностью выйдете из приложения." }, - "setYourPinCode1": { - "message": "Ваш PIN-код будет использоваться для разблокировки Bitwarden вместо мастер-пароля. PIN-код будет сброшен, если вы выйдете из Bitwarden." + "setPinCode": { + "message": "Вы можете использовать этот PIN-код для разблокировки Bitwarden. PIN-код будет сброшен, если вы когда-либо полностью выйдете из приложения." }, "pinRequired": { "message": "Необходим PIN-код." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Импорт элементов в ваше личное хранилище отключен политикой организации." }, + "restrictCardTypeImport": { + "message": "Невозможно импортировать элементы карт" + }, + "restrictCardTypeImportDesc": { + "message": "Политика, установленная 1 или более организациями, не позволяет импортировать карты в ваши хранилища." + }, "domainsTitle": { "message": "Домены", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Изменить" }, + "changePassword": { + "message": "Изменить пароль", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Изменить пароль - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Пароль, подверженный риску" + }, "atRiskPasswords": { "message": "Пароли, подверженные риску" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Ваш пароль для этого сайта подвержен риску. Организация $ORGANIZATION$ попросила вас изменить его.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "Организация $ORGANIZATION$ просит вас изменить этот пароль, поскольку он подвержен риску. Перейдите в настройки аккаунта для изменения пароля.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Проверить и изменить один пароль, подверженный риску" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Для использования этой функции необходимо подтвердить ваш email. Вы можете это сделать в веб-хранилище." }, + "masterPasswordSuccessfullySet": { + "message": "Мастер-пароль успешно установлен" + }, "updatedMasterPassword": { "message": "Мастер-пароль обновлен" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Запрос отправлен" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Запрос входа для $EMAIL$ на $DEVICE$ одобрен", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Вы отклонили попытку авторизации с другого устройства. Если это были вы, попробуйте авторизоваться с этого устройства еще раз." + }, + "device": { + "message": "Устройство" + }, + "loginStatus": { + "message": "Статус авторизации" + }, + "masterPasswordChanged": { + "message": "Мастер-пароль сохранен" + }, "exposedMasterPassword": { "message": "Мастер-пароль скомпрометирован" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Запомнить это устройство, чтобы в будущем авторизовываться быстрее" }, + "manageDevices": { + "message": "Управление устройствами" + }, + "currentSession": { + "message": "Текущая сессия" + }, + "mobile": { + "message": "Мобильный", + "description": "Mobile app" + }, + "extension": { + "message": "Расширение", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Компьютер", + "description": "Desktop app" + }, + "webVault": { + "message": "Веб-хранилище" + }, + "webApp": { + "message": "Веб-приложение" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Запрос в ожидании" + }, + "firstLogin": { + "message": "Первый вход" + }, + "trusted": { + "message": "Доверенный" + }, + "needsApproval": { + "message": "Требуется одобрение" + }, + "devices": { + "message": "Устройства" + }, + "accessAttemptBy": { + "message": "Попытка доступа $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Подтвердить доступ" + }, + "denyAccess": { + "message": "Отказать в доступе" + }, + "time": { + "message": "Время" + }, + "deviceType": { + "message": "Тип устройства" + }, + "loginRequest": { + "message": "Запрос на вход" + }, + "thisRequestIsNoLongerValid": { + "message": "Этот запрос больше не действителен." + }, + "loginRequestHasAlreadyExpired": { + "message": "Запрос на вход истек." + }, + "justNow": { + "message": "Только что" + }, + "requestedXMinutesAgo": { + "message": "Запрошено $MINUTES$ минут назад", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Требуется одобрение устройства. Выберите вариант ниже:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Запросить одобрение администратора" }, + "unableToCompleteLogin": { + "message": "Не удалось завершить вход" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Вам необходимо авторизоваться с доверенного устройства или попросить вашего администратора назначить вам пароль." + }, "ssoIdentifierRequired": { "message": "Требуется идентификатор SSO организации." }, @@ -3609,19 +3779,11 @@ "message": "В целях обеспечения безопасности вашего аккаунта продолжайте только в том случае, если вы являетесь членом этой организации, у вас включено восстановление аккаунта, а отображаемый ниже отпечаток совпадает с отпечатком организации." }, "orgTrustWarning1": { - "message": "В этой организации действует политика, которая позволит вам участвовать в восстановлении аккаунта. Регистрация позволит администраторам организации изменить ваш пароль. Продолжайте, только если вы знаете эту организацию и фраза отпечатков, показанная ниже, совпадает с отпечатками организации." + "message": "Эта организация имеет корпоративную политику, которая зарегистрирует вас в системе восстановления аккаунта. Регистрация позволит администраторам организации изменить ваш пароль. Продолжайте только в том случае, если вы узнаете эту организацию и фраза отпечатка, отображаемая ниже, соответствует отпечатку организации." }, "trustUser": { "message": "Доверенный пользователь" }, - "sendsNoItemsTitle": { - "message": "Нет активных Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Используйте Send для безопасного обмена зашифрованной информацией с кем угодно.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Безопасная отправка конфиденциальной информации", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Основные форматы", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Обнаружение совпадения URI - это способ, с помощью которого Bitwarden идентифицирует предложения по автозаполнению.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Регулярное выражение\" - это расширенный вариант с повышенным риском раскрытия учетных данных.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Начинается с\" - это расширенный вариант с повышенным риском раскрытия учетных данных.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Подробнее об обнаружении совпадений", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Расширенные настройки", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Перейти к настройкам браузера?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Скопировать $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Копировать $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Установить PIN--код разблокировки" }, + "unlockWithBiometricSet": { + "message": "Разблокировка с помощью биометрии настроена" + }, "authenticating": { "message": "Аутентификация" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "У вас нет прав для просмотра этой страницы. Попробуйте авторизоваться под другим аккаунтом." + }, + "wasmNotSupported": { + "message": "WebAssembly не поддерживается вашим браузером или не включен. WebAssembly необходим для использования приложения Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Больше" + }, + "showLess": { + "message": "Меньше" } } diff --git a/apps/browser/src/_locales/si/messages.json b/apps/browser/src/_locales/si/messages.json index 1b024ddaae8..dd2df6f309c 100644 --- a/apps/browser/src/_locales/si/messages.json +++ b/apps/browser/src/_locales/si/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "සුරක්ෂිතාගාරය සොයන්න" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "සංස්කරණය" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "විශේෂාංගය ලබාගත නොහැක" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "වාරික සාමාජිකත්වය" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "ආරක්ෂක කේතය" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "හිටපු." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "බිට්වර්ඩන් අගුළු ඇරීමට ඔබේ PIN අංකය කේතය සකසන්න. ඔබ කවදා හෝ යෙදුමෙන් සම්පූර්ණයෙන්ම පුරනය වී ඇත්නම් ඔබගේ PIN සැකසුම් නැවත සකසනු ඇත." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN කේතය අවශ්ය වේ." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "මෙම අංගය භාවිතා කිරීම සඳහා ඔබේ විද්යුත් තැපෑල සත්යාපනය කළ යුතුය. වෙබ් සුරක්ෂිතාගාරයේ ඔබගේ විද්යුත් තැපෑල සත්යාපනය කළ හැකිය." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "යාවත්කාලීන කරන ලද මාස්ටර් මුරපදය" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/sk/messages.json b/apps/browser/src/_locales/sk/messages.json index d25ea28a614..e12a0c97ac4 100644 --- a/apps/browser/src/_locales/sk/messages.json +++ b/apps/browser/src/_locales/sk/messages.json @@ -216,7 +216,7 @@ "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { - "message": "Vygenerovať heslo (skopírované)" + "message": "Vygenerovať heslo (+skopírovať)" }, "copyElementIdentifier": { "message": "Kopírovať názov vlastného poľa" @@ -547,6 +547,9 @@ "searchVault": { "message": "Prehľadávať trezor" }, + "resetSearch": { + "message": "Resetovať vyhľadávanie" + }, "edit": { "message": "Upraviť" }, @@ -976,7 +979,7 @@ "description": "'Domain' here refers to an internet domain name (e.g. 'bitwarden.com') and the message in whole described the act of putting a domain value into the context." }, "addedItem": { - "message": "Pridaná položka" + "message": "Položka bola pridaná" }, "editedItem": { "message": "Položka upravená" @@ -1173,6 +1176,12 @@ "message": "Ale nie! Nepodarilo sa nám to uložiť. Skúste zadať údaje manuálne.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Po zmene hesla sa musíte prihlásiť pomocou nového hesla. Aktívne relácie na iných zariadeniach budú do jednej hodiny odhlásené." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Zmeňte hlavné heslo, aby ste dokončili obnovenie účtu." + }, "enableChangedPasswordNotification": { "message": "Požiadať o aktualizáciu existujúceho prihlasovania" }, @@ -1213,11 +1222,11 @@ "message": "Sekundárnym kliknutím získate prístup k vygenerovaniu hesiel a zodpovedajúcim prihláseniam pre webovú stránku. Platí pre všetky prihlásené účty." }, "defaultUriMatchDetection": { - "message": "Predvolené mapovanie", + "message": "Predvolený spôsob zisťovania zhody URI", "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Vyberte si predvolený spôsob mapovania, ktorý bude použitý pre prihlasovacie údaje pri využití funkcí ako je napríklad automatické vypĺňanie hesiel." + "message": "Vyberte predvolený spôsob zisťovania zhody, ktorý bude použitý pre prihlasovacie údaje pri využití funkcií, ako je napríklad automatické vypĺňanie hesiel." }, "theme": { "message": "Motív" @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funkcia nie je k dispozícii" }, - "encryptionKeyMigrationRequired": { - "message": "Vyžaduje sa migrácia šifrovacieho kľúča. Na aktualizáciu šifrovacieho kľúča sa prihláste cez webový trezor." + "legacyEncryptionUnsupported": { + "message": "Staršie šifrovanie už nie je podporované. Ak chcete obnoviť svoj účet, obráťte sa na podporu." }, "premiumMembership": { "message": "Prémiové členstvo" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Bezpečnostný kód" }, + "cardNumber": { + "message": "číslo karty" + }, "ex": { "message": "napr." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Kľúč SSH" }, + "typeNote": { + "message": "Poznámka" + }, "newItemHeader": { "message": "Nové $TYPE$", "placeholders": { @@ -2046,11 +2061,11 @@ "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { - "message": "Spôsob mapovania", + "message": "Zisťovanie zhody", "description": "URI match detection for autofill." }, "defaultMatchDetection": { - "message": "Predvolené mapovanie", + "message": "Predvolené zisťovanie zhody", "description": "Default URI match detection for autofill." }, "toggleOptions": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Nastaviť kód PIN na odomykanie Bitwardenu. Nastavenie PIN sa vynuluje, ak sa úplne odhlásite z aplikácie." }, - "setYourPinCode1": { - "message": "Na odomknutie Bitwardenu sa namiesto hlavného hesla použije váš PIN. Váš PIN sa resetuje, ak sa niekedy úplne odhlásite zo Bitwardenu." + "setPinCode": { + "message": "Tento PIN môžete použiť na odomknutie Bitwardenu. PIN sa resetuje, ak sa úplne odhlásite z aplikácie." }, "pinRequired": { "message": "Kód PIN je povinný." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Zásady organizácie zablokovali importovanie položiek do vášho osobného trezoru." }, + "restrictCardTypeImport": { + "message": "Položky typu karta sa nedajú importovať" + }, + "restrictCardTypeImportDesc": { + "message": "Politika nastavená 1 alebo viacerými organizáciami vám bráni v importovaní kariet do vašich trezorov." + }, "domainsTitle": { "message": "Domény", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Zmeniť" }, + "changePassword": { + "message": "Zmeniť heslo", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Zmeniť heslo - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Rizikové heslo" + }, "atRiskPasswords": { "message": "Rizikové heslá" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Vaše heslo pre túto stránku je rizikové. Organizácia $ORGANIZATION$ vás požiadala o jeho zmenu.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ chce, aby ste toto heslo zmenili, pretože je rizikové. Prejdite do nastavení svojho účtu a zmeňte heslo.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Skontrolujte a zmeňte jedno ohrozené heslo" }, @@ -2866,7 +2914,7 @@ "message": "Skryť moju e-mailovú adresu pri zobrazení." }, "passwordPrompt": { - "message": "Znova zadajte hlavné heslo" + "message": "Vyzvať na zadanie hesla" }, "passwordConfirmation": { "message": "Potvrdenie hlavného hesla" @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Na použitie tejto funkcie musíte overiť svoj e-mail. Svoj e-mail môžete overiť vo webovom trezore." }, + "masterPasswordSuccessfullySet": { + "message": "Hlavné heslo bolo úspešne nastavené" + }, "updatedMasterPassword": { "message": "Hlavné heslo aktualizované" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Požiadavka bola odoslaná" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Potvrdené prihlásenie pre $EMAIL$ na $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Odmietli ste pokus o prihlásenie z iného zariadenia. Ak ste to boli vy, skúste sa prihlásiť pomocou zariadenia znova." + }, + "device": { + "message": "Zariadenie" + }, + "loginStatus": { + "message": "Stav prihlásenia" + }, + "masterPasswordChanged": { + "message": "Hlavné heslo uložené" + }, "exposedMasterPassword": { "message": "Odhalené hlavné heslo" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Zapamätať si toto zariadenie, pre budúce bezproblémové prihlásenie" }, + "manageDevices": { + "message": "Spravovať zariadenia" + }, + "currentSession": { + "message": "Aktuálna relácia" + }, + "mobile": { + "message": "Mobil", + "description": "Mobile app" + }, + "extension": { + "message": "Rozšírenie", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Počítač", + "description": "Desktop app" + }, + "webVault": { + "message": "Webový trezor" + }, + "webApp": { + "message": "Webová aplikácia" + }, + "cli": { + "message": "Príkazový riadok (CLI)" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Žiadosť čaká na spracovanie" + }, + "firstLogin": { + "message": "Prvé prihlásenie" + }, + "trusted": { + "message": "Dôveryhodné" + }, + "needsApproval": { + "message": "Potrebuje súhlas" + }, + "devices": { + "message": "Zariadenia" + }, + "accessAttemptBy": { + "message": "Pokus o prístup z $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Potvrdiť prístup" + }, + "denyAccess": { + "message": "Zamietnuť prístup" + }, + "time": { + "message": "Čas" + }, + "deviceType": { + "message": "Typ zariadenia" + }, + "loginRequest": { + "message": "Žiadosť o prihlásenie" + }, + "thisRequestIsNoLongerValid": { + "message": "Táto žiadosť už nie je platná." + }, + "loginRequestHasAlreadyExpired": { + "message": "Platnosť žiadosti o prihlásenie už vypršala." + }, + "justNow": { + "message": "Práve teraz" + }, + "requestedXMinutesAgo": { + "message": "Vyžiadané pred $MINUTES$ min.", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Vyžaduje sa schválenie zariadenia. Vyberte možnosť schválenia nižšie:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Žiadosť o schválenie správcom" }, + "unableToCompleteLogin": { + "message": "Nepodarilo sa dokončiť prihlásenie" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Musíte sa prihlásiť na dôveryhodnom zariadení alebo požiadať správcu o priradenie hesla." + }, "ssoIdentifierRequired": { "message": "Pole identifikátora SSO je povinné." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Dôverovať používateľovi" }, - "sendsNoItemsTitle": { - "message": "Žiadne aktívne Sendy", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Použite Send na bezpečné zdieľanie zašifrovaných informácii s kýmkoľvek.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send, citlivé informácie bezpečne", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Bežné formáty", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Zisťovanie zhody URI je spôsob, akým Bitwarden identifikuje návrhy na automatické vypĺňanie.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regulárny výraz\" je pokročilá možnosť so zvýšeným rizikom odhalenia prihlasovacích údajov.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Začína na\" je rozšírená možnosť so zvýšeným rizikom odhalenia prihlasovacích údajov.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Viac informácií o zisťovaní zhody", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Rozšírené možnosti", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Pokračovať do nastavení prehliadača?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Kopírovať $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Kopírovať $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4417,7 +4599,7 @@ "message": "Nie je čo kopírovať" }, "assignToCollections": { - "message": "Prideliť k zbierkam" + "message": "Priradiť ku zbierkam" }, "copyEmail": { "message": "Skopírovať e-mail" @@ -4664,7 +4846,7 @@ } }, "showMatchDetection": { - "message": "Zobraziť spôsob mapovania $WEBSITE$", + "message": "Zobraziť zisťovanie zhody $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4673,7 +4855,7 @@ } }, "hideMatchDetection": { - "message": "Skryť spôsob mapovania $WEBSITE$", + "message": "Skryť spôsob zisťovania zhody $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4739,7 +4921,7 @@ "message": "Položky si budú môcť pozrieť len členovia organizácie s prístupom k týmto zbierkam." }, "bulkCollectionAssignmentWarning": { - "message": "Vybrali ste $TOTAL_COUNT$ položky. Nemôžete aktualizovať $READONLY_COUNT$ položky(-iek), pretože nemáte oprávnenie na úpravu.", + "message": "Vybrali ste položky ($TOTAL_COUNT$). Nemôžete aktualizovať $READONLY_COUNT$ položky(-iek), pretože nemáte oprávnenie na úpravu.", "placeholders": { "total_count": { "content": "$1", @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "PIN na odomknutie nastavený" }, + "unlockWithBiometricSet": { + "message": "Odomknutie biometrickými údajmi nastavené" + }, "authenticating": { "message": "Overuje sa" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Nemáte oprávnenie na zobrazenie tejto stránky. Skúste sa prihlásiť pomocou iného účtu." + }, + "wasmNotSupported": { + "message": "WebAssembly nie je vo vašom prehliadači podporovaný alebo nie je povolený. Na používanie Bitwardenu sa vyžaduje WebAssembly.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Zobraziť viac" + }, + "showLess": { + "message": "Zobraziť menej" } } diff --git a/apps/browser/src/_locales/sl/messages.json b/apps/browser/src/_locales/sl/messages.json index 703563523ac..3af24b85889 100644 --- a/apps/browser/src/_locales/sl/messages.json +++ b/apps/browser/src/_locales/sl/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Išči v trezorju" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Uredi" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Predlagaj posodobitev obstoječe prijave" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funkcija ni na voljo." }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium članstvo" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Varnostna koda" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "npr." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Za odklep Bitwardna si nastavite PIN-kodo. PIN-koda bo ponastavljena, če se boste popolnoma odjavili iz aplikacije." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "Potrebna je PIN-koda." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Za uporabo te funkcionalnosti morate potrditi svoj e-naslov. To lahko storite v spletnem trezorju." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Posodobi glavno geslo" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/sr/messages.json b/apps/browser/src/_locales/sr/messages.json index 59d72b93173..12d0c5b015e 100644 --- a/apps/browser/src/_locales/sr/messages.json +++ b/apps/browser/src/_locales/sr/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Претражи сеф" }, + "resetSearch": { + "message": "Ресетовати претрагу" + }, "edit": { "message": "Уреди" }, @@ -1173,6 +1176,12 @@ "message": "Ох не! Нисмо могли да то сачувамо. Покушајте да ручно унесете детаље.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Након промене лозинке, мораћете да се пријавите са новом лозинком. Активне сесије на другим уређајима биће одјављене у року од једног сата." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Промените главну лозинку да бисте завршили опоравак налога." + }, "enableChangedPasswordNotification": { "message": "Питај за ажурирање постојеће пријаве" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Функција је недоступна" }, - "encryptionKeyMigrationRequired": { - "message": "Потребна је миграција кључа за шифровање. Пријавите се преко веб сефа да бисте ажурирали кључ за шифровање." + "legacyEncryptionUnsupported": { + "message": "Legacy енкрипција више није подржана. Молимо контактирајте подршку за повраћај налога." }, "premiumMembership": { "message": "Премијум чланство" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Сигурносни код" }, + "cardNumber": { + "message": "број картице" + }, "ex": { "message": "нпр." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH кључ" }, + "typeNote": { + "message": "Белешка" + }, "newItemHeader": { "message": "Нови $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Поставите свој ПИН код за откључавање Bitwarden-а. Поставке ПИН-а ће се ресетовати ако се икада потпуно одјавите из апликације." }, - "setYourPinCode1": { - "message": "Ваш ПИН ће се користити за откључавање Bitwarden-а уместо ваше главне лозинке. Ваш ПИН ће се ресетовати ако се икада потпуно одјавите са Bitwarden-а." + "setPinCode": { + "message": "Можете употребити овај ПИН да би деблокирали Bitwarden. Ваш ПИН ће се ресетовати ако се икада у потпуности одјавите из апликације." }, "pinRequired": { "message": "ПИН је обавезан." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Политика организације је блокирала увоз ставки у ваш појединачни сеф." }, + "restrictCardTypeImport": { + "message": "Не могу увозити врсте картица" + }, + "restrictCardTypeImportDesc": { + "message": "Политика која је поставила 1 или више организација спречава вас да се увозе картице у сефу." + }, "domainsTitle": { "message": "Домени", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Промени" }, + "changePassword": { + "message": "Промени лозинку", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Промена лозинке - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Лозинка под ризиком" + }, "atRiskPasswords": { "message": "Лозинке под ризиком" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Ваша лозинка за ову страницу је ризична. $ORGANIZATION$ је затражио да је промените.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ жели да промените ову лозинку јер је ризична. Идите до поставки вашег налога да бисте променили лозинку.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Прегледајте и промените једну лозинку за ризик" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Морате да потврдите е-пошту да бисте користили ову функцију. Можете да потврдите е-пошту у веб сефу." }, + "masterPasswordSuccessfullySet": { + "message": "Главна лозинка успешно постављена" + }, "updatedMasterPassword": { "message": "Главна лозинка ажурирана" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Захтев је послат" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Захтев за пријаву одобрен за $EMAIL$ на $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Одбили сте покушај пријаве са другог уређаја. Ако сте то били ви, покушајте поново да се пријавите помоћу уређаја." + }, + "device": { + "message": "Уређај" + }, + "loginStatus": { + "message": "Статус пријаве" + }, + "masterPasswordChanged": { + "message": "Главна лозинка сачувана" + }, "exposedMasterPassword": { "message": "Изложена главна лозинка" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Запамтити овај уређај да би будуће пријаве биле беспрекорне" }, + "manageDevices": { + "message": "Управљање уређајима" + }, + "currentSession": { + "message": "Тренутна сесија" + }, + "mobile": { + "message": "Мобилни", + "description": "Mobile app" + }, + "extension": { + "message": "Додатак", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Десктоп", + "description": "Desktop app" + }, + "webVault": { + "message": "Интернет Сеф" + }, + "webApp": { + "message": "Веб апликација" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Захтев је на чекању" + }, + "firstLogin": { + "message": "Прва пријава" + }, + "trusted": { + "message": "Поуздан" + }, + "needsApproval": { + "message": "Потребно је одобрење" + }, + "devices": { + "message": "Уређаји" + }, + "accessAttemptBy": { + "message": "Покушај приступа са $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Потврди приступ" + }, + "denyAccess": { + "message": "Одбиј приступ" + }, + "time": { + "message": "Време" + }, + "deviceType": { + "message": "Тип уређаја" + }, + "loginRequest": { + "message": "Захтев за пријаву" + }, + "thisRequestIsNoLongerValid": { + "message": "Овај захтев више није важећи." + }, + "loginRequestHasAlreadyExpired": { + "message": "Захтев за пријаву је већ истекао." + }, + "justNow": { + "message": "Управо сада" + }, + "requestedXMinutesAgo": { + "message": "Затражено пре $MINUTES$ минута", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Потребно је одобрење уређаја. Изаберите опцију одобрења испод:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Затражити одобрење администратора" }, + "unableToCompleteLogin": { + "message": "Није могуће завршити пријаву" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Потребно је да се пријавите на поузданом уређају или да замолите администратора да вам додели лозинку." + }, "ssoIdentifierRequired": { "message": "Потребан је SSO идентификатор организације." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Повери кориснику" }, - "sendsNoItemsTitle": { - "message": "Нема активних Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Употребите Send да безбедно делите шифроване информације са било ким.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Шаљите безбедно осетљиве информације", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Уобичајени формати", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Детекција подударања URI-ја је начин на који Bitwarden идентификује предлоге за ауто-попуњавање.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "„Регуларни израз“ је напредна опција са повећаним ризиком од откривања акредитива.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "„Почни са“ је напредна опција са повећаним ризиком од откривања акредитива.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Више о откривању подударања", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Напредне опције", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Желите ли да наставите на подешавања претраживача?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Копирај $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Копирај $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Постављен ПИН деблокирања" }, + "unlockWithBiometricSet": { + "message": "Откључај биометријом" + }, "authenticating": { "message": "Аутентификација" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "Немате дозволе за преглед ове странице. Покушајте да се пријавите са другим налогом." + }, + "wasmNotSupported": { + "message": "WebAssembly није подржано или није уапљено на вашем прегледачу. WebAssembly је потребно да би се користила апликација Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/sv/messages.json b/apps/browser/src/_locales/sv/messages.json index 1fcd208136e..1174b6ac077 100644 --- a/apps/browser/src/_locales/sv/messages.json +++ b/apps/browser/src/_locales/sv/messages.json @@ -3,7 +3,7 @@ "message": "Bitwarden" }, "appLogoLabel": { - "message": "Bitwarden logo" + "message": "Bitwardens logotyp" }, "extName": { "message": "Bitwarden Lösenordshanterare", @@ -84,7 +84,7 @@ "message": "Huvudlösenordsledtråd (valfri)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Lösenordsstyrka $SCORE$ (score)", "placeholders": { "score": { "content": "$1", @@ -105,7 +105,7 @@ } }, "finishJoiningThisOrganizationBySettingAMasterPassword": { - "message": "Finish joining this organization by setting a master password." + "message": "Avsluta anslutningen till denna organisation genom att ange ett huvudlösenord." }, "tab": { "message": "Flik" @@ -264,7 +264,7 @@ "message": "Begär lösenordsledtråd" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" + "message": "Ange din e-postadress för kontot så skickas en lösenordshint till dig" }, "getMasterPasswordHint": { "message": "Hämta huvudlösenordsledtråd" @@ -350,7 +350,7 @@ "message": "Bitwarden Hemlighetshanterare" }, "continueToSecretsManagerPageDesc": { - "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + "message": "Lagra, hantera och dela utvecklarhemligheter på ett säkert sätt med Bitwarden Secrets Manager. Läs mer på webbplatsen bitwarden.com." }, "passwordlessDotDev": { "message": "Passwordless.dev" @@ -359,10 +359,10 @@ "message": "Skapa smidiga och säkra inloggningsupplevelser fria från traditionella lösenord med Passwordless.dev. Läs mer på bitwarden.com hemsidan." }, "freeBitwardenFamilies": { - "message": "Free Bitwarden Families" + "message": "Gratis Bitwarden Familjer" }, "freeBitwardenFamiliesPageDesc": { - "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + "message": "Du är berättigad till gratis Bitwarden Families. Lös in erbjudandet idag i webbappen." }, "version": { "message": "Version" @@ -398,7 +398,7 @@ "message": "Mappnamn" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Nästla en mapp genom att lägga till namnet på den överordnade mappen följt av \"/\". Exempel: Sociala/Forums" }, "noFoldersAdded": { "message": "Inga mappar tillagda" @@ -407,7 +407,7 @@ "message": "Skapa mappar för att organisera dina valvobjekt" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Är du säker på att du vill radera den här mappen permanent?" }, "deleteFolder": { "message": "Radera mapp" @@ -541,12 +541,15 @@ "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "Företagets policykrav har tillämpats på dina generatoralternativ.", "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Sök i valvet" }, + "resetSearch": { + "message": "Nollställ sökning" + }, "edit": { "message": "Redigera" }, @@ -566,7 +569,7 @@ "message": "Lösenord" }, "totp": { - "message": "Authenticator secret" + "message": "Autentiserarens hemlighet" }, "passphrase": { "message": "Lösenfras" @@ -635,7 +638,7 @@ "message": "Upplåsningsalternativ" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Set up an unlock method to change your vault timeout action." + "message": "Konfigurera en upplåsningsmetod för att ändra timeout-åtgärden för valvet." }, "unlockMethodNeeded": { "message": "Ställ in en upplåsningsmetod i Inställningar" @@ -659,7 +662,7 @@ "message": "Verifiera din identitet" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Vi känner inte igen den här enheten. Ange koden som skickats till din e-post för att verifiera din identitet." }, "continueLoggingIn": { "message": "Fortsätt logga in" @@ -814,7 +817,7 @@ "message": "Verifieringskod krävs." }, "webauthnCancelOrTimeout": { - "message": "The authentication was cancelled or took too long. Please try again." + "message": "Autentiseringen avbröts eller tog för lång tid. Vänligen försök igen." }, "invalidVerificationCode": { "message": "Ogiltig verifieringskod" @@ -839,16 +842,16 @@ "message": "Autentiseringsnyckel tillagd" }, "totpCapture": { - "message": "Scan authenticator QR code from current webpage" + "message": "Skanna QR-koden för autentisering från aktuell webbsida" }, "totpHelperTitle": { "message": "Gör tvåstegsverifiering sömlös" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden kan lagra och fylla i 2-stegs verifieringskoder. Kopiera och klistra in nyckeln i detta fält." }, "totpHelperWithCapture": { - "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + "message": "Bitwarden kan lagra och fylla i 2-stegsverifieringskoder. Välj kameraikonen för att ta en skärmdump av den här webbplatsens QR-kod för autentisering, eller kopiera och klistra in nyckeln i det här fältet." }, "learnMoreAboutAuthenticators": { "message": "Läs mer om autentiserare" @@ -881,13 +884,13 @@ "message": "Tryck på din YubiKey för att autentisera" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Tvåstegsinloggning med Duo krävs för ditt konto. Följ stegen nedan för att slutföra inloggningen." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Följ stegen nedan för att slutföra inloggningen." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Följ stegen nedan för att slutföra inloggningen med din säkerhetsnyckel." }, "restartRegistration": { "message": "Starta om registrering" @@ -1016,16 +1019,16 @@ "message": "Be om att lägga till inloggning" }, "vaultSaveOptionsTitle": { - "message": "Save to vault options" + "message": "Alternativ för att spara i valvet" }, "addLoginNotificationDesc": { "message": "Be om att lägga till ett objekt om det inte finns i ditt valv." }, "addLoginNotificationDescAlt": { - "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + "message": "Be att få lägga till ett objekt om det inte finns i ditt valv. Gäller för alla inloggade konton." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Visa alltid kort som Autofyll-förslag i Vault-vyn" }, "showCardsCurrentTab": { "message": "Visa kort på fliksida" @@ -1034,7 +1037,7 @@ "message": "Lista kortobjekt på fliksidan för enkel autofyll." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Visa alltid identiteter som Autofyll-förslag i Vault-vyn" }, "showIdentitiesCurrentTab": { "message": "Visa identiteter på fliksidan" @@ -1043,10 +1046,10 @@ "message": "Lista identitetsobjekt på fliksidan för enkel autofyll." }, "clickToAutofillOnVault": { - "message": "Click items to autofill on Vault view" + "message": "Klicka på objekt som ska fyllas i automatiskt i Vault-vyn" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Klicka på objekt i autofyllförslaget för att fylla i" }, "clearClipboard": { "message": "Rensa urklipp", @@ -1063,7 +1066,7 @@ "message": "Spara" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "Visa $ITEMNAME$, öppnas i nytt fönster", "placeholders": { "itemName": { "content": "$1" @@ -1072,18 +1075,18 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationNewItemAria": { - "message": "New Item, opens in new window", + "message": "Nytt föremål, öppnas i nytt fönster", "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Redigera innan du sparar", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Nytt meddelande" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$: Nytt meddelande", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1093,15 +1096,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "sparades till Bitwarden.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "uppdaterad i Bitwarden.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Välj $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1113,15 +1116,15 @@ } }, "saveAsNewLoginAction": { - "message": "Save as new login", + "message": "Spara som ny inloggning", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Update login", + "message": "Uppdatera inloggning", "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "Lås upp för att spara denna inloggning", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { @@ -1129,7 +1132,7 @@ "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Uppdatera befintlig inloggning", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { @@ -1141,7 +1144,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Bra jobbat! Du tog stegen för att göra dig och $ORGANIZATION$ säkrare.", "placeholders": { "organization": { "content": "$1" @@ -1150,7 +1153,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "Tack för att du gör $ORGANIZATION$ säkrare. Du har $TASK_COUNT$ fler lösenord att uppdatera.", "placeholders": { "organization": { "content": "$1" @@ -1162,17 +1165,23 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Ändra nästa lösenord", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { - "message": "Error saving", + "message": "Fel i sparandet", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "Oh no! We couldn't save this. Try entering the details manually.", + "message": "Åh nej! Vi kunde inte spara detta. Försök att ange uppgifterna manuellt.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "När du har ändrat ditt lösenord måste du logga in med det nya lösenordet. Aktiva sessioner på andra enheter kommer att loggas ut inom en timme." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Ändra ditt huvudlösenord för att slutföra återställningen av kontot." + }, "enableChangedPasswordNotification": { "message": "Be om att uppdatera befintlig inloggning" }, @@ -1180,7 +1189,7 @@ "message": "Be om att uppdatera ett lösenord när en ändring upptäcks på en webbplats." }, "changedPasswordNotificationDescAlt": { - "message": "Ask to update a login's password when a change is detected on a website. Applies to all logged in accounts." + "message": "Be att få uppdatera lösenordet för en inloggning när en ändring upptäcks på en webbplats. Gäller för alla inloggade konton." }, "enableUsePasskeys": { "message": "Be om att spara och använda lösennycklar" @@ -1207,10 +1216,10 @@ "message": "Visa alternativ för snabbmenyn" }, "contextMenuItemDesc": { - "message": "Använd ett andra klick för att komma åt lösenordsgenerering och matchande inloggningar för webbplatsen. " + "message": "Använd ett andra klick för att komma åt lösenordsgenerering och matchande inloggningar för webbplatsen." }, "contextMenuItemDescAlt": { - "message": "Use a secondary click to access password generation and matching logins for the website. Applies to all logged in accounts." + "message": "Använd ett sekundärt klick för att få tillgång till lösenordsgenerering och matchande inloggningar för webbplatsen. Gäller för alla inloggade konton." }, "defaultUriMatchDetection": { "message": "Standardmatchning för URI", @@ -1246,28 +1255,28 @@ "message": "Filformat" }, "fileEncryptedExportWarningDesc": { - "message": "This file export will be password protected and require the file password to decrypt." + "message": "Den här filexporten kommer att vara lösenordsskyddad och kräver filens lösenord för att dekryptera." }, "filePassword": { "message": "Fillösenord" }, "exportPasswordDescription": { - "message": "This password will be used to export and import this file" + "message": "Detta lösenord kommer att användas för att exportera och importera denna fil" }, "accountRestrictedOptionDescription": { - "message": "Use your account encryption key, derived from your account's username and Master Password, to encrypt the export and restrict import to only the current Bitwarden account." + "message": "Använd ditt kontos krypteringsnyckel, som härrör från ditt kontos användarnamn och huvudlösenord, för att kryptera exporten och begränsa importen till endast det aktuella Bitwarden-kontot." }, "passwordProtectedOptionDescription": { - "message": "Set a file password to encrypt the export and import it to any Bitwarden account using the password for decryption." + "message": "Ange ett lösenord för filen för att kryptera exporten och importera den till valfritt Bitwarden-konto med lösenordet för dekryptering." }, "exportTypeHeading": { "message": "Exporttyp" }, "accountRestricted": { - "message": "Account restricted" + "message": "Konto med restriktioner" }, "filePasswordAndConfirmFilePasswordDoNotMatch": { - "message": "“File password” and “Confirm file password“ do not match." + "message": "\"Fillösenord\" och \"Bekräfta fillösenord\" stämmer inte överens." }, "warning": { "message": "VARNING", @@ -1296,7 +1305,7 @@ "message": "Delad" }, "bitwardenForBusinessPageDesc": { - "message": "Bitwarden for Business allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website." + "message": "Med Bitwarden for Business kan du dela dina valvobjekt med andra genom att använda en organisation. Läs mer på webbplatsen bitwarden.com." }, "moveToOrganization": { "message": "Flytta till organisation" @@ -1354,7 +1363,7 @@ "message": "Fil" }, "fileToShare": { - "message": "File to share" + "message": "Fil att dela" }, "selectFile": { "message": "Välj en fil" @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Funktion ej tillgänglig" }, - "encryptionKeyMigrationRequired": { - "message": "Migrering av krypteringsnyckel krävs. Logga in på webbvalvet för att uppdatera din krypteringsnyckel." + "legacyEncryptionUnsupported": { + "message": "Legacy-kryptering stöds inte längre. Vänligen kontakta support för att återställa ditt konto." }, "premiumMembership": { "message": "Premium-medlemskap" @@ -1411,7 +1420,7 @@ "message": "Köp Premium" }, "premiumPurchaseAlertV2": { - "message": "You can purchase Premium from your account settings on the Bitwarden web app." + "message": "Du kan köpa Premium från dina kontoinställningar i Bitwardens webbapp." }, "premiumCurrentMember": { "message": "Du är en premium-medlem!" @@ -1459,10 +1468,10 @@ "message": "Ett premium-medlemskap krävs för att använda den här funktionen." }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "Timeout för autentisering" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "Autentiseringssessionen timade ut. Vänligen starta om inloggningsprocessen." }, "verificationCodeEmailSent": { "message": "Verifieringsmeddelande har skickats till $EMAIL$.", @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Säkerhetskod" }, + "cardNumber": { + "message": "kortnummer" + }, "ex": { "message": "t. ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH-nyckel" }, + "typeNote": { + "message": "Anteckning" + }, "newItemHeader": { "message": "Ny $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Ange en PIN-kod för att låsa upp Bitwarden. Dina PIN-inställningar återställs om du någonsin loggar ut helt från programmet." }, - "setYourPinCode1": { - "message": "Din PIN-kod kommer att användas för att låsa upp Bitwarden istället för ditt huvudlösenord. Din PIN-kod kommer att återställas om du någonsin helt loggar ut från Bitwarden." + "setPinCode": { + "message": "Du kan använda denna PIN-kod för att låsa upp Bitwarden. Din PIN-kod kommer att återställas om du någonsin loggar ut helt från programmet." }, "pinRequired": { "message": "PIN-kod krävs." @@ -2205,7 +2220,7 @@ "message": "Använd detta lösenord" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Använd denna lösenfras" }, "useThisUsername": { "message": "Använd detta användarnamn" @@ -2275,7 +2290,7 @@ "message": "Fyllde i objektet automatiskt och sparade URI:n" }, "autoFillSuccess": { - "message": "Fyllde i objektet automatiskt" + "message": "Fyllde i objektet automatiskt " }, "insecurePageWarning": { "message": "Varning: Detta är en icke säkrad HTTP-sida, och all information du skickar kan potentiellt ses och ändras av andra. Denna inloggning sparades ursprungligen på en säker (HTTPS) sida." @@ -2377,7 +2392,7 @@ "message": "Integritetspolicy" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Ditt nya lösenord får inte vara samma som ditt nuvarande lösenord." }, "hintEqualsPassword": { "message": "Din lösenordsledtråd får inte vara samma som ditt lösenord." @@ -2386,10 +2401,10 @@ "message": "OK" }, "errorRefreshingAccessToken": { - "message": "Access Token Refresh Error" + "message": "Fel vid uppdatering av åtkomsttoken" }, "errorRefreshingAccessTokenDesc": { - "message": "No refresh token or API keys found. Please try logging out and logging back in." + "message": "Ingen uppdateringstoken eller API-nyckel hittades. Försök att logga ut och logga in igen." }, "desktopSyncVerificationTitle": { "message": "Verifiering av synkronisering med skrivbordsprogrammet" @@ -2428,10 +2443,10 @@ "message": "Kontoavvikelse" }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "Missmatchning av biometrisk nyckel" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "Biometrisk upplåsning misslyckades. Den biometriska hemliga nyckeln kunde inte låsa upp valvet. Försök att ställa in biometri igen." }, "biometricsNotEnabledTitle": { "message": "Biometri är inte aktiverat" @@ -2446,16 +2461,16 @@ "message": "Biometri i webbläsaren stöds inte på den här enheten." }, "biometricsNotUnlockedTitle": { - "message": "User locked or logged out" + "message": "Användaren är låst eller utloggad" }, "biometricsNotUnlockedDesc": { "message": "Lås upp den här användaren i skrivbordsprogrammet och försök igen." }, "biometricsNotAvailableTitle": { - "message": "Biometric unlock unavailable" + "message": "Biometrisk upplåsning ej tillgänglig" }, "biometricsNotAvailableDesc": { - "message": "Biometric unlock is currently unavailable. Please try again later." + "message": "Biometrisk upplåsning är för närvarande inte tillgänglig. Vänligen försök igen senare." }, "biometricsFailedTitle": { "message": "Biometri misslyckades" @@ -2482,17 +2497,23 @@ "message": "En organisationspolicy påverkar dina ägarskapsalternativ." }, "personalOwnershipPolicyInEffectImports": { - "message": "An organization policy has blocked importing items into your individual vault." + "message": "En organisationspolicy har blockerat import av objekt till ditt individuella valv." + }, + "restrictCardTypeImport": { + "message": "Det går inte att importera typer av kortposter" + }, + "restrictCardTypeImportDesc": { + "message": "En policy som har fastställts av en eller flera organisationer hindrar dig från att importera kort till dina valv." }, "domainsTitle": { "message": "Domäner", "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "Blockerade domäner" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "Läs mer om blockerade domäner" }, "excludedDomains": { "message": "Exkluderade domäner" @@ -2501,22 +2522,26 @@ "message": "Bitwarden kommer inte att fråga om att få spara inloggningsuppgifter för dessa domäner. Du måste uppdatera sidan för att ändringarna ska träda i kraft." }, "excludedDomainsDescAlt": { - "message": "Bitwarden will not ask to save login details for these domains for all logged in accounts. You must refresh the page for changes to take effect." + "message": "Bitwarden kommer inte att be om att få spara inloggningsuppgifter för dessa domäner för alla inloggade konton. Du måste uppdatera sidan för att ändringarna ska träda i kraft." }, "blockedDomainsDesc": { - "message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect." + "message": "Autofyll och andra relaterade funktioner kommer inte att erbjudas för dessa webbplatser. Du måste uppdatera sidan för att ändringarna ska träda i kraft." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "Autofyll är blockerat för den här webbplatsen." }, "autofillBlockedNoticeGuidance": { "message": "Ändra detta i inställningar" }, "change": { - "message": "Change" + "message": "Ändra" + }, + "changePassword": { + "message": "Ändra lösenord", + "description": "Change password button for browser at risk notification on login." }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "Byt lösenord - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2524,11 +2549,14 @@ } } }, + "atRiskPassword": { + "message": "Lösenord med risk" + }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Lösenord i riskzonen" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ ber dig att ändra ett lösenord eftersom det är i riskzonen.", "placeholders": { "organization": { "content": "$1", @@ -2537,7 +2565,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ begär att du ändrar $COUNT$-lösenorden eftersom de är i riskzonen.", "placeholders": { "organization": { "content": "$1", @@ -2550,7 +2578,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Dina organisationer begär att du ändrar $COUNT$-lösenorden eftersom de är i riskzonen.", "placeholders": { "count": { "content": "$1", @@ -2558,11 +2586,31 @@ } } }, + "atRiskChangePrompt": { + "message": "Ditt lösenord för den här webbplatsen är i fara. $ORGANIZATION$ har begärt att du ändrar det.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ vill att du ändrar det här lösenordet eftersom det är i riskzonen. Navigera till dina kontoinställningar för att ändra lösenordet.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Granska och ändra ett risklösenord" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Granska och ändra $COUNT$ riskfyllda lösenord", "placeholders": { "count": { "content": "$1", @@ -2571,40 +2619,40 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Ändra riskfyllda lösenord snabbare" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Uppdatera dina inställningar så att du snabbt kan autofylla dina lösenord och generera nya" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Granska riskfyllda inloggningar" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Granska riskfyllda lösenord" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Lösenorden i din organisation är i riskzonen eftersom de är svaga, återanvända och/eller exponerade.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Illustration of a list of logins that are at-risk." + "message": "Illustration av en lista över inloggningar som är i riskzonen." }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Skapa snabbt ett starkt, unikt lösenord med Bitwardens autofyllmeny på riskwebbplatsen.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password." + "message": "Illustration av Bitwardens autofyllmeny som visar ett genererat lösenord." }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Uppdatera i Bitwarden" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden kommer då att uppmana dig att uppdatera lösenordet i lösenordshanteraren.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." + "message": "Illustration av ett Bitwarden-meddelande som uppmanar användaren att uppdatera inloggningen." }, "turnOnAutofill": { "message": "Aktivera autofyll" @@ -2613,7 +2661,7 @@ "message": "Aktiverade autofyll" }, "dismiss": { - "message": "Dismiss" + "message": "Stäng" }, "websiteItemLabel": { "message": "Webbplats $number$ (URI)", @@ -2634,20 +2682,20 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "Blockerade domänändringar sparas" }, "excludedDomainsSavedSuccess": { - "message": "Excluded domain changes saved" + "message": "Ändringar för exkluderad domän sparas" }, "limitSendViews": { - "message": "Limit views" + "message": "Begränsa antalet visningar" }, "limitSendViewsHint": { - "message": "No one can view this Send after the limit is reached.", + "message": "Ingen kan se denna sändning efter att gränsen har nåtts.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ views left", + "message": "$ACCESSCOUNT$ visningar kvar", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -2661,14 +2709,14 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "Send details", + "message": "Skicka information", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { "message": "Text" }, "sendTypeTextToShare": { - "message": "Text to share" + "message": "Text att dela" }, "sendTypeFile": { "message": "Fil" @@ -2678,11 +2726,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Max antal åtkomster har uppnåtts", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { - "message": "Hide text by default" + "message": "Dölj text som standard" }, "expired": { "message": "Utgången" @@ -2729,7 +2777,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Are you sure you want to permanently delete this Send?", + "message": "Är du säker på att du vill ta bort det här meddelandet permanent?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { @@ -2740,7 +2788,7 @@ "message": "Raderingsdatum" }, "deletionDateDescV2": { - "message": "The Send will be permanently deleted on this date.", + "message": "Sändningen kommer att raderas permanent på detta datum.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -2762,7 +2810,7 @@ "message": "Anpassad" }, "sendPasswordDescV3": { - "message": "Add an optional password for recipients to access this Send.", + "message": "Lägg till ett valfritt lösenord för att mottagarna ska få åtkomst till detta meddelande.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { @@ -2785,15 +2833,15 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Skicka skapad framgångsrikt!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { - "message": "The Send will be available to anyone with the link for the next 1 hour.", + "message": "Sändningen kommer att vara tillgänglig för alla med länken under den kommande 1 timmen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHours": { - "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "message": "Sändningen kommer att vara tillgänglig för alla som har länken under de närmaste $HOURS$ timmarna.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "hours": { @@ -2803,11 +2851,11 @@ } }, "sendExpiresInDaysSingle": { - "message": "The Send will be available to anyone with the link for the next 1 day.", + "message": "Sändningen kommer att vara tillgänglig för alla som har länken under den kommande 1 dagen.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInDays": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Send kommer att vara tillgänglig för alla som har länken under de närmaste $DAYS$-dagarna.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2817,7 +2865,7 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Skicka länk kopierad", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { @@ -2825,11 +2873,11 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogText": { - "message": "Pop out extension?", + "message": "Pop out-förlängning?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { - "message": "To create a file Send, you need to pop out the extension to a new window.", + "message": "För att skapa en fil Skicka, måste du popa ut förlängningen till ett nytt fönster.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { @@ -2842,7 +2890,7 @@ "message": "För att välja en fil med Safari, öppna ett nytt fönster genom att klicka på denna banner." }, "popOut": { - "message": "Pop out" + "message": "Popa ut" }, "sendFileCalloutHeader": { "message": "Innan du börjar" @@ -2863,7 +2911,7 @@ "message": "Det gick inte att spara raderings- och utgångsdatum." }, "hideYourEmail": { - "message": "Hide your email address from viewers." + "message": "Dölj din e-postadress från tittarna." }, "passwordPrompt": { "message": "Återupprepa huvudlösenord" @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Du måste verifiera din e-postadress för att använda den här funktionen. Du kan verifiera din e-postadress i webbvalvet." }, + "masterPasswordSuccessfullySet": { + "message": "Masterlösenordet har ställts in" + }, "updatedMasterPassword": { "message": "Huvudlösenord uppdaterades" }, @@ -2896,7 +2947,7 @@ "message": "Ditt huvudlösenord följer inte ett eller flera av din organisations regler. För att komma åt ditt valv så måste du ändra ditt huvudlösenord nu. Om du gör det kommer du att loggas du ut ur din nuvarande session så du måste logga in på nytt. Aktiva sessioner på andra enheter kommer fortsatt vara aktiva i upp till en timme." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "Din organisation har inaktiverat betrodd enhetskryptering. Ange ett huvudlösenord för att komma åt ditt valv." }, "resetPasswordPolicyAutoEnroll": { "message": "Automatiskt deltagande" @@ -2939,10 +2990,10 @@ "message": "Minuter" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "Företagets policykrav har tillämpats på dina timeout-alternativ" }, "vaultTimeoutPolicyInEffect": { - "message": "Dina organisationsprinciper påverkar ditt valvs tid för timeout. Maximal tillåten tid innan timeout är $HOURS$ timmar och $MINUTES$ minuter", + "message": "Dina organisationsprinciper påverkar ditt valvs tid för timeout. Maximal tillåten tid innan timeout är $HOURS$ timmar och $MINUTES$ minuter.", "placeholders": { "hours": { "content": "$1", @@ -2955,7 +3006,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "$HOURS$ timme(n) och $MINUTES$ minut(er) maximalt.", "placeholders": { "hours": { "content": "$1", @@ -2968,7 +3019,7 @@ } }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Tidsgränsen överskrider den begränsning som har fastställts av din organisation: $HOURS$ timme(n) och $MINUTES$ minut(er) max", "placeholders": { "hours": { "content": "$1", @@ -2981,7 +3032,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": "Din organisations policyer påverkar valvets timeout. Högsta tillåtna timeout för valvet är $HOURS$ timme(n) och $MINUTES$ minut(er). Åtgärden för valvets timeout är inställd på $ACTION$.", "placeholders": { "hours": { "content": "$1", @@ -2998,7 +3049,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Your organization policies have set your vault timeout action to $ACTION$.", + "message": "I organisationens policyer har timeoutåtgärden för valvet ställts in på $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -3022,13 +3073,13 @@ "message": "Ingen unik identifierare hittades." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Ett huvudlösenord krävs inte längre för medlemmar i följande organisation. Vänligen bekräfta domänen nedan med din organisationsadministratör." }, "organizationName": { "message": "Organisationsnamn" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Key Connector-domän" }, "leaveOrganization": { "message": "Lämna organisation" @@ -3055,7 +3106,7 @@ "message": "Exporterar individuellt valv" }, "exportingIndividualVaultDescription": { - "message": "Only the individual vault items associated with $EMAIL$ will be exported. Organization vault items will not be included. Only vault item information will be exported and will not include associated attachments.", + "message": "Endast de enskilda valvobjekt som är associerade med $EMAIL$ exporteras. Valvobjekt för organisationer kommer inte att inkluderas. Endast information om valvobjektet exporteras och inkluderar inte tillhörande bilagor.", "placeholders": { "email": { "content": "$1", @@ -3064,7 +3115,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "Endast de enskilda valvobjekten inklusive bilagor som är associerade med $EMAIL$ exporteras. Organisationens valvobjekt kommer inte att inkluderas", "placeholders": { "email": { "content": "$1", @@ -3073,10 +3124,10 @@ } }, "exportingOrganizationVaultTitle": { - "message": "Exporting organization vault" + "message": "Exportera organisationsvalv" }, "exportingOrganizationVaultDesc": { - "message": "Only the organization vault associated with $ORGANIZATION$ will be exported. Items in individual vaults or other organizations will not be included.", + "message": "Endast det organisationsvalv som är associerat med $ORGANIZATION$ exporteras. Objekt i enskilda valv eller andra organisationer kommer inte att inkluderas.", "placeholders": { "organization": { "content": "$1", @@ -3088,24 +3139,24 @@ "message": "Fel" }, "decryptionError": { - "message": "Decryption error" + "message": "Dekrypteringsfel" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden kunde inte dekryptera valvföremålet/valvföremålen som listas nedan." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Kontakta kundtjänst", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "för att undvika ytterligare dataförlust.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { "message": "Generera användarnamn" }, "generateEmail": { - "message": "Generate email" + "message": "Generera e-post" }, "spinboxBoundariesHint": { "message": "Värde måste vara mellan $MIN$ och $MAX$.", @@ -3177,7 +3228,7 @@ "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Välj en domän som stöds av den valda tjänsten", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -3233,7 +3284,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ avvisade din begäran. Vänligen kontakta din tjänsteleverantör för hjälp.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3243,7 +3294,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ avvisade din begäran: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3257,7 +3308,7 @@ } }, "forwarderNoAccountId": { - "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "message": "Det gick inte att få $SERVICENAME$ maskerat ID för e-postkonto.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -3287,7 +3338,7 @@ } }, "forwarderUnknownError": { - "message": "Unknown $SERVICENAME$ error occurred.", + "message": "Okänt $SERVICENAME$-fel inträffade.", "description": "Displayed when the forwarding service failed due to an unknown error.", "placeholders": { "servicename": { @@ -3297,7 +3348,7 @@ } }, "forwarderUnknownForwarder": { - "message": "Unknown forwarder: '$SERVICENAME$'.", + "message": "Okänd vidarebefordrare: '$SERVICENAME$'.", "description": "Displayed when the forwarding service is not supported.", "placeholders": { "servicename": { @@ -3392,28 +3443,53 @@ "message": "En avisering har skickats till din enhet." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "Lås upp Bitwarden på din enhet eller på" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "webbapp" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Kontrollera att fingeravtrycksfrasen stämmer överens med den nedan innan du godkänner." }, "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "message": "Ett meddelande har skickats till din enhet" }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "Du kommer att få ett meddelande när begäran har godkänts" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Behöver du ett annat alternativ?" }, "loginInitiated": { "message": "Inloggning påbörjad" }, "logInRequestSent": { - "message": "Request sent" + "message": "Begäran skickad" + }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Inloggningsbegäran godkänd för $EMAIL$ på $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Du nekade ett inloggningsförsök från en annan enhet. Om det var du, försök att logga in med enheten igen." + }, + "device": { + "message": "Enhet" + }, + "loginStatus": { + "message": "Inloggningsstatus" + }, + "masterPasswordChanged": { + "message": "Huvudlösenordet sparades" }, "exposedMasterPassword": { "message": "Huvudlösenordet har exponerats" @@ -3452,7 +3528,7 @@ "message": "Hur du fyller i automatiskt" }, "autofillSelectInfoWithCommand": { - "message": "Select an item from this screen, use the shortcut $COMMAND$, or explore other options in settings.", + "message": "Välj ett objekt från den här skärmen, använd genvägen $COMMAND$ eller utforska andra alternativ i inställningarna.", "placeholders": { "command": { "content": "$1", @@ -3461,7 +3537,7 @@ } }, "autofillSelectInfoWithoutCommand": { - "message": "Select an item from this screen, or explore other options in settings." + "message": "Välj ett objekt från den här skärmen eller utforska andra alternativ i inställningarna." }, "gotIt": { "message": "Förstått" @@ -3485,7 +3561,7 @@ "message": "Kortkommandot för autofyll av inloggning är inte inställt. Du kan ändra det i webbläsarens inställningar." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "Genvägen för autofyll-inloggning är $COMMAND$. Hantera alla genvägar i webbläsarens inställningar.", "placeholders": { "command": { "content": "$1", @@ -3506,22 +3582,110 @@ "message": "Öppnas i ett nytt fönster" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "Kom ihåg den här enheten för att göra framtida inloggningar smidiga" + }, + "manageDevices": { + "message": "Hantera enheter" + }, + "currentSession": { + "message": "Aktuell session" + }, + "mobile": { + "message": "Mobil", + "description": "Mobile app" + }, + "extension": { + "message": "Tillägg", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Skrivbord", + "description": "Desktop app" + }, + "webVault": { + "message": "Webbvalv" + }, + "webApp": { + "message": "Webbapp" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Förfrågning väntar" + }, + "firstLogin": { + "message": "Första inloggningen" + }, + "trusted": { + "message": "Betrodd" + }, + "needsApproval": { + "message": "Kräver godkännande" + }, + "devices": { + "message": "Enheter" + }, + "accessAttemptBy": { + "message": "Åtkomstförsök av $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Bekräfta åtkomst" + }, + "denyAccess": { + "message": "Neka åtkomst" + }, + "time": { + "message": "Tid" + }, + "deviceType": { + "message": "Enhetstyp" + }, + "loginRequest": { + "message": "Begäran om inloggning" + }, + "thisRequestIsNoLongerValid": { + "message": "Denna begäran är inte längre giltig." + }, + "loginRequestHasAlreadyExpired": { + "message": "Inloggningsbegäran har redan gått ut." + }, + "justNow": { + "message": "Just nu" + }, + "requestedXMinutesAgo": { + "message": "Begärdes för $MINUTES$ minuter sedan", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } }, "deviceApprovalRequired": { - "message": "Device approval required. Select an approval option below:" + "message": "Godkännande av enhet krävs. Välj ett alternativ för godkännande nedan:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Godkännande av utrustning krävs" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "Välj ett godkännandealternativ nedan" }, "rememberThisDevice": { "message": "Kom ihåg denna enhet" }, "uncheckIfPublicDevice": { - "message": "Uncheck if using a public device" + "message": "Avmarkera om du använder en offentlig enhet" }, "approveFromYourOtherDevice": { "message": "Godkänn från din andra enhet" @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Be om godkännande från administratör" }, + "unableToCompleteLogin": { + "message": "Kunde inte slutföra inloggningen" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Du måste logga in på en betrodd enhet eller fråga din administratör att tilldela dig ett lösenord." + }, "ssoIdentifierRequired": { "message": "Organisationens SSO-identifierare krävs." }, @@ -3542,7 +3712,7 @@ "message": "Följ länken i e-postmeddelandet som skickats till" }, "andContinueCreatingYourAccount": { - "message": "and continue creating your account." + "message": "och fortsätt att skapa ditt konto." }, "noEmail": { "message": "Ingen e-post?" @@ -3564,7 +3734,7 @@ "message": "Allmänt" }, "display": { - "message": "Display" + "message": "Visa" }, "accountSuccessfullyCreated": { "message": "Ditt konto har skapats!" @@ -3585,49 +3755,41 @@ "message": "Användarens e-postadress saknas" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "E-postadressen för aktiv användare hittades inte. Loggar ut dig." }, "deviceTrusted": { "message": "Enhet betrodd" }, "trustOrganization": { - "message": "Trust organization" + "message": "Lita på organisation" }, "trust": { - "message": "Trust" + "message": "Förtroende" }, "doNotTrust": { - "message": "Do not trust" + "message": "Lita inte på" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "Organisationen är inte betrodd" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "För att skydda ditt konto ska du bara bekräfta om du har beviljat nödåtkomst till den här användaren och om fingeravtrycket matchar det som visas på användarens konto" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "För att skydda ditt konto ska du bara fortsätta om du är medlem i den här organisationen, har aktiverat kontoåterställning och om det fingeravtryck som visas nedan matchar organisationens fingeravtryck." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Den här organisationen har en företagspolicy som gör att du kan anmäla dig till kontoåterställning. Registreringen gör det möjligt för organisationens administratörer att ändra ditt lösenord. Fortsätt bara om du känner igen den här organisationen och om fingeravtrycksfrasen som visas nedan matchar organisationens fingeravtryck." }, "trustUser": { - "message": "Trust user" - }, - "sendsNoItemsTitle": { - "message": "Inga aktiva Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + "message": "Lita på användare" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Skicka känslig information på ett säkert sätt", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Dela filer och data på ett säkert sätt med vem som helst, på vilken plattform som helst. Din information kommer att förbli krypterad från början till slut samtidigt som exponeringen begränsas.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3649,7 +3811,7 @@ } }, "inputMaxLength": { - "message": "Input must not exceed $COUNT$ characters in length.", + "message": "Inmatningen får inte vara längre än $COUNT$ tecken.", "placeholders": { "count": { "content": "$1", @@ -3667,7 +3829,7 @@ } }, "inputMinValue": { - "message": "Input value must be at least $MIN$.", + "message": "Inmatningsvärdet måste vara minst $MIN$.", "placeholders": { "min": { "content": "$1", @@ -3676,7 +3838,7 @@ } }, "inputMaxValue": { - "message": "Input value must not exceed $MAX$.", + "message": "Inmatningsvärdet får inte överstiga $MAX$.", "placeholders": { "max": { "content": "$1", @@ -3688,7 +3850,7 @@ "message": "En eller flera e-postadresser är ogiltiga" }, "inputTrimValidator": { - "message": "Input must not contain only whitespace.", + "message": "Inmatningen får inte innehålla enbart blanksteg.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { @@ -3704,10 +3866,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 fält behöver din uppmärksamhet." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$-fälten behöver din uppmärksamhet.", "placeholders": { "count": { "content": "$1", @@ -3762,7 +3924,7 @@ "description": "Message appearing below the autofill on load message when master password reprompt is set for a vault item." }, "toggleSideNavigation": { - "message": "Toggle side navigation" + "message": "Växla sidonavigering" }, "skipToContent": { "message": "Hoppa till innehåll" @@ -3792,15 +3954,15 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Unlock your account, opens in a new window", + "message": "Lås upp ditt konto, öppnas i ett nytt fönster", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { - "message": "Time-based One-Time Password Verification Code", + "message": "Tidsbaserat engångslösenord Verifieringskod", "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { - "message": "Time remaining before current TOTP expires", + "message": "Återstående tid innan aktuell TOTP löper ut", "description": "Aria label for the totp seconds displayed in the inline menu for autofill" }, "fillCredentialsFor": { @@ -3808,7 +3970,7 @@ "description": "Screen reader text for when overlay item is in focused" }, "partialUsername": { - "message": "Partial username", + "message": "Delvis användarnamn", "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" }, "noItemsToShow": { @@ -3828,7 +3990,7 @@ "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Add new vault login item, opens in a new window", + "message": "Lägg till nytt valvinloggningsobjekt, öppnas i ett nytt fönster", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -3836,7 +3998,7 @@ "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Add new vault card item, opens in a new window", + "message": "Lägg till ny valvkortsartikel, öppnas i nytt fönster", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { @@ -3844,7 +4006,7 @@ "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { - "message": "Add new vault identity item, opens in a new window", + "message": "Lägg till ny valvidentitetsartikel, öppnas i nytt fönster", "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { @@ -3934,13 +4096,13 @@ } }, "duoHealthCheckResultsInNullAuthUrlError": { - "message": "Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance." + "message": "Fel vid anslutning till Duo-tjänsten. Använd en annan tvåstegsinloggningsmetod eller kontakta Duo för hjälp." }, "duoRequiredForAccount": { - "message": "Duo two-step login is required for your account." + "message": "Tvåstegsinloggning med Duo krävs för ditt konto." }, "popoutExtension": { - "message": "Popout extension" + "message": "Popout-förlängning" }, "launchDuo": { "message": "Starta Duo" @@ -3970,7 +4132,7 @@ "message": "Välj en samling" }, "importTargetHint": { - "message": "Select this option if you want the imported file contents moved to a $DESTINATION$", + "message": "Välj det här alternativet om du vill att innehållet i den importerade filen ska flyttas till en $DESTINATION$", "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", "placeholders": { "destination": { @@ -4017,22 +4179,22 @@ "message": "Bekräfta fillösenord" }, "exportSuccess": { - "message": "Vault data exported" + "message": "Valvdata exporteras" }, "typePasskey": { "message": "Nyckel" }, "accessing": { - "message": "Accessing" + "message": "Åtkomst via" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "Inloggad!" }, "passkeyNotCopied": { - "message": "Lösennyckeln kommer inte kopieras" + "message": "Inloggningsnyckeln kommer inte kopieras" }, "passkeyNotCopiedAlert": { - "message": "Lösennyckeln kommer inte att kopieras till det klonade objektet. Vill du fortsätta klona det här objektet?" + "message": "Inloggningsnyckeln kommer inte att kopieras till det klonade objektet. Vill du fortsätta klona det här objektet?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "message": "Verifiering krävs av den initierande webbplatsen. Denna funktion är ännu inte implementerad för konton utan huvudlösenord." @@ -4041,7 +4203,7 @@ "message": "Logga in med nyckel?" }, "passkeyAlreadyExists": { - "message": "En lösennyckel finns redan för detta program." + "message": "En inloggningsnyckel finns redan för detta program." }, "noPasskeysFoundForThisApplication": { "message": "Inga lösennycklar hittades för detta program." @@ -4050,7 +4212,7 @@ "message": "Det finns ingen matchande inloggning för denna webbplats." }, "noMatchingLoginsForSite": { - "message": "No matching logins for this site" + "message": "Inga matchande inloggningar för denna webbplats" }, "searchSavePasskeyNewLogin": { "message": "Sök eller spara nyckel som ny inloggning" @@ -4065,25 +4227,25 @@ "message": "Spara nyckel som ny inloggning" }, "chooseCipherForPasskeySave": { - "message": "Choose a login to save this passkey to" + "message": "Välj en inloggning som du vill spara inloggningsnyckeln till" }, "chooseCipherForPasskeyAuth": { - "message": "Choose a passkey to log in with" + "message": "Välj en inloggningsnyckel att logga in med" }, "passkeyItem": { - "message": "Lösennyckelobjekt" + "message": "Inloggningsnyckelsobjekt" }, "overwritePasskey": { - "message": "Skriv över lösennyckel?" + "message": "Skriv över inloggningsnyckel?" }, "overwritePasskeyAlert": { - "message": "Detta objekt innehåller redan en lösennyckel. Är du säker på att du vill skriva över nuvarande lösennyckeln?" + "message": "Detta objekt innehåller redan en inloggningsnyckel. Är du säker på att du vill skriva över nuvarande inloggningsnyckel?" }, "featureNotSupported": { "message": "Funktionen stöds ännu inte" }, "yourPasskeyIsLocked": { - "message": "Autentisering krävs för att använda lösennyckel. Verifiera din identitet för att fortsätta." + "message": "Autentisering krävs för att använda inloggningsnyckel. Verifiera din identitet för att fortsätta." }, "multifactorAuthenticationCancelled": { "message": "Flerfaktorsautentisering avbruten" @@ -4134,10 +4296,10 @@ "message": "LastPass autentisering krävs" }, "awaitingSSO": { - "message": "Awaiting SSO authentication" + "message": "Väntar på SSO-autentisering" }, "awaitingSSODesc": { - "message": "Please continue to log in using your company credentials." + "message": "Fortsätt att logga in med dina företagsuppgifter." }, "seeDetailedInstructions": { "message": "Se detaljerade instruktioner på vår hjälpsida på", @@ -4150,7 +4312,7 @@ "message": "Importera från CSV" }, "lastPassTryAgainCheckEmail": { - "message": "Try again or look for an email from LastPass to verify it's you." + "message": "Försök igen eller leta efter ett e-postmeddelande från LastPass för att verifiera att det är du." }, "collection": { "message": "Samling" @@ -4171,13 +4333,13 @@ "message": "Aktivt konto" }, "bitwardenAccount": { - "message": "Bitwarden account" + "message": "Bitwarden-konto" }, "availableAccounts": { "message": "Tillgängliga konton" }, "accountLimitReached": { - "message": "Account limit reached. Log out of an account to add another." + "message": "Kontogränsen har nåtts. Logga ut från ett konto för att lägga till ett annat." }, "active": { "message": "aktiv" @@ -4192,7 +4354,7 @@ "message": "server" }, "hostedAt": { - "message": "hosted at" + "message": "värd på" }, "useDeviceOrHardwareKey": { "message": "Använd din enhet eller hårdvarunyckel" @@ -4204,7 +4366,7 @@ "message": "Alltid för denna webbplats" }, "domainAddedToExcludedDomains": { - "message": "$DOMAIN$ added to excluded domains.", + "message": "$DOMAIN$ tillagd till uteslutna domäner.", "placeholders": { "domain": { "content": "$1", @@ -4216,8 +4378,28 @@ "message": "Vanliga format", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Detektering av URI-matchning är hur Bitwarden identifierar autofyllförslag.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Reguljär uttryck\" är ett avancerat alternativ med ökad risk för att röja inloggningsuppgifter.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Börjar med\" är ett avancerat alternativ med ökad risk för att röja inloggningsuppgifter.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Mer om matchdetektering", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Avancerade inställningar", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { - "message": "Continue to browser settings?", + "message": "Fortsätt till webbläsarinställningar?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" }, "confirmContinueToHelpCenter": { @@ -4225,19 +4407,19 @@ "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { - "message": "Change your browser's autofill and password management settings.", + "message": "Ändra inställningarna för autofyll och lösenordshantering i din webbläsare.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" }, "confirmContinueToHelpCenterKeyboardShortcutsContent": { - "message": "You can view and set extension shortcuts in your browser's settings.", + "message": "Du kan se och ställa in genvägar för tillägg i webbläsarens inställningar.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" }, "confirmContinueToBrowserPasswordManagementSettingsContent": { - "message": "Change your browser's autofill and password management settings.", + "message": "Ändra inställningarna för autofyll och lösenordshantering i din webbläsare.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { - "message": "You can view and set extension shortcuts in your browser's settings.", + "message": "Du kan se och ställa in genvägar för tillägg i webbläsarens inställningar.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's keyboard shortcut settings page" }, "overrideDefaultBrowserAutofillTitle": { @@ -4253,11 +4435,11 @@ "description": "Label for the setting that allows overriding the default browser autofill settings" }, "privacyPermissionAdditionNotGrantedTitle": { - "message": "Unable to set Bitwarden as the default password manager", + "message": "Det går inte att ställa in Bitwarden som standardlösenordshanterare", "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "privacyPermissionAdditionNotGrantedDescription": { - "message": "You must grant browser privacy permissions to Bitwarden to set it as the default password manager.", + "message": "Du måste ge Bitwarden sekretessbehörighet för webbläsaren för att kunna ange den som standardlösenordshanterare.", "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "makeDefault": { @@ -4265,39 +4447,39 @@ "description": "Button text for the setting that allows overriding the default browser autofill settings" }, "saveCipherAttemptSuccess": { - "message": "Credentials saved successfully!", + "message": "Legitimationen har sparats framgångsrikt!", "description": "Notification message for when saving credentials has succeeded." }, "passwordSaved": { - "message": "Password saved!", + "message": "Lösenordet sparat!", "description": "Notification message for when saving credentials has succeeded." }, "updateCipherAttemptSuccess": { - "message": "Credentials updated successfully!", + "message": "Legitimationen har uppdaterats!", "description": "Notification message for when updating credentials has succeeded." }, "passwordUpdated": { - "message": "Password updated!", + "message": "Lösenord uppdaterat!", "description": "Notification message for when updating credentials has succeeded." }, "saveCipherAttemptFailed": { - "message": "Error saving credentials. Check console for details.", + "message": "Fel vid sparande av inloggningsuppgifter. Kontrollera konsolen för detaljer.", "description": "Notification message for when saving credentials has failed." }, "success": { - "message": "Success" + "message": "Lyckades" }, "removePasskey": { - "message": "Ta bort passkey" + "message": "Ta bort inloggningsnyckel" }, "passkeyRemoved": { - "message": "Passkey borttagen" + "message": "Inloggningsnyckel borttagen" }, "autofillSuggestions": { "message": "Förslag för autofyll" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Föreslagna föremål" }, "autofillSuggestionsTip": { "message": "Spara ett inloggningsobjekt för den här webbplatsen för autofyll" @@ -4309,10 +4491,10 @@ "message": "Inga objekt matchar din sökning" }, "clearFiltersOrTryAnother": { - "message": "Clear filters or try another search term" + "message": "Rensa filter eller försök med en annan sökterm" }, "copyInfoTitle": { - "message": "Copy info - $ITEMNAME$", + "message": "Kopiera information - $ITEMNAME$", "description": "Title for a button that opens a menu with options to copy information from an item.", "placeholders": { "itemname": { @@ -4332,7 +4514,7 @@ } }, "moreOptionsLabel": { - "message": "More options, $ITEMNAME$", + "message": "Fler alternativ, $ITEMNAME$", "description": "Aria label for a button that opens a menu with more options for an item.", "placeholders": { "itemname": { @@ -4342,7 +4524,7 @@ } }, "moreOptionsTitle": { - "message": "More options - $ITEMNAME$", + "message": "Fler alternativ - $ITEMNAME$", "description": "Title for a button that opens a menu with more options for an item.", "placeholders": { "itemname": { @@ -4362,7 +4544,7 @@ } }, "viewItemTitleWithField": { - "message": "View item - $ITEMNAME$ - $FIELD$", + "message": "Visa objekt - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4376,7 +4558,7 @@ } }, "autofillTitle": { - "message": "Autofill - $ITEMNAME$", + "message": "Autofyll - $ITEMNAME$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4386,7 +4568,7 @@ } }, "autofillTitleWithField": { - "message": "Autofill - $ITEMNAME$ - $FIELD$", + "message": "Autofyll - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4399,25 +4581,25 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Kopiera $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, "noValuesToCopy": { - "message": "No values to copy" + "message": "Inga värden att kopiera" }, "assignToCollections": { - "message": "Assign to collections" + "message": "Tilldela till samlingar" }, "copyEmail": { "message": "Kopiera e-postadress" @@ -4429,7 +4611,7 @@ "message": "Kopiera adress" }, "adminConsole": { - "message": "Admin Console" + "message": "Adminkonsol" }, "accountSecurity": { "message": "Kontosäkerhet" @@ -4441,10 +4623,10 @@ "message": "Utseende" }, "errorAssigningTargetCollection": { - "message": "Error assigning target collection." + "message": "Fel vid tilldelning av målsamling." }, "errorAssigningTargetFolder": { - "message": "Error assigning target folder." + "message": "Fel vid tilldelning av målmapp." }, "viewItemsIn": { "message": "Visa objekt i $NAME$", @@ -4489,7 +4671,7 @@ "message": "Objektnamn" }, "organizationIsDeactivated": { - "message": "Organization is deactivated" + "message": "Organisationen är avaktiverad" }, "owner": { "message": "Ägare" @@ -4499,7 +4681,7 @@ "description": "Used as a label to indicate that the user is the owner of an item." }, "contactYourOrgAdmin": { - "message": "Items in deactivated organizations cannot be accessed. Contact your organization owner for assistance." + "message": "Det går inte att komma åt objekt i inaktiverade organisationer. Kontakta din organisationsägare för hjälp." }, "additionalInformation": { "message": "Ytterligare information" @@ -4508,16 +4690,16 @@ "message": "Objekthistorik" }, "lastEdited": { - "message": "Last edited" + "message": "Senast ändrat" }, "ownerYou": { "message": "Ägare: Du" }, "linked": { - "message": "Linked" + "message": "Länkad" }, "copySuccessful": { - "message": "Copy Successful" + "message": "Kopiering lyckades" }, "upload": { "message": "Ladda upp" @@ -4547,52 +4729,52 @@ } }, "downloadBitwarden": { - "message": "Download Bitwarden" + "message": "Ladda ner Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Download Bitwarden on all devices" + "message": "Ladda ner Bitwarden på alla enheter" }, "getTheMobileApp": { - "message": "Get the mobile app" + "message": "Hämta mobilappen" }, "getTheMobileAppDesc": { - "message": "Access your passwords on the go with the Bitwarden mobile app." + "message": "Få tillgång till dina lösenord när du är på språng med Bitwardens mobilapp." }, "getTheDesktopApp": { - "message": "Get the desktop app" + "message": "Hämta skrivbordsappen" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "Öppna ditt valv utan en webbläsare och ställ sedan in upplåsning med biometri för att påskynda upplåsningen i både skrivbordsappen och webbläsartillägget." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Ladda ner från bitwarden.com nu" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "Hämta den på Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Ladda ner på App Store" }, "permanentlyDeleteAttachmentConfirmation": { - "message": "Are you sure you want to permanently delete this attachment?" + "message": "Är du säker på att du vill radera den här bilagan permanent?" }, "premium": { "message": "Premium" }, "freeOrgsCannotUseAttachments": { - "message": "Free organizations cannot use attachments" + "message": "Fria organisationer kan inte använda bilagor" }, "filters": { - "message": "Filters" + "message": "Filter" }, "filterVault": { "message": "Filtrera valv" }, "filterApplied": { - "message": "One filter applied" + "message": "Ett filter tillämpat" }, "filterAppliedPlural": { - "message": "$COUNT$ filters applied", + "message": "$COUNT$ filter tillämpas", "placeholders": { "count": { "content": "$1", @@ -4610,7 +4792,7 @@ "message": "Kontaktuppgifter" }, "downloadAttachment": { - "message": "Download - $ITEMNAME$", + "message": "Ladda ner - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -4619,7 +4801,7 @@ } }, "cardNumberEndsWith": { - "message": "card number ends with", + "message": "kortnummer slutar med", "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." }, "loginCredentials": { @@ -4645,7 +4827,7 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Webbplats tillagd" }, "addWebsite": { "message": "Lägg till webbplats" @@ -4664,7 +4846,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Visa matchningsdetektering $WEBSITE", "placeholders": { "website": { "content": "$1", @@ -4673,7 +4855,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Detektering av dold matchning $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4682,19 +4864,19 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Autofyll vid sidladdning?" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Utgått kort" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Om du har förnyat kortet ska du uppdatera kortinformationen" }, "cardDetails": { - "message": "Card details" + "message": "Begär kort" }, "cardBrandDetails": { - "message": "$BRAND$ details", + "message": "$BRAND$ detaljer", "placeholders": { "brand": { "content": "$1", @@ -4733,13 +4915,13 @@ "message": "Tilldela" }, "bulkCollectionAssignmentDialogDescriptionSingular": { - "message": "Only organization members with access to these collections will be able to see the item." + "message": "Endast organisationsmedlemmar med tillgång till dessa samlingar kan se objektet." }, "bulkCollectionAssignmentDialogDescriptionPlural": { - "message": "Only organization members with access to these collections will be able to see the items." + "message": "Endast organisationsmedlemmar med tillgång till dessa samlingar kan se objekten." }, "bulkCollectionAssignmentWarning": { - "message": "You have selected $TOTAL_COUNT$ items. You cannot update $READONLY_COUNT$ of the items because you do not have edit permissions.", + "message": "Du har valt $TOTAL_COUNT$ artiklar. Du kan inte uppdatera $READONLY_COUNT$ av objekten eftersom du inte har redigeringsbehörighet.", "placeholders": { "total_count": { "content": "$1", @@ -4769,13 +4951,13 @@ "message": "Använd dolda fält för känslig data, som t. ex. ett lösenord" }, "checkBoxHelpText": { - "message": "Use checkboxes if you'd like to autofill a form's checkbox, like a remember email" + "message": "Använd kryssrutor om du vill fylla i en kryssruta i ett formulär automatiskt, t.ex. för att komma ihåg e-post" }, "linkedHelpText": { - "message": "Use a linked field when you are experiencing autofill issues for a specific website." + "message": "Använd ett länkat fält när du har problem med autofyll för en viss webbplats." }, "linkedLabelHelpText": { - "message": "Enter the the field's html id, name, aria-label, or placeholder." + "message": "Ange fältets html-id, namn, aria-label eller platshållare." }, "editField": { "message": "Redigera fält" @@ -4799,7 +4981,7 @@ } }, "fieldAdded": { - "message": "$LABEL$ added", + "message": "$LABEL$ tillagd", "placeholders": { "label": { "content": "$1", @@ -4808,7 +4990,7 @@ } }, "reorderToggleButton": { - "message": "Reorder $LABEL$. Use arrow key to move item up or down.", + "message": "Ordna om $LABEL$. Använd piltangenten för att flytta objektet uppåt eller nedåt.", "placeholders": { "label": { "content": "$1", @@ -4817,10 +4999,10 @@ } }, "reorderWebsiteUriButton": { - "message": "Reorder website URI. Use arrow key to move item up or down." + "message": "Ordna om webbplatsens URI. Använd piltangenten för att flytta objektet uppåt eller nedåt." }, "reorderFieldUp": { - "message": "$LABEL$ moved up, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ flyttas upp, position $INDEX$ av $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4837,13 +5019,13 @@ } }, "selectCollectionsToAssign": { - "message": "Select collections to assign" + "message": "Välj samlingar som ska tilldelas" }, "personalItemTransferWarningSingular": { - "message": "1 item will be permanently transferred to the selected organization. You will no longer own this item." + "message": "1 objekt kommer att permanent överföras till den valda organisationen. Du kommer inte längre att äga detta objekt." }, "personalItemsTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to the selected organization. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ objekt kommer att överföras permanent till den valda organisationen. Du kommer inte längre att äga dessa objekt.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4852,7 +5034,7 @@ } }, "personalItemWithOrgTransferWarningSingular": { - "message": "1 item will be permanently transferred to $ORG$. You will no longer own this item.", + "message": "1 objekt kommer att överföras permanent till $ORG$. Du kommer inte längre att äga det här objektet.", "placeholders": { "org": { "content": "$1", @@ -4861,7 +5043,7 @@ } }, "personalItemsWithOrgTransferWarningPlural": { - "message": "$PERSONAL_ITEMS_COUNT$ items will be permanently transferred to $ORG$. You will no longer own these items.", + "message": "$PERSONAL_ITEMS_COUNT$ objekt kommer att överföras permanent till $ORG$. Du kommer inte längre att äga dessa objekt.", "placeholders": { "personal_items_count": { "content": "$1", @@ -4874,13 +5056,13 @@ } }, "successfullyAssignedCollections": { - "message": "Successfully assigned collections" + "message": "Framgångsrikt tilldelade samlingar" }, "nothingSelected": { - "message": "You have not selected anything." + "message": "Du har inte valt något." }, "itemsMovedToOrg": { - "message": "Items moved to $ORGNAME$", + "message": "Objekt flyttade till $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4889,7 +5071,7 @@ } }, "itemMovedToOrg": { - "message": "Item moved to $ORGNAME$", + "message": "Objektet flyttat till $ORGNAME$", "placeholders": { "orgname": { "content": "$1", @@ -4898,7 +5080,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ moved down, position $INDEX$ of $LENGTH$", + "message": "$LABEL$ flyttas ner, position $INDEX$ av $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4915,19 +5097,19 @@ } }, "itemLocation": { - "message": "Item Location" + "message": "Föremålets placering" }, "fileSend": { - "message": "File Send" + "message": "Skicka fil" }, "fileSends": { - "message": "File Sends" + "message": "Skicka filer" }, "textSend": { - "message": "Text Send" + "message": "Skicka text" }, "textSends": { - "message": "Text Sends" + "message": "Text skickas" }, "accountActions": { "message": "Kontoåtgärder" @@ -4936,13 +5118,13 @@ "message": "Visa antal autofyllförslag för inloggning på tilläggsikonen" }, "showQuickCopyActions": { - "message": "Show quick copy actions on Vault" + "message": "Visa snabbkopieringsåtgärder på Vault" }, "systemDefault": { "message": "Systemstandard" }, "enterprisePolicyRequirementsApplied": { - "message": "Enterprise policy requirements have been applied to this setting" + "message": "Krav på företagspolicy har tillämpats på denna inställning" }, "sshPrivateKey": { "message": "Privat nyckel" @@ -4972,13 +5154,13 @@ "message": "Försök igen" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Minsta anpassade timeout är 1 minut." }, "additionalContentAvailable": { - "message": "Additional content is available" + "message": "Ytterligare innehåll är tillgängligt" }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Fil sparad till enhet. Hantera nedladdningar från din enhet." }, "showCharacterCount": { "message": "Visa antal tecken" @@ -4987,43 +5169,43 @@ "message": "Dölj antal tecken" }, "itemsInTrash": { - "message": "Items in trash" + "message": "Föremål i papperskorgen" }, "noItemsInTrash": { - "message": "No items in trash" + "message": "Inga objekt i papperskorgen" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Objekt som du raderar kommer att visas här och raderas permanent efter 30 dagar" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "Objekt som har legat i papperskorgen i mer än 30 dagar raderas automatiskt" }, "restore": { "message": "Återställ" }, "deleteForever": { - "message": "Delete forever" + "message": "Ta bort permanent" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Du har inte behörighet att redigera detta objekt" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Biometrisk upplåsning är inte tillgänglig eftersom upplåsning med PIN-kod eller lösenord krävs först." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biometrisk upplåsning är för närvarande inte tillgänglig." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrisk upplåsning är inte tillgänglig på grund av felkonfigurerade systemfiler." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biometrisk upplåsning är inte tillgänglig på grund av felkonfigurerade systemfiler." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Biometrisk upplåsning är inte tillgänglig eftersom Bitwardens skrivbordsapp är stängd." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Biometrisk upplåsning är inte tillgänglig eftersom den inte är aktiverad för $EMAIL$ i Bitwardens skrivbordsapp.", "placeholders": { "email": { "content": "$1", @@ -5032,34 +5214,37 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Biometrisk upplåsning är för närvarande inte tillgänglig av okänd anledning." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Lås upp ditt valv på några sekunder" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Du kan anpassa dina inställningar för upplåsning och timeout för att snabbare komma åt ditt valv." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "Lås upp PIN-koden" + }, + "unlockWithBiometricSet": { + "message": "Lås upp med biometriuppsättning" }, "authenticating": { - "message": "Authenticating" + "message": "Autentisering" }, "fillGeneratedPassword": { - "message": "Fill generated password", + "message": "Fyll i genererat lösenord", "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Password regenerated", + "message": "Lösenord förnyat", "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Spara till Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { - "message": "Space", + "message": "Mellanslag", "description": "Represents the space key in screen reader content as a readable word" }, "tildeCharacterDescriptor": { @@ -5067,7 +5252,7 @@ "description": "Represents the ~ key in screen reader content as a readable word" }, "backtickCharacterDescriptor": { - "message": "Backtick", + "message": "Bakvänd apostrof", "description": "Represents the ` key in screen reader content as a readable word" }, "exclamationCharacterDescriptor": { @@ -5075,27 +5260,27 @@ "description": "Represents the ! key in screen reader content as a readable word" }, "atSignCharacterDescriptor": { - "message": "At sign", + "message": "Vid skylt", "description": "Represents the @ key in screen reader content as a readable word" }, "hashSignCharacterDescriptor": { - "message": "Hash sign", + "message": "Hash-tecken", "description": "Represents the # key in screen reader content as a readable word" }, "dollarSignCharacterDescriptor": { - "message": "Dollar sign", + "message": "Dollartecken", "description": "Represents the $ key in screen reader content as a readable word" }, "percentSignCharacterDescriptor": { - "message": "Percent sign", + "message": "Procenttecken", "description": "Represents the % key in screen reader content as a readable word" }, "caretCharacterDescriptor": { - "message": "Caret", + "message": "Cirkumflex", "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { - "message": "Ampersand", + "message": "Och", "description": "Represents the & key in screen reader content as a readable word" }, "asteriskCharacterDescriptor": { @@ -5103,19 +5288,19 @@ "description": "Represents the * key in screen reader content as a readable word" }, "parenLeftCharacterDescriptor": { - "message": "Left parenthesis", + "message": "Vänster parentes", "description": "Represents the ( key in screen reader content as a readable word" }, "parenRightCharacterDescriptor": { - "message": "Right parenthesis", + "message": "Höger parentes", "description": "Represents the ) key in screen reader content as a readable word" }, "hyphenCharacterDescriptor": { - "message": "Underscore", + "message": "Understreck", "description": "Represents the _ key in screen reader content as a readable word" }, "underscoreCharacterDescriptor": { - "message": "Hyphen", + "message": "Bindestreck", "description": "Represents the - key in screen reader content as a readable word" }, "plusCharacterDescriptor": { @@ -5123,23 +5308,23 @@ "description": "Represents the + key in screen reader content as a readable word" }, "equalsCharacterDescriptor": { - "message": "Equals", + "message": "Lika med", "description": "Represents the = key in screen reader content as a readable word" }, "braceLeftCharacterDescriptor": { - "message": "Left brace", + "message": "Vänster stag", "description": "Represents the { key in screen reader content as a readable word" }, "braceRightCharacterDescriptor": { - "message": "Right brace", + "message": "Höger stag", "description": "Represents the } key in screen reader content as a readable word" }, "bracketLeftCharacterDescriptor": { - "message": "Left bracket", + "message": "Vänster konsol", "description": "Represents the [ key in screen reader content as a readable word" }, "bracketRightCharacterDescriptor": { - "message": "Right bracket", + "message": "Höger konsol", "description": "Represents the ] key in screen reader content as a readable word" }, "pipeCharacterDescriptor": { @@ -5147,39 +5332,39 @@ "description": "Represents the | key in screen reader content as a readable word" }, "backSlashCharacterDescriptor": { - "message": "Back slash", + "message": "Bakvänt snedstreck", "description": "Represents the back slash key in screen reader content as a readable word" }, "colonCharacterDescriptor": { - "message": "Colon", + "message": "Kolon", "description": "Represents the : key in screen reader content as a readable word" }, "semicolonCharacterDescriptor": { - "message": "Semicolon", + "message": "Semikolon", "description": "Represents the ; key in screen reader content as a readable word" }, "doubleQuoteCharacterDescriptor": { - "message": "Double quote", + "message": "Dubbla citat", "description": "Represents the double quote key in screen reader content as a readable word" }, "singleQuoteCharacterDescriptor": { - "message": "Single quote", + "message": "Enstaka offert", "description": "Represents the ' key in screen reader content as a readable word" }, "lessThanCharacterDescriptor": { - "message": "Less than", + "message": "Mindre än", "description": "Represents the < key in screen reader content as a readable word" }, "greaterThanCharacterDescriptor": { - "message": "Greater than", + "message": "Större än", "description": "Represents the > key in screen reader content as a readable word" }, "commaCharacterDescriptor": { - "message": "Comma", + "message": "Komma", "description": "Represents the , key in screen reader content as a readable word" }, "periodCharacterDescriptor": { - "message": "Period", + "message": "Punkt", "description": "Represents the . key in screen reader content as a readable word" }, "questionCharacterDescriptor": { @@ -5187,7 +5372,7 @@ "description": "Represents the ? key in screen reader content as a readable word" }, "forwardSlashCharacterDescriptor": { - "message": "Forward slash", + "message": "Framåtriktat snedstreck", "description": "Represents the / key in screen reader content as a readable word" }, "lowercaseAriaLabel": { @@ -5197,52 +5382,52 @@ "message": "Versal" }, "generatedPassword": { - "message": "Generated password" + "message": "Genererat lösenord" }, "compactMode": { - "message": "Compact mode" + "message": "Kompakt läge" }, "beta": { "message": "Beta" }, "extensionWidth": { - "message": "Extension width" + "message": "Förlängning bredd" }, "wide": { - "message": "Wide" + "message": "Bred" }, "extraWide": { - "message": "Extra wide" + "message": "Extra bred" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Lösenordet du har angett är felaktigt." }, "importSshKey": { - "message": "Import" + "message": "Importera" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Bekräfta lösenord" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "Ange lösenordet för SSH-nyckeln." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Ange lösenord" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "SSH-nyckeln är ogiltig" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "SSH-nyckeltypen stöds inte" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Importera nyckel från urklipp" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "SSH-nyckel importerad framgångsrikt" }, "cannotRemoveViewOnlyCollections": { - "message": "You cannot remove collections with View only permissions: $COLLECTIONS$", + "message": "Du kan inte ta bort samlingar med behörigheten Visa endast: $COLLECTIONS$", "placeholders": { "collections": { "content": "$1", @@ -5251,81 +5436,81 @@ } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Uppdatera din desktop-applikation" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Om du vill använda biometrisk upplåsning måste du uppdatera din skrivbordsapplikation eller inaktivera fingeravtrycksupplåsning i skrivbordsinställningarna." }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "Ändra lösenord för riskgrupper" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Alternativ för valv" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Valvet skyddar mer än bara dina lösenord. Förvara säkra inloggningar, ID-handlingar, kort och anteckningar säkert här." }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Välkommen till Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Säkerhet, prioriterad" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "Spara inloggningar, kort och identiteter i ditt säkra valv. Bitwarden använder nollkännedom, end-to-end-kryptering för att skydda det som är viktigt för dig." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Snabb och enkel inloggning" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Ställ in biometrisk upplåsning och autofyll för att logga in på dina konton utan att skriva en enda bokstav." }, "secureUser": { - "message": "Level up your logins" + "message": "Höj nivån på dina inloggningar" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Använd generatorn för att skapa och spara starka, unika lösenord för alla dina konton." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Dina data, när och där du behöver dem" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Spara obegränsat antal lösenord på obegränsat antal enheter med Bitwardens mobil-, webbläsar- och skrivbordsappar." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 meddelande" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Importera befintliga lösenord" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Använd importören för att snabbt överföra inloggningar till Bitwarden utan att lägga till dem manuellt." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Importera nu" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Välkommen till ditt valv!" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Autofyll objekt för den aktuella sidan" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Favoritartiklar för enkel åtkomst" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Sök i ditt valv efter något annat" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Spara tid med autofyll" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Inkludera ett", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "Webbplats", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, @@ -5335,54 +5520,64 @@ "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Sömlös utcheckning online" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Med kort kan du enkelt autofylla betalningsformulär på ett säkert och exakt sätt." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Förenkla skapandet av konton" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Med identiteter kan du snabbt autofylla långa registrerings- eller kontaktformulär." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Håll dina känsliga uppgifter säkra" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Med anteckningar kan du säkert lagra känslig information som bank- eller försäkringsuppgifter." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Utvecklarvänlig SSH-åtkomst" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Förvara dina nycklar och anslut till SSH-agenten för snabb, krypterad autentisering.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "Läs mer om SSH-agent", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Skapa lösenord snabbt" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Skapa enkelt starka och unika lösenord genom att klicka på", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "för att hjälpa dig att hålla dina inloggningar säkra.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Skapa enkelt starka och unika lösenord genom att klicka på knappen Generera lösenord så att du kan hålla dina inloggningar säkra.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Du har inte behörighet att visa den här sidan. Försök att logga in med ett annat konto." + }, + "wasmNotSupported": { + "message": "WebAssembly stöds inte av din webbläsare eller är inte aktiverat. WebAssembly krävs för att använda Bitwarden-appen.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Visa mer" + }, + "showLess": { + "message": "Visa mindre" } } diff --git a/apps/browser/src/_locales/te/messages.json b/apps/browser/src/_locales/te/messages.json index 29223942fd6..d076ef01ef2 100644 --- a/apps/browser/src/_locales/te/messages.json +++ b/apps/browser/src/_locales/te/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Search vault" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "Edit" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "Ask to update existing login" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium membership" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "PIN code is required." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Authenticating" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/th/messages.json b/apps/browser/src/_locales/th/messages.json index 87e5be28d79..2cea91a424e 100644 --- a/apps/browser/src/_locales/th/messages.json +++ b/apps/browser/src/_locales/th/messages.json @@ -6,39 +6,39 @@ "message": "โลโก้ Bitwarden" }, "extName": { - "message": "Bitwarden Password Manager", + "message": "Bitwarden - จัดการรหัสผ่าน", "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information", + "message": "ไม่ว่าจะอยู่ที่ไหน Bitwarden ก็สามารถปกป้องรหัสผ่าน พาสคีย์ และข้อมูลสำคัญของคุณได้อย่างง่ายดาย", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "ล็อกอิน หรือ สร้างบัญชีใหม่ เพื่อใช้งานตู้นิรภัยของคุณ" }, "inviteAccepted": { - "message": "Invitation accepted" + "message": "ตอบรับคำเชิญแล้ว" }, "createAccount": { "message": "สร้างบัญชี" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "เพิ่งเริ่มใช้ Bitwarden ใช่ไหม?" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "เข้าสู่ระบบด้วยพาสคีย์" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "ใช้การลงชื่อเพียงครั้งเดียว" }, "welcomeBack": { - "message": "Welcome back" + "message": "ยินดีต้อนรับกลับมา" }, "setAStrongPassword": { - "message": "Set a strong password" + "message": "ตั้งรหัสผ่านที่รัดกุม" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Finish creating your account by setting a password" + "message": "ดำเนินการสร้างบัญชีของคุณให้เสร็จสมบูรณ์โดยการตั้งรหัสผ่าน" }, "enterpriseSingleSignOn": { "message": "Enterprise Single Sign-On" @@ -65,7 +65,7 @@ "message": "คำใบ้เกี่ยวกับรหัสผ่านหลักสามารถช่วยให้คุณนึกรหัสผ่านหลักออกได้หากลืม" }, "masterPassHintText": { - "message": "If you forget your password, the password hint can be sent to your email. $CURRENT$/$MAXIMUM$ character maximum.", + "message": "หากคุณลืมรหัสผ่าน ระบบสามารถส่งคำใบ้รหัสผ่านไปยังอีเมลของคุณได้ จำกัด $CURRENT$/$MAXIMUM$ ตัวอักษร", "placeholders": { "current": { "content": "$1", @@ -84,7 +84,7 @@ "message": "Master Password Hint (optional)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "คะแนนความรัดกุมของรหัสผ่าน $SCORE$", "placeholders": { "score": { "content": "$1", @@ -264,7 +264,7 @@ "message": "Request password hint" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" + "message": "กรอกที่อยู่อีเมลบัญชีของคุณ แล้วระบบจะส่งคำใบ้รหัสผ่านไปให้คุณ" }, "getMasterPasswordHint": { "message": "รับคำใบ้เกี่ยวกับรหัสผ่านหลักของคุณ" @@ -547,6 +547,9 @@ "searchVault": { "message": "ค้นหาในตู้นิรภัย" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "แก้ไข" }, @@ -668,7 +671,7 @@ "message": "ตู้เซฟของคุณถูกล็อก ยืนยันตัวตนของคุณเพื่อดำเนินการต่อ" }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "ห้องนิรภัยของคุณถูกล็อก" }, "yourAccountIsLocked": { "message": "Your account is locked" @@ -1022,7 +1025,7 @@ "message": "The \"Add Login Notification\" automatically prompts you to save new logins to your vault whenever you log into them for the first time." }, "addLoginNotificationDescAlt": { - "message": "Ask to add an item if one isn't found in your vault. Applies to all logged in accounts." + "message": "หากไม่พบรายการในห้องนิรภัยของคุณ ระบบจะถามเพื่อเพิ่มรายการ มีผลกับทุกบัญชีที่ลงชื่อเข้าใช้" }, "showCardsInVaultViewV2": { "message": "Always show cards as Autofill suggestions on Vault view" @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "ขอให้ปรับปรุงการเข้าสู่ระบบที่มีอยู่" }, @@ -1342,7 +1351,7 @@ "message": "ลบไฟล์แนบแล้ว" }, "newAttachment": { - "message": "Add New Attachment" + "message": "เพิ่มไฟล์แนบใหม่" }, "noAttachments": { "message": "ไม่มีไฟล์แนบ" @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Feature Unavailable" }, - "encryptionKeyMigrationRequired": { - "message": "Encryption key migration required. Please login through the web vault to update your encryption key." + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "Premium Membership" @@ -1544,7 +1553,7 @@ "message": "FIDO2 WebAuthn" }, "webAuthnDesc": { - "message": "Use any WebAuthn compatible security key to access your account." + "message": "ใช้กุญแจความปลอดภัยที่รองรับ WebAuthn ใดก็ได้เพื่อเข้าถึงบัญชีของคุณ" }, "emailTitle": { "message": "อีเมล" @@ -1597,7 +1606,7 @@ "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { - "message": "Autofill suggestions" + "message": "คำแนะนำการกรอกข้อมูลอัตโนมัติ" }, "autofillSpotlightTitle": { "message": "Easily find autofill suggestions" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Security Code" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "ex." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH key" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "New $TYPE$", "placeholders": { @@ -2145,16 +2160,16 @@ "message": "ปลดล็อกด้วย PIN" }, "setYourPinTitle": { - "message": "Set PIN" + "message": "ตั้ง PIN" }, "setYourPinButton": { - "message": "Set PIN" + "message": "ตั้ง PIN" }, "setYourPinCode": { "message": "ตั้ง PIN เพื่อใช้ปลดล็อก Bitwarden ทั้งนี้ หากคุณล็อกเอาต์ออกจากแอปโดยสมบูรณ์จะเป็นการลบการตั้งค่า PIN ของคุณด้วย" }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "ตั้ง PIN เพื่อใช้ปลดล็อก Bitwarden และหากคุณล็อกเอาต์ออกจากแอปโดยสมบูรณ์จะเป็นการลบการตั้งค่า PIN ของคุณ" }, "pinRequired": { "message": "ต้องระบุ PIN" @@ -2169,7 +2184,7 @@ "message": "ปลดล็อกด้วยไบโอเมตริก" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "เข้าสู่ระบบด้วยรหัสผ่านหลัก" }, "awaitDesktop": { "message": "Awaiting confirmation from desktop" @@ -2181,7 +2196,7 @@ "message": "ล็อคด้วยรหัสผ่านหลักเมื่อรีสตาร์ทเบราว์เซอร์" }, "lockWithMasterPassOnRestart1": { - "message": "Require master password on browser restart" + "message": "กำหนดให้ป้อนรหัสผ่านหลักเมื่อรีสตาร์ทเบราว์เซอร์" }, "selectOneCollection": { "message": "คุณต้องเลือกอย่างน้อยหนึ่งคอลเลกชัน" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "An organization policy has blocked importing items into your individual vault." }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Domains", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2866,7 +2914,7 @@ "message": "Hide your email address from viewers." }, "passwordPrompt": { - "message": "Master password re-prompt" + "message": "การยืนยันให้ป้อนรหัสผ่านหลักอีกครั้ง" }, "passwordConfirmation": { "message": "Master password confirmation" @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "You must verify your email to use this feature. You can verify your email in the web vault." }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "Updated master password" }, @@ -3380,7 +3431,7 @@ "message": "Fingerprint phrase" }, "fingerprintMatchInfo": { - "message": "Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device." + "message": "โปรดตรวจสอบให้แน่ใจว่าห้องนิรภัยของคุณปลดล็อกอยู่ และลายนิ้วมือตรงกันบนอุปกรณ์อื่น" }, "resendNotification": { "message": "Resend notification" @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Request sent" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "Exposed Master Password" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Remember this device to make future logins seamless" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Device approval required. Select an approval option below:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Request admin approval" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "Organization SSO identifier is required." }, @@ -3603,10 +3773,10 @@ "message": "Organization is not trusted" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "เพื่อความปลอดภัยของบัญชีของคุณ โปรดยืนยันว่าคุณได้ให้สิทธิ์การเข้าถึงในกรณีฉุกเฉินแก่ผู้ใช้นี้ และลายนิ้วมือของผู้ใช้ตรงกับที่แสดงในบัญชีของพวกเขาเท่านั้น" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "เพื่อความปลอดภัยของบัญชีของคุณ ให้ดำเนินการต่อเมื่อคุณเป็นสมาชิกขององค์กรนี้, ได้เปิดใช้งานการกู้คืนบัญชี, และลายนิ้วมือที่แสดงด้านล่างตรงกับลายนิ้วมือขององค์กรเท่านั้น" }, "orgTrustWarning1": { "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "No active Sends", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Use Send to securely share encrypted information with anyone.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -3892,7 +4054,7 @@ "message": "Verification required for this action. Set a PIN to continue." }, "setPin": { - "message": "Set PIN" + "message": "ตั้ง PIN" }, "verifyWithBiometrics": { "message": "Verify with biometrics" @@ -3989,10 +4151,10 @@ "message": "Select the import file" }, "chooseFile": { - "message": "Choose File" + "message": "เลือกไฟล์" }, "noFileChosen": { - "message": "No file chosen" + "message": "ไม่มีไฟล์ที่เลือก" }, "orCopyPasteFileContents": { "message": "or copy/paste the import file contents" @@ -4023,7 +4185,7 @@ "message": "Passkey" }, "accessing": { - "message": "Accessing" + "message": "กำลังเข้าถึง" }, "loggedInExclamation": { "message": "Logged in!" @@ -4177,7 +4339,7 @@ "message": "Available accounts" }, "accountLimitReached": { - "message": "Account limit reached. Log out of an account to add another." + "message": "ถึงขีดจำกัดของบัญชีแล้ว กรุณาออกจากระบบบัญชีอื่นเพื่อเพิ่มบัญชีใหม่" }, "active": { "message": "active" @@ -4216,6 +4378,26 @@ "message": "Common formats", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Continue to browser settings?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4432,7 +4614,7 @@ "message": "Admin Console" }, "accountSecurity": { - "message": "Account security" + "message": "ความปลอดภัยของบัญชี" }, "notifications": { "message": "Notifications" @@ -4505,10 +4687,10 @@ "message": "Additional information" }, "itemHistory": { - "message": "Item history" + "message": "ประวัติการแก้ไขรายการ" }, "lastEdited": { - "message": "Last edited" + "message": "แก้ไขล่าสุดเมื่อ" }, "ownerYou": { "message": "Owner: You" @@ -4520,13 +4702,13 @@ "message": "Copy Successful" }, "upload": { - "message": "Upload" + "message": "อัปโหลด" }, "addAttachment": { - "message": "Add attachment" + "message": "เพิ่มไฟล์แนบ" }, "maxFileSizeSansPunctuation": { - "message": "Maximum file size is 500 MB" + "message": "ขนาดไฟล์สูงสุด คือ 500 MB" }, "deleteAttachmentName": { "message": "Delete attachment $NAME$", @@ -4629,7 +4811,7 @@ "message": "Authenticator key" }, "autofillOptions": { - "message": "Autofill options" + "message": "ตัวเลือกในการป้อนอัตโนมัติ" }, "websiteUri": { "message": "Website (URI)" @@ -4709,7 +4891,7 @@ "message": "Show animations" }, "addAccount": { - "message": "Add account" + "message": "เพิ่มบัญชี" }, "loading": { "message": "Loading" @@ -4751,7 +4933,7 @@ } }, "addField": { - "message": "Add field" + "message": "เพิ่มฟิลด์" }, "add": { "message": "Add" @@ -4763,7 +4945,7 @@ "message": "Field label" }, "textHelpText": { - "message": "Use text fields for data like security questions" + "message": "ใช้ช่องข้อความสำหรับเก็บข้อมูล เช่น คำถามเพื่อความปลอดภัย" }, "hiddenHelpText": { "message": "Use hidden fields for sensitive data like a password" @@ -4799,7 +4981,7 @@ } }, "fieldAdded": { - "message": "$LABEL$ added", + "message": "เพิ่ม $LABEL$ แล้ว", "placeholders": { "label": { "content": "$1", @@ -4930,7 +5112,7 @@ "message": "Text Sends" }, "accountActions": { - "message": "Account actions" + "message": "การจัดการบัญชี" }, "showNumberOfAutofillSuggestions": { "message": "Show number of login autofill suggestions on extension icon" @@ -5041,7 +5223,10 @@ "message": "You can customize your unlock and timeout settings to more quickly access your vault." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "ตั้งค่า PIN สำหรับปลดล็อกแล้ว" + }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" }, "authenticating": { "message": "Authenticating" @@ -5278,7 +5463,7 @@ "message": "Quick and easy login" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "ตั้งค่าการปลดล็อกด้วยไบโอเมตริกซ์และการกรอกข้อมูลอัตโนมัติ เพื่อลงชื่อเข้าใช้บัญชีของคุณโดยไม่ต้องพิมพ์แม้แต่ตัวอักษรเดียว" }, "secureUser": { "message": "Level up your logins" @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/_locales/tr/messages.json b/apps/browser/src/_locales/tr/messages.json index a72e3593ff9..22a083959a9 100644 --- a/apps/browser/src/_locales/tr/messages.json +++ b/apps/browser/src/_locales/tr/messages.json @@ -84,7 +84,7 @@ "message": "Ana parola ipucu (isteğe bağlı)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Parola gücü puanı: $SCORE$", "placeholders": { "score": { "content": "$1", @@ -350,19 +350,19 @@ "message": "Bitwarden Secrets Manager" }, "continueToSecretsManagerPageDesc": { - "message": "Securely store, manage, and share developer secrets with Bitwarden Secrets Manager. Learn more on the bitwarden.com website." + "message": "Geliştirici gizli anahtarlarınızı Bitwarden Secrets Manager ile güvenli bir şekilde saklayın, yönetin ve paylaşın. Daha fazla bilgi için bitwarden.com web sitesini ziyaret edin." }, "passwordlessDotDev": { "message": "Passwordless.dev" }, "continueToPasswordlessDotDevPageDesc": { - "message": "Create smooth and secure login experiences free from traditional passwords with Passwordless.dev. Learn more on the bitwarden.com website." + "message": "Passwordless.dev ile geleneksel parolalara ihtiyaç duymadan sorunsuz ve güvenli oturum açma deneyimleri oluşturun. Daha fazla bilgi için bitwarden.com web sitesini ziyaret edin." }, "freeBitwardenFamilies": { "message": "Ücretsiz Bitwarden Aile" }, "freeBitwardenFamiliesPageDesc": { - "message": "You are eligible for Free Bitwarden Families. Redeem this offer today in the web app." + "message": "Ücretsiz Bitwarden Aile Paketi’nden faydalanmaya hak kazandınız. Bu teklifi bugün web uygulaması üzerinden kullanın." }, "version": { "message": "Sürüm" @@ -398,7 +398,7 @@ "message": "Klasör adı" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Bir klasörü iç içe yerleştirmek için, üst klasörün adını yazdıktan sonra “/” ekleyin. Örnek: Sosyal/Forumlar" }, "noFoldersAdded": { "message": "Hiç klasör eklenmedi" @@ -462,13 +462,13 @@ "message": "Parola oluştur" }, "generatePassphrase": { - "message": "Parola üret" + "message": "Parola cümlesi üret" }, "passwordGenerated": { "message": "Parola üretildi" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Parola cümlesi üretildi" }, "usernameGenerated": { "message": "Kullanıcı adı üretildi" @@ -547,6 +547,9 @@ "searchVault": { "message": "Kasada ara" }, + "resetSearch": { + "message": "Aramayı sıfırla" + }, "edit": { "message": "Düzenle" }, @@ -569,7 +572,7 @@ "message": "Kimlik doğrulama sırrı" }, "passphrase": { - "message": "Uzun söz" + "message": "Parola cümlesi" }, "favorite": { "message": "Favori" @@ -842,13 +845,13 @@ "message": "Mevcut web sayfasındaki kimlik doğrulayıcı QR kodunu tarayın" }, "totpHelperTitle": { - "message": "Make 2-step verification seamless" + "message": "2 adımlı doğrulamayı sorunsuz hale getirin" }, "totpHelper": { - "message": "Bitwarden can store and fill 2-step verification codes. Copy and paste the key into this field." + "message": "Bitwarden, 2 adımlı doğrulama kodlarını saklayabilir ve otomatik olarak doldurabilir. Anahtarı kopyalayıp bu alana yapıştırın." }, "totpHelperWithCapture": { - "message": "Bitwarden can store and fill 2-step verification codes. Select the camera icon to take a screenshot of this website's authenticator QR code, or copy and paste the key into this field." + "message": "Bitwarden, iki adımlı doğrulama kodlarını saklayabilir ve otomatik olarak doldurabilir. Bu web sitesinin doğrulayıcı QR kodunun ekran görüntüsünü almak için kamera simgesini seçin veya anahtarı bu alana kopyalayıp yapıştırın." }, "learnMoreAboutAuthenticators": { "message": "Kimlik doğrulayıcılar hakkında bilgi alın" @@ -878,10 +881,10 @@ "message": "Kimlik doğrulama uygulamanızdaki kodu girin" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Kimlik doğrulamak için YubiKey’inize dokunun" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Hesabınız için Duo iki adımlı giriş gereklidir. Giriş işlemini tamamlamak için aşağıdaki adımları izleyin." }, "followTheStepsBelowToFinishLoggingIn": { "message": "Girişi tamamlamak için aşağıdaki adımları izleyin." @@ -979,7 +982,7 @@ "message": "Kayıt eklendi" }, "editedItem": { - "message": "Kayıt kaydedildi" + "message": "Hesap kaydedildi" }, "deleteItemConfirmation": { "message": "Çöp kutusuna göndermek istediğinizden emin misiniz?" @@ -1141,7 +1144,7 @@ "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Harika iş çıkardınız! Kendinizi ve $ORGANIZATION$’ı daha güvenli hale getirmek için gereken adımları attınız.", "placeholders": { "organization": { "content": "$1" @@ -1150,7 +1153,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "$ORGANIZATION$’ı daha güvenli hale getirdiğiniz için teşekkürler. Güncellemeniz gereken $TASK_COUNT$ adet parola daha var.", "placeholders": { "organization": { "content": "$1" @@ -1162,7 +1165,7 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Sonraki parolayı değiştir", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { @@ -1173,6 +1176,12 @@ "message": "Bu hesabı kaydedemedik. Bilgileri elle girmeyi deneyin.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Parolanızı değiştirdikten sonra yeni parolanızyla tekrar giriş yapmanız gerekecektir. Diğer cihazlarınızdaki aktif oturumlar bir saat içinde kapatılacaktır." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Hesap kurtarmayı tamamlamak için ana parolanızı değiştirin." + }, "enableChangedPasswordNotification": { "message": "Mevcut hesapları güncellemeyi öner" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "Özellik kullanılamıyor" }, - "encryptionKeyMigrationRequired": { - "message": "Şifreleme anahtarınızın güncellenmesi gerekiyor. Şifreleme anahtarınızı güncellemek için lütfen web kasasına giriş yapın." + "legacyEncryptionUnsupported": { + "message": "Eski şifreleme artık desteklenmemektedir. Hesabınızı kurtarmak için lütfen destek ekibiyle iletişime geçin." }, "premiumMembership": { "message": "Premium üyelik" @@ -1496,7 +1505,7 @@ "message": "Güvenlik anahtarını oku" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Güvenlik anahtarı etkileşimi bekleniyor…" }, "loginUnavailable": { "message": "Giriş yapılamıyor" @@ -1556,13 +1565,13 @@ "message": "Şirket içinde barındırılan ortam" }, "selfHostedBaseUrlHint": { - "message": "Specify the base URL of your on-premises hosted Bitwarden installation. Example: https://bitwarden.company.com" + "message": "Yerel sunucunuzda barındırılan Bitwarden kurulumunuzun temel URL’sini belirtin. Örnek: https://bitwarden.sirketiniz.com" }, "selfHostedCustomEnvHeader": { "message": "İleri düzey yapılandırma için her hizmetin taban URL'sini bağımsız olarak belirleyebilirsiniz." }, "selfHostedEnvFormInvalid": { - "message": "You must add either the base Server URL or at least one custom environment." + "message": "Temel Sunucu URL’sini veya en az bir özel ortam eklemelisiniz." }, "customEnvironment": { "message": "Özel ortam" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Güvenlik kodu" }, + "cardNumber": { + "message": "kart numarası" + }, "ex": { "message": "örn." }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH anahtarı" }, + "typeNote": { + "message": "Not" + }, "newItemHeader": { "message": "Yeni $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Bitwarden'ı açarken kullanacağınız PIN kodunu belirleyin. Uygulamadan tamamen çıkış yaparsanız PIN ayarlarınız sıfırlanacaktır." }, - "setYourPinCode1": { - "message": "Bitwarden'ın kilidini açmak için ana parolanız yerine PIN'iniz kullanılacaktır. Bitwarden'dan tamamen çıkış yaparsanız PIN'iniz sıfırlanır." + "setPinCode": { + "message": "Bitwarden'ın kilidini açmak için bu PIN'i kullanabilirsiniz. Uygulamadan tamamen çıkış yaparsanız PIN'iniz sıfırlanacaktır." }, "pinRequired": { "message": "PIN kodu gerekli." @@ -2205,7 +2220,7 @@ "message": "Bu parolayı kullan" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Bu parola cümlesini kullan" }, "useThisUsername": { "message": "Bu kullanıcı adını kullan" @@ -2377,7 +2392,7 @@ "message": "Gizlilik Politikası" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Yeni parolanız mevcut parolanızla aynı olamaz." }, "hintEqualsPassword": { "message": "Parola ipucunuz parolanızla aynı olamaz." @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Bir kuruluş ilkesi, kayıtları kişisel kasanıza içe aktarmayı engelledi." }, + "restrictCardTypeImport": { + "message": "Kart öge türleri içe aktarılamıyor" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "Alan adları", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Değiştir" }, + "changePassword": { + "message": "Parolayı değiştir", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Parolayı değiştir - $ITEMNAME$", "placeholders": { @@ -2524,11 +2549,14 @@ } } }, + "atRiskPassword": { + "message": "Riskli parolalar" + }, "atRiskPasswords": { "message": "Riskli parolalar" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$, risk altında olduğu için bir parolanızı değiştirmenizi istiyor.", "placeholders": { "organization": { "content": "$1", @@ -2537,7 +2565,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$, risk altında oldukları için $COUNT$ adet parolanızı değiştirmenizi istiyor.", "placeholders": { "organization": { "content": "$1", @@ -2550,7 +2578,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Organizasyonlarınız, risk altında oldukları için $COUNT$ adet parolanızı değiştirmenizi istiyor.", "placeholders": { "count": { "content": "$1", @@ -2558,11 +2586,31 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Risk altında olan bir parolayı inceleyin ve değiştirin" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Risk altında olan $COUNT$ adet parolayı inceleyin ve değiştirin", "placeholders": { "count": { "content": "$1", @@ -2571,40 +2619,40 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Risk altındaki parolaları daha hızlı değiştirin" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Ayarlarınızı güncelleyin, böylece parolalarınızı hızlıca otomatik doldurabilir ve yeni parolalar oluşturabilirsiniz" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Risk altındaki hesapları inceleyin" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Risk altındaki parolaları inceleyin" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Organizasyonunuzun parolaları zayıf, tekrar kullanılmış ve/veya açığa çıkmış olduğu için risk altındadır.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Illustration of a list of logins that are at-risk." + "message": "Risk altında olan girişlerin bir listesinin görseli." }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Risk altındaki sitede Bitwarden otomatik doldurma menüsü ile hızlıca güçlü ve benzersiz bir parola oluşturun.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password." + "message": "Oluşturulan parolayı gösteren Bitwarden otomatik doldurma menüsünün görseli." }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Bitwarden’da güncelleyin" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden, ardından parola yöneticisinde parolayı güncellemeniz için sizi yönlendirecektir.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." + "message": "Kullanıcıya giriş bilgilerini güncellemesi için bildirim gönderen Bitwarden’in görseli." }, "turnOnAutofill": { "message": "Otomatik doldurmayı etkinleştir" @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Bu özelliği kullanmak için e-postanızı doğrulamanız gerekir. E-postanızı web kasasında doğrulayabilirsiniz." }, + "masterPasswordSuccessfullySet": { + "message": "Ana parola başarıyla ayarlandı" + }, "updatedMasterPassword": { "message": "Ana parola güncellendi" }, @@ -2896,7 +2947,7 @@ "message": "Ana parolanız kuruluş ilkelerinizi karşılamıyor. Kasanıza erişmek için ana parolanızı güncellemelisiniz. Devam ettiğinizde oturumunuz kapanacak ve yeniden oturum açmanız gerekecektir. Diğer cihazlardaki aktif oturumlar bir saate kadar aktif kalabilir." }, "tdeDisabledMasterPasswordRequired": { - "message": "Your organization has disabled trusted device encryption. Please set a master password to access your vault." + "message": "Organizasyonunuz, güvenilir cihaz şifrelemesini devre dışı bıraktı. Kasanıza erişmek için lütfen bir ana parola belirleyin." }, "resetPasswordPolicyAutoEnroll": { "message": "Otomatik eklenme" @@ -3022,7 +3073,7 @@ "message": "Benzersiz tanımlayıcı bulunamadı." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Aşağıdaki organizasyonun üyeleri için artık ana parola gerekmemektedir. Lütfen alan adını organizasyon yöneticinizle doğrulayın." }, "organizationName": { "message": "Kuruluş adı" @@ -3091,14 +3142,14 @@ "message": "Şifre çözme sorunu" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden, aşağıda listelenen kasa öğelerinin şifresini çözemedi." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Müşteri ekibi ile başarıyla iletişime geçtin", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "Ek veri kaybını önlemek için.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { @@ -3122,7 +3173,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": "Güçlü bir parola oluşturmak için $RECOMMENDED$ veya daha fazla karakter kullanın.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3132,7 +3183,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " Güçlü bir parola cümlesi üretmek için en az $RECOMMENDED$ kelime kullanın.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3209,7 +3260,7 @@ } }, "forwaderInvalidToken": { - "message": "Invalid $SERVICENAME$ API token", + "message": "Geçersiz $SERVICENAME$ API anahtarı", "description": "Displayed when the user's API token is empty or rejected by the forwarding service.", "placeholders": { "servicename": { @@ -3219,7 +3270,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Invalid $SERVICENAME$ API token: $ERRORMESSAGE$", + "message": "Geçersiz $SERVICENAME$ API anahtarı: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3233,7 +3284,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$, isteğinizi reddetti. Yardım için lütfen hizmet sağlayıcınızla iletişime geçin.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3243,7 +3294,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$, isteğinizi reddetti: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3257,7 +3308,7 @@ } }, "forwarderNoAccountId": { - "message": "Unable to obtain $SERVICENAME$ masked email account ID.", + "message": "$SERVICENAME$ maskeli e-posta hesap kimliği alınamıyor.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -3341,7 +3392,7 @@ "message": "Sunucu sürümü" }, "selfHostedServer": { - "message": "şirket içinde barındırılan" + "message": "şirket içi" }, "thirdParty": { "message": "Üçüncü taraf" @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "İstek gönderildi" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "$DEVICE$ cihazında $EMAIL$ girişi onaylandı", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Başka bir cihazdan giriş isteğini reddettiniz. Yanlışlıkla yaptıysanız aynı cihazdan yeniden giriş yapmayı deneyin." + }, + "device": { + "message": "Cihaz" + }, + "loginStatus": { + "message": "Oturum açma durumu" + }, + "masterPasswordChanged": { + "message": "Ana parola kaydedildi" + }, "exposedMasterPassword": { "message": "Açığa Çıkmış Ana Parola" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Sonraki girişleri kolaylaştırmak için bu cihazı hatırla" }, + "manageDevices": { + "message": "Cihazları yönet" + }, + "currentSession": { + "message": "Geçerli oturum" + }, + "mobile": { + "message": "Mobil", + "description": "Mobile app" + }, + "extension": { + "message": "Uzantı", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Masaüstü", + "description": "Desktop app" + }, + "webVault": { + "message": "Web kasası" + }, + "webApp": { + "message": "Web uygulaması" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "İstek bekliyor" + }, + "firstLogin": { + "message": "İlk giriş" + }, + "trusted": { + "message": "Güvenilen" + }, + "needsApproval": { + "message": "Onay gerekiyor" + }, + "devices": { + "message": "Cihazlar" + }, + "accessAttemptBy": { + "message": "$EMAIL$ erişim denemesi", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Erişimi onayla" + }, + "denyAccess": { + "message": "Erişimi reddet" + }, + "time": { + "message": "Tarih" + }, + "deviceType": { + "message": "Cihaz türü" + }, + "loginRequest": { + "message": "Giriş isteği" + }, + "thisRequestIsNoLongerValid": { + "message": "Bu istek artık geçerli değil." + }, + "loginRequestHasAlreadyExpired": { + "message": "Giriş isteğinin süresi doldu." + }, + "justNow": { + "message": "Az önce" + }, + "requestedXMinutesAgo": { + "message": "$MINUTES$ dakika önce istendi", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Cihaz onayı gerekiyor. Lütfen onay yönteminizi seçin:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Yönetici onayı iste" }, + "unableToCompleteLogin": { + "message": "Oturum açma tamamlanamadı" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Güvenilen bir cihazdan oturum açmalı veya yöneticinizden size parola atamasını istemelisiniz." + }, "ssoIdentifierRequired": { "message": "Kuruluş SSO tanımlayıcısı gereklidir." }, @@ -3591,10 +3761,10 @@ "message": "Cihaza güvenildi" }, "trustOrganization": { - "message": "Trust organization" + "message": "Organizasyona güven" }, "trust": { - "message": "Trust" + "message": "Güven" }, "doNotTrust": { "message": "Güvenme" @@ -3603,24 +3773,16 @@ "message": "Kuruluş güvenilir değil" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "Hesabınızın güvenliği için, yalnızca bu kullanıcıya acil erişim yetkisi verdiyseniz ve parmak izi hesaplarındakiyle uyuşuyorsa onaylayın." }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "Hesabınızın güvenliği için, yalnızca bu kuruluşun bir üyesiyseniz, hesap kurtarma etkinse ve aşağıda görüntülenen parmak izi kuruluşun parmak iziyle eşleşiyorsa devam edin." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Bu kuruluşun, sizi hesap kurtarma sistemine kaydedecek bir kurumsal politikası vardır. Bu kaydolma işlemi, kuruluş yöneticilerinin parolanızı değiştirmesine izin verir. Yalnızca bu kuruluşu tanıyorsanız ve aşağıda görüntülenen parmak izi ifadesi kuruluşun parmak iziyle eşleşiyorsa devam edin." }, "trustUser": { - "message": "Trust user" - }, - "sendsNoItemsTitle": { - "message": "Aktif Send yok", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Şifrelenmiş bilgileri güvenle paylaşmak için Send'i kullanabilirsiniz.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + "message": "Kullanıcıya güven" }, "sendsTitleNoItems": { "message": "Hassas bilgileri güvenle paylaşın", @@ -3828,7 +3990,7 @@ "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Add new vault login item, opens in a new window", + "message": "Yeni kasa giriş ögesini yeni bir açılır pencerede ekleyin", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { @@ -3836,7 +3998,7 @@ "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Add new vault card item, opens in a new window", + "message": "Yeni kasa kartı ögesini yeni bir açılır pencerede ekleyin", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { @@ -4023,7 +4185,7 @@ "message": "Geçiş anahtarı" }, "accessing": { - "message": "Erişilen konum:" + "message": "Erişilen konum" }, "loggedInExclamation": { "message": "Giriş yapıldı!" @@ -4216,6 +4378,26 @@ "message": "Sık kullanılan biçimler", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URl eşleştirme tespiti, Bitwarden'ın otomatik doldurma önerilerini nasıl tanımladığıdır.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Eşleşme tespiti hakkında daha fazla bilgi", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Gelişmiş seçenekler", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Tarayıcı ayarlarına gidilsin mi?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Kopyala: $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Kopyala: $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5008,22 +5190,22 @@ "message": "Bu kaydı düzenleme yetkisine sahip değilsiniz" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Önce PIN veya parola gerektiğinden biyometrik kilit açılamıyor." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Biyometrik kilit açma şu anda kullanılamıyor." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biyometrik kilit açma, yanlış yapılandırılmış sistem dosyaları nedeniyle kullanılamıyor." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Biyometrik kilit açma, yanlış yapılandırılmış sistem dosyaları nedeniyle kullanılamıyor." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Bitwarden masaüstü uygulaması kapalı olduğu için biyometrik kilit açılamıyor." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Biyometrik kilit açma, Bitwarden masaüstü uygulamasında $EMAIL$ etkin olmadığı için kullanılamıyor.", "placeholders": { "email": { "content": "$1", @@ -5032,7 +5214,7 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Biyometrik kilit açma şu anda bilinmeyen bir nedenden dolayı kullanılamıyor." }, "unlockVault": { "message": "Kasanızın kilidini saniyeler içinde açın" @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "Kimlik doğrulanıyor" }, @@ -5356,20 +5541,20 @@ "message": "Developer-friendly SSH access" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Anahtarlarınızı saklayın ve hızlı, şifreli kimlik doğrulama için SSH aracısıyla bağlantı kurun.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "SSH agent hakkında daha fazla bilgi edinin", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Hızlı bir şekilde parolalar oluşturun" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Tıklayarak güçlü ve benzersiz parolaları kolayca oluşturun", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, @@ -5379,10 +5564,20 @@ "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Güvenli oturumlar açmaya yardımcı olmak için Parola Oluştur düğmesine tıklayarak güçlü ve benzersiz parolalar oluşturun.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { "message": "Bu sayfayı görüntüleme izniniz yok. Farklı bir hesapla giriş yapmayı deneyin." + }, + "wasmNotSupported": { + "message": "Tarayıcınızda WebAssembly desteklenmiyor veya etkinleştirilmemişt. Bitwarden uygulamasını kullanmak için WebAssembly gereklidir.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Daha fazla göster" + }, + "showLess": { + "message": "Daha az göster" } } diff --git a/apps/browser/src/_locales/uk/messages.json b/apps/browser/src/_locales/uk/messages.json index 01c4fa2d73b..537a9bfd5cf 100644 --- a/apps/browser/src/_locales/uk/messages.json +++ b/apps/browser/src/_locales/uk/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "Пошук" }, + "resetSearch": { + "message": "Скинути пошук" + }, "edit": { "message": "Змінити" }, @@ -1173,6 +1176,12 @@ "message": "На жаль, не вдається зберегти. Введіть дані вручну.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Після зміни пароля потрібно буде ввійти в систему з новим паролем. Активні сеанси на інших пристроях буде завершено протягом години." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Змініть свій головний пароль, щоб завершити відновлення облікового запису." + }, "enableChangedPasswordNotification": { "message": "Запитувати про оновлення запису" }, @@ -1360,13 +1369,13 @@ "message": "Оберіть файл" }, "maxFileSize": { - "message": "Максимальний розмір файлу 500 Мб." + "message": "Максимальний розмір файлу 500 МБ." }, "featureUnavailable": { "message": "Функція недоступна" }, - "encryptionKeyMigrationRequired": { - "message": "Потрібно перенести ключ шифрування. Увійдіть у вебсховище та оновіть свій ключ шифрування." + "legacyEncryptionUnsupported": { + "message": "Застаріле шифрування більше не підтримується. Зверніться до служби підтримки, щоб відновити обліковий запис." }, "premiumMembership": { "message": "Преміум статус" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Код безпеки" }, + "cardNumber": { + "message": "номер картки" + }, "ex": { "message": "зразок" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "Ключ SSH" }, + "typeNote": { + "message": "Нотатка" + }, "newItemHeader": { "message": "Новий $TYPE$", "placeholders": { @@ -2042,7 +2057,7 @@ "message": "Починається з" }, "regEx": { - "message": "Звичайний вираз", + "message": "Регулярний вираз", "description": "A programming term, also known as 'RegEx'." }, "matchDetection": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "Встановіть PIN-код для розблокування Bitwarden. Налаштування PIN-коду будуть скинуті, якщо ви коли-небудь повністю вийдете з програми." }, - "setYourPinCode1": { - "message": "PIN-код буде використовуватися для розблокування Bitwarden замість головного пароля. У разі повного виходу з Bitwarden, ваш PIN-код буде скинуто." + "setPinCode": { + "message": "Ви можете використовувати цей PIN-код для розблокування Bitwarden. PIN-код буде скинуто, якщо ви вийдете з програми." }, "pinRequired": { "message": "Необхідний PIN-код." @@ -2205,7 +2220,7 @@ "message": "Використати цей пароль" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Використати цю парольну фразу" }, "useThisUsername": { "message": "Використати це ім'я користувача" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "Політика організації заблокувала імпортування записів до вашого особистого сховища." }, + "restrictCardTypeImport": { + "message": "Не вдається імпортувати записи карток" + }, + "restrictCardTypeImportDesc": { + "message": "Політика принаймні однієї організації не дозволяє вам імпортувати записи карток до сховища." + }, "domainsTitle": { "message": "Домени", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Змінити" }, + "changePassword": { + "message": "Змінити пароль", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Змінити пароль – $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "Ризикований пароль" + }, "atRiskPasswords": { "message": "Ризиковані паролі" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Пароль для цього сайту ризикований. Організація $ORGANIZATION$ попросила вас змінити його.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ хоче, щоб ви змінили цей пароль, тому що він ризикований. Перейдіть до налаштувань облікового запису, щоб змінити пароль.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Перегляньте і змініть один ризикований пароль" }, @@ -2678,7 +2726,7 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Досягнуто максимальної кількості доступів", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "Для використання цієї функції необхідно підтвердити електронну пошту. Ви можете виконати підтвердження у вебсховищі." }, + "masterPasswordSuccessfullySet": { + "message": "Головний пароль успішно встановлено" + }, "updatedMasterPassword": { "message": "Головний пароль оновлено" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "Запит надіслано" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Запит входу підтверджено для $EMAIL$ на $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Ви відхилили спробу входу з іншого пристрою. Якщо це були ви, спробуйте ввійти з пристроєм знову." + }, + "device": { + "message": "Пристрій" + }, + "loginStatus": { + "message": "Стан входу в систему" + }, + "masterPasswordChanged": { + "message": "Головний пароль збережено" + }, "exposedMasterPassword": { "message": "Головний пароль викрито" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "Запам'ятайте цей пристрій, щоб спростити майбутні входи в систему" }, + "manageDevices": { + "message": "Керувати пристроями" + }, + "currentSession": { + "message": "Поточний сеанс" + }, + "mobile": { + "message": "Мобільний", + "description": "Mobile app" + }, + "extension": { + "message": "Розширення", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Комп'ютер", + "description": "Desktop app" + }, + "webVault": { + "message": "Вебсховище" + }, + "webApp": { + "message": "Вебпрограма" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Запит в очікуванні" + }, + "firstLogin": { + "message": "Перший вхід" + }, + "trusted": { + "message": "Надійний" + }, + "needsApproval": { + "message": "Потребує підтвердження" + }, + "devices": { + "message": "Пристрої" + }, + "accessAttemptBy": { + "message": "Спроба доступу з $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Підтвердити доступ" + }, + "denyAccess": { + "message": "Заборонити доступ" + }, + "time": { + "message": "Час" + }, + "deviceType": { + "message": "Тип пристрою" + }, + "loginRequest": { + "message": "Запит входу" + }, + "thisRequestIsNoLongerValid": { + "message": "Цей запит більше недійсний." + }, + "loginRequestHasAlreadyExpired": { + "message": "Термін дії запиту на вхід завершився." + }, + "justNow": { + "message": "Щойно" + }, + "requestedXMinutesAgo": { + "message": "Запитано $MINUTES$ хвилин тому", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "Необхідне підтвердження пристрою. Виберіть варіант підтвердження нижче:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Запит підтвердження адміністратора" }, + "unableToCompleteLogin": { + "message": "Не вдалося завершити вхід" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Ви повинні ввійти до системи на довіреному пристрої або попросити адміністратора призначити вам пароль." + }, "ssoIdentifierRequired": { "message": "Потрібен SSO-ідентифікатор організації." }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Довіряти користувачу" }, - "sendsNoItemsTitle": { - "message": "Немає активних відправлень", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Використовуйте відправлення, щоб безпечно надавати доступ іншим до зашифрованої інформації.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Безпечно надсилайте конфіденційну інформацію", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "Поширені формати", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Виявлення збігів URI – це спосіб ідентифікації пропозицій автозаповнення Bitwarden.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "Регулярний вираз – це функція, що має підвищений ризик розкриття облікових даних, призначена для досвідчених користувачів.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Починається з\" – це функція, що має підвищений ризик розкриття облікових даних, призначена для досвідчених користувачів.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Докладніше про виявлення збігів", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Додаткові налаштування", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Відкрити налаштування браузера?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Копіювати $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Копіювати $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Розблокування PIN-кодом встановлено" }, + "unlockWithBiometricSet": { + "message": "Біометричне розблокування налаштовано" + }, "authenticating": { "message": "Аутентифікація" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "У вас немає дозволу переглядати цю сторінку. Спробуйте ввійти з іншим обліковим записом." + }, + "wasmNotSupported": { + "message": "WebAssembly не підтримується або не ввімкнено у вашому браузері. WebAssembly є обов'язковою вимогою для програми Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Розгорнути" + }, + "showLess": { + "message": "Згорнути" } } diff --git a/apps/browser/src/_locales/vi/messages.json b/apps/browser/src/_locales/vi/messages.json index fcbcb8f7b6d..641205fffb7 100644 --- a/apps/browser/src/_locales/vi/messages.json +++ b/apps/browser/src/_locales/vi/messages.json @@ -10,35 +10,35 @@ "description": "Extension name, MUST be less than 40 characters (Safari restriction)" }, "extDesc": { - "message": "Ở nhà, ở cơ quan, hay trên đường đi, Bitwarden sẽ bảo mật tất cả mật khẩu, mã khoá, và thông tin cá nhân của bạn", + "message": "Ở nhà, ở cơ quan hay khi di chuyển, Bitwarden sẽ bảo vệ tất cả mật khẩu, mã khóa và thông tin cá nhân của bạn", "description": "Extension description, MUST be less than 112 characters (Safari restriction)" }, "loginOrCreateNewAccount": { "message": "Đăng nhập hoặc tạo tài khoản mới để truy cập kho lưu trữ của bạn." }, "inviteAccepted": { - "message": "Lời mời được chấp nhận" + "message": "Đã chấp nhận lời mời" }, "createAccount": { "message": "Tạo tài khoản" }, "newToBitwarden": { - "message": "New to Bitwarden?" + "message": "Bạn mới sử dụng Bitwarden?" }, "logInWithPasskey": { - "message": "Log in with passkey" + "message": "Đăng nhập bằng khóa truy cập" }, "useSingleSignOn": { - "message": "Use single sign-on" + "message": "Dùng đăng nhập một lần" }, "welcomeBack": { - "message": "Welcome back" + "message": "Chào mừng bạn trở lại" }, "setAStrongPassword": { - "message": "Đặt mật khẩu mạnh" + "message": "Đặt một mật khẩu mạnh" }, "finishCreatingYourAccountBySettingAPassword": { - "message": "Hoàn thành việc tạo tài khoản của bạn bằng cách đặt mật khẩu" + "message": "Hoàn tất việc tạo tài khoản bằng cách đặt mật khẩu" }, "enterpriseSingleSignOn": { "message": "Đăng nhập bằng tài khoản tổ chức" @@ -84,7 +84,7 @@ "message": "Gợi ý mật khẩu chính (tùy chọn)" }, "passwordStrengthScore": { - "message": "Password strength score $SCORE$", + "message": "Độ mạnh của mật khẩu $SCORE$", "placeholders": { "score": { "content": "$1", @@ -96,7 +96,7 @@ "message": "Tham gia tổ chức" }, "joinOrganizationName": { - "message": "Join $ORGANIZATIONNAME$", + "message": "Tham gia $ORGANIZATIONNAME$", "placeholders": { "organizationName": { "content": "$1", @@ -132,16 +132,16 @@ "message": "Sao chép mật khẩu" }, "copyPassphrase": { - "message": "Copy passphrase" + "message": "Sao chép cụm mật khẩu" }, "copyNote": { "message": "Sao chép ghi chú" }, "copyUri": { - "message": "Sao chép URI" + "message": "Sao chép đường dẫn" }, "copyUsername": { - "message": "Sao chép tên người dùng" + "message": "Sao chép tên đăng nhập" }, "copyNumber": { "message": "Sao chép số" @@ -153,10 +153,10 @@ "message": "Sao chép tên" }, "copyCompany": { - "message": "Copy company" + "message": "Sao chép công ty" }, "copySSN": { - "message": "Số bảo hiểm xã hội" + "message": "Sao chép số bảo hiểm xã hội" }, "copyPassportNumber": { "message": "Sao chép số hộ chiếu" @@ -165,16 +165,16 @@ "message": "Sao chép số giấy phép" }, "copyPrivateKey": { - "message": "Copy private key" + "message": "Sao chép khóa riêng tư" }, "copyPublicKey": { - "message": "Copy public key" + "message": "Sao chép khóa công khai" }, "copyFingerprint": { - "message": "Copy fingerprint" + "message": "Sao chép vân tay" }, "copyCustomField": { - "message": "Copy $FIELD$", + "message": "Sao chép $FIELD$", "placeholders": { "field": { "content": "$1", @@ -183,17 +183,17 @@ } }, "copyWebsite": { - "message": "Copy website" + "message": "Sao chép trang web" }, "copyNotes": { - "message": "Copy notes" + "message": "Sao chép ghi chú" }, "copy": { - "message": "Copy", + "message": "Sao chép", "description": "Copy to clipboard" }, "fill": { - "message": "Fill", + "message": "Điền", "description": "This string is used on the vault page to indicate autofilling. Horizontal space is limited in the interface here so try and keep translations as concise as possible." }, "autoFill": { @@ -209,10 +209,10 @@ "message": "Tự động điền danh tính" }, "fillVerificationCode": { - "message": "Fill verification code" + "message": "Điền mã xác minh" }, "fillVerificationCodeAria": { - "message": "Fill Verification Code", + "message": "Điền mã xác minh", "description": "Aria label for the heading displayed the inline menu for totp code autofill" }, "generatePasswordCopied": { @@ -222,7 +222,7 @@ "message": "Sao chép tên trường tùy chỉnh" }, "noMatchingLogins": { - "message": "Không có thông tin đăng nhập phù hợp." + "message": "Không có thông tin đăng nhập phù hợp" }, "noCards": { "message": "Không có thẻ" @@ -246,7 +246,7 @@ "message": "Đăng nhập vào kho lưu trữ của bạn" }, "autoFillInfo": { - "message": "Không có thông tin đăng nhập nào sẵn có để tự động điền vào tab hiện tại." + "message": "Hiện không có thông tin đăng nhập nào để tự động điền vào tab hiện tại." }, "addLogin": { "message": "Thêm một đăng nhập" @@ -255,16 +255,16 @@ "message": "Thêm mục" }, "accountEmail": { - "message": "Account email" + "message": "Email tài khoản" }, "requestHint": { - "message": "Request hint" + "message": "Yêu cầu gợi ý" }, "requestPasswordHint": { - "message": "Request password hint" + "message": "Yêu cầu gợi ý mật khẩu" }, "enterYourAccountEmailAddressAndYourPasswordHintWillBeSentToYou": { - "message": "Enter your account email address and your password hint will be sent to you" + "message": "Nhập địa chỉ email tài khoản của bạn và gợi ý mật khẩu sẽ được gửi đến bạn" }, "getMasterPasswordHint": { "message": "Nhận gợi ý mật khẩu chính" @@ -294,7 +294,7 @@ "message": "Tiếp tục tới ứng dụng web?" }, "continueToWebAppDesc": { - "message": "Khám phá thêm các tính năng của tài khoản Bitwarden của bạn trên bản web." + "message": "Khám phá thêm các tính năng tài khoản Bitwarden của bạn trên bản web." }, "continueToHelpCenter": { "message": "Tiếp tục tới Trung tâm trợ giúp?" @@ -306,17 +306,17 @@ "message": "Tiếp tục tới cửa hàng tiện ích mở rộng của trình duyệt?" }, "continueToBrowserExtensionStoreDesc": { - "message": "Giúp người khác tìm hiểu xem Bitwarden có phù hợp với họ không. Hãy truy cập cửa hàng tiện ích mở rộng trên trình duyệt của bạn và đánh giá ngay bây giờ." + "message": "Giúp người khác tìm hiểu xem Bitwarden có phù hợp với họ không. Truy cập cửa hàng tiện ích mở rộng của trình duyệt và đánh giá ngay bây giờ." }, "changeMasterPasswordOnWebConfirmation": { "message": "Bạn có thể thay đổi mật khẩu chính của mình trên Bitwarden bản web." }, "fingerprintPhrase": { - "message": "Cụm vân tay", + "message": "Cụm từ xác thực", "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": "Cụm vân tay của tài khoản của bạn", + "message": "Cụm từ xác thực tài khoản của bạn", "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": { @@ -341,16 +341,16 @@ "message": "Bitwarden dành cho Doanh Nghiệp" }, "bitwardenAuthenticator": { - "message": "Bitwarden Authenticator" + "message": "Trình xác thực Bitwarden" }, "continueToAuthenticatorPageDesc": { - "message": "Ứng dụng Bitwarden Authenticator cho phép bạn lưu trữ khóa xác thực và tạo mã TOTP cho quy trình xác minh hai bước. Tìm hiểu thêm trên trang web bitwarden.com" + "message": "Trình xác thực Bitwarden cho phép bạn lưu trữ các khóa xác thực và tạo mã TOTP cho quy trình xác thực hai bước. Tìm hiểu thêm trên trang web bitwarden.com" }, "bitwardenSecretsManager": { - "message": "Bitwarden Secrets Manager" + "message": "Trình quản lý Bí mật Bitwarden" }, "continueToSecretsManagerPageDesc": { - "message": "Lưu trữ bảo mật, quản lý và chia sẻ bí mật của nhà phát triển với Bitwarden Secrets Manager. Truy cập bitwarden.com để biết thêm chi tiết." + "message": "Lưu trữ, quản lý và chia sẻ các thông tin bí mật của nhà phát triển một cách an toàn với Trình quản lý Bí mật Bitwarden. Tìm hiểu thêm trên trang web bitwarden.com." }, "passwordlessDotDev": { "message": "Passwordless.dev" @@ -359,10 +359,10 @@ "message": "Tạo trải nghiệm đăng nhập mượt mà và an toàn không cần mật khẩu truyền thống với Passwordless.dev. Tìm hiểu thêm trên trang web bitwarden.com." }, "freeBitwardenFamilies": { - "message": "Gói Gia đình Miễn phí của Bitwarden" + "message": "Gói Bitwarden cho Gia đình miễn phí" }, "freeBitwardenFamiliesPageDesc": { - "message": "Bạn đủ điều kiện cho Gói Gia đình Miễn phí của Bitwarden. Hãy nhận ưu đãi này ngay hôm nay trên ứng dụng web." + "message": "Bạn đủ điều kiện miễn phí Gói Bitwarden cho Gia đình. Hãy nhận ưu đãi này ngay hôm nay trên web." }, "version": { "message": "Phiên bản" @@ -383,7 +383,7 @@ "message": "Chỉnh sửa thư mục" }, "editFolderWithName": { - "message": "Edit folder: $FOLDERNAME$", + "message": "Sửa thư mục: $FOLDERNAME$", "placeholders": { "foldername": { "content": "$1", @@ -398,16 +398,16 @@ "message": "Tên thư mục" }, "folderHintText": { - "message": "Nest a folder by adding the parent folder's name followed by a “/”. Example: Social/Forums" + "message": "Tạo một thư mục con bằng cách thêm tên thư mục cha theo sau là dấu “/”. Ví dụ: Social/Forums" }, "noFoldersAdded": { - "message": "No folders added" + "message": "Không thêm thư mục nào" }, "createFoldersToOrganize": { - "message": "Create folders to organize your vault items" + "message": "Tạo thư mục để tổ chức các mục trong kho của bạn" }, "deleteFolderPermanently": { - "message": "Are you sure you want to permanently delete this folder?" + "message": "Bạn có chắc muốn xóa vĩnh viễn thư mục này?" }, "deleteFolder": { "message": "Xóa thư mục" @@ -450,10 +450,10 @@ "message": "Tự động tạo mật khẩu mạnh mẽ, độc nhất cho đăng nhập của bạn." }, "bitWebVaultApp": { - "message": "Ứng dụng Bitwarden bản web" + "message": "Ứng dụng web Bitwarden" }, "importItems": { - "message": "Nhập mục" + "message": "Nhập vào kho" }, "select": { "message": "Chọn" @@ -462,19 +462,19 @@ "message": "Tạo mật khẩu" }, "generatePassphrase": { - "message": "Generate passphrase" + "message": "Tạo cụm mật khẩu" }, "passwordGenerated": { - "message": "Password generated" + "message": "Đã tạo mật khẩu" }, "passphraseGenerated": { - "message": "Passphrase generated" + "message": "Đã tạo cụm mật khẩu" }, "usernameGenerated": { - "message": "Username generated" + "message": "Tên đăng nhập được tạo tự động" }, "emailGenerated": { - "message": "Email generated" + "message": "Email được tạo ra" }, "regeneratePassword": { "message": "Tạo lại mật khẩu" @@ -490,7 +490,7 @@ "description": "Card header for password generator include block" }, "uppercaseDescription": { - "message": "Include uppercase characters", + "message": "Bao gồm các ký tự viết hoa", "description": "Tooltip for the password generator uppercase character checkbox" }, "uppercaseLabel": { @@ -498,7 +498,7 @@ "description": "Label for the password generator uppercase character checkbox" }, "lowercaseDescription": { - "message": "Include lowercase characters", + "message": "Bao gồm các ký tự viết thường", "description": "Full description for the password generator lowercase character checkbox" }, "lowercaseLabel": { @@ -521,7 +521,7 @@ "message": "Số từ" }, "wordSeparator": { - "message": "Word Separator" + "message": "Dấu phân cách từ" }, "capitalize": { "message": "Viết hoa", @@ -534,19 +534,22 @@ "message": "Số kí tự tối thiểu" }, "minSpecial": { - "message": "Số kí tự đặc biệt tối thiểu" + "message": "Kí tự đặc biệt tối thiểu" }, "avoidAmbiguous": { - "message": "Avoid ambiguous characters", + "message": "Tránh các ký tự dễ nhầm lẫn", "description": "Label for the avoid ambiguous characters checkbox." }, "generatorPolicyInEffect": { - "message": "Enterprise policy requirements have been applied to your generator options.", + "message": "Các yêu cầu chính sách của doanh nghiệp đã được áp dụng cho các tùy chọn trình tạo của bạn.", "description": "Indicates that a policy limits the credential generator screen." }, "searchVault": { "message": "Tìm kiếm trong kho lưu trữ" }, + "resetSearch": { + "message": "Đặt lại tìm kiếm" + }, "edit": { "message": "Sửa" }, @@ -557,19 +560,19 @@ "message": "Không có mục nào để liệt kê." }, "itemInformation": { - "message": "Mục thông tin" + "message": "Thông tin mục" }, "username": { - "message": "Tên người dùng" + "message": "Tên đăng nhập" }, "password": { "message": "Mật khẩu" }, "totp": { - "message": "Khóa xác thực" + "message": "Mã xác thực bí mật" }, "passphrase": { - "message": "Cụm từ mật khẩu" + "message": "Cụm mật khẩu" }, "favorite": { "message": "Yêu thích" @@ -578,16 +581,16 @@ "message": "Bỏ thích" }, "itemAddedToFavorites": { - "message": "Đã thêm vào yêu thích" + "message": "Đã thêm mục vào yêu thích" }, "itemRemovedFromFavorites": { - "message": "Đã xóa khỏi yêu thích" + "message": "Đã xóa mục khỏi yêu thích" }, "notes": { "message": "Ghi chú" }, "privateNote": { - "message": "Private note" + "message": "Ghi chú riêng tư" }, "note": { "message": "Ghi chú" @@ -611,7 +614,7 @@ "message": "Mở trang web" }, "launchWebsiteName": { - "message": "Launch website $ITEMNAME$", + "message": "Khởi chạy trang web $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -635,16 +638,16 @@ "message": "Tùy chọn mở khóa" }, "unlockMethodNeededToChangeTimeoutActionDesc": { - "message": "Thiết lập phương thức mở khóa để thay đổi hành động hết thời gian chờ của vault." + "message": "Thiết lập phương thức mở khóa để thay đổi hành động sau khi đóng kho." }, "unlockMethodNeeded": { "message": "Thiết lập phương pháp mở khóa trong Cài đặt" }, "sessionTimeoutHeader": { - "message": "Thời gian chờ của phiên" + "message": "Thời gian hết phiên" }, "vaultTimeoutHeader": { - "message": "Vault timeout" + "message": "Thời gian mở kho" }, "otherOptions": { "message": "Tùy chọn khác" @@ -653,28 +656,28 @@ "message": "Đánh giá tiện ích mở rộng" }, "browserNotSupportClipboard": { - "message": "Trình duyệt web của bạn không hỗ trợ dễ dàng sao chép bộ nhớ tạm. Bạn có thể sao chép nó theo cách thủ công để thay thế." + "message": "Trình duyệt web của bạn không hỗ trợ sao chép vào bảng nhớ tạm một cách dễ dàng. Vui lòng sao chép thủ công." }, "verifyYourIdentity": { - "message": "Verify your identity" + "message": "Xác minh danh tính của bạn" }, "weDontRecognizeThisDevice": { - "message": "We don't recognize this device. Enter the code sent to your email to verify your identity." + "message": "Chúng tôi không nhận diện được thiết bị này. Nhập mã được gửi đến email để xác minh danh tính của bạn." }, "continueLoggingIn": { - "message": "Continue logging in" + "message": "Tiếp tục đăng nhập" }, "yourVaultIsLocked": { "message": "Kho của bạn đã bị khóa. Xác minh danh tính của bạn để mở khoá." }, "yourVaultIsLockedV2": { - "message": "Your vault is locked" + "message": "Kho của bạn đã khóa" }, "yourAccountIsLocked": { - "message": "Your account is locked" + "message": "Tài khoản của bạn đã bị khóa" }, "or": { - "message": "or" + "message": "hoặc" }, "unlock": { "message": "Mở khóa" @@ -696,10 +699,10 @@ "message": "Mật khẩu chính không hợp lệ" }, "vaultTimeout": { - "message": "Thời gian chờ của kho" + "message": "Đóng kho sau" }, "vaultTimeout1": { - "message": "Timeout" + "message": "Quá hạn" }, "lockNow": { "message": "Khóa ngay" @@ -741,7 +744,7 @@ "message": "4 giờ" }, "onLocked": { - "message": "Mỗi khi khóa" + "message": "Mỗi khi khóa máy" }, "onRestart": { "message": "Mỗi khi khởi động lại trình duyệt" @@ -759,7 +762,7 @@ "message": "Mật khẩu chính" }, "masterPassImportant": { - "message": "Mật khẩu chính của bạn không thể phục hồi nếu bạn quên nó!" + "message": "Mật khẩu chính của bạn không thể khôi phục nếu bạn quên nó!" }, "masterPassHintLabel": { "message": "Gợi ý mật khẩu chính" @@ -768,7 +771,7 @@ "message": "Đã xảy ra lỗi" }, "emailRequired": { - "message": "Yêu cầu địa chỉ email." + "message": "Cần điền địa chỉ email." }, "invalidEmail": { "message": "Địa chỉ email không hợp lệ." @@ -777,7 +780,7 @@ "message": "Yêu cầu mật khẩu chính." }, "confirmMasterPasswordRequired": { - "message": "Yêu cầu nhập lại mật khẩu chính." + "message": "Cần nhập lại mật khẩu chính." }, "masterPasswordMinlength": { "message": "Mật khẩu chính phải có ít nhất $VALUE$ kí tự.", @@ -830,7 +833,7 @@ } }, "autofillError": { - "message": "Không thể tự động điền mục đã chọn trên trang này. Hãy thực hiện sao chép và dán thông tin một cách thủ công." + "message": "Không thể tự động điền mục đã chọn trên trang này. Vui lòng sao chép và dán thông tin thủ công." }, "totpCaptureError": { "message": "Không thể quét mã QR từ trang web hiện tại" @@ -842,19 +845,19 @@ "message": "Quét mã QR xác thực từ trang web hiện tại" }, "totpHelperTitle": { - "message": "Thực hiện xác minh hai bước liền mạch" + "message": "Giúp quá trình xác minh 2 bước diễn ra liền mạch" }, "totpHelper": { - "message": "Bitwarden có thể lưu trữ và điền mã xác minh 2 bước. Sao chép và dán khóa vào trường này." + "message": "Bitwarden có thể lưu trữ và điền mã xác thực 2 bước. Sao chép và dán khóa vào ô này." }, "totpHelperWithCapture": { - "message": "Bitwarden có thể lưu trữ và điền mã xác minh 2 bước. Hãy chọn biểu tượng máy ảnh để chụp mã QR xác thực của trang web, hoặc sao chép và dán khoá vào ô này." + "message": "Bitwarden có thể lưu trữ và điền mã xác minh 2 bước. Hãy chọn biểu tượng máy ảnh để quét mã QR xác thực của trang web, hoặc sao chép và dán khoá vào ô này." }, "learnMoreAboutAuthenticators": { - "message": "Learn more about authenticators" + "message": "Tìm hiểu thêm về các công cụ xác thực" }, "copyTOTP": { - "message": "Sao chép khóa Authenticator (TOTP)" + "message": "Sao chép khóa xác thực (TOTP)" }, "loggedOut": { "message": "Đã đăng xuất" @@ -869,25 +872,25 @@ "message": "Đăng nhập" }, "logInToBitwarden": { - "message": "Log in to Bitwarden" + "message": "Đăng nhập Bitwarden" }, "enterTheCodeSentToYourEmail": { - "message": "Enter the code sent to your email" + "message": "Nhập mã được gửi về email của bạn" }, "enterTheCodeFromYourAuthenticatorApp": { - "message": "Enter the code from your authenticator app" + "message": "Nhập mã từ ứng dụng xác thực của bạn" }, "pressYourYubiKeyToAuthenticate": { - "message": "Press your YubiKey to authenticate" + "message": "Nhấn YubiKey của bạn để xác thực" }, "duoTwoFactorRequiredPageSubtitle": { - "message": "Duo two-step login is required for your account. Follow the steps below to finish logging in." + "message": "Đăng nhập hai bước là bắt buộc cho tài khoản của bạn. Hãy làm theo các bước dưới đây để hoàn tất quá trình đăng nhập." }, "followTheStepsBelowToFinishLoggingIn": { - "message": "Follow the steps below to finish logging in." + "message": "Thực hiện các bước sau để hoàn tất đăng nhập." }, "followTheStepsBelowToFinishLoggingInWithSecurityKey": { - "message": "Follow the steps below to finish logging in with your security key." + "message": "Thực hiện các bước sau để hoàn tất đăng nhập bằng khóa bảo mật của bạn." }, "restartRegistration": { "message": "Tiến hành đăng ký lại" @@ -911,7 +914,7 @@ "message": "Không" }, "location": { - "message": "Location" + "message": "Vị trí" }, "unexpectedError": { "message": "Một lỗi bất ngờ đã xảy ra." @@ -923,13 +926,13 @@ "message": "Đã thêm thư mục" }, "twoStepLoginConfirmation": { - "message": "Xác thực hai lớp giúp cho tài khoản của bạn an toàn hơn bằng cách yêu cầu bạn xác minh thông tin đăng nhập của bạn bằng một thiết bị khác như khóa bảo mật, ứng dụng xác thực, SMS, cuộc gọi điện thoại hoặc email. Bạn có thể bật xác thực hai lớp trong kho bitwarden nền web. Bạn có muốn ghé thăm trang web bây giờ?" + "message": "Đăng nhập hai bước giúp tài khoản của bạn an toàn hơn bằng cách yêu cầu bạn xác minh việc đăng nhập bằng một thiết bị khác như khóa bảo mật, ứng dụng xác thực, SMS, cuộc gọi điện thoại hoặc email. Đăng nhập hai bước có thể được thiết lập trên bitwarden.com. Bạn có muốn truy cập trang web bây giờ không?" }, "twoStepLoginConfirmationContent": { - "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + "message": "Tăng cường bảo mật tài khoản của bạn bằng cách thiết lập đăng nhập hai bước trên trang web Bitwarden." }, "twoStepLoginConfirmationTitle": { - "message": "Continue to web app?" + "message": "Tiếp tục tới ứng dụng web?" }, "editedFolder": { "message": "Đã lưu thư mục" @@ -941,7 +944,7 @@ "message": "Đã xóa thư mục" }, "gettingStartedTutorial": { - "message": "Hướng dẫn Bắt đầu" + "message": "Hướng dẫn bắt đầu" }, "gettingStartedTutorialVideo": { "message": "Xem hướng dẫn bắt đầu của chúng tôi để tìm hiểu cách tận dụng tối đa tiện ích mở rộng của trình duyệt." @@ -969,7 +972,7 @@ } }, "newUri": { - "message": "URI mới" + "message": "Đường dẫn mới" }, "addDomain": { "message": "Thêm tên miền", @@ -979,13 +982,13 @@ "message": "Đã thêm mục" }, "editedItem": { - "message": "Mục được chỉnh sửa" + "message": "Đã lưu mục" }, "deleteItemConfirmation": { - "message": "Bạn có chắc bạn muốn xóa mục này?" + "message": "Bạn có chắc muốn cho nó vào thùng rác?" }, "deletedItem": { - "message": "Đã xóa mục" + "message": "Mục đã được cho vào thùng rác" }, "overwritePassword": { "message": "Ghi đè mật khẩu" @@ -994,10 +997,10 @@ "message": "Bạn có chắc chắn muốn ghi đè mật khẩu hiện tại không?" }, "overwriteUsername": { - "message": "Ghi đè tên người dùng" + "message": "Ghi đè tên đăng nhập" }, "overwriteUsernameConfirmation": { - "message": "Bạn có chắc chắn muốn ghi đè tên người dùng hiện tại không?" + "message": "Bạn có chắc chắn muốn ghi đè tên đăng nhập hiện tại không?" }, "searchFolder": { "message": "Tìm kiếm thư mục" @@ -1006,26 +1009,26 @@ "message": "Tìm kiếm bộ sưu tập" }, "searchType": { - "message": "Tìm loại" + "message": "Tìm theo thể loại" }, "noneFolder": { "message": "Không có thư mục", "description": "This is the folder for uncategorized items" }, "enableAddLoginNotification": { - "message": "Hỏi để thêm đăng nhập" + "message": "Gợi ý thêm mục đăng nhập" }, "vaultSaveOptionsTitle": { - "message": "Lưu vào các tùy chọn kho" + "message": "Tùy chọn lưu vào kho" }, "addLoginNotificationDesc": { - "message": "'Thông báo Thêm đăng nhập' sẽ tự động nhắc bạn lưu các đăng nhập mới vào hầm an toàn của bạn bất cứ khi nào bạn đăng nhập trang web lần đầu tiên." + "message": "Gợi ý thêm mục nếu không tìm thấy mục nào trong kho trùng khớp." }, "addLoginNotificationDescAlt": { - "message": "Đưa ra lựa chọn để thêm một mục nếu không tìm thấy mục đó trong hòm của bạn. Áp dụng với mọi tài khoản đăng nhập trên thiết bị." + "message": "Gợi ý thêm mục nếu không tìm thấy mục nào trong kho trùng khớp. Áp dụng cho tất cả tài khoản đã đăng nhập." }, "showCardsInVaultViewV2": { - "message": "Always show cards as Autofill suggestions on Vault view" + "message": "Luôn hiển thị thẻ như đề xuất tự động điền trên giao diện kho" }, "showCardsCurrentTab": { "message": "Hiển thị thẻ trên trang Tab" @@ -1034,26 +1037,26 @@ "message": "Liệt kê các mục thẻ trên trang Tab để dễ dàng tự động điền." }, "showIdentitiesInVaultViewV2": { - "message": "Always show identities as Autofill suggestions on Vault view" + "message": "Luôn hiển thị danh tính như đề xuất tự động điền trên giao diện kho" }, "showIdentitiesCurrentTab": { "message": "Hiển thị danh tính trên trang Tab" }, "showIdentitiesCurrentTabDesc": { - "message": "Liệt kê các mục danh tính trên trang Tab để dễ dàng tự động điền." + "message": "Liệt kê các danh tính trên trang Tab để dễ dàng tự động điền." }, "clickToAutofillOnVault": { - "message": "Click items to autofill on Vault view" + "message": "Nhấp vào mục để tự động điền trong giao diện kho" }, "clickToAutofill": { - "message": "Click items in autofill suggestion to fill" + "message": "Nhấp vào mục trong đề xuất tự động điền để điền thông tin" }, "clearClipboard": { - "message": "Dọn dẹp khay nhớ tạm", + "message": "Dọn dẹp bảng nhớ tạm", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "clearClipboardDesc": { - "message": "Tự động dọn dẹp giá trị được sao chép khỏi khay nhớ tạm của bạn.", + "message": "Tự động xóa mọi thứ đã sao chép khỏi bảng nhớ tạm.", "description": "Clipboard is the operating system thing where you copy/paste data to on your device." }, "notificationAddDesc": { @@ -1063,7 +1066,7 @@ "message": "Lưu" }, "notificationViewAria": { - "message": "View $ITEMNAME$, opens in new window", + "message": "Xem $ITEMNAME$, mở trong cửa sổ mới", "placeholders": { "itemName": { "content": "$1" @@ -1072,18 +1075,18 @@ "description": "Aria label for the view button in notification bar confirmation message" }, "notificationNewItemAria": { - "message": "New Item, opens in new window", + "message": "Mục mới, mở trong cửa sổ mới", "description": "Aria label for the new item button in notification bar confirmation message when error is prompted" }, "notificationEditTooltip": { - "message": "Edit before saving", + "message": "Chỉnh sửa trước khi lưu", "description": "Tooltip and Aria label for edit button on cipher item" }, "newNotification": { - "message": "New notification" + "message": "Thông báo mới" }, "labelWithNotification": { - "message": "$LABEL$: New notification", + "message": "$LABEL$: Thông báo mới", "description": "Label for the notification with a new login suggestion.", "placeholders": { "label": { @@ -1093,15 +1096,15 @@ } }, "notificationLoginSaveConfirmation": { - "message": "saved to Bitwarden.", + "message": "đã lưu vào Bitwarden.", "description": "Shown to user after item is saved." }, "notificationLoginUpdatedConfirmation": { - "message": "updated in Bitwarden.", + "message": "đã cập nhật trong Bitwarden.", "description": "Shown to user after item is updated." }, "selectItemAriaLabel": { - "message": "Select $ITEMTYPE$, $ITEMNAME$", + "message": "Chọn $ITEMTYPE$, $ITEMNAME$", "description": "Used by screen readers. $1 is the item type (like vault or folder), $2 is the selected item name.", "placeholders": { "itemType": { @@ -1113,35 +1116,35 @@ } }, "saveAsNewLoginAction": { - "message": "Save as new login", + "message": "Lưu như đăng nhập mới", "description": "Button text for saving login details as a new entry." }, "updateLoginAction": { - "message": "Update login", + "message": "Cập nhật đăng nhập", "description": "Button text for updating an existing login entry." }, "unlockToSave": { - "message": "Unlock to save this login", + "message": "Mở khóa để lưu thông tin đăng nhập này", "description": "User prompt to take action in order to save the login they just entered." }, "saveLogin": { - "message": "Save login", + "message": "Lưu đăng nhập", "description": "Prompt asking the user if they want to save their login details." }, "updateLogin": { - "message": "Update existing login", + "message": "Cập nhật thông tin đăng nhập hiện có", "description": "Prompt asking the user if they want to update an existing login entry." }, "loginSaveSuccess": { - "message": "Login saved", + "message": "Đã lưu đăng nhập", "description": "Message displayed when login details are successfully saved." }, "loginUpdateSuccess": { - "message": "Login updated", + "message": "Đã cập nhật đăng nhập", "description": "Message displayed when login details are successfully updated." }, "loginUpdateTaskSuccess": { - "message": "Great job! You took the steps to make you and $ORGANIZATION$ more secure.", + "message": "Làm tốt lắm! Bạn đã thực hiện các bước để tăng cường bảo mật cho bản thân và $ORGANIZATION$.", "placeholders": { "organization": { "content": "$1" @@ -1150,7 +1153,7 @@ "description": "Shown to user after login is updated." }, "loginUpdateTaskSuccessAdditional": { - "message": "Thank you for making $ORGANIZATION$ more secure. You have $TASK_COUNT$ more passwords to update.", + "message": "Cảm ơn bạn đã giúp $ORGANIZATION$ an toàn hơn. Bạn còn $TASK_COUNT$ mật khẩu cần cập nhật nữa.", "placeholders": { "organization": { "content": "$1" @@ -1162,17 +1165,23 @@ "description": "Shown to user after login is updated." }, "nextSecurityTaskAction": { - "message": "Change next password", + "message": "Thay đổi mật khẩu tiếp theo", "description": "Message prompting user to undertake completion of another security task." }, "saveFailure": { - "message": "Error saving", + "message": "Lỗi khi lưu", "description": "Error message shown when the system fails to save login details." }, "saveFailureDetails": { - "message": "Oh no! We couldn't save this. Try entering the details manually.", + "message": "Ôi không! Chúng tôi không thể lưu lại được. Hãy thử nhập thông tin thủ công.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "Sau khi thay đổi mật khẩu, bạn cần đăng nhập lại bằng mật khẩu mới. Các phiên đăng nhập đang hoạt động trên các thiết bị khác sẽ bị đăng xuất trong vòng một giờ." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Thay đổi mật khẩu chính của bạn để hoàn tất quá trình khôi phục tài khoản." + }, "enableChangedPasswordNotification": { "message": "Hỏi để cập nhật đăng nhập hiện có" }, @@ -1180,22 +1189,22 @@ "message": "Yêu cầu cập nhật mật khẩu đăng nhập khi phát hiện thay đổi trên trang web." }, "changedPasswordNotificationDescAlt": { - "message": "Đưa ra lựa chọn để cập nhật mật khẩu khi phát hiện có sự thay đổi trên trang web. Áp dụng với mọi tài khoản đăng nhập trên thiết bị." + "message": "Yêu cầu cập nhật mật khẩu đăng nhập khi phát hiện thay đổi trên trang web. Áp dụng cho tất cả tài khoản đã đăng nhập." }, "enableUsePasskeys": { - "message": "Đưa ra lựa chọn để lưu và sử dụng mã khoá" + "message": "Yêu cầu lưu và sử dụng mã khóa" }, "usePasskeysDesc": { - "message": "Đưa ra lựa chọn để lưu mã khoá mới hoặc đăng nhập bằng mã khoá đã lưu trong kho. Áp dụng với mọi tài khoản đăng nhập trên thiết bị." + "message": "Yêu cầu lưu các mã khóa mới hoặc đăng nhập bằng các mã khóa đã lưu trong kho của bạn. Áp dụng cho tất cả các tài khoản đã đăng nhập." }, "notificationChangeDesc": { - "message": "Bạn có muốn cập nhật mật khẩu này trên Bitwarden không?" + "message": "Bạn có muốn cập nhật mật khẩu này trong Bitwarden không?" }, "notificationChangeSave": { "message": "Cập nhật" }, "notificationUnlockDesc": { - "message": "Vui lòng mở khóa Kho Bitwarden của bạn để hoàn thành quá trình tự động điền." + "message": "Mở khóa kho Bitwarden của bạn để hoàn tất quá trình tự động điền." }, "notificationUnlock": { "message": "Mở khóa" @@ -1207,17 +1216,17 @@ "message": "Hiển thị tuỳ chọn menu ngữ cảnh" }, "contextMenuItemDesc": { - "message": "Sử dụng một đúp chuột để truy cập vào việc tạo mật khẩu và thông tin đăng nhập phù hợp cho trang web. " + "message": "Dùng cú nhấp chuột phụ để truy cập trình tạo mật khẩu và đăng nhập tương ứng cho trang web." }, "contextMenuItemDescAlt": { - "message": "Truy cập trình khởi tạo mật khẩu và các mục đăng nhập đã lưu của trang web bằng cách nhấn đúp chuột. Áp dụng với mọi tài khoản đăng nhập trên thiết bị." + "message": "Nhấp chuột phải để truy cập tính năng tạo mật khẩu và xem các thông tin đăng nhập phù hợp cho trang web này. Áp dụng với mọi tài khoản đã đăng nhập." }, "defaultUriMatchDetection": { - "message": "Phương thức kiểm tra URI mặc định", + "message": "Phát hiện khớp URI mặc định", "description": "Default URI match detection for autofill." }, "defaultUriMatchDetectionDesc": { - "message": "Chọn phương thức mặc định để kiểm tra so sánh URI cho các đăng nhập khi xử lí các hành động như là tự động điền." + "message": "Chọn cách hệ thống so khớp đường dẫn để xử lý đăng nhập khi thực hiện các thao tác như tự động điền." }, "theme": { "message": "Chủ đề" @@ -1226,7 +1235,7 @@ "message": "Thay đổi màu sắc ứng dụng." }, "themeDescAlt": { - "message": "Thay đổi tông màu giao diện của ứng dụng. Áp dụng với mọi tài khoản đăng nhập trên thiết bị." + "message": "Thay đổi chủ đề màu sắc của ứng dụng. Áp dụng cho tất cả các tài khoản đã đăng nhập." }, "dark": { "message": "Tối", @@ -1246,7 +1255,7 @@ "message": "Định dạng tập tin" }, "fileEncryptedExportWarningDesc": { - "message": "Tập tin xuất này sẽ được bảo vệ bằng mật khẩu và yêu cầu mật khẩu để giải mã." + "message": "Tệp tin này sẽ được bảo vệ bằng mật khẩu và yêu cầu mật khẩu tệp tin để giải mã." }, "filePassword": { "message": "Mật khẩu tập tin" @@ -1255,13 +1264,13 @@ "message": "Mật khẩu này sẽ được sử dụng để xuất và nhập tập tin này" }, "accountRestrictedOptionDescription": { - "message": "Sử dụng khóa mã hóa tài khoản của bạn, được tạo từ tên người dùng và mật khẩu chính của bạn để mã hóa tệp xuất và giới hạn việc nhập chỉ cho tài khoản Bitwarden hiện tại." + "message": "Sử dụng khóa mã hóa tài khoản của bạn, được tạo từ tên đăng nhập và mật khẩu chính của bạn để mã hóa tệp xuất và giới hạn việc nhập chỉ cho tài khoản Bitwarden hiện tại." }, "passwordProtectedOptionDescription": { "message": "Thiết lập mật khẩu cho tệp để mã hóa dữ liệu xuất và nhập nó vào bất kỳ tài khoản Bitwarden nào bằng cách sử dụng mật khẩu đó để giải mã." }, "exportTypeHeading": { - "message": "Loại xuất" + "message": "Xuất kiểu" }, "accountRestricted": { "message": "Tài khoản bị hạn chế" @@ -1274,7 +1283,7 @@ "description": "WARNING (should stay in capitalized letters if the language permits)" }, "warningCapitalized": { - "message": "Warning", + "message": "Cảnh báo", "description": "Warning (should maintain locale-relevant capitalization)" }, "confirmVaultExport": { @@ -1284,7 +1293,7 @@ "message": "Bản xuất này chứa dữ liệu kho bạn và không được mã hóa. Bạn không nên lưu trữ hay gửi tập tin đã xuất thông qua phương thức rủi ro (như email). Vui lòng xóa nó ngay lập tức khi bạn đã sử dụng xong." }, "encExportKeyWarningDesc": { - "message": "Quá trình xuất này sẽ mã hóa dữ liệu của bạn bằng khóa mã hóa của tài khoản. Nếu bạn từng xoay khóa mã hóa tài khoản của mình, bạn nên xuất lại vì bạn sẽ không thể giải mã tập tin xuất này." + "message": "Quá trình xuất này sẽ mã hóa dữ liệu của bạn bằng khóa mã hóa của tài khoản. Nếu bạn từng thay đổi mã hóa tài khoản của mình, bạn nên xuất lại vì bạn sẽ không thể giải mã tập tin xuất này." }, "encExportAccountWarningDesc": { "message": "Khóa mã hóa tài khoản là duy nhất cho mỗi tài khoản Bitwarden, vì vậy bạn không thể nhập tệp xuất được mã hóa vào một tài khoản khác." @@ -1327,7 +1336,7 @@ "message": "Mã xác thực (TOTP)" }, "copyVerificationCode": { - "message": "Sao chép Mã xác thực" + "message": "Sao chép mã xác thực" }, "attachments": { "message": "Tệp đính kèm" @@ -1348,13 +1357,13 @@ "message": "Không có tệp đính kèm." }, "attachmentSaved": { - "message": "Tệp đính kèm đã được lưu." + "message": "Đã lưu tệp đính kèm" }, "file": { "message": "Tập tin" }, "fileToShare": { - "message": "File to share" + "message": "Tệp để chia sẻ" }, "selectFile": { "message": "Chọn tập tin" @@ -1365,14 +1374,14 @@ "featureUnavailable": { "message": "Tính năng không có sẵn" }, - "encryptionKeyMigrationRequired": { - "message": "Cần di chuyển khóa mã hóa. Vui lòng đăng nhập trang web Bitwaden để cập nhật khóa mã hóa của bạn." + "legacyEncryptionUnsupported": { + "message": "Mã hóa cổ điển không còn được hỗ trợ. Vui lòng liên hệ bộ phận hỗ trợ để khôi phục tài khoản của bạn." }, "premiumMembership": { "message": "Thành viên Cao Cấp" }, "premiumManage": { - "message": "Quản lý Thành viên" + "message": "Quản lý thành viên" }, "premiumManageAlert": { "message": "Bạn có thể quản lí tư cách thành viên của mình trên trang web kho lưu trữ bitwarden.com. Bạn có muốn truy cập trang web ngay bây giờ không?" @@ -1381,22 +1390,22 @@ "message": "Làm mới thành viên" }, "premiumNotCurrentMember": { - "message": "Bạn hiện không phải là một thành viên cao cấp." + "message": "Bạn hiện không phải là thành viên Cao cấp." }, "premiumSignUpAndGet": { - "message": "Đăng ký làm thành viên cao cấp và nhận được:" + "message": "Đăng ký làm thành viên Cao cấp và nhận được:" }, "ppremiumSignUpStorage": { "message": "1GB bộ nhớ lưu trữ được mã hóa cho các tệp đính kèm." }, "premiumSignUpEmergency": { - "message": "Emergency access." + "message": "Truy cập khẩn cấp." }, "premiumSignUpTwoStepOptions": { "message": "Các tùy chọn xác minh hai bước như YubiKey và Duo." }, "ppremiumSignUpReports": { - "message": "Thanh lọc mật khẩu, kiểm tra an toàn tài khoản và các báo cáo rò rĩ dữ liệu là để giữ cho kho của bạn an toàn." + "message": "Thanh lọc mật khẩu, kiểm tra an toàn tài khoản và các báo cáo rò rỉ dữ liệu để bảo vệ kho dữ liệu của bạn." }, "ppremiumSignUpTotp": { "message": "Trình tạo mã xác nhận TOTP (2FA) để đăng nhập vào kho lưu trữ của bạn." @@ -1405,22 +1414,22 @@ "message": "Ưu tiên hỗ trợ khách hàng." }, "ppremiumSignUpFuture": { - "message": "Tất cả các tính năng cao cấp trong tương lai. Nó sẽ sớm xuất hiện!" + "message": "Tất cả các tính năng Cao cấp trong tương lai. Nó sẽ sớm xuất hiện!" }, "premiumPurchase": { "message": "Mua bản Cao Cấp" }, "premiumPurchaseAlertV2": { - "message": "Bạn có thể mua gói Premium từ cài đặt tài khoản trên trang Bitwarden." + "message": "Bạn có thể mua gói Cao cấp từ cài đặt tài khoản trên kho web Bitwarden." }, "premiumCurrentMember": { - "message": "Bạn là một thành viên cao cấp!" + "message": "Bạn là một thành viên Cao cấp!" }, "premiumCurrentMemberThanks": { "message": "Cảm ơn bạn vì đã hỗ trợ Bitwarden." }, "premiumFeatures": { - "message": "Upgrade to Premium and receive:" + "message": "Nâng cấp lên Premium và nhận được:" }, "premiumPrice": { "message": "Tất cả chỉ với $PRICE$/năm!", @@ -1432,7 +1441,7 @@ } }, "premiumPriceV2": { - "message": "Tất cả chỉ với $PRICE$ /năm!", + "message": "Tất cả chỉ với $PRICE$/năm!", "placeholders": { "price": { "content": "$1", @@ -1447,22 +1456,22 @@ "message": "Tự động sao chép TOTP" }, "disableAutoTotpCopyDesc": { - "message": "Nếu đăng nhập của bạn có một khóa xác thực gắn liền với nó, mã xác nhận TOTP sẽ được tự động sao chép vào bộ nhớ tạm của bạn bất cứ khi nào bạn tự động điền thông tin đăng nhập." + "message": "Nếu tài khoản đăng nhập có khóa xác thực, mã xác minh TOTP sẽ được sao chép vào bộ nhớ tạm khi bạn tự động điền thông tin đăng nhập." }, "enableAutoBiometricsPrompt": { "message": "Yêu cầu sinh trắc học khi khởi chạy" }, "premiumRequired": { - "message": "Cần có tài khoản cao cấp" + "message": "Cần có tài khoản Cao cấp" }, "premiumRequiredDesc": { - "message": "Cần là thành viên cao cấp để sử dụng tính năng này." + "message": "Cần là thành viên Cao cấp để sử dụng tính năng này." }, "authenticationTimeout": { - "message": "Authentication timeout" + "message": "Thời gian chờ xác thực" }, "authenticationSessionTimedOut": { - "message": "The authentication session timed out. Please restart the login process." + "message": "Phiên xác thực đã hết thời gian chờ. Vui lòng đăng nhập lại từ đầu." }, "verificationCodeEmailSent": { "message": "Email xác minh đã được gửi tới $EMAIL$.", @@ -1474,53 +1483,53 @@ } }, "dontAskAgainOnThisDeviceFor30Days": { - "message": "Don't ask again on this device for 30 days" + "message": "Không yêu cầu lại trên thiết bị này trong vòng 30 ngày" }, "selectAnotherMethod": { - "message": "Select another method", + "message": "Chọn phương pháp khác", "description": "Select another two-step login method" }, "useYourRecoveryCode": { - "message": "Use your recovery code" + "message": "Sử dụng mã khôi phục của bạn" }, "insertU2f": { "message": "Lắp khóa bảo mật vào cổng USB máy tính của bạn. Nếu nó có một nút, hãy nhấn vào nó." }, "openInNewTab": { - "message": "Open in new tab" + "message": "Mở trong tab mới" }, "webAuthnAuthenticate": { "message": "Xác thực WebAuthn" }, "readSecurityKey": { - "message": "Read security key" + "message": "Đọc khóa bảo mật" }, "awaitingSecurityKeyInteraction": { - "message": "Awaiting security key interaction..." + "message": "Đang chờ tương tác với khóa bảo mật..." }, "loginUnavailable": { "message": "Đăng nhập không có sẵn" }, "noTwoStepProviders": { - "message": "Tài khoản này đã kích hoạt xác thực hai lớp, tuy nhiên, trình duyệt này không hỗ trợ cấu hình dịch vụ xác thực hai lớp đang sử dụng." + "message": "Tài khoản này đã kích hoạt đăng nhập 2 bước, tuy nhiên, trình duyệt này không hỗ trợ dịch vụ xác thực hai lớp đang sử dụng." }, "noTwoStepProviders2": { "message": "Hãy sử dụng trình duyệt web được hỗ trợ (chẳng hạn như Chrome) và/hoặc thêm dịch vụ bổ sung được hỗ trợ tốt hơn trên các trình duyệt web (chẳng hạn như một ứng dụng xác thực)." }, "twoStepOptions": { - "message": "Tùy chọn xác thực hai lớp" + "message": "Tùy chọn đăng nhập 2 bước" }, "selectTwoStepLoginMethod": { - "message": "Select two-step login method" + "message": "Chọn phương pháp đăng nhập hai bước" }, "recoveryCodeDesc": { - "message": "Bạn mất quyền truy cập vào tất cả các dịch vụ xác thực 2 lớp? Sử dụng mã phục hồi của bạn để vô hiệu hóa tất cả các dịch vụ xác thực hai lớp trong tài khoản của bạn." + "message": "Bạn đã mất quyền truy cập vào tất cả các dịch vụ xác thực 2 lớp? Sử dụng mã khôi phục để tắt tất cả các phương pháp xác thực hai lớp trong tài khoản của bạn." }, "recoveryCodeTitle": { - "message": "Mã phục hồi" + "message": "Mã khôi phục" }, "authenticatorAppTitle": { - "message": "Ứng dụng Authenticator" + "message": "Ứng dụng xác thực" }, "authenticatorAppDescV2": { "message": "Nhập mã được tạo bởi ứng dụng xác thực như Bitwarden Authenticator.", @@ -1537,7 +1546,7 @@ "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "duoOrganizationDesc": { - "message": "Xác minh với Duo Security cho tổ chức của bạn sử dụng ứng dụng Duo Mobile, SMS, cuộc gọi điện thoại, hoặc khoá bảo mật U2F.", + "message": "Xác minh với Duo Security cho tổ chức của bạn bằng ứng dụng Duo Mobile, tin nhắn SMS, cuộc gọi điện thoại hoặc khóa bảo mật U2F.", "description": "'Duo Security' and 'Duo Mobile' are product names and should not be translated." }, "webAuthnTitle": { @@ -1556,13 +1565,13 @@ "message": "Môi trường tự lưu trữ" }, "selfHostedBaseUrlHint": { - "message": "Nhập địa chỉ cơ sở của bản cài đặt Bitwarden được lưu trữ tại máy chủ của bạn. Ví dụ: https://bitwarden.company.com" + "message": "Nhập URL cơ sở của cài đặt Bitwarden được lưu trữ trên máy chủ nội bộ của bạn. Ví dụ: https://bitwarden.company.com" }, "selfHostedCustomEnvHeader": { "message": "Đối với cấu hình nâng cao. Bạn có thể chỉ định địa chỉ cơ sở của mỗi dịch vụ một cách độc lập." }, "selfHostedEnvFormInvalid": { - "message": "Bạn phải thêm địa chỉ máy chủ cơ sở hoặc ít nhất một môi trường tùy chỉnh." + "message": "Bạn phải thêm URL máy chủ cơ sở hoặc ít nhất một môi trường tùy chỉnh." }, "customEnvironment": { "message": "Môi trường tùy chỉnh" @@ -1571,11 +1580,11 @@ "message": "URL máy chủ" }, "selfHostBaseUrl": { - "message": "Self-host server URL", + "message": "URL máy chủ tự lưu trữ", "description": "Label for field requesting a self-hosted integration service URL" }, "apiUrl": { - "message": "Địa chỉ API máy chủ" + "message": "Địa chỉ máy chủ API" }, "webVaultUrl": { "message": "URL máy chủ của trang web kho lưu trữ" @@ -1584,29 +1593,29 @@ "message": "URL máy chủ nhận dạng" }, "notificationsUrl": { - "message": "Notifications Server URL" + "message": "URL máy chủ thông báo" }, "iconsUrl": { - "message": "Biểu tượng địa chỉ máy chủ" + "message": "URL máy chủ biểu tượng" }, "environmentSaved": { - "message": "Địa chỉ môi trường đã được lưu." + "message": "Các URL môi trường đã được lưu" }, "showAutoFillMenuOnFormFields": { "message": "Hiển thị menu tự động điền trên các trường biểu mẫu", "description": "Represents the message for allowing the user to enable the autofill overlay" }, "autofillSuggestionsSectionTitle": { - "message": "Các gợi ý điền tự động" + "message": "Các gợi ý tự động điền" }, "autofillSpotlightTitle": { - "message": "Easily find autofill suggestions" + "message": "Dễ dàng tìm các gợi ý tự động điền" }, "autofillSpotlightDesc": { - "message": "Turn off your browser's autofill settings, so they don't conflict with Bitwarden." + "message": "Tắt cài đặt tự động điền của trình duyệt để tránh xung đột với Bitwarden." }, "turnOffBrowserAutofill": { - "message": "Turn off $BROWSER$ autofill", + "message": "Tắt tính năng tự động điền của $BROWSER$", "placeholders": { "browser": { "content": "$1", @@ -1615,16 +1624,16 @@ } }, "turnOffAutofill": { - "message": "Turn off autofill" + "message": "Tắt tự động điền" }, "showInlineMenuLabel": { "message": "Hiển thị các gợi ý tự động điền trên các trường biểu mẫu" }, "showInlineMenuIdentitiesLabel": { - "message": "Display identities as suggestions" + "message": "Hiển thị danh tính dưới dạng gợi ý" }, "showInlineMenuCardsLabel": { - "message": "Display cards as suggestions" + "message": "Hiển thị thẻ dưới dạng gợi ý" }, "showInlineMenuOnIconSelectionLabel": { "message": "Hiện gợi ý khi nhấp vào biểu tượng" @@ -1687,22 +1696,22 @@ "message": "Không tự động điền khi tải trang" }, "commandOpenPopup": { - "message": "Mở popup kho" + "message": "Mở cửa sổ popup kho" }, "commandOpenSidebar": { - "message": "Mở kho ở thanh bên" + "message": "Mở kho trong thanh bên" }, "commandAutofillLoginDesc": { - "message": "Autofill the last used login for the current website" + "message": "Tự động điền thông tin đăng nhập gần đây nhất cho trang web hiện tại" }, "commandAutofillCardDesc": { - "message": "Autofill the last used card for the current website" + "message": "Tự động điền thẻ đã sử dụng gần đây cho trang web hiện tại" }, "commandAutofillIdentityDesc": { - "message": "Autofill the last used identity for the current website" + "message": "Điền tự động danh tính đã sử dụng lần cuối cho trang web hiện tại" }, "commandGeneratePasswordDesc": { - "message": "Tạo và sao chép một mật khẩu ngẫu nhiên mới vào khay nhớ tạm" + "message": "Tạo và sao chép một mật khẩu ngẫu nhiên mới vào bảng nhớ tạm" }, "commandLockVaultDesc": { "message": "Khoá kho" @@ -1723,19 +1732,19 @@ "message": "Kéo để sắp xếp" }, "dragToReorder": { - "message": "Drag to reorder" + "message": "Kéo để sắp xếp lại" }, "cfTypeText": { "message": "Văn bản" }, "cfTypeHidden": { - "message": "Đã ẩn đi" + "message": "Bí ẩn" }, "cfTypeBoolean": { "message": "Đúng/Sai" }, "cfTypeCheckbox": { - "message": "Ô tích chọn" + "message": "Hộp chọn" }, "cfTypeLinked": { "message": "Đã liên kết", @@ -1823,6 +1832,9 @@ "securityCode": { "message": "Mã bảo mật" }, + "cardNumber": { + "message": "số thẻ" + }, "ex": { "message": "Ví dụ:" }, @@ -1836,10 +1848,10 @@ "message": "Bà" }, "ms": { - "message": "Chị" + "message": "Cô" }, "dr": { - "message": "Bác sĩ" + "message": "Tiến sĩ/Bác sĩ" }, "mx": { "message": "Mx" @@ -1869,7 +1881,7 @@ "message": "Số hộ chiếu" }, "licenseNumber": { - "message": "Số giấy phép" + "message": "Số giấy phép lái xe" }, "email": { "message": "Email" @@ -1890,10 +1902,10 @@ "message": "Địa chỉ 3" }, "cityTown": { - "message": "Quận/Huyện/Thị trấn" + "message": "Xã / Phường" }, "stateProvince": { - "message": "Tỉnh/Thành Phố" + "message": "Tỉnh / Thành Phố" }, "zipPostalCode": { "message": "Mã bưu chính" @@ -1920,7 +1932,10 @@ "message": "Danh tính" }, "typeSshKey": { - "message": "SSH key" + "message": "Khóa SSH" + }, + "typeNote": { + "message": "Ghi chú" }, "newItemHeader": { "message": "$TYPE$ mới", @@ -1953,13 +1968,13 @@ "message": "Lịch sử mật khẩu" }, "generatorHistory": { - "message": "Generator history" + "message": "Lịch sử trình tạo" }, "clearGeneratorHistoryTitle": { - "message": "Clear generator history" + "message": "Dọn dẹp lịch sử trình tạo" }, "cleargGeneratorHistoryDescription": { - "message": "If you continue, all entries will be permanently deleted from generator's history. Are you sure you want to continue?" + "message": "Nếu bạn tiếp tục, tất cả các mục sẽ bị xóa vĩnh viễn khỏi lịch sử của trình tạo. Bạn có chắc chắn muốn tiếp tục không?" }, "back": { "message": "Quay lại" @@ -1998,7 +2013,7 @@ "message": "Ghi chú bảo mật" }, "sshKeys": { - "message": "SSH Keys" + "message": "Khóa SSH" }, "clear": { "message": "Xoá", @@ -2017,14 +2032,14 @@ } }, "passwordSafe": { - "message": "Mật khẩu này không được tìm thấy trong bất kỳ báo cáo lộ lọt dữ liệu nào được biết đến. Bạn có thể tiếp tục sử dụng nó." + "message": "Không tìm thấy mật khẩu này trong các vụ rò rỉ dữ liệu trước đây. Nó an toàn để sử dụng." }, "baseDomain": { "message": "Tên miền cơ sở", "description": "Domain name. Ex. website.com" }, "baseDomainOptionRecommended": { - "message": "Base domain (recommended)", + "message": "Tên miền gốc (được khuyến nghị)", "description": "Domain name. Ex. website.com" }, "domainName": { @@ -2057,11 +2072,11 @@ "message": "Bật/tắt tùy chọn" }, "toggleCurrentUris": { - "message": "Bật/tắt URI hiện tại", + "message": "Bật/tắt đường dẫn hiện tại", "description": "Toggle the display of the URIs of the currently open tabs in the browser." }, "currentUri": { - "message": "URI hiện tại", + "message": "Đường dẫn hiện tại", "description": "The URI of one of the current open tabs in the browser." }, "organization": { @@ -2081,10 +2096,10 @@ "message": "Xóa lịch sử" }, "nothingToShow": { - "message": "Nothing to show" + "message": "Không có gì để hiển thị" }, "nothingGeneratedRecently": { - "message": "You haven't generated anything recently" + "message": "Bạn chưa tạo gì gần đây" }, "remove": { "message": "Xoá" @@ -2097,21 +2112,21 @@ "description": "ex. Date this item was updated" }, "dateCreated": { - "message": "Ngày tạo", + "message": "Tạo lúc", "description": "ex. Date this item was created" }, "datePasswordUpdated": { - "message": "Đã cập nhật mật khẩu", + "message": "Mật khẩu được cập nhật lần cuối", "description": "ex. Date this password was updated" }, "neverLockWarning": { "message": "Bạn có chắc chắn muốn chọn \"Không bao giờ\" không? Lựa chọn này sẽ lưu khóa mã hóa kho của bạn trực tiếp trên thiết bị. Hãy nhớ bảo vệ thiết bị của bạn thật cẩn thận nếu bạn chọn tùy chọn này." }, "noOrganizationsList": { - "message": "You do not belong to any organizations. Organizations allow you to securely share items with other users." + "message": "Bạn chưa thuộc tổ chức nào. Tổ chức sẽ cho phép bạn chia sẻ các mục với người dùng khác một cách bảo mật." }, "noCollectionsInList": { - "message": "Không có bộ sưu tập nào để liệt kê." + "message": "Không có bộ sưu tập nào." }, "ownership": { "message": "Quyền sở hữu" @@ -2135,7 +2150,7 @@ "message": "Mật khẩu chính yếu" }, "weakMasterPasswordDesc": { - "message": "Mật khẩu chính bạn vừa chọn có vẻ yếu. Bạn nên chọn mật khẩu chính (hoặc cụm từ mật khẩu) mạnh để bảo vệ đúng cách tài khoản Bitwarden của bạn. Bạn có thực sự muốn dùng mật khẩu chính này?" + "message": "Mật khẩu chính bạn vừa chọn hơi yếu. Bạn nên chọn mật khẩu chính mạnh(hoặc một cụm mật khẩu) để bảo vệ tài khoản Bitwarden của mình một cách an toàn. Bạn có thực sự muốn dùng mật khẩu chính này không?" }, "pin": { "message": "Mã PIN", @@ -2145,34 +2160,34 @@ "message": "Mở khóa bằng mã PIN" }, "setYourPinTitle": { - "message": "Set PIN" + "message": "Thiết lập mã PIN" }, "setYourPinButton": { - "message": "Set PIN" + "message": "Thiết lập mã PIN" }, "setYourPinCode": { - "message": "Đặt mã PIN của bạn để mở khóa Bitwarden. Cài đặt mã PIN của bạn sẽ bị xóa nếu bạn hoàn toàn đăng xuất khỏi ứng dụng." + "message": "Đặt mã PIN của bạn để mở khóa Bitwarden. Cài đặt mã PIN của bạn sẽ bị xóa nếu bạn đăng xuất hoàn toàn khỏi ứng dụng." }, - "setYourPinCode1": { - "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + "setPinCode": { + "message": "Bạn có thể sử dụng mã PIN này để mở khóa Bitwarden. Mã PIN của bạn sẽ được đặt lại nếu bạn đăng xuất hoàn toàn khỏi ứng dụng." }, "pinRequired": { "message": "Mã PIN là bắt buộc." }, "invalidPin": { - "message": "Mã PIN không hợp lệ." + "message": "Mã PIN không chính xác." }, "tooManyInvalidPinEntryAttemptsLoggingOut": { - "message": "Mã PIN bị gõ sai quá nhiều lần. Đang đăng xuất." + "message": "Gõ sai mã PIN quá nhiều lần. Đang đăng xuất." }, "unlockWithBiometrics": { "message": "Mở khóa bằng sinh trắc học" }, "unlockWithMasterPassword": { - "message": "Unlock with master password" + "message": "Mở khóa bằng mật khẩu chính" }, "awaitDesktop": { - "message": "Đợi xác nhận từ máy tính" + "message": "Đang chờ xác nhận từ máy tính" }, "awaitDesktopDesc": { "message": "Vui lòng xác nhận sử dụng sinh trắc học với ứng dụng Bitwarden trên máy tính." @@ -2181,7 +2196,7 @@ "message": "Khóa với mật khẩu chính khi trình duyệt khởi động lại" }, "lockWithMasterPassOnRestart1": { - "message": "Require master password on browser restart" + "message": "Yêu cầu nhập mật khẩu chính khi khởi động lại trình duyệt" }, "selectOneCollection": { "message": "Bạn phải chọn ít nhất một bộ sưu tập." @@ -2196,39 +2211,39 @@ "message": "Trình tạo mật khẩu" }, "usernameGenerator": { - "message": "Bộ tạo tên người dùng" + "message": "Trình tạo tên đăng nhập" }, "useThisEmail": { - "message": "Use this email" + "message": "Dùng email này" }, "useThisPassword": { - "message": "Use this password" + "message": "Dùng mật khẩu này" }, "useThisPassphrase": { - "message": "Use this passphrase" + "message": "Dùng cụm mật khẩu này" }, "useThisUsername": { - "message": "Use this username" + "message": "Dùng tên đăng nhập này" }, "securePasswordGenerated": { - "message": "Secure password generated! Don't forget to also update your password on the website." + "message": "Mật khẩu an toàn đã được tạo! Đừng quên cập nhật mật khẩu của bạn trên trang web." }, "useGeneratorHelpTextPartOne": { - "message": "Use the generator", + "message": "Sử dụng trình tạo", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "useGeneratorHelpTextPartTwo": { - "message": "to create a strong unique password", + "message": "để tạo một mật khẩu mạnh và duy nhất", "description": "This will be used as part of a larger sentence, broken up to include the generator icon. The full sentence will read 'Use the generator [GENERATOR_ICON] to create a strong unique password'" }, "vaultCustomization": { - "message": "Vault customization" + "message": "Tùy chỉnh kho" }, "vaultTimeoutAction": { - "message": "Hành động khi hết thời gian chờ của kho lưu trữ" + "message": "Hành động sau khi đóng kho" }, "vaultTimeoutAction1": { - "message": "Timeout action" + "message": "Hành động sau khi đóng kho" }, "lock": { "message": "Khóa", @@ -2239,7 +2254,7 @@ "description": "Noun: a special folder to hold deleted items" }, "searchTrash": { - "message": "Tìm kiếm thùng rác" + "message": "Tìm kiếm trong thùng rác" }, "permanentlyDeleteItem": { "message": "Xoá vĩnh viễn mục" @@ -2260,34 +2275,34 @@ "message": "Bạn đã có tài khoản?" }, "vaultTimeoutLogOutConfirmation": { - "message": "Đăng xuất sẽ xóa tất cả quyền truy cập vào kho của bạn và yêu cầu xác minh trực tuyến sau khi hết thời gian chờ. Bạn có chắc chắn muốn sử dụng cài đặt này không?" + "message": "Đăng xuất sẽ xóa toàn bộ quyền truy cập vào kho của bạn và yêu cầu xác minh lại sau khi đóng kho. Bạn có chắc chắn muốn sử dụng cài đặt này không?" }, "vaultTimeoutLogOutConfirmationTitle": { - "message": "Xác nhận hành động khi hết thời gian chờ" + "message": "Xác nhận hành động sau khi đóng kho" }, "autoFillAndSave": { - "message": "Tự động điền và Lưu" + "message": "Tự động điền và lưu" }, "fillAndSave": { "message": "Điền và lưu" }, "autoFillSuccessAndSavedUri": { - "message": "Đã tự động điền mục và lưu URI" + "message": "Đã tự động điền mục và lưu đường dẫn" }, "autoFillSuccess": { "message": "Đã tự động điền mục " }, "insecurePageWarning": { - "message": "Cảnh báo: Đây là một trang HTTP không an toàn, và mọi thông tin bạn nhập ở đây có khả năng được xem & thay đổi bởi người khác. Thông tin Đăng nhập này ban đầu được lưu ở một trang an toàn (HTTPS)." + "message": "Cảnh báo: Đây là một trang HTTP không an toàn, và mọi thông tin bạn nhập ở đây có thể bị người khác xem và thay đổi. Thông tin Đăng nhập này ban đầu được lưu ở một trang an toàn (HTTPS)." }, "insecurePageWarningFillPrompt": { "message": "Bạn vẫn muốn điền thông tin đăng nhập?" }, "autofillIframeWarning": { - "message": "Mẫu điền thông tin này được lưu tại một tên miền khác với URI lưu tại thông tin đăng nhập của bạn. Hãy chọn OK để tiếp tục tự động điền, hoặc Hủy bỏ để dừng lại." + "message": "Biểu mẫu này được lưu trữ trên một tên miền khác với đường dẫn của thông tin đăng nhập đã lưu của bạn. Chọn OK để tự động điền thông tin, hoặc Hủy bỏ để hủy." }, "autofillIframeWarningTip": { - "message": "Để chặn cảnh báo này trong tương lai, hãy lưu URI này, $HOSTNAME$, vào thông tin đăng nhập của bạn cho trang này ở Kho Bitwarden.", + "message": "Để tránh cảnh báo này trong tương lai, hãy lưu đường dẫn này, $HOSTNAME$, vào mục đăng nhập Bitwarden cho trang web này.", "placeholders": { "hostname": { "content": "$1", @@ -2329,16 +2344,16 @@ } }, "policyInEffectUppercase": { - "message": "Chứa chữ cái in hoa" + "message": "Có chứa một hay nhiều ký tự viết hoa" }, "policyInEffectLowercase": { - "message": "Chứa một hoặc nhiều kí tự viết thường" + "message": "Có chứa một hay nhiều ký tự thường" }, "policyInEffectNumbers": { - "message": "Chứa một hoặc nhiều chữ số" + "message": "Có chứa một hay nhiều chữ số" }, "policyInEffectSpecial": { - "message": "Chứa ký tự đặc biệt $CHARS$", + "message": "Có chứa một hay nhiều ký tự đặc biệt sau $CHARS$", "placeholders": { "chars": { "content": "$1", @@ -2359,7 +2374,7 @@ "message": "bất cứ lúc nào." }, "byContinuingYouAgreeToThe": { - "message": "Nếu tiếp tục, bạn đồng ý" + "message": "Bằng cách tiếp tục, bạn đồng ý với" }, "and": { "message": "và" @@ -2368,25 +2383,25 @@ "message": "Bạn đồng ý với những điều sau khi nhấn chọn ô này:" }, "acceptPoliciesRequired": { - "message": "Điều khoản sử dụng và Chính sách quyền riêng tư chưa được đồng ý." + "message": "Bạn chưa đồng ý với Điều khoản Dịch vụ và Chính sách Bảo mật." }, "termsOfService": { - "message": "Điều khoản sử dụng" + "message": "Điều khoản dịch vụ" }, "privacyPolicy": { - "message": "Chính sách quyền riêng tư" + "message": "Chính sách bảo mật" }, "yourNewPasswordCannotBeTheSameAsYourCurrentPassword": { - "message": "Your new password cannot be the same as your current password." + "message": "Mật khẩu mới của bạn không thể giống với mật khẩu cũ." }, "hintEqualsPassword": { - "message": "Lời nhắc mật khẩu không được giống mật khẩu của bạn" + "message": "Gợi ý mật khẩu không được trùng với mật khẩu của bạn." }, "ok": { "message": "Ok" }, "errorRefreshingAccessToken": { - "message": "Lỗi làm mới khoá truy cập" + "message": "Lỗi cập nhật token truy cập" }, "errorRefreshingAccessTokenDesc": { "message": "Bạn có thể đã bị đăng xuất. Vui lòng đăng xuất và đăng nhập lại." @@ -2395,43 +2410,43 @@ "message": "Xác minh đồng bộ máy tính" }, "desktopIntegrationVerificationText": { - "message": "Vui lòng xác minh ứng dụng trên máy tính hiển thị cụm vân tay này: " + "message": "Vui lòng xác minh ứng dụng trên máy tính hiển thị cụm từ xác thực này: " }, "desktopIntegrationDisabledTitle": { - "message": "Tích hợp trình duyệt chưa được kích hoạt" + "message": "Tích hợp trình duyệt chưa được thiết lập" }, "desktopIntegrationDisabledDesc": { - "message": "Tích hợp trình duyệt không được thiết lập trong ứng dụng máy tính để bàn Bitwarden. Vui lòng thiết lập nó trong cài đặt trong ứng dụng máy tính để bàn." + "message": "Tính năng tích hợp trình duyệt chưa được thiết lập trong ứng dụng Bitwarden trên máy tính. Vui lòng thiết lập tính năng này trong phần cài đặt của ứng dụng trên máy tính." }, "startDesktopTitle": { "message": "Mở ứng dụng Bitwarden trên máy tính" }, "startDesktopDesc": { - "message": "Ứng dụng máy tính để bàn Bitwarden cần được khởi động trước khi có thể sử dụng tính năng mở khóa bằng sinh trắc học." + "message": "Ứng dụng Bitwarden trên máy tính cần được khởi động trước khi có thể sử dụng tính năng mở khóa bằng sinh trắc học." }, "errorEnableBiometricTitle": { - "message": "Không thể bật nhận dạng sinh trắc học" + "message": "Không thể thiết lập nhận dạng sinh trắc học" }, "errorEnableBiometricDesc": { - "message": "Hành động đã bị hủy bởi ứng dụng máy tính để bàn" + "message": "Hành động đã bị hủy bởi ứng dụng trên máy tính" }, "nativeMessagingInvalidEncryptionDesc": { - "message": "Ứng dụng máy tính để bàn đã vô hiệu hóa kênh liên lạc an toàn. Vui lòng thử lại thao tác này" + "message": "Ứng dụng trên máy tính đã vô hiệu hóa kênh liên lạc an toàn. Vui lòng thử lại thao tác này" }, "nativeMessagingInvalidEncryptionTitle": { - "message": "Giao tiếp máy tính để bàn bị gián đoạn" + "message": "Giao tiếp với ứng dụng trên máy tính bị gián đoạn" }, "nativeMessagingWrongUserDesc": { - "message": "Ứng dụng máy tính để bàn được đăng nhập vào một tài khoản khác. Hãy đảm bảo cả hai ứng dụng được đăng nhập vào cùng một tài khoản." + "message": "Ứng dụng trên máy tính đang đăng nhập vào một tài khoản khác. Hãy đảm bảo cả hai ứng dụng được đăng nhập vào cùng một tài khoản." }, "nativeMessagingWrongUserTitle": { - "message": "Tài khoản không đúng" + "message": "Không khớp tài khoản" }, "nativeMessagingWrongUserKeyTitle": { - "message": "Biometric key missmatch" + "message": "Khóa sinh trắc học không khớp" }, "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + "message": "Mở khóa bằng sinh trắc học thất bại. Khóa sinh trắc học không thể mở khóa kho. Vui lòng thử thiết lập lại sinh trắc học." }, "biometricsNotEnabledTitle": { "message": "Sinh trắc học chưa được cài đặt" @@ -2452,31 +2467,31 @@ "message": "Vui lòng mở khóa người dùng này trong ứng dụng máy tính và thử lại." }, "biometricsNotAvailableTitle": { - "message": "Biometric unlock unavailable" + "message": "Mở khóa bằng sinh trắc học không khả dụng" }, "biometricsNotAvailableDesc": { - "message": "Biometric unlock is currently unavailable. Please try again later." + "message": "Mở khóa bằng sinh trắc học hiện không khả dụng. Vui lòng thử lại sau." }, "biometricsFailedTitle": { - "message": "Sinh trắc học không thành công" + "message": "Xác thực sinh trắc học thất bại" }, "biometricsFailedDesc": { - "message": "Không thể hoàn thành sinh trắc học, hãy cân nhắc sử dụng mật khẩu chính hoặc đăng xuất. Nếu sự cố vẫn tiếp diễn, vui lòng liên hệ bộ phận hỗ trợ của Bitwarden." + "message": "Không thể xác thực sinh trắc học, hãy cân nhắc sử dụng mật khẩu chính hoặc đăng xuất. Nếu sự cố vẫn tiếp diễn, vui lòng liên hệ bộ phận hỗ trợ của Bitwarden." }, "nativeMessaginPermissionErrorTitle": { - "message": "Quyền chưa được cấp" + "message": "Chưa được cấp quyền" }, "nativeMessaginPermissionErrorDesc": { - "message": "Nếu không được phép giao tiếp với Ứng dụng máy tính để bàn Bitwarden, chúng tôi không thể cung cấp sinh trắc học trong tiện ích mở rộng trình duyệt. Vui lòng thử lại." + "message": "Nếu không được phép giao tiếp với Ứng dụng Bitwarden trên máy tính, chúng tôi không thể cung cấp tính năng sinh trắc học trong tiện ích mở rộng trình duyệt. Vui lòng thử lại." }, "nativeMessaginPermissionSidebarTitle": { - "message": "Lỗi yêu cầu quyền" + "message": "Lỗi yêu cầu quyền truy cập" }, "nativeMessaginPermissionSidebarDesc": { "message": "Không thể thực hiện hành động này trong thanh bên, vui lòng thử lại hành động trong cửa sổ bật lên hoặc cửa sổ bật ra." }, "personalOwnershipSubmitError": { - "message": "Do Chính sách doanh nghiệp, bạn bị hạn chế lưu các mục vào kho tiền cá nhân của mình. Thay đổi tùy chọn Quyền sở hữu thành một tổ chức và chọn từ các bộ sưu tập có sẵn." + "message": "Do chính sách của doanh nghiệp, bạn không thể lưu trữ các mục vào kho cá nhân của mình. Hãy thay đổi tùy chọn Quyền sở hữu thành tổ chức và chọn từ các bộ sưu tập có sẵn." }, "personalOwnershipPolicyInEffect": { "message": "Chính sách của tổ chức đang ảnh hưởng đến các tùy chọn quyền sở hữu của bạn." @@ -2484,15 +2499,21 @@ "personalOwnershipPolicyInEffectImports": { "message": "Chính sách của tổ chức đã chặn việc nhập các mục vào kho cá nhân của bạn." }, + "restrictCardTypeImport": { + "message": "Không thể nhập mục thẻ" + }, + "restrictCardTypeImportDesc": { + "message": "Một chính sách được thiết lập bởi 1 hoặc nhiều tổ chức ngăn bạn nhập thẻ vào kho của mình." + }, "domainsTitle": { "message": "Các tên miền", "description": "A category title describing the concept of web domains" }, "blockedDomains": { - "message": "Blocked domains" + "message": "Tên miền đã chặn" }, "learnMoreAboutBlockedDomains": { - "message": "Learn more about blocked domains" + "message": "Tìm hiểu thêm về các tên miền bị chặn" }, "excludedDomains": { "message": "Tên miền đã loại trừ" @@ -2501,22 +2522,26 @@ "message": "Bitwarden sẽ không yêu cầu lưu thông tin đăng nhập cho các miền này. Bạn phải làm mới trang để các thay đổi có hiệu lực." }, "excludedDomainsDescAlt": { - "message": "Bitwarden sẽ không yêu cầu lưu thông tin đăng nhập cho các miền này. Bạn phải làm mới trang để các thay đổi có hiệu lực." + "message": "Bitwarden sẽ không yêu cầu lưu thông tin đăng nhập cho các tên miền này đối với tất cả tài khoản đã đăng nhập. Bạn phải làm mới trang để các thay đổi có hiệu lực." }, "blockedDomainsDesc": { - "message": "Autofill and other related features will not be offered for these websites. You must refresh the page for changes to take effect." + "message": "Tự động điền và các tính năng liên quan khác sẽ không được cung cấp cho các trang web này. Bạn phải làm mới trang để các thay đổi có hiệu lực." }, "autofillBlockedNoticeV2": { - "message": "Autofill is blocked for this website." + "message": "Tự động điền bị chặn cho trang web này." }, "autofillBlockedNoticeGuidance": { - "message": "Change this in settings" + "message": "Thay đổi điều này trong cài đặt" }, "change": { - "message": "Change" + "message": "Thay đổi" + }, + "changePassword": { + "message": "Thay đổi mật khẩu", + "description": "Change password button for browser at risk notification on login." }, "changeButtonTitle": { - "message": "Change password - $ITEMNAME$", + "message": "Thay đổi mật khẩu - $ITEMNAME$", "placeholders": { "itemname": { "content": "$1", @@ -2524,11 +2549,14 @@ } } }, + "atRiskPassword": { + "message": "Mật khẩu có rủi ro cao" + }, "atRiskPasswords": { - "message": "At-risk passwords" + "message": "Mật khẩu có rủi ro cao" }, "atRiskPasswordDescSingleOrg": { - "message": "$ORGANIZATION$ is requesting you change one password because it is at-risk.", + "message": "$ORGANIZATION$ yêu cầu bạn thay đổi mật khẩu vì mật khẩu hiện tại đang gặp rủi ro.", "placeholders": { "organization": { "content": "$1", @@ -2537,7 +2565,7 @@ } }, "atRiskPasswordsDescSingleOrgPlural": { - "message": "$ORGANIZATION$ is requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "$ORGANIZATION$ yêu cầu bạn thay đổi $COUNT$ mật khẩu vì chúng đang có rủi ro.", "placeholders": { "organization": { "content": "$1", @@ -2550,7 +2578,7 @@ } }, "atRiskPasswordsDescMultiOrgPlural": { - "message": "Your organizations are requesting you change the $COUNT$ passwords because they are at-risk.", + "message": "Các tổ chức của bạn đang yêu cầu bạn thay đổi $COUNT$ mật khẩu vì chúng đang có rủi ro.", "placeholders": { "count": { "content": "$1", @@ -2558,11 +2586,31 @@ } } }, + "atRiskChangePrompt": { + "message": "Mật khẩu của bạn cho trang web này đang gặp rủi ro. $ORGANIZATION$ đã yêu cầu bạn thay đổi mật khẩu.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ yêu cầu bạn thay đổi mật khẩu này vì nó đang gặp rủi ro. Vui lòng truy cập vào cài đặt tài khoản của bạn để thay đổi mật khẩu.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { - "message": "Review and change one at-risk password" + "message": "Kiểm tra và thay đổi một mật khẩu có rủi ro cao" }, "reviewAndChangeAtRiskPasswordsPlural": { - "message": "Review and change $COUNT$ at-risk passwords", + "message": "Kiểm tra và thay đổi $COUNT$ mật khẩu có rủi ro cao", "placeholders": { "count": { "content": "$1", @@ -2571,52 +2619,52 @@ } }, "changeAtRiskPasswordsFaster": { - "message": "Change at-risk passwords faster" + "message": "Thay đổi mật khẩu có rủi ro bị lộ nhanh hơn" }, "changeAtRiskPasswordsFasterDesc": { - "message": "Update your settings so you can quickly autofill your passwords and generate new ones" + "message": "Cập nhật cài đặt của bạn để bạn có thể tự động điền và tạo mật khẩu mới nhanh chóng" }, "reviewAtRiskLogins": { - "message": "Review at-risk logins" + "message": "Xem lại các lần đăng nhập có nguy cơ cao" }, "reviewAtRiskPasswords": { - "message": "Review at-risk passwords" + "message": "Xem lại các mật khẩu có rủi ro cao" }, "reviewAtRiskLoginsSlideDesc": { - "message": "Your organization passwords are at-risk because they are weak, reused, and/or exposed.", + "message": "Mật khẩu của tổ chức bạn đang gặp rủi ro vì độ mạnh yếu, được sử dụng lại và/hoặc bị lộ.", "description": "Description of the review at-risk login slide on the at-risk password page carousel" }, "reviewAtRiskLoginSlideImgAltPeriod": { - "message": "Illustration of a list of logins that are at-risk." + "message": "Minh họa danh sách các tài khoản đăng nhập có rủi ro." }, "generatePasswordSlideDesc": { - "message": "Quickly generate a strong, unique password with the Bitwarden autofill menu on the at-risk site.", + "message": "Tạo nhanh một mật khẩu mạnh, duy nhất bằng menu tự động điền của Bitwarden trên trang web có nguy cơ.", "description": "Description of the generate password slide on the at-risk password page carousel" }, "generatePasswordSlideImgAltPeriod": { - "message": "Illustration of the Bitwarden autofill menu displaying a generated password." + "message": "Minh họa menu tự điền mật khẩu của Bitwarden hiển thị một mật khẩu được tạo ra." }, "updateInBitwarden": { - "message": "Update in Bitwarden" + "message": "Cập nhật trong Bitwarden" }, "updateInBitwardenSlideDesc": { - "message": "Bitwarden will then prompt you to update the password in the password manager.", + "message": "Bitwarden sau đó sẽ yêu cầu bạn cập nhật mật khẩu trong trình quản lý mật khẩu.", "description": "Description of the update in Bitwarden slide on the at-risk password page carousel" }, "updateInBitwardenSlideImgAltPeriod": { - "message": "Illustration of a Bitwarden’s notification prompting the user to update the login." + "message": "Minh họa thông báo của Bitwarden yêu cầu người dùng cập nhật thông tin đăng nhập." }, "turnOnAutofill": { - "message": "Turn on autofill" + "message": "Bật tự động điền" }, "turnedOnAutofill": { - "message": "Turned on autofill" + "message": "Đã bật tự động điền" }, "dismiss": { - "message": "Dismiss" + "message": "Bỏ qua" }, "websiteItemLabel": { - "message": "Trang Web $number$ (URI)", + "message": "Trang web $number$ (URI)", "placeholders": { "number": { "content": "$1", @@ -2634,20 +2682,20 @@ } }, "blockedDomainsSavedSuccess": { - "message": "Blocked domain changes saved" + "message": "Đã lưu thay đổi tên miền bị chặn" }, "excludedDomainsSavedSuccess": { - "message": "Các thay đổi tên miền loại trừ đã được lưu" + "message": "Thay đổi tên miền bị loại trừ đã được lưu" }, "limitSendViews": { - "message": "Limit views" + "message": "Giới hạn số lượt xem" }, "limitSendViewsHint": { - "message": "No one can view this Send after the limit is reached.", + "message": "Không ai có thể xem Send này sau khi đạt đến giới hạn.", "description": "Displayed under the limit views field on Send" }, "limitSendViewsCount": { - "message": "$ACCESSCOUNT$ views left", + "message": "$ACCESSCOUNT$ lượt xem còn lại", "description": "Displayed under the limit views field on Send", "placeholders": { "accessCount": { @@ -2657,32 +2705,32 @@ } }, "send": { - "message": "Gửi", + "message": "Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDetails": { - "message": "Send details", + "message": "Chi tiết Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendTypeText": { "message": "Văn bản" }, "sendTypeTextToShare": { - "message": "Text to share" + "message": "Nội dung chia sẻ" }, "sendTypeFile": { "message": "Tập tin" }, "allSends": { - "message": "Tất cả mục Gửi", + "message": "Toàn bộ Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCountReached": { - "message": "Max access count reached", + "message": "Đã vượt số lần truy cập tối đa", "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "hideTextByDefault": { - "message": "Hide text by default" + "message": "Ẩn văn bản theo mặc định" }, "expired": { "message": "Đã hết hạn" @@ -2694,7 +2742,7 @@ "message": "Sao chép liên kết" }, "copySendLink": { - "message": "Sao chép liên kết mục Gửi", + "message": "Sao chép liên kết Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "removePassword": { @@ -2707,11 +2755,11 @@ "message": "Đã xóa mật khẩu" }, "deletedSend": { - "message": "Đã xóa mục Gửi", + "message": "Đã xóa Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLink": { - "message": "Liên kết Gửi", + "message": "Liên kết Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "disabled": { @@ -2721,26 +2769,26 @@ "message": "Bạn có chắc chắn muốn xóa mật khẩu này không?" }, "deleteSend": { - "message": "Xóa mục Gửi", + "message": "Xóa Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendConfirmation": { - "message": "Bạn có chắc muốn mục Gửi này?", + "message": "Bạn có chắc chắn muốn xóa Send này?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deleteSendPermanentConfirmation": { - "message": "Are you sure you want to permanently delete this Send?", + "message": "Bạn có chắc chắn muốn xóa vĩnh viễn Send này không?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editSend": { - "message": "Sửa mục Gửi", + "message": "Chỉnh sửa Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "deletionDate": { - "message": "Ngày xóa" + "message": "Xóa sau" }, "deletionDateDescV2": { - "message": "The Send will be permanently deleted on this date.", + "message": "Send sẽ được xóa vĩnh viễn vào ngày này.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "expirationDate": { @@ -2762,11 +2810,11 @@ "message": "Tùy chỉnh" }, "sendPasswordDescV3": { - "message": "Add an optional password for recipients to access this Send.", + "message": "Thêm mật khẩu tùy chọn cho người nhận để có thể truy cập vào Send này.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createSend": { - "message": "Send mới", + "message": "Tạo Send mới", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "newPassword": { @@ -2777,23 +2825,23 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendDisabledWarning": { - "message": "Do chính sách doanh nghiệp, bạn chỉ có thể xóa những mục Gửi hiện có.", + "message": "Do chính sách doanh nghiệp, bạn chỉ có thể xóa những Send hiện có.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSend": { - "message": "Đã tạo mục Gửi", + "message": "Đã tạo Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "createdSendSuccessfully": { - "message": "Send created successfully!", + "message": "Đã tạo Send thành công!", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHoursSingle": { - "message": "The Send will be available to anyone with the link for the next 1 hour.", + "message": "Send này sẽ được cung cấp cho bất kỳ ai có liên kết trong 1 giờ tới.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInHours": { - "message": "The Send will be available to anyone with the link for the next $HOURS$ hours.", + "message": "Send này sẽ được cung cấp cho bất kỳ ai có liên kết trong $HOURS$ giờ tới.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "hours": { @@ -2803,11 +2851,11 @@ } }, "sendExpiresInDaysSingle": { - "message": "The Send will be available to anyone with the link for the next 1 day.", + "message": "Send này sẽ được cung cấp cho bất kỳ ai có liên kết trong 1 ngày tới.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendExpiresInDays": { - "message": "The Send will be available to anyone with the link for the next $DAYS$ days.", + "message": "Send này sẽ được cung cấp cho bất kỳ ai có liên kết trong $DAYS$ ngày tới.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.", "placeholders": { "days": { @@ -2817,32 +2865,32 @@ } }, "sendLinkCopied": { - "message": "Send link copied", + "message": "Đã sao chép liên kết Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "editedSend": { - "message": "Đã lưu mục Gửi", + "message": "Đã lưu Send", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogText": { - "message": "Pop out extension?", + "message": "Mở rộng tiện ích ra cửa sổ mới?", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendFilePopoutDialogDesc": { - "message": "To create a file Send, you need to pop out the extension to a new window.", + "message": "Để tạo Send tập tin, bạn cần mở phần mở rộng trong cửa sổ mới.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendLinuxChromiumFileWarning": { - "message": "Để chọn tập tin, mở tiện ích mở rộng trong thanh bên (nếu có thể) hoặc mở ra cửa sổ mới bằng cách nhấp vào biểu ngữ này." + "message": "Để chọn tập tin, mở tiện ích mở rộng trong thanh bên (nếu có thể) hoặc mở cửa sổ mới bằng cách nhấp vào biểu ngữ này." }, "sendFirefoxFileWarning": { - "message": "Để chọn tập tin bằng Firefox, mở tiện ích mở rộng trong thanh bên hoặc mở ra cửa sổ mới bằng cách nhấp vào biểu ngữ này." + "message": "Để chọn tập tin bằng Firefox, mở tiện ích mở rộng trong thanh bên hoặc mở cửa sổ mới bằng cách nhấp vào biểu ngữ này." }, "sendSafariFileWarning": { - "message": "Để chọn tập tin bằng Safari, mở ra cửa sổ mới bằng cách nhấp vào biểu ngữ này." + "message": "Để chọn tập tin bằng Safari, mở cửa sổ mới bằng cách nhấp vào biểu ngữ này." }, "popOut": { - "message": "Pop out" + "message": "Mở rộng" }, "sendFileCalloutHeader": { "message": "Trước khi bạn bắt đầu" @@ -2863,10 +2911,10 @@ "message": "Đã xảy ra lỗi khi lưu ngày xoá và ngày hết hạn của bạn." }, "hideYourEmail": { - "message": "Hide your email address from viewers." + "message": "Ẩn địa chỉ email của bạn với người xem." }, "passwordPrompt": { - "message": "Nhắc lại mật khẩu chính" + "message": "Nhập lại mật khẩu chính" }, "passwordConfirmation": { "message": "Xác nhận mật khẩu chính" @@ -2875,13 +2923,16 @@ "message": "Hành động này được bảo vệ. Để tiếp tục, hãy nhập lại mật khẩu chính của bạn để xác minh danh tính." }, "emailVerificationRequired": { - "message": "Yêu cầu xác nhận danh tính qua email" + "message": "Yêu cầu xác minh danh tính qua email" }, "emailVerifiedV2": { "message": "Email đã xác minh" }, "emailVerificationRequiredDesc": { - "message": "Bạn phải xác nhận email để sử dụng tính năng này. Bạn có thể xác minh email trên web." + "message": "Bạn phải xác minh email để sử dụng tính năng này. Bạn có thể xác minh email trên web." + }, + "masterPasswordSuccessfullySet": { + "message": "Mật khẩu chính được thiết lập thành công" }, "updatedMasterPassword": { "message": "Đã cập nhật mật khẩu chính" @@ -2890,13 +2941,13 @@ "message": "Cập nhật mật khẩu chính" }, "updateMasterPasswordWarning": { - "message": "Mật khẩu chính của bạn gần đây đã được thay đổi bởi người quản trị trong tổ chức của bạn. Để truy cập kho, bạn phải cập nhật nó ngay bây giờ. Việc tiếp tục sẽ đăng xuất khỏi kho và bạn sẽ cần đăng nhập lại. Ứng dụng Bitwaden trên các thiết bị khác có thể tiếp tục hoạt động trong tối đa một giờ sau đó sẽ bị đăng xuất." + "message": "Mật khẩu chính của bạn gần đây đã được thay đổi bởi người quản trị trong tổ chức của bạn. Để truy cập kho, bạn phải cập nhật mật khẩu chính của mình ngay bây giờ. Việc tiếp tục sẽ đăng xuất khỏi kho và bạn sẽ cần đăng nhập lại. Ứng dụng Bitwaden trên các thiết bị khác có thể tiếp tục hoạt động trong tối đa một giờ sau đó sẽ bị đăng xuất." }, "updateWeakMasterPasswordWarning": { "message": "Mật khẩu chính của bạn không đáp ứng chính sách tổ chức của bạn. Để truy cập kho, bạn phải cập nhật mật khẩu chính của mình ngay bây giờ. Việc tiếp tục sẽ đăng xuất bạn khỏi phiên hiện tại và bắt buộc đăng nhập lại. Các phiên hoạt động trên các thiết bị khác có thể tiếp tục duy trì hoạt động trong tối đa một giờ." }, "tdeDisabledMasterPasswordRequired": { - "message": "Tổ chức của bạn đã vô hiệu hóa mã hóa bằng thiết bị đáng tin cậy. Vui lòng đặt mật khẩu chính để truy cập Kho của bạn." + "message": "Tổ chức của bạn đã vô hiệu hóa tính năng mã hóa thiết bị tin cậy. Vui lòng đặt mật khẩu chính để truy cập kho của bạn." }, "resetPasswordPolicyAutoEnroll": { "message": "Đăng ký tự động" @@ -2912,15 +2963,15 @@ "description": "Used as a message within the notification bar when no folders are found" }, "orgPermissionsUpdatedMustSetPassword": { - "message": "Quyền tổ chức của bạn đã được cập nhật, yêu cầu bạn đặt mật khẩu chính.", + "message": "Quyền truy cập của tổ chức bạn đã được cập nhật, yêu cầu bạn phải thiết lập mật khẩu chính.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "orgRequiresYouToSetPassword": { - "message": "Tổ chức của bạn yêu cầu bạn đặt mật khẩu chính.", + "message": "Tổ chức của bạn yêu cầu bạn thiết lập mật khẩu chính.", "description": "Used as a card title description on the set password page to explain why the user is there" }, "cardMetrics": { - "message": "out of $TOTAL$", + "message": "trong tổng số $TOTAL$", "placeholders": { "total": { "content": "$1", @@ -2939,7 +2990,7 @@ "message": "Phút" }, "vaultTimeoutPolicyAffectingOptions": { - "message": "Enterprise policy requirements have been applied to your timeout options" + "message": "Các yêu cầu chính sách của doanh nghiệp đã được áp dụng cho các tùy chọn thời gian mở kho của bạn" }, "vaultTimeoutPolicyInEffect": { "message": "Tổ chức của bạn đã đặt thời gian mở kho tối đa là $HOURS$ giờ và $MINUTES$ phút.", @@ -2955,7 +3006,7 @@ } }, "vaultTimeoutPolicyInEffect1": { - "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "message": "Tối đa $HOURS$ giờ và $MINUTES$ phút.", "placeholders": { "hours": { "content": "$1", @@ -2968,7 +3019,7 @@ } }, "vaultTimeoutPolicyMaximumError": { - "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "message": "Thời gian mở kho đã vượt quá giới hạn do tổ chức của bạn đặt ra: Tối đa $HOURS$ giờ và $MINUTES$ phút", "placeholders": { "hours": { "content": "$1", @@ -2981,7 +3032,7 @@ } }, "vaultTimeoutPolicyWithActionInEffect": { - "message": "Tổ chức của bạn đang ảnh hưởng đến thời gian mở kho. Thời gian mở kho tối đa là $HOURS$ giờ và $MINUTES$ phút. Kho sẽ $ACTION$ sau khi hết thời gian mở kho.", + "message": "Các chính sách của tổ chức bạn đang ảnh hưởng đến thời gian mở kho. Thời gian mở kho tối đa được phép là $HOURS$ giờ và $MINUTES$ phút. Kho sẽ $ACTION$ sau khi đóng kho.", "placeholders": { "hours": { "content": "$1", @@ -2998,7 +3049,7 @@ } }, "vaultTimeoutActionPolicyInEffect": { - "message": "Tổ chức của bạn sẽ $ACTION$ sau khi hết thời gian mở kho.", + "message": "Tổ chức bạn đã thiết lập hành động sau khi đóng kho là $ACTION$.", "placeholders": { "action": { "content": "$1", @@ -3010,25 +3061,25 @@ "message": "Thời gian mở kho vượt quá giới hạn do tổ chức của bạn đặt ra." }, "vaultExportDisabled": { - "message": "Xuất kho không có sẵn" + "message": "Chức năng xuất kho không khả dụng" }, "personalVaultExportPolicyInEffect": { "message": "Các chính sách của tổ chức ngăn cản bạn xuất kho lưu trữ cá nhân của mình." }, "copyCustomFieldNameInvalidElement": { - "message": "Không thể xác định được phần tử biểu mẫu hợp lệ. Thay vào đó hãy thử kiểm tra trong HTML." + "message": "Không thể xác định được phần tử biểu mẫu hợp lệ. Thay vào đó hãy thử kiểm tra mã HTML." }, "copyCustomFieldNameNotUnique": { "message": "Không tìm thấy danh tính duy nhất." }, "removeMasterPasswordForOrganizationUserKeyConnector": { - "message": "A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator." + "message": "Mật khẩu chính không còn được yêu cầu đối với các thành viên của tổ chức sau đây. Vui lòng xác nhận tên miền bên dưới với quản trị viên của tổ chức." }, "organizationName": { - "message": "Organization name" + "message": "Tên tổ chức" }, "keyConnectorDomain": { - "message": "Key Connector domain" + "message": "Tên miền Key Connector" }, "leaveOrganization": { "message": "Rời tổ chức" @@ -3055,7 +3106,7 @@ "message": "Đang xuất dữ liệu kho cá nhân" }, "exportingIndividualVaultDescription": { - "message": "Chỉ dữ liệu trong kho cá nhân liên kết với $EMAIL$ mới được xuất. Không bao gồm \ncác dữ liệu trong kho tổ chức. Chỉ thông tin mục kho mới được xuất, sẽ không có các tệp đính kèm.", + "message": "Chỉ dữ liệu trong kho cá nhân liên kết với $EMAIL$ mới được xuất. Không bao gồm các dữ liệu trong kho tổ chức. Chỉ thông tin về các mục trong kho mới được xuất, sẽ không có các tệp đính kèm.", "placeholders": { "email": { "content": "$1", @@ -3064,7 +3115,7 @@ } }, "exportingIndividualVaultWithAttachmentsDescription": { - "message": "Only the individual vault items including attachments associated with $EMAIL$ will be exported. Organization vault items will not be included", + "message": "Chỉ các mục kho lưu trữ cá nhân bao gồm các tệp đính kèm liên quan đến $EMAIL$ sẽ được xuất. Các mục trong kho lưu trữ của tổ chức sẽ không được bao gồm", "placeholders": { "email": { "content": "$1", @@ -3088,27 +3139,27 @@ "message": "Lỗi" }, "decryptionError": { - "message": "Decryption error" + "message": "Lỗi giải mã" }, "couldNotDecryptVaultItemsBelow": { - "message": "Bitwarden could not decrypt the vault item(s) listed below." + "message": "Bitwarden không thể giải mã các mục trong kho lưu trữ được liệt kê bên dưới." }, "contactCSToAvoidDataLossPart1": { - "message": "Contact customer success", + "message": "Liên hệ hỗ trợ khách hàng thành công", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "contactCSToAvoidDataLossPart2": { - "message": "to avoid additional data loss.", + "message": "để tránh mất mát thêm dữ liệu.", "description": "This is part of a larger sentence. The full sentence will read 'Contact customer success to avoid additional data loss.'" }, "generateUsername": { - "message": "Tạo tên người dùng" + "message": "Tạo tên đăng nhập" }, "generateEmail": { - "message": "Generate email" + "message": "Tạo email" }, "spinboxBoundariesHint": { - "message": "Value must be between $MIN$ and $MAX$.", + "message": "Giá trị phải nằm trong khoảng từ $MIN$ đến $MAX$.", "description": "Explains spin box minimum and maximum values to the user", "placeholders": { "min": { @@ -3122,7 +3173,7 @@ } }, "passwordLengthRecommendationHint": { - "message": " Use $RECOMMENDED$ characters or more to generate a strong password.", + "message": " Sử dụng ít nhất $RECOMMENDED$ ký tự để tạo một mật khẩu mạnh.", "description": "Appended to `spinboxBoundariesHint` to recommend a length to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3132,7 +3183,7 @@ } }, "passphraseNumWordsRecommendationHint": { - "message": " Use $RECOMMENDED$ words or more to generate a strong passphrase.", + "message": " Sử dụng ít nhất $RECOMMENDED$ từ để tạo cụm mật khẩu mạnh.", "description": "Appended to `spinboxBoundariesHint` to recommend a number of words to the user. This must include any language-specific 'sentence' separator characters (e.g. a space in english).", "placeholders": { "recommended": { @@ -3146,10 +3197,10 @@ "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { - "message": "Sử dụng khả năng địa chỉ phụ của nhà cung cấp dịch vụ mail của bạn." + "message": "Sử dụng tính năng địa chỉ phụ của nhà cung cấp dịch vụ email của bạn." }, "catchallEmail": { - "message": "Email Catch-all" + "message": "Catch-all email" }, "catchallEmailDesc": { "message": "Sử dụng hộp thư bạn đã thiết lập để nhận tất cả email gửi đến tên miền của bạn." @@ -3167,17 +3218,17 @@ "message": "Dịch vụ" }, "forwardedEmail": { - "message": "Đã chuyển tiếp bí danh email" + "message": "Địa chỉ email thay thế" }, "forwardedEmailDesc": { - "message": "Tạo bí danh email với dịch vụ chuyển tiếp bên ngoài." + "message": "Tạo một địa chỉ email ảo bằng dịch vụ chuyển tiếp email bên ngoài." }, "forwarderDomainName": { - "message": "Email domain", + "message": "Tên miền email", "description": "Labels the domain name email forwarder service option" }, "forwarderDomainNameHint": { - "message": "Choose a domain that is supported by the selected service", + "message": "Chọn một tên miền được hỗ trợ bởi dịch vụ đã chọn", "description": "Guidance provided for email forwarding services that support multiple email domains." }, "forwarderError": { @@ -3219,7 +3270,7 @@ } }, "forwaderInvalidTokenWithMessage": { - "message": "Khoá API $SERVICENAME$ không hợp lệ: $ERRORMESSAGE$", + "message": "Token API $SERVICENAME$ không hợp lệ: $ERRORMESSAGE$", "description": "Displayed when the user's API token is rejected by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3233,7 +3284,7 @@ } }, "forwaderInvalidOperation": { - "message": "$SERVICENAME$ refused your request. Please contact your service provider for assistance.", + "message": "$SERVICENAME$ đã từ chối yêu cầu của bạn. Vui lòng liên hệ với nhà cung cấp dịch vụ của bạn để được hỗ trợ.", "description": "Displayed when the user is forbidden from using the API by the forwarding service.", "placeholders": { "servicename": { @@ -3243,7 +3294,7 @@ } }, "forwaderInvalidOperationWithMessage": { - "message": "$SERVICENAME$ refused your request: $ERRORMESSAGE$", + "message": "$SERVICENAME$ đã từ chối yêu cầu của bạn: $ERRORMESSAGE$", "description": "Displayed when the user is forbidden from using the API by the forwarding service with an error message.", "placeholders": { "servicename": { @@ -3257,7 +3308,7 @@ } }, "forwarderNoAccountId": { - "message": "Không thể lấy ID tài khoản email ẩn từ $SERVICENAME$.", + "message": "Không thể lấy ID tài khoản email ẩn danh của $SERVICENAME$.", "description": "Displayed when the forwarding service fails to return an account ID.", "placeholders": { "servicename": { @@ -3317,10 +3368,10 @@ "message": "Khóa API" }, "ssoKeyConnectorError": { - "message": "Lỗi kết nối khóa: hãy đảm bảo kết nối khóa khả dụng và hoạt động chính xác." + "message": "Lỗi kết nối khóa: hãy đảm bảo kết nối khóa khả dụng và hoạt động bình thường." }, "premiumSubcriptionRequired": { - "message": "Yêu cầu đăng ký gói Premium" + "message": "Yêu cầu đăng ký gói Cao cấp" }, "organizationIsDisabled": { "message": "Tổ chức đã ngưng hoạt động." @@ -3347,7 +3398,7 @@ "message": "Bên thứ ba" }, "thirdPartyServerMessage": { - "message": "Bạn đang kết nối đến máy chủ $SERVERNAME$ của bên thứ ba. Vui lòng kiểm tra lỗi bằng cách sử dụng máy chủ chính thức hoặc báo lỗi cho bên thứ ba.", + "message": "Kết nối với máy chủ của bên thứ ba, $SERVERNAME$. Vui lòng kiểm tra lỗi trên máy chủ chính thức hoặc báo cáo lỗi cho máy chủ của bên thứ ba.", "placeholders": { "servername": { "content": "$1", @@ -3377,43 +3428,68 @@ "message": "Đăng nhập bằng thiết bị" }, "fingerprintPhraseHeader": { - "message": "Cụm vân tay" + "message": "Cụm từ xác thực" }, "fingerprintMatchInfo": { - "message": "Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm vân tay khớp trên thiết bị khác." + "message": "Vui lòng đảm bảo rằng bạn đã mở khoá kho và cụm từ xác thực khớp với thiết bị khác." }, "resendNotification": { "message": "Gửi lại thông báo" }, "viewAllLogInOptions": { - "message": "View all log in options" + "message": "Xem tất cả tùy chọn đăng nhập" }, "notificationSentDevice": { "message": "Một thông báo đã được gửi đến thiết bị của bạn." }, "notificationSentDevicePart1": { - "message": "Unlock Bitwarden on your device or on the" + "message": "Mở khóa Bitwarden trên thiết bị của bạn hoặc trên" }, "notificationSentDeviceAnchor": { - "message": "web app" + "message": "ứng dụng web" }, "notificationSentDevicePart2": { - "message": "Make sure the Fingerprint phrase matches the one below before approving." + "message": "Hãy đảm bảo rằng cụm từ xác thực khớp với cụm từ bên dưới trước khi phê duyệt." }, "aNotificationWasSentToYourDevice": { - "message": "A notification was sent to your device" + "message": "Một thông báo đã được gửi đến thiết bị của bạn" }, "youWillBeNotifiedOnceTheRequestIsApproved": { - "message": "You will be notified once the request is approved" + "message": "Bạn sẽ nhận được thông báo ngay sau khi yêu cầu được phê duyệt" }, "needAnotherOptionV1": { - "message": "Need another option?" + "message": "Cần một tùy chọn khác?" }, "loginInitiated": { "message": "Bắt đầu đăng nhập" }, "logInRequestSent": { - "message": "Request sent" + "message": "Đã gửi yêu cầu" + }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Đã phê duyệt yêu cầu đăng nhập cho $EMAIL$ trên $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "Bạn đã từ chối một lần đăng nhập từ thiết bị khác. Nếu đó là bạn, hãy thử đăng nhập lại bằng thiết bị đó." + }, + "device": { + "message": "Thiết bị" + }, + "loginStatus": { + "message": "Trạng thái đăng nhập" + }, + "masterPasswordChanged": { + "message": "Đã lưu mật khẩu chính" }, "exposedMasterPassword": { "message": "Mật khẩu chính bị lộ" @@ -3422,19 +3498,19 @@ "message": "Mật khẩu này đã bị rò rỉ trong một vụ tấn công dữ liệu. Dùng mật khẩu mới và an toàn để bảo vệ tài khoản bạn. Bạn có chắc muốn sử dụng mật khẩu đã bị rò rỉ?" }, "weakAndExposedMasterPassword": { - "message": "Mật khẩu chính yếu và bị lộ" + "message": "Mật khẩu chính yếu và đã bị lộ" }, "weakAndBreachedMasterPasswordDesc": { - "message": "Mật khẩu yếu này đã bị rò rỉ trong một vụ tấn công dữ liệu. Dùng mật khẩu mới và an toàn để bảo vệ tài khoản bạn. Bạn có chắc muốn sử dụng mật khẩu đã bị rò rỉ?" + "message": "Mật khẩu yếu này đã bị rò rỉ trong một vụ tấn công dữ liệu. Hãy dùng mật khẩu mạnh và duy nhất để bảo vệ tài khoản của bạn. Bạn có chắc muốn sử dụng mật khẩu đã bị rò rỉ?" }, "checkForBreaches": { - "message": "Kiểm tra mật khẩu có lộ trong các vụ rò rỉ dữ liệu hay không" + "message": "Kiểm tra mật khẩu có bị lộ trong các vụ rò rỉ dữ liệu hay không" }, "important": { "message": "Quan trọng:" }, "masterPasswordHint": { - "message": "Mật khẩu chính của bạn không thể phục hồi nếu bạn quên nó!" + "message": "Mật khẩu chính của bạn không thể khôi phục nếu bạn quên nó!" }, "characterMinimum": { "message": "$LENGTH$ ký tự tối thiểu", @@ -3446,7 +3522,7 @@ } }, "autofillPageLoadPolicyActivated": { - "message": "Chính sách quản lí của bạn đã bật chức năng tự động điền khi tải trang." + "message": "Chính sách của tổ chức bạn đã kích hoạt tính năng tự động điền khi tải trang." }, "howToAutofill": { "message": "Cách tự đồng điền" @@ -3476,16 +3552,16 @@ "message": "Thay đổi phím tắt" }, "autofillKeyboardManagerShortcutsLabel": { - "message": "Quản lý các lối tắt" + "message": "Quản lý các phím tắt" }, "autofillShortcut": { "message": "Phím tắt tự động điền" }, "autofillLoginShortcutNotSet": { - "message": "The autofill login shortcut is not set. Change this in the browser's settings." + "message": "Chưa cài đặt phím tắt cho chức năng tự động điền. Vui lòng thay đổi trong cài đặt của trình duyệt." }, "autofillLoginShortcutText": { - "message": "The autofill login shortcut is $COMMAND$. Manage all shortcuts in the browser's settings.", + "message": "Phím tắt đăng nhập tự động là $COMMAND$. Quản lý các phím tắt trong cài đặt của trình duyệt.", "placeholders": { "command": { "content": "$1", @@ -3506,16 +3582,104 @@ "message": "Mở trong cửa sổ mới" }, "rememberThisDeviceToMakeFutureLoginsSeamless": { - "message": "Remember this device to make future logins seamless" + "message": "Nhớ thiết bị này để đăng nhập dễ dàng trong tương lai" + }, + "manageDevices": { + "message": "Quản lý thiết bị" + }, + "currentSession": { + "message": "Phiên hiện tại" + }, + "mobile": { + "message": "Di động", + "description": "Mobile app" + }, + "extension": { + "message": "Tiện ích mở rộng", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Máy tính", + "description": "Desktop app" + }, + "webVault": { + "message": "Kho web" + }, + "webApp": { + "message": "Ứng dụng web" + }, + "cli": { + "message": "Giao diện dòng lệnh (CLI)" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Yêu cầu đang chờ xử lý" + }, + "firstLogin": { + "message": "Đăng nhập lần đầu" + }, + "trusted": { + "message": "Tin tưởng" + }, + "needsApproval": { + "message": "Cần phê duyệt" + }, + "devices": { + "message": "Thiết bị" + }, + "accessAttemptBy": { + "message": "Cố gắng truy cập bởi $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Xác nhận truy cập" + }, + "denyAccess": { + "message": "Từ chối truy cập" + }, + "time": { + "message": "Thời gian" + }, + "deviceType": { + "message": "Loại thiết bị" + }, + "loginRequest": { + "message": "Yêu cầu đăng nhập" + }, + "thisRequestIsNoLongerValid": { + "message": "Yêu cầu này không còn hiệu lực." + }, + "loginRequestHasAlreadyExpired": { + "message": "Yêu cầu đăng nhập đã hết hạn." + }, + "justNow": { + "message": "Vừa xong" + }, + "requestedXMinutesAgo": { + "message": "Đã yêu cầu $MINUTES$ phút trước", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } }, "deviceApprovalRequired": { "message": "Yêu cầu phê duyệt thiết bị. Chọn một tuỳ chọn phê duyệt bên dưới:" }, "deviceApprovalRequiredV2": { - "message": "Device approval required" + "message": "Yêu cầu phê duyệt trên thiết bị" }, "selectAnApprovalOptionBelow": { - "message": "Select an approval option below" + "message": "Chọn một tùy chọn phê duyệt dưới đây" }, "rememberThisDevice": { "message": "Lưu thiết bị này" @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "Yêu cầu quản trị viên phê duyệt" }, + "unableToCompleteLogin": { + "message": "Không thể hoàn tất quá trình đăng nhập" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "Bạn cần đăng nhập trên một thiết bị đáng tin cậy hoặc yêu cầu quản trị viên cấp cho bạn mật khẩu." + }, "ssoIdentifierRequired": { "message": "Cần có mã định danh SSO của tổ chức." }, @@ -3539,13 +3709,13 @@ "message": "Kiểm tra email của bạn" }, "followTheLinkInTheEmailSentTo": { - "message": "Nhấp vào liên kết trong email được gửi đến" + "message": "Nhấp vào liên kết được gửi đến trong email" }, "andContinueCreatingYourAccount": { "message": "và tiếp tục tạo tài khoản của bạn." }, "noEmail": { - "message": "Không có email?" + "message": "Không nhận được email?" }, "goBack": { "message": "Quay lại" @@ -3579,55 +3749,47 @@ "message": "Không thể đăng nhập?" }, "loginApproved": { - "message": "Lượt đăng nhập đã duyệt" + "message": "Lượt đăng nhập đã phê duyệt" }, "userEmailMissing": { "message": "Thiếu email người dùng" }, "activeUserEmailNotFoundLoggingYouOut": { - "message": "Active user email not found. Logging you out." + "message": "Email người dùng đang hoạt động không được tìm thấy. Bạn đang bị đăng xuất." }, "deviceTrusted": { "message": "Thiết bị tin cậy" }, "trustOrganization": { - "message": "Trust organization" + "message": "Tin tưởng tổ chức" }, "trust": { - "message": "Trust" + "message": "Tin tưởng" }, "doNotTrust": { - "message": "Do not trust" + "message": "Không tin tưởng" }, "organizationNotTrusted": { - "message": "Organization is not trusted" + "message": "Tổ chức không được tin cậy" }, "emergencyAccessTrustWarning": { - "message": "For the security of your account, only confirm if you have granted emergency access to this user and their fingerprint matches what is displayed in their account" + "message": "Để đảm bảo an toàn tài khoản của bạn, chỉ xác nhận nếu bạn đã cấp quyền truy cập khẩn cấp cho người dùng này và cụm từ nhận dạng của họ khớp với những gì hiển thị trong tài khoản của họ" }, "orgTrustWarning": { - "message": "For the security of your account, only proceed if you are a member of this organization, have account recovery enabled, and the fingerprint displayed below matches the organization's fingerprint." + "message": "Để đảm bảo an toàn cho tài khoản của bạn, vui lòng chỉ tiếp tục nếu bạn là thành viên của tổ chức này, đã kích hoạt tính năng khôi phục tài khoản và cụm từ nhận dạng hiển thị bên dưới trùng khớp với cụm từ nhận dạng của tổ chức." }, "orgTrustWarning1": { - "message": "This organization has an Enterprise policy that will enroll you in account recovery. Enrollment will allow organization administrators to change your password. Only proceed if you recognize this organization and the fingerprint phrase displayed below matches the organization's fingerprint." + "message": "Tổ chức này có chính sách doanh nghiệp sẽ đăng ký bạn vào quy trình khôi phục tài khoản. Việc đăng ký sẽ cho phép các quản trị viên của tổ chức thay đổi mật khẩu của bạn. Chỉ tiếp tục nếu bạn nhận ra tổ chức này và cụm từ xác thực hiển thị bên dưới khớp với cụm từ xác thực của tổ chức." }, "trustUser": { - "message": "Trust user" - }, - "sendsNoItemsTitle": { - "message": "Không có mục Gửi nào đang hoạt động", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "Sử dụng Gửi để chia sẻ thông tin mã hóa một cách an toàn với bất kỳ ai.", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." + "message": "Người dùng tin cậy" }, "sendsTitleNoItems": { - "message": "Send sensitive information safely", + "message": "Gửi thông tin nhạy cảm một cách an toàn", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "sendsBodyNoItems": { - "message": "Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure.", + "message": "Chia sẻ tệp tin và dữ liệu một cách an toàn với bất kỳ ai, trên bất kỳ nền tảng nào. Thông tin của bạn sẽ được mã hóa đầu cuối để hạn chế rủi ro bị lộ.", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "inputRequired": { @@ -3640,7 +3802,7 @@ "message": "Tìm kiếm" }, "inputMinLength": { - "message": "Giá trị nhập vào phải ít nhất $COUNT$ ký tự.", + "message": "Dữ liệu nhập vào phải có độ dài ít nhất $COUNT$ ký tự.", "placeholders": { "count": { "content": "$1", @@ -3649,7 +3811,7 @@ } }, "inputMaxLength": { - "message": "Giá trị nhập vào không được vượt quá $COUNT$ ký tự.", + "message": "Độ dài của dữ liệu nhập vào không được vượt quá $COUNT$ ký tự.", "placeholders": { "count": { "content": "$1", @@ -3667,7 +3829,7 @@ } }, "inputMinValue": { - "message": "Giá trị nhập vào phải ít nhất $MIN$.", + "message": "Dữ liệu nhập vào phải ít nhất là $MIN$.", "placeholders": { "min": { "content": "$1", @@ -3676,7 +3838,7 @@ } }, "inputMaxValue": { - "message": "Giá trị nhập vào không được vượt quá $MAX$.", + "message": "Dữ liệu nhập vào không được vượt quá $MAX$.", "placeholders": { "max": { "content": "$1", @@ -3688,14 +3850,14 @@ "message": "Có ít nhất 1 địa chỉ email không hợp lệ" }, "inputTrimValidator": { - "message": "Giá trị nhập vào không được chỉ có khoảng trắng.", + "message": "Dữ liệu nhập vào không được chỉ chứa khoảng trắng.", "description": "Notification to inform the user that a form's input can't contain only whitespace." }, "inputEmail": { - "message": "Giá trị nhập vào không phải là địa chỉ email." + "message": "Dữ liệu nhập vào không phải là địa chỉ email." }, "fieldsNeedAttention": { - "message": "Có $COUNT$ trường cần bạn xem xét ở trên.", + "message": "$COUNT$ trường ở trên cần bạn chú ý.", "placeholders": { "count": { "content": "$1", @@ -3704,10 +3866,10 @@ } }, "singleFieldNeedsAttention": { - "message": "1 field needs your attention." + "message": "1 trường cần bạn chú ý." }, "multipleFieldsNeedAttention": { - "message": "$COUNT$ fields need your attention.", + "message": "$COUNT$ trường bạn cần chú ý.", "placeholders": { "count": { "content": "$1", @@ -3719,7 +3881,7 @@ "message": "-- Chọn --" }, "multiSelectPlaceholder": { - "message": "-- Nhập để lọc --" + "message": "-- Nhập từ khóa để lọc --" }, "multiSelectLoading": { "message": "Đang tải các tuỳ chọn..." @@ -3750,7 +3912,7 @@ "message": "Tên miền thay thế" }, "passwordRepromptDisabledAutofillOnPageLoad": { - "message": "Các mục yêu cầu nhập lại mật khẩu chính không thể tự động điền khi tải trang. Tự động điền khi tải trang đã tắt.", + "message": "Các mục yêu cầu nhập lại mật khẩu chính không thể được tự động điền khi tải trang. Tự động điền khi tải trang đã bị tắt.", "description": "Toast message for describing that master password re-prompt cannot be autofilled on page load." }, "autofillOnPageLoadSetToDefault": { @@ -3765,7 +3927,7 @@ "message": "Ẩn/hiện thanh điều hướng bên" }, "skipToContent": { - "message": "Chuyển đến nội dung" + "message": "Bỏ qua nội dung" }, "bitwardenOverlayButton": { "message": "Nút menu tự động điền Bitwarden", @@ -3784,7 +3946,7 @@ "description": "Text to display in overlay when the account is locked." }, "unlockYourAccountToViewAutofillSuggestions": { - "message": "Unlock your account to view autofill suggestions", + "message": "Mở khóa tài khoản của bạn để xem các đề xuất tự động điền", "description": "Text to display in overlay when the account is locked." }, "unlockAccount": { @@ -3792,15 +3954,15 @@ "description": "Button text to display in overlay when the account is locked." }, "unlockAccountAria": { - "message": "Unlock your account, opens in a new window", + "message": "Mở khóa tài khoản của bạn, mở trong cửa sổ mới", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, "totpCodeAria": { - "message": "Time-based One-Time Password Verification Code", + "message": "Mã xác minh mật khẩu một lần dựa trên thời gian", "description": "Aria label for the totp code displayed in the inline menu for autofill" }, "totpSecondsSpanAria": { - "message": "Time remaining before current TOTP expires", + "message": "Thời gian còn lại trước khi TOTP hiện tại hết hạn", "description": "Aria label for the totp seconds displayed in the inline menu for autofill" }, "fillCredentialsFor": { @@ -3808,7 +3970,7 @@ "description": "Screen reader text for when overlay item is in focused" }, "partialUsername": { - "message": "Tên người dùng từng phần", + "message": "Tên đăng nhập một phần", "description": "Screen reader text for when a login item is focused where a partial username is displayed. SR will announce this phrase before reading the text of the partial username" }, "noItemsToShow": { @@ -3824,31 +3986,31 @@ "description": "Screen reader text (aria-label) for new item button in overlay" }, "newLogin": { - "message": "New login", + "message": "Đăng nhập mới", "description": "Button text to display within inline menu when there are no matching items on a login field" }, "addNewLoginItemAria": { - "message": "Add new vault login item, opens in a new window", + "message": "Thêm mục đăng nhập mới, mở trong cửa sổ mới", "description": "Screen reader text (aria-label) for new login button within inline menu" }, "newCard": { - "message": "New card", + "message": "Thêm thẻ", "description": "Button text to display within inline menu when there are no matching items on a credit card field" }, "addNewCardItemAria": { - "message": "Add new vault card item, opens in a new window", + "message": "Thêm một thẻ mới, mở trong cửa sổ mới", "description": "Screen reader text (aria-label) for new card button within inline menu" }, "newIdentity": { - "message": "New identity", + "message": "Danh tính mới", "description": "Button text to display within inline menu when there are no matching items on an identity field" }, "addNewIdentityItemAria": { - "message": "Add new vault identity item, opens in a new window", + "message": "Thêm danh tính mới, mở trong cửa sổ mới", "description": "Screen reader text (aria-label) for new identity button within inline menu" }, "bitwardenOverlayMenuAvailable": { - "message": "Danh sách tự động điền của Bitwarden sẵn sàng. Sử dụng phím mũi tên xuống để chọn.", + "message": "Menu tự động điền của Bitwarden có sẵn. Nhấn phím mũi tên xuống để chọn.", "description": "Screen reader text for announcing when the overlay opens on the page" }, "turnOn": { @@ -3862,10 +4024,10 @@ "description": "Used for the header of the import dialog, the import button and within the file-password-prompt" }, "importError": { - "message": "Lỗi nhập" + "message": "Lỗi khi nhập" }, "importErrorDesc": { - "message": "Có vấn đề với dữ liệu bạn cố gắng nhập. Vui lòng khắc phục các lỗi được liệt kê bên dưới trong tập tin nguồn của bạn và thử lại." + "message": "Có vấn đề với dữ liệu bạn đang cố gắng nhập. Vui lòng khắc phục các lỗi được liệt kê bên dưới trong tệp nguồn của bạn và thử lại." }, "resolveTheErrorsBelowAndTryAgain": { "message": "Giải quyết các lỗi bên dưới và thử lại." @@ -3901,7 +4063,7 @@ "message": "Đang chờ xác nhận" }, "couldNotCompleteBiometrics": { - "message": "Không thể hoàn tất sinh trắc học." + "message": "Không thể hoàn tất quá trình xác thực sinh trắc học." }, "needADifferentMethod": { "message": "Cần một phương pháp khác?" @@ -3940,7 +4102,7 @@ "message": "Tài khoản của bạn yêu cầu xác minh hai bước với Duo." }, "popoutExtension": { - "message": "Tiện ích mở rộng dạng cửa sổ bật lên" + "message": "Mở tiện ích ra cửa sổ mới" }, "launchDuo": { "message": "Khởi chạy Dou" @@ -3970,7 +4132,7 @@ "message": "Chọn bộ sưu tập" }, "importTargetHint": { - "message": "Chọn tùy chọn này để di chuyển nội dung tập tin đã được nhập đến $DESTINATION$", + "message": "Chọn tùy chọn này nếu bạn muốn nội dung của tệp đã nhập được di chuyển đến $DESTINATION$", "description": "Located as a hint under the import target. Will be appended by either folder or collection, depending if the user is importing into an individual or an organizational vault.", "placeholders": { "destination": { @@ -3998,7 +4160,7 @@ "message": "hoặc sao chép/dán nội dung của tập tin nhập" }, "instructionsFor": { - "message": "Hướng dẫn dùng $NAME$", + "message": "Hướng dẫn cho $NAME$", "description": "The title for the import tool instructions.", "placeholders": { "name": { @@ -4023,22 +4185,22 @@ "message": "Mã khoá" }, "accessing": { - "message": "Accessing" + "message": "Đang truy cập" }, "loggedInExclamation": { - "message": "Logged in!" + "message": "Đã đăng nhập!" }, "passkeyNotCopied": { "message": "Không thể sao chép mã khoá" }, "passkeyNotCopiedAlert": { - "message": "Bản sao sẽ không bao gồm mã khoá. Bạn có muốn tiếp tục tạo bản sao mục này?" + "message": "Bản sao sẽ không bao gồm mã khoá. Bạn có muốn tiếp tục tạo bản sao cho mục này?" }, "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "message": "Trang web yêu cầu xác minh. Tính năng này hiện chưa được hỗ trợ cho tài khoản không có mật khẩu chính." }, "logInWithPasskeyQuestion": { - "message": "Log in with passkey?" + "message": "Đăng nhập bằng mã khóa?" }, "passkeyAlreadyExists": { "message": "Ứng dụng này đã có mã khoá." @@ -4050,10 +4212,10 @@ "message": "Bạn không có thông tin đăng nhập phù hợp cho trang web này." }, "noMatchingLoginsForSite": { - "message": "No matching logins for this site" + "message": "Không có đăng nhập khớp với trang web này" }, "searchSavePasskeyNewLogin": { - "message": "Search or save passkey as new login" + "message": "Tìm kiếm hoặc lưu mã khóa làm đăng nhập mới" }, "confirm": { "message": "Xác nhận" @@ -4065,10 +4227,10 @@ "message": "Lưu mã khoá như đăng nhập mới" }, "chooseCipherForPasskeySave": { - "message": "Choose a login to save this passkey to" + "message": "Chọn một đăng nhập để lưu mã khóa này" }, "chooseCipherForPasskeyAuth": { - "message": "Choose a passkey to log in with" + "message": "Chọn một mã khóa để đăng nhập" }, "passkeyItem": { "message": "Mục mã khoá" @@ -4080,7 +4242,7 @@ "message": "Mục này đã chứa mã khoá. Bạn có chắc muốn ghi đè mã khoá hiện tại không?" }, "featureNotSupported": { - "message": "Chưa hỗ trợ tính năng này" + "message": "Tính năng này hiện chưa được hỗ trợ" }, "yourPasskeyIsLocked": { "message": "Yêu cầu xác thực để sử dụng mã khoá. Xác minh danh tính của bạn để tiếp tục." @@ -4092,7 +4254,7 @@ "message": "Không tìm thấy dữ liệu LastPass" }, "incorrectUsernameOrPassword": { - "message": "Tên người dùng hoặc mật khẩu không đúng" + "message": "Tên đăng nhập hoặc mật khẩu không đúng" }, "incorrectPassword": { "message": "Mật khẩu không đúng" @@ -4150,10 +4312,10 @@ "message": "Nhập từ CSV" }, "lastPassTryAgainCheckEmail": { - "message": "Thử lại hoặc tìm email từ LastPass để xác minh đó là bạn." + "message": "Hãy thử lại hoặc kiểm tra email từ LastPass để xác minh rằng đó là bạn." }, "collection": { - "message": "Bộ Sưu Tập" + "message": "Bộ sưu tập" }, "lastPassYubikeyDesc": { "message": "Cắm khóa YubiKey được liên kết với tài khoản LastPass của bạn vào cổng USB của máy tính, sau đó nhấn nút trên YubiKey." @@ -4171,7 +4333,7 @@ "message": "Tài khoản đang hoạt động" }, "bitwardenAccount": { - "message": "Bitwarden account" + "message": "Tài khoản Bitwarden" }, "availableAccounts": { "message": "Các tài khoản khả dụng" @@ -4201,10 +4363,10 @@ "message": "Chỉ một lần" }, "alwaysForThisSite": { - "message": "Luôn cho trang này" + "message": "Luôn luôn cho trang này" }, "domainAddedToExcludedDomains": { - "message": "$DOMAIN$ đã được thêm vào danh sách các tên miền loại trừ.", + "message": "$DOMAIN$ đã được thêm vào danh sách các tên miền bị loại trừ.", "placeholders": { "domain": { "content": "$1", @@ -4216,6 +4378,26 @@ "message": "Định dạng chung", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "Bitwarden phát hiện khớp đường dẫn (URI) để xác định các đề xuất tự động điền.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Biểu thức chính quy\" là tùy chọn nâng cao với nguy cơ cao hơn trong việc lộ thông tin đăng nhập.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Bắt đầu với\" là tùy chọn nâng cao với nguy cơ cao hơn trong việc lộ thông tin đăng nhập.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "Thông tin thêm về độ phù hợp", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Tùy chọn nâng cao", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "Tiếp tục tới Cài đặt trình duyệt?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4225,7 +4407,7 @@ "description": "Title for dialog which asks if the user wants to proceed to a relevant Help Center page" }, "confirmContinueToHelpCenterPasswordManagementContent": { - "message": "Thay đổi cài đặt tự động điền và quản lý mật khẩu của trình duyệt của bạn.", + "message": "Thay đổi cài đặt tự động điền và quản lý mật khẩu của trình duyệt.", "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser password management settings" }, "confirmContinueToHelpCenterKeyboardShortcutsContent": { @@ -4233,7 +4415,7 @@ "description": "Body content for dialog which asks if the user wants to proceed to the Help Center's page about browser keyboard shortcut settings" }, "confirmContinueToBrowserPasswordManagementSettingsContent": { - "message": "Thay đổi cài đặt tự động điền và quản lý mật khẩu của trình duyệt của bạn.", + "message": "Thay đổi cài đặt tự động điền và quản lý mật khẩu của trình duyệt.", "description": "Body content for dialog which asks if the user wants to proceed to the browser's password management settings page" }, "confirmContinueToBrowserKeyboardShortcutSettingsContent": { @@ -4249,7 +4431,7 @@ "description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior" }, "overrideDefaultBrowserAutoFillSettings": { - "message": "Bitwarden làm trình quản lý mật khẩu mặc định", + "message": "Đặt Bitwarden làm trình quản lý mật khẩu mặc định của bạn", "description": "Label for the setting that allows overriding the default browser autofill settings" }, "privacyPermissionAdditionNotGrantedTitle": { @@ -4257,7 +4439,7 @@ "description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "privacyPermissionAdditionNotGrantedDescription": { - "message": "Bạn phải cấp quyền riêng tư của trình duyệt cho Bitwarden để đặt nó làm trình quản lý mật khẩu mặc định.", + "message": "Bạn phải cấp quyền riêng tư của trình duyệt cho Bitwarden để đặt làm trình quản lý mật khẩu mặc định.", "description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings" }, "makeDefault": { @@ -4269,7 +4451,7 @@ "description": "Notification message for when saving credentials has succeeded." }, "passwordSaved": { - "message": "Password saved!", + "message": "Đã lưu mật khẩu!", "description": "Notification message for when saving credentials has succeeded." }, "updateCipherAttemptSuccess": { @@ -4277,7 +4459,7 @@ "description": "Notification message for when updating credentials has succeeded." }, "passwordUpdated": { - "message": "Password updated!", + "message": "Đã cập nhật mật khẩu!", "description": "Notification message for when updating credentials has succeeded." }, "saveCipherAttemptFailed": { @@ -4294,10 +4476,10 @@ "message": "Đã xóa mã khoá" }, "autofillSuggestions": { - "message": "Autofill suggestions" + "message": "Các gợi ý tự động điền" }, "itemSuggestions": { - "message": "Suggested items" + "message": "Các mục đề xuất" }, "autofillSuggestionsTip": { "message": "Lưu thông tin đăng nhập cho trang này để tự động điền" @@ -4362,7 +4544,7 @@ } }, "viewItemTitleWithField": { - "message": "View item - $ITEMNAME$ - $FIELD$", + "message": "Xem mục - $ITEMNAME$ - $FIELD$", "description": "Title for a link that opens a view for an item.", "placeholders": { "itemname": { @@ -4386,7 +4568,7 @@ } }, "autofillTitleWithField": { - "message": "Autofill - $ITEMNAME$ - $FIELD$", + "message": "Tự động điền - $ITEMNAME$ - $FIELD$", "description": "Title for a button that autofills a login item.", "placeholders": { "itemname": { @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Sao chép $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4441,10 +4623,10 @@ "message": "Giao diện" }, "errorAssigningTargetCollection": { - "message": "Lỗi khi gán vào bộ sưu tập chỉ định." + "message": "Lỗi khi gán vào bộ sưu tập đã chọn." }, "errorAssigningTargetFolder": { - "message": "Lỗi khi gán vào thư mục chỉ định." + "message": "Lỗi khi gán vào thư mục đã chọn." }, "viewItemsIn": { "message": "Xem các mục trong $NAME$", @@ -4547,31 +4729,31 @@ } }, "downloadBitwarden": { - "message": "Download Bitwarden" + "message": "Tải xuống Bitwarden" }, "downloadBitwardenOnAllDevices": { - "message": "Download Bitwarden on all devices" + "message": "Tải xuống Bitwarden trên tất cả các thiết bị" }, "getTheMobileApp": { - "message": "Get the mobile app" + "message": "Tải ứng dụng di động" }, "getTheMobileAppDesc": { - "message": "Access your passwords on the go with the Bitwarden mobile app." + "message": "Truy cập mật khẩu của bạn mọi lúc mọi nơi với ứng dụng di động Bitwarden." }, "getTheDesktopApp": { - "message": "Get the desktop app" + "message": "Tải ứng dụng máy tính" }, "getTheDesktopAppDesc": { - "message": "Access your vault without a browser, then set up unlock with biometrics to expedite unlocking in both the desktop app and browser extension." + "message": "Truy cập kho lưu trữ của bạn mà không cần trình duyệt, sau đó thiết lập mở khóa bằng sinh trắc học để mở khóa dễ dàng trong cả ứng dụng trên máy tính và tiện ích mở rộng trình duyệt." }, "downloadFromBitwardenNow": { - "message": "Download from bitwarden.com now" + "message": "Tải xuống từ bitwarden.com ngay bây giờ" }, "getItOnGooglePlay": { - "message": "Get it on Google Play" + "message": "Tải về từ Google Play" }, "downloadOnTheAppStore": { - "message": "Download on the App Store" + "message": "Tải về từ App Store" }, "permanentlyDeleteAttachmentConfirmation": { "message": "Bạn có chắc chắn muốn xóa vĩnh viễn tệp đính kèm này không?" @@ -4586,13 +4768,13 @@ "message": "Bộ lọc" }, "filterVault": { - "message": "Filter vault" + "message": "Lọc kho" }, "filterApplied": { - "message": "One filter applied" + "message": "Một bộ lọc đã được áp dụng" }, "filterAppliedPlural": { - "message": "$COUNT$ filters applied", + "message": "$COUNT$ bộ lọc đã được áp dụng", "placeholders": { "count": { "content": "$1", @@ -4604,7 +4786,7 @@ "message": "Thông tin cá nhân" }, "identification": { - "message": "ID" + "message": "Định danh" }, "contactInfo": { "message": "Thông tin liên hệ" @@ -4619,7 +4801,7 @@ } }, "cardNumberEndsWith": { - "message": "card number ends with", + "message": "số thẻ kết thúc bằng", "description": "Used within the inline menu to provide an aria description when users are attempting to fill a card cipher." }, "loginCredentials": { @@ -4629,13 +4811,13 @@ "message": "Khóa xác thực" }, "autofillOptions": { - "message": "Autofill options" + "message": "Tùy chọn tự động điền" }, "websiteUri": { - "message": "Website (URI)" + "message": "Trang web (URI)" }, "websiteUriCount": { - "message": "Website (URI) $COUNT$", + "message": "Trang web (URI) $COUNT$", "description": "Label for an input field that contains a website URI. The input field is part of a list of fields, and the count indicates the position of the field in the list.", "placeholders": { "count": { @@ -4645,16 +4827,16 @@ } }, "websiteAdded": { - "message": "Website added" + "message": "Đã thêm trang web" }, "addWebsite": { - "message": "Add website" + "message": "Thêm trang web" }, "deleteWebsite": { - "message": "Delete website" + "message": "Xóa trang web" }, "defaultLabel": { - "message": "Default ($VALUE$)", + "message": "Mặc định ($VALUE$)", "description": "A label that indicates the default value for a field with the current default value in parentheses.", "placeholders": { "value": { @@ -4664,7 +4846,7 @@ } }, "showMatchDetection": { - "message": "Show match detection $WEBSITE$", + "message": "Hiện phát hiện trùng khớp $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4673,7 +4855,7 @@ } }, "hideMatchDetection": { - "message": "Hide match detection $WEBSITE$", + "message": "Ẩn phát hiện trùng khớp $WEBSITE$", "placeholders": { "website": { "content": "$1", @@ -4682,19 +4864,19 @@ } }, "autoFillOnPageLoad": { - "message": "Autofill on page load?" + "message": "Tự động điền khi tải trang?" }, "cardExpiredTitle": { - "message": "Expired card" + "message": "Thẻ hết hạn" }, "cardExpiredMessage": { - "message": "If you've renewed it, update the card's information" + "message": "Nếu bạn đã gia hạn, hãy cập nhật thông tin thẻ" }, "cardDetails": { "message": "Thông tin thẻ" }, "cardBrandDetails": { - "message": "Chi tiết $BRAND$", + "message": "Chi tiết thẻ $BRAND$", "placeholders": { "brand": { "content": "$1", @@ -4703,10 +4885,10 @@ } }, "enableAnimations": { - "message": "Enable animations" + "message": "Bật hiệu ứng động" }, "showAnimations": { - "message": "Show animations" + "message": "Hiện hiệu ứng động" }, "addAccount": { "message": "Thêm tài khoản" @@ -4718,15 +4900,15 @@ "message": "Dữ liệu" }, "passkeys": { - "message": "Passkeys", + "message": "Các mã khoá", "description": "A section header for a list of passkeys." }, "passwords": { - "message": "Passwords", + "message": "Mật khẩu", "description": "A section header for a list of passwords." }, "logInWithPasskeyAriaLabel": { - "message": "Log in with passkey", + "message": "Đăng nhập bằng mã khoá", "description": "ARIA label for the inline menu button that logs in with a passkey." }, "assign": { @@ -4763,19 +4945,19 @@ "message": "Tiêu đề trường" }, "textHelpText": { - "message": "Sử dụng các trường nhập liệu văn bản cho dữ liệu như câu hỏi bảo mật" + "message": "Sử dụng các trường văn bản cho dữ liệu như câu hỏi bảo mật" }, "hiddenHelpText": { - "message": "Sử dụng các trường nhập liệu ẩn cho thông tin nhạy cảm như mật khẩu" + "message": "Sử dụng các trường ẩn để lưu dữ liệu nhạy cảm như mật khẩu" }, "checkBoxHelpText": { "message": "Dùng các ô tích chọn nếu bạn muốn tự động điền vào ô tích chọn của biểu mẫu, chẳng hạn như ghi nhớ email" }, "linkedHelpText": { - "message": "Sử dụng trường nhập liệu đã liên kết khi bạn gặp vấn đề với việc tự động điền trên một trang web cụ thể." + "message": "Sử dụng trường liên kết khi bạn gặp vấn đề với tính năng tự động điền trên một trang web cụ thể." }, "linkedLabelHelpText": { - "message": "Nhập thông tin định danh của trường như id, name, aria-label hoặc placeholder." + "message": "Nhập html id, name, aria-label hoặc placeholder của các trường." }, "editField": { "message": "Chỉnh sửa trường" @@ -4817,10 +4999,10 @@ } }, "reorderWebsiteUriButton": { - "message": "Reorder website URI. Use arrow key to move item up or down." + "message": "Sắp xếp lại đường dẫn trang web. Sử dụng phím mũi tên để di chuyển mục lên hoặc xuống." }, "reorderFieldUp": { - "message": "$LABEL$ đã di chuyển lên vị trí $INDEX$ / $LENGTH$", + "message": "$LABEL$ đã được di chuyển lên, vị trí $INDEX$ trong $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4898,7 +5080,7 @@ } }, "reorderFieldDown": { - "message": "$LABEL$ đã di chuyển xuống vị trí $INDEX$ / $LENGTH$", + "message": "$LABEL$ đã được di chuyển xuống, vị trí $INDEX$ trong $LENGTH$", "placeholders": { "label": { "content": "$1", @@ -4918,43 +5100,43 @@ "message": "Vị trí mục" }, "fileSend": { - "message": "File Send" + "message": "Gửi tệp" }, "fileSends": { - "message": "File Sends" + "message": "Gửi tệp" }, "textSend": { - "message": "Text Send" + "message": "Gửi văn bản" }, "textSends": { - "message": "Text Sends" + "message": "Gửi văn bản" }, "accountActions": { - "message": "Account actions" + "message": "Thao tác trên tài khoản" }, "showNumberOfAutofillSuggestions": { - "message": "Show number of login autofill suggestions on extension icon" + "message": "Hiển thị số lượng đề xuất tự động điền đăng nhập trên biểu tượng tiện ích mở rộng" }, "showQuickCopyActions": { - "message": "Show quick copy actions on Vault" + "message": "Hiển thị các hành động sao chép nhanh trên Kho" }, "systemDefault": { - "message": "System default" + "message": "Mặc định hệ thống" }, "enterprisePolicyRequirementsApplied": { - "message": "Enterprise policy requirements have been applied to this setting" + "message": "Các yêu cầu chính sách của doanh nghiệp đã được áp dụng cho cài đặt này" }, "sshPrivateKey": { - "message": "Private key" + "message": "Khóa riêng tư" }, "sshPublicKey": { - "message": "Public key" + "message": "Khóa công khai" }, "sshFingerprint": { - "message": "Fingerprint" + "message": "Vân tay" }, "sshKeyAlgorithm": { - "message": "Key type" + "message": "Kiểu khoá" }, "sshKeyAlgorithmED25519": { "message": "ED25519" @@ -4969,61 +5151,61 @@ "message": "RSA 4096-Bit" }, "retry": { - "message": "Retry" + "message": "Thử lại" }, "vaultCustomTimeoutMinimum": { - "message": "Minimum custom timeout is 1 minute." + "message": "Thời gian đóng kho tùy chỉnh tối thiểu là 1 phút." }, "additionalContentAvailable": { - "message": "Additional content is available" + "message": "Nội dung bổ sung có sẵn" }, "fileSavedToDevice": { - "message": "File saved to device. Manage from your device downloads." + "message": "Tệp đã được lưu vào thiết bị. Quản lý từ phần Tải về trên thiết bị của bạn." }, "showCharacterCount": { - "message": "Show character count" + "message": "Hiển thị số lượng ký tự" }, "hideCharacterCount": { - "message": "Hide character count" + "message": "Ẩn số lượng ký tự" }, "itemsInTrash": { - "message": "Items in trash" + "message": "Các mục trong thùng rác" }, "noItemsInTrash": { - "message": "No items in trash" + "message": "Không có mục nào trong thùng rác" }, "noItemsInTrashDesc": { - "message": "Items you delete will appear here and be permanently deleted after 30 days" + "message": "Các mục bạn xóa sẽ xuất hiện ở đây và sẽ bị xóa vĩnh vĩnh sau 30 ngày" }, "trashWarning": { - "message": "Items that have been in trash more than 30 days will automatically be deleted" + "message": "Các mục đã ở trong thùng rác hơn 30 ngày sẽ tự động bị xóa" }, "restore": { - "message": "Restore" + "message": "Khôi phục" }, "deleteForever": { - "message": "Delete forever" + "message": "Xóa vĩnh viễn" }, "noEditPermissions": { - "message": "You don't have permission to edit this item" + "message": "Bạn không có quyền chỉnh sửa mục này" }, "biometricsStatusHelptextUnlockNeeded": { - "message": "Biometric unlock is unavailable because PIN or password unlock is required first." + "message": "Mở khóa bằng sinh trắc học không khả dụng vì cần phải mở khóa bằng mã PIN hoặc mật khẩu trước." }, "biometricsStatusHelptextHardwareUnavailable": { - "message": "Biometric unlock is currently unavailable." + "message": "Mở khóa bằng sinh trắc học hiện không khả dụng." }, "biometricsStatusHelptextAutoSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Mở khóa bằng sinh trắc học không khả dụng do các tệp hệ thống bị cấu hình sai." }, "biometricsStatusHelptextManualSetupNeeded": { - "message": "Biometric unlock is unavailable due to misconfigured system files." + "message": "Mở khóa bằng sinh trắc học không khả dụng do các tệp hệ thống bị cấu hình sai." }, "biometricsStatusHelptextDesktopDisconnected": { - "message": "Biometric unlock is unavailable because the Bitwarden desktop app is closed." + "message": "Mở khóa bằng sinh trắc học không khả dụng vì ứng dụng Bitwarden trên máy tính đang bị đóng." }, "biometricsStatusHelptextNotEnabledInDesktop": { - "message": "Biometric unlock is unavailable because it is not enabled for $EMAIL$ in the Bitwarden desktop app.", + "message": "Mở khóa bằng sinh trắc học không khả dụng vì nó chưa được kích hoạt cho $EMAIL$ trong ứng dụng Bitwarden trên máy tính.", "placeholders": { "email": { "content": "$1", @@ -5032,214 +5214,217 @@ } }, "biometricsStatusHelptextUnavailableReasonUnknown": { - "message": "Biometric unlock is currently unavailable for an unknown reason." + "message": "Mở khóa bằng sinh trắc học hiện không khả dụng vì lý do chưa rõ." }, "unlockVault": { - "message": "Unlock your vault in seconds" + "message": "Mở kho của bạn trong vài giây" }, "unlockVaultDesc": { - "message": "You can customize your unlock and timeout settings to more quickly access your vault." + "message": "Bạn có thể tùy chỉnh cài đặt mở khóa và thời gian mở kho để truy cập kho lưu trữ của mình nhanh hơn." }, "unlockPinSet": { - "message": "Unlock PIN set" + "message": "Đã thiết lập mở khóa bằng mã PIN" + }, + "unlockWithBiometricSet": { + "message": "Đã thiết lập mở khóa bằng sinh trắc học" }, "authenticating": { - "message": "Authenticating" + "message": "Đang xác thực" }, "fillGeneratedPassword": { - "message": "Fill generated password", + "message": "Điền mật khẩu được tạo tự động", "description": "Heading for the password generator within the inline menu" }, "passwordRegenerated": { - "message": "Password regenerated", + "message": "Mật khẩu đã được tạo lại", "description": "Notification message for when a password has been regenerated" }, "saveToBitwarden": { - "message": "Save to Bitwarden", + "message": "Lưu vào Bitwarden", "description": "Confirmation message for saving a login to Bitwarden" }, "spaceCharacterDescriptor": { - "message": "Space", + "message": "Phím cách", "description": "Represents the space key in screen reader content as a readable word" }, "tildeCharacterDescriptor": { - "message": "Tilde", + "message": "Dấu ngã", "description": "Represents the ~ key in screen reader content as a readable word" }, "backtickCharacterDescriptor": { - "message": "Backtick", + "message": "Dấu nháy ngược", "description": "Represents the ` key in screen reader content as a readable word" }, "exclamationCharacterDescriptor": { - "message": "Exclamation mark", + "message": "Dấu chấm than", "description": "Represents the ! key in screen reader content as a readable word" }, "atSignCharacterDescriptor": { - "message": "At sign", + "message": "Dấu @", "description": "Represents the @ key in screen reader content as a readable word" }, "hashSignCharacterDescriptor": { - "message": "Hash sign", + "message": "Dấu thăng", "description": "Represents the # key in screen reader content as a readable word" }, "dollarSignCharacterDescriptor": { - "message": "Dollar sign", + "message": "Dấu đô la", "description": "Represents the $ key in screen reader content as a readable word" }, "percentSignCharacterDescriptor": { - "message": "Percent sign", + "message": "Dấu phần trăm", "description": "Represents the % key in screen reader content as a readable word" }, "caretCharacterDescriptor": { - "message": "Caret", + "message": "Dấu mũ", "description": "Represents the ^ key in screen reader content as a readable word" }, "ampersandCharacterDescriptor": { - "message": "Ampersand", + "message": "Dấu và", "description": "Represents the & key in screen reader content as a readable word" }, "asteriskCharacterDescriptor": { - "message": "Asterisk", + "message": "Dấu sao", "description": "Represents the * key in screen reader content as a readable word" }, "parenLeftCharacterDescriptor": { - "message": "Left parenthesis", + "message": "Dấu ngoặc trái", "description": "Represents the ( key in screen reader content as a readable word" }, "parenRightCharacterDescriptor": { - "message": "Right parenthesis", + "message": "Dấu ngoặc phải", "description": "Represents the ) key in screen reader content as a readable word" }, "hyphenCharacterDescriptor": { - "message": "Underscore", + "message": "Gạch dưới", "description": "Represents the _ key in screen reader content as a readable word" }, "underscoreCharacterDescriptor": { - "message": "Hyphen", + "message": "Dấu gạch nối", "description": "Represents the - key in screen reader content as a readable word" }, "plusCharacterDescriptor": { - "message": "Plus", + "message": "Dấu cộng", "description": "Represents the + key in screen reader content as a readable word" }, "equalsCharacterDescriptor": { - "message": "Equals", + "message": "Dấu bằng", "description": "Represents the = key in screen reader content as a readable word" }, "braceLeftCharacterDescriptor": { - "message": "Left brace", + "message": "Dấu ngoặc nhọn trái", "description": "Represents the { key in screen reader content as a readable word" }, "braceRightCharacterDescriptor": { - "message": "Right brace", + "message": "Dấu ngoặc nhọn phải", "description": "Represents the } key in screen reader content as a readable word" }, "bracketLeftCharacterDescriptor": { - "message": "Left bracket", + "message": "Dấu ngoặc vuông trái", "description": "Represents the [ key in screen reader content as a readable word" }, "bracketRightCharacterDescriptor": { - "message": "Right bracket", + "message": "Dấu ngoặc vuông phải", "description": "Represents the ] key in screen reader content as a readable word" }, "pipeCharacterDescriptor": { - "message": "Pipe", + "message": "Dấu gạch", "description": "Represents the | key in screen reader content as a readable word" }, "backSlashCharacterDescriptor": { - "message": "Back slash", + "message": "Dấu gạch chéo ngược", "description": "Represents the back slash key in screen reader content as a readable word" }, "colonCharacterDescriptor": { - "message": "Colon", + "message": "Dấu hai chấm", "description": "Represents the : key in screen reader content as a readable word" }, "semicolonCharacterDescriptor": { - "message": "Semicolon", + "message": "Dấu chấm phẩy", "description": "Represents the ; key in screen reader content as a readable word" }, "doubleQuoteCharacterDescriptor": { - "message": "Double quote", + "message": "Nháy kép", "description": "Represents the double quote key in screen reader content as a readable word" }, "singleQuoteCharacterDescriptor": { - "message": "Single quote", + "message": "Dấu nháy đơn", "description": "Represents the ' key in screen reader content as a readable word" }, "lessThanCharacterDescriptor": { - "message": "Less than", + "message": "Dấu nhỏ hơn", "description": "Represents the < key in screen reader content as a readable word" }, "greaterThanCharacterDescriptor": { - "message": "Greater than", + "message": "Dấu lớn hơn", "description": "Represents the > key in screen reader content as a readable word" }, "commaCharacterDescriptor": { - "message": "Comma", + "message": "Dấu phẩy", "description": "Represents the , key in screen reader content as a readable word" }, "periodCharacterDescriptor": { - "message": "Period", + "message": "Dấu chấm", "description": "Represents the . key in screen reader content as a readable word" }, "questionCharacterDescriptor": { - "message": "Question mark", + "message": "Dấu hỏi chấm", "description": "Represents the ? key in screen reader content as a readable word" }, "forwardSlashCharacterDescriptor": { - "message": "Forward slash", + "message": "Dấu gạch chéo", "description": "Represents the / key in screen reader content as a readable word" }, "lowercaseAriaLabel": { - "message": "Lowercase" + "message": "Chữ thường" }, "uppercaseAriaLabel": { - "message": "Uppercase" + "message": "Chữ in hoa" }, "generatedPassword": { - "message": "Generated password" + "message": "Mật khẩu được tạo" }, "compactMode": { - "message": "Compact mode" + "message": "Chế độ nhỏ gọn" }, "beta": { "message": "Beta" }, "extensionWidth": { - "message": "Extension width" + "message": "Chiều rộng phần mở rộng" }, "wide": { - "message": "Wide" + "message": "Rộng" }, "extraWide": { - "message": "Extra wide" + "message": "Rộng hơn" }, "sshKeyWrongPassword": { - "message": "The password you entered is incorrect." + "message": "Mật khẩu bạn đã nhập không đúng." }, "importSshKey": { - "message": "Import" + "message": "Nhập" }, "confirmSshKeyPassword": { - "message": "Confirm password" + "message": "Xác nhận mật khẩu" }, "enterSshKeyPasswordDesc": { - "message": "Enter the password for the SSH key." + "message": "Nhập mật khẩu cho khóa SSH." }, "enterSshKeyPassword": { - "message": "Enter password" + "message": "Nhập mật khẩu" }, "invalidSshKey": { - "message": "The SSH key is invalid" + "message": "Khóa SSH không hợp lệ" }, "sshKeyTypeUnsupported": { - "message": "The SSH key type is not supported" + "message": "Loại khóa SSH không được hỗ trợ" }, "importSshKeyFromClipboard": { - "message": "Import key from clipboard" + "message": "Nhập khóa từ bảng nhớ tạm" }, "sshKeyImported": { - "message": "SSH key imported successfully" + "message": "Khóa SSH được nhập thành công" }, "cannotRemoveViewOnlyCollections": { "message": "Bạn không thể xóa các bộ sưu tập với quyền chỉ xem: $COLLECTIONS$", @@ -5251,138 +5436,148 @@ } }, "updateDesktopAppOrDisableFingerprintDialogTitle": { - "message": "Please update your desktop application" + "message": "Vui lòng cập nhật ứng dụng trên máy tính của bạn" }, "updateDesktopAppOrDisableFingerprintDialogMessage": { - "message": "To use biometric unlock, please update your desktop application, or disable fingerprint unlock in the desktop settings." + "message": "Để sử dụng mở khóa bằng sinh trắc học, vui lòng cập nhật ứng dụng trên máy tính của bạn, hoặc tắt mở khóa vân tay trong cài đặt máy tính." }, "changeAtRiskPassword": { - "message": "Change at-risk password" + "message": "Thay đổi mật khẩu có rủi ro" }, "settingsVaultOptions": { - "message": "Vault options" + "message": "Tùy chọn kho" }, "emptyVaultDescription": { - "message": "The vault protects more than just your passwords. Store secure logins, IDs, cards and notes securely here." + "message": "Kho lưu trữ không chỉ bảo vệ mật khẩu của bạn. Bạn có thể lưu trữ an toàn các thông tin đăng nhập, ID, thẻ và ghi chú tại đây." }, "introCarouselLabel": { - "message": "Welcome to Bitwarden" + "message": "Chào mừng bạn đến với Bitwarden" }, "securityPrioritized": { - "message": "Security, prioritized" + "message": "Bảo mật, ưu tiên hàng đầu" }, "securityPrioritizedBody": { - "message": "Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you." + "message": "Lưu trữ thông tin đăng nhập, thẻ tín dụng và thông tin cá nhân vào kho lưu trữ an toàn của bạn. Bitwarden sử dụng mã hóa đầu cuối không tiết lộ thông tin (zero-knowledge) để bảo vệ những gì quan trọng đối với bạn." }, "quickLogin": { - "message": "Quick and easy login" + "message": "Đăng nhập nhanh chóng và dễ dàng" }, "quickLoginBody": { - "message": "Set up biometric unlock and autofill to log into your accounts without typing a single letter." + "message": "Cài đặt tính năng mở khóa bằng sinh trắc học và tự động điền thông tin để đăng nhập vào các tài khoản của bạn mà không cần nhập bất kỳ ký tự nào." }, "secureUser": { - "message": "Level up your logins" + "message": "Nâng cấp đăng nhập của bạn" }, "secureUserBody": { - "message": "Use the generator to create and save strong, unique passwords for all your accounts." + "message": "Sử dụng trình tạo mật khẩu để tạo và lưu trữ các mật khẩu mạnh, duy nhất cho tất cả các tài khoản của bạn." }, "secureDevices": { - "message": "Your data, when and where you need it" + "message": "Dữ liệu của bạn, mọi lúc, mọi nơi bạn cần" }, "secureDevicesBody": { - "message": "Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps." + "message": "Lưu trữ mật khẩu không giới hạn trên tất cả các thiết bị với ứng dụng di động, trình duyệt và máy tính của Bitwarden." }, "nudgeBadgeAria": { - "message": "1 notification" + "message": "1 thông báo" }, "emptyVaultNudgeTitle": { - "message": "Import existing passwords" + "message": "Nhập mật khẩu hiện có" }, "emptyVaultNudgeBody": { - "message": "Use the importer to quickly transfer logins to Bitwarden without manually adding them." + "message": "Sử dụng công cụ nhập để nhanh chóng chuyển các tài khoản đăng nhập sang Bitwarden mà không cần thêm thủ công." }, "emptyVaultNudgeButton": { - "message": "Import now" + "message": "Nhập ngay" }, "hasItemsVaultNudgeTitle": { - "message": "Welcome to your vault!" + "message": "Chào mừng đến với kho lưu trữ của bạn!" }, "hasItemsVaultNudgeBodyOne": { - "message": "Autofill items for the current page" + "message": "Tự động điền các mục cho trang hiện tại" }, "hasItemsVaultNudgeBodyTwo": { - "message": "Favorite items for easy access" + "message": "Các mục yêu thích để truy cập nhanh chóng" }, "hasItemsVaultNudgeBodyThree": { - "message": "Search your vault for something else" + "message": "Tìm kiếm thông tin khác trong kho của bạn" }, "newLoginNudgeTitle": { - "message": "Save time with autofill" + "message": "Tiết kiệm thời gian với tính năng tự động điền" }, "newLoginNudgeBodyOne": { - "message": "Include a", + "message": "Bao gồm một", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyBold": { - "message": "Website", + "message": "Trang web", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newLoginNudgeBodyTwo": { - "message": "so this login appears as an autofill suggestion.", + "message": "vì vậy, thông tin đăng nhập này sẽ xuất hiện như đề xuất tự động điền.", "description": "This is in multiple parts to allow for bold text in the middle of the sentence.", "example": "Include a Website so this login appears as an autofill suggestion." }, "newCardNudgeTitle": { - "message": "Seamless online checkout" + "message": "Thanh toán trực tuyến không gián đoạn" }, "newCardNudgeBody": { - "message": "With cards, easily autofill payment forms securely and accurately." + "message": "Với thẻ, dễ dàng tự động điền các biểu mẫu thanh toán an toàn và chính xác." }, "newIdentityNudgeTitle": { - "message": "Simplify creating accounts" + "message": "Đơn giản hóa việc tạo tài khoản" }, "newIdentityNudgeBody": { - "message": "With identities, quickly autofill long registration or contact forms." + "message": "Với danh tính, nhanh chóng tự động điền các biểu mẫu đăng ký hoặc liên hệ dài." }, "newNoteNudgeTitle": { - "message": "Keep your sensitive data safe" + "message": "Giữ dữ liệu nhạy cảm của bạn an toàn" }, "newNoteNudgeBody": { - "message": "With notes, securely store sensitive data like banking or insurance details." + "message": "Với ghi chú, lưu trữ an toàn dữ liệu nhạy cảm như thông tin ngân hàng hoặc bảo hiểm." }, "newSshNudgeTitle": { - "message": "Developer-friendly SSH access" + "message": "Truy cập SSH thân thiện với nhà phát triển" }, "newSshNudgeBodyOne": { - "message": "Store your keys and connect with the SSH agent for fast, encrypted authentication.", + "message": "Lưu trữ khóa của bạn và kết nối với trình quản lý khóa SSH để xác thực nhanh chóng và được mã hóa.", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "newSshNudgeBodyTwo": { - "message": "Learn more about SSH agent", + "message": "Tìm hiểu thêm về SSH agent", "description": "Two part message", "example": "Store your keys and connect with the SSH agent for fast, encrypted authentication. Learn more about SSH agent" }, "generatorNudgeTitle": { - "message": "Quickly create passwords" + "message": "Tạo mật khẩu nhanh chóng" }, "generatorNudgeBodyOne": { - "message": "Easily create strong and unique passwords by clicking on", + "message": "Dễ dàng tạo mật khẩu mạnh và duy nhất chỉ trong một cú nhấp chuột", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyTwo": { - "message": "to help you keep your logins secure.", + "message": "để giúp bạn bảo vệ thông tin đăng nhập của mình.", "description": "Two part message", "example": "Easily create strong and unique passwords by clicking on {icon} to help you keep your logins secure." }, "generatorNudgeBodyAria": { - "message": "Easily create strong and unique passwords by clicking on the Generate password button to help you keep your logins secure.", + "message": "Dễ dàng tạo mật khẩu mạnh và duy nhất bằng cách nhấp vào Trình tạo mật khẩu để giúp bạn bảo vệ tài khoản đăng nhập của mình.", "description": "Aria label for the body content of the generator nudge" }, "noPermissionsViewPage": { - "message": "You do not have permissions to view this page. Try logging in with a different account." + "message": "Bạn không có quyền truy cập vào trang này. Hãy thử đăng nhập bằng tài khoản khác." + }, + "wasmNotSupported": { + "message": "WebAssembly không được hỗ trợ trên trình duyệt của bạn hoặc chưa được kích hoạt. WebAssembly là yêu cầu bắt buộc để sử dụng ứng dụng Bitwarden.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Xem thêm" + }, + "showLess": { + "message": "Thu gọn" } } diff --git a/apps/browser/src/_locales/zh_CN/messages.json b/apps/browser/src/_locales/zh_CN/messages.json index e370f7749f6..fff87a949ce 100644 --- a/apps/browser/src/_locales/zh_CN/messages.json +++ b/apps/browser/src/_locales/zh_CN/messages.json @@ -300,7 +300,7 @@ "message": "前往帮助中心吗?" }, "continueToHelpCenterDesc": { - "message": "在帮助中心进一步了解如何使用 Bitwarden。" + "message": "访问帮助中心进一步了解如何使用 Bitwarden。" }, "continueToBrowserExtensionStore": { "message": "前往浏览器扩展商店吗?" @@ -547,6 +547,9 @@ "searchVault": { "message": "搜索密码库" }, + "resetSearch": { + "message": "重置搜索" + }, "edit": { "message": "编辑" }, @@ -1173,6 +1176,12 @@ "message": "哦不!我们无法保存它。请尝试手动输入详细信息。", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "更改密码后,您需要使用新密码登录。 在其他设备上的活动会话将在一小时内注销。" + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "更改您的主密码以完成账户恢复。" + }, "enableChangedPasswordNotification": { "message": "询问更新现有的登录" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "功能不可用" }, - "encryptionKeyMigrationRequired": { - "message": "需要迁移加密密钥。请登录网页版密码库来更新您的加密密钥。" + "legacyEncryptionUnsupported": { + "message": "旧版加密方式已不再受支持。请联系客服恢复您的账户。" }, "premiumMembership": { "message": "高级会员" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "安全码" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "例如" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH 密钥" }, + "typeNote": { + "message": "笔记" + }, "newItemHeader": { "message": "新增 $TYPE$", "placeholders": { @@ -2153,11 +2168,11 @@ "setYourPinCode": { "message": "设定您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您完全注销此应用程序时被重置。" }, - "setYourPinCode1": { - "message": "您的 PIN 码将代替主密码用于解锁 Bitwarden。如果您完全注销 Bitwarden,PIN 码将被重置。" + "setPinCode": { + "message": "您可以使用此 PIN 码解锁 Bitwarden。您的 PIN 码将在您完全注销此应用程序时被重置。" }, "pinRequired": { - "message": "需要 PIN 码。" + "message": "必须填写 PIN 码。" }, "invalidPin": { "message": "无效 PIN 码。" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "某个组织策略已阻止将项目导入您的个人密码库。" }, + "restrictCardTypeImport": { + "message": "无法导入支付卡项目类型" + }, + "restrictCardTypeImportDesc": { + "message": "由 1 个或多个组织设置的策略阻止您将支付卡导入密码库。" + }, "domainsTitle": { "message": "域名", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "更改" }, + "changePassword": { + "message": "更改密码", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "更改密码 - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "存在风险的密码" + }, "atRiskPasswords": { "message": "存在风险的密码" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "该网站密码存在风险,$ORGANIZATION$ 要求您更改此密码。", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ 希望您更改此密码,因为它存在风险。请前往账户设置更改此密码。", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "审查并更改 1 个存在风险的密码" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "您必须验证电子邮箱才能使用此功能。您可以在网页密码库中验证您的电子邮箱。" }, + "masterPasswordSuccessfullySet": { + "message": "主密码设置成功" + }, "updatedMasterPassword": { "message": "已更新主密码" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "请求已发送" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "您拒绝了一个来自其他设备的登录尝试。若确实是您本人,请尝试再次发起设备登录。" + }, + "device": { + "message": "设备" + }, + "loginStatus": { + "message": "登录状态" + }, + "masterPasswordChanged": { + "message": "主密码已保存" + }, "exposedMasterPassword": { "message": "已暴露的主密码" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "记住此设备以便将来无缝登录" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "当前会话" + }, + "mobile": { + "message": "移动端", + "description": "Mobile app" + }, + "extension": { + "message": "扩展", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "桌面端", + "description": "Desktop app" + }, + "webVault": { + "message": "网页密码库" + }, + "webApp": { + "message": "网页 App" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "请求待处理" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "此请求已失效。" + }, + "loginRequestHasAlreadyExpired": { + "message": "登录请求已过期。" + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "请求于 $MINUTES$ 分钟前", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "需要设备批准。请在下面选择一个批准选项:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "请求管理员批准" }, + "unableToCompleteLogin": { + "message": "无法完成登录" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "必须填写组织 SSO 标识符。" }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "信任用户" }, - "sendsNoItemsTitle": { - "message": "没有活跃的 Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "使用 Send 与任何人安全地分享加密信息。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "安全地发送敏感信息", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "常规格式", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "更多关于匹配检测", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "高级选项", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "前往浏览器设置吗?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "复制 $FIELD$,$VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -4526,7 +4708,7 @@ "message": "添加附件" }, "maxFileSizeSansPunctuation": { - "message": "最大文件大小为 500 MB" + "message": "文件最大为 500 MB" }, "deleteAttachmentName": { "message": "删除附件 $NAME$", @@ -4877,7 +5059,7 @@ "message": "成功分配了集合" }, "nothingSelected": { - "message": "您尚未选择任何内容。" + "message": "您没有选择任何内容。" }, "itemsMovedToOrg": { "message": "项目已移动到 $ORGNAME$", @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "解锁 PIN 设置" }, + "unlockWithBiometricSet": { + "message": "生物识别解锁设置" + }, "authenticating": { "message": "正在验证" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "您没有查看此页面的权限。请尝试使用其他账户登录。" + }, + "wasmNotSupported": { + "message": "您的浏览器不支持 WebAssembly 或 WebAssembly 未启用。使用 Bitwarden App 需要 WebAssembly。", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "显示更多" + }, + "showLess": { + "message": "显示更少" } } diff --git a/apps/browser/src/_locales/zh_TW/messages.json b/apps/browser/src/_locales/zh_TW/messages.json index ba8b44dc071..e8873d74e92 100644 --- a/apps/browser/src/_locales/zh_TW/messages.json +++ b/apps/browser/src/_locales/zh_TW/messages.json @@ -547,6 +547,9 @@ "searchVault": { "message": "搜尋密碼庫" }, + "resetSearch": { + "message": "Reset search" + }, "edit": { "message": "編輯" }, @@ -1173,6 +1176,12 @@ "message": "Oh no! We couldn't save this. Try entering the details manually.", "description": "Detailed error message shown when saving login details fails." }, + "changePasswordWarning": { + "message": "After changing your password, you will need to log in with your new password. Active sessions on other devices will be logged out within one hour." + }, + "accountRecoveryUpdateMasterPasswordSubtitle": { + "message": "Change your master password to complete account recovery." + }, "enableChangedPasswordNotification": { "message": "詢問更新現有的登入資料" }, @@ -1365,8 +1374,8 @@ "featureUnavailable": { "message": "功能不可用" }, - "encryptionKeyMigrationRequired": { - "message": "需要遷移加密金鑰。請透過網頁版密碼庫登入以更新您的加密金鑰。" + "legacyEncryptionUnsupported": { + "message": "Legacy encryption is no longer supported. Please contact support to recover your account." }, "premiumMembership": { "message": "進階會員" @@ -1823,6 +1832,9 @@ "securityCode": { "message": "安全代碼" }, + "cardNumber": { + "message": "card number" + }, "ex": { "message": "例如" }, @@ -1922,6 +1934,9 @@ "typeSshKey": { "message": "SSH 金鑰" }, + "typeNote": { + "message": "Note" + }, "newItemHeader": { "message": "新增 $TYPE$", "placeholders": { @@ -2153,8 +2168,8 @@ "setYourPinCode": { "message": "設定您用來解鎖 Bitwarden 的 PIN 碼。您的 PIN 設定將在您完全登出本應用程式時被重設。" }, - "setYourPinCode1": { - "message": "您的 PIN 碼會取代主密碼用來解鎖 Bitwarden。您的 PIN 碼會重置,若您完全登出 Bitwarden。" + "setPinCode": { + "message": "You can use this PIN to unlock Bitwarden. Your PIN will be reset if you ever fully log out of the application." }, "pinRequired": { "message": "必須填入 PIN 碼。" @@ -2484,6 +2499,12 @@ "personalOwnershipPolicyInEffectImports": { "message": "某個組織原則已禁止您將項目匯入至您的個人密碼庫。" }, + "restrictCardTypeImport": { + "message": "Cannot import card item types" + }, + "restrictCardTypeImportDesc": { + "message": "A policy set by 1 or more organizations prevents you from importing cards to your vaults." + }, "domainsTitle": { "message": "網域", "description": "A category title describing the concept of web domains" @@ -2515,6 +2536,10 @@ "change": { "message": "Change" }, + "changePassword": { + "message": "Change password", + "description": "Change password button for browser at risk notification on login." + }, "changeButtonTitle": { "message": "Change password - $ITEMNAME$", "placeholders": { @@ -2524,6 +2549,9 @@ } } }, + "atRiskPassword": { + "message": "At-risk password" + }, "atRiskPasswords": { "message": "At-risk passwords" }, @@ -2558,6 +2586,26 @@ } } }, + "atRiskChangePrompt": { + "message": "Your password for this site is at-risk. $ORGANIZATION$ has requested that you change it.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and the change password domain is known." + }, + "atRiskNavigatePrompt": { + "message": "$ORGANIZATION$ wants you to change this password because it is at-risk. Navigate to your account settings to change the password.", + "placeholders": { + "organization": { + "content": "$1", + "example": "Acme Corp" + } + }, + "description": "Notification body when a login triggers an at-risk password change request and no change password domain is provided." + }, "reviewAndChangeAtRiskPassword": { "message": "Review and change one at-risk password" }, @@ -2883,6 +2931,9 @@ "emailVerificationRequiredDesc": { "message": "您必須驗證您的電子郵件才能使用此功能。您可以在網頁密碼庫裡驗證您的電子郵件。" }, + "masterPasswordSuccessfullySet": { + "message": "Master password successfully set" + }, "updatedMasterPassword": { "message": "已更新主密碼" }, @@ -3415,6 +3466,31 @@ "logInRequestSent": { "message": "已傳送請求" }, + "loginRequestApprovedForEmailOnDevice": { + "message": "Login request approved for $EMAIL$ on $DEVICE$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + }, + "device": { + "content": "$2", + "example": "Web app - Chrome" + } + } + }, + "youDeniedLoginAttemptFromAnotherDevice": { + "message": "You denied a login attempt from another device. If this was you, try to log in with the device again." + }, + "device": { + "message": "Device" + }, + "loginStatus": { + "message": "Login status" + }, + "masterPasswordChanged": { + "message": "Master password saved" + }, "exposedMasterPassword": { "message": "已洩露的主密碼" }, @@ -3508,6 +3584,94 @@ "rememberThisDeviceToMakeFutureLoginsSeamless": { "message": "記住此裝置來讓未來的登入體驗更簡易" }, + "manageDevices": { + "message": "Manage devices" + }, + "currentSession": { + "message": "Current session" + }, + "mobile": { + "message": "Mobile", + "description": "Mobile app" + }, + "extension": { + "message": "Extension", + "description": "Browser extension/addon" + }, + "desktop": { + "message": "Desktop", + "description": "Desktop app" + }, + "webVault": { + "message": "Web vault" + }, + "webApp": { + "message": "Web app" + }, + "cli": { + "message": "CLI" + }, + "sdk": { + "message": "SDK", + "description": "Software Development Kit" + }, + "requestPending": { + "message": "Request pending" + }, + "firstLogin": { + "message": "First login" + }, + "trusted": { + "message": "Trusted" + }, + "needsApproval": { + "message": "Needs approval" + }, + "devices": { + "message": "Devices" + }, + "accessAttemptBy": { + "message": "Access attempt by $EMAIL$", + "placeholders": { + "email": { + "content": "$1", + "example": "name@example.com" + } + } + }, + "confirmAccess": { + "message": "Confirm access" + }, + "denyAccess": { + "message": "Deny access" + }, + "time": { + "message": "Time" + }, + "deviceType": { + "message": "Device Type" + }, + "loginRequest": { + "message": "Login request" + }, + "thisRequestIsNoLongerValid": { + "message": "This request is no longer valid." + }, + "loginRequestHasAlreadyExpired": { + "message": "Login request has already expired." + }, + "justNow": { + "message": "Just now" + }, + "requestedXMinutesAgo": { + "message": "Requested $MINUTES$ minutes ago", + "placeholders": { + "minutes": { + "content": "$1", + "example": "5" + } + } + }, "deviceApprovalRequired": { "message": "裝置需要取得核准。請在下面選擇一個核准選項:" }, @@ -3529,6 +3693,12 @@ "requestAdminApproval": { "message": "要求管理員核准" }, + "unableToCompleteLogin": { + "message": "Unable to complete login" + }, + "loginOnTrustedDeviceOrAskAdminToAssignPassword": { + "message": "You need to log in on a trusted device or ask your administrator to assign you a password." + }, "ssoIdentifierRequired": { "message": "需要組織 SSO 識別碼。" }, @@ -3614,14 +3784,6 @@ "trustUser": { "message": "Trust user" }, - "sendsNoItemsTitle": { - "message": "沒有可用的 Send", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, - "sendsNoItemsMessage": { - "message": "使用 Send 可以與任何人安全地共用加密資訊。", - "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." - }, "sendsTitleNoItems": { "message": "Send sensitive information safely", "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." @@ -4216,6 +4378,26 @@ "message": "常見格式", "description": "Label indicating the most common import formats" }, + "uriMatchDefaultStrategyHint": { + "message": "URI match detection is how Bitwarden identifies autofill suggestions.", + "description": "Explains to the user that URI match detection determines how Bitwarden suggests autofill options, and clarifies that this default strategy applies when no specific match detection is set for a login item." + }, + "regExAdvancedOptionWarning": { + "message": "\"Regular expression\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'regular expression' matching strategy as a cipher match strategy" + }, + "startsWithAdvancedOptionWarning": { + "message": "\"Starts with\" is an advanced option with increased risk of exposing credentials.", + "description": "Content for dialog which warns a user when selecting 'starts with' matching strategy as a cipher match strategy" + }, + "uriMatchWarningDialogLink": { + "message": "More about match detection", + "description": "Link to match detection docs on warning dialog for advance match strategy" + }, + "uriAdvancedOption": { + "message": "Advanced options", + "description": "Advanced option placeholder for uri option component" + }, "confirmContinueToBrowserSettingsTitle": { "message": "繼續前往瀏覽器設定?", "description": "Title for dialog which asks if the user wants to proceed to a relevant browser settings page" @@ -4399,17 +4581,17 @@ } } }, - "copyFieldValue": { - "message": "Copy $FIELD$, $VALUE$", + "copyFieldCipherName": { + "message": "Copy $FIELD$, $CIPHERNAME$", "description": "Title for a button that copies a field value to the clipboard.", "placeholders": { "field": { "content": "$1", "example": "Username" }, - "value": { + "ciphername": { "content": "$2", - "example": "Foo" + "example": "Login Item" } } }, @@ -5043,6 +5225,9 @@ "unlockPinSet": { "message": "Unlock PIN set" }, + "unlockWithBiometricSet": { + "message": "Unlock with biometrics set" + }, "authenticating": { "message": "驗證中" }, @@ -5384,5 +5569,15 @@ }, "noPermissionsViewPage": { "message": "You do not have permissions to view this page. Try logging in with a different account." + }, + "wasmNotSupported": { + "message": "WebAssembly is not supported on your browser or is not enabled. WebAssembly is required to use the Bitwarden app.", + "description": "'WebAssembly' is a technical term and should not be translated." + }, + "showMore": { + "message": "Show more" + }, + "showLess": { + "message": "Show less" } } diff --git a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts index 78bee121afb..48fd57431a2 100644 --- a/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts +++ b/apps/browser/src/auth/popup/account-switching/account-switcher.component.ts @@ -4,7 +4,7 @@ import { Router } from "@angular/router"; import { Subject, firstValueFrom, map, of, startWith, switchMap } from "rxjs"; import { JslibModule } from "@bitwarden/angular/jslib.module"; -import { LockService } from "@bitwarden/auth/common"; +import { LockService, LogoutService } from "@bitwarden/auth/common"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -34,7 +34,6 @@ import { CurrentAccountComponent } from "./current-account.component"; import { AccountSwitcherService } from "./services/account-switcher.service"; @Component({ - standalone: true, templateUrl: "account-switcher.component.html", imports: [ CommonModule, @@ -70,6 +69,7 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy { private vaultTimeoutSettingsService: VaultTimeoutSettingsService, private authService: AuthService, private lockService: LockService, + private logoutService: LogoutService, ) {} get accountLimit() { @@ -141,12 +141,9 @@ export class AccountSwitcherComponent implements OnInit, OnDestroy { }); if (confirmed) { - const result = await this.accountSwitcherService.logoutAccount(userId); - // unlocked logout responses need to be navigated out of the account switcher. - // other responses will be handled by background and app.component - if (result?.status === AuthenticationStatus.Unlocked) { - this.location.back(); - } + await this.logoutService.logout(userId); + // navigate to root so redirect guard can properly route next active user or null user to correct page + await this.router.navigate(["/"]); } this.loading = false; } diff --git a/apps/browser/src/auth/popup/account-switching/account.component.ts b/apps/browser/src/auth/popup/account-switching/account.component.ts index dad74977d34..c060d9161ef 100644 --- a/apps/browser/src/auth/popup/account-switching/account.component.ts +++ b/apps/browser/src/auth/popup/account-switching/account.component.ts @@ -1,7 +1,8 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { CommonModule, Location } from "@angular/common"; +import { CommonModule } from "@angular/common"; import { Component, EventEmitter, Input, Output } from "@angular/core"; +import { Router } from "@angular/router"; import { JslibModule } from "@bitwarden/angular/jslib.module"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; @@ -13,7 +14,6 @@ import { BiometricsService } from "@bitwarden/key-management"; import { AccountSwitcherService, AvailableAccount } from "./services/account-switcher.service"; @Component({ - standalone: true, selector: "auth-account", templateUrl: "account.component.html", imports: [CommonModule, JslibModule, AvatarModule, ItemModule], @@ -24,7 +24,7 @@ export class AccountComponent { constructor( private accountSwitcherService: AccountSwitcherService, - private location: Location, + private router: Router, private i18nService: I18nService, private logService: LogService, private biometricsService: BiometricsService, @@ -45,8 +45,8 @@ export class AccountComponent { // Navigate out of account switching for unlocked accounts // locked or logged out account statuses are handled by background and app.component - if (result?.status === AuthenticationStatus.Unlocked) { - this.location.back(); + if (result?.authenticationStatus === AuthenticationStatus.Unlocked) { + await this.router.navigate(["vault"]); await this.biometricsService.setShouldAutopromptNow(false); } else { await this.biometricsService.setShouldAutopromptNow(true); diff --git a/apps/browser/src/auth/popup/account-switching/current-account.component.html b/apps/browser/src/auth/popup/account-switching/current-account.component.html index f59a2b08fdd..c16abdadf29 100644 --- a/apps/browser/src/auth/popup/account-switching/current-account.component.html +++ b/apps/browser/src/auth/popup/account-switching/current-account.component.html @@ -1,8 +1,8 @@ -
+

- {{ "setYourPinCode1" | i18n }} + {{ "setPinCode" | i18n }}

{{ "pin" | i18n }} diff --git a/apps/browser/src/auth/popup/components/set-pin.component.ts b/apps/browser/src/auth/popup/components/set-pin.component.ts index d79f9eeca89..a9e8e1b122f 100644 --- a/apps/browser/src/auth/popup/components/set-pin.component.ts +++ b/apps/browser/src/auth/popup/components/set-pin.component.ts @@ -14,7 +14,6 @@ import { } from "@bitwarden/components"; @Component({ - standalone: true, templateUrl: "set-pin.component.html", imports: [ DialogModule, diff --git a/apps/browser/src/auth/guards/fido2-auth.guard.ts b/apps/browser/src/auth/popup/guards/fido2-auth.guard.ts similarity index 93% rename from apps/browser/src/auth/guards/fido2-auth.guard.ts rename to apps/browser/src/auth/popup/guards/fido2-auth.guard.ts index 7d7f1f5c4e9..87d490b3d92 100644 --- a/apps/browser/src/auth/guards/fido2-auth.guard.ts +++ b/apps/browser/src/auth/popup/guards/fido2-auth.guard.ts @@ -9,7 +9,7 @@ import { import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; -import { BrowserRouterService } from "../../platform/popup/services/browser-router.service"; +import { BrowserRouterService } from "../../../platform/popup/services/browser-router.service"; /** * This guard verifies the user's authentication status. diff --git a/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.spec.ts b/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.spec.ts deleted file mode 100644 index 8f3199cdfce..00000000000 --- a/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.spec.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Router } from "@angular/router"; -import { MockProxy, mock } from "jest-mock-extended"; -import { BehaviorSubject } from "rxjs"; - -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; - -import { postLogoutMessageListener$ } from "../utils/post-logout-message-listener"; - -import { ExtensionLoginDecryptionOptionsService } from "./extension-login-decryption-options.service"; - -// Mock the module providing postLogoutMessageListener$ -jest.mock("../utils/post-logout-message-listener", () => { - return { - postLogoutMessageListener$: new BehaviorSubject(""), // Replace with mock subject - }; -}); - -describe("ExtensionLoginDecryptionOptionsService", () => { - let service: ExtensionLoginDecryptionOptionsService; - - let messagingService: MockProxy; - let router: MockProxy; - let postLogoutMessageSubject: BehaviorSubject; - - beforeEach(() => { - messagingService = mock(); - router = mock(); - - // Cast postLogoutMessageListener$ to BehaviorSubject for dynamic control - postLogoutMessageSubject = postLogoutMessageListener$ as BehaviorSubject; - - service = new ExtensionLoginDecryptionOptionsService(messagingService, router); - }); - - it("should instantiate the service", () => { - expect(service).not.toBeFalsy(); - }); - - describe("logOut()", () => { - it("should send a logout message", async () => { - postLogoutMessageSubject.next("switchAccountFinish"); - - await service.logOut(); - - expect(messagingService.send).toHaveBeenCalledWith("logout"); - }); - - it("should navigate to root on 'switchAccountFinish'", async () => { - postLogoutMessageSubject.next("switchAccountFinish"); - - await service.logOut(); - - expect(router.navigate).toHaveBeenCalledWith(["/"]); - }); - - it("should not navigate for 'doneLoggingOut'", async () => { - postLogoutMessageSubject.next("doneLoggingOut"); - - await service.logOut(); - - expect(router.navigate).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.ts b/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.ts deleted file mode 100644 index ea529e277e6..00000000000 --- a/apps/browser/src/auth/popup/login-decryption-options/extension-login-decryption-options.service.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Router } from "@angular/router"; -import { firstValueFrom } from "rxjs"; - -import { - DefaultLoginDecryptionOptionsService, - LoginDecryptionOptionsService, -} from "@bitwarden/auth/angular"; -import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; - -import { postLogoutMessageListener$ } from "../utils/post-logout-message-listener"; - -export class ExtensionLoginDecryptionOptionsService - extends DefaultLoginDecryptionOptionsService - implements LoginDecryptionOptionsService -{ - constructor( - protected messagingService: MessagingService, - private router: Router, - ) { - super(messagingService); - } - - override async logOut(): Promise { - // start listening for "switchAccountFinish" or "doneLoggingOut" - const messagePromise = firstValueFrom(postLogoutMessageListener$); - - super.logOut(); - - // wait for messages - const command = await messagePromise; - - // doneLoggingOut already has a message handler that will navigate us - if (command === "switchAccountFinish") { - await this.router.navigate(["/"]); - } - } -} diff --git a/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts b/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts index 6d1f0571ae7..bd85ff9293e 100644 --- a/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts +++ b/apps/browser/src/auth/popup/login/extension-login-component.service.spec.ts @@ -16,7 +16,7 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; import { BrowserPlatformUtilsService } from "../../../platform/services/platform-utils/browser-platform-utils.service"; -import { ExtensionAnonLayoutWrapperDataService } from "../extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; +import { ExtensionAnonLayoutWrapperDataService } from "../../../popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; import { ExtensionLoginComponentService } from "./extension-login-component.service"; diff --git a/apps/browser/src/auth/popup/login/extension-login-component.service.ts b/apps/browser/src/auth/popup/login/extension-login-component.service.ts index 49ed0635b7a..37d74616391 100644 --- a/apps/browser/src/auth/popup/login/extension-login-component.service.ts +++ b/apps/browser/src/auth/popup/login/extension-login-component.service.ts @@ -11,7 +11,7 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legacy"; -import { ExtensionAnonLayoutWrapperDataService } from "../extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; +import { ExtensionAnonLayoutWrapperDataService } from "../../../popup/components/extension-anon-layout-wrapper/extension-anon-layout-wrapper-data.service"; @Injectable() export class ExtensionLoginComponentService diff --git a/apps/browser/src/auth/popup/logout/extension-logout.service.spec.ts b/apps/browser/src/auth/popup/logout/extension-logout.service.spec.ts new file mode 100644 index 00000000000..7ab7742c1c3 --- /dev/null +++ b/apps/browser/src/auth/popup/logout/extension-logout.service.spec.ts @@ -0,0 +1,101 @@ +import { MockProxy, mock } from "jest-mock-extended"; + +import { LogoutReason, LogoutService } from "@bitwarden/auth/common"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { AccountSwitcherService } from "../account-switching/services/account-switcher.service"; + +import { ExtensionLogoutService } from "./extension-logout.service"; + +describe("ExtensionLogoutService", () => { + let logoutService: LogoutService; + let messagingService: MockProxy; + let accountSwitcherService: MockProxy; + + let primaryUserId: UserId; + let secondaryUserId: UserId; + let logoutReason: LogoutReason; + + beforeEach(() => { + primaryUserId = "1" as UserId; + secondaryUserId = "2" as UserId; + logoutReason = "vaultTimeout"; + + messagingService = mock(); + accountSwitcherService = mock(); + logoutService = new ExtensionLogoutService(messagingService, accountSwitcherService); + }); + + it("instantiates", () => { + expect(logoutService).not.toBeFalsy(); + }); + + describe("logout", () => { + describe("No new active user", () => { + beforeEach(() => { + accountSwitcherService.listenForSwitchAccountFinish.mockResolvedValue(null); + }); + + it("sends logout message without a logout reason when not provided", async () => { + const result = await logoutService.logout(primaryUserId); + + expect(accountSwitcherService.listenForSwitchAccountFinish).toHaveBeenCalledTimes(1); + expect(messagingService.send).toHaveBeenCalledWith("logout", { userId: primaryUserId }); + + expect(result).toBeUndefined(); + }); + + it("sends logout message with a logout reason when provided", async () => { + const result = await logoutService.logout(primaryUserId, logoutReason); + + expect(accountSwitcherService.listenForSwitchAccountFinish).toHaveBeenCalledTimes(1); + expect(messagingService.send).toHaveBeenCalledWith("logout", { + userId: primaryUserId, + logoutReason, + }); + expect(result).toBeUndefined(); + }); + }); + + describe("New active user", () => { + const newActiveUserAuthenticationStatus = AuthenticationStatus.Unlocked; + + beforeEach(() => { + accountSwitcherService.listenForSwitchAccountFinish.mockResolvedValue({ + userId: secondaryUserId, + authenticationStatus: newActiveUserAuthenticationStatus, + }); + }); + + it("sends logout message without a logout reason when not provided and returns the new active user", async () => { + const result = await logoutService.logout(primaryUserId); + + expect(accountSwitcherService.listenForSwitchAccountFinish).toHaveBeenCalledTimes(1); + + expect(messagingService.send).toHaveBeenCalledWith("logout", { userId: primaryUserId }); + + expect(result).toEqual({ + userId: secondaryUserId, + authenticationStatus: newActiveUserAuthenticationStatus, + }); + }); + + it("sends logout message with a logout reason when provided and returns the new active user", async () => { + const result = await logoutService.logout(primaryUserId, logoutReason); + + expect(accountSwitcherService.listenForSwitchAccountFinish).toHaveBeenCalledTimes(1); + + expect(messagingService.send).toHaveBeenCalledWith("logout", { + userId: primaryUserId, + logoutReason, + }); + expect(result).toEqual({ + userId: secondaryUserId, + authenticationStatus: newActiveUserAuthenticationStatus, + }); + }); + }); + }); +}); diff --git a/apps/browser/src/auth/popup/logout/extension-logout.service.ts b/apps/browser/src/auth/popup/logout/extension-logout.service.ts new file mode 100644 index 00000000000..c43c18f157a --- /dev/null +++ b/apps/browser/src/auth/popup/logout/extension-logout.service.ts @@ -0,0 +1,39 @@ +import { + DefaultLogoutService, + LogoutReason, + LogoutService, + NewActiveUser, +} from "@bitwarden/auth/common"; +import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { UserId } from "@bitwarden/common/types/guid"; + +import { AccountSwitcherService } from "../account-switching/services/account-switcher.service"; + +export class ExtensionLogoutService extends DefaultLogoutService implements LogoutService { + constructor( + protected messagingService: MessagingService, + private accountSwitcherService: AccountSwitcherService, + ) { + super(messagingService); + } + + override async logout( + userId: UserId, + logoutReason?: LogoutReason, + ): Promise { + // logout can result in an account switch to the next up user + const accountSwitchFinishPromise = + this.accountSwitcherService.listenForSwitchAccountFinish(null); + + // send the logout message + this.messagingService.send("logout", { userId, logoutReason }); + + // wait for the account switch to finish + const result = await accountSwitchFinishPromise; + if (result) { + return { userId: result.userId, authenticationStatus: result.authenticationStatus }; + } + // if there is no account switch, return undefined + return undefined; + } +} diff --git a/apps/browser/src/auth/popup/set-password.component.html b/apps/browser/src/auth/popup/set-password.component.html deleted file mode 100644 index 71a2e3ac588..00000000000 --- a/apps/browser/src/auth/popup/set-password.component.html +++ /dev/null @@ -1,160 +0,0 @@ -
-
-
- -
-

- {{ "setMasterPassword" | i18n }} -

-
- -
-
-
-
- -
-
-
-

- {{ "orgPermissionsUpdatedMustSetPassword" | i18n }} -

- - -

{{ "orgRequiresYouToSetPassword" | i18n }}

-
- - - {{ "resetPasswordAutoEnrollInviteWarning" | i18n }} - - - -
-
-
-
-
-
- - -
-
- -
-
- - - -
-
- -
-
-
-
-
-
- - -
-
- -
-
-
-
-
-
-
-
- - -
-
- -
-
-
-
diff --git a/apps/browser/src/auth/popup/set-password.component.ts b/apps/browser/src/auth/popup/set-password.component.ts deleted file mode 100644 index 2a796854531..00000000000 --- a/apps/browser/src/auth/popup/set-password.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from "@angular/core"; - -import { SetPasswordComponent as BaseSetPasswordComponent } from "@bitwarden/angular/auth/components/set-password.component"; - -@Component({ - selector: "app-set-password", - templateUrl: "set-password.component.html", - standalone: false, -}) -export class SetPasswordComponent extends BaseSetPasswordComponent {} diff --git a/apps/browser/src/auth/popup/settings/account-security.component.html b/apps/browser/src/auth/popup/settings/account-security.component.html index d835497d9be..3de1cc81a69 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.html +++ b/apps/browser/src/auth/popup/settings/account-security.component.html @@ -102,6 +102,18 @@ + + +

{{ "manageDevices" | i18n }}

+
+ + + +
+

{{ "otherOptions" | i18n }}

diff --git a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts index 56b18068778..014f2a7638b 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.spec.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.spec.ts @@ -5,7 +5,6 @@ import { mock } from "jest-mock-extended"; import { firstValueFrom, of } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; -import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; @@ -13,6 +12,7 @@ import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; +import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { VaultTimeoutSettingsService, VaultTimeoutService, @@ -25,6 +25,7 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { MessageSender } from "@bitwarden/common/platform/messaging"; import { Utils } from "@bitwarden/common/platform/misc/utils"; import { StateProvider } from "@bitwarden/common/platform/state"; @@ -34,13 +35,14 @@ import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.servi import { DialogService, ToastService } from "@bitwarden/components"; import { BiometricStateService, BiometricsService, KeyService } from "@bitwarden/key-management"; +import { BrowserApi } from "../../../platform/browser/browser-api"; +import BrowserPopupUtils from "../../../platform/browser/browser-popup-utils"; import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; import { PopupRouterCacheService } from "../../../platform/popup/view-cache/popup-router-cache.service"; import { AccountSecurityComponent } from "./account-security.component"; @Component({ - standalone: true, selector: "app-pop-out", template: ` `, }) @@ -56,6 +58,10 @@ describe("AccountSecurityComponent", () => { const biometricStateService = mock(); const policyService = mock(); const pinServiceAbstraction = mock(); + const keyService = mock(); + const validationService = mock(); + const dialogService = mock(); + const platformUtilsService = mock(); beforeEach(async () => { await TestBed.configureTestingModule({ @@ -64,13 +70,13 @@ describe("AccountSecurityComponent", () => { { provide: AccountSecurityComponent, useValue: mock() }, { provide: BiometricsService, useValue: mock() }, { provide: BiometricStateService, useValue: biometricStateService }, - { provide: DialogService, useValue: mock() }, + { provide: DialogService, useValue: dialogService }, { provide: EnvironmentService, useValue: mock() }, { provide: I18nService, useValue: mock() }, { provide: MessageSender, useValue: mock() }, - { provide: KeyService, useValue: mock() }, + { provide: KeyService, useValue: keyService }, { provide: PinServiceAbstraction, useValue: pinServiceAbstraction }, - { provide: PlatformUtilsService, useValue: mock() }, + { provide: PlatformUtilsService, useValue: platformUtilsService }, { provide: PolicyService, useValue: policyService }, { provide: PopupRouterCacheService, useValue: mock() }, { provide: StateService, useValue: mock() }, @@ -85,14 +91,17 @@ describe("AccountSecurityComponent", () => { { provide: OrganizationService, useValue: mock() }, { provide: CollectionService, useValue: mock() }, { provide: ConfigService, useValue: mock() }, + { provide: ValidationService, useValue: validationService }, ], }) .overrideComponent(AccountSecurityComponent, { remove: { imports: [PopOutComponent], + providers: [DialogService], }, add: { imports: [MockPopOutComponent], + providers: [{ provide: DialogService, useValue: dialogService }], }, }) .compileComponents(); @@ -107,10 +116,17 @@ describe("AccountSecurityComponent", () => { vaultTimeoutSettingsService.getVaultTimeoutActionByUserId$.mockReturnValue( of(VaultTimeoutAction.Lock), ); + vaultTimeoutSettingsService.getVaultTimeoutActionByUserId$.mockReturnValue( + of(VaultTimeoutAction.Lock), + ); biometricStateService.promptAutomatically$ = of(false); pinServiceAbstraction.isPinSet.mockResolvedValue(false); }); + afterEach(() => { + jest.resetAllMocks(); + }); + it("pin enabled when RemoveUnlockWithPin policy is not set", async () => { // @ts-strict-ignore policyService.policiesByType$.mockReturnValue(of([null])); @@ -212,4 +228,136 @@ describe("AccountSecurityComponent", () => { const pinInputElement = fixture.debugElement.query(By.css("#pin")); expect(pinInputElement).toBeNull(); }); + + describe("updateBiometric", () => { + let browserApiSpy: jest.SpyInstance; + + beforeEach(() => { + policyService.policiesByType$.mockReturnValue(of([null])); + browserApiSpy = jest.spyOn(BrowserApi, "requestPermission"); + browserApiSpy.mockResolvedValue(true); + }); + + describe("updating to false", () => { + it("calls biometricStateService methods with false when false", async () => { + await component.ngOnInit(); + await component.updateBiometric(false); + + expect(biometricStateService.setBiometricUnlockEnabled).toHaveBeenCalledWith(false); + expect(biometricStateService.setFingerprintValidated).toHaveBeenCalledWith(false); + }); + }); + + describe("updating to true", () => { + let trySetupBiometricsSpy: jest.SpyInstance; + + beforeEach(() => { + trySetupBiometricsSpy = jest.spyOn(component, "trySetupBiometrics"); + }); + + it("displays permission error dialog when nativeMessaging permission is not granted", async () => { + browserApiSpy.mockResolvedValue(false); + + await component.ngOnInit(); + await component.updateBiometric(true); + + expect(dialogService.openSimpleDialog).toHaveBeenCalledWith({ + title: { key: "nativeMessaginPermissionErrorTitle" }, + content: { key: "nativeMessaginPermissionErrorDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + type: "danger", + }); + expect(component.form.controls.biometric.value).toBe(false); + expect(trySetupBiometricsSpy).not.toHaveBeenCalled(); + }); + + it("displays a specific sidebar dialog when nativeMessaging permissions throws an error on firefox + sidebar", async () => { + browserApiSpy.mockRejectedValue(new Error("Permission denied")); + platformUtilsService.isFirefox.mockReturnValue(true); + jest.spyOn(BrowserPopupUtils, "inSidebar").mockReturnValue(true); + + await component.ngOnInit(); + await component.updateBiometric(true); + + expect(dialogService.openSimpleDialog).toHaveBeenCalledWith({ + title: { key: "nativeMessaginPermissionSidebarTitle" }, + content: { key: "nativeMessaginPermissionSidebarDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + type: "info", + }); + expect(component.form.controls.biometric.value).toBe(false); + expect(trySetupBiometricsSpy).not.toHaveBeenCalled(); + }); + + test.each([ + [false, false], + [false, true], + [true, false], + ])( + "displays a generic dialog when nativeMessaging permissions throws an error and isFirefox is %s and onSidebar is %s", + async (isFirefox, inSidebar) => { + browserApiSpy.mockRejectedValue(new Error("Permission denied")); + platformUtilsService.isFirefox.mockReturnValue(isFirefox); + jest.spyOn(BrowserPopupUtils, "inSidebar").mockReturnValue(inSidebar); + + await component.ngOnInit(); + await component.updateBiometric(true); + + expect(dialogService.openSimpleDialog).toHaveBeenCalledWith({ + title: { key: "nativeMessaginPermissionErrorTitle" }, + content: { key: "nativeMessaginPermissionErrorDesc" }, + acceptButtonText: { key: "ok" }, + cancelButtonText: null, + type: "danger", + }); + expect(component.form.controls.biometric.value).toBe(false); + expect(trySetupBiometricsSpy).not.toHaveBeenCalled(); + }, + ); + + it("refreshes additional keys and attempts to setup biometrics when enabled with nativeMessaging permission", async () => { + const setupBiometricsResult = true; + trySetupBiometricsSpy.mockResolvedValue(setupBiometricsResult); + + await component.ngOnInit(); + await component.updateBiometric(true); + + expect(keyService.refreshAdditionalKeys).toHaveBeenCalledWith(mockUserId); + expect(biometricStateService.setBiometricUnlockEnabled).toHaveBeenCalledWith( + setupBiometricsResult, + ); + expect(component.form.controls.biometric.value).toBe(setupBiometricsResult); + }); + + it("handles failed biometrics setup", async () => { + const setupBiometricsResult = false; + trySetupBiometricsSpy.mockResolvedValue(setupBiometricsResult); + + await component.ngOnInit(); + await component.updateBiometric(true); + + expect(biometricStateService.setBiometricUnlockEnabled).toHaveBeenCalledWith( + setupBiometricsResult, + ); + expect(biometricStateService.setFingerprintValidated).toHaveBeenCalledWith( + setupBiometricsResult, + ); + expect(component.form.controls.biometric.value).toBe(setupBiometricsResult); + }); + + it("handles error during biometrics setup", async () => { + // Simulate an error during biometrics setup + keyService.refreshAdditionalKeys.mockRejectedValue(new Error("UserId is required")); + + await component.ngOnInit(); + await component.updateBiometric(true); + + expect(validationService.showError).toHaveBeenCalledWith(new Error("UserId is required")); + expect(component.form.controls.biometric.value).toBe(false); + expect(trySetupBiometricsSpy).not.toHaveBeenCalled(); + }); + }); + }); }); diff --git a/apps/browser/src/auth/popup/settings/account-security.component.ts b/apps/browser/src/auth/popup/settings/account-security.component.ts index 26a805b3624..b41cfe14c4f 100644 --- a/apps/browser/src/auth/popup/settings/account-security.component.ts +++ b/apps/browser/src/auth/popup/settings/account-security.component.ts @@ -25,13 +25,14 @@ import { JslibModule } from "@bitwarden/angular/jslib.module"; import { NudgesService, NudgeType } from "@bitwarden/angular/vault"; import { SpotlightComponent } from "@bitwarden/angular/vault/components/spotlight/spotlight.component"; import { FingerprintDialogComponent, VaultTimeoutInputComponent } from "@bitwarden/auth/angular"; -import { PinServiceAbstraction } from "@bitwarden/auth/common"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { getFirstPolicy } from "@bitwarden/common/admin-console/services/policy/default-policy.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; +import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; +import { PinServiceAbstraction } from "@bitwarden/common/key-management/pin/pin.service.abstraction"; import { VaultTimeout, VaultTimeoutAction, @@ -40,11 +41,13 @@ import { VaultTimeoutSettingsService, VaultTimeoutStringType, } from "@bitwarden/common/key-management/vault-timeout"; +import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; +import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service"; import { DialogRef, CardComponent, @@ -69,7 +72,7 @@ import { import { BiometricErrors, BiometricErrorTypes } from "../../../models/biometricErrors"; import { BrowserApi } from "../../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../../platform/browser/browser-popup-utils"; import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; @@ -79,7 +82,6 @@ import { AwaitDesktopDialogComponent } from "./await-desktop-dialog.component"; @Component({ templateUrl: "account-security.component.html", - standalone: true, imports: [ CardComponent, CheckboxModule, @@ -113,6 +115,7 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { biometricUnavailabilityReason: string; showChangeMasterPass = true; pinEnabled$: Observable = of(true); + extensionLoginApprovalFlagEnabled = false; form = this.formBuilder.group({ vaultTimeout: [null as VaultTimeout | null], @@ -154,6 +157,8 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { private toastService: ToastService, private biometricsService: BiometricsService, private vaultNudgesService: NudgesService, + private validationService: ValidationService, + private configService: ConfigService, ) {} async ngOnInit() { @@ -234,6 +239,10 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { }; this.form.patchValue(initialValues, { emitEvent: false }); + this.extensionLoginApprovalFlagEnabled = await this.configService.getFeatureFlag( + FeatureFlag.PM14938_BrowserExtensionLoginApproval, + ); + timer(0, 1000) .pipe( switchMap(async () => { @@ -473,12 +482,14 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { this.form.controls.pin.setValue(userHasPinSet, { emitEvent: false }); const requireReprompt = (await this.pinService.getPinLockType(userId)) == "EPHEMERAL"; this.form.controls.pinLockWithMasterPassword.setValue(requireReprompt, { emitEvent: false }); - this.toastService.showToast({ - variant: "success", - title: null, - message: this.i18nService.t("unlockPinSet"), - }); - await this.vaultNudgesService.dismissNudge(NudgeType.AccountSecurity, userId); + if (userHasPinSet) { + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("unlockPinSet"), + }); + await this.vaultNudgesService.dismissNudge(NudgeType.AccountSecurity, userId); + } } else { const userId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); await this.vaultTimeoutSettingsService.clear(userId); @@ -521,13 +532,25 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { return; } - await this.keyService.refreshAdditionalKeys(); + try { + const userId = await firstValueFrom(this.accountService.activeAccount$.pipe(getUserId)); + await this.keyService.refreshAdditionalKeys(userId); - const successful = await this.trySetupBiometrics(); - this.form.controls.biometric.setValue(successful); - await this.biometricStateService.setBiometricUnlockEnabled(successful); - if (!successful) { - await this.biometricStateService.setFingerprintValidated(false); + const successful = await this.trySetupBiometrics(); + this.form.controls.biometric.setValue(successful); + await this.biometricStateService.setBiometricUnlockEnabled(successful); + if (!successful) { + await this.biometricStateService.setFingerprintValidated(false); + return; + } + this.toastService.showToast({ + variant: "success", + title: null, + message: this.i18nService.t("unlockWithBiometricSet"), + }); + } catch (error) { + this.form.controls.biometric.setValue(false); + this.validationService.showError(error); } } else { await this.biometricStateService.setBiometricUnlockEnabled(false); @@ -583,6 +606,8 @@ export class AccountSecurityComponent implements OnInit, OnDestroy { this.i18nService.t("errorEnableBiometricTitle"), this.i18nService.t("errorEnableBiometricDesc"), ); + setupResult = false; + return; } setupResult = true; } catch (e) { diff --git a/apps/browser/src/auth/popup/settings/await-desktop-dialog.component.ts b/apps/browser/src/auth/popup/settings/await-desktop-dialog.component.ts index f7c4351dec3..11bb9683bb9 100644 --- a/apps/browser/src/auth/popup/settings/await-desktop-dialog.component.ts +++ b/apps/browser/src/auth/popup/settings/await-desktop-dialog.component.ts @@ -5,7 +5,6 @@ import { ButtonModule, DialogModule, DialogService } from "@bitwarden/components @Component({ templateUrl: "await-desktop-dialog.component.html", - standalone: true, imports: [JslibModule, ButtonModule, DialogModule], }) export class AwaitDesktopDialogComponent { diff --git a/apps/browser/src/auth/popup/settings/extension-device-management.component.html b/apps/browser/src/auth/popup/settings/extension-device-management.component.html new file mode 100644 index 00000000000..aadbe6b81d0 --- /dev/null +++ b/apps/browser/src/auth/popup/settings/extension-device-management.component.html @@ -0,0 +1,11 @@ + + + + + + + +
+ +
+
diff --git a/apps/browser/src/auth/popup/settings/extension-device-management.component.ts b/apps/browser/src/auth/popup/settings/extension-device-management.component.ts new file mode 100644 index 00000000000..793965db141 --- /dev/null +++ b/apps/browser/src/auth/popup/settings/extension-device-management.component.ts @@ -0,0 +1,22 @@ +import { Component } from "@angular/core"; + +import { DeviceManagementComponent } from "@bitwarden/angular/auth/device-management/device-management.component"; +import { I18nPipe } from "@bitwarden/ui-common"; + +import { PopOutComponent } from "../../../platform/popup/components/pop-out.component"; +import { PopupHeaderComponent } from "../../../platform/popup/layout/popup-header.component"; +import { PopupPageComponent } from "../../../platform/popup/layout/popup-page.component"; + +@Component({ + standalone: true, + selector: "extension-device-management", + templateUrl: "extension-device-management.component.html", + imports: [ + DeviceManagementComponent, + I18nPipe, + PopOutComponent, + PopupHeaderComponent, + PopupPageComponent, + ], +}) +export class ExtensionDeviceManagementComponent {} diff --git a/apps/browser/src/auth/popup/settings/vault-timeout-input.component.html b/apps/browser/src/auth/popup/settings/vault-timeout-input.component.html deleted file mode 100644 index c62f29130bf..00000000000 --- a/apps/browser/src/auth/popup/settings/vault-timeout-input.component.html +++ /dev/null @@ -1,44 +0,0 @@ -
-
- - -
-
-
-
-
- - -
-
-
-
- - -
-
-
-
-
diff --git a/apps/browser/src/auth/popup/settings/vault-timeout-input.component.ts b/apps/browser/src/auth/popup/settings/vault-timeout-input.component.ts deleted file mode 100644 index 25a4d01333d..00000000000 --- a/apps/browser/src/auth/popup/settings/vault-timeout-input.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component } from "@angular/core"; -import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from "@angular/forms"; - -import { VaultTimeoutInputComponent as VaultTimeoutInputComponentBase } from "@bitwarden/auth/angular"; - -@Component({ - selector: "app-vault-timeout-input", - templateUrl: "vault-timeout-input.component.html", - providers: [ - { - provide: NG_VALUE_ACCESSOR, - multi: true, - useExisting: VaultTimeoutInputComponent, - }, - { - provide: NG_VALIDATORS, - multi: true, - useExisting: VaultTimeoutInputComponent, - }, - ], - standalone: false, -}) -export class VaultTimeoutInputComponent extends VaultTimeoutInputComponentBase {} diff --git a/apps/browser/src/auth/popup/update-temp-password.component.html b/apps/browser/src/auth/popup/update-temp-password.component.html deleted file mode 100644 index 0ce82aa20cf..00000000000 --- a/apps/browser/src/auth/popup/update-temp-password.component.html +++ /dev/null @@ -1,142 +0,0 @@ -
-
-
- -
-

- {{ "updateMasterPassword" | i18n }} -

-
- -
-
-
- - {{ masterPasswordWarningText }} - - - -
-
-
-
-
- - -
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- - -
-
-
-
-
-
-
- - -
-
- -
-
-
-
-
-
-
- - -
-
- -
-
-
diff --git a/apps/browser/src/auth/popup/update-temp-password.component.ts b/apps/browser/src/auth/popup/update-temp-password.component.ts deleted file mode 100644 index e8cf64b7548..00000000000 --- a/apps/browser/src/auth/popup/update-temp-password.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component } from "@angular/core"; -import { firstValueFrom } from "rxjs"; - -import { UpdateTempPasswordComponent as BaseUpdateTempPasswordComponent } from "@bitwarden/angular/auth/components/update-temp-password.component"; - -import { postLogoutMessageListener$ } from "./utils/post-logout-message-listener"; - -@Component({ - selector: "app-update-temp-password", - templateUrl: "update-temp-password.component.html", - standalone: false, -}) -export class UpdateTempPasswordComponent extends BaseUpdateTempPasswordComponent { - onSuccessfulChangePassword: () => Promise = this.doOnSuccessfulChangePassword.bind(this); - - private async doOnSuccessfulChangePassword() { - // start listening for "switchAccountFinish" or "doneLoggingOut" - const messagePromise = firstValueFrom(postLogoutMessageListener$); - this.messagingService.send("logout"); - // wait for messages - const command = await messagePromise; - - // doneLoggingOut already has a message handler that will navigate us - if (command === "switchAccountFinish") { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.router.navigate(["/"]); - } - } -} diff --git a/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts b/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts index b2c20ba2849..af850c9a7bc 100644 --- a/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts +++ b/apps/browser/src/auth/popup/utils/auth-popout-window.spec.ts @@ -1,6 +1,6 @@ import { createChromeTabMock } from "../../../autofill/spec/autofill-mocks"; import { BrowserApi } from "../../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../../platform/browser/browser-popup-utils"; import { AuthPopoutType, diff --git a/apps/browser/src/auth/popup/utils/auth-popout-window.ts b/apps/browser/src/auth/popup/utils/auth-popout-window.ts index 0646b684b22..0611891b61e 100644 --- a/apps/browser/src/auth/popup/utils/auth-popout-window.ts +++ b/apps/browser/src/auth/popup/utils/auth-popout-window.ts @@ -1,7 +1,7 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore import { BrowserApi } from "../../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../../platform/browser/browser-popup-utils"; const AuthPopoutType = { unlockExtension: "auth_unlockExtension", diff --git a/apps/browser/src/auth/services/auth-status-badge-updater.service.ts b/apps/browser/src/auth/services/auth-status-badge-updater.service.ts new file mode 100644 index 00000000000..4205ebc665d --- /dev/null +++ b/apps/browser/src/auth/services/auth-status-badge-updater.service.ts @@ -0,0 +1,56 @@ +import { mergeMap, of, switchMap } from "rxjs"; + +import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; +import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; + +import { BadgeService } from "../../platform/badge/badge.service"; +import { BadgeIcon } from "../../platform/badge/icon"; +import { BadgeStatePriority } from "../../platform/badge/priority"; +import { Unset } from "../../platform/badge/state"; + +const StateName = "auth-status"; + +export class AuthStatusBadgeUpdaterService { + constructor( + private badgeService: BadgeService, + private accountService: AccountService, + private authService: AuthService, + ) { + this.accountService.activeAccount$ + .pipe( + switchMap((account) => + account + ? this.authService.authStatusFor$(account.id) + : of(AuthenticationStatus.LoggedOut), + ), + mergeMap(async (authStatus) => { + switch (authStatus) { + case AuthenticationStatus.LoggedOut: { + await this.badgeService.setState(StateName, BadgeStatePriority.High, { + icon: BadgeIcon.LoggedOut, + backgroundColor: Unset, + text: Unset, + }); + break; + } + case AuthenticationStatus.Locked: { + await this.badgeService.setState(StateName, BadgeStatePriority.High, { + icon: BadgeIcon.Locked, + backgroundColor: Unset, + text: Unset, + }); + break; + } + case AuthenticationStatus.Unlocked: { + await this.badgeService.setState(StateName, BadgeStatePriority.Low, { + icon: BadgeIcon.Unlocked, + }); + break; + } + } + }), + ) + .subscribe(); + } +} diff --git a/apps/browser/src/auth/services/extension-device-management-component.service.ts b/apps/browser/src/auth/services/extension-device-management-component.service.ts new file mode 100644 index 00000000000..2585ba3198c --- /dev/null +++ b/apps/browser/src/auth/services/extension-device-management-component.service.ts @@ -0,0 +1,15 @@ +import { DeviceManagementComponentServiceAbstraction } from "@bitwarden/angular/auth/device-management/device-management-component.service.abstraction"; + +/** + * Browser extension implementation of the device management component service + */ +export class ExtensionDeviceManagementComponentService + implements DeviceManagementComponentServiceAbstraction +{ + /** + * Don't show header information in browser extension client + */ + showHeaderInformation(): boolean { + return false; + } +} diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts index 2247328acab..52b2e1bf4c5 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.spec.ts @@ -13,7 +13,7 @@ jest.mock("../popup/utils/auth-popout-window", () => { }; }); -jest.mock("../../platform/popup/browser-popup-utils", () => ({ +jest.mock("../../platform/browser/browser-popup-utils", () => ({ inSingleActionPopout: jest.fn(), inPopout: jest.fn(), })); @@ -22,7 +22,9 @@ import { DuoLaunchAction } from "@bitwarden/auth/angular"; import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { BrowserApi } from "../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../platform/browser/browser-popup-utils"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { AuthPopoutType, closeSsoAuthResultPopout, diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts index f768b223984..154abe13448 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-component.service.ts @@ -6,7 +6,9 @@ import { import { TwoFactorProviderType } from "@bitwarden/common/auth/enums/two-factor-provider-type"; import { BrowserApi } from "../../platform/browser/browser-api"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; +import BrowserPopupUtils from "../../platform/browser/browser-popup-utils"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { AuthPopoutType, closeSsoAuthResultPopout, diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-duo-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-duo-component.service.ts index 594e09fc50c..8fa72cdfc6c 100644 --- a/apps/browser/src/auth/services/extension-two-factor-auth-duo-component.service.ts +++ b/apps/browser/src/auth/services/extension-two-factor-auth-duo-component.service.ts @@ -5,6 +5,8 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openTwoFactorAuthDuoPopout } from "../../auth/popup/utils/auth-popout-window"; import { ZonedMessageListenerService } from "../../platform/browser/zoned-message-listener.service"; diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts deleted file mode 100644 index 01a0129d0e5..00000000000 --- a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.spec.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { MockProxy, mock } from "jest-mock-extended"; - -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { DialogService } from "@bitwarden/components"; - -// Must mock modules before importing -jest.mock("../popup/utils/auth-popout-window", () => { - const originalModule = jest.requireActual("../popup/utils/auth-popout-window"); - - return { - ...originalModule, // avoid losing the original module's exports - openTwoFactorAuthEmailPopout: jest.fn(), - }; -}); - -jest.mock("../../platform/popup/browser-popup-utils", () => ({ - inPopup: jest.fn(), -})); - -import { openTwoFactorAuthEmailPopout } from "../../auth/popup/utils/auth-popout-window"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; - -import { ExtensionTwoFactorAuthEmailComponentService } from "./extension-two-factor-auth-email-component.service"; - -describe("ExtensionTwoFactorAuthEmailComponentService", () => { - let extensionTwoFactorAuthEmailComponentService: ExtensionTwoFactorAuthEmailComponentService; - - let dialogService: MockProxy; - let window: MockProxy; - let configService: MockProxy; - - beforeEach(() => { - jest.clearAllMocks(); - - dialogService = mock(); - window = mock(); - configService = mock(); - - extensionTwoFactorAuthEmailComponentService = new ExtensionTwoFactorAuthEmailComponentService( - dialogService, - window, - configService, - ); - }); - - describe("openPopoutIfApprovedForEmail2fa", () => { - it("should open a popout if the user confirms the warning to popout the extension when in the popup", async () => { - // Arrange - configService.getFeatureFlag.mockResolvedValue(false); - dialogService.openSimpleDialog.mockResolvedValue(true); - - jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(true); - - // Act - await extensionTwoFactorAuthEmailComponentService.openPopoutIfApprovedForEmail2fa(); - - // Assert - expect(dialogService.openSimpleDialog).toHaveBeenCalledWith({ - title: { key: "warning" }, - content: { key: "popup2faCloseMessage" }, - type: "warning", - }); - - expect(openTwoFactorAuthEmailPopout).toHaveBeenCalled(); - }); - - it("should not open a popout if the user cancels the warning to popout the extension when in the popup", async () => { - // Arrange - configService.getFeatureFlag.mockResolvedValue(false); - dialogService.openSimpleDialog.mockResolvedValue(false); - - jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(true); - - // Act - await extensionTwoFactorAuthEmailComponentService.openPopoutIfApprovedForEmail2fa(); - - // Assert - expect(dialogService.openSimpleDialog).toHaveBeenCalledWith({ - title: { key: "warning" }, - content: { key: "popup2faCloseMessage" }, - type: "warning", - }); - - expect(openTwoFactorAuthEmailPopout).not.toHaveBeenCalled(); - }); - - it("should not open a popout if not in the popup", async () => { - // Arrange - configService.getFeatureFlag.mockResolvedValue(false); - jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(false); - - // Act - await extensionTwoFactorAuthEmailComponentService.openPopoutIfApprovedForEmail2fa(); - - // Assert - expect(dialogService.openSimpleDialog).not.toHaveBeenCalled(); - expect(openTwoFactorAuthEmailPopout).not.toHaveBeenCalled(); - }); - - it("does not prompt or open a popout if the feature flag is enabled", async () => { - configService.getFeatureFlag.mockResolvedValue(true); - jest.spyOn(BrowserPopupUtils, "inPopup").mockReturnValue(true); - - await extensionTwoFactorAuthEmailComponentService.openPopoutIfApprovedForEmail2fa(); - - expect(dialogService.openSimpleDialog).not.toHaveBeenCalled(); - expect(openTwoFactorAuthEmailPopout).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts b/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts deleted file mode 100644 index 293d88c4e64..00000000000 --- a/apps/browser/src/auth/services/extension-two-factor-auth-email-component.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - DefaultTwoFactorAuthEmailComponentService, - TwoFactorAuthEmailComponentService, -} from "@bitwarden/auth/angular"; -import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; -import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; -import { DialogService } from "@bitwarden/components"; - -import { openTwoFactorAuthEmailPopout } from "../../auth/popup/utils/auth-popout-window"; -import BrowserPopupUtils from "../../platform/popup/browser-popup-utils"; - -// TODO: popup state persistence should eventually remove the need for this service -export class ExtensionTwoFactorAuthEmailComponentService - extends DefaultTwoFactorAuthEmailComponentService - implements TwoFactorAuthEmailComponentService -{ - constructor( - private dialogService: DialogService, - private window: Window, - private configService: ConfigService, - ) { - super(); - } - - async openPopoutIfApprovedForEmail2fa(): Promise { - const isTwoFactorFormPersistenceEnabled = await this.configService.getFeatureFlag( - FeatureFlag.PM9115_TwoFactorExtensionDataPersistence, - ); - - if (isTwoFactorFormPersistenceEnabled) { - // If the feature flag is enabled, we don't need to prompt the user to open the popout - return; - } - - if (BrowserPopupUtils.inPopup(this.window)) { - const confirmed = await this.dialogService.openSimpleDialog({ - title: { key: "warning" }, - content: { key: "popup2faCloseMessage" }, - type: "warning", - }); - if (confirmed) { - await openTwoFactorAuthEmailPopout(); - this.window.close(); - } - } - } -} diff --git a/apps/browser/src/autofill/background/abstractions/notification.background.ts b/apps/browser/src/autofill/background/abstractions/notification.background.ts index 6a8b898ad38..43a49aff7f0 100644 --- a/apps/browser/src/autofill/background/abstractions/notification.background.ts +++ b/apps/browser/src/autofill/background/abstractions/notification.background.ts @@ -40,7 +40,7 @@ export interface TempNotificationQueueMessage { interface AddChangePasswordQueueMessage extends NotificationQueueMessage { type: "change"; - cipherId: string; + cipherId: CipherView["id"]; newPassword: string; } @@ -100,12 +100,6 @@ type AdjustNotificationBarMessageData = { height: number; }; -type ChangePasswordMessageData = { - currentPassword: string; - newPassword: string; - url: string; -}; - type AddLoginMessageData = { username: string; password: string; diff --git a/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts b/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts index 0ec6a9ae04a..71452ec975a 100644 --- a/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts +++ b/apps/browser/src/autofill/background/abstractions/overlay-notifications.background.ts @@ -1,3 +1,6 @@ +import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { SecurityTask } from "@bitwarden/common/vault/tasks"; + import AutofillPageDetails from "../../models/autofill-page-details"; export type NotificationTypeData = { @@ -8,6 +11,12 @@ export type NotificationTypeData = { launchTimestamp?: number; }; +export type LoginSecurityTaskInfo = { + securityTask: SecurityTask; + cipher: CipherView; + uri: ModifyLoginCipherFormData["uri"]; +}; + export type WebsiteOriginsWithFields = Map>; export type ActiveFormSubmissionRequests = Set; @@ -19,19 +28,12 @@ export type ModifyLoginCipherFormData = { newPassword: string; }; -export type ModifyLoginCipherFormDataForTab = Map< - chrome.tabs.Tab["id"], - { uri: string; username: string; password: string; newPassword: string } ->; +export type ModifyLoginCipherFormDataForTab = Map; export type OverlayNotificationsExtensionMessage = { command: string; - uri?: string; - username?: string; - password?: string; - newPassword?: string; details?: AutofillPageDetails; -}; +} & ModifyLoginCipherFormData; type OverlayNotificationsMessageParams = { message: OverlayNotificationsExtensionMessage }; type OverlayNotificationSenderParams = { sender: chrome.runtime.MessageSender }; diff --git a/apps/browser/src/autofill/background/abstractions/overlay.background.ts b/apps/browser/src/autofill/background/abstractions/overlay.background.ts index 6ad9b8e06fd..75f2659c9df 100644 --- a/apps/browser/src/autofill/background/abstractions/overlay.background.ts +++ b/apps/browser/src/autofill/background/abstractions/overlay.background.ts @@ -4,7 +4,7 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; -import { InlineMenuFillTypes } from "../../enums/autofill-overlay.enum"; +import { InlineMenuFillType } from "../../enums/autofill-overlay.enum"; import AutofillPageDetails from "../../models/autofill-page-details"; import { PageDetail } from "../../services/abstractions/autofill.service"; @@ -43,7 +43,7 @@ export type UpdateOverlayCiphersParams = { export type FocusedFieldData = { focusedFieldStyles: Partial; focusedFieldRects: Partial; - inlineMenuFillType?: InlineMenuFillTypes; + inlineMenuFillType?: InlineMenuFillType; tabId?: number; frameId?: number; accountCreationFieldType?: string; @@ -245,6 +245,7 @@ export type OverlayBackgroundExtensionMessageHandlers = { editedCipher: () => void; deletedCipher: () => void; bgSaveCipher: () => void; + updateOverlayCiphers: () => void; fido2AbortRequest: ({ message, sender }: BackgroundOnMessageHandlerParams) => void; }; diff --git a/apps/browser/src/autofill/background/auto-submit-login.background.ts b/apps/browser/src/autofill/background/auto-submit-login.background.ts index dcafe21b63c..dfdfa0f4d67 100644 --- a/apps/browser/src/autofill/background/auto-submit-login.background.ts +++ b/apps/browser/src/autofill/background/auto-submit-login.background.ts @@ -1,12 +1,12 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { firstValueFrom, switchMap } from "rxjs"; +import { filter, firstValueFrom, of, switchMap } from "rxjs"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { Policy } from "@bitwarden/common/admin-console/models/domain/policy"; import { getFirstPolicy } from "@bitwarden/common/admin-console/services/policy/default-policy.service"; -import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; +import { Account, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { getUserId } from "@bitwarden/common/auth/services/account.service"; @@ -51,9 +51,14 @@ export class AutoSubmitLoginBackground implements AutoSubmitLoginBackgroundAbstr * Initializes the auto-submit login policy. If the policy is not enabled, it * will trigger a removal of any established listeners. */ + async init() { - this.accountService.activeAccount$ + this.authService.activeAccountStatus$ .pipe( + switchMap((value) => + value === AuthenticationStatus.Unlocked ? this.accountService.activeAccount$ : of(null), + ), + filter((account): account is Account => account !== null), getUserId, switchMap((userId) => this.policyService.policiesByType$(PolicyType.AutomaticAppLogIn, userId), diff --git a/apps/browser/src/autofill/background/notification.background.spec.ts b/apps/browser/src/autofill/background/notification.background.spec.ts index 7669a9aaf52..f228884246a 100644 --- a/apps/browser/src/autofill/background/notification.background.spec.ts +++ b/apps/browser/src/autofill/background/notification.background.spec.ts @@ -3,17 +3,18 @@ import { BehaviorSubject, firstValueFrom, of } from "rxjs"; import { CollectionService } from "@bitwarden/admin-console/common"; import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction"; -import { DefaultPolicyService } from "@bitwarden/common/admin-console/services/policy/default-policy.service"; +import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { AccountInfo, AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { AuthService } from "@bitwarden/common/auth/services/auth.service"; import { ExtensionCommand } from "@bitwarden/common/autofill/constants"; import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service"; -import { UserNotificationSettingsService } from "@bitwarden/common/autofill/services/user-notification-settings.service"; +import { UserNotificationSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/user-notification-settings.service"; import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service"; import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service"; import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; +import { ThemeTypes } from "@bitwarden/common/platform/enums"; import { SelfHostedEnvironment } from "@bitwarden/common/platform/services/default-environment.service"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { UserId } from "@bitwarden/common/types/guid"; @@ -41,6 +42,7 @@ import { NotificationBackgroundExtensionMessage, UnlockVaultMessageData, } from "./abstractions/notification.background"; +import { ModifyLoginCipherFormData } from "./abstractions/overlay-notifications.background"; import NotificationBackground from "./notification.background"; jest.mock("rxjs", () => { @@ -61,13 +63,21 @@ describe("NotificationBackground", () => { const collectionService = mock(); let activeAccountStatusMock$: BehaviorSubject; let authService: MockProxy; - const policyService = mock(); + const policyAppliesToUser$ = new BehaviorSubject(true); + const policyService = mock({ + policyAppliesToUser$: jest.fn().mockReturnValue(policyAppliesToUser$), + }); const folderService = mock(); - const userNotificationSettingsService = mock(); + const enableChangedPasswordPromptMock$ = new BehaviorSubject(true); + const userNotificationSettingsService = mock(); + userNotificationSettingsService.enableChangedPasswordPrompt$ = enableChangedPasswordPromptMock$; + const domainSettingsService = mock(); const environmentService = mock(); const logService = mock(); + const selectedThemeMock$ = new BehaviorSubject(ThemeTypes.Light); const themeStateService = mock(); + themeStateService.selectedTheme$ = selectedThemeMock$; const configService = mock(); const accountService = mock(); const organizationService = mock(); @@ -167,7 +177,7 @@ describe("NotificationBackground", () => { }); }); - describe("notification bar extension message handlers", () => { + describe("notification bar extension message handlers and triggers", () => { beforeEach(() => { notificationBackground.init(); }); @@ -288,7 +298,12 @@ describe("NotificationBackground", () => { let pushAddLoginToQueueSpy: jest.SpyInstance; let pushChangePasswordToQueueSpy: jest.SpyInstance; let getAllDecryptedForUrlSpy: jest.SpyInstance; - + const mockModifyLoginCipherFormData: ModifyLoginCipherFormData = { + username: "test", + password: "password", + uri: "https://example.com", + newPassword: null, + }; beforeEach(() => { tab = createChromeTabMock(); sender = mock({ tab }); @@ -315,8 +330,7 @@ describe("NotificationBackground", () => { }; activeAccountStatusMock$.next(AuthenticationStatus.LoggedOut); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); expect(getEnableAddedLoginPromptSpy).not.toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).not.toHaveBeenCalled(); @@ -329,8 +343,7 @@ describe("NotificationBackground", () => { }; activeAccountStatusMock$.next(AuthenticationStatus.Locked); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); expect(getEnableAddedLoginPromptSpy).not.toHaveBeenCalled(); expect(pushAddLoginToQueueSpy).not.toHaveBeenCalled(); @@ -344,8 +357,7 @@ describe("NotificationBackground", () => { activeAccountStatusMock$.next(AuthenticationStatus.Locked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(false); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); expect(getEnableAddedLoginPromptSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).not.toHaveBeenCalled(); @@ -362,8 +374,7 @@ describe("NotificationBackground", () => { getEnableAddedLoginPromptSpy.mockReturnValueOnce(false); getAllDecryptedForUrlSpy.mockResolvedValueOnce([]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); expect(getEnableAddedLoginPromptSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); @@ -383,8 +394,7 @@ describe("NotificationBackground", () => { mock({ login: { username: "test", password: "oldPassword" } }), ]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); expect(getEnableAddedLoginPromptSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); @@ -404,8 +414,7 @@ describe("NotificationBackground", () => { mock({ login: { username: "test", password: "password" } }), ]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); expect(getEnableAddedLoginPromptSpy).toHaveBeenCalled(); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); @@ -422,10 +431,18 @@ describe("NotificationBackground", () => { activeAccountStatusMock$.next(AuthenticationStatus.Locked); getEnableAddedLoginPromptSpy.mockReturnValueOnce(true); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); - expect(pushAddLoginToQueueSpy).toHaveBeenCalledWith("example.com", login, sender.tab, true); + expect(pushAddLoginToQueueSpy).toHaveBeenCalledWith( + "example.com", + { + url: data.uri, + username: data.username, + password: data.password, + }, + sender.tab, + true, + ); }); it("adds the login to the queue if the user has an unlocked account and the login is new", async () => { @@ -444,10 +461,17 @@ describe("NotificationBackground", () => { mock({ login: { username: "anotherTestUsername", password: "password" } }), ]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); - expect(pushAddLoginToQueueSpy).toHaveBeenCalledWith("example.com", login, sender.tab); + expect(pushAddLoginToQueueSpy).toHaveBeenCalledWith( + "example.com", + { + url: data.uri, + username: data.username, + password: data.password, + }, + sender.tab, + ); }); it("adds a change password message to the queue if the user has changed an existing cipher's password", async () => { @@ -466,13 +490,12 @@ describe("NotificationBackground", () => { }), ]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerAddLoginNotification(data, tab); expect(pushChangePasswordToQueueSpy).toHaveBeenCalledWith( "cipher-id", "example.com", - login.password, + data.password, sender.tab, ); }); @@ -483,6 +506,12 @@ describe("NotificationBackground", () => { let sender: chrome.runtime.MessageSender; let pushChangePasswordToQueueSpy: jest.SpyInstance; let getAllDecryptedForUrlSpy: jest.SpyInstance; + const mockModifyLoginCipherFormData: ModifyLoginCipherFormData = { + username: null, + uri: null, + password: "currentPassword", + newPassword: "newPassword", + }; beforeEach(() => { tab = createChromeTabMock(); @@ -500,8 +529,7 @@ describe("NotificationBackground", () => { data: { newPassword: "newPassword", currentPassword: "currentPassword", url: "" }, }; - sendMockExtensionMessage(message); - await flushPromises(); + await notificationBackground.triggerChangedPasswordNotification(data, tab); expect(pushChangePasswordToQueueSpy).not.toHaveBeenCalled(); }); @@ -515,15 +543,15 @@ describe("NotificationBackground", () => { url: "https://example.com", }, }; + activeAccountStatusMock$.next(AuthenticationStatus.Locked); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerChangedPasswordNotification(data, tab); expect(pushChangePasswordToQueueSpy).toHaveBeenCalledWith( null, "example.com", - message.data?.newPassword, + data?.newPassword, sender.tab, true, ); @@ -542,9 +570,7 @@ describe("NotificationBackground", () => { getAllDecryptedForUrlSpy.mockResolvedValueOnce([ mock({ login: { username: "test", password: "password" } }), ]); - - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerChangedPasswordNotification(data, tab); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(pushChangePasswordToQueueSpy).not.toHaveBeenCalled(); @@ -565,8 +591,7 @@ describe("NotificationBackground", () => { mock({ login: { username: "test2", password: "password" } }), ]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerChangedPasswordNotification(data, tab); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(pushChangePasswordToQueueSpy).not.toHaveBeenCalled(); @@ -589,13 +614,12 @@ describe("NotificationBackground", () => { }), ]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerChangedPasswordNotification(data, tab); expect(pushChangePasswordToQueueSpy).toHaveBeenCalledWith( "cipher-id", "example.com", - message.data?.newPassword, + data?.newPassword, sender.tab, ); }); @@ -615,8 +639,7 @@ describe("NotificationBackground", () => { mock({ login: { username: "test2", password: "password" } }), ]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerChangedPasswordNotification(data, tab); expect(getAllDecryptedForUrlSpy).toHaveBeenCalled(); expect(pushChangePasswordToQueueSpy).not.toHaveBeenCalled(); @@ -639,13 +662,12 @@ describe("NotificationBackground", () => { }), ]); - sendMockExtensionMessage(message, sender); - await flushPromises(); + await notificationBackground.triggerChangedPasswordNotification(data, tab); expect(pushChangePasswordToQueueSpy).toHaveBeenCalledWith( "cipher-id", "example.com", - message.data?.newPassword, + data?.newPassword, sender.tab, ); }); diff --git a/apps/browser/src/autofill/background/notification.background.ts b/apps/browser/src/autofill/background/notification.background.ts index 0d921666d71..23d799b1a72 100644 --- a/apps/browser/src/autofill/background/notification.background.ts +++ b/apps/browser/src/autofill/background/notification.background.ts @@ -41,11 +41,15 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; import { TaskService } from "@bitwarden/common/vault/tasks"; -import { SecurityTaskType } from "@bitwarden/common/vault/tasks/enums"; +import { SecurityTaskStatus, SecurityTaskType } from "@bitwarden/common/vault/tasks/enums"; import { SecurityTask } from "@bitwarden/common/vault/tasks/models/security-task"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; import { BrowserApi } from "../../platform/browser/browser-api"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openAddEditVaultItemPopout, openViewVaultItemPopout, @@ -64,7 +68,6 @@ import { AddChangePasswordQueueMessage, AddLoginQueueMessage, AddUnlockVaultQueueMessage, - ChangePasswordMessageData, AddLoginMessageData, NotificationQueueMessageItem, LockedVaultPendingNotificationsData, @@ -77,7 +80,11 @@ import { AdjustNotificationBarMessageData, StandardNotificationType, } from "./abstractions/notification.background"; -import { NotificationTypeData } from "./abstractions/overlay-notifications.background"; +import { + LoginSecurityTaskInfo, + ModifyLoginCipherFormData, + NotificationTypeData, +} from "./abstractions/overlay-notifications.background"; import { OverlayBackgroundExtensionMessage } from "./abstractions/overlay.background"; export default class NotificationBackground { @@ -286,6 +293,62 @@ export default class NotificationBackground { }; } + /** + * If there is a security task for this cipher at login, return the task, cipher view, and uri. + * + * @param modifyLoginData - The modified login form data + * @param activeUserId - The currently logged in user ID + */ + private async getSecurityTaskAndCipherForLoginData( + modifyLoginData: ModifyLoginCipherFormData, + activeUserId: UserId, + ): Promise { + const tasks: SecurityTask[] = await this.getSecurityTasks(activeUserId); + if (!tasks?.length) { + return null; + } + + const urlCiphers: CipherView[] = await this.cipherService.getAllDecryptedForUrl( + modifyLoginData.uri, + activeUserId, + ); + if (!urlCiphers?.length) { + return null; + } + + const securityTaskForLogin = urlCiphers.reduce( + (taskInfo: LoginSecurityTaskInfo | null, cipher: CipherView) => { + if ( + // exit early if info was found already + taskInfo || + // exit early if the cipher was deleted + cipher.deletedDate || + // exit early if the entered login info doesn't match an existing cipher + modifyLoginData.username !== cipher.login.username || + modifyLoginData.password !== cipher.login.password + ) { + return taskInfo; + } + + // Find the first security task for the cipherId belonging to the entered login + const cipherSecurityTask = tasks.find( + ({ cipherId, status }) => + cipher.id === cipherId && // match security task cipher id to url cipher id + status === SecurityTaskStatus.Pending, // security task has not been completed + ); + + if (cipherSecurityTask) { + return { securityTask: cipherSecurityTask, cipher, uri: modifyLoginData.uri }; + } + + return taskInfo; + }, + null, + ); + + return securityTaskForLogin; + } + /** * Gets the active user server config from the config service. */ @@ -302,6 +365,10 @@ export default class NotificationBackground { return flagValue; } + /** + * Gets the current authentication status of the user. + * @returns Promise - The current authentication status of the user. + */ private async getAuthStatus() { return await firstValueFrom(this.authService.activeAccountStatus$); } @@ -481,9 +548,8 @@ export default class NotificationBackground { return false; } - const loginInfo = message.login; - const normalizedUsername = loginInfo.username ? loginInfo.username.toLowerCase() : ""; - const loginDomain = Utils.getDomain(loginInfo.url); + const normalizedUsername = login.username ? login.username.toLowerCase() : ""; + const loginDomain = Utils.getDomain(login.url); if (loginDomain == null) { return false; } @@ -492,7 +558,7 @@ export default class NotificationBackground { if (authStatus === AuthenticationStatus.Locked) { if (addLoginIsEnabled) { - await this.pushAddLoginToQueue(loginDomain, loginInfo, sender.tab, true); + await this.pushAddLoginToQueue(loginDomain, login, tab, true); } return false; @@ -505,7 +571,7 @@ export default class NotificationBackground { return false; } - const ciphers = await this.cipherService.getAllDecryptedForUrl(loginInfo.url, activeUserId); + const ciphers = await this.cipherService.getAllDecryptedForUrl(login.url, activeUserId); const usernameMatches = ciphers.filter( (c) => c.login.username != null && c.login.username.toLowerCase() === normalizedUsername, ); @@ -519,7 +585,7 @@ export default class NotificationBackground { if ( changePasswordIsEnabled && usernameMatches.length === 1 && - usernameMatches[0].login.password !== loginInfo.password + usernameMatches[0].login.password !== login.password ) { await this.pushChangePasswordToQueue( usernameMatches[0].id, @@ -1063,18 +1129,23 @@ export default class NotificationBackground { private async getCollectionData( message: NotificationBackgroundExtensionMessage, ): Promise { - const collections = (await this.collectionService.getAllDecrypted()).reduce( - (acc, collection) => { - if (collection.organizationId === message?.orgId) { - acc.push({ - id: collection.id, - name: collection.name, - organizationId: collection.organizationId, - }); - } - return acc; - }, - [], + const collections = await firstValueFrom( + this.accountService.activeAccount$.pipe( + getUserId, + switchMap((userId) => this.collectionService.decryptedCollections$(userId)), + map((collections) => + collections.reduce((acc, collection) => { + if (collection.organizationId === message?.orgId) { + acc.push({ + id: collection.id, + name: collection.name, + organizationId: collection.organizationId, + }); + } + return acc; + }, []), + ), + ), ); return collections; } @@ -1089,7 +1160,7 @@ export default class NotificationBackground { this.accountService.activeAccount$.pipe( getUserId, switchMap((userId) => - this.policyService.policyAppliesToUser$(PolicyType.PersonalOwnership, userId), + this.policyService.policyAppliesToUser$(PolicyType.OrganizationDataOwnership, userId), ), ), ); diff --git a/apps/browser/src/autofill/background/overlay-notifications.background.ts b/apps/browser/src/autofill/background/overlay-notifications.background.ts index 0c4321309a1..6063ba3db15 100644 --- a/apps/browser/src/autofill/background/overlay-notifications.background.ts +++ b/apps/browser/src/autofill/background/overlay-notifications.background.ts @@ -12,6 +12,7 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { SecurityTask, SecurityTaskStatus, TaskService } from "@bitwarden/common/vault/tasks"; import { BrowserApi } from "../../platform/browser/browser-api"; +import { NotificationType, NotificationTypes } from "../notification/abstractions/notification-bar"; import { generateDomainMatchPatterns, isInvalidResponseStatusCode } from "../utils"; import { @@ -39,6 +40,8 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg private notificationFallbackTimeout: number | NodeJS.Timeout | null; private readonly formSubmissionRequestMethods: Set = new Set(["POST", "PUT", "PATCH"]); private readonly extensionMessageHandlers: OverlayNotificationsExtensionMessageHandlers = { + generatedPasswordFilled: ({ message, sender }) => + this.storeModifiedLoginFormData(message, sender), formFieldSubmitted: ({ message, sender }) => this.storeModifiedLoginFormData(message, sender), collectPageDetailsResponse: ({ message, sender }) => this.handleCollectPageDetailsResponse(message, sender), @@ -392,7 +395,7 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg return; } - await this.triggerNotificationInit(requestId, modifyLoginData, tab); + await this.processNotifications(requestId, modifyLoginData, tab); }; /** @@ -412,23 +415,24 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg const handleWebNavigationOnCompleted = async () => { chrome.webNavigation.onCompleted.removeListener(handleWebNavigationOnCompleted); const tab = await BrowserApi.getTab(tabId); - await this.triggerNotificationInit(requestId, modifyLoginData, tab); + await this.processNotifications(requestId, modifyLoginData, tab); }; chrome.webNavigation.onCompleted.addListener(handleWebNavigationOnCompleted); }; /** - * Initializes the add login or change password notification based on the modified login form data - * and the tab details. This will trigger the notification to be displayed to the user. + * This method attempts to trigger the add login, change password, or at-risk password notifications + * based on the modified login data and the tab details. * * @param requestId - The details of the web response * @param modifyLoginData - The modified login form data * @param tab - The tab details */ - private triggerNotificationInit = async ( + private processNotifications = async ( requestId: chrome.webRequest.ResourceRequest["requestId"], modifyLoginData: ModifyLoginCipherFormData, tab: chrome.tabs.Tab, + config: { skippable: NotificationType[] } = { skippable: [] }, ) => { let result: string; if (this.shouldAttemptChangedPasswordNotification(modifyLoginData)) { @@ -514,9 +518,10 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg }; /** - * Determines if the add login notification should be triggered. - * - * @param modifyLoginData - The modified login form data + * Determines if the add login notification should be attempted based on the modified login form data. + * @param modifyLoginData modified login form data + * @param notificationType The type of notification to be triggered + * @returns true if the notification should be attempted, false otherwise */ private shouldAttemptAddLoginNotification = (modifyLoginData: ModifyLoginCipherFormData) => { return modifyLoginData?.username && (modifyLoginData.password || modifyLoginData.newPassword); @@ -586,11 +591,11 @@ export class OverlayNotificationsBackground implements OverlayNotificationsBackg */ private clearCompletedWebRequest = ( requestId: chrome.webRequest.ResourceRequest["requestId"], - tab: chrome.tabs.Tab, + tabId: chrome.tabs.Tab["id"], ) => { this.activeFormSubmissionRequests.delete(requestId); - this.modifyLoginCipherFormData.delete(tab.id); - this.websiteOriginsWithFields.delete(tab.id); + this.modifyLoginCipherFormData.delete(tabId); + this.websiteOriginsWithFields.delete(tabId); this.setupWebRequestsListeners(); }; diff --git a/apps/browser/src/autofill/background/overlay.background.spec.ts b/apps/browser/src/autofill/background/overlay.background.spec.ts index 0fe4a459048..8bee4a4675d 100644 --- a/apps/browser/src/autofill/background/overlay.background.spec.ts +++ b/apps/browser/src/autofill/background/overlay.background.spec.ts @@ -45,11 +45,10 @@ import { AutofillOverlayElement, AutofillOverlayPort, InlineMenuAccountCreationFieldType, - InlineMenuFillType, + InlineMenuFillTypes, MAX_SUB_FRAME_DEPTH, RedirectFocusDirection, } from "../enums/autofill-overlay.enum"; -import { InlineMenuFormFieldData } from "../services/abstractions/autofill-overlay-content.service"; import { AutofillService } from "../services/abstractions/autofill.service"; import { InlineMenuFieldQualificationService } from "../services/inline-menu-field-qualification.service"; import { @@ -71,6 +70,7 @@ import { triggerWebRequestOnCompletedEvent, } from "../spec/testing-utils"; +import { ModifyLoginCipherFormData } from "./abstractions/overlay-notifications.background"; import { FocusedFieldData, InlineMenuPosition, @@ -1025,7 +1025,7 @@ describe("OverlayBackground", () => { overlayBackground["focusedFieldData"] = createFocusedFieldDataMock({ tabId: tab.id, accountCreationFieldType: "text", - inlineMenuFillType: InlineMenuFillType.AccountCreationUsername, + inlineMenuFillType: InlineMenuFillTypes.AccountCreationUsername, }); cipherService.getAllDecryptedForUrl.mockResolvedValue([loginCipher1, identityCipher]); cipherService.sortCiphersByLastUsedThenName.mockReturnValue(-1); @@ -1383,7 +1383,7 @@ describe("OverlayBackground", () => { { command: "updateFocusedFieldData", focusedFieldData: createFocusedFieldDataMock({ - inlineMenuFillType: InlineMenuFillType.CurrentPasswordUpdate, + inlineMenuFillType: InlineMenuFillTypes.CurrentPasswordUpdate, }), }, mock({ tab }), @@ -2045,7 +2045,7 @@ describe("OverlayBackground", () => { }); it("displays the password generator when the focused field is for password generation", async () => { - focusedFieldData.inlineMenuFillType = InlineMenuFillType.PasswordGeneration; + focusedFieldData.inlineMenuFillType = InlineMenuFillTypes.PasswordGeneration; sendMockExtensionMessage({ command: "updateFocusedFieldData", focusedFieldData }, sender); await flushPromises(); @@ -2076,7 +2076,7 @@ describe("OverlayBackground", () => { const tab = createChromeTabMock({ id: 2 }); const sender = mock({ tab, frameId: 100 }); let focusedFieldData: FocusedFieldData; - let formData: InlineMenuFormFieldData; + let formData: ModifyLoginCipherFormData; beforeEach(async () => { await initOverlayElementPorts(); @@ -2103,7 +2103,7 @@ describe("OverlayBackground", () => { }); it("shows the save login menu when the focused field type is for password generation and the field is filled", async () => { - focusedFieldData.inlineMenuFillType = InlineMenuFillType.PasswordGeneration; + focusedFieldData.inlineMenuFillType = InlineMenuFillTypes.PasswordGeneration; sendMockExtensionMessage( { command: "updateFocusedFieldData", focusedFieldData, focusedFieldHasValue: true }, @@ -3409,7 +3409,7 @@ describe("OverlayBackground", () => { { command: "updateFocusedFieldData", focusedFieldData: createFocusedFieldDataMock({ - inlineMenuFillType: InlineMenuFillType.CurrentPasswordUpdate, + inlineMenuFillType: InlineMenuFillTypes.CurrentPasswordUpdate, }), }, sender, @@ -3607,7 +3607,7 @@ describe("OverlayBackground", () => { describe("fillGeneratedPassword", () => { const focusedFieldData = createFocusedFieldDataMock({ - inlineMenuFillType: InlineMenuFillType.PasswordGeneration, + inlineMenuFillType: InlineMenuFillTypes.PasswordGeneration, }); beforeEach(() => { @@ -3651,6 +3651,18 @@ describe("OverlayBackground", () => { }); }); + it("sends a message to the tab to store modify login change when a password is generated", async () => { + jest.useFakeTimers(); + + sendPortMessage(listMessageConnectorSpy, { command: "fillGeneratedPassword", portKey }); + + await flushPromises(); + jest.advanceTimersByTime(400); + await flushPromises(); + + expect(tabsSendMessageSpy.mock.lastCall[1].command).toBe("generatedPasswordModifyLogin"); + }); + it("filters the page details to only include the new password fields before filling", async () => { sendPortMessage(listMessageConnectorSpy, { command: "fillGeneratedPassword", portKey }); await flushPromises(); @@ -3663,31 +3675,6 @@ describe("OverlayBackground", () => { allowTotpAutofill: false, }); }); - - it("opens the inline menu for fields that fill a generated password", async () => { - jest.useFakeTimers(); - const formData = { - uri: "https://example.com", - username: "username", - password: "password", - newPassword: "newPassword", - }; - tabsSendMessageSpy.mockImplementation((_tab, message) => { - if (message.command === "getInlineMenuFormFieldData") { - return Promise.resolve(formData); - } - - return Promise.resolve(); - }); - const openInlineMenuSpy = jest.spyOn(overlayBackground as any, "openInlineMenu"); - - sendPortMessage(listMessageConnectorSpy, { command: "fillGeneratedPassword", portKey }); - await flushPromises(); - jest.advanceTimersByTime(400); - await flushPromises(); - - expect(openInlineMenuSpy).toHaveBeenCalled(); - }); }); }); diff --git a/apps/browser/src/autofill/background/overlay.background.ts b/apps/browser/src/autofill/background/overlay.background.ts index ab5dd4abb8f..4027689f014 100644 --- a/apps/browser/src/autofill/background/overlay.background.ts +++ b/apps/browser/src/autofill/background/overlay.background.ts @@ -49,8 +49,12 @@ import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view" import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view"; import { LoginView } from "@bitwarden/common/vault/models/view/login.view"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; import { BrowserApi } from "../../platform/browser/browser-api"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openAddEditVaultItemPopout, openViewVaultItemPopout, @@ -65,7 +69,6 @@ import { MAX_SUB_FRAME_DEPTH, } from "../enums/autofill-overlay.enum"; import AutofillField from "../models/autofill-field"; -import { InlineMenuFormFieldData } from "../services/abstractions/autofill-overlay-content.service"; import { AutofillService, PageDetail } from "../services/abstractions/autofill.service"; import { InlineMenuFieldQualificationService } from "../services/abstractions/inline-menu-field-qualifications.service"; import { @@ -78,6 +81,7 @@ import { } from "../utils"; import { LockedVaultPendingNotificationsData } from "./abstractions/notification.background"; +import { ModifyLoginCipherFormData } from "./abstractions/overlay-notifications.background"; import { BuildCipherDataParams, CloseInlineMenuMessage, @@ -187,6 +191,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { editedCipher: () => this.updateOverlayCiphers(), deletedCipher: () => this.updateOverlayCiphers(), bgSaveCipher: () => this.updateOverlayCiphers(), + updateOverlayCiphers: () => this.updateOverlayCiphers(), fido2AbortRequest: ({ sender }) => this.abortFido2ActiveRequest(sender.tab.id), }; private readonly inlineMenuButtonPortMessageHandlers: InlineMenuButtonPortMessageHandlers = { @@ -459,7 +464,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { const cipherView = cipherViews[cipherIndex]; if ( !this.cardAndIdentityCiphers.has(cipherView) && - [CipherType.Card, CipherType.Identity].includes(cipherView.type) + ([CipherType.Card, CipherType.Identity] as CipherType[]).includes(cipherView.type) ) { this.cardAndIdentityCiphers.add(cipherView); } @@ -797,7 +802,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { * @param focusedFieldData - Optional focused field data to validate against */ private focusedFieldMatchesFillType( - fillType: InlineMenuFillTypes, + fillType: InlineMenuFillType, focusedFieldData?: FocusedFieldData, ) { const focusedFieldFillType = focusedFieldData @@ -806,7 +811,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { // When updating the current password for a field, it should fill with a login cipher if ( - focusedFieldFillType === InlineMenuFillType.CurrentPasswordUpdate && + focusedFieldFillType === InlineMenuFillTypes.CurrentPasswordUpdate && fillType === CipherType.Login ) { return true; @@ -819,7 +824,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { * Identifies whether the inline menu is being shown on an account creation field. */ private shouldShowInlineMenuAccountCreation(): boolean { - if (this.focusedFieldMatchesFillType(InlineMenuFillType.AccountCreationUsername)) { + if (this.focusedFieldMatchesFillType(InlineMenuFillTypes.AccountCreationUsername)) { return true; } @@ -1152,7 +1157,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { } let pageDetails = Array.from(pageDetailsForTab.values()); - if (this.focusedFieldMatchesFillType(InlineMenuFillType.CurrentPasswordUpdate)) { + if (this.focusedFieldMatchesFillType(InlineMenuFillTypes.CurrentPasswordUpdate)) { pageDetails = this.getFilteredPageDetails( pageDetails, this.inlineMenuFieldQualificationService.isUpdateCurrentPasswordField, @@ -1705,7 +1710,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { private shouldUpdatePasswordGeneratorMenuOnFieldFocus() { return ( this.isInlineMenuButtonVisible && - this.focusedFieldMatchesFillType(InlineMenuFillType.PasswordGeneration) + this.focusedFieldMatchesFillType(InlineMenuFillTypes.PasswordGeneration) ); } @@ -1767,9 +1772,9 @@ export class OverlayBackground implements OverlayBackgroundInterface { private shouldUpdateAccountCreationMenuOnFieldFocus(previousFocusedFieldData: FocusedFieldData) { const accountCreationFieldBlurred = this.focusedFieldMatchesFillType( - InlineMenuFillType.AccountCreationUsername, + InlineMenuFillTypes.AccountCreationUsername, previousFocusedFieldData, - ) && !this.focusedFieldMatchesFillType(InlineMenuFillType.AccountCreationUsername); + ) && !this.focusedFieldMatchesFillType(InlineMenuFillTypes.AccountCreationUsername); return accountCreationFieldBlurred || this.shouldShowInlineMenuAccountCreation(); } @@ -1808,7 +1813,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { /** * Triggers a fill of the generated password into the current tab. Will trigger - * a focus of the last focused field after filling the password. + * a focus of the last focused field after filling the password. * * @param port - The port of the sender */ @@ -1852,10 +1857,16 @@ export class OverlayBackground implements OverlayBackgroundInterface { }); globalThis.setTimeout(async () => { - if (await this.shouldShowSaveLoginInlineMenuList(port.sender.tab)) { - await this.openInlineMenu(port.sender, true); - } - }, 300); + await BrowserApi.tabSendMessage( + port.sender.tab, + { + command: "generatedPasswordModifyLogin", + }, + { + frameId: this.focusedFieldData.frameId || 0, + }, + ); + }, 150); } /** @@ -1876,7 +1887,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { return ( (this.shouldShowInlineMenuAccountCreation() || - this.focusedFieldMatchesFillType(InlineMenuFillType.PasswordGeneration)) && + this.focusedFieldMatchesFillType(InlineMenuFillTypes.PasswordGeneration)) && !!(loginData.password || loginData.newPassword) ); } @@ -1886,7 +1897,9 @@ export class OverlayBackground implements OverlayBackgroundInterface { * * @param tab - The tab to get the form field data from */ - private async getInlineMenuFormFieldData(tab: chrome.tabs.Tab): Promise { + private async getInlineMenuFormFieldData( + tab: chrome.tabs.Tab, + ): Promise { return await BrowserApi.tabSendMessage( tab, { @@ -3036,7 +3049,7 @@ export class OverlayBackground implements OverlayBackgroundInterface { } const focusFieldShouldShowPasswordGenerator = - this.focusedFieldMatchesFillType(InlineMenuFillType.PasswordGeneration) || + this.focusedFieldMatchesFillType(InlineMenuFillTypes.PasswordGeneration) || (showInlineMenuAccountCreation && this.focusedFieldMatchesAccountCreationType(InlineMenuAccountCreationFieldType.Password)); if (!focusFieldShouldShowPasswordGenerator) { diff --git a/apps/browser/src/autofill/background/tabs.background.spec.ts b/apps/browser/src/autofill/background/tabs.background.spec.ts index 4473eb452f3..635ab8504a1 100644 --- a/apps/browser/src/autofill/background/tabs.background.spec.ts +++ b/apps/browser/src/autofill/background/tabs.background.spec.ts @@ -73,7 +73,6 @@ describe("TabsBackground", () => { triggerWindowOnFocusedChangedEvent(10); await flushPromises(); - expect(mainBackground.refreshBadge).toHaveBeenCalled(); expect(mainBackground.refreshMenu).toHaveBeenCalled(); expect(overlayBackground.updateOverlayCiphers).toHaveBeenCalled(); }); @@ -91,7 +90,6 @@ describe("TabsBackground", () => { triggerTabOnActivatedEvent({ tabId: 10, windowId: 20 }); await flushPromises(); - expect(mainBackground.refreshBadge).toHaveBeenCalled(); expect(mainBackground.refreshMenu).toHaveBeenCalled(); expect(overlayBackground.updateOverlayCiphers).toHaveBeenCalled(); }); @@ -127,7 +125,6 @@ describe("TabsBackground", () => { triggerTabOnReplacedEvent(10, 20); await flushPromises(); - expect(mainBackground.refreshBadge).toHaveBeenCalled(); expect(mainBackground.refreshMenu).toHaveBeenCalled(); expect(overlayBackground.updateOverlayCiphers).toHaveBeenCalled(); }); @@ -160,7 +157,6 @@ describe("TabsBackground", () => { triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); await flushPromises(); - expect(mainBackground.refreshBadge).not.toHaveBeenCalled(); expect(mainBackground.refreshMenu).not.toHaveBeenCalled(); expect(overlayBackground.updateOverlayCiphers).not.toHaveBeenCalled(); }); @@ -170,7 +166,6 @@ describe("TabsBackground", () => { triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); await flushPromises(); - expect(mainBackground.refreshBadge).not.toHaveBeenCalled(); expect(mainBackground.refreshMenu).not.toHaveBeenCalled(); expect(overlayBackground.updateOverlayCiphers).not.toHaveBeenCalled(); }); @@ -180,7 +175,6 @@ describe("TabsBackground", () => { triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); await flushPromises(); - expect(mainBackground.refreshBadge).not.toHaveBeenCalled(); expect(mainBackground.refreshMenu).not.toHaveBeenCalled(); expect(overlayBackground.updateOverlayCiphers).not.toHaveBeenCalled(); }); @@ -190,7 +184,6 @@ describe("TabsBackground", () => { triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); await flushPromises(); - expect(mainBackground.refreshBadge).not.toHaveBeenCalled(); expect(mainBackground.refreshMenu).not.toHaveBeenCalled(); }); @@ -205,7 +198,6 @@ describe("TabsBackground", () => { triggerTabOnUpdatedEvent(focusedWindowId, { status: "loading" }, tab); await flushPromises(); - expect(mainBackground.refreshBadge).toHaveBeenCalled(); expect(mainBackground.refreshMenu).toHaveBeenCalled(); expect(overlayBackground.updateOverlayCiphers).toHaveBeenCalled(); }); diff --git a/apps/browser/src/autofill/background/tabs.background.ts b/apps/browser/src/autofill/background/tabs.background.ts index c093f1a3b00..cd2c1595d69 100644 --- a/apps/browser/src/autofill/background/tabs.background.ts +++ b/apps/browser/src/autofill/background/tabs.background.ts @@ -20,10 +20,8 @@ export default class TabsBackground { return; } - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this.updateCurrentTabData(); - this.setupTabEventListeners(); + void this.updateCurrentTabData(); + void this.setupTabEventListeners(); } /** @@ -102,7 +100,6 @@ export default class TabsBackground { this.main.onUpdatedRan = true; await this.notificationBackground.checkNotificationQueue(tab); - await this.main.refreshBadge(); await this.main.refreshMenu(); this.main.messagingService.send("tabChanged"); }; @@ -122,7 +119,6 @@ export default class TabsBackground { */ private updateCurrentTabData = async () => { await Promise.all([ - this.main.refreshBadge(), this.main.refreshMenu(), this.overlayBackground.updateOverlayCiphers(false), ]); 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 e2bf75350a2..b1d65fdea92 100644 --- a/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/cipher-context-menu-handler.ts @@ -97,7 +97,9 @@ export class CipherContextMenuHandler { private async updateForCipher(cipher: CipherView) { if ( cipher == null || - !new Set([CipherType.Login, CipherType.Card, CipherType.Identity]).has(cipher.type) + !new Set([CipherType.Login, CipherType.Card, CipherType.Identity] as CipherType[]).has( + cipher.type, + ) ) { return; } diff --git a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts index 2fb435a4c67..c33cb6a4371 100644 --- a/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts +++ b/apps/browser/src/autofill/browser/context-menu-clicked-handler.ts @@ -30,8 +30,12 @@ import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherRepromptType } from "@bitwarden/common/vault/enums/cipher-reprompt-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window"; import { BrowserApi } from "../../platform/browser/browser-api"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { openAddEditVaultItemPopout, openVaultItemPasswordRepromptPopout, diff --git a/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts b/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts index 267a832a671..901d6595fc8 100644 --- a/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts +++ b/apps/browser/src/autofill/browser/main-context-menu-handler.spec.ts @@ -1,5 +1,5 @@ import { mock, MockProxy } from "jest-mock-extended"; -import { of } from "rxjs"; +import { BehaviorSubject, of } from "rxjs"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { @@ -22,6 +22,10 @@ import { UserId } from "@bitwarden/common/types/guid"; import { CipherType } from "@bitwarden/common/vault/enums"; import { Cipher } from "@bitwarden/common/vault/models/domain/cipher"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { + RestrictedCipherType, + RestrictedItemTypesService, +} from "@bitwarden/common/vault/services/restricted-item-types.service"; import { MainContextMenuHandler } from "./main-context-menu-handler"; @@ -69,6 +73,8 @@ describe("context-menu", () => { let logService: MockProxy; let billingAccountProfileStateService: MockProxy; let accountService: MockProxy; + let restricted$: BehaviorSubject; + let restrictedItemTypesService: RestrictedItemTypesService; let removeAllSpy: jest.SpyInstance void]>; let createSpy: jest.SpyInstance< @@ -85,6 +91,10 @@ describe("context-menu", () => { logService = mock(); billingAccountProfileStateService = mock(); accountService = mock(); + restricted$ = new BehaviorSubject([]); + restrictedItemTypesService = { + restricted$, + } as Partial as RestrictedItemTypesService; removeAllSpy = jest .spyOn(chrome.contextMenus, "removeAll") @@ -105,6 +115,7 @@ describe("context-menu", () => { logService, billingAccountProfileStateService, accountService, + restrictedItemTypesService, ); jest.spyOn(MainContextMenuHandler, "remove"); @@ -147,6 +158,24 @@ describe("context-menu", () => { expect(createdMenu).toBeTruthy(); expect(createSpy).toHaveBeenCalledTimes(11); }); + + it("has menu enabled and has premium, but card type is restricted", async () => { + billingAccountProfileStateService.hasPremiumFromAnySource$.mockReturnValue(of(true)); + + restricted$.next([{ cipherType: CipherType.Card, allowViewOrgIds: [] }]); + + const createdMenu = await sut.init(); + expect(createdMenu).toBeTruthy(); + expect(createSpy).toHaveBeenCalledTimes(10); + }); + it("has menu enabled, does not have premium, and card type is restricted", async () => { + billingAccountProfileStateService.hasPremiumFromAnySource$.mockReturnValue(of(false)); + restricted$.next([{ cipherType: CipherType.Card, allowViewOrgIds: [] }]); + + const createdMenu = await sut.init(); + expect(createdMenu).toBeTruthy(); + expect(createSpy).toHaveBeenCalledTimes(9); + }); }); describe("loadOptions", () => { diff --git a/apps/browser/src/autofill/browser/main-context-menu-handler.ts b/apps/browser/src/autofill/browser/main-context-menu-handler.ts index ad9dc34e501..abfa2465c51 100644 --- a/apps/browser/src/autofill/browser/main-context-menu-handler.ts +++ b/apps/browser/src/autofill/browser/main-context-menu-handler.ts @@ -25,8 +25,9 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic import { LogService } from "@bitwarden/common/platform/abstractions/log.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { Utils } from "@bitwarden/common/platform/misc/utils"; -import { CipherType } from "@bitwarden/common/vault/enums"; +import { CipherType } from "@bitwarden/common/vault/enums/cipher-type"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; +import { RestrictedItemTypesService } from "@bitwarden/common/vault/services/restricted-item-types.service"; import { InitContextMenuItems } from "./abstractions/main-context-menu-handler"; @@ -157,6 +158,7 @@ export class MainContextMenuHandler { private logService: LogService, private billingAccountProfileStateService: BillingAccountProfileStateService, private accountService: AccountService, + private restrictedItemTypesService: RestrictedItemTypesService, ) {} /** @@ -181,6 +183,10 @@ export class MainContextMenuHandler { this.billingAccountProfileStateService.hasPremiumFromAnySource$(account.id), ); + const isCardRestricted = ( + await firstValueFrom(this.restrictedItemTypesService.restricted$) + ).some((rt) => rt.cipherType === CipherType.Card); + for (const menuItem of this.initContextMenuItems) { const { requiresPremiumAccess, @@ -192,6 +198,9 @@ export class MainContextMenuHandler { if (requiresPremiumAccess && !hasPremium) { continue; } + if (menuItem.id.startsWith(AUTOFILL_CARD_ID) && isCardRestricted) { + continue; + } await MainContextMenuHandler.create({ ...otherOptions, contexts: ["all"] }); } diff --git a/apps/browser/src/autofill/content/abstractions/content-message-handler.ts b/apps/browser/src/autofill/content/abstractions/content-message-handler.ts index 8231bd688c9..f413ace9432 100644 --- a/apps/browser/src/autofill/content/abstractions/content-message-handler.ts +++ b/apps/browser/src/autofill/content/abstractions/content-message-handler.ts @@ -1,3 +1,5 @@ +import { ExtensionPageUrls } from "@bitwarden/common/vault/enums"; + type ContentMessageWindowData = { command: string; lastpass?: boolean; @@ -5,6 +7,7 @@ type ContentMessageWindowData = { state?: string; data?: string; remember?: boolean; + url?: ExtensionPageUrls; }; type ContentMessageWindowEventParams = { data: ContentMessageWindowData; diff --git a/apps/browser/src/autofill/content/autofill-init.ts b/apps/browser/src/autofill/content/autofill-init.ts index 8f69937ac60..b6fc6c3392e 100644 --- a/apps/browser/src/autofill/content/autofill-init.ts +++ b/apps/browser/src/autofill/content/autofill-init.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { EVENTS } from "@bitwarden/common/autofill/constants"; import AutofillPageDetails from "../models/autofill-page-details"; @@ -122,7 +120,7 @@ class AutofillInit implements AutofillInitInterface { * @param {AutofillExtensionMessage} message */ private async fillForm({ fillScript, pageDetailsUrl }: AutofillExtensionMessage) { - if ((document.defaultView || window).location.href !== pageDetailsUrl) { + if ((document.defaultView || window).location.href !== pageDetailsUrl || !fillScript) { return; } @@ -177,7 +175,7 @@ class AutofillInit implements AutofillInitInterface { message: AutofillExtensionMessage, sender: chrome.runtime.MessageSender, sendResponse: (response?: any) => void, - ): boolean => { + ): boolean | null => { const command: string = message.command; const handler: CallableFunction | undefined = this.getExtensionMessageHandler(command); if (!handler) { diff --git a/apps/browser/src/autofill/content/autofiller.ts b/apps/browser/src/autofill/content/autofiller.ts index c7a742f1fe1..bc9fd0bb05f 100644 --- a/apps/browser/src/autofill/content/autofiller.ts +++ b/apps/browser/src/autofill/content/autofiller.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { setupExtensionDisconnectAction } from "../utils"; if (document.readyState === "loading") { @@ -9,7 +7,7 @@ if (document.readyState === "loading") { } function loadAutofiller() { - let pageHref: string = null; + let pageHref: null | string = null; let filledThisHref = false; let delayFillTimeout: number; let doFillInterval: number | NodeJS.Timeout; @@ -51,9 +49,7 @@ function loadAutofiller() { sender: "autofiller", }; - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - chrome.runtime.sendMessage(msg); + void chrome.runtime.sendMessage(msg); } } diff --git a/apps/browser/src/autofill/content/bootstrap-autofill-overlay-menu.ts b/apps/browser/src/autofill/content/bootstrap-autofill-overlay-menu.ts index 605ffff0fec..40e32843fd4 100644 --- a/apps/browser/src/autofill/content/bootstrap-autofill-overlay-menu.ts +++ b/apps/browser/src/autofill/content/bootstrap-autofill-overlay-menu.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { AutofillInlineMenuContentService } from "../overlay/inline-menu/content/autofill-inline-menu-content.service"; import { AutofillOverlayContentService } from "../services/autofill-overlay-content.service"; import DomElementVisibilityService from "../services/dom-element-visibility.service"; @@ -11,7 +9,7 @@ import AutofillInit from "./autofill-init"; (function (windowContext) { if (!windowContext.bitwardenAutofillInit) { - let inlineMenuContentService: AutofillInlineMenuContentService; + let inlineMenuContentService: undefined | AutofillInlineMenuContentService; if (globalThis.self === globalThis.top) { inlineMenuContentService = new AutofillInlineMenuContentService(); } diff --git a/apps/browser/src/autofill/content/bootstrap-autofill-overlay-notifications.ts b/apps/browser/src/autofill/content/bootstrap-autofill-overlay-notifications.ts index 495ae0e22db..8a079fa26c8 100644 --- a/apps/browser/src/autofill/content/bootstrap-autofill-overlay-notifications.ts +++ b/apps/browser/src/autofill/content/bootstrap-autofill-overlay-notifications.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { OverlayNotificationsContentService } from "../overlay/notifications/content/overlay-notifications-content.service"; import { AutofillOverlayContentService } from "../services/autofill-overlay-content.service"; import DomElementVisibilityService from "../services/dom-element-visibility.service"; @@ -20,7 +18,7 @@ import AutofillInit from "./autofill-init"; inlineMenuFieldQualificationService, ); - let overlayNotificationsContentService: OverlayNotificationsContentService; + let overlayNotificationsContentService: undefined | OverlayNotificationsContentService; if (globalThis.self === globalThis.top) { overlayNotificationsContentService = new OverlayNotificationsContentService(); } @@ -29,7 +27,7 @@ import AutofillInit from "./autofill-init"; domQueryService, domElementVisibilityService, autofillOverlayContentService, - null, + undefined, overlayNotificationsContentService, ); setupAutofillInitDisconnectAction(windowContext); diff --git a/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts b/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts index 1777b135fe9..d204362ee25 100644 --- a/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts +++ b/apps/browser/src/autofill/content/bootstrap-autofill-overlay.ts @@ -1,5 +1,3 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore import { AutofillInlineMenuContentService } from "../overlay/inline-menu/content/autofill-inline-menu-content.service"; import { OverlayNotificationsContentService } from "../overlay/notifications/content/overlay-notifications-content.service"; import { AutofillOverlayContentService } from "../services/autofill-overlay-content.service"; @@ -12,8 +10,8 @@ import AutofillInit from "./autofill-init"; (function (windowContext) { if (!windowContext.bitwardenAutofillInit) { - let inlineMenuContentService: AutofillInlineMenuContentService; - let overlayNotificationsContentService: OverlayNotificationsContentService; + let inlineMenuContentService: undefined | AutofillInlineMenuContentService; + let overlayNotificationsContentService: undefined | OverlayNotificationsContentService; if (globalThis.self === globalThis.top) { inlineMenuContentService = new AutofillInlineMenuContentService(); overlayNotificationsContentService = new OverlayNotificationsContentService(); diff --git a/apps/browser/src/autofill/content/components/.lit-storybook/main.ts b/apps/browser/src/autofill/content/components/.lit-storybook/main.ts index a316d8f5baa..53c06264672 100644 --- a/apps/browser/src/autofill/content/components/.lit-storybook/main.ts +++ b/apps/browser/src/autofill/content/components/.lit-storybook/main.ts @@ -1,9 +1,16 @@ -import path, { dirname, join } from "path"; +import { createRequire } from "module"; +import { dirname, join, resolve } from "path"; +import { fileURLToPath } from "url"; import type { StorybookConfig } from "@storybook/web-components-webpack5"; import remarkGfm from "remark-gfm"; import TsconfigPathsPlugin from "tsconfig-paths-webpack-plugin"; +const currentFile = fileURLToPath(import.meta.url); +const currentDirectory = dirname(currentFile); + +const require = createRequire(import.meta.url); + const getAbsolutePath = (value: string): string => dirname(require.resolve(join(value, "package.json"))); @@ -43,7 +50,7 @@ const config: StorybookConfig = { if (config.resolve) { config.resolve.plugins = [ new TsconfigPathsPlugin({ - configFile: path.resolve(__dirname, "../../../../../tsconfig.json"), + configFile: resolve(currentDirectory, "../../../../../tsconfig.json"), }), ] as any; } diff --git a/apps/browser/src/autofill/content/components/buttons/action-button.ts b/apps/browser/src/autofill/content/components/buttons/action-button.ts index 74ac2518226..3d4521edcfa 100644 --- a/apps/browser/src/autofill/content/components/buttons/action-button.ts +++ b/apps/browser/src/autofill/content/components/buttons/action-button.ts @@ -4,10 +4,13 @@ import { html, TemplateResult } from "lit"; import { Theme } from "@bitwarden/common/platform/enums"; import { border, themes, typography, spacing } from "../constants/styles"; +import { Spinner } from "../icons"; export type ActionButtonProps = { buttonText: string | TemplateResult; + dataTestId?: string; disabled?: boolean; + isLoading?: boolean; theme: Theme; handleClick: (e: Event) => void; fullWidth?: boolean; @@ -15,13 +18,15 @@ export type ActionButtonProps = { export function ActionButton({ buttonText, + dataTestId, disabled = false, + isLoading = false, theme, handleClick, fullWidth = true, }: ActionButtonProps) { const handleButtonClick = (event: Event) => { - if (!disabled) { + if (!disabled && !isLoading) { handleClick(event); } }; @@ -33,7 +38,7 @@ export function ActionButton({ type="button" @click=${handleButtonClick} > - ${buttonText} + ${isLoading ? Spinner({ theme, color: themes[theme].text.muted }) : buttonText} `; } @@ -50,6 +55,9 @@ const actionButtonStyles = ({ ${typography.body2} user-select: none; + display: flex; + align-items: center; + justify-content: center; border: 1px solid transparent; border-radius: ${border.radius.full}; padding: ${spacing["1"]} ${spacing["3"]}; @@ -59,7 +67,7 @@ const actionButtonStyles = ({ text-overflow: ellipsis; font-weight: 700; - ${disabled + ${disabled || isLoading ? ` background-color: ${themes[theme].secondary["300"]}; color: ${themes[theme].text.muted}; @@ -81,7 +89,8 @@ const actionButtonStyles = ({ `} svg { - width: fit-content; + padding: 2px 0; /* Match line-height of button body2 typography */ + width: auto; height: 16px; } `; diff --git a/apps/browser/src/autofill/content/components/constants/styles.ts b/apps/browser/src/autofill/content/components/constants/styles.ts index 08c8671ce14..55130781808 100644 --- a/apps/browser/src/autofill/content/components/constants/styles.ts +++ b/apps/browser/src/autofill/content/components/constants/styles.ts @@ -174,6 +174,17 @@ export const buildIconColorRule = (color: string, rule: RuleName = ruleNames.fil ${rule}: ${color}; `; +export const animations = { + spin: ` + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } + `, +}; + export function scrollbarStyles(theme: Theme, color?: { thumb?: string; track?: string }) { const thumbColor = color?.thumb || themes[theme].secondary["500"]; const trackColor = color?.track || themes[theme].background.alt; diff --git a/apps/browser/src/autofill/content/components/icons/index.ts b/apps/browser/src/autofill/content/components/icons/index.ts index 65ec6301ac4..d1538e1543f 100644 --- a/apps/browser/src/autofill/content/components/icons/index.ts +++ b/apps/browser/src/autofill/content/components/icons/index.ts @@ -11,4 +11,5 @@ export { Folder } from "./folder"; export { Globe } from "./globe"; export { PencilSquare } from "./pencil-square"; export { Shield } from "./shield"; +export { Spinner } from "./spinner"; export { User } from "./user"; diff --git a/apps/browser/src/autofill/content/components/icons/spinner.ts b/apps/browser/src/autofill/content/components/icons/spinner.ts new file mode 100644 index 00000000000..20f53a43d44 --- /dev/null +++ b/apps/browser/src/autofill/content/components/icons/spinner.ts @@ -0,0 +1,34 @@ +import { css, keyframes } from "@emotion/css"; +import { html } from "lit"; + +import { IconProps } from "../common-types"; +import { buildIconColorRule, ruleNames, themes, animations } from "../constants/styles"; + +export function Spinner({ + ariaHidden = true, + color, + disabled, + theme, + disableSpin = false, +}: IconProps & { disableSpin?: boolean }) { + const shapeColor = disabled ? themes[theme].secondary["300"] : color || themes[theme].text.main; + + return html` + + + + `; +} + +const animation = css` + animation: ${keyframes(animations.spin)} 2s infinite linear; +`; diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/action-button.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/action-button.mdx index d3c1968b32f..fcec5bb7a82 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/action-button.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/action-button.mdx @@ -20,12 +20,11 @@ It is designed with accessibility and responsive design in mind. | `buttonAction` | `(e: Event) => void` | Yes | The function to execute when the button is clicked. | | `buttonText` | `string` | Yes | The text to display on the button. | | `disabled` | `boolean` (default: false) | No | Disables the button when set to `true`. | -| `theme` | `Theme` | Yes | The theme to style the button. Must match the `Theme` enum. | +| `theme` | `Theme` | Yes | The theme to style the button. Must match the `Theme` type. | ## Installation and Setup 1. Ensure you have the necessary dependencies installed: - - `lit`: Used to render the component. - `@emotion/css`: Used for styling the component. diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/badge-button.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/badge-button.mdx index e0740ced760..b5ea41b283c 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/badge-button.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/badge-button.mdx @@ -20,12 +20,11 @@ handling, and a disabled state. The component is optimized for accessibility and | `buttonAction` | `(e: Event) => void` | Yes | The function to execute when the button is clicked. | | `buttonText` | `string` | Yes | The text to display on the badge button. | | `disabled` | `boolean` (default: false) | No | Disables the button when set to `true`. | -| `theme` | `Theme` | Yes | The theme to style the button. Must match the `Theme` enum. | +| `theme` | `Theme` | Yes | The theme to style the button. Must match the `Theme` type. | ## Installation and Setup 1. Ensure you have the necessary dependencies installed: - - `lit`: Used to render the component. - `@emotion/css`: Used for styling the component. diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/body.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/body.mdx index 3a6a955e286..a298594e17f 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/body.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/body.mdx @@ -19,7 +19,7 @@ presenting actionable information. | ------------------ | ------------------ | ------------ | --------------------------------------------------------------------------------------------------------- | | `ciphers` | `CipherData[]` | Yes | An array of cipher data objects. Each cipher includes metadata such as ID, name, type, and login details. | | `notificationType` | `NotificationType` | Yes | Specifies the type of notification, such as `add`, `change`, `unlock`, or `fileless-import`. | -| `theme` | `Theme` | Yes | Defines the theme used for styling the notification. Must match the `Theme` enum. | +| `theme` | `Theme` | Yes | Defines the theme used for styling the notification. Must match the `Theme` type. | --- diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/close-button.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/close-button.mdx index dcdd38710ba..03a7b72001a 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/close-button.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/close-button.mdx @@ -17,12 +17,11 @@ a close icon for visual clarity. The component is designed to be intuitive and a | **Prop** | **Type** | **Required** | **Description** | | ------------------------- | -------------------- | ------------ | ----------------------------------------------------------- | | `handleCloseNotification` | `(e: Event) => void` | Yes | The function to execute when the button is clicked. | -| `theme` | `Theme` | Yes | The theme to style the button. Must match the `Theme` enum. | +| `theme` | `Theme` | Yes | The theme to style the button. Must match the `Theme` type. | ## Installation and Setup 1. Ensure you have the necessary dependencies installed: - - `lit`: Used to render the component. - `@emotion/css`: Used for styling the component. diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/edit-button.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/edit-button.mdx index 0f38df18912..a5a791ffbe1 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/edit-button.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/edit-button.mdx @@ -20,12 +20,11 @@ or settings where inline editing is required. | `buttonAction` | `(e: Event) => void` | Yes | The function to execute when the button is clicked. | | `buttonText` | `string` | Yes | The text displayed as the button's tooltip. | | `disabled` | `boolean` (default: false) | No | Disables the button when set to `true`. | -| `theme` | `Theme` | Yes | The theme to style the button. Must match the `Theme` enum. | +| `theme` | `Theme` | Yes | The theme to style the button. Must match the `Theme` type. | ## Installation and Setup 1. Ensure you have the necessary dependencies installed: - - `lit`: Used to render the component. - `@emotion/css`: Used for styling the component. diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/footer.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/footer.mdx index baaad4d8151..6a816f811e0 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/footer.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/footer.mdx @@ -17,7 +17,7 @@ customization based on the `theme` and `notificationType`. | **Prop** | **Type** | **Required** | **Description** | | ------------------ | ------------------ | ------------ | -------------------------------------------------------------------------------------------------- | | `notificationType` | `NotificationType` | Yes | The type of notification footer to display. Options: `add`, `change`, `unlock`, `fileless-import`. | -| `theme` | `Theme` | Yes | Defines the theme of the notification footer. Must match the `Theme` enum. | +| `theme` | `Theme` | Yes | Defines the theme of the notification footer. Must match the `Theme` type. | --- diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/header.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/header.mdx index fd03fd2f950..ebe35a3dd9b 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/header.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/header.mdx @@ -19,7 +19,7 @@ and an optional close button. This component is versatile and can be styled dyna | ------------------------- | -------------------- | ------------ | ------------------------------------------------------------------- | | `message` | `string` | Yes | The text message to be displayed in the notification. | | `standalone` | `boolean` | No | Determines if the notification is displayed independently. | -| `theme` | `Theme` | Yes | Defines the theme of the notification. Must match the `Theme` enum. | +| `theme` | `Theme` | Yes | Defines the theme of the notification. Must match the `Theme` type. | | `handleCloseNotification` | `(e: Event) => void` | No | A callback function triggered when the close button is clicked. | --- diff --git a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx index 571ed10285a..7ec18d0f7bb 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx +++ b/apps/browser/src/autofill/content/components/lit-stories/.lit-docs/icons.mdx @@ -28,7 +28,7 @@ like size, color, and theme. Each story is an example of how a specific icon can | `iconLink` | `URL` | No | Defines an external URL associated with the icon, prop exclusive to `Brand Icon`. | | `color` | `string` | No | Sets the color of the icon. | | `disabled` | `boolean` | No | Disables the icon visually and functionally. | -| `theme` | `Theme` | Yes | Defines the theme used to style the icons. Must match the `Theme` enum. | +| `theme` | `Theme` | Yes | Defines the theme used to style the icons. Must match the `Theme` type. | | `size` | `number` | Yes | Sets the width and height of the icon in pixels. | --- diff --git a/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts index 77769bc67dc..dc630e537b0 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/buttons/action-button.lit-stories.ts @@ -1,9 +1,12 @@ import { Meta, StoryObj } from "@storybook/web-components"; +import { html } from "lit"; import { ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; import { ActionButton, ActionButtonProps } from "../../buttons/action-button"; +type ComponentAndControls = ActionButtonProps & { width: number }; + export default { title: "Components/Buttons/Action Button", argTypes: { @@ -11,12 +14,15 @@ export default { disabled: { control: "boolean" }, theme: { control: "select", options: [...Object.values(ThemeTypes)] }, handleClick: { control: false }, + width: { control: "number", min: 10, max: 100, step: 1 }, }, args: { buttonText: "Click Me", disabled: false, + isLoading: false, theme: ThemeTypes.Light, handleClick: () => alert("Clicked"), + width: 150, }, parameters: { design: { @@ -24,10 +30,18 @@ export default { url: "https://www.figma.com/design/LEhqLAcBPY8uDKRfU99n9W/Autofill-notification-redesign?node-id=487-14755&t=2O7uCAkwRZCcjumm-4", }, }, -} as Meta; +} as Meta; -const Template = (args: ActionButtonProps) => ActionButton({ ...args }); +const Template = (args: ComponentAndControls) => { + const { width, ...componentProps } = args; + return html`
${ActionButton({ ...componentProps })}
`; +}; + +export const Default: StoryObj = { + args: { + isLoading: true, + theme: "dark", + }, -export const Default: StoryObj = { render: Template, }; diff --git a/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts b/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts index 3741ccbcb69..4e18008b94a 100644 --- a/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts +++ b/apps/browser/src/autofill/content/components/lit-stories/icons/icons.lit-stories.ts @@ -6,9 +6,10 @@ import { ThemeTypes } from "@bitwarden/common/platform/enums/theme-type.enum"; import { IconProps } from "../../common-types"; import * as Icons from "../../icons"; +const { Spinner, ...StaticIcons } = Icons; + type Args = IconProps & { size: number; - iconLink: URL; }; export default { @@ -26,7 +27,10 @@ export default { }, } as Meta; -const Template = (args: Args, IconComponent: (props: IconProps) => ReturnType) => html` +const Template = ( + args: Args, + IconComponent: (props: IconProps & { disableSpin?: boolean }) => ReturnType, +) => html`
@@ -34,18 +38,26 @@ const Template = (args: Args, IconComponent: (props: IconProps) => ReturnType `; -const createIconStory = (iconName: keyof typeof Icons): StoryObj => { +const createIconStory = ( + iconName: keyof typeof StaticIcons, +): StoryObj => { const story = { - render: (args) => Template(args, Icons[iconName]), + render: (args) => Template(args, StaticIcons[iconName]), } as StoryObj; - story.argTypes = { - iconLink: { table: { disable: true } }, - }; - return story; }; +const SpinnerIconStory: StoryObj = { + render: (args) => Template(args, Spinner), + argTypes: { + disableSpin: { control: "boolean" }, + }, + args: { + disableSpin: false, + }, +}; + export const AngleDownIcon = createIconStory("AngleDown"); export const AngleUpIcon = createIconStory("AngleUp"); export const BusinessIcon = createIconStory("Business"); @@ -58,4 +70,5 @@ export const FolderIcon = createIconStory("Folder"); export const GlobeIcon = createIconStory("Globe"); export const PencilSquareIcon = createIconStory("PencilSquare"); export const ShieldIcon = createIconStory("Shield"); +export const SpinnerIcon = SpinnerIconStory; export const UserIcon = createIconStory("User"); diff --git a/apps/browser/src/autofill/content/components/notification/button-row.ts b/apps/browser/src/autofill/content/components/notification/button-row.ts index 470147cb469..04b79c1951a 100644 --- a/apps/browser/src/autofill/content/components/notification/button-row.ts +++ b/apps/browser/src/autofill/content/components/notification/button-row.ts @@ -34,6 +34,7 @@ export type NotificationButtonRowProps = { organizations?: OrgView[]; primaryButton: { text: string; + isLoading?: boolean; handlePrimaryButtonClick: (args: any) => void; }; personalVaultIsAllowed: boolean; diff --git a/apps/browser/src/autofill/content/components/notification/container.ts b/apps/browser/src/autofill/content/components/notification/container.ts index cc7f0fc72c0..0c70e0da63c 100644 --- a/apps/browser/src/autofill/content/components/notification/container.ts +++ b/apps/browser/src/autofill/content/components/notification/container.ts @@ -29,6 +29,7 @@ export type NotificationContainerProps = NotificationBarIframeInitData & { folders?: FolderView[]; headerMessage?: string; i18n: I18n; + isLoading?: boolean; organizations?: OrgView[]; personalVaultIsAllowed?: boolean; notificationTestId: string; @@ -44,6 +45,7 @@ export function NotificationContainer({ folders, headerMessage, i18n, + isLoading, organizations, personalVaultIsAllowed = true, notificationTestId, @@ -74,6 +76,7 @@ export function NotificationContainer({ collections, folders, i18n, + isLoading, notificationType: type, organizations, personalVaultIsAllowed, diff --git a/apps/browser/src/autofill/content/components/notification/footer.ts b/apps/browser/src/autofill/content/components/notification/footer.ts index b47dd5cc094..d37547a6fae 100644 --- a/apps/browser/src/autofill/content/components/notification/footer.ts +++ b/apps/browser/src/autofill/content/components/notification/footer.ts @@ -16,6 +16,7 @@ export type NotificationFooterProps = { collections?: CollectionView[]; folders?: FolderView[]; i18n: I18n; + isLoading?: boolean; notificationType?: NotificationType; organizations?: OrgView[]; personalVaultIsAllowed: boolean; @@ -27,6 +28,7 @@ export function NotificationFooter({ collections, folders, i18n, + isLoading, notificationType, organizations, personalVaultIsAllowed, @@ -52,6 +54,7 @@ export function NotificationFooter({ i18n, primaryButton: { handlePrimaryButtonClick: handleSaveAction, + isLoading, text: primaryButtonText, }, personalVaultIsAllowed, diff --git a/apps/browser/src/autofill/content/components/rows/button-row.ts b/apps/browser/src/autofill/content/components/rows/button-row.ts index 041d0a6b696..8b4eabfec50 100644 --- a/apps/browser/src/autofill/content/components/rows/button-row.ts +++ b/apps/browser/src/autofill/content/components/rows/button-row.ts @@ -12,6 +12,7 @@ export type ButtonRowProps = { theme: Theme; primaryButton: { text: string; + isLoading?: boolean; handlePrimaryButtonClick: (args: any) => void; }; selectButtons?: { @@ -29,6 +30,7 @@ export function ButtonRow({ theme, primaryButton, selectButtons }: ButtonRowProp ${ActionButton({ handleClick: primaryButton.handlePrimaryButtonClick, buttonText: primaryButton.text, + isLoading: primaryButton.isLoading, theme, })}
diff --git a/apps/browser/src/autofill/content/content-message-handler.ts b/apps/browser/src/autofill/content/content-message-handler.ts index 60f093f8c10..c57b2d959f3 100644 --- a/apps/browser/src/autofill/content/content-message-handler.ts +++ b/apps/browser/src/autofill/content/content-message-handler.ts @@ -1,3 +1,4 @@ +import { ExtensionPageUrls } from "@bitwarden/common/vault/enums"; import { VaultMessages } from "@bitwarden/common/vault/enums/vault-messages.enum"; import { @@ -18,6 +19,8 @@ const windowMessageHandlers: ContentMessageWindowEventHandlers = { duoResult: ({ data, referrer }: { data: any; referrer: string }) => handleDuoResultMessage(data, referrer), [VaultMessages.OpenAtRiskPasswords]: () => handleOpenAtRiskPasswordsMessage(), + [VaultMessages.OpenBrowserExtensionToUrl]: ({ data }) => + handleOpenBrowserExtensionToUrlMessage(data), }; /** @@ -73,10 +76,15 @@ function handleWebAuthnResultMessage(data: ContentMessageWindowData, referrer: s sendExtensionRuntimeMessage({ command, data: data.data, remember, referrer }); } +/** @deprecated use {@link handleOpenBrowserExtensionToUrlMessage} */ function handleOpenAtRiskPasswordsMessage() { sendExtensionRuntimeMessage({ command: VaultMessages.OpenAtRiskPasswords }); } +function handleOpenBrowserExtensionToUrlMessage({ url }: { url?: ExtensionPageUrls }) { + sendExtensionRuntimeMessage({ command: VaultMessages.OpenBrowserExtensionToUrl, url }); +} + /** * Handles the window message event. * diff --git a/apps/browser/src/autofill/content/trigger-autofill-script-injection.ts b/apps/browser/src/autofill/content/trigger-autofill-script-injection.ts index 95a2391991b..9db691c1359 100644 --- a/apps/browser/src/autofill/content/trigger-autofill-script-injection.ts +++ b/apps/browser/src/autofill/content/trigger-autofill-script-injection.ts @@ -1,5 +1,3 @@ (function () { - // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. - // eslint-disable-next-line @typescript-eslint/no-floating-promises - chrome.runtime.sendMessage({ command: "triggerAutofillScriptInjection" }); + void chrome.runtime.sendMessage({ command: "triggerAutofillScriptInjection" }); })(); diff --git a/apps/browser/src/autofill/enums/autofill-overlay.enum.ts b/apps/browser/src/autofill/enums/autofill-overlay.enum.ts index d0b970671a8..4e4b32b9038 100644 --- a/apps/browser/src/autofill/enums/autofill-overlay.enum.ts +++ b/apps/browser/src/autofill/enums/autofill-overlay.enum.ts @@ -21,14 +21,16 @@ export const RedirectFocusDirection = { Next: "next", } as const; -// FIXME: update to use a const object instead of a typescript enum -// eslint-disable-next-line @bitwarden/platform/no-enums -export enum InlineMenuFillType { - AccountCreationUsername = 5, - PasswordGeneration = 6, - CurrentPasswordUpdate = 7, -} -export type InlineMenuFillTypes = InlineMenuFillType | CipherType; +export const InlineMenuFillTypes = { + AccountCreationUsername: 5, + PasswordGeneration: 6, + CurrentPasswordUpdate: 7, +} as const; + +export type InlineMenuFillTypeValue = + (typeof InlineMenuFillTypes)[keyof typeof InlineMenuFillTypes]; + +export type InlineMenuFillType = InlineMenuFillTypeValue | CipherType; export const InlineMenuAccountCreationFieldType = { Text: "text", diff --git a/apps/browser/src/autofill/fido2/content/fido2-content-script.spec.ts b/apps/browser/src/autofill/fido2/content/fido2-content-script.spec.ts index 8885ed6299c..af7344beb66 100644 --- a/apps/browser/src/autofill/fido2/content/fido2-content-script.spec.ts +++ b/apps/browser/src/autofill/fido2/content/fido2-content-script.spec.ts @@ -6,7 +6,7 @@ import { createPortSpyMock } from "../../../autofill/spec/autofill-mocks"; import { triggerPortOnDisconnectEvent } from "../../../autofill/spec/testing-utils"; import { Fido2PortName } from "../enums/fido2-port-name.enum"; -import { InsecureCreateCredentialParams, MessageType } from "./messaging/message"; +import { InsecureCreateCredentialParams, MessageTypes } from "./messaging/message"; import { MessageWithMetadata, Messenger } from "./messaging/messenger"; jest.mock("../../../autofill/utils", () => ({ @@ -71,7 +71,7 @@ describe("Fido2 Content Script", () => { it("handles a FIDO2 credential creation request message from the window message listener, formats the message and sends the formatted message to the extension background", async () => { const message = mock({ - type: MessageType.CredentialCreationRequest, + type: MessageTypes.CredentialCreationRequest, data: mock(), }); const mockResult = { credentialId: "mock" } as CreateCredentialResult; @@ -92,14 +92,14 @@ describe("Fido2 Content Script", () => { requestId: expect.any(String), }); expect(response).toEqual({ - type: MessageType.CredentialCreationResponse, + type: MessageTypes.CredentialCreationResponse, result: mockResult, }); }); it("handles a FIDO2 credential get request message from the window message listener, formats the message and sends the formatted message to the extension background", async () => { const message = mock({ - type: MessageType.CredentialGetRequest, + type: MessageTypes.CredentialGetRequest, data: mock(), }); @@ -121,7 +121,7 @@ describe("Fido2 Content Script", () => { it("removes the abort handler when the FIDO2 request is complete", async () => { const message = mock({ - type: MessageType.CredentialCreationRequest, + type: MessageTypes.CredentialCreationRequest, data: mock(), }); const abortController = new AbortController(); @@ -138,16 +138,14 @@ describe("Fido2 Content Script", () => { it("sends an extension message to abort the FIDO2 request when the abort controller is signaled", async () => { const message = mock({ - type: MessageType.CredentialCreationRequest, + type: MessageTypes.CredentialCreationRequest, data: mock(), }); const abortController = new AbortController(); const abortSpy = jest.spyOn(abortController.signal, "addEventListener"); - jest - .spyOn(chrome.runtime, "sendMessage") - .mockImplementationOnce(async (extensionId: string, message: unknown, options: any) => { - abortController.abort(); - }); + jest.spyOn(chrome.runtime, "sendMessage").mockImplementationOnce(async () => { + abortController.abort(); + }); // FIXME: Remove when updating file. Eslint update // eslint-disable-next-line @typescript-eslint/no-require-imports @@ -165,7 +163,7 @@ describe("Fido2 Content Script", () => { it("rejects credential requests and returns an error result", async () => { const errorMessage = "Test error"; const message = mock({ - type: MessageType.CredentialCreationRequest, + type: MessageTypes.CredentialCreationRequest, data: mock(), }); const abortController = new AbortController(); diff --git a/apps/browser/src/autofill/fido2/content/fido2-content-script.ts b/apps/browser/src/autofill/fido2/content/fido2-content-script.ts index f8352fc27a6..03816f2b382 100644 --- a/apps/browser/src/autofill/fido2/content/fido2-content-script.ts +++ b/apps/browser/src/autofill/fido2/content/fido2-content-script.ts @@ -12,7 +12,7 @@ import { InsecureAssertCredentialParams, InsecureCreateCredentialParams, Message, - MessageType, + MessageTypes, } from "./messaging/message"; import { MessageWithMetadata, Messenger } from "./messaging/messenger"; @@ -49,21 +49,21 @@ import { MessageWithMetadata, Messenger } from "./messaging/messenger"; abortController.signal.addEventListener("abort", abortHandler); try { - if (message.type === MessageType.CredentialCreationRequest) { + if (message.type === MessageTypes.CredentialCreationRequest) { return handleCredentialCreationRequestMessage( requestId, message.data as InsecureCreateCredentialParams, ); } - if (message.type === MessageType.CredentialGetRequest) { + if (message.type === MessageTypes.CredentialGetRequest) { return handleCredentialGetRequestMessage( requestId, message.data as InsecureAssertCredentialParams, ); } - if (message.type === MessageType.AbortRequest) { + if (message.type === MessageTypes.AbortRequest) { return sendExtensionMessage("fido2AbortRequest", { abortedRequestId: requestId }); } } finally { @@ -83,7 +83,7 @@ import { MessageWithMetadata, Messenger } from "./messaging/messenger"; ): Promise { return respondToCredentialRequest( "fido2RegisterCredentialRequest", - MessageType.CredentialCreationResponse, + MessageTypes.CredentialCreationResponse, requestId, data, ); @@ -101,7 +101,7 @@ import { MessageWithMetadata, Messenger } from "./messaging/messenger"; ): Promise { return respondToCredentialRequest( "fido2GetCredentialRequest", - MessageType.CredentialGetResponse, + MessageTypes.CredentialGetResponse, requestId, data, ); @@ -118,7 +118,9 @@ import { MessageWithMetadata, Messenger } from "./messaging/messenger"; */ async function respondToCredentialRequest( command: string, - type: MessageType.CredentialCreationResponse | MessageType.CredentialGetResponse, + type: + | typeof MessageTypes.CredentialCreationResponse + | typeof MessageTypes.CredentialGetResponse, requestId: string, messageData: InsecureCreateCredentialParams | InsecureAssertCredentialParams, ): Promise { diff --git a/apps/browser/src/autofill/fido2/content/fido2-page-script.ts b/apps/browser/src/autofill/fido2/content/fido2-page-script.ts index 4c1761c37ba..5b9ea5e5b27 100644 --- a/apps/browser/src/autofill/fido2/content/fido2-page-script.ts +++ b/apps/browser/src/autofill/fido2/content/fido2-page-script.ts @@ -2,7 +2,7 @@ // @ts-strict-ignore import { WebauthnUtils } from "../utils/webauthn-utils"; -import { MessageType } from "./messaging/message"; +import { MessageTypes } from "./messaging/message"; import { Messenger } from "./messaging/messenger"; (function (globalContext) { @@ -100,13 +100,13 @@ import { Messenger } from "./messaging/messenger"; try { const response = await messenger.request( { - type: MessageType.CredentialCreationRequest, + type: MessageTypes.CredentialCreationRequest, data: WebauthnUtils.mapCredentialCreationOptions(options, fallbackSupported), }, options?.signal, ); - if (response.type !== MessageType.CredentialCreationResponse) { + if (response.type !== MessageTypes.CredentialCreationResponse) { throw new Error("Something went wrong."); } @@ -141,19 +141,19 @@ import { Messenger } from "./messaging/messenger"; try { const abortListener = () => messenger.request({ - type: MessageType.AbortRequest, + type: MessageTypes.AbortRequest, abortedRequestId: abortSignal.toString(), }); internalAbortController.signal.addEventListener("abort", abortListener); const response = await messenger.request( { - type: MessageType.CredentialGetRequest, + type: MessageTypes.CredentialGetRequest, data: WebauthnUtils.mapCredentialRequestOptions(options, fallbackSupported), }, internalAbortController.signal, ); internalAbortController.signal.removeEventListener("abort", abortListener); - if (response.type !== MessageType.CredentialGetResponse) { + if (response.type !== MessageTypes.CredentialGetResponse) { throw new Error("Something went wrong."); } @@ -182,13 +182,13 @@ import { Messenger } from "./messaging/messenger"; try { const response = await messenger.request( { - type: MessageType.CredentialGetRequest, + type: MessageTypes.CredentialGetRequest, data: WebauthnUtils.mapCredentialRequestOptions(options, fallbackSupported), }, options?.signal, ); - if (response.type !== MessageType.CredentialGetResponse) { + if (response.type !== MessageTypes.CredentialGetResponse) { throw new Error("Something went wrong."); } @@ -282,7 +282,7 @@ import { Messenger } from "./messaging/messenger"; const type = message.type; // Handle cleanup for disconnect request - if (type === MessageType.DisconnectRequest) { + if (type === MessageTypes.DisconnectRequest) { destroy(); } }; diff --git a/apps/browser/src/autofill/fido2/content/fido2-page-script.webauthn-supported.spec.ts b/apps/browser/src/autofill/fido2/content/fido2-page-script.webauthn-supported.spec.ts index f1aec69193b..5e22027b584 100644 --- a/apps/browser/src/autofill/fido2/content/fido2-page-script.webauthn-supported.spec.ts +++ b/apps/browser/src/autofill/fido2/content/fido2-page-script.webauthn-supported.spec.ts @@ -7,7 +7,7 @@ import { } from "../../../autofill/spec/fido2-testing-utils"; import { WebauthnUtils } from "../utils/webauthn-utils"; -import { MessageType } from "./messaging/message"; +import { MessageTypes } from "./messaging/message"; import { Messenger } from "./messaging/messenger"; const originalGlobalThis = globalThis; @@ -71,7 +71,7 @@ describe("Fido2 page script with native WebAuthn support", () => { describe("creating WebAuthn credentials", () => { beforeEach(() => { messenger.request = jest.fn().mockResolvedValue({ - type: MessageType.CredentialCreationResponse, + type: MessageTypes.CredentialCreationResponse, result: mockCreateCredentialsResult, }); }); @@ -104,7 +104,7 @@ describe("Fido2 page script with native WebAuthn support", () => { describe("get WebAuthn credentials", () => { beforeEach(() => { messenger.request = jest.fn().mockResolvedValue({ - type: MessageType.CredentialGetResponse, + type: MessageTypes.CredentialGetResponse, result: mockCredentialAssertResult, }); }); @@ -147,7 +147,7 @@ describe("Fido2 page script with native WebAuthn support", () => { it("should destroy the message listener when receiving a disconnect request", async () => { jest.spyOn(globalThis.top, "removeEventListener"); const SENDER = "bitwarden-webauthn"; - void messenger.handler({ type: MessageType.DisconnectRequest, SENDER, senderId: "1" }); + void messenger.handler({ type: MessageTypes.DisconnectRequest, SENDER, senderId: "1" }); expect(globalThis.top.removeEventListener).toHaveBeenCalledWith("focus", undefined); expect(messenger.destroy).toHaveBeenCalled(); diff --git a/apps/browser/src/autofill/fido2/content/fido2-page-script.webauthn-unsupported.spec.ts b/apps/browser/src/autofill/fido2/content/fido2-page-script.webauthn-unsupported.spec.ts index af1838ec942..d15bc475f57 100644 --- a/apps/browser/src/autofill/fido2/content/fido2-page-script.webauthn-unsupported.spec.ts +++ b/apps/browser/src/autofill/fido2/content/fido2-page-script.webauthn-unsupported.spec.ts @@ -6,7 +6,7 @@ import { } from "../../../autofill/spec/fido2-testing-utils"; import { WebauthnUtils } from "../utils/webauthn-utils"; -import { MessageType } from "./messaging/message"; +import { MessageTypes } from "./messaging/message"; import { Messenger } from "./messaging/messenger"; const originalGlobalThis = globalThis; @@ -65,7 +65,7 @@ describe("Fido2 page script without native WebAuthn support", () => { describe("creating WebAuthn credentials", () => { beforeEach(() => { messenger.request = jest.fn().mockResolvedValue({ - type: MessageType.CredentialCreationResponse, + type: MessageTypes.CredentialCreationResponse, result: mockCreateCredentialsResult, }); }); @@ -86,7 +86,7 @@ describe("Fido2 page script without native WebAuthn support", () => { describe("get WebAuthn credentials", () => { beforeEach(() => { messenger.request = jest.fn().mockResolvedValue({ - type: MessageType.CredentialGetResponse, + type: MessageTypes.CredentialGetResponse, result: mockCredentialAssertResult, }); }); @@ -108,7 +108,7 @@ describe("Fido2 page script without native WebAuthn support", () => { it("should destroy the message listener when receiving a disconnect request", async () => { jest.spyOn(globalThis.top, "removeEventListener"); const SENDER = "bitwarden-webauthn"; - void messenger.handler({ type: MessageType.DisconnectRequest, SENDER, senderId: "1" }); + void messenger.handler({ type: MessageTypes.DisconnectRequest, SENDER, senderId: "1" }); expect(globalThis.top.removeEventListener).toHaveBeenCalledWith("focus", undefined); expect(messenger.destroy).toHaveBeenCalled(); diff --git a/apps/browser/src/autofill/fido2/content/messaging/message.ts b/apps/browser/src/autofill/fido2/content/messaging/message.ts index 640af22ab9a..55dc522ceab 100644 --- a/apps/browser/src/autofill/fido2/content/messaging/message.ts +++ b/apps/browser/src/autofill/fido2/content/messaging/message.ts @@ -5,19 +5,19 @@ import { AssertCredentialResult, } from "@bitwarden/common/platform/abstractions/fido2/fido2-client.service.abstraction"; -// FIXME: update to use a const object instead of a typescript enum -// eslint-disable-next-line @bitwarden/platform/no-enums -export enum MessageType { - CredentialCreationRequest, - CredentialCreationResponse, - CredentialGetRequest, - CredentialGetResponse, - AbortRequest, - DisconnectRequest, - ReconnectRequest, - AbortResponse, - ErrorResponse, -} +export const MessageTypes = { + CredentialCreationRequest: 0, + CredentialCreationResponse: 1, + CredentialGetRequest: 2, + CredentialGetResponse: 3, + AbortRequest: 4, + DisconnectRequest: 5, + ReconnectRequest: 6, + AbortResponse: 7, + ErrorResponse: 8, +} as const; + +export type MessageType = (typeof MessageTypes)[keyof typeof MessageTypes]; /** * The params provided by the page-script are created in an insecure environment and @@ -30,12 +30,12 @@ export type InsecureCreateCredentialParams = Omit< >; export type CredentialCreationRequest = { - type: MessageType.CredentialCreationRequest; + type: typeof MessageTypes.CredentialCreationRequest; data: InsecureCreateCredentialParams; }; export type CredentialCreationResponse = { - type: MessageType.CredentialCreationResponse; + type: typeof MessageTypes.CredentialCreationResponse; result?: CreateCredentialResult; }; @@ -50,35 +50,35 @@ export type InsecureAssertCredentialParams = Omit< >; export type CredentialGetRequest = { - type: MessageType.CredentialGetRequest; + type: typeof MessageTypes.CredentialGetRequest; data: InsecureAssertCredentialParams; }; export type CredentialGetResponse = { - type: MessageType.CredentialGetResponse; + type: typeof MessageTypes.CredentialGetResponse; result?: AssertCredentialResult; }; export type AbortRequest = { - type: MessageType.AbortRequest; + type: typeof MessageTypes.AbortRequest; abortedRequestId: string; }; export type DisconnectRequest = { - type: MessageType.DisconnectRequest; + type: typeof MessageTypes.DisconnectRequest; }; export type ReconnectRequest = { - type: MessageType.ReconnectRequest; + type: typeof MessageTypes.ReconnectRequest; }; export type ErrorResponse = { - type: MessageType.ErrorResponse; + type: typeof MessageTypes.ErrorResponse; error: string; }; export type AbortResponse = { - type: MessageType.AbortResponse; + type: typeof MessageTypes.AbortResponse; abortedRequestId: string; }; diff --git a/apps/browser/src/autofill/fido2/content/messaging/messenger.ts b/apps/browser/src/autofill/fido2/content/messaging/messenger.ts index ec7ff3bb7a4..257f7e9efd5 100644 --- a/apps/browser/src/autofill/fido2/content/messaging/messenger.ts +++ b/apps/browser/src/autofill/fido2/content/messaging/messenger.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Message, MessageType } from "./message"; +import { Message, MessageTypes } from "./message"; const SENDER = "bitwarden-webauthn"; @@ -80,7 +80,7 @@ export class Messenger { const abortListener = () => localPort.postMessage({ metadata: { SENDER }, - type: MessageType.AbortRequest, + type: MessageTypes.AbortRequest, }); abortSignal?.addEventListener("abort", abortListener); @@ -92,7 +92,7 @@ export class Messenger { abortSignal?.removeEventListener("abort", abortListener); - if (response.type === MessageType.ErrorResponse) { + if (response.type === MessageTypes.ErrorResponse) { const error = new Error(); Object.assign(error, JSON.parse(response.error)); throw error; @@ -119,7 +119,7 @@ export class Messenger { const abortController = new AbortController(); port.onmessage = (event: MessageEvent) => { - if (event.data.type === MessageType.AbortRequest) { + if (event.data.type === MessageTypes.AbortRequest) { abortController.abort(); } }; @@ -133,7 +133,7 @@ export class Messenger { } catch (error) { port.postMessage({ SENDER, - type: MessageType.ErrorResponse, + type: MessageTypes.ErrorResponse, error: JSON.stringify(error, Object.getOwnPropertyNames(error)), }); } finally { @@ -157,7 +157,7 @@ export class Messenger { } private async sendDisconnectCommand() { - await this.request({ type: MessageType.DisconnectRequest }); + await this.request({ type: MessageTypes.DisconnectRequest }); } private generateUniqueId() { diff --git a/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts b/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts index 04b09a7df32..8de48a49a8e 100644 --- a/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts +++ b/apps/browser/src/autofill/fido2/services/browser-fido2-user-interface.service.ts @@ -28,6 +28,8 @@ import { import { Utils } from "@bitwarden/common/platform/misc/utils"; import { BrowserApi } from "../../../platform/browser/browser-api"; +// FIXME (PM-22628): Popup imports are forbidden in background +// eslint-disable-next-line no-restricted-imports import { closeFido2Popout, openFido2Popout } from "../../../vault/popup/utils/vault-popout-window"; const BrowserFido2MessageName = "BrowserFido2UserInterfaceServiceMessage"; diff --git a/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts b/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts index c8bcf5faa4b..0cccd91876d 100644 --- a/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts +++ b/apps/browser/src/autofill/fido2/utils/webauthn-utils.ts @@ -88,6 +88,7 @@ export class WebauthnUtils { getClientExtensionResults: () => ({ credProps: result.extensions.credProps, }), + toJSON: () => Fido2Utils.createResultToJson(result), } as PublicKeyCredential; // Modify prototype chains to fix `instanceof` calls. @@ -134,6 +135,7 @@ export class WebauthnUtils { } as AuthenticatorAssertionResponse, getClientExtensionResults: () => ({}), authenticatorAttachment: "platform", + toJSON: () => Fido2Utils.getResultToJson(result), } as PublicKeyCredential; // Modify prototype chains to fix `instanceof` calls. diff --git a/apps/browser/src/autofill/models/autofill-field.ts b/apps/browser/src/autofill/models/autofill-field.ts index c0be60f1cd0..1a8c3bb875b 100644 --- a/apps/browser/src/autofill/models/autofill-field.ts +++ b/apps/browser/src/autofill/models/autofill-field.ts @@ -4,7 +4,7 @@ import { FieldRect } from "../background/abstractions/overlay.background"; import { AutofillFieldQualifierType } from "../enums/autofill-field.enums"; import { InlineMenuAccountCreationFieldTypes, - InlineMenuFillTypes, + InlineMenuFillType, } from "../enums/autofill-overlay.enum"; /** @@ -118,7 +118,7 @@ export default class AutofillField { checked?: boolean; - inlineMenuFillType?: InlineMenuFillTypes; + inlineMenuFillType?: InlineMenuFillType; showPasskeys?: boolean; diff --git a/apps/browser/src/autofill/notification/bar.ts b/apps/browser/src/autofill/notification/bar.ts index 63d1cd88d62..e2c909a06de 100644 --- a/apps/browser/src/autofill/notification/bar.ts +++ b/apps/browser/src/autofill/notification/bar.ts @@ -249,22 +249,47 @@ async function initNotificationBar(message: NotificationBarWindowMessage) { document.head.querySelectorAll('link[rel="stylesheet"]').forEach((node) => node.remove()); if (isVaultLocked) { - return render( - NotificationContainer({ - ...notificationBarIframeInitData, - headerMessage, - type: resolvedType, - notificationTestId, - theme: resolvedTheme, - personalVaultIsAllowed: !personalVaultDisallowed, - handleCloseNotification, - handleSaveAction: (e) => { - sendSaveCipherMessage(true); + const notificationConfig = { + ...notificationBarIframeInitData, + headerMessage, + type: resolvedType, + notificationTestId, + theme: resolvedTheme, + personalVaultIsAllowed: !personalVaultDisallowed, + handleCloseNotification, + handleEditOrUpdateAction, + i18n, + }; - // @TODO can't close before vault has finished decrypting, but can't leave open during long decrypt because it looks like the experience has failed - }, - handleEditOrUpdateAction, + const handleSaveAction = () => { + sendSaveCipherMessage(true); + + render( + NotificationContainer({ + ...notificationConfig, + handleSaveAction: () => {}, + isLoading: true, + }), + document.body, + ); + }; + + const UnlockNotification = NotificationContainer({ ...notificationConfig, handleSaveAction }); + + return render(UnlockNotification, document.body); + } + + // Handle AtRiskPasswordNotification render + if (notificationBarIframeInitData.type === NotificationTypes.AtRiskPassword) { + return render( + AtRiskNotification({ + ...notificationBarIframeInitData, + type: notificationBarIframeInitData.type as NotificationType, + theme: resolvedTheme, i18n, + notificationTestId, + params: initData.params, + handleCloseNotification, }), document.body, ); @@ -549,6 +574,7 @@ function handleSaveCipherConfirmation(message: NotificationBarWindowMessage) { const resolvedType = resolveNotificationType(notificationBarIframeInitData); const headerMessage = getConfirmationHeaderMessage(i18n, resolvedType, error); const notificationTestId = getNotificationTestId(resolvedType, true); + appendHeaderMessageToTitle(headerMessage); globalThis.setTimeout(() => sendPlatformMessage({ command: "bgCloseNotificationBar" }), 5000); @@ -557,7 +583,7 @@ function handleSaveCipherConfirmation(message: NotificationBarWindowMessage) { ...notificationBarIframeInitData, error, handleCloseNotification, - handleOpenTasks: () => sendPlatformMessage({ command: "bgOpenAtRisksPasswords" }), + handleOpenTasks: () => sendPlatformMessage({ command: "bgOpenAtRiskPasswords" }), handleOpenVault: (e: Event) => cipherId ? openViewVaultItemPopout(cipherId) : openAddEditVaultItemPopout(e, {}), headerMessage, diff --git a/apps/browser/src/autofill/overlay/inline-menu/abstractions/autofill-inline-menu-list.ts b/apps/browser/src/autofill/overlay/inline-menu/abstractions/autofill-inline-menu-list.ts index a20bd3c5312..f5e1fe08850 100644 --- a/apps/browser/src/autofill/overlay/inline-menu/abstractions/autofill-inline-menu-list.ts +++ b/apps/browser/src/autofill/overlay/inline-menu/abstractions/autofill-inline-menu-list.ts @@ -1,7 +1,7 @@ import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { InlineMenuCipherData } from "../../../background/abstractions/overlay.background"; -import { InlineMenuFillTypes } from "../../../enums/autofill-overlay.enum"; +import { InlineMenuFillType } from "../../../enums/autofill-overlay.enum"; type AutofillInlineMenuListMessage = { command: string }; @@ -23,7 +23,7 @@ export type InitAutofillInlineMenuListMessage = AutofillInlineMenuListMessage & theme: string; translations: Record; ciphers?: InlineMenuCipherData[]; - inlineMenuFillType?: InlineMenuFillTypes; + inlineMenuFillType?: InlineMenuFillType; showInlineMenuAccountCreation?: boolean; showPasskeysLabels?: boolean; portKey: string; diff --git a/apps/browser/src/autofill/overlay/inline-menu/pages/list/autofill-inline-menu-list.ts b/apps/browser/src/autofill/overlay/inline-menu/pages/list/autofill-inline-menu-list.ts index e0db93b6b4a..c680fe4745c 100644 --- a/apps/browser/src/autofill/overlay/inline-menu/pages/list/autofill-inline-menu-list.ts +++ b/apps/browser/src/autofill/overlay/inline-menu/pages/list/autofill-inline-menu-list.ts @@ -10,7 +10,7 @@ import { EVENTS, UPDATE_PASSKEYS_HEADINGS_ON_SCROLL } from "@bitwarden/common/au import { CipherRepromptType, CipherType } from "@bitwarden/common/vault/enums"; import { InlineMenuCipherData } from "../../../../background/abstractions/overlay.background"; -import { InlineMenuFillTypes } from "../../../../enums/autofill-overlay.enum"; +import { InlineMenuFillType } from "../../../../enums/autofill-overlay.enum"; import { buildSvgDomElement, specialCharacterToKeyMap, throttle } from "../../../../utils"; import { creditCardIcon, @@ -42,7 +42,7 @@ export class AutofillInlineMenuList extends AutofillInlineMenuPageElement { private cipherListScrollIsDebounced = false; private cipherListScrollDebounceTimeout: number | NodeJS.Timeout; private currentCipherIndex = 0; - private inlineMenuFillType: InlineMenuFillTypes; + private inlineMenuFillType: InlineMenuFillType; private showInlineMenuAccountCreation: boolean; private showPasskeysLabels: boolean; private newItemButtonElement: HTMLButtonElement; @@ -1105,8 +1105,8 @@ export class AutofillInlineMenuList extends AutofillInlineMenuPageElement { const svgElement = buildSvgDomElement(` - diff --git a/apps/browser/src/autofill/overlay/notifications/content/__snapshots__/overlay-notifications-content.service.spec.ts.snap b/apps/browser/src/autofill/overlay/notifications/content/__snapshots__/overlay-notifications-content.service.spec.ts.snap index c20626212fa..18c3baa876c 100644 --- a/apps/browser/src/autofill/overlay/notifications/content/__snapshots__/overlay-notifications-content.service.spec.ts.snap +++ b/apps/browser/src/autofill/overlay/notifications/content/__snapshots__/overlay-notifications-content.service.spec.ts.snap @@ -8,7 +8,7 @@ exports[`OverlayNotificationsContentService opening the notification bar creates